diff --git a/package.json b/package.json index 2dc70d2..894ed09 100644 --- a/package.json +++ b/package.json @@ -14,15 +14,18 @@ "license": "MIT", "dependencies": { "@geoffcox/svelte-splitter": "^1.0.1", + "@monaco-editor/loader": "^1.4.0", "@tauri-apps/api": "^2", "@tauri-apps/plugin-dialog": "~2", "@tauri-apps/plugin-fs": "~2", "@tauri-apps/plugin-opener": "^2", "flowbite-svelte": "^0.47.4", "flowbite-svelte-icons": "^2.0.2", + "monaco-editor": "^0.52.2", "paths": "^0.1.1", "svelte-split-pane": "^0.1.2", - "svelte-splitpanes": "^8.0.9" + "svelte-splitpanes": "^8.0.9", + "vite-plugin-monaco-editor": "^1.1.0" }, "devDependencies": { "@sveltejs/adapter-static": "^3.0.6", @@ -38,6 +41,6 @@ "svelte-preprocess": "^6.0.3", "tailwindcss": "^3.4.17", "typescript": "~5.6.2", - "vite": "^6.0.3" + "vite": "^6.0.11" } } diff --git a/src-pdfrs/pdf/src/object/types.rs b/src-pdfrs/pdf/src/object/types.rs index 2413086..c768a9c 100644 --- a/src-pdfrs/pdf/src/object/types.rs +++ b/src-pdfrs/pdf/src/object/types.rs @@ -1,15 +1,15 @@ //! Models of PDF types -use std::collections::{HashMap, VecDeque}; use datasize::DataSize; +use std::collections::HashMap; use crate as pdf; use crate::content::deep_clone_op; -use crate::object::*; -use crate::error::*; -use crate::content::{Content, FormXObject, Matrix, parse_ops, serialize_ops, Op}; -use crate::font::Font; +use crate::content::{parse_ops, serialize_ops, Content, FormXObject, Matrix, Op}; use crate::enc::StreamFilter; +use crate::error::*; +use crate::font::Font; +use crate::object::*; /// Node in a page tree - type is either `Page` or `PageTree` #[derive(Debug, Clone, DataSize)] @@ -24,7 +24,10 @@ impl Object for PagesNode { match dict.require("PagesNode", "Type")?.as_name()? { "Page" => Ok(PagesNode::Leaf(t!(Page::from_dict(dict, resolve)))), "Pages" => Ok(PagesNode::Tree(t!(PageTree::from_dict(dict, resolve)))), - other => Err(PdfError::WrongDictionaryType {expected: "Page or Pages".into(), found: other.into()}), + other => Err(PdfError::WrongDictionaryType { + expected: "Page or Pages".into(), + found: other.into(), + }), } } } @@ -60,7 +63,7 @@ impl Deref for PageRc { fn deref(&self) -> &Page { match *self.0 { PagesNode::Leaf(ref page) => page, - _ => unreachable!() + _ => unreachable!(), } } } @@ -76,8 +79,11 @@ impl Object for PageRc { fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result { let node = t!(RcRef::from_primitive(p, resolve)); match *node { - PagesNode::Tree(_) => Err(PdfError::WrongDictionaryType {expected: "Page".into(), found: "Pages".into()}), - PagesNode::Leaf(_) => Ok(PageRc(node)) + PagesNode::Tree(_) => Err(PdfError::WrongDictionaryType { + expected: "Page".into(), + found: "Pages".into(), + }), + PagesNode::Leaf(_) => Ok(PageRc(node)), } } } @@ -96,7 +102,7 @@ impl Deref for PagesRc { fn deref(&self) -> &PageTree { match *self.0 { PagesNode::Tree(ref tree) => tree, - _ => unreachable!() + _ => unreachable!(), } } } @@ -109,8 +115,11 @@ impl Object for PagesRc { fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result { let node = t!(RcRef::from_primitive(p, resolve)); match *node { - PagesNode::Leaf(_) => Err(PdfError::WrongDictionaryType {expected: "Pages".into(), found: "Page".into()}), - PagesNode::Tree(_) => Ok(PagesRc(node)) + PagesNode::Leaf(_) => Err(PdfError::WrongDictionaryType { + expected: "Pages".into(), + found: "Page".into(), + }), + PagesNode::Tree(_) => Ok(PagesRc(node)), } } } @@ -123,75 +132,73 @@ impl ObjectWrite for PagesRc { #[derive(Object, ObjectWrite, Debug, DataSize)] #[pdf(Type = "Catalog?")] pub struct Catalog { - #[pdf(key="Version")] + #[pdf(key = "Version")] pub version: Option, - #[pdf(key="Pages")] + #[pdf(key = "Pages")] pub pages: PagesRc, - #[pdf(key="PageLabels")] + #[pdf(key = "PageLabels")] pub page_labels: Option>, - #[pdf(key="Names")] + #[pdf(key = "Names")] pub names: Option>, - #[pdf(key="Dests")] + #[pdf(key = "Dests")] pub dests: Option>, -// ViewerPreferences: dict -// PageLayout: name -// PageMode: name - - #[pdf(key="Outlines")] + // ViewerPreferences: dict + // PageLayout: name + // PageMode: name + #[pdf(key = "Outlines")] pub outlines: Option, -// Threads: array -// OpenAction: array or dict -// AA: dict -// URI: dict -// AcroForm: dict - #[pdf(key="AcroForm")] + // Threads: array + // OpenAction: array or dict + // AA: dict + // URI: dict + // AcroForm: dict + #[pdf(key = "AcroForm")] pub forms: Option, -// Metadata: stream - #[pdf(key="Metadata")] + // Metadata: stream + #[pdf(key = "Metadata")] pub metadata: Option>>, - #[pdf(key="StructTreeRoot")] + #[pdf(key = "StructTreeRoot")] pub struct_tree_root: Option, - -// MarkInfo: dict -// Lang: text string -// SpiderInfo: dict -// OutputIntents: array -// PieceInfo: dict -// OCProperties: dict -// Perms: dict -// Legal: dict -// Requirements: array -// Collection: dict -// NeedsRendering: bool + // MarkInfo: dict + // Lang: text string + // SpiderInfo: dict + // OutputIntents: array + // PieceInfo: dict + // OCProperties: dict + // Perms: dict + // Legal: dict + // Requirements: array + // Collection: dict + // NeedsRendering: bool } #[derive(Object, ObjectWrite, Debug, Default, Clone, DataSize)] #[pdf(Type = "Pages?")] pub struct PageTree { - #[pdf(key="Parent")] + #[pdf(key = "Parent")] pub parent: Option, - #[pdf(key="Kids")] - pub kids: Vec>, + #[pdf(key = "Kids")] + pub kids: Vec>, - #[pdf(key="Count")] - pub count: u32, + #[pdf(key = "Count")] + pub count: u32, - #[pdf(key="Resources")] + #[pdf(key = "Resources")] pub resources: Option>, - #[pdf(key="MediaBox")] - pub media_box: Option, + #[pdf(key = "MediaBox")] + pub media_box: Option, - #[pdf(key="CropBox")] - pub crop_box: Option, + #[pdf(key = "CropBox")] + pub crop_box: Option, } impl PageTree { pub fn page(&self, resolve: &impl Resolve, page_nr: u32) -> Result { @@ -206,7 +213,7 @@ impl PageTree { let node = resolve.get(kid)?; match *node { PagesNode::Tree(ref tree) => { - if (pos .. pos + tree.count).contains(&page_nr) { + if (pos..pos + tree.count).contains(&page_nr) { return tree.page_limited(resolve, page_nr - pos, depth - 1); } pos += tree.count; @@ -219,7 +226,7 @@ impl PageTree { } } } - Err(PdfError::PageOutOfBounds {page_nr, max: pos}) + Err(PdfError::PageOutOfBounds { page_nr, max: pos }) } /* @@ -262,52 +269,53 @@ impl PageTree { impl SubType for PageTree {} #[derive(Object, ObjectWrite, Debug, Clone, DataSize)] -#[pdf(Type="Page?")] +#[pdf(Type = "Page?")] pub struct Page { - #[pdf(key="Parent")] + #[pdf(key = "Parent")] pub parent: PagesRc, - #[pdf(key="Resources", indirect)] + #[pdf(key = "Resources", indirect)] pub resources: Option>, - #[pdf(key="MediaBox")] - pub media_box: Option, + #[pdf(key = "MediaBox")] + pub media_box: Option, - #[pdf(key="CropBox")] - pub crop_box: Option, + #[pdf(key = "CropBox")] + pub crop_box: Option, - #[pdf(key="TrimBox")] - pub trim_box: Option, + #[pdf(key = "TrimBox")] + pub trim_box: Option, - #[pdf(key="Contents")] - pub contents: Option, + #[pdf(key = "Contents")] + pub contents: Option, - #[pdf(key="Rotate", default="0")] + #[pdf(key = "Rotate", default = "0")] pub rotate: i32, - #[pdf(key="Metadata")] - pub metadata: Option, + #[pdf(key = "Metadata")] + pub metadata: Option, - #[pdf(key="LGIDict")] - pub lgi: Option, + #[pdf(key = "LGIDict")] + pub lgi: Option, - #[pdf(key="VP")] - pub vp: Option, + #[pdf(key = "VP")] + pub vp: Option, - #[pdf(key="Annots")] + #[pdf(key = "Annots")] pub annotations: Lazy>>, #[pdf(other)] pub other: Dictionary, } fn inherit<'a, T: 'a, F>(mut parent: &'a PageTree, f: F) -> Result> - where F: Fn(&'a PageTree) -> Option +where + F: Fn(&'a PageTree) -> Option, { loop { match (&parent.parent, f(parent)) { (_, Some(t)) => return Ok(Some(t)), (Some(ref p), None) => parent = p, - (None, None) => return Ok(None) + (None, None) => return Ok(None), } } } @@ -316,15 +324,15 @@ impl Page { pub fn new(parent: PagesRc) -> Page { Page { parent, - media_box: None, - crop_box: None, - trim_box: None, - resources: None, - contents: None, - rotate: 0, - metadata: None, - lgi: None, - vp: None, + media_box: None, + crop_box: None, + trim_box: None, + resources: None, + contents: None, + rotate: 0, + metadata: None, + lgi: None, + vp: None, other: Dictionary::new(), annotations: Default::default(), } @@ -332,8 +340,12 @@ impl Page { pub fn media_box(&self) -> Result { match self.media_box { Some(b) => Ok(b), - None => inherit(&self.parent, |pt| pt.media_box)? - .ok_or_else(|| PdfError::MissingEntry { typ: "Page", field: "MediaBox".into() }) + None => { + inherit(&self.parent, |pt| pt.media_box)?.ok_or_else(|| PdfError::MissingEntry { + typ: "Page", + field: "MediaBox".into(), + }) + } } } pub fn crop_box(&self) -> Result { @@ -341,77 +353,79 @@ impl Page { Some(b) => Ok(b), None => match inherit(&self.parent, |pt| pt.crop_box)? { Some(b) => Ok(b), - None => self.media_box() - } + None => self.media_box(), + }, } } pub fn resources(&self) -> Result<&MaybeRef> { match self.resources { Some(ref r) => Ok(r), - None => inherit(&self.parent, |pt| pt.resources.as_ref())? - .ok_or_else(|| PdfError::MissingEntry { typ: "Page", field: "Resources".into() }) + None => inherit(&self.parent, |pt| pt.resources.as_ref())?.ok_or_else(|| { + PdfError::MissingEntry { + typ: "Page", + field: "Resources".into(), + } + }), } } } impl SubType for Page {} - #[derive(Object, DataSize, Debug, ObjectWrite)] pub struct PageLabel { - #[pdf(key="S")] - pub style: Option, + #[pdf(key = "S")] + pub style: Option, - #[pdf(key="P")] + #[pdf(key = "P")] pub prefix: Option, - #[pdf(key="St")] - pub start: Option + #[pdf(key = "St")] + pub start: Option, } #[derive(Object, ObjectWrite, Debug, DataSize, Default, DeepClone, Clone)] pub struct Resources { - #[pdf(key="ExtGState")] + #[pdf(key = "ExtGState")] pub graphics_states: HashMap, - #[pdf(key="ColorSpace")] + #[pdf(key = "ColorSpace")] pub color_spaces: HashMap, - #[pdf(key="Pattern")] + #[pdf(key = "Pattern")] pub pattern: HashMap>, // shading: Option, - #[pdf(key="XObject")] + #[pdf(key = "XObject")] pub xobjects: HashMap>, // /XObject is a dictionary that map arbitrary names to XObjects - #[pdf(key="Font")] + #[pdf(key = "Font")] pub fonts: HashMap>, - #[pdf(key="Properties")] + #[pdf(key = "Properties")] pub properties: HashMap>, } - #[derive(Debug, Object, ObjectWrite, DataSize, Clone, DeepClone)] pub struct PatternDict { - #[pdf(key="PaintType")] + #[pdf(key = "PaintType")] pub paint_type: Option, - #[pdf(key="TilingType")] + #[pdf(key = "TilingType")] pub tiling_type: Option, - #[pdf(key="BBox")] + #[pdf(key = "BBox")] pub bbox: Rectangle, - #[pdf(key="XStep")] + #[pdf(key = "XStep")] pub x_step: f32, - #[pdf(key="YStep")] + #[pdf(key = "YStep")] pub y_step: f32, - #[pdf(key="Resources")] + #[pdf(key = "Resources")] pub resources: Ref, - #[pdf(key="Matrix")] + #[pdf(key = "Matrix")] pub matrix: Option, } @@ -432,7 +446,9 @@ impl Object for Pattern { fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result { let p = p.resolve(resolve)?; match p { - Primitive::Dictionary(dict) => Ok(Pattern::Dict(PatternDict::from_dict(dict, resolve)?)), + Primitive::Dictionary(dict) => { + Ok(Pattern::Dict(PatternDict::from_dict(dict, resolve)?)) + } Primitive::Stream(s) => { let stream: Stream = Stream::from_stream(s, resolve)?; let data = stream.data(resolve)?; @@ -440,7 +456,10 @@ impl Object for Pattern { let dict = stream.info.info; Ok(Pattern::Stream(dict, ops)) } - p => Err(PdfError::UnexpectedPrimitive { expected: "Dictionary or Stream", found: p.get_debug_name() }) + p => Err(PdfError::UnexpectedPrimitive { + expected: "Dictionary or Stream", + found: p.get_debug_name(), + }), } } } @@ -463,10 +482,13 @@ impl DeepClone for Pattern { Pattern::Stream(ref dict, ref ops) => { let old_resources = cloner.get(dict.resources)?; let mut resources = Resources::default(); - let ops: Vec = ops.iter().map(|op| deep_clone_op(op, cloner, &old_resources, &mut resources)).collect::>>()?; + let ops: Vec = ops + .iter() + .map(|op| deep_clone_op(op, cloner, &old_resources, &mut resources)) + .collect::>>()?; let dict = PatternDict { resources: cloner.create(resources)?.get_ref(), - .. *dict + ..*dict }; Ok(Pattern::Stream(dict, ops)) } @@ -478,47 +500,47 @@ impl DeepClone for Pattern { pub enum LineCap { Butt = 0, Round = 1, - Square = 2 + Square = 2, } #[derive(Object, ObjectWrite, DeepClone, Debug, DataSize, Copy, Clone)] pub enum LineJoin { Miter = 0, Round = 1, - Bevel = 2 + Bevel = 2, } #[derive(Object, ObjectWrite, DeepClone, Debug, DataSize, Clone)] #[pdf(Type = "ExtGState?")] /// `ExtGState` pub struct GraphicsStateParameters { - #[pdf(key="LW")] + #[pdf(key = "LW")] pub line_width: Option, - #[pdf(key="LC")] + #[pdf(key = "LC")] pub line_cap: Option, - #[pdf(key="LJ")] + #[pdf(key = "LJ")] pub line_join: Option, - #[pdf(key="ML")] + #[pdf(key = "ML")] pub miter_limit: Option, - #[pdf(key="D")] + #[pdf(key = "D")] pub dash_pattern: Option>, - #[pdf(key="RI")] + #[pdf(key = "RI")] pub rendering_intent: Option, - #[pdf(key="OP")] + #[pdf(key = "OP")] pub overprint: Option, - #[pdf(key="op")] + #[pdf(key = "op")] pub overprint_fill: Option, - #[pdf(key="OPM")] + #[pdf(key = "OPM")] pub overprint_mode: Option, - #[pdf(key="Font")] + #[pdf(key = "Font")] pub font: Option<(Ref, f32)>, // BG @@ -531,37 +553,35 @@ pub struct GraphicsStateParameters { // FL // SM // SA - - #[pdf(key="BM")] + #[pdf(key = "BM")] pub blend_mode: Option, - #[pdf(key="SMask")] + #[pdf(key = "SMask")] pub smask: Option, - - #[pdf(key="CA")] + #[pdf(key = "CA")] pub stroke_alpha: Option, - #[pdf(key="ca")] + #[pdf(key = "ca")] pub fill_alpha: Option, - #[pdf(key="AIS")] + #[pdf(key = "AIS")] pub alpha_is_shape: Option, - #[pdf(key="TK")] + #[pdf(key = "TK")] pub text_knockout: Option, #[pdf(other)] - _other: Dictionary + _other: Dictionary, } #[derive(Object, Debug, DataSize, DeepClone)] #[pdf(is_stream)] pub enum XObject { - #[pdf(name="PS")] - Postscript (PostScriptXObject), - Image (ImageXObject), - Form (FormXObject), + #[pdf(name = "PS")] + Postscript(PostScriptXObject), + Image(ImageXObject), + Form(FormXObject), } impl ObjectWrite for XObject { fn to_primitive(&self, update: &mut impl Updater) -> Result { @@ -581,7 +601,7 @@ pub type PostScriptXObject = Stream; #[derive(Debug, DataSize, Clone, DeepClone)] pub struct ImageXObject { - pub inner: Stream + pub inner: Stream, } impl Object for ImageXObject { fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result { @@ -607,7 +627,7 @@ pub enum ImageFormat { Jp2k, Jbig2, CittFax, - Png + Png, } impl ImageXObject { @@ -617,32 +637,38 @@ impl ImageXObject { } /// Decode everything except for the final image encoding (jpeg, jbig2, jp2k, ...) - pub fn raw_image_data(&self, resolve: &impl Resolve) -> Result<(Arc<[u8]>, Option<&StreamFilter>)> { + pub fn raw_image_data( + &self, + resolve: &impl Resolve, + ) -> Result<(Arc<[u8]>, Option<&StreamFilter>)> { match self.inner.inner_data { StreamData::Generated(_) => Ok((self.inner.data(resolve)?, None)), StreamData::Original(ref file_range, id) => { let filters = self.inner.filters.as_slice(); // decode all non image filters - let end = filters.iter().rposition(|f| match f { - StreamFilter::ASCIIHexDecode => false, - StreamFilter::ASCII85Decode => false, - StreamFilter::LZWDecode(_) => false, - StreamFilter::RunLengthDecode => false, - StreamFilter::Crypt => true, - _ => true - }).unwrap_or(filters.len()); + let end = filters + .iter() + .rposition(|f| match f { + StreamFilter::ASCIIHexDecode => false, + StreamFilter::ASCII85Decode => false, + StreamFilter::LZWDecode(_) => false, + StreamFilter::RunLengthDecode => false, + StreamFilter::Crypt => true, + _ => true, + }) + .unwrap_or(filters.len()); let (normal_filters, image_filters) = filters.split_at(end); let data = resolve.get_data_or_decode(id, file_range.clone(), normal_filters)?; match image_filters { [] => Ok((data, None)), - [StreamFilter::DCTDecode(_)] | - [StreamFilter::CCITTFaxDecode(_)] | - [StreamFilter::JPXDecode] | - [StreamFilter::FlateDecode(_)] | - [StreamFilter::JBIG2Decode(_)] => Ok((data, Some(&image_filters[0]))), - _ => bail!("??? filters={:?}", image_filters) + [StreamFilter::DCTDecode(_)] + | [StreamFilter::CCITTFaxDecode(_)] + | [StreamFilter::JPXDecode] + | [StreamFilter::FlateDecode(_)] + | [StreamFilter::JBIG2Decode(_)] => Ok((data, Some(&image_filters[0]))), + _ => bail!("??? filters={:?}", image_filters), } } } @@ -652,12 +678,16 @@ impl ImageXObject { let (data, filter) = self.raw_image_data(resolve)?; let filter = match filter { Some(f) => f, - None => return Ok(data) + None => return Ok(data), }; let mut data = match filter { StreamFilter::CCITTFaxDecode(ref params) => { if self.inner.info.width != params.columns { - bail!("image width mismatch {} != {}", self.inner.info.width, params.columns); + bail!( + "image width mismatch {} != {}", + self.inner.info.width, + params.columns + ); } let mut data = fax_decode(&data, params)?; if params.rows == 0 { @@ -671,9 +701,9 @@ impl ImageXObject { StreamFilter::JBIG2Decode(ref p) => { let global_data = p.globals.as_ref().map(|s| s.data(resolve)).transpose()?; jbig2_decode(&data, global_data.as_deref().unwrap_or_default())? - }, + } StreamFilter::FlateDecode(ref p) => flate_decode(&data, p)?, - _ => unreachable!() + _ => unreachable!(), }; if let Some(ref decode) = self.decode { if decode == &[1.0, 0.0] && self.bits_per_component == Some(1) { @@ -685,49 +715,47 @@ impl ImageXObject { } #[derive(Object, Debug, DataSize, DeepClone, ObjectWrite)] -#[pdf(Type="XObject", Subtype="PS")] +#[pdf(Type = "XObject", Subtype = "PS")] pub struct PostScriptDict { // TODO #[pdf(other)] - pub other: Dictionary + pub other: Dictionary, } #[derive(Object, Debug, Clone, DataSize, DeepClone, ObjectWrite, Default)] -#[pdf(Type="XObject?", Subtype="Image")] +#[pdf(Type = "XObject?", Subtype = "Image")] /// A variant of XObject pub struct ImageDict { - #[pdf(key="Width")] + #[pdf(key = "Width")] pub width: u32, - #[pdf(key="Height")] + #[pdf(key = "Height")] pub height: u32, - #[pdf(key="ColorSpace")] + #[pdf(key = "ColorSpace")] pub color_space: Option, - #[pdf(key="BitsPerComponent")] + #[pdf(key = "BitsPerComponent")] pub bits_per_component: Option, // Note: only allowed values are 1, 2, 4, 8, 16. Enum? - - #[pdf(key="Intent")] + #[pdf(key = "Intent")] pub intent: Option, // Note: default: "the current rendering intent in the graphics state" - I don't think this // ought to have a default then - - #[pdf(key="ImageMask", default="false")] + #[pdf(key = "ImageMask", default = "false")] pub image_mask: bool, // Mask: stream or array - #[pdf(key="Mask")] + #[pdf(key = "Mask")] pub mask: Option, // /// Describes how to map image samples into the range of values appropriate for the image’s color space. /// If `image_mask`: either [0 1] or [1 0]. Else, the length must be twice the number of color /// components required by `color_space` (key ColorSpace) // (see Decode arrays page 344) - #[pdf(key="Decode")] + #[pdf(key = "Decode")] pub decode: Option>, - #[pdf(key="Interpolate", default="false")] + #[pdf(key = "Interpolate", default = "false")] pub interpolate: bool, // Alternates: Vec @@ -735,24 +763,22 @@ pub struct ImageDict { // SMask (soft mask): stream // SMaskInData: i32 ///The integer key of the image’s entry in the structural parent tree - #[pdf(key="StructParent")] + #[pdf(key = "StructParent")] pub struct_parent: Option, - #[pdf(key="ID")] + #[pdf(key = "ID")] pub id: Option, - #[pdf(key="SMask")] + #[pdf(key = "SMask")] pub smask: Option>>, // OPI: dict // Metadata: stream // OC: dict - #[pdf(other)] - pub other: Dictionary + pub other: Dictionary, } - #[derive(Object, Debug, Copy, Clone, DataSize, DeepClone, ObjectWrite)] pub enum RenderingIntent { AbsoluteColorimetric, @@ -767,7 +793,7 @@ impl RenderingIntent { "RelativeColorimetric" => Some(RenderingIntent::RelativeColorimetric), "Perceptual" => Some(RenderingIntent::Perceptual), "Saturation" => Some(RenderingIntent::Saturation), - _ => None + _ => None, } } pub fn to_str(self) -> &'static str { @@ -781,202 +807,200 @@ impl RenderingIntent { } #[derive(Object, Debug, DataSize, DeepClone, ObjectWrite, Clone, Default)] -#[pdf(Type="XObject?", Subtype="Form")] +#[pdf(Type = "XObject?", Subtype = "Form")] pub struct FormDict { - #[pdf(key="FormType", default="1")] + #[pdf(key = "FormType", default = "1")] pub form_type: i32, - #[pdf(key="Name")] + #[pdf(key = "Name")] pub name: Option, - #[pdf(key="LastModified")] + #[pdf(key = "LastModified")] pub last_modified: Option, - #[pdf(key="BBox")] + #[pdf(key = "BBox")] pub bbox: Rectangle, - #[pdf(key="Matrix")] + #[pdf(key = "Matrix")] pub matrix: Option, - #[pdf(key="Resources")] + #[pdf(key = "Resources")] pub resources: Option>, - #[pdf(key="Group")] + #[pdf(key = "Group")] pub group: Option, - #[pdf(key="Ref")] + #[pdf(key = "Ref")] pub reference: Option, - #[pdf(key="Metadata")] + #[pdf(key = "Metadata")] pub metadata: Option>>, - #[pdf(key="PieceInfo")] + #[pdf(key = "PieceInfo")] pub piece_info: Option, - #[pdf(key="StructParent")] + #[pdf(key = "StructParent")] pub struct_parent: Option, - #[pdf(key="StructParents")] + #[pdf(key = "StructParents")] pub struct_parents: Option, - #[pdf(key="OPI")] + #[pdf(key = "OPI")] pub opi: Option, #[pdf(other)] pub other: Dictionary, } - #[derive(Object, ObjectWrite, Debug, Clone, DataSize)] pub struct InteractiveFormDictionary { - #[pdf(key="Fields")] + #[pdf(key = "Fields")] pub fields: Vec>, - #[pdf(key="NeedAppearances", default="false")] + #[pdf(key = "NeedAppearances", default = "false")] pub need_appearences: bool, - #[pdf(key="SigFlags", default="0")] + #[pdf(key = "SigFlags", default = "0")] pub sig_flags: u32, - #[pdf(key="CO")] + #[pdf(key = "CO")] pub co: Option>>, - #[pdf(key="DR")] + #[pdf(key = "DR")] pub dr: Option>, - #[pdf(key="DA")] + #[pdf(key = "DA")] pub da: Option, - #[pdf(key="Q")] + #[pdf(key = "Q")] pub q: Option, - #[pdf(key="XFA")] + #[pdf(key = "XFA")] pub xfa: Option, } #[derive(Object, ObjectWrite, Debug, Copy, Clone, PartialEq, DataSize)] pub enum FieldType { - #[pdf(name="Btn")] + #[pdf(name = "Btn")] Button, - #[pdf(name="Tx")] + #[pdf(name = "Tx")] Text, - #[pdf(name="Ch")] + #[pdf(name = "Ch")] Choice, - #[pdf(name="Sig")] + #[pdf(name = "Sig")] Signature, - #[pdf(name="SigRef")] + #[pdf(name = "SigRef")] SignatureReference, } #[derive(Object, ObjectWrite, Debug)] -#[pdf(Type="SV")] +#[pdf(Type = "SV")] pub struct SeedValueDictionary { - #[pdf(key="Ff", default="0")] + #[pdf(key = "Ff", default = "0")] pub flags: u32, - #[pdf(key="Filter")] + #[pdf(key = "Filter")] pub filter: Option, - #[pdf(key="SubFilter")] - pub sub_filter: Option>, - #[pdf(key="V")] + #[pdf(key = "SubFilter")] + pub sub_filter: Option>, + #[pdf(key = "V")] pub value: Option, - #[pdf(key="DigestMethod")] + #[pdf(key = "DigestMethod")] pub digest_method: Vec, #[pdf(other)] - pub other: Dictionary + pub other: Dictionary, } #[derive(Object, ObjectWrite, Debug)] -#[pdf(Type="Sig?")] +#[pdf(Type = "Sig?")] pub struct SignatureDictionary { - #[pdf(key="Filter")] + #[pdf(key = "Filter")] pub filter: Name, - #[pdf(key="SubFilter")] + #[pdf(key = "SubFilter")] pub sub_filter: Name, - #[pdf(key="ByteRange")] + #[pdf(key = "ByteRange")] pub byte_range: Vec, - #[pdf(key="Contents")] + #[pdf(key = "Contents")] pub contents: PdfString, - #[pdf(key="Cert")] + #[pdf(key = "Cert")] pub cert: Vec, - #[pdf(key="Reference")] + #[pdf(key = "Reference")] pub reference: Option, - #[pdf(key="Name")] + #[pdf(key = "Name")] pub name: Option, - #[pdf(key="M")] + #[pdf(key = "M")] pub m: Option, - #[pdf(key="Location")] + #[pdf(key = "Location")] pub location: Option, - #[pdf(key="Reason")] + #[pdf(key = "Reason")] pub reason: Option, - #[pdf(key="ContactInfo")] + #[pdf(key = "ContactInfo")] pub contact_info: Option, - #[pdf(key="V")] + #[pdf(key = "V")] pub v: i32, - #[pdf(key="R")] + #[pdf(key = "R")] pub r: i32, - #[pdf(key="Prop_Build")] + #[pdf(key = "Prop_Build")] pub prop_build: Dictionary, - #[pdf(key="Prop_AuthTime")] + #[pdf(key = "Prop_AuthTime")] pub prop_auth_time: i32, - #[pdf(key="Prop_AuthType")] + #[pdf(key = "Prop_AuthType")] pub prop_auth_type: Name, #[pdf(other)] - pub other: Dictionary + pub other: Dictionary, } #[derive(Object, ObjectWrite, Debug)] -#[pdf(Type="SigRef?")] +#[pdf(Type = "SigRef?")] pub struct SignatureReferenceDictionary { - #[pdf(key="TransformMethod")] + #[pdf(key = "TransformMethod")] pub transform_method: Name, - #[pdf(key="TransformParams")] + #[pdf(key = "TransformParams")] pub transform_params: Option, - #[pdf(key="Data")] + #[pdf(key = "Data")] pub data: Option, - #[pdf(key="DigestMethod")] + #[pdf(key = "DigestMethod")] pub digest_method: Option, #[pdf(other)] - pub other: Dictionary + pub other: Dictionary, } - #[derive(Object, ObjectWrite, Debug, Clone, DataSize)] -#[pdf(Type="Annot?")] +#[pdf(Type = "Annot?")] pub struct Annot { - #[pdf(key="Subtype")] + #[pdf(key = "Subtype")] pub subtype: Name, - #[pdf(key="Rect")] + #[pdf(key = "Rect")] pub rect: Option, - #[pdf(key="Contents")] + #[pdf(key = "Contents")] pub contents: Option, - #[pdf(key="P")] + #[pdf(key = "P")] pub page: Option, - #[pdf(key="NM")] + #[pdf(key = "NM")] pub annotation_name: Option, - #[pdf(key="M")] + #[pdf(key = "M")] pub date: Option, - #[pdf(key="F", default="0")] + #[pdf(key = "F", default = "0")] pub annot_flags: u32, - #[pdf(key="AP")] + #[pdf(key = "AP")] pub appearance_streams: Option>, - #[pdf(key="AS")] + #[pdf(key = "AS")] pub appearance_state: Option, - #[pdf(key="Border")] + #[pdf(key = "Border")] pub border: Option, - #[pdf(key="C")] + #[pdf(key = "C")] pub color: Option, - #[pdf(key="InkList")] + #[pdf(key = "InkList")] pub ink_list: Option, #[pdf(other)] @@ -985,78 +1009,85 @@ pub struct Annot { #[derive(Object, ObjectWrite, Debug, DataSize, Clone)] pub struct FieldDictionary { - #[pdf(key="FT")] + #[pdf(key = "FT")] pub typ: Option, - #[pdf(key="Parent")] + #[pdf(key = "Parent")] pub parent: Option>, - #[pdf(key="Kids")] + #[pdf(key = "Kids")] pub kids: Vec>, - #[pdf(key="T")] + #[pdf(key = "T")] pub name: Option, - #[pdf(key="TU")] + #[pdf(key = "TU")] pub alt_name: Option, - #[pdf(key="TM")] + #[pdf(key = "TM")] pub mapping_name: Option, - #[pdf(key="Ff", default="0")] + #[pdf(key = "Ff", default = "0")] pub flags: u32, - #[pdf(key="SigFlags", default="0")] + #[pdf(key = "SigFlags", default = "0")] pub sig_flags: u32, - #[pdf(key="V")] + #[pdf(key = "V")] pub value: Primitive, - #[pdf(key="DV")] + #[pdf(key = "DV")] pub default_value: Primitive, - #[pdf(key="DR")] + #[pdf(key = "DR")] pub default_resources: Option>, - #[pdf(key="AA")] + #[pdf(key = "AA")] pub actions: Option, - #[pdf(key="Rect")] + #[pdf(key = "Rect")] pub rect: Option, - #[pdf(key="MaxLen")] + #[pdf(key = "MaxLen")] pub max_len: Option, - #[pdf(key="Subtype")] + #[pdf(key = "Subtype")] pub subtype: Option, #[pdf(other)] - pub other: Dictionary + pub other: Dictionary, } #[derive(Object, ObjectWrite, Debug, DataSize, Clone, DeepClone)] pub struct AppearanceStreams { - #[pdf(key="N")] + #[pdf(key = "N")] pub normal: Ref, - #[pdf(key="R")] + #[pdf(key = "R")] pub rollover: Option>, - #[pdf(key="D")] + #[pdf(key = "D")] pub down: Option>, } #[derive(Clone, Debug, DeepClone)] pub enum AppearanceStreamEntry { Single(FormXObject), - Dict(HashMap) + Dict(HashMap), } impl Object for AppearanceStreamEntry { fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result { match p.resolve(resolve)? { - p @ Primitive::Dictionary(_) => Object::from_primitive(p, resolve).map(AppearanceStreamEntry::Dict), - p @ Primitive::Stream(_) => Object::from_primitive(p, resolve).map(AppearanceStreamEntry::Single), - p => Err(PdfError::UnexpectedPrimitive {expected: "Dict or Stream", found: p.get_debug_name()}) + p @ Primitive::Dictionary(_) => { + Object::from_primitive(p, resolve).map(AppearanceStreamEntry::Dict) + } + p @ Primitive::Stream(_) => { + Object::from_primitive(p, resolve).map(AppearanceStreamEntry::Single) + } + p => Err(PdfError::UnexpectedPrimitive { + expected: "Dict or Stream", + found: p.get_debug_name(), + }), } } } @@ -1074,32 +1105,31 @@ impl DataSize for AppearanceStreamEntry { fn estimate_heap_size(&self) -> usize { match self { AppearanceStreamEntry::Dict(d) => d.estimate_heap_size(), - AppearanceStreamEntry::Single(s) => s.estimate_heap_size() + AppearanceStreamEntry::Single(s) => s.estimate_heap_size(), } } } #[derive(Debug, DataSize, Clone, Object, ObjectWrite, DeepClone)] pub enum Counter { - #[pdf(name="D")] + #[pdf(name = "D")] Arabic, - #[pdf(name="r")] + #[pdf(name = "r")] RomanUpper, - #[pdf(name="R")] + #[pdf(name = "R")] RomanLower, - #[pdf(name="a")] + #[pdf(name = "a")] AlphaUpper, - #[pdf(name="A")] - AlphaLower + #[pdf(name = "A")] + AlphaLower, } #[derive(Debug, DataSize)] pub enum NameTreeNode { /// - Intermediate (Vec>>), + Intermediate(Vec>>), /// - Leaf (Vec<(PdfString, T)>) - + Leaf(Vec<(PdfString, T)>), } /// Note: The PDF concept of 'root' node is an intermediate or leaf node which has no 'Limits' /// entry. Hence, `limits`, @@ -1108,8 +1138,12 @@ pub struct NameTree { pub limits: Option<(PdfString, PdfString)>, pub node: NameTreeNode, } -impl NameTree { - pub fn walk(&self, r: &impl Resolve, callback: &mut dyn FnMut(&PdfString, &T)) -> Result<(), PdfError> { +impl NameTree { + pub fn walk( + &self, + r: &impl Resolve, + callback: &mut dyn FnMut(&PdfString, &T), + ) -> Result<(), PdfError> { match self.node { NameTreeNode::Leaf(ref items) => { for (name, val) in items { @@ -1142,7 +1176,7 @@ impl Object for NameTree { Some((min, max)) } - None => None + None => None, }; let kids = dict.remove("Kids"); @@ -1150,12 +1184,15 @@ impl Object for NameTree { // If no `kids`, try `names`. Else there is an error. Ok(match (kids, names) { (Some(kids), _) => { - let kids = t!(kids.resolve(resolve)?.into_array()?.iter().map(|kid| - Ref::>::from_primitive(kid.clone(), resolve) - ).collect::>>()); + let kids = t!(kids + .resolve(resolve)? + .into_array()? + .iter() + .map(|kid| Ref::>::from_primitive(kid.clone(), resolve)) + .collect::>>()); NameTree { limits, - node: NameTreeNode::Intermediate (kids) + node: NameTreeNode::Intermediate(kids), } } (None, Some(names)) => { @@ -1168,14 +1205,14 @@ impl Object for NameTree { } NameTree { limits, - node: NameTreeNode::Leaf (new_names), + node: NameTreeNode::Leaf(new_names), } } (None, None) => { warn!("Neither Kids nor Names present in NameTree node."); NameTree { limits, - node: NameTreeNode::Intermediate(vec![]) + node: NameTreeNode::Intermediate(vec![]), } } }) @@ -1214,19 +1251,22 @@ impl Object for NumberTree { Some((min, max)) } - None => None + None => None, }; let kids = dict.remove("Kids"); let nums = dict.remove("Nums"); match (kids, nums) { (Some(kids), _) => { - let kids = t!(kids.resolve(resolve)?.into_array()?.iter().map(|kid| - Ref::>::from_primitive(kid.clone(), resolve) - ).collect::>>()); + let kids = t!(kids + .resolve(resolve)? + .into_array()? + .iter() + .map(|kid| Ref::>::from_primitive(kid.clone(), resolve)) + .collect::>>()); Ok(NumberTree { limits, - node: NumberTreeNode::Intermediate (kids) + node: NumberTreeNode::Intermediate(kids), }) } (None, Some(nums)) => { @@ -1239,14 +1279,14 @@ impl Object for NumberTree { } Ok(NumberTree { limits, - node: NumberTreeNode::Leaf(items) + node: NumberTreeNode::Leaf(items), }) } (None, None) => { warn!("Neither Kids nor Names present in NumberTree node."); Ok(NumberTree { limits, - node: NumberTreeNode::Intermediate(vec![]) + node: NumberTreeNode::Intermediate(vec![]), }) } } @@ -1268,14 +1308,21 @@ impl ObjectWrite for NumberTree { dict.insert("Nums", nums); } NumberTreeNode::Intermediate(ref kids) => { - dict.insert("Kids", kids.iter().map(|r| r.get_inner().into()).collect_vec()); + dict.insert( + "Kids", + kids.iter().map(|r| r.get_inner().into()).collect_vec(), + ); } } Ok(dict.into()) } } -impl NumberTree { - pub fn walk(&self, r: &impl Resolve, callback: &mut dyn FnMut(i32, &T)) -> Result<(), PdfError> { +impl NumberTree { + pub fn walk( + &self, + r: &impl Resolve, + callback: &mut dyn FnMut(i32, &T), + ) -> Result<(), PdfError> { match self.node { NumberTreeNode::Leaf(ref items) => { for &(idx, ref val) in items { @@ -1295,26 +1342,36 @@ impl NumberTree { #[derive(Object, ObjectWrite, Clone, DeepClone, Debug)] pub struct LageLabel { - #[pdf(key="S")] + #[pdf(key = "S")] style: Option, - #[pdf(key="P")] + #[pdf(key = "P")] prefix: Option, - #[pdf(key="St")] + #[pdf(key = "St")] start: Option, } #[derive(Debug, Clone, DataSize)] pub enum DestView { // left, top, zoom - XYZ { left: Option, top: Option, zoom: f32 }, + XYZ { + left: Option, + top: Option, + zoom: f32, + }, Fit, - FitH { top: f32 }, - FitV { left: f32 }, + FitH { + top: f32, + }, + FitV { + left: f32, + }, FitR(Rectangle), FitB, - FitBH { top: f32 } + FitBH { + top: f32, + }, } #[derive(Debug, Clone, DataSize)] @@ -1326,17 +1383,17 @@ pub enum MaybeNamedDest { #[derive(Debug, Clone, DataSize)] pub struct Dest { pub page: Option>, - pub view: DestView + pub view: DestView, } impl Object for Dest { fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result { let p = match p { Primitive::Reference(r) => resolve.resolve(r)?, - p => p + p => p, }; let p = match p { Primitive::Dictionary(mut dict) => dict.require("Dest", "D")?, - p => p + p => p, }; let array = t!(p.as_array(), p); Dest::from_array(array, resolve) @@ -1352,57 +1409,74 @@ impl Dest { Primitive::Null => None, Primitive::Integer(n) => Some(n as f32), Primitive::Number(f) => Some(f), - ref p => return Err(PdfError::UnexpectedPrimitive { expected: "Number | Integer | Null", found: p.get_debug_name() }), + ref p => { + return Err(PdfError::UnexpectedPrimitive { + expected: "Number | Integer | Null", + found: p.get_debug_name(), + }) + } }, top: match *try_opt!(array.get(3)) { Primitive::Null => None, Primitive::Integer(n) => Some(n as f32), Primitive::Number(f) => Some(f), - ref p => return Err(PdfError::UnexpectedPrimitive { expected: "Number | Integer | Null", found: p.get_debug_name() }), + ref p => { + return Err(PdfError::UnexpectedPrimitive { + expected: "Number | Integer | Null", + found: p.get_debug_name(), + }) + } }, zoom: match array.get(4) { Some(Primitive::Null) => 0.0, Some(&Primitive::Integer(n)) => n as f32, Some(&Primitive::Number(f)) => f, - Some(p) => return Err(PdfError::UnexpectedPrimitive { expected: "Number | Integer | Null", found: p.get_debug_name() }), + Some(p) => { + return Err(PdfError::UnexpectedPrimitive { + expected: "Number | Integer | Null", + found: p.get_debug_name(), + }) + } None => 0.0, }, }, "Fit" => DestView::Fit, "FitH" => DestView::FitH { - top: try_opt!(array.get(2)).as_number()? + top: try_opt!(array.get(2)).as_number()?, }, "FitV" => DestView::FitV { - left: try_opt!(array.get(2)).as_number()? + left: try_opt!(array.get(2)).as_number()?, }, "FitR" => DestView::FitR(Rectangle { - left: try_opt!(array.get(2)).as_number()?, + left: try_opt!(array.get(2)).as_number()?, bottom: try_opt!(array.get(3)).as_number()?, - right: try_opt!(array.get(4)).as_number()?, - top: try_opt!(array.get(5)).as_number()?, + right: try_opt!(array.get(4)).as_number()?, + top: try_opt!(array.get(5)).as_number()?, }), "FitB" => DestView::FitB, "FitBH" => DestView::FitBH { - top: try_opt!(array.get(2)).as_number()? + top: try_opt!(array.get(2)).as_number()?, }, - name => return Err(PdfError::UnknownVariant { id: "Dest", name: name.into() }) + name => { + return Err(PdfError::UnknownVariant { + id: "Dest", + name: name.into(), + }) + } }; - Ok(Dest { - page, - view - }) + Ok(Dest { page, view }) } } impl Object for MaybeNamedDest { fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result { let p = match p { Primitive::Reference(r) => resolve.resolve(r)?, - p => p + p => p, }; let p = match p { Primitive::Dictionary(mut dict) => dict.require("Dest", "D")?, Primitive::String(s) => return Ok(MaybeNamedDest::Named(s)), - p => p + p => p, }; let array = t!(p.as_array(), p); Dest::from_array(array, resolve).map(MaybeNamedDest::Direct) @@ -1412,7 +1486,7 @@ impl ObjectWrite for MaybeNamedDest { fn to_primitive(&self, update: &mut impl Updater) -> Result { match self { MaybeNamedDest::Named(s) => Ok(Primitive::String(s.clone())), - MaybeNamedDest::Direct(d) => d.to_primitive(update) + MaybeNamedDest::Direct(d) => d.to_primitive(update), } } } @@ -1459,28 +1533,28 @@ impl ObjectWrite for Dest { /// There is one `NameDictionary` associated with each PDF file. #[derive(Object, ObjectWrite, Debug, DataSize)] pub struct NameDictionary { - #[pdf(key="Pages")] + #[pdf(key = "Pages")] pub pages: Option>, - #[pdf(key="Dests")] + #[pdf(key = "Dests")] pub dests: Option>>, - #[pdf(key="AP")] + #[pdf(key = "AP")] pub ap: Option>, - #[pdf(key="JavaScript")] + #[pdf(key = "JavaScript")] pub javascript: Option>, - #[pdf(key="Templates")] + #[pdf(key = "Templates")] pub templates: Option>, - #[pdf(key="IDS")] + #[pdf(key = "IDS")] pub ids: Option>, - #[pdf(key="URLS")] + #[pdf(key = "URLS")] pub urls: Option>, - #[pdf(key="EmbeddedFiles")] + #[pdf(key = "EmbeddedFiles")] pub embedded_files: Option>, /* #[pdf(key="AlternativePresentations")] @@ -1499,7 +1573,7 @@ pub struct NameDictionary { #[derive(Object, ObjectWrite, Debug, Clone, DataSize, DeepClone)] pub struct FileSpec { - #[pdf(key="EF")] + #[pdf(key = "EF")] pub ef: Option>>>, /* #[pdf(key="RF")] @@ -1510,15 +1584,15 @@ pub struct FileSpec { /// Used only as elements in `FileSpec` #[derive(Object, ObjectWrite, Debug, Clone, DeepClone)] pub struct Files { - #[pdf(key="F")] + #[pdf(key = "F")] pub f: Option, - #[pdf(key="UF")] + #[pdf(key = "UF")] pub uf: Option, - #[pdf(key="DOS")] + #[pdf(key = "DOS")] pub dos: Option, - #[pdf(key="Mac")] + #[pdf(key = "Mac")] pub mac: Option, - #[pdf(key="Unix")] + #[pdf(key = "Unix")] pub unix: Option, } impl DataSize for Files { @@ -1526,83 +1600,98 @@ impl DataSize for Files { const STATIC_HEAP_SIZE: usize = 5 * Option::::STATIC_HEAP_SIZE; fn estimate_heap_size(&self) -> usize { - self.f.as_ref().map(|t| t.estimate_heap_size()).unwrap_or(0) + - self.uf.as_ref().map(|t| t.estimate_heap_size()).unwrap_or(0) + - self.dos.as_ref().map(|t| t.estimate_heap_size()).unwrap_or(0) + - self.mac.as_ref().map(|t| t.estimate_heap_size()).unwrap_or(0) + - self.unix.as_ref().map(|t| t.estimate_heap_size()).unwrap_or(0) + self.f.as_ref().map(|t| t.estimate_heap_size()).unwrap_or(0) + + self + .uf + .as_ref() + .map(|t| t.estimate_heap_size()) + .unwrap_or(0) + + self + .dos + .as_ref() + .map(|t| t.estimate_heap_size()) + .unwrap_or(0) + + self + .mac + .as_ref() + .map(|t| t.estimate_heap_size()) + .unwrap_or(0) + + self + .unix + .as_ref() + .map(|t| t.estimate_heap_size()) + .unwrap_or(0) } - } /// PDF Embedded File Stream. #[derive(Object, Debug, Clone, DataSize, DeepClone, ObjectWrite)] pub struct EmbeddedFile { - #[pdf(key="Subtype")] + #[pdf(key = "Subtype")] subtype: Option, - #[pdf(key="Params")] + #[pdf(key = "Params")] pub params: Option, } #[derive(Object, Debug, Clone, DataSize, DeepClone, ObjectWrite)] pub struct EmbeddedFileParamDict { - #[pdf(key="Size")] + #[pdf(key = "Size")] pub size: Option, - #[pdf(key="CreationDate")] + #[pdf(key = "CreationDate")] creationdate: Option, - #[pdf(key="ModDate")] + #[pdf(key = "ModDate")] moddate: Option, - #[pdf(key="Mac")] + #[pdf(key = "Mac")] mac: Option, - #[pdf(key="CheckSum")] + #[pdf(key = "CheckSum")] checksum: Option, } #[derive(Object, Debug, Clone, DataSize)] pub struct OutlineItem { - #[pdf(key="Title")] + #[pdf(key = "Title")] pub title: Option, - #[pdf(key="Prev")] + #[pdf(key = "Prev")] pub prev: Option>, - #[pdf(key="Next")] + #[pdf(key = "Next")] pub next: Option>, - #[pdf(key="First")] + #[pdf(key = "First")] pub first: Option>, - #[pdf(key="Last")] + #[pdf(key = "Last")] pub last: Option>, - #[pdf(key="Count", default="0")] - pub count: i32, + #[pdf(key = "Count", default = "0")] + pub count: i32, - #[pdf(key="Dest")] + #[pdf(key = "Dest")] pub dest: Option, - #[pdf(key="A")] + #[pdf(key = "A")] pub action: Option, - #[pdf(key="SE")] + #[pdf(key = "SE")] pub se: Option, - #[pdf(key="C")] + #[pdf(key = "C")] pub color: Option>, - #[pdf(key="F")] + #[pdf(key = "F")] pub flags: Option, } #[derive(Clone, Debug, DataSize)] pub enum Action { Goto(MaybeNamedDest), - Other(Dictionary) + Other(Dictionary), } impl Object for Action { fn from_primitive(p: Primitive, resolve: &impl Resolve) -> Result { @@ -1610,10 +1699,13 @@ impl Object for Action { let s = try_opt!(d.get("S")).as_name()?; match s { "GoTo" => { - let dest = t!(MaybeNamedDest::from_primitive(try_opt!(d.remove("D")), resolve)); + let dest = t!(MaybeNamedDest::from_primitive( + try_opt!(d.remove("D")), + resolve + )); Ok(Action::Goto(dest)) } - _ => Ok(Action::Other(d)) + _ => Ok(Action::Other(d)), } } } @@ -1625,23 +1717,22 @@ impl ObjectWrite for Action { dict.insert("D", dest.to_primitive(update)?); Ok(Primitive::Dictionary(dict)) } - Action::Other(dict) => Ok(Primitive::Dictionary(dict.clone())) + Action::Other(dict) => Ok(Primitive::Dictionary(dict.clone())), } } } #[derive(Object, ObjectWrite, Debug, DataSize)] -#[pdf(Type="Outlines?")] +#[pdf(Type = "Outlines?")] pub struct Outlines { - #[pdf(key="Count", default="0")] - pub count: i32, + #[pdf(key = "Count", default = "0")] + pub count: i32, - #[pdf(key="First")] + #[pdf(key = "First")] pub first: Option>, - #[pdf(key="Last")] + #[pdf(key = "Last")] pub last: Option>, - } /// ISO 32000-2:2020(E) 7.9.5 Rectangles (Pg 134) @@ -1655,10 +1746,10 @@ pub struct Outlines { /// defining top, left, bottom, right labeling #[derive(Debug, Copy, Clone, DataSize, Default)] pub struct Rectangle { - pub left: f32, + pub left: f32, pub bottom: f32, - pub right: f32, - pub top: f32, + pub right: f32, + pub top: f32, } #[deprecated] pub type Rect = Rectangle; @@ -1670,54 +1761,57 @@ impl Object for Rectangle { bail!("len != 4 {:?}", arr); } Ok(Rectangle { - left: arr[0].as_number()?, + left: arr[0].as_number()?, bottom: arr[1].as_number()?, - right: arr[2].as_number()?, - top: arr[3].as_number()? + right: arr[2].as_number()?, + top: arr[3].as_number()?, }) } } impl ObjectWrite for Rectangle { fn to_primitive(&self, update: &mut impl Updater) -> Result { - Primitive::array::([self.left, self.bottom, self.right, self.top].iter(), update) + Primitive::array::( + [self.left, self.bottom, self.right, self.top].iter(), + update, + ) } } - // Stuff from chapter 10 of the PDF 1.7 ref #[derive(Object, ObjectWrite, Debug, DataSize)] -pub struct MarkInformation { // TODO no /Type +pub struct MarkInformation { + // TODO no /Type /// indicating whether the document conforms to Tagged PDF conventions - #[pdf(key="Marked", default="false")] + #[pdf(key = "Marked", default = "false")] pub marked: bool, /// Indicating the presence of structure elements that contain user properties attributes - #[pdf(key="UserProperties", default="false")] + #[pdf(key = "UserProperties", default = "false")] pub user_properties: bool, /// Indicating the presence of tag suspects - #[pdf(key="Suspects", default="false")] + #[pdf(key = "Suspects", default = "false")] pub suspects: bool, } #[derive(Object, ObjectWrite, Debug, DataSize)] #[pdf(Type = "StructTreeRoot")] pub struct StructTreeRoot { - #[pdf(key="K")] + #[pdf(key = "K")] pub children: Vec, } #[derive(Object, ObjectWrite, Debug, DataSize)] pub struct StructElem { - #[pdf(key="S")] + #[pdf(key = "S")] pub struct_type: StructType, - #[pdf(key="P")] + #[pdf(key = "P")] pub parent: Ref, - #[pdf(key="ID")] + #[pdf(key = "ID")] pub id: Option, /// `Pg`: A page object representing a page on which some or all of the content items designated by the K entry are rendered. - #[pdf(key="Pg")] + #[pdf(key = "Pg")] pub page: Option>, } @@ -1786,31 +1880,31 @@ pub enum Trapped { #[derive(Object, ObjectWrite, Debug, DataSize, Default)] pub struct InfoDict { - #[pdf(key="Title")] + #[pdf(key = "Title")] pub title: Option, - #[pdf(key="Author")] + #[pdf(key = "Author")] pub author: Option, - #[pdf(key="Subject")] + #[pdf(key = "Subject")] pub subject: Option, - #[pdf(key="Keywords")] + #[pdf(key = "Keywords")] pub keywords: Option, - #[pdf(key="Creator")] + #[pdf(key = "Creator")] pub creator: Option, - #[pdf(key="Producer")] + #[pdf(key = "Producer")] pub producer: Option, - #[pdf(key="CreationDate")] + #[pdf(key = "CreationDate")] pub creation_date: Option, - #[pdf(key="ModDate")] + #[pdf(key = "ModDate")] pub mod_date: Option, - #[pdf(key="Trapped")] + #[pdf(key = "Trapped")] pub trapped: Option, } diff --git a/src-pdfrs/pdf/src/parser/lexer/mod.rs b/src-pdfrs/pdf/src/parser/lexer/mod.rs index 34f37a4..caf77f9 100644 --- a/src-pdfrs/pdf/src/parser/lexer/mod.rs +++ b/src-pdfrs/pdf/src/parser/lexer/mod.rs @@ -1,16 +1,14 @@ +use std::borrow::Cow; +use std::ops::{Deref, Range, RangeFrom}; /// Lexing an input file, in the sense of breaking it up into substrings based on delimiters and /// whitespace. - use std::str::FromStr; -use std::ops::{Range, Deref, RangeFrom}; -use std::borrow::Cow; use crate::error::*; use crate::primitive::Name; mod str; -pub use self::str::{StringLexer, HexStringLexer}; - +pub use self::str::{HexStringLexer, StringLexer}; /// `Lexer` has functionality to jump around and traverse the PDF lexemes of a string in any direction. #[derive(Copy, Clone)] @@ -24,18 +22,18 @@ pub struct Lexer<'a> { // find the position where condition(data[pos-1]) == false and condition(data[pos]) == true #[inline] fn boundary_rev(data: &[u8], pos: usize, condition: impl Fn(u8) -> bool) -> usize { - match data[.. pos].iter().rposition(|&b| !condition(b)) { + match data[..pos].iter().rposition(|&b| !condition(b)) { Some(start) => start + 1, - None => 0 + None => 0, } } // find the position where condition(data[pos-1]) == true and condition(data[pos]) == false #[inline] fn boundary(data: &[u8], pos: usize, condition: impl Fn(u8) -> bool) -> usize { - match data[pos ..].iter().position(|&b| !condition(b)) { + match data[pos..].iter().position(|&b| !condition(b)) { Some(start) => pos + start, - None => data.len() + None => data.len(), } } @@ -52,14 +50,14 @@ impl<'a> Lexer<'a> { Lexer { pos: 0, buf, - file_offset: 0 + file_offset: 0, } } pub fn with_offset(buf: &'a [u8], file_offset: usize) -> Lexer<'a> { Lexer { pos: 0, buf, - file_offset + file_offset, } } @@ -74,10 +72,10 @@ impl<'a> Lexer<'a> { /// consume the whitespace sequence following the stream start pub fn next_stream(&mut self) -> Result<()> { let pos = self.skip_whitespace(self.pos)?; - if !self.buf[pos ..].starts_with(b"stream") { + if !self.buf[pos..].starts_with(b"stream") { // bail!("next token isn't 'stream'"); } - + let &b0 = self.buf.get(pos + 6).ok_or(PdfError::EOF)?; if b0 == b'\n' { self.pos = pos + 7; @@ -96,13 +94,13 @@ impl<'a> Lexer<'a> { /// Gives previous lexeme. Lexer moves to the first byte of this lexeme. (needs to be tested) pub fn back(&mut self) -> Result> { //println!("back: {:?}", String::from_utf8_lossy(&self.buf[self.pos.saturating_sub(20) .. self.pos])); - + // first reverse until we find non-whitespace let end_pos = boundary_rev(self.buf, self.pos, is_whitespace); let start_pos = boundary_rev(self.buf, end_pos, not(is_whitespace)); self.pos = start_pos; - - Ok(self.new_substr(start_pos .. end_pos)) + + Ok(self.new_substr(start_pos..end_pos)) } /// Look at the next lexeme. Will return empty substr if the next character is EOF. @@ -112,7 +110,6 @@ impl<'a> Lexer<'a> { Err(PdfError::EOF) => Ok(self.new_substr(self.pos..self.pos)), Err(e) => Err(e), } - } /// Returns `Ok` if the next lexeme matches `expected` - else `Err`. @@ -124,7 +121,7 @@ impl<'a> Lexer<'a> { Err(PdfError::UnexpectedLexeme { pos: self.pos, lexeme: word.to_string(), - expected + expected, }) } } @@ -153,13 +150,13 @@ impl<'a> Lexer<'a> { while self.buf.get(pos) == Some(&b'%') { pos += 1; if let Some(off) = self.buf[pos..].iter().position(|&b| b == b'\n') { - pos += off+1; + pos += off + 1; } - + // Move away from eventual whitespace pos = self.skip_whitespace(pos)?; } - + let start_pos = pos; // If first character is delimiter, this lexeme only contains that character. @@ -177,7 +174,7 @@ impl<'a> Lexer<'a> { return Ok((self.new_substr(start_pos..pos), pos)); } - if let Some(slice) = self.buf.get(pos..=pos+1) { + if let Some(slice) = self.buf.get(pos..=pos + 1) { if slice == b"<<" || slice == b">>" { pos = self.advance_pos(pos)?; } @@ -213,7 +210,9 @@ impl<'a> Lexer<'a> { #[inline] pub fn next_as(&mut self) -> Result - where T: FromStr, T::Err: std::error::Error + Send + Sync + 'static + where + T: FromStr, + T::Err: std::error::Error + Send + Sync + 'static, { self.next().and_then(|word| word.to::()) } @@ -265,16 +264,14 @@ impl<'a> Lexer<'a> { /// Moves pos to start of next line. Returns the skipped-over substring. #[allow(dead_code)] - pub fn seek_newline(&mut self) -> Substr{ + pub fn seek_newline(&mut self) -> Substr { let start = self.pos; - while self.buf[self.pos] != b'\n' - && self.incr_pos() { } + while self.buf[self.pos] != b'\n' && self.incr_pos() {} self.incr_pos(); self.new_substr(start..self.pos) } - // TODO: seek_substr and seek_substr_back should use next() or back()? /// Moves pos to after the found `substr`. Returns Substr with traversed text if `substr` is found. #[allow(dead_code)] @@ -285,7 +282,7 @@ impl<'a> Lexer<'a> { let mut matched = 0; loop { if self.pos >= self.buf.len() { - return None + return None; } if self.buf[self.pos] == substr[matched] { matched += 1; @@ -306,12 +303,17 @@ impl<'a> Lexer<'a> { /// Substr if found. pub fn seek_substr_back(&mut self, substr: &[u8]) -> Result> { let end = self.pos; - match self.buf[.. end].windows(substr.len()).rposition(|w| w == substr) { + match self.buf[..end] + .windows(substr.len()) + .rposition(|w| w == substr) + { Some(start) => { self.pos = start + substr.len(); - Ok(self.new_substr(self.pos .. end)) + Ok(self.new_substr(self.pos..end)) } - None => Err(PdfError::NotFound {word: String::from_utf8_lossy(substr).into() }) + None => Err(PdfError::NotFound { + word: String::from_utf8_lossy(substr).into(), + }), } } @@ -338,7 +340,9 @@ impl<'a> Lexer<'a> { /// for debugging pub fn ctx(&self) -> Cow { - String::from_utf8_lossy(&self.buf[self.pos.saturating_sub(40)..self.buf.len().min(self.pos+40)]) + String::from_utf8_lossy( + &self.buf[self.pos.saturating_sub(40)..self.buf.len().min(self.pos + 40)], + ) } #[inline] @@ -352,18 +356,21 @@ impl<'a> Lexer<'a> { } #[inline] fn is_whitespace(&self, pos: usize) -> bool { - self.buf.get(pos).map(|&b| is_whitespace(b)).unwrap_or(false) + self.buf + .get(pos) + .map(|&b| is_whitespace(b)) + .unwrap_or(false) } #[inline] fn is_delimiter(&self, pos: usize) -> bool { - self.buf.get(pos).map(|b| b"()<>[]{}/%".contains(b)).unwrap_or(false) + self.buf + .get(pos) + .map(|b| b"()<>[]{}/%".contains(b)) + .unwrap_or(false) } - } - - /// A slice from some original string - a lexeme. #[derive(Copy, Clone, Debug)] pub struct Substr<'a> { @@ -372,7 +379,10 @@ pub struct Substr<'a> { } impl<'a> Substr<'a> { pub fn new + ?Sized>(data: &'a T, file_offset: usize) -> Self { - Substr { slice: data.as_ref(), file_offset } + Substr { + slice: data.as_ref(), + file_offset, + } } // to: &S -> U. Possibly expensive conversion. // as: &S -> &U. Cheap borrow conversion @@ -389,9 +399,13 @@ impl<'a> Substr<'a> { self.slice.to_vec() } pub fn to(&self) -> Result - where T: FromStr, T::Err: std::error::Error + Send + Sync + 'static + where + T: FromStr, + T::Err: std::error::Error + Send + Sync + 'static, { - std::str::from_utf8(self.slice)?.parse::().map_err(|e| PdfError::Parse { source: e.into() }) + std::str::from_utf8(self.slice)? + .parse::() + .map_err(|e| PdfError::Parse { source: e.into() }) } pub fn is_integer(&self) -> bool { if self.slice.len() == 0 { @@ -424,7 +438,7 @@ impl<'a> Substr<'a> { if !is_int(&slice[..i]) { return None; } - slice = &slice[i+1..]; + slice = &slice[i + 1..]; } if let Some(len) = slice.iter().position(|&b| !b.is_ascii_digit()) { if len == 0 { @@ -433,7 +447,7 @@ impl<'a> Substr<'a> { let end = self.slice.len() - slice.len() + len; Some(Substr { file_offset: self.file_offset, - slice: &self.slice[..end] + slice: &self.slice[..end], }) } else { Some(*self) @@ -459,7 +473,7 @@ impl<'a> Substr<'a> { } pub fn file_range(&self) -> Range { - self.file_offset .. self.file_offset + self.slice.len() + self.file_offset..self.file_offset + self.slice.len() } } @@ -491,6 +505,7 @@ mod tests { use std::fs; use std::fs::File; use std::io::{BufWriter, Write}; + use std::u32::MAX; #[test] fn test_boundary_rev() { @@ -522,14 +537,19 @@ mod tests { fn test_lexed() { let file_data = fs::read("/home/kschuettler/Dokumente/TestFiles/18 - EVIDIS - Corrosao Irritacao ocular aguda.pdf").expect("File not found!"); println!("{}", file_data.len()); - let mut lexer = Lexer::new(&*file_data); + let mut lexer = Lexer::new(&file_data[0..]); let file = File::create("/tmp/pdf.txt").unwrap(); let mut writer = BufWriter::new(file); let mut depth = false; let mut stream = false; - let mut dict = 0; + let mut dict = 0u32; + let lex_count = MAX; + let mut lex_count_left = lex_count; while let Ok(s) = lexer.next() { + if lex_count_left == 0 { + break; + } if stream && s.to_string().as_str() == "endstream" { stream = false; writer @@ -539,6 +559,7 @@ mod tests { } else if stream { continue; } + lex_count_left -= 1; match s.to_string().as_str() { "obj" => depth = true, diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 7a24072..fa58a0c 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2767,7 +2767,9 @@ dependencies = [ name = "pdf-forge" version = "0.1.0" dependencies = [ + "lazy_static", "pdf", + "regex", "serde", "serde_json", "tauri", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 2aaa1d2..5207570 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -26,4 +26,6 @@ pdf = { path = "../src-pdfrs/pdf", features = ["cache"] } tauri-plugin-fs = "2" tauri-plugin-dialog = "2" uuid = { version = "1.12.0", features = ["v4"] } +regex = "1.10.3" +lazy_static = "1.4.0" diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png new file mode 100644 index 0000000..6be5e50 Binary files /dev/null and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000..e81bece Binary files /dev/null and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png new file mode 100644 index 0000000..a437dd5 Binary files /dev/null and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000..0ca4f27 Binary files /dev/null and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000..b81f820 Binary files /dev/null and b/src-tauri/icons/Square142x142Logo.png differ diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000..624c7bf Binary files /dev/null and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000..c021d2b Binary files /dev/null and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000..6219700 Binary files /dev/null and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000..f9bc048 Binary files /dev/null and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000..d5fbfb2 Binary files /dev/null and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000..63440d7 Binary files /dev/null and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000..f3f705a Binary files /dev/null and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000..4556388 Binary files /dev/null and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns new file mode 100644 index 0000000..12a5bce Binary files /dev/null and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 0000000..b3636e4 Binary files /dev/null and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png new file mode 100644 index 0000000..e1cd261 Binary files /dev/null and b/src-tauri/icons/icon.png differ diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 4fc8a04..6a1c26e 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,15 +1,18 @@ +#[cfg(test)] +mod tests; + extern crate pdf; use crate::pdf::object::Resolve; -use pdf::content::Op; +use lazy_static::lazy_static; use pdf::file::{File, FileOptions, NoLog, ObjectCache, StreamCache}; -use pdf::object::{InfoDict, Object, ObjectWrite, PlainRef}; +use pdf::object::{Object, ObjectWrite, PlainRef, Stream}; use pdf::primitive::Primitive; use pdf::xref::XRef; +use regex::Regex; use serde::{Deserialize, Serialize}; use std::collections::{HashMap, VecDeque}; -use std::fmt::format; use std::ops::DerefMut; use std::path::Path; use std::sync::{Mutex, MutexGuard}; @@ -48,7 +51,6 @@ pub struct PdfFile { pub pages: Vec, } - #[derive(Serialize, Debug, Clone)] pub struct PrimitiveModel { pub key: String, @@ -56,25 +58,25 @@ pub struct PrimitiveModel { pub sub_type: String, pub value: String, pub children: Vec, - pub detail_path: Vec, + pub trace: Vec, } #[derive(Serialize, Debug, Clone)] -pub struct DetailPathStep { +pub struct PathTrace { pub key: String, pub last_jump: String, } -impl DetailPathStep { - fn new(key: String, last_jump: String) -> DetailPathStep { - DetailPathStep { key, last_jump } +impl PathTrace { + fn new(key: String, last_jump: String) -> PathTrace { + PathTrace { key, last_jump } } } - #[derive(Serialize, Debug, Clone)] pub struct PageModel { key: String, - id: u64, + obj_num: u64, + page_num: u64, } #[derive(Deserialize, Serialize, Debug, Clone)] pub struct TreeViewNode { @@ -83,14 +85,14 @@ pub struct TreeViewNode { } impl TreeViewNode { - fn step(&self) -> Step { + fn step(&self) -> Result { Step::parse_step(&self.key) } } #[derive(Deserialize, Serialize, Debug, Clone)] pub struct ContentsModel { - parts: Vec> + parts: Vec>, } #[tauri::command] @@ -141,22 +143,30 @@ fn upload(path: &str, session: State>) -> Result } fn to_pdf_file(path: &str, file: &CosFile) -> Result { - fn parse_title_from_path(path: &str) -> Option { - Path::new(path).file_name() + Path::new(path) + .file_name() .and_then(|f| f.to_str().map(|s| s.to_string())) } let file_name = if let Some(ref info) = file.trailer.info_dict { - info.title.as_ref().map(|p| p.to_string_lossy()) - .unwrap_or( parse_title_from_path(path) - .unwrap_or_else(|| "Not found".to_string())) + info.title + .as_ref() + .map(|p| p.to_string_lossy()) + .unwrap_or(parse_title_from_path(path).unwrap_or_else(|| "Not found".to_string())) } else { "Not found".to_string() }; - - let pages = file.pages().enumerate().map(|(i, page_ref)| PageModel { key: format!("Page {}", i + 1), id: page_ref.unwrap().get_ref().get_inner().id }).collect(); + let pages = file + .pages() + .enumerate() + .map(|(i, page_ref)| PageModel { + key: format!("Page {}", i + 1), + obj_num: page_ref.unwrap().get_ref().get_inner().id, + page_num: (i + 1) as u64, + }) + .collect(); let pdf_file = PdfFile { id: Uuid::new_v4().to_string(), @@ -170,13 +180,17 @@ fn to_pdf_file(path: &str, file: &CosFile) -> Result { } #[tauri::command] -fn get_contents(id: &str, path: &str, session: State>) -> Result { +fn get_contents( + id: &str, + path: &str, + session: State>, +) -> Result { let session_guard = session .lock() .map_err(|_| "Failed to lock the session mutex.".to_string())?; - let file = get_file_from_state(path, &session_guard)?; + let file = get_file_from_state(id, &session_guard)?; - let (_, page_prim, _) = get_prim_by_path_with_file(id, &file.cos_file)?; + let (_, page_prim, _) = get_prim_by_path_with_file(path, &file.cos_file)?; let resolver = file.cos_file.resolver(); let page = t!(pdf::object::Page::from_primitive(page_prim, &resolver)); @@ -187,12 +201,40 @@ fn get_contents(id: &str, path: &str, session: State>) -> Result< let ops = t!(pdf::content::parse_ops(&data, &resolver)); let part = t!(pdf::content::display_ops(&ops)); parts.push(part); - }; - return Ok(ContentsModel {parts}); + } + return Ok(ContentsModel { parts }); } Err(String::from("Error occurred")) } +#[tauri::command] +fn get_stream_data(id: &str, path: &str, session: State>) -> Result { + let session_guard = session + .lock() + .map_err(|_| "Failed to lock the session mutex.".to_string())?; + let file = get_file_from_state(id, &session_guard)?; + get_stream_data_by_path_with_file(path, &file.cos_file) +} + +fn get_stream_data_by_path_with_file(path: &str, file: &CosFile) -> Result { + let mut steps = Step::parse(path); + if steps + .pop_back() + .filter(|last| *last == Step::Data) + .is_none() + { + return Err(format!("Path {} does not end with Data", path)); + } + let (_, prim, _) = get_prim_by_steps_with_file(steps, file)?; + + let Primitive::Stream(stream) = prim else { + return Err(format!("Path {} does not point to a stream", path)); + }; + let resolver = file.resolver(); + let data = t!(t!(Stream::::from_stream(stream, &resolver)).data(&resolver)); + Ok(String::from_utf8_lossy(&data).into_owned()) +} + #[tauri::command] fn get_prim_by_path( id: &str, @@ -206,44 +248,60 @@ fn get_prim_by_path( get_prim_model_by_path_with_file(path, &file.cos_file) } + fn get_prim_model_by_path_with_file(path: &str, file: &CosFile) -> Result { - let (key, prim, detail_path) = get_prim_by_path_with_file(path, file)?; + let (step, prim, detail_path) = get_prim_by_path_with_file(path, file)?; Ok(PrimitiveModel::from_primitive_with_children( - key, + step.get_key(), &prim, - detail_path + detail_path, )) } -fn get_prim_by_path_with_file(path: &str, file: &CosFile) -> Result<(String, Primitive, Vec), String> { - let mut steps = Step::parse(path); - if steps.len() == 0 { - return Err(String::from(format!("{} is not a valid path!", path))); - } - let mut step = steps.pop_front().unwrap(); - let mut parent = match step { - Step::Number(obj_num) => resolve_xref(obj_num, file)?, - Step::Trailer => retrieve_trailer(file), - _ => return Err(String::from(format!("{} is not a valid path!", path))), - }; +fn get_prim_by_path_with_file( + path: &str, + file: &CosFile, +) -> Result<(Step, Primitive, Vec), String> { + get_prim_by_steps_with_file(Step::parse(path), file) +} - let mut detail_path = vec![DetailPathStep::new(step.get_key(), step.get_key())]; - let mut last_jump = step.get_key(); +fn get_prim_by_steps_with_file( + mut steps: VecDeque, + file: &CosFile, +) -> Result<(Step, Primitive, Vec), String> { + if steps.len() == 0 { + return Err(String::from(format!("{:?} is not a valid path!", steps))); + } + let step = steps.pop_front().unwrap(); + let (mut parent, trace) = resolve_parent(step.clone(), file)?; + + let mut last_jump = trace.last_jump.clone(); + let mut trace = vec![trace]; let mut current_prim = &parent; while !steps.is_empty() { - step = steps.pop_front().unwrap(); + let step = steps.pop_front().unwrap(); current_prim = resolve_step(¤t_prim, &step)?; if let Primitive::Reference(xref) = current_prim { last_jump = xref.id.to_string(); - parent = resolve_xref(xref.id, file)?; + parent = resolve_pref(xref.clone(), file)?; current_prim = &parent; } - detail_path.push(DetailPathStep::new(step.get_key(), last_jump.clone())); + trace.push(PathTrace::new(step.get_key(), last_jump.clone())); } - Ok((step.get_key(), current_prim.clone(), detail_path)) + Ok((step, current_prim.clone(), trace)) +} + +fn resolve_parent(step: Step, file: &CosFile) -> Result<(Primitive, PathTrace), String> { + let parent = match step { + Step::Number(obj_num) => resolve_xref(obj_num, file)?, + Step::Trailer => retrieve_trailer(file), + Step::Page(page_num) => retrieve_page(page_num, file)?, + _ => return Err(String::from(format!("{:?} is not a valid path!", step))), + }; + Ok((parent, PathTrace::new(step.get_key(), step.get_key()))) } #[tauri::command] @@ -264,15 +322,13 @@ fn get_prim_tree_by_path_with_file( node: TreeViewNode, file: &CosFile, ) -> Result { - let step = node.step(); - let parent = match step { - Step::Number(obj_num) => resolve_xref(obj_num, file)?, - Step::Trailer => retrieve_trailer(file), - _ => return Err(String::from(format!("{:?} is not a valid path!", node))), - }; - let path = vec![DetailPathStep::new(step.get_key(), step.get_key())]; + let step = node.step()?; + let (mut parent, trace) = resolve_parent(step.clone(), file)?; - let mut parent_model = PrimitiveModel::from_primitive_with_children(step.get_key(), &parent, path); + let path = vec![trace]; + + let mut parent_model = + PrimitiveModel::from_primitive_with_children(step.get_key(), &parent, path); for child in node.children.iter() { expand(child, &mut parent_model, &parent, file)?; } @@ -286,17 +342,20 @@ fn expand( parent: &Primitive, file: &CosFile, ) -> Result<(), String> { - let step = node.step(); + let step = node.step()?; let prim = resolve_step(parent, &step)?; if let Primitive::Reference(x_ref) = prim { let jump = resolve_xref(x_ref.id, file)?; // parent_model.ptype = format!("{}-Reference", jump.get_debug_name()); let mut to_expand = parent_model.get_child(step.get_key()).unwrap(); - to_expand.add_children(&jump, append_path_with_jump(step.get_key(), x_ref.id.to_string(), &to_expand.detail_path)); + to_expand.add_children( + &jump, + append_path_with_jump(step.get_key(), x_ref.id.to_string(), &to_expand.trace), + ); expand_children(node, file, &jump, &mut to_expand)?; } else { let mut to_expand = parent_model.get_child(step.get_key()).unwrap(); - to_expand.add_children(prim, append_path(step.get_key(), &to_expand.detail_path)); + to_expand.add_children(prim, append_path(step.get_key(), &to_expand.trace)); expand_children(node, file, prim, &mut to_expand)?; } Ok(()) @@ -371,53 +430,67 @@ fn retrieve_trailer(file: &CosFile) -> Primitive { file.trailer.to_primitive(&mut updater).unwrap() } -#[derive(Debug)] +fn retrieve_page(page_num: u32, file: &CosFile) -> Result { + let page_rc = t!(file.get_page(page_num - 1)); + resolve_pref(page_rc.get_ref().get_inner(), file) +} +#[derive(Debug, PartialEq, Clone)] pub enum Step { String(String), + Page(u32), Number(u64), Trailer, Data, } impl Step { - fn parse_step(path: &str) -> Step { - match &path.parse::().ok() { + fn parse_step(path: &str) -> Result { + lazy_static! { + static ref PAGE_RE: Regex = Regex::new(r"^Page(\d+)$").unwrap(); + } + if path.len() == 0 { + return Err(String::from("Path is empty")); + } + + Ok(match &path.parse::().ok() { Some(i) => Step::Number(*i), None => match &path[..] { "Data" => Step::Data, + "Trailer" => Step::Trailer, "/" => Step::Trailer, - _ => Step::String(path.to_string().clone()), + _ => { + if let Some(caps) = PAGE_RE.captures(path) { + Step::Page( + caps[1] + .parse::() + .map_err(|_| format!("Invalid page number in {}", path))?, + ) + } else { + Step::String(path.to_string()) + } + } }, - } + }) } fn parse(path: &str) -> VecDeque { let mut steps = VecDeque::new(); - if path.starts_with("/") { steps.push_back(Step::Trailer); } let split_path = path.split("/").collect::>(); - for path_component in split_path { - if path_component.len() == 0 { - continue; - } - let step = match &path_component.parse::().ok() { - Some(i) => Step::Number(*i), - None => match path_component { - "Data" => Step::Data, - _ => Step::String(path_component.to_string().clone()), - }, - }; - steps.push_back(step); - } - steps + split_path + .iter() + .filter_map(|s| Step::parse_step(s).ok()) + .collect::>() } + fn get_key(&self) -> String { match self { Step::String(s) => s.clone(), Step::Number(i) => i.to_string(), - Step::Trailer => "/".to_string(), + Step::Trailer => "Trailer".to_string(), + Step::Page(n) => format!("Page{}", n), Step::Data => "Data".into(), } } @@ -425,6 +498,10 @@ impl Step { fn resolve_xref(id: u64, file: &CosFile) -> Result { let plain_ref = PlainRef { id, gen: 0 }; + resolve_pref(plain_ref, file) +} + +fn resolve_pref(plain_ref: PlainRef, file: &CosFile) -> Result { file.resolver() .resolve(plain_ref) .map_err(|e| e.to_string()) @@ -440,31 +517,30 @@ fn get_file_from_state<'a>( .ok_or_else(|| format!("File with id {} does not exist!", id)) } -fn append_path_with_jump(key: String, last_jump: String, path: &Vec) -> Vec { +fn append_path_with_jump(key: String, last_jump: String, path: &Vec) -> Vec { let mut new_path = path.clone(); - new_path.push(DetailPathStep::new(key, last_jump)); + new_path.push(PathTrace::new(key, last_jump)); new_path } -fn append_path(key: String, path: &Vec) -> Vec { +fn append_path(key: String, path: &Vec) -> Vec { let mut new_path = path.clone(); let last_jump = new_path.last().unwrap().last_jump.clone(); - new_path.push(DetailPathStep::new(key, last_jump)); + new_path.push(PathTrace::new(key, last_jump)); new_path } - impl PrimitiveModel { - fn from_primitive(key: String, primitive: &Primitive, path: Vec) -> PrimitiveModel { + fn from_primitive(key: String, primitive: &Primitive, path: Vec) -> PrimitiveModel { let value: String = match primitive { Primitive::Null => "Null".to_string(), Primitive::Integer(i) => i.to_string(), Primitive::Number(f) => f.to_string(), Primitive::Boolean(b) => b.to_string(), - Primitive::String(s) => s.to_string().unwrap_or(String::new()), + Primitive::String(s) => s.to_string_lossy(), Primitive::Stream(_) => "-".to_string(), Primitive::Dictionary(_) => "-".to_string(), - Primitive::Array(arr) =>PrimitiveModel::format_arr_content(arr), + Primitive::Array(arr) => PrimitiveModel::format_arr_content(arr), Primitive::Reference(pref) => { format!("Obj Number: {} Gen Number: {}", pref.id, pref.gen) } @@ -476,10 +552,10 @@ impl PrimitiveModel { .get("Type") .and_then(|value| match value { Primitive::Name(name) => Some(name.clone().as_str().to_string()), - _ => None + _ => None, }) .unwrap_or(String::from("-")), - _ => String::from("-") + _ => String::from("-"), }; PrimitiveModel { key: key, @@ -487,7 +563,7 @@ impl PrimitiveModel { sub_type: sub_type, value: value, children: Vec::new(), - detail_path: path, + trace: path, } } @@ -519,16 +595,24 @@ impl PrimitiveModel { result } - fn from_primitive_with_children(key: String, primitive: &Primitive, path: Vec) -> PrimitiveModel { + fn from_primitive_with_children( + key: String, + primitive: &Primitive, + path: Vec, + ) -> PrimitiveModel { let mut model = PrimitiveModel::from_primitive(key, primitive, path.clone()); model.add_children(primitive, path); model } - fn add_children(&mut self, primitive: &Primitive, path: Vec) { + fn add_children(&mut self, primitive: &Primitive, path: Vec) { match primitive { Primitive::Dictionary(dict) => dict.iter().for_each(|(name, value)| { - self.add_child(name.clone().as_str().to_string(), value, append_path(name.clone().as_str().to_string(), &path)); + self.add_child( + name.clone().as_str().to_string(), + value, + append_path(name.clone().as_str().to_string(), &path), + ); }), Primitive::Array(arr) => arr.iter().enumerate().for_each(|(i, obj)| { self.add_child(i.to_string(), obj, append_path(i.to_string(), &path)); @@ -540,17 +624,26 @@ impl PrimitiveModel { sub_type: "-".to_string(), value: "".to_string(), children: vec![], - detail_path: append_path("Data".to_string(), &path), + trace: append_path("Data".to_string(), &path), }); stream.info.iter().for_each(|(name, value)| { - self.add_child(name.clone().as_str().to_string(), value, append_path(name.clone().as_str().to_string(), &path)); + self.add_child( + name.clone().as_str().to_string(), + value, + append_path(name.clone().as_str().to_string(), &path), + ); }) } _ => (), }; } - fn add_child(&mut self, key: String, child: &Primitive, path: Vec) -> &PrimitiveModel { + fn add_child( + &mut self, + key: String, + child: &Primitive, + path: Vec, + ) -> &PrimitiveModel { let child_model = Self::from_primitive(key, child, path); self.children.push(child_model); &self.children[self.children.len() - 1] @@ -561,7 +654,7 @@ impl PrimitiveModel { } } #[tauri::command] -fn get_xref_table(id: &str, session: State>) -> Result { +fn get_xref_table(id: &str, session: State>) -> Result { let session_guard = session .lock() .map_err(|_| "Failed to lock the session mutex.".to_string())?; @@ -676,9 +769,9 @@ pub fn run() { get_prim_by_path, get_prim_tree_by_path, get_xref_table, - get_contents + get_contents, + get_stream_data ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } - diff --git a/src-tauri/src/tests.rs b/src-tauri/src/tests.rs index b2f23c2..2dfde76 100644 --- a/src-tauri/src/tests.rs +++ b/src-tauri/src/tests.rs @@ -4,7 +4,9 @@ extern crate pdf; mod tests { use crate::{ - get_prim_by_path_with_file, get_prim_model_by_path_with_file, get_prim_tree_by_path_with_file, get_xref_table_model_with_file, to_pdf_file, DetailPathStep, PrimitiveModel, TreeViewNode + get_prim_by_path_with_file, get_prim_model_by_path_with_file, + get_prim_tree_by_path_with_file, get_stream_data_by_path_with_file, + get_xref_table_model_with_file, to_pdf_file, PathTrace, PrimitiveModel, TreeViewNode, }; use pdf::content::{display_ops, serialize_ops, Op}; @@ -101,7 +103,7 @@ mod tests { fn print_node(node: PrimitiveModel, depth: usize) { let spaces = " ".repeat(depth); - println!("{:?}", node.detail_path); + println!("{:?}", node.trace); println!("{}{} | {} | {}", spaces, node.key, node.ptype, node.value); for child in node.children { print_node(child, depth + 1); @@ -113,14 +115,17 @@ mod tests { FileOptions::cached().open(FILE_PATH).unwrap(), "Loading file" ); - let mut file2 = timed!( - FileOptions::uncached().storage(), - "Loading storage" + let mut file2 = timed!(FileOptions::uncached().storage(), "Loading storage"); + + let trail = timed!( + file.trailer.to_primitive(&mut file2).unwrap(), + "writing trailer" + ); + let trail_model = PrimitiveModel::from_primitive_with_children( + "Trailer".to_string(), + &trail, + vec![PathTrace::new("/".to_string(), "/".to_string())], ); - - - let trail = timed!(file.trailer.to_primitive(&mut file2).unwrap(), "writing trailer"); - let trail_model = PrimitiveModel::from_primitive_with_children("Trailer".to_string(), &trail, vec![DetailPathStep::new("/".to_string(), "/".to_string())]); print_node(trail_model, 5); println!("{:?}", file.trailer.info_dict); } @@ -139,7 +144,6 @@ mod tests { } #[test] fn test_read_contents() { - let file = timed!( FileOptions::cached().open(FILE_PATH).unwrap(), "Loading file" @@ -148,7 +152,10 @@ mod tests { let (_, page2_prim, _) = get_prim_by_path_with_file("1", &file).unwrap(); let resolver = file.resolver(); let page2 = Page::from_primitive(page2_prim, &resolver).unwrap(); - let mut ops: Vec = timed!(page2.contents.unwrap().operations(&resolver).unwrap(), "parse ops"); + let mut ops: Vec = timed!( + page2.contents.unwrap().operations(&resolver).unwrap(), + "parse ops" + ); let serialized = timed!(serialize_ops(&mut ops).unwrap(), "serializing"); let display = timed!(display_ops(&mut ops).unwrap(), "displaying"); println!("Serialized -----------------------------------------------------------------"); @@ -157,6 +164,22 @@ mod tests { for (line, s) in display.iter().enumerate() { println!("{}: {}", line, s); } - } -} \ No newline at end of file + #[test] + fn test_read_stream() { + let file = timed!( + FileOptions::cached().open(FILE_PATH).unwrap(), + "Loading file" + ); + let prim = timed!( + get_prim_model_by_path_with_file("1/Contents/1", &file).unwrap(), + "get prim" + ); + print_node(prim, 3); + let content1 = timed!( + get_stream_data_by_path_with_file("1/Contents/1/Data", &file).unwrap(), + "get content 1" + ); + println!("{}", content1); + } +} diff --git a/src/app.css b/src/app.css index 09b5d55..76c3712 100644 --- a/src/app.css +++ b/src/app.css @@ -19,14 +19,14 @@ body { color: var(--font-color); border-color: var(--secondary-color) } -::before, ::after { + +::before, +::after { border-color: var(--secondary-color); } .full-container { + position: relative; height: 100%; width: 100%; -} - - - +} \ No newline at end of file diff --git a/src/components/App.svelte b/src/components/App.svelte index 932095f..598adec 100644 --- a/src/components/App.svelte +++ b/src/components/App.svelte @@ -1,8 +1,8 @@ - -
+ + +
- + - - {#if (fState)} - + + {#if fState} + {:else} {/if} @@ -116,10 +140,9 @@
-
+
- - diff --git a/src/components/FileView.svelte b/src/components/FileView.svelte index dd56467..ee8b5b3 100644 --- a/src/components/FileView.svelte +++ b/src/components/FileView.svelte @@ -1,23 +1,34 @@ - - - - - +
+
+ + + + + + + + + + - - + + +
+ +
+ {#if fState.prim?.isPage()} + +
+ +
+
+ {/if}
- - - - -
- +
+ {#if xrefTableShowing} +
+
-
+ {/if} +
- - - - \ No newline at end of file + .xref-modal-container { + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 0; + overflow: visible; + } + + .xref-modal { + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 281px; + background: var(--background-color); + box-shadow: -2px 0 5px rgba(0, 0, 0, 0.1); + z-index: 1000; + overflow-y: auto; + transform: translateX(100%); + transition: transform 0.2s ease-in-out; + } + + .xref-modal.visible { + transform: translateX(0); + } + diff --git a/src/components/Footer.svelte b/src/components/Footer.svelte index 2074682..51f0f56 100644 --- a/src/components/Footer.svelte +++ b/src/components/Footer.svelte @@ -1,15 +1,18 @@
-
+
{#if elements} {#each elements as path} - {/each} {/if} @@ -70,5 +86,4 @@
diff --git a/src/components/PageList.svelte b/src/components/PageList.svelte index 627b277..eabf881 100644 --- a/src/components/PageList.svelte +++ b/src/components/PageList.svelte @@ -3,13 +3,13 @@ import PrimitiveIcon from "./PrimitiveIcon.svelte"; import type PageModel from "../models/PageModel"; - let {fState}: { fState: FileViewState } = $props(); + let { fState }: { fState: FileViewState } = $props(); let h: number = $state(100); let selected: PageModel | undefined = $state(undefined); function handlePageSelect(page: PageModel) { - selected = page - fState.selectPath([page.id]); + selected = page; + fState.selectPath(["Page" + page.page_num]); } @@ -18,40 +18,47 @@
- - - - + + + +
PageRef
PageRef
-
+
- {#each fState.file.pages as page} - handlePageSelect(page)}> - - - - {/each} + {#each fState.file.pages as page} + handlePageSelect(page)} + > + + + + {/each}
-
- -

- {page.key} -

-
-
{page.id}
+
+ +

+ {page.key} +

+
+
{page.id}
+ \ No newline at end of file + diff --git a/src/components/PrimitiveView.svelte b/src/components/PrimitiveView.svelte index e5976b8..27d884a 100644 --- a/src/components/PrimitiveView.svelte +++ b/src/components/PrimitiveView.svelte @@ -10,6 +10,7 @@ let selected: Primitive | undefined = $state(undefined); let prim = $derived(fState.prim); let showContents = $state(false); + function handlePrimSelect(prim: Primitive) { if (prim.isContainer()) { if (!prim) { @@ -30,8 +31,10 @@ - - + + @@ -60,21 +63,6 @@ {/each}
KeyTypeKeyType Value
-

- Dict Type: {prim.sub_type} -

- {#if prim.isPage()} - - {#if showContents} - - {/if} - {/if}
diff --git a/src/components/TreeNode.svelte b/src/components/TreeNode.svelte index 62590fa..6819ba0 100644 --- a/src/components/TreeNode.svelte +++ b/src/components/TreeNode.svelte @@ -1,13 +1,17 @@ + {#if prim}
    {#each prim.children as child}
  • -
    +
    {#if child.children.length > 0} - + {:else if child.isContainer()} - + {:else} {/if} -
    {#if child.children.length > 0} - + {/if}
  • {/each}
{/if} - \ No newline at end of file + diff --git a/src/components/TreeView.svelte b/src/components/TreeView.svelte index afffea4..3298669 100644 --- a/src/components/TreeView.svelte +++ b/src/components/TreeView.svelte @@ -1,39 +1,40 @@ +
    {#if prim}
  • - + {"Trailer "}
    - +
  • {/if}
+ getTrace
+ \ No newline at end of file + diff --git a/src/components/XRefTable.svelte b/src/components/XRefTable.svelte index 93e0dee..55e3b55 100644 --- a/src/components/XRefTable.svelte +++ b/src/components/XRefTable.svelte @@ -1,38 +1,45 @@ +
- - - - - - - fState.selectXref(undefined)}> - - - - - + + + + + + + fState.selectXref(undefined)} + > + + + + +
Obj NrGen NrTypeOffset
Trailer65535DictionaryEnd of file
Obj NrGen NrTypeOffset
Trailer65535DictionaryEnd of file
-
-
+
+
- - {#each entriesToDisplay as entry} - fState.selectXref(entry)}> - - - - - - {/each} + + {#each entriesToDisplay as entry} + fState.selectXref(entry)} + > + + + + + + {/each}
{entry.obj_num}{entry.gen_num}{entry.obj_type}{entry.offset}
{entry.obj_num}{entry.gen_num}{entry.obj_type}{entry.offset}
@@ -130,5 +156,15 @@ .scrollContainer { overflow-y: auto; } - - \ No newline at end of file + .xref-modal { + position: fixed; + right: 0; + top: 0; + bottom: 0; + width: 281px; + background: var(--background-color); + box-shadow: -2px 0 5px rgba(0, 0, 0, 0.1); + z-index: 1000; + overflow-y: auto; + } + diff --git a/src/models/FileViewState.svelte.ts b/src/models/FileViewState.svelte.ts index efbae32..3cacb26 100644 --- a/src/models/FileViewState.svelte.ts +++ b/src/models/FileViewState.svelte.ts @@ -1,14 +1,14 @@ import type PdfFile from "./PdfFile"; import type XRefEntry from "./XRefEntry"; import Primitive from "./Primitive.svelte"; -import {invoke} from "@tauri-apps/api/core"; +import { invoke } from "@tauri-apps/api/core"; import TreeViewNode from "./TreeViewNode.svelte"; import type XRefTable from "./XRefTable"; export default class FileViewState { - public path: string[] = $state(["/"]); - public treeRoot: TreeViewNode = $state(new TreeViewNode("/", [new TreeViewNode("Root", [])])); + public path: string[] = $state(["Trailer"]); + public treeRoot: TreeViewNode = $state(new TreeViewNode("Trailer", [new TreeViewNode("Root", [])])); public file: PdfFile; public prim: Primitive | undefined = $state(); public treeView: Primitive | undefined = $state(); @@ -27,8 +27,12 @@ export default class FileViewState { return this.prim?.getLastJump() } + getFirstJump(): string | number | undefined { + return this.prim?.getFirstJump() + } + public loadXrefEntries() { - invoke("get_xref_table", {id: this.file.id}) + invoke("get_xref_table", { id: this.file.id }) .then(result => { this.xref_entries = result.entries; }) @@ -36,7 +40,7 @@ export default class FileViewState { } public selectPath(newPath: string[]) { - invoke("get_prim_by_path", {id: this.file.id, path: this.mergePaths(newPath)}) + invoke("get_prim_by_path", { id: this.file.id, path: this.mergePaths(newPath) }) .then(result => { this.prim = new Primitive(result) this.path = newPath @@ -46,11 +50,11 @@ export default class FileViewState { public loadTreeView() { - invoke("get_prim_tree_by_path", {id: this.file.id, path: this.treeRoot}) + invoke("get_prim_tree_by_path", { id: this.file.id, path: this.treeRoot }) .then(result => { this.treeView = new Primitive(result); } - ).catch(err => console.error(err)) + ).catch(err => console.error(err)) } public getTreeRoot() { diff --git a/src/models/PageModel.ts b/src/models/PageModel.ts index 2c3f304..e5ad91c 100644 --- a/src/models/PageModel.ts +++ b/src/models/PageModel.ts @@ -1,5 +1,6 @@ export default interface PageModel { key: string, - id: number -} \ No newline at end of file + obj_num: number, + page_num: number, +} diff --git a/src/models/Primitive.svelte.ts b/src/models/Primitive.svelte.ts index 0385876..466df68 100644 --- a/src/models/Primitive.svelte.ts +++ b/src/models/Primitive.svelte.ts @@ -4,7 +4,7 @@ export default class Primitive { public sub_type: string; public value: string; public children: Primitive[]; - public detail_path: DetailPath[] = $state([]); + public trace: Trace[] = $state([]); constructor( p: Primitive @@ -17,9 +17,9 @@ export default class Primitive { for (let child of p.children) { this.children.push(new Primitive(child)); } - this.detail_path = []; - for (let path of p.detail_path) { - this.detail_path.push(path); + this.trace = []; + for (let path of p.trace) { + this.trace.push(path); } } @@ -27,18 +27,29 @@ export default class Primitive { return this.ptype === "Dictionary" || this.ptype === "Array" || this.ptype === "Reference" || this.ptype === "Stream"; } + public getTrace(): string[] { + return this.trace.map(path => path.key); + } + public getLastJump(): string | number { - let path = this.detail_path[this.detail_path.length - 1].last_jump; - if (path === "/") {return path}; + let path = this.trace[this.trace.length - 1].last_jump; + if (path === "/") { return path }; return +path; } public isPage(): boolean { - return this.sub_type === "Page"; + return this.trace[0].last_jump.startsWith("Page"); + } + + public getFirstJump(): string | number | undefined { + let path = this.trace[0].last_jump; + if (path === "Trailer") { return path }; + if (path.startsWith("Page")) { return path }; + return +path; } } -export interface DetailPath { - readonly key: string ; - readonly last_jump: string ; +export interface Trace { + readonly key: string; + readonly last_jump: string; } diff --git a/svelte.config.js b/svelte.config.js index c29abaa..03dd66d 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -3,7 +3,7 @@ // See: https://v2.tauri.app/start/frontend/sveltekit/ for more info import adapter from "@sveltejs/adapter-static"; import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; -import {sveltePreprocess} from "svelte-preprocess"; +import { sveltePreprocess } from "svelte-preprocess"; /** @type {import('@sveltejs/kit').Config} */ const config = { @@ -11,6 +11,9 @@ const config = { adapter: adapter(), }, preprocess: vitePreprocess(), + // compilerOptions: { + // runes: true + // } }; export default config; diff --git a/tsconfig.json b/tsconfig.json index 593dc19..06f1788 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,4 +16,4 @@ // // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes // from the referenced tsconfig.json - TypeScript does not merge them in -} +} \ No newline at end of file diff --git a/vite.config.js b/vite.config.ts similarity index 79% rename from vite.config.js rename to vite.config.ts index a2ede43..827426d 100644 --- a/vite.config.js +++ b/vite.config.ts @@ -1,12 +1,15 @@ -import {defineConfig} from "vite"; -import {sveltekit} from "@sveltejs/kit/vite"; - +import { defineConfig } from "vite"; +import { sveltekit } from "@sveltejs/kit/vite"; +// import monacoEditorPlugin from 'vite-plugin-monaco-editor'; // @ts-expect-error process is a nodejs global const host = process.env.TAURI_DEV_HOST; // https://vitejs.dev/config/ export default defineConfig(async () => ({ - plugins: [sveltekit()], + plugins: [ + sveltekit(), + // monacoEditorPlugin({}) + ], css: { postcss: './postcss.config.cjs', // Path to PostCSS config }, diff --git a/yarn.lock b/yarn.lock index 7e1bda2..60b6410 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,12 +4,12 @@ "@alloc/quick-lru@^5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== "@ampproject/remapping@^2.3.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -17,7 +17,7 @@ "@bufbuild/protobuf@^2.0.0": version "2.2.3" - resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-2.2.3.tgz#9cd136f6b687e63e9b517b3a54211ece942897ee" + resolved "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.3.tgz" integrity sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg== "@esbuild/aix-ppc64@0.24.2": @@ -102,7 +102,7 @@ "@esbuild/linux-x64@0.24.2": version "0.24.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz#8140c9b40da634d380b0b29c837a0b4267aff38f" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz" integrity sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q== "@esbuild/netbsd-arm64@0.24.2": @@ -147,14 +147,14 @@ "@floating-ui/core@^1.6.0": version "1.6.9" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.9.tgz#64d1da251433019dafa091de9b2886ff35ec14e6" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz" integrity sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw== dependencies: "@floating-ui/utils" "^0.2.9" "@floating-ui/dom@^1.6.11": version "1.6.13" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.13.tgz#a8a938532aea27a95121ec16e667a7cbe8c59e34" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz" integrity sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w== dependencies: "@floating-ui/core" "^1.6.0" @@ -162,17 +162,17 @@ "@floating-ui/utils@^0.2.9": version "0.2.9" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz" integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== "@geoffcox/svelte-splitter@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@geoffcox/svelte-splitter/-/svelte-splitter-1.0.1.tgz#07d05fa89d51b9269616463e322ee79148cdbc58" + resolved "https://registry.npmjs.org/@geoffcox/svelte-splitter/-/svelte-splitter-1.0.1.tgz" integrity sha512-iWDNDnuNhsB6tKMGqjXStRhytALlB+/KBQ82T4xSjDndQsrN0CKspdMiu21RUj0AQoDxv3yzAqgp3bwEnF5SCQ== "@isaacs/cliui@^8.0.2": version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" @@ -184,7 +184,7 @@ "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -193,30 +193,37 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15", "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@monaco-editor/loader@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.4.0.tgz#f08227057331ec890fa1e903912a5b711a2ad558" + integrity sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg== + dependencies: + state-local "^1.0.6" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -224,12 +231,12 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -237,22 +244,22 @@ "@pkgjs/parseargs@^0.11.0": version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@polka/url@^1.0.0-next.24": version "1.0.0-next.28" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz" integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== "@popperjs/core@^2.9.3": version "2.11.8" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@rollup/plugin-node-resolve@^15.2.3": version "15.3.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz#66008953c2524be786aa319d49e32f2128296a78" + resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz" integrity sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA== dependencies: "@rollup/pluginutils" "^5.0.1" @@ -263,7 +270,7 @@ "@rollup/pluginutils@^5.0.1": version "5.1.4" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz" integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ== dependencies: "@types/estree" "^1.0.0" @@ -342,12 +349,12 @@ "@rollup/rollup-linux-x64-gnu@4.31.0": version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz#c6b048f1e25f3fea5b4bd246232f4d07a159c5a0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz" integrity sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g== "@rollup/rollup-linux-x64-musl@4.31.0": version "4.31.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz#615273ac52d1a201f4de191cbd3389016a9d7d80" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz" integrity sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA== "@rollup/rollup-win32-arm64-msvc@4.31.0": @@ -367,12 +374,12 @@ "@sveltejs/adapter-static@^3.0.6": version "3.0.8" - resolved "https://registry.yarnpkg.com/@sveltejs/adapter-static/-/adapter-static-3.0.8.tgz#f23ee99a9678dbaec58b79d183bc3defbfe99f1a" + resolved "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.8.tgz" integrity sha512-YaDrquRpZwfcXbnlDsSrBQNCChVOT9MGuSg+dMAyfsAa1SmiAhrA5jUYUiIMC59G92kIbY/AaQOWcBdq+lh+zg== "@sveltejs/kit@^2.9.0": version "2.16.0" - resolved "https://registry.yarnpkg.com/@sveltejs/kit/-/kit-2.16.0.tgz#3961182fdb69eff96a912eb16c1359cf14d37840" + resolved "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.16.0.tgz" integrity sha512-S9i1ZWKqluzoaJ6riYnEdbe+xJluMTMkhABouBa66GaWcAyCjW/jAc0NdJQJ/DXyK1CnP5quBW25e99MNyvLxA== dependencies: "@types/cookie" "^0.6.0" @@ -389,14 +396,14 @@ "@sveltejs/vite-plugin-svelte-inspector@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz#2f99a4a593bb910d1492f6c00a042b521c07147e" + resolved "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz" integrity sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw== dependencies: debug "^4.3.7" "@sveltejs/vite-plugin-svelte@^5.0.0": version "5.0.3" - resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.0.3.tgz#50f425c677243e00fda0402c049f28b489c7ab81" + resolved "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.0.3.tgz" integrity sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw== dependencies: "@sveltejs/vite-plugin-svelte-inspector" "^4.0.1" @@ -408,7 +415,7 @@ "@tailwindcss/typography@^0.5.14": version "0.5.16" - resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.16.tgz#a926c8f44d5c439b2915e231cad80058850047c6" + resolved "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz" integrity sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA== dependencies: lodash.castarray "^4.4.0" @@ -418,7 +425,7 @@ "@tauri-apps/api@^2", "@tauri-apps/api@^2.0.0": version "2.2.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.2.0.tgz#daaff2515b1a4ff1e763cf84a414548b02b566c5" + resolved "https://registry.npmjs.org/@tauri-apps/api/-/api-2.2.0.tgz" integrity sha512-R8epOeZl1eJEl603aUMIGb4RXlhPjpgxbGVEaqY+0G5JG9vzV/clNlzTeqc+NLYXVqXcn8mb4c5b9pJIUDEyAg== "@tauri-apps/cli-darwin-arm64@2.2.5": @@ -448,12 +455,12 @@ "@tauri-apps/cli-linux-x64-gnu@2.2.5": version "2.2.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.2.5.tgz#29956ad3b40762c592ff54293928212f0a809572" + resolved "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.2.5.tgz" integrity sha512-eaGhTQLr3EKeksGsp2tK/Ndi7/oyo3P53Pye6kg0zqXiqu8LQjg1CgvDm1l+5oit04S60zR4AqlDFpoeEtDGgw== "@tauri-apps/cli-linux-x64-musl@2.2.5": version "2.2.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.5.tgz#a3c017496db78a8bca6734516d7d66f14313d940" + resolved "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.5.tgz" integrity sha512-NLAO/SymDxeGuOWWQZCpwoED1K1jaHUvW+u9ip+rTetnxFPLvf3zXthx4QVKfCZLdj2WLQz4cLjHyQdMDXAM+w== "@tauri-apps/cli-win32-arm64-msvc@2.2.5": @@ -473,7 +480,7 @@ "@tauri-apps/cli@^2": version "2.2.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-2.2.5.tgz#d146f02201c5ab580513db2030de33e9a2a666ce" + resolved "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.2.5.tgz" integrity sha512-PaefTQUCYYqvZWdH8EhXQkyJEjQwtoy/OHGoPcZx7Gk3D3K6AtGSxZ9OlHIz3Bu5LDGgVBk36vKtHW0WYsWnbw== optionalDependencies: "@tauri-apps/cli-darwin-arm64" "2.2.5" @@ -489,85 +496,85 @@ "@tauri-apps/plugin-dialog@~2": version "2.2.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/plugin-dialog/-/plugin-dialog-2.2.0.tgz#2f7b841a982820adbc9c182e0e95acd8d90aa6fc" + resolved "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.2.0.tgz" integrity sha512-6bLkYK68zyK31418AK5fNccCdVuRnNpbxquCl8IqgFByOgWFivbiIlvb79wpSXi0O+8k8RCSsIpOquebusRVSg== dependencies: "@tauri-apps/api" "^2.0.0" "@tauri-apps/plugin-fs@~2": version "2.2.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/plugin-fs/-/plugin-fs-2.2.0.tgz#3cf2968139a9cd9e4d12a7a7176c0b59e446b0a3" + resolved "https://registry.npmjs.org/@tauri-apps/plugin-fs/-/plugin-fs-2.2.0.tgz" integrity sha512-+08mApuONKI8/sCNEZ6AR8vf5vI9DXD4YfrQ9NQmhRxYKMLVhRW164vdW5BSLmMpuevftpQ2FVoL9EFkfG9Z+g== dependencies: "@tauri-apps/api" "^2.0.0" "@tauri-apps/plugin-opener@^2": version "2.2.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/plugin-opener/-/plugin-opener-2.2.5.tgz#928b917d28d3e8b5bafb90f5f91fb0ed20c27fd4" + resolved "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.2.5.tgz" integrity sha512-hHsJ9RPWpZvZEPVFaL+d25gABMUMOf/A6ESXnvf/ii9guTukj58WXsAE/SOysXRIhej7kseRCxnOnIMpSCdUsQ== dependencies: "@tauri-apps/api" "^2.0.0" "@types/cookie@^0.6.0": version "0.6.0" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz" integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== "@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.5", "@types/estree@^1.0.6": version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/resolve@1.20.2": version "1.20.2" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz" integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== "@yr/monotone-cubic-spline@^1.0.3": version "1.0.3" - resolved "https://registry.yarnpkg.com/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz#7272d89f8e4f6fb7a1600c28c378cc18d3b577b9" + resolved "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz" integrity sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA== acorn-typescript@^1.4.13: version "1.4.13" - resolved "https://registry.yarnpkg.com/acorn-typescript/-/acorn-typescript-1.4.13.tgz#5f851c8bdda0aa716ffdd5f6ac084df8acc6f5ea" + resolved "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz" integrity sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q== acorn@^8.12.1: version "8.14.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz" integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^4.0.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^6.1.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== any-promise@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -575,7 +582,7 @@ anymatch@~3.1.2: apexcharts@^3.54.1: version "3.54.1" - resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-3.54.1.tgz#9b78a6ee10e4225d5e04309c8e5b379e2c5c9da2" + resolved "https://registry.npmjs.org/apexcharts/-/apexcharts-3.54.1.tgz" integrity sha512-E4et0h/J1U3r3EwS/WlqJCQIbepKbp6wGUmaAwJOMjHUP4Ci0gxanLa7FR3okx6p9coi4st6J853/Cb1NP0vpA== dependencies: "@yr/monotone-cubic-spline" "^1.0.3" @@ -588,17 +595,17 @@ apexcharts@^3.54.1: arg@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== aria-query@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz" integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== autoprefixer@^10.4.20: version "10.4.20" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz" integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== dependencies: browserslist "^4.23.3" @@ -610,36 +617,36 @@ autoprefixer@^10.4.20: axobject-query@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz" integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== binary-extensions@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.3, braces@~3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" browserslist@^4.23.3: version "4.24.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz" integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: caniuse-lite "^1.0.30001688" @@ -649,22 +656,22 @@ browserslist@^4.23.3: buffer-builder@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/buffer-builder/-/buffer-builder-0.2.0.tgz#3322cd307d8296dab1f604618593b261a3fade8f" + resolved "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz" integrity sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg== camelcase-css@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688: version "1.0.30001695" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz#39dfedd8f94851132795fdf9b79d29659ad9c4d4" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz" integrity sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw== chokidar@^3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -679,46 +686,46 @@ chokidar@^3.6.0: chokidar@^4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== dependencies: readdirp "^4.0.1" clsx@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colorjs.io@^0.5.0: version "0.5.2" - resolved "https://registry.yarnpkg.com/colorjs.io/-/colorjs.io-0.5.2.tgz#63b20139b007591ebc3359932bef84628eb3fcef" + resolved "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz" integrity sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw== commander@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== cookie@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== cross-spawn@^7.0.0: version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -727,59 +734,59 @@ cross-spawn@^7.0.0: cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== debug@^4.3.7, debug@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" deepmerge@^4.2.2, deepmerge@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== devalue@^5.1.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/devalue/-/devalue-5.1.1.tgz#a71887ac0f354652851752654e4bd435a53891ae" + resolved "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz" integrity sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw== didyoumean@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== dlv@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.5.73: version "1.5.84" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz#8e334ca206bb293a20b16418bf454783365b0a95" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz" integrity sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== esbuild@^0.24.2: version "0.24.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz" integrity sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== optionalDependencies: "@esbuild/aix-ppc64" "0.24.2" @@ -810,36 +817,36 @@ esbuild@^0.24.2: escalade@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== esm-env-robust@0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/esm-env-robust/-/esm-env-robust-0.0.3.tgz#ef95644dde2f2bd750dec4366a43950b3dc3ed50" + resolved "https://registry.npmjs.org/esm-env-robust/-/esm-env-robust-0.0.3.tgz" integrity sha512-90Gnuw2DALOqlL1581VxP3GHPUNHX9U+fQ+8FNcTTFClhY5gEggAAnJ3q1b2Oq23knRsjv8YpNeMRPaMLUymOA== dependencies: esm-env "^1.0.0" esm-env@^1.0.0, esm-env@^1.2.1, esm-env@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/esm-env/-/esm-env-1.2.2.tgz#263c9455c55861f41618df31b20cb571fc20b75e" + resolved "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz" integrity sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA== esrap@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/esrap/-/esrap-1.4.3.tgz#456ed3c97cf0e6b58b952d351c7c78fe27116576" + resolved "https://registry.npmjs.org/esrap/-/esrap-1.4.3.tgz" integrity sha512-Xddc1RsoFJ4z9nR7W7BFaEPIp4UXoeQ0+077UdWLxbafMQFyU79sQJMk7kxNgRwQ9/aVgaKacCHC2pUACGwmYw== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" estree-walker@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== fast-glob@^3.3.2: version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -850,26 +857,26 @@ fast-glob@^3.3.2: fastq@^1.6.0: version "1.18.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz" integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== dependencies: reusify "^1.0.4" fdir@^6.2.0: version "6.4.3" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz" integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" flowbite-datepicker@^1.3.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/flowbite-datepicker/-/flowbite-datepicker-1.3.2.tgz#ad830d73f923344fb5614978f0d87e790cc69c4b" + resolved "https://registry.npmjs.org/flowbite-datepicker/-/flowbite-datepicker-1.3.2.tgz" integrity sha512-6Nfm0MCVX3mpaR7YSCjmEO2GO8CDt6CX8ZpQnGdeu03WUCWtEPQ/uy0PUiNtIJjJZWnX0Cm3H55MOhbD1g+E/g== dependencies: "@rollup/plugin-node-resolve" "^15.2.3" @@ -877,7 +884,7 @@ flowbite-datepicker@^1.3.0: flowbite-svelte-icons@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/flowbite-svelte-icons/-/flowbite-svelte-icons-2.0.2.tgz#6723046e131b4f43c9382a917109388154c42cf5" + resolved "https://registry.npmjs.org/flowbite-svelte-icons/-/flowbite-svelte-icons-2.0.2.tgz" integrity sha512-Vkmduy2867Rk8R7TziPirsWkixJnToFBEXRaN4ouJabOx62NQjiBbHFe+HTaMOQmdp4FNMI2Nhtk2I2CQ8r3RQ== dependencies: tailwind-merge "^2.5.4" @@ -885,7 +892,7 @@ flowbite-svelte-icons@^2.0.2: flowbite-svelte@^0.47.4: version "0.47.4" - resolved "https://registry.yarnpkg.com/flowbite-svelte/-/flowbite-svelte-0.47.4.tgz#87e54d7818fc97e7e826a95a16092199500eac49" + resolved "https://registry.npmjs.org/flowbite-svelte/-/flowbite-svelte-0.47.4.tgz" integrity sha512-8oiY/oeWA7fgkDF91MZKEBo5VmjL8El3wuqTDWAFO1j7p45BHIL6G1VGnnidgCEYlbADDQN9BIGCvyPq4J3g+w== dependencies: "@floating-ui/dom" "^1.6.11" @@ -895,7 +902,7 @@ flowbite-svelte@^0.47.4: flowbite@^2.0.0, flowbite@^2.5.2: version "2.5.2" - resolved "https://registry.yarnpkg.com/flowbite/-/flowbite-2.5.2.tgz#4a14b87ad3f2abd8bcd7b0fb52a6b06fd7a74685" + resolved "https://registry.npmjs.org/flowbite/-/flowbite-2.5.2.tgz" integrity sha512-kwFD3n8/YW4EG8GlY3Od9IoKND97kitO+/ejISHSqpn3vw2i5K/+ZI8Jm2V+KC4fGdnfi0XZ+TzYqQb4Q1LshA== dependencies: "@popperjs/core" "^2.9.3" @@ -904,7 +911,7 @@ flowbite@^2.0.0, flowbite@^2.5.2: foreground-child@^3.1.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz" integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" @@ -912,7 +919,7 @@ foreground-child@^3.1.0: fraction.js@^4.3.7: version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fsevents@~2.3.2, fsevents@~2.3.3: @@ -922,26 +929,26 @@ fsevents@~2.3.2, fsevents@~2.3.3: function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob@^10.3.10: version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" @@ -953,82 +960,82 @@ glob@^10.3.10: has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" immutable@^5.0.2: version "5.0.3" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.0.3.tgz#aa037e2313ea7b5d400cd9298fa14e404c933db1" + resolved "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz" integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw== import-meta-resolve@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" + resolved "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz" integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-core-module@^2.16.0: version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: hasown "^2.0.2" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-module@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-reference@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.3.tgz#9ef7bf9029c70a67b2152da4adf57c23d718910f" + resolved "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz" integrity sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw== dependencies: "@types/estree" "^1.0.6" isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== jackspeak@^3.1.2: version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" @@ -1037,64 +1044,64 @@ jackspeak@^3.1.2: jiti@^1.21.6: version "1.21.7" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.7.tgz#9dd81043424a3d28458b193d965f0d18a2300ba9" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz" integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== kleur@^4.1.5: version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== lilconfig@^3.0.0, lilconfig@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== locate-character@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-3.0.0.tgz#0305c5b8744f61028ef5d01f444009e00779f974" + resolved "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz" integrity sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA== lodash.castarray@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" + resolved "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz" integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== lodash.isplainobject@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lru-cache@^10.2.0: version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== magic-string@^0.30.11, magic-string@^0.30.15, magic-string@^0.30.5: version "0.30.17" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz" integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" merge2@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" @@ -1102,39 +1109,44 @@ micromatch@^4.0.8: mini-svg-data-uri@^1.4.3: version "1.4.4" - resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939" + resolved "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz" integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== minimatch@^9.0.4: version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== +monaco-editor@^0.52.2: + version "0.52.2" + resolved "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz" + integrity sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ== + mri@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== mrmime@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz" integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== mz@^2.7.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" @@ -1143,52 +1155,52 @@ mz@^2.7.0: nanoid@^3.3.8: version "3.3.8" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== node-releases@^2.0.19: version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== object-assign@^4.0.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-hash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== package-json-from-dist@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.11.1: version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" @@ -1196,37 +1208,37 @@ path-scurry@^1.11.1: paths@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/paths/-/paths-0.1.1.tgz#9ad909d7f769dd8acb3a1c033c5eef43123d3d17" + resolved "https://registry.npmjs.org/paths/-/paths-0.1.1.tgz" integrity sha512-MO2qBeKTXfH+qlZjo2+R5GmjCo/1r9CIWwtA7JUzafClhzWH9x/nDrJiaTXsWekNrHMlbSSI+Mc4654INuvbrQ== picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== picomatch@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== pify@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pirates@^4.0.1: version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== postcss-import@^15.1.0: version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: postcss-value-parser "^4.0.0" @@ -1235,14 +1247,14 @@ postcss-import@^15.1.0: postcss-js@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" postcss-load-config@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: lilconfig "^3.0.0" @@ -1250,14 +1262,14 @@ postcss-load-config@^4.0.2: postcss-nested@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz" integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== dependencies: postcss-selector-parser "^6.1.1" postcss-selector-parser@6.0.10: version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz" integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== dependencies: cssesc "^3.0.0" @@ -1265,7 +1277,7 @@ postcss-selector-parser@6.0.10: postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: version "6.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" @@ -1273,12 +1285,12 @@ postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.4.47, postcss@^8.4.49, postcss@^8.5.1: version "8.5.1" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz" integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== dependencies: nanoid "^3.3.8" @@ -1287,31 +1299,31 @@ postcss@^8.4.47, postcss@^8.4.49, postcss@^8.5.1: queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== read-cache@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: pify "^2.3.0" readdirp@^4.0.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.1.tgz#bd115327129672dc47f87408f05df9bd9ca3ef55" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz" integrity sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw== readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" resolve@^1.1.7, resolve@^1.22.1, resolve@^1.22.8: version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: is-core-module "^2.16.0" @@ -1320,12 +1332,12 @@ resolve@^1.1.7, resolve@^1.22.1, resolve@^1.22.8: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rollup@^4.23.0: version "4.31.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.31.0.tgz#b84af969a0292cb047dce2c0ec5413a9457597a4" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.31.0.tgz" integrity sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw== dependencies: "@types/estree" "1.0.6" @@ -1353,21 +1365,21 @@ rollup@^4.23.0: run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" rxjs@^7.4.0: version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" sade@^1.7.4, sade@^1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== dependencies: mri "^1.1.0" @@ -1444,7 +1456,7 @@ sass-embedded-linux-musl-riscv64@1.83.4: sass-embedded-linux-musl-x64@1.83.4: version "1.83.4" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.83.4.tgz#668b90b80bf35830c2f1ea2a47557d5e60842598" + resolved "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.83.4.tgz" integrity sha512-hB8+/PYhfEf2zTIcidO5Bpof9trK6WJjZ4T8g2MrxQh8REVtdPcgIkoxczRynqybf9+fbqbUwzXtiUao2GV+vQ== sass-embedded-linux-riscv64@1.83.4: @@ -1454,7 +1466,7 @@ sass-embedded-linux-riscv64@1.83.4: sass-embedded-linux-x64@1.83.4: version "1.83.4" - resolved "https://registry.yarnpkg.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.83.4.tgz#52e61bd582dfc56b8f638f2b9cfdb8a53db1e57e" + resolved "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.83.4.tgz" integrity sha512-NlnGdvCmTD5PK+LKXlK3sAuxOgbRIEoZfnHvxd157imCm/s2SYF/R28D0DAAjEViyI8DovIWghgbcqwuertXsA== sass-embedded-win32-arm64@1.83.4: @@ -1474,7 +1486,7 @@ sass-embedded-win32-x64@1.83.4: sass-embedded@^1.83.4: version "1.83.4" - resolved "https://registry.yarnpkg.com/sass-embedded/-/sass-embedded-1.83.4.tgz#9b05cdc22ae71a1b27b5996a39054ba59bebc04a" + resolved "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.83.4.tgz" integrity sha512-Hf2burRA/y5PGxsg6jB9UpoK/xZ6g/pgrkOcdl6j+rRg1Zj8XhGKZ1MTysZGtTPUUmiiErqzkP5+Kzp95yv9GQ== dependencies: "@bufbuild/protobuf" "^2.0.0" @@ -1509,29 +1521,29 @@ sass-embedded@^1.83.4: set-cookie-parser@^2.6.0: version "2.7.1" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz" integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== signal-exit@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sirv@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-3.0.0.tgz#f8d90fc528f65dff04cb597a88609d4e8a4361ce" + resolved "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz" integrity sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg== dependencies: "@polka/url" "^1.0.0-next.24" @@ -1540,12 +1552,17 @@ sirv@^3.0.0: source-map-js@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== +state-local@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" + integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w== + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -1554,7 +1571,7 @@ source-map-js@^1.2.1: string-width@^4.1.0: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -1563,7 +1580,7 @@ string-width@^4.1.0: string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -1572,28 +1589,28 @@ string-width@^5.0.1, string-width@^5.1.2: "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" sucrase@^3.35.0: version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: "@jridgewell/gen-mapping" "^0.3.2" @@ -1606,19 +1623,19 @@ sucrase@^3.35.0: supports-color@^8.1.1: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svelte-check@^4.0.0: version "4.1.4" - resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-4.1.4.tgz#59ec6f08d23647ec508ff01584ef6d191c77c9e1" + resolved "https://registry.npmjs.org/svelte-check/-/svelte-check-4.1.4.tgz" integrity sha512-v0j7yLbT29MezzaQJPEDwksybTE2Ups9rUxEXy92T06TiA0cbqcO8wAOwNUVkFW6B0hsYHA+oAX3BS8b/2oHtw== dependencies: "@jridgewell/trace-mapping" "^0.3.25" @@ -1629,24 +1646,24 @@ svelte-check@^4.0.0: svelte-preprocess@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-6.0.3.tgz#fdc1f9dc41b6f22bf8b1f059e9f21eaaae181eeb" + resolved "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-6.0.3.tgz" integrity sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA== svelte-split-pane@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/svelte-split-pane/-/svelte-split-pane-0.1.2.tgz#aae94c583fdcf80e3ceaefc31755f3c49886e6a8" + resolved "https://registry.npmjs.org/svelte-split-pane/-/svelte-split-pane-0.1.2.tgz" integrity sha512-JluEydC9v2DetyhlwCF3CdqAkET8XPHP7WeWbl4lVLOg55avDOhoS5U6BRhvWd104HOqhUcCSz+7Nveyjmzjeg== svelte-splitpanes@^8.0.9: version "8.0.9" - resolved "https://registry.yarnpkg.com/svelte-splitpanes/-/svelte-splitpanes-8.0.9.tgz#4103765febb58f847db8ef115e0e1b91462fc70b" + resolved "https://registry.npmjs.org/svelte-splitpanes/-/svelte-splitpanes-8.0.9.tgz" integrity sha512-L3oLXTC99M191FInTXJ/f/2i0welRql1QuVbPaU8iy6nvCR6X9VyjHCsCpLqKGWHwqkWo/AM9CQ1c0nzlb+MkA== dependencies: esm-env-robust "0.0.3" svelte@^5.0.0: version "5.19.0" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-5.19.0.tgz#bfe63f5fc794c5bbd2240435b9050fff09680833" + resolved "https://registry.npmjs.org/svelte/-/svelte-5.19.0.tgz" integrity sha512-qvd2GvvYnJxS/MteQKFSMyq8cQrAAut28QZ39ySv9k3ggmhw4Au4Rfcsqva74i0xMys//OhbhVCNfXPrDzL/Bg== dependencies: "@ampproject/remapping" "^2.3.0" @@ -1666,40 +1683,40 @@ svelte@^5.0.0: svg.draggable.js@^2.2.2: version "2.2.2" - resolved "https://registry.yarnpkg.com/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz#c514a2f1405efb6f0263e7958f5b68fce50603ba" + resolved "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz" integrity sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw== dependencies: svg.js "^2.0.1" svg.easing.js@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/svg.easing.js/-/svg.easing.js-2.0.0.tgz#8aa9946b0a8e27857a5c40a10eba4091e5691f12" + resolved "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz" integrity sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA== dependencies: svg.js ">=2.3.x" svg.filter.js@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/svg.filter.js/-/svg.filter.js-2.0.2.tgz#91008e151389dd9230779fcbe6e2c9a362d1c203" + resolved "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz" integrity sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw== dependencies: svg.js "^2.2.5" svg.js@>=2.3.x, svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5: version "2.7.1" - resolved "https://registry.yarnpkg.com/svg.js/-/svg.js-2.7.1.tgz#eb977ed4737001eab859949b4a398ee1bb79948d" + resolved "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz" integrity sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA== svg.pathmorphing.js@^0.1.3: version "0.1.3" - resolved "https://registry.yarnpkg.com/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz#c25718a1cc7c36e852ecabc380e758ac09bb2b65" + resolved "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz" integrity sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww== dependencies: svg.js "^2.4.0" svg.resize.js@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/svg.resize.js/-/svg.resize.js-1.4.3.tgz#885abd248e0cd205b36b973c4b578b9a36f23332" + resolved "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz" integrity sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw== dependencies: svg.js "^2.6.5" @@ -1707,38 +1724,38 @@ svg.resize.js@^1.4.3: svg.select.js@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/svg.select.js/-/svg.select.js-2.1.2.tgz#e41ce13b1acff43a7441f9f8be87a2319c87be73" + resolved "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz" integrity sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ== dependencies: svg.js "^2.2.5" svg.select.js@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/svg.select.js/-/svg.select.js-3.0.1.tgz#a4198e359f3825739226415f82176a90ea5cc917" + resolved "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz" integrity sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw== dependencies: svg.js "^2.6.5" sync-child-process@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/sync-child-process/-/sync-child-process-1.0.2.tgz#45e7c72e756d1243e80b547ea2e17957ab9e367f" + resolved "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz" integrity sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA== dependencies: sync-message-port "^1.0.0" sync-message-port@^1.0.0: version "1.1.3" - resolved "https://registry.yarnpkg.com/sync-message-port/-/sync-message-port-1.1.3.tgz#6055c565ee8c81d2f9ee5aae7db757e6d9088c0c" + resolved "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz" integrity sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg== tailwind-merge@^2.5.4: version "2.6.0" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.6.0.tgz#ac5fb7e227910c038d458f396b7400d93a3142d5" + resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz" integrity sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA== tailwindcss@^3.4.14, tailwindcss@^3.4.17: version "3.4.17" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.17.tgz#ae8406c0f96696a631c790768ff319d46d5e5a63" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz" integrity sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og== dependencies: "@alloc/quick-lru" "^5.2.0" @@ -1766,48 +1783,48 @@ tailwindcss@^3.4.14, tailwindcss@^3.4.17: thenify-all@^1.0.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" totalist@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== ts-interface-checker@^0.1.9: version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== tslib@^2.1.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== typescript@~5.6.2: version "5.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz" integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== update-browserslist-db@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz" integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== dependencies: escalade "^3.2.0" @@ -1815,18 +1832,23 @@ update-browserslist-db@^1.1.1: util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== varint@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" + resolved "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz" integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== -vite@^6.0.3: - version "6.0.9" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.9.tgz#0a830b767ef7aa762360b56bdef955c1395dc1ee" - integrity sha512-MSgUxHcaXLtnBPktkbUSoQUANApKYuxZ6DrbVENlIorbhL2dZydTLaZ01tjUoE3szeFzlFk9ANOKk0xurh4MKA== +vite-plugin-monaco-editor@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vite-plugin-monaco-editor/-/vite-plugin-monaco-editor-1.1.0.tgz#a6238c2e13d5e98dd54a1bc51f6f189325219de3" + integrity sha512-IvtUqZotrRoVqwT0PBBDIZPNraya3BxN/bfcNfnxZ5rkJiGcNtO5eAOWWSgT7zullIAEqQwxMU83yL9J5k7gww== + +vite@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.11.tgz#224497e93e940b34c3357c9ebf2ec20803091ed8" + integrity sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg== dependencies: esbuild "^0.24.2" postcss "^8.4.49" @@ -1836,19 +1858,19 @@ vite@^6.0.3: vitefu@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-1.0.5.tgz#eab501e07da167bbb68e957685823e6b425e7ce2" + resolved "https://registry.npmjs.org/vitefu/-/vitefu-1.0.5.tgz" integrity sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA== which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -1857,7 +1879,7 @@ which@^2.0.1: wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -1866,10 +1888,10 @@ wrap-ansi@^8.1.0: yaml@^2.3.4: version "2.7.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz" integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== zimmerframe@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/zimmerframe/-/zimmerframe-1.1.2.tgz#5b75f1fa83b07ae2a428d51e50f58e2ae6855e5e" + resolved "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz" integrity sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==