Load in from S-expr file
parent
aa336e60d4
commit
e2b0b6b0f6
|
@ -215,7 +215,7 @@ function makeMutClosure(arg0, arg1, dtor, f) {
|
|||
function __wbg_adapter_32(arg0, arg1) {
|
||||
try {
|
||||
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
||||
wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h6b7aee7372379c0b(retptr, arg0, arg1);
|
||||
wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1082de2ba93ea56e(retptr, arg0, arg1);
|
||||
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
||||
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
||||
if (r1) {
|
||||
|
@ -227,7 +227,7 @@ function __wbg_adapter_32(arg0, arg1) {
|
|||
}
|
||||
|
||||
function __wbg_adapter_35(arg0, arg1, arg2) {
|
||||
wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__ha0ce2942859e959a(arg0, arg1, addHeapObject(arg2));
|
||||
wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h2640ff30468f914a(arg0, arg1, addHeapObject(arg2));
|
||||
}
|
||||
|
||||
function __wbg_adapter_38(arg0, arg1, arg2) {
|
||||
|
@ -882,6 +882,13 @@ function getImports() {
|
|||
const ret = getObject(arg0).setTimeout(getObject(arg1), arg2);
|
||||
return ret;
|
||||
}, arguments) };
|
||||
imports.wbg.__wbg_matches_7b5ad9e6bb56f1f3 = function(arg0) {
|
||||
const ret = getObject(arg0).matches;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_drawBuffersWEBGL_dfb0d803ea7ebe07 = function(arg0, arg1) {
|
||||
getObject(arg0).drawBuffersWEBGL(getObject(arg1));
|
||||
};
|
||||
imports.wbg.__wbg_addEventListener_615d4590d38da1c9 = function() { return handleError(function (arg0, arg1, arg2, arg3) {
|
||||
getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3));
|
||||
}, arguments) };
|
||||
|
@ -913,20 +920,17 @@ function getImports() {
|
|||
const ret = getObject(arg0).getContext(getStringFromWasm0(arg1, arg2), getObject(arg3));
|
||||
return isLikeNone(ret) ? 0 : addHeapObject(ret);
|
||||
}, arguments) };
|
||||
imports.wbg.__wbg_matches_7b5ad9e6bb56f1f3 = function(arg0) {
|
||||
const ret = getObject(arg0).matches;
|
||||
imports.wbg.__wbg_now_c644db5194be8437 = function(arg0) {
|
||||
const ret = getObject(arg0).now();
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_drawBuffersWEBGL_dfb0d803ea7ebe07 = function(arg0, arg1) {
|
||||
getObject(arg0).drawBuffersWEBGL(getObject(arg1));
|
||||
};
|
||||
imports.wbg.__wbg_writeText_eb90459f8e0f70d4 = function(arg0, arg1, arg2) {
|
||||
const ret = getObject(arg0).writeText(getStringFromWasm0(arg1, arg2));
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_now_c644db5194be8437 = function(arg0) {
|
||||
const ret = getObject(arg0).now();
|
||||
return ret;
|
||||
imports.wbg.__wbg_dataTransfer_445ade328cdd17c8 = function(arg0) {
|
||||
const ret = getObject(arg0).dataTransfer;
|
||||
return isLikeNone(ret) ? 0 : addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_items_6415b6b2cd06ac5f = function(arg0) {
|
||||
const ret = getObject(arg0).items;
|
||||
|
@ -943,10 +947,6 @@ function getImports() {
|
|||
getInt32Memory0()[arg0 / 4 + 1] = len0;
|
||||
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
|
||||
}, arguments) };
|
||||
imports.wbg.__wbg_dataTransfer_445ade328cdd17c8 = function(arg0) {
|
||||
const ret = getObject(arg0).dataTransfer;
|
||||
return isLikeNone(ret) ? 0 : addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_length_03c61261420b999d = function(arg0) {
|
||||
const ret = getObject(arg0).length;
|
||||
return ret;
|
||||
|
@ -963,6 +963,17 @@ function getImports() {
|
|||
const ret = getObject(arg0).videoHeight;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_name_ccf3024ae4e3ac54 = function(arg0, arg1) {
|
||||
const ret = getObject(arg1).name;
|
||||
const ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||
const len0 = WASM_VECTOR_LEN;
|
||||
getInt32Memory0()[arg0 / 4 + 1] = len0;
|
||||
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
|
||||
};
|
||||
imports.wbg.__wbg_lastModified_32c6de706a583a54 = function(arg0) {
|
||||
const ret = getObject(arg0).lastModified;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_keyCode_b33194be2ceec53b = function(arg0) {
|
||||
const ret = getObject(arg0).keyCode;
|
||||
return ret;
|
||||
|
@ -1005,27 +1016,6 @@ function getImports() {
|
|||
getInt32Memory0()[arg0 / 4 + 1] = len0;
|
||||
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
|
||||
}, arguments) };
|
||||
imports.wbg.__wbg_clipboardData_ac331f6733f5f16f = function(arg0) {
|
||||
const ret = getObject(arg0).clipboardData;
|
||||
return isLikeNone(ret) ? 0 : addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_preventDefault_16b2170b12f56317 = function(arg0) {
|
||||
getObject(arg0).preventDefault();
|
||||
};
|
||||
imports.wbg.__wbg_stopPropagation_7647c9985222f9b0 = function(arg0) {
|
||||
getObject(arg0).stopPropagation();
|
||||
};
|
||||
imports.wbg.__wbg_name_ccf3024ae4e3ac54 = function(arg0, arg1) {
|
||||
const ret = getObject(arg1).name;
|
||||
const ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||
const len0 = WASM_VECTOR_LEN;
|
||||
getInt32Memory0()[arg0 / 4 + 1] = len0;
|
||||
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
|
||||
};
|
||||
imports.wbg.__wbg_lastModified_32c6de706a583a54 = function(arg0) {
|
||||
const ret = getObject(arg0).lastModified;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_parentElement_0e8c9afce5cb9d6e = function(arg0) {
|
||||
const ret = getObject(arg0).parentElement;
|
||||
return isLikeNone(ret) ? 0 : addHeapObject(ret);
|
||||
|
@ -1034,14 +1024,6 @@ function getImports() {
|
|||
const ret = getObject(arg0).appendChild(getObject(arg1));
|
||||
return addHeapObject(ret);
|
||||
}, arguments) };
|
||||
imports.wbg.__wbg_width_8a17f65e11a44bf6 = function(arg0) {
|
||||
const ret = getObject(arg0).width;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_height_641410e41fce27a6 = function(arg0) {
|
||||
const ret = getObject(arg0).height;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_identifier_3e06c0d82cde247d = function(arg0) {
|
||||
const ret = getObject(arg0).identifier;
|
||||
return ret;
|
||||
|
@ -1109,12 +1091,15 @@ function getImports() {
|
|||
const ret = getObject(arg0).getBoundingClientRect();
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_data_70b505c651722930 = function(arg0, arg1) {
|
||||
const ret = getObject(arg1).data;
|
||||
var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||
var len0 = WASM_VECTOR_LEN;
|
||||
getInt32Memory0()[arg0 / 4 + 1] = len0;
|
||||
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
|
||||
imports.wbg.__wbg_clipboardData_ac331f6733f5f16f = function(arg0) {
|
||||
const ret = getObject(arg0).clipboardData;
|
||||
return isLikeNone(ret) ? 0 : addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_preventDefault_16b2170b12f56317 = function(arg0) {
|
||||
getObject(arg0).preventDefault();
|
||||
};
|
||||
imports.wbg.__wbg_stopPropagation_7647c9985222f9b0 = function(arg0) {
|
||||
getObject(arg0).stopPropagation();
|
||||
};
|
||||
imports.wbg.__wbg_href_bb86bb94d1c6861b = function() { return handleError(function (arg0, arg1) {
|
||||
const ret = getObject(arg1).href;
|
||||
|
@ -1172,6 +1157,14 @@ function getImports() {
|
|||
getInt32Memory0()[arg0 / 4 + 1] = len0;
|
||||
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
|
||||
}, arguments) };
|
||||
imports.wbg.__wbg_width_8a17f65e11a44bf6 = function(arg0) {
|
||||
const ret = getObject(arg0).width;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_height_641410e41fce27a6 = function(arg0) {
|
||||
const ret = getObject(arg0).height;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_size_5ce324b99223d189 = function(arg0) {
|
||||
const ret = getObject(arg0).size;
|
||||
return ret;
|
||||
|
@ -1187,15 +1180,6 @@ function getImports() {
|
|||
getInt32Memory0()[arg0 / 4 + 1] = len0;
|
||||
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
|
||||
};
|
||||
imports.wbg.__wbg_drawArraysInstancedANGLE_403faa11d52ccf6d = function(arg0, arg1, arg2, arg3, arg4) {
|
||||
getObject(arg0).drawArraysInstancedANGLE(arg1 >>> 0, arg2, arg3, arg4);
|
||||
};
|
||||
imports.wbg.__wbg_drawElementsInstancedANGLE_0230afc27cf9cec9 = function(arg0, arg1, arg2, arg3, arg4, arg5) {
|
||||
getObject(arg0).drawElementsInstancedANGLE(arg1 >>> 0, arg2, arg3 >>> 0, arg4, arg5);
|
||||
};
|
||||
imports.wbg.__wbg_vertexAttribDivisorANGLE_6bbb3df4c6e7d08b = function(arg0, arg1, arg2) {
|
||||
getObject(arg0).vertexAttribDivisorANGLE(arg1 >>> 0, arg2 >>> 0);
|
||||
};
|
||||
imports.wbg.__wbg_size_88fc46d83abb907c = function(arg0) {
|
||||
const ret = getObject(arg0).size;
|
||||
return ret;
|
||||
|
@ -1204,6 +1188,13 @@ function getImports() {
|
|||
const ret = getObject(arg0).arrayBuffer();
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_data_70b505c651722930 = function(arg0, arg1) {
|
||||
const ret = getObject(arg1).data;
|
||||
var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||
var len0 = WASM_VECTOR_LEN;
|
||||
getInt32Memory0()[arg0 / 4 + 1] = len0;
|
||||
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
|
||||
};
|
||||
imports.wbg.__wbg_setProperty_21e2e7868b86a93e = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
|
||||
getObject(arg0).setProperty(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
|
||||
}, arguments) };
|
||||
|
@ -1223,22 +1214,6 @@ function getImports() {
|
|||
const ret = getObject(arg0).left;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_length_e330009c21d43b27 = function(arg0) {
|
||||
const ret = getObject(arg0).length;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_get_460ba3644fab1c42 = function(arg0, arg1) {
|
||||
const ret = getObject(arg0)[arg1 >>> 0];
|
||||
return isLikeNone(ret) ? 0 : addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_width_716d2242c9bd6c20 = function(arg0) {
|
||||
const ret = getObject(arg0).width;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_height_d45e4d57562f8ae0 = function(arg0) {
|
||||
const ret = getObject(arg0).height;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_getItem_f0d43fc4e780b652 = function() { return handleError(function (arg0, arg1, arg2, arg3) {
|
||||
const ret = getObject(arg1).getItem(getStringFromWasm0(arg2, arg3));
|
||||
var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||
|
@ -1261,6 +1236,23 @@ function getImports() {
|
|||
const ret = getObject(arg0)[arg1 >>> 0];
|
||||
return isLikeNone(ret) ? 0 : addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_drawArraysInstancedANGLE_403faa11d52ccf6d = function(arg0, arg1, arg2, arg3, arg4) {
|
||||
getObject(arg0).drawArraysInstancedANGLE(arg1 >>> 0, arg2, arg3, arg4);
|
||||
};
|
||||
imports.wbg.__wbg_drawElementsInstancedANGLE_0230afc27cf9cec9 = function(arg0, arg1, arg2, arg3, arg4, arg5) {
|
||||
getObject(arg0).drawElementsInstancedANGLE(arg1 >>> 0, arg2, arg3 >>> 0, arg4, arg5);
|
||||
};
|
||||
imports.wbg.__wbg_vertexAttribDivisorANGLE_6bbb3df4c6e7d08b = function(arg0, arg1, arg2) {
|
||||
getObject(arg0).vertexAttribDivisorANGLE(arg1 >>> 0, arg2 >>> 0);
|
||||
};
|
||||
imports.wbg.__wbg_length_e330009c21d43b27 = function(arg0) {
|
||||
const ret = getObject(arg0).length;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_get_460ba3644fab1c42 = function(arg0, arg1) {
|
||||
const ret = getObject(arg0)[arg1 >>> 0];
|
||||
return isLikeNone(ret) ? 0 : addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_instanceof_HtmlInputElement_5c9d54338207f061 = function(arg0) {
|
||||
let result;
|
||||
try {
|
||||
|
@ -1287,6 +1279,14 @@ function getImports() {
|
|||
imports.wbg.__wbg_setvalue_a706abe70dab1b65 = function(arg0, arg1, arg2) {
|
||||
getObject(arg0).value = getStringFromWasm0(arg1, arg2);
|
||||
};
|
||||
imports.wbg.__wbg_width_716d2242c9bd6c20 = function(arg0) {
|
||||
const ret = getObject(arg0).width;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_height_d45e4d57562f8ae0 = function(arg0) {
|
||||
const ret = getObject(arg0).height;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_framebufferTextureMultiviewOVR_0ae55d2aa52fd2cb = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
|
||||
getObject(arg0).framebufferTextureMultiviewOVR(arg1 >>> 0, arg2 >>> 0, getObject(arg3), arg4, arg5, arg6);
|
||||
};
|
||||
|
@ -1818,16 +1818,16 @@ function getImports() {
|
|||
const ret = wasm.memory;
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbindgen_closure_wrapper4239 = function(arg0, arg1, arg2) {
|
||||
imports.wbg.__wbindgen_closure_wrapper4374 = function(arg0, arg1, arg2) {
|
||||
const ret = makeMutClosure(arg0, arg1, 308, __wbg_adapter_32);
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbindgen_closure_wrapper4240 = function(arg0, arg1, arg2) {
|
||||
imports.wbg.__wbindgen_closure_wrapper4376 = function(arg0, arg1, arg2) {
|
||||
const ret = makeMutClosure(arg0, arg1, 308, __wbg_adapter_35);
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbindgen_closure_wrapper4340 = function(arg0, arg1, arg2) {
|
||||
const ret = makeMutClosure(arg0, arg1, 348, __wbg_adapter_38);
|
||||
imports.wbg.__wbindgen_closure_wrapper4475 = function(arg0, arg1, arg2) {
|
||||
const ret = makeMutClosure(arg0, arg1, 349, __wbg_adapter_38);
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
|
||||
|
|
Binary file not shown.
25
src/app.rs
25
src/app.rs
|
@ -1,7 +1,7 @@
|
|||
pub mod components;
|
||||
pub mod draw;
|
||||
mod structure;
|
||||
use serde_lexpr::{from_str, print::*, to_string_custom};
|
||||
use serde_lexpr::{from_str, print, to_string_custom};
|
||||
|
||||
use chrono::prelude::Utc;
|
||||
use chrono_humanize::HumanTime;
|
||||
|
@ -88,15 +88,28 @@ impl eframe::App for PlannerApp {
|
|||
// The top panel is often a good place for a menu bar:
|
||||
egui::menu::bar(ui, |ui| {
|
||||
ui.menu_button("File", |ui| {
|
||||
if ui.button("Load").clicked() {
|
||||
if let Some(path) = rfd::FileDialog::new()
|
||||
.add_filter("plan", &["splan"])
|
||||
.set_title("Load Plan")
|
||||
.pick_file()
|
||||
{
|
||||
let read = std::fs::read_to_string(path.display().to_string()).unwrap();
|
||||
println!("{}", &read);
|
||||
let sexpr: structure::Project = from_str(&read).unwrap();
|
||||
println!("{:?}", &sexpr);
|
||||
*current_project = sexpr;
|
||||
}
|
||||
}
|
||||
if ui.button("Save As").clicked() {
|
||||
let options = Options::default();
|
||||
let options = print::Options::default();
|
||||
let sexpr = to_string_custom(
|
||||
¤t_project,
|
||||
options
|
||||
.with_keyword_syntax(KeywordSyntax::ColonPrefix)
|
||||
.with_nil_syntax(NilSyntax::Token)
|
||||
.with_bool_syntax(BoolSyntax::Token)
|
||||
.with_vector_syntax(VectorSyntax::Octothorpe),
|
||||
.with_keyword_syntax(print::KeywordSyntax::ColonPrefix)
|
||||
.with_nil_syntax(print::NilSyntax::Token)
|
||||
.with_bool_syntax(print::BoolSyntax::Token)
|
||||
.with_vector_syntax(print::VectorSyntax::Octothorpe),
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ pub enum Unit {
|
|||
Foot(f64),
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Clone)]
|
||||
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Clone, Debug)]
|
||||
pub enum ComponentType {
|
||||
Wall,
|
||||
Door,
|
||||
|
@ -20,7 +20,7 @@ pub enum ComponentType {
|
|||
Furniture,
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Clone)]
|
||||
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Clone, Debug)]
|
||||
pub enum Material {
|
||||
Metal,
|
||||
Wood,
|
||||
|
@ -29,7 +29,7 @@ pub enum Material {
|
|||
Cement,
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Clone)]
|
||||
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Clone, Debug)]
|
||||
#[serde(default)]
|
||||
pub struct Component {
|
||||
pub id: Uuid,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Clone)]
|
||||
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Clone, Debug)]
|
||||
pub struct Position(f64, f64, f64);
|
||||
|
||||
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Clone)]
|
||||
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Clone, Debug)]
|
||||
pub enum Shape {
|
||||
Circle(Position, f64), // Centre, Radius
|
||||
Rectangle(Position, Position), // Top-left, Bottom-right
|
||||
|
|
|
@ -4,7 +4,7 @@ use uuid::Uuid;
|
|||
|
||||
use super::components::Component;
|
||||
|
||||
#[derive(serde::Deserialize, serde::Serialize, PartialEq)]
|
||||
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Debug)]
|
||||
pub enum License {
|
||||
MIT,
|
||||
GPL,
|
||||
|
@ -12,7 +12,7 @@ pub enum License {
|
|||
CNPL,
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize, serde::Serialize, Clone)]
|
||||
#[derive(serde::Deserialize, serde::Serialize, Clone, Debug)]
|
||||
#[serde(default)]
|
||||
pub struct Layer {
|
||||
pub zindex: usize,
|
||||
|
@ -32,7 +32,7 @@ impl Default for Layer {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize, serde::Serialize)]
|
||||
#[derive(serde::Deserialize, serde::Serialize, Debug)]
|
||||
#[serde(default)] // if we add new fields, give them default values when deserializing old state
|
||||
pub struct Project {
|
||||
pub id: Uuid,
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
(
|
||||
(id . "5d932ba0-8912-4e53-95b7-5152bab827ac")
|
||||
(name . "Meow")
|
||||
(name . "Test Edit!")
|
||||
(created . "2023-04-29T00:28:43.560471889Z")
|
||||
(modified "2023-04-29T00:30:40.945891620Z")
|
||||
(license . CNPL)
|
||||
(license . MIT)
|
||||
(layers
|
||||
(0
|
||||
(zindex . 0)
|
||||
|
|
Loading…
Reference in New Issue