From ad6ea3d6aa564ad228cf8883a8fd858135a16030 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 6 Feb 2022 13:31:16 +0000 Subject: [PATCH 01/74] Replace `any` with `union` for subtyping in `core:odin/ast` --- core/odin/ast/ast.odin | 177 ++++++++++++++++++++++++++- core/odin/ast/clone.odin | 187 +++++++++++++++++------------ core/odin/ast/walk.odin | 154 ++++++++++++------------ core/odin/parser/parser.odin | 180 ++++++++++++++-------------- core/odin/printer/visit.odin | 226 ++++++++++++++++++++--------------- 5 files changed, 581 insertions(+), 343 deletions(-) diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index 8eb0def44..740299539 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -34,7 +34,7 @@ Node :: struct { pos: tokenizer.Pos, end: tokenizer.Pos, state_flags: Node_State_Flags, - derived: any, + derived: Any_Node, } Comment_Group :: struct { @@ -88,9 +88,11 @@ File :: struct { Expr :: struct { using expr_base: Node, + derived_expr: Any_Expr, } Stmt :: struct { using stmt_base: Node, + derived_stmt: Any_Stmt, } Decl :: struct { using decl_base: Stmt, @@ -541,7 +543,7 @@ unparen_expr :: proc(expr: ^Expr) -> (val: ^Expr) { return } for { - e, ok := val.derived.(Paren_Expr) + e, ok := val.derived.(^Paren_Expr) if !ok || e.expr == nil { break } @@ -758,4 +760,173 @@ Matrix_Type :: struct { row_count: ^Expr, column_count: ^Expr, elem: ^Expr, -} \ No newline at end of file +} + + +Any_Node :: union { + ^Package, + ^File, + ^Comment_Group, + + ^Bad_Expr, + ^Ident, + ^Implicit, + ^Undef, + ^Basic_Lit, + ^Basic_Directive, + ^Ellipsis, + ^Proc_Lit, + ^Comp_Lit, + ^Tag_Expr, + ^Unary_Expr, + ^Binary_Expr, + ^Paren_Expr, + ^Selector_Expr, + ^Implicit_Selector_Expr, + ^Selector_Call_Expr, + ^Index_Expr, + ^Deref_Expr, + ^Slice_Expr, + ^Matrix_Index_Expr, + ^Call_Expr, + ^Field_Value, + ^Ternary_If_Expr, + ^Ternary_When_Expr, + ^Or_Else_Expr, + ^Or_Return_Expr, + ^Type_Assertion, + ^Type_Cast, + ^Auto_Cast, + ^Inline_Asm_Expr, + + ^Proc_Group, + + ^Typeid_Type, + ^Helper_Type, + ^Distinct_Type, + ^Poly_Type, + ^Proc_Type, + ^Pointer_Type, + ^Multi_Pointer_Type, + ^Array_Type, + ^Dynamic_Array_Type, + ^Struct_Type, + ^Union_Type, + ^Enum_Type, + ^Bit_Set_Type, + ^Map_Type, + ^Relative_Type, + ^Matrix_Type, + + ^Bad_Stmt, + ^Empty_Stmt, + ^Expr_Stmt, + ^Tag_Stmt, + ^Assign_Stmt, + ^Block_Stmt, + ^If_Stmt, + ^When_Stmt, + ^Return_Stmt, + ^Defer_Stmt, + ^For_Stmt, + ^Range_Stmt, + ^Inline_Range_Stmt, + ^Case_Clause, + ^Switch_Stmt, + ^Type_Switch_Stmt, + ^Branch_Stmt, + ^Using_Stmt, + + ^Bad_Decl, + ^Value_Decl, + ^Package_Decl, + ^Import_Decl, + ^Foreign_Block_Decl, + ^Foreign_Import_Decl, + + ^Attribute, + ^Field, + ^Field_List, +} + + +Any_Expr :: union { + ^Bad_Expr, + ^Ident, + ^Implicit, + ^Undef, + ^Basic_Lit, + ^Basic_Directive, + ^Ellipsis, + ^Proc_Lit, + ^Comp_Lit, + ^Tag_Expr, + ^Unary_Expr, + ^Binary_Expr, + ^Paren_Expr, + ^Selector_Expr, + ^Implicit_Selector_Expr, + ^Selector_Call_Expr, + ^Index_Expr, + ^Deref_Expr, + ^Slice_Expr, + ^Matrix_Index_Expr, + ^Call_Expr, + ^Field_Value, + ^Ternary_If_Expr, + ^Ternary_When_Expr, + ^Or_Else_Expr, + ^Or_Return_Expr, + ^Type_Assertion, + ^Type_Cast, + ^Auto_Cast, + ^Inline_Asm_Expr, + + ^Proc_Group, + + ^Typeid_Type, + ^Helper_Type, + ^Distinct_Type, + ^Poly_Type, + ^Proc_Type, + ^Pointer_Type, + ^Multi_Pointer_Type, + ^Array_Type, + ^Dynamic_Array_Type, + ^Struct_Type, + ^Union_Type, + ^Enum_Type, + ^Bit_Set_Type, + ^Map_Type, + ^Relative_Type, + ^Matrix_Type, +} + + +Any_Stmt :: union { + ^Bad_Stmt, + ^Empty_Stmt, + ^Expr_Stmt, + ^Tag_Stmt, + ^Assign_Stmt, + ^Block_Stmt, + ^If_Stmt, + ^When_Stmt, + ^Return_Stmt, + ^Defer_Stmt, + ^For_Stmt, + ^Range_Stmt, + ^Inline_Range_Stmt, + ^Case_Clause, + ^Switch_Stmt, + ^Type_Switch_Stmt, + ^Branch_Stmt, + ^Using_Stmt, + + ^Bad_Decl, + ^Value_Decl, + ^Package_Decl, + ^Import_Decl, + ^Foreign_Block_Decl, + ^Foreign_Import_Decl, +} diff --git a/core/odin/ast/clone.odin b/core/odin/ast/clone.odin index 1e3058678..723f7b90d 100644 --- a/core/odin/ast/clone.odin +++ b/core/odin/ast/clone.odin @@ -1,16 +1,25 @@ package odin_ast +import "core:intrinsics" import "core:mem" import "core:fmt" +import "core:reflect" import "core:odin/tokenizer" +_ :: intrinsics new :: proc($T: typeid, pos, end: tokenizer.Pos) -> ^T { n, _ := mem.new(T) n.pos = pos n.end = end - n.derived = n^ + n.derived = n base: ^Node = n // dummy check _ = base // "Use" type to make -vet happy + when intrinsics.type_has_field(T, "derived_expr") { + n.derived_expr = n + } + when intrinsics.type_has_field(T, "derived_stmt") { + n.derived_stmt = n + } return n } @@ -61,228 +70,248 @@ clone_node :: proc(node: ^Node) -> ^Node { size := size_of(Node) align := align_of(Node) - ti := type_info_of(node.derived.id) + ti := reflect.union_variant_type_info(node.derived) if ti != nil { size = ti.size align = ti.align } - switch in node.derived { - case Package, File: + #partial switch in node.derived { + case ^Package, ^File: panic("Cannot clone this node type") } res := cast(^Node)mem.alloc(size, align) src: rawptr = node if node.derived != nil { - src = node.derived.data + src = (^rawptr)(&node.derived)^ } mem.copy(res, src, size) - res.derived.data = rawptr(res) - res.derived.id = node.derived.id + res_any: any + res_any.data = res + res_any.id = ti.id - switch r in &res.derived { - case Bad_Expr: - case Ident: - case Implicit: - case Undef: - case Basic_Lit: + reflect.set_union_value(res.derived, res_any) - case Ellipsis: + derived_expr := reflect.struct_field_value_by_name(res_any, "derived_expr", true) + derived_stmt := reflect.struct_field_value_by_name(res_any, "derived_stmt", true) + reflect.set_union_value(res.derived, derived_expr) + reflect.set_union_value(res.derived, derived_stmt) + + switch r in res.derived { + case ^Package, ^File: + case ^Bad_Expr: + case ^Ident: + case ^Implicit: + case ^Undef: + case ^Basic_Lit: + case ^Basic_Directive: + case ^Comment_Group: + + case ^Ellipsis: r.expr = clone(r.expr) - case Proc_Lit: + case ^Proc_Lit: r.type = auto_cast clone(r.type) r.body = clone(r.body) - case Comp_Lit: + case ^Comp_Lit: r.type = clone(r.type) r.elems = clone(r.elems) - case Tag_Expr: + case ^Tag_Expr: r.expr = clone(r.expr) - case Unary_Expr: + case ^Unary_Expr: r.expr = clone(r.expr) - case Binary_Expr: + case ^Binary_Expr: r.left = clone(r.left) r.right = clone(r.right) - case Paren_Expr: + case ^Paren_Expr: r.expr = clone(r.expr) - case Selector_Expr: + case ^Selector_Expr: r.expr = clone(r.expr) r.field = auto_cast clone(r.field) - case Implicit_Selector_Expr: + case ^Implicit_Selector_Expr: r.field = auto_cast clone(r.field) - case Selector_Call_Expr: + case ^Selector_Call_Expr: r.expr = clone(r.expr) r.call = auto_cast clone(r.call) - case Index_Expr: + case ^Index_Expr: r.expr = clone(r.expr) r.index = clone(r.index) - case Matrix_Index_Expr: + case ^Matrix_Index_Expr: r.expr = clone(r.expr) r.row_index = clone(r.row_index) r.column_index = clone(r.column_index) - case Deref_Expr: + case ^Deref_Expr: r.expr = clone(r.expr) - case Slice_Expr: + case ^Slice_Expr: r.expr = clone(r.expr) r.low = clone(r.low) r.high = clone(r.high) - case Call_Expr: + case ^Call_Expr: r.expr = clone(r.expr) r.args = clone(r.args) - case Field_Value: + case ^Field_Value: r.field = clone(r.field) r.value = clone(r.value) - case Ternary_If_Expr: + case ^Ternary_If_Expr: r.x = clone(r.x) r.cond = clone(r.cond) r.y = clone(r.y) - case Ternary_When_Expr: + case ^Ternary_When_Expr: r.x = clone(r.x) r.cond = clone(r.cond) r.y = clone(r.y) - case Or_Else_Expr: + case ^Or_Else_Expr: r.x = clone(r.x) r.y = clone(r.y) - case Or_Return_Expr: + case ^Or_Return_Expr: r.expr = clone(r.expr) - case Type_Assertion: + case ^Type_Assertion: r.expr = clone(r.expr) r.type = clone(r.type) - case Type_Cast: + case ^Type_Cast: r.type = clone(r.type) r.expr = clone(r.expr) - case Auto_Cast: + case ^Auto_Cast: r.expr = clone(r.expr) - case Inline_Asm_Expr: + case ^Inline_Asm_Expr: r.param_types = clone(r.param_types) r.return_type = clone(r.return_type) r.constraints_string = clone(r.constraints_string) r.asm_string = clone(r.asm_string) - case Bad_Stmt: + case ^Bad_Stmt: // empty - case Empty_Stmt: + case ^Empty_Stmt: // empty - case Expr_Stmt: + case ^Expr_Stmt: r.expr = clone(r.expr) - case Tag_Stmt: + case ^Tag_Stmt: r.stmt = clone(r.stmt) - case Assign_Stmt: + case ^Assign_Stmt: r.lhs = clone(r.lhs) r.rhs = clone(r.rhs) - case Block_Stmt: + case ^Block_Stmt: r.label = clone(r.label) r.stmts = clone(r.stmts) - case If_Stmt: + case ^If_Stmt: r.label = clone(r.label) r.init = clone(r.init) r.cond = clone(r.cond) r.body = clone(r.body) r.else_stmt = clone(r.else_stmt) - case When_Stmt: + case ^When_Stmt: r.cond = clone(r.cond) r.body = clone(r.body) r.else_stmt = clone(r.else_stmt) - case Return_Stmt: + case ^Return_Stmt: r.results = clone(r.results) - case Defer_Stmt: + case ^Defer_Stmt: r.stmt = clone(r.stmt) - case For_Stmt: + case ^For_Stmt: r.label = clone(r.label) r.init = clone(r.init) r.cond = clone(r.cond) r.post = clone(r.post) r.body = clone(r.body) - case Range_Stmt: + case ^Range_Stmt: r.label = clone(r.label) r.vals = clone(r.vals) r.expr = clone(r.expr) r.body = clone(r.body) - case Case_Clause: + case ^Inline_Range_Stmt: + r.label = clone(r.label) + r.val0 = clone(r.val0) + r.val1 = clone(r.val1) + r.expr = clone(r.expr) + r.body = clone(r.body) + case ^Case_Clause: r.list = clone(r.list) r.body = clone(r.body) - case Switch_Stmt: + case ^Switch_Stmt: r.label = clone(r.label) r.init = clone(r.init) r.cond = clone(r.cond) r.body = clone(r.body) - case Type_Switch_Stmt: + case ^Type_Switch_Stmt: r.label = clone(r.label) r.tag = clone(r.tag) r.expr = clone(r.expr) r.body = clone(r.body) - case Branch_Stmt: + case ^Branch_Stmt: r.label = auto_cast clone(r.label) - case Using_Stmt: + case ^Using_Stmt: r.list = clone(r.list) - case Bad_Decl: - case Value_Decl: + case ^Bad_Decl: + case ^Value_Decl: r.attributes = clone(r.attributes) r.names = clone(r.names) r.type = clone(r.type) r.values = clone(r.values) - case Package_Decl: - case Import_Decl: - case Foreign_Block_Decl: + case ^Package_Decl: + case ^Import_Decl: + case ^Foreign_Block_Decl: r.attributes = clone(r.attributes) r.foreign_library = clone(r.foreign_library) r.body = clone(r.body) - case Foreign_Import_Decl: + case ^Foreign_Import_Decl: r.name = auto_cast clone(r.name) - case Proc_Group: + case ^Proc_Group: r.args = clone(r.args) - case Attribute: + case ^Attribute: r.elems = clone(r.elems) - case Field: + case ^Field: r.names = clone(r.names) r.type = clone(r.type) r.default_value = clone(r.default_value) - case Field_List: + case ^Field_List: r.list = clone(r.list) - case Typeid_Type: + case ^Typeid_Type: r.specialization = clone(r.specialization) - case Helper_Type: + case ^Helper_Type: r.type = clone(r.type) - case Distinct_Type: + case ^Distinct_Type: r.type = clone(r.type) - case Poly_Type: + case ^Poly_Type: r.type = auto_cast clone(r.type) r.specialization = clone(r.specialization) - case Proc_Type: + case ^Proc_Type: r.params = auto_cast clone(r.params) r.results = auto_cast clone(r.results) - case Pointer_Type: + case ^Pointer_Type: r.elem = clone(r.elem) - case Multi_Pointer_Type: + case ^Multi_Pointer_Type: r.elem = clone(r.elem) - case Array_Type: + case ^Array_Type: r.len = clone(r.len) r.elem = clone(r.elem) - case Dynamic_Array_Type: + case ^Dynamic_Array_Type: r.elem = clone(r.elem) - case Struct_Type: + case ^Struct_Type: r.poly_params = auto_cast clone(r.poly_params) r.align = clone(r.align) r.fields = auto_cast clone(r.fields) - case Union_Type: + case ^Union_Type: r.poly_params = auto_cast clone(r.poly_params) r.align = clone(r.align) r.variants = clone(r.variants) - case Enum_Type: + case ^Enum_Type: r.base_type = clone(r.base_type) r.fields = clone(r.fields) - case Bit_Set_Type: + case ^Bit_Set_Type: r.elem = clone(r.elem) r.underlying = clone(r.underlying) - case Map_Type: + case ^Map_Type: r.key = clone(r.key) r.value = clone(r.value) - case Matrix_Type: + case ^Matrix_Type: r.row_count = clone(r.row_count) r.column_count = clone(r.column_count) r.elem = clone(r.elem) + case ^Relative_Type: + r.tag = clone(r.tag) + r.type = clone(r.type) case: fmt.panicf("Unhandled node kind: %T", r) } diff --git a/core/odin/ast/walk.odin b/core/odin/ast/walk.odin index d0d17cc9e..7241d283f 100644 --- a/core/odin/ast/walk.odin +++ b/core/odin/ast/walk.odin @@ -59,64 +59,64 @@ walk :: proc(v: ^Visitor, node: ^Node) { } switch n in &node.derived { - case File: + case ^File: if n.docs != nil { walk(v, n.docs) } walk_stmt_list(v, n.decls[:]) - case Package: + case ^Package: for _, f in n.files { walk(v, f) } - case Comment_Group: + case ^Comment_Group: // empty - case Bad_Expr: - case Ident: - case Implicit: - case Undef: - case Basic_Lit: - case Basic_Directive: - case Ellipsis: + case ^Bad_Expr: + case ^Ident: + case ^Implicit: + case ^Undef: + case ^Basic_Lit: + case ^Basic_Directive: + case ^Ellipsis: if n.expr != nil { walk(v, n.expr) } - case Proc_Lit: + case ^Proc_Lit: walk(v, n.type) walk(v, n.body) walk_expr_list(v, n.where_clauses) - case Comp_Lit: + case ^Comp_Lit: if n.type != nil { walk(v, n.type) } walk_expr_list(v, n.elems) - case Tag_Expr: + case ^Tag_Expr: walk(v, n.expr) - case Unary_Expr: + case ^Unary_Expr: walk(v, n.expr) - case Binary_Expr: + case ^Binary_Expr: walk(v, n.left) walk(v, n.right) - case Paren_Expr: + case ^Paren_Expr: walk(v, n.expr) - case Selector_Expr: + case ^Selector_Expr: walk(v, n.expr) walk(v, n.field) - case Implicit_Selector_Expr: + case ^Implicit_Selector_Expr: walk(v, n.field) - case Selector_Call_Expr: + case ^Selector_Call_Expr: walk(v, n.expr) walk(v, n.call) - case Index_Expr: + case ^Index_Expr: walk(v, n.expr) walk(v, n.index) - case Matrix_Index_Expr: + case ^Matrix_Index_Expr: walk(v, n.expr) walk(v, n.row_index) walk(v, n.column_index) - case Deref_Expr: + case ^Deref_Expr: walk(v, n.expr) - case Slice_Expr: + case ^Slice_Expr: walk(v, n.expr) if n.low != nil { walk(v, n.low) @@ -124,57 +124,57 @@ walk :: proc(v: ^Visitor, node: ^Node) { if n.high != nil { walk(v, n.high) } - case Call_Expr: + case ^Call_Expr: walk(v, n.expr) walk_expr_list(v, n.args) - case Field_Value: + case ^Field_Value: walk(v, n.field) walk(v, n.value) - case Ternary_If_Expr: + case ^Ternary_If_Expr: walk(v, n.x) walk(v, n.cond) walk(v, n.y) - case Ternary_When_Expr: + case ^Ternary_When_Expr: walk(v, n.x) walk(v, n.cond) walk(v, n.y) - case Or_Else_Expr: + case ^Or_Else_Expr: walk(v, n.x) walk(v, n.y) - case Or_Return_Expr: + case ^Or_Return_Expr: walk(v, n.expr) - case Type_Assertion: + case ^Type_Assertion: walk(v, n.expr) if n.type != nil { walk(v, n.type) } - case Type_Cast: + case ^Type_Cast: walk(v, n.type) walk(v, n.expr) - case Auto_Cast: + case ^Auto_Cast: walk(v, n.expr) - case Inline_Asm_Expr: + case ^Inline_Asm_Expr: walk_expr_list(v, n.param_types) walk(v, n.return_type) walk(v, n.constraints_string) walk(v, n.asm_string) - case Bad_Stmt: - case Empty_Stmt: - case Expr_Stmt: + case ^Bad_Stmt: + case ^Empty_Stmt: + case ^Expr_Stmt: walk(v, n.expr) - case Tag_Stmt: + case ^Tag_Stmt: walk(v, n.stmt) - case Assign_Stmt: + case ^Assign_Stmt: walk_expr_list(v, n.lhs) walk_expr_list(v, n.rhs) - case Block_Stmt: + case ^Block_Stmt: if n.label != nil { walk(v, n.label) } walk_stmt_list(v, n.stmts) - case If_Stmt: + case ^If_Stmt: if n.label != nil { walk(v, n.label) } @@ -186,17 +186,17 @@ walk :: proc(v: ^Visitor, node: ^Node) { if n.else_stmt != nil { walk(v, n.else_stmt) } - case When_Stmt: + case ^When_Stmt: walk(v, n.cond) walk(v, n.body) if n.else_stmt != nil { walk(v, n.else_stmt) } - case Return_Stmt: + case ^Return_Stmt: walk_expr_list(v, n.results) - case Defer_Stmt: + case ^Defer_Stmt: walk(v, n.stmt) - case For_Stmt: + case ^For_Stmt: if n.label != nil { walk(v, n.label) } @@ -210,7 +210,7 @@ walk :: proc(v: ^Visitor, node: ^Node) { walk(v, n.post) } walk(v, n.body) - case Range_Stmt: + case ^Range_Stmt: if n.label != nil { walk(v, n.label) } @@ -221,7 +221,7 @@ walk :: proc(v: ^Visitor, node: ^Node) { } walk(v, n.expr) walk(v, n.body) - case Inline_Range_Stmt: + case ^Inline_Range_Stmt: if n.label != nil { walk(v, n.label) } @@ -233,10 +233,10 @@ walk :: proc(v: ^Visitor, node: ^Node) { } walk(v, n.expr) walk(v, n.body) - case Case_Clause: + case ^Case_Clause: walk_expr_list(v, n.list) walk_stmt_list(v, n.body) - case Switch_Stmt: + case ^Switch_Stmt: if n.label != nil { walk(v, n.label) } @@ -247,7 +247,7 @@ walk :: proc(v: ^Visitor, node: ^Node) { walk(v, n.cond) } walk(v, n.body) - case Type_Switch_Stmt: + case ^Type_Switch_Stmt: if n.label != nil { walk(v, n.label) } @@ -258,16 +258,16 @@ walk :: proc(v: ^Visitor, node: ^Node) { walk(v, n.expr) } walk(v, n.body) - case Branch_Stmt: + case ^Branch_Stmt: if n.label != nil { walk(v, n.label) } - case Using_Stmt: + case ^Using_Stmt: walk_expr_list(v, n.list) - case Bad_Decl: - case Value_Decl: + case ^Bad_Decl: + case ^Value_Decl: if n.docs != nil { walk(v, n.docs) } @@ -280,21 +280,21 @@ walk :: proc(v: ^Visitor, node: ^Node) { if n.comment != nil { walk(v, n.comment) } - case Package_Decl: + case ^Package_Decl: if n.docs != nil { walk(v, n.docs) } if n.comment != nil { walk(v, n.comment) } - case Import_Decl: + case ^Import_Decl: if n.docs != nil { walk(v, n.docs) } if n.comment != nil { walk(v, n.comment) } - case Foreign_Block_Decl: + case ^Foreign_Block_Decl: if n.docs != nil { walk(v, n.docs) } @@ -303,7 +303,7 @@ walk :: proc(v: ^Visitor, node: ^Node) { walk(v, n.foreign_library) } walk(v, n.body) - case Foreign_Import_Decl: + case ^Foreign_Import_Decl: if n.docs != nil { walk(v, n.docs) } @@ -313,11 +313,11 @@ walk :: proc(v: ^Visitor, node: ^Node) { walk(v, n.comment) } - case Proc_Group: + case ^Proc_Group: walk_expr_list(v, n.args) - case Attribute: + case ^Attribute: walk_expr_list(v, n.elems) - case Field: + case ^Field: if n.docs != nil { walk(v, n.docs) } @@ -331,31 +331,31 @@ walk :: proc(v: ^Visitor, node: ^Node) { if n.comment != nil { walk(v, n.comment) } - case Field_List: + case ^Field_List: for x in n.list { walk(v, x) } - case Typeid_Type: + case ^Typeid_Type: if n.specialization != nil { walk(v, n.specialization) } - case Helper_Type: + case ^Helper_Type: walk(v, n.type) - case Distinct_Type: + case ^Distinct_Type: walk(v, n.type) - case Poly_Type: + case ^Poly_Type: walk(v, n.type) if n.specialization != nil { walk(v, n.specialization) } - case Proc_Type: + case ^Proc_Type: walk(v, n.params) walk(v, n.results) - case Pointer_Type: + case ^Pointer_Type: walk(v, n.elem) - case Multi_Pointer_Type: + case ^Multi_Pointer_Type: walk(v, n.elem) - case Array_Type: + case ^Array_Type: if n.tag != nil { walk(v, n.tag) } @@ -363,12 +363,12 @@ walk :: proc(v: ^Visitor, node: ^Node) { walk(v, n.len) } walk(v, n.elem) - case Dynamic_Array_Type: + case ^Dynamic_Array_Type: if n.tag != nil { walk(v, n.tag) } walk(v, n.elem) - case Struct_Type: + case ^Struct_Type: if n.poly_params != nil { walk(v, n.poly_params) } @@ -377,7 +377,7 @@ walk :: proc(v: ^Visitor, node: ^Node) { } walk_expr_list(v, n.where_clauses) walk(v, n.fields) - case Union_Type: + case ^Union_Type: if n.poly_params != nil { walk(v, n.poly_params) } @@ -386,23 +386,23 @@ walk :: proc(v: ^Visitor, node: ^Node) { } walk_expr_list(v, n.where_clauses) walk_expr_list(v, n.variants) - case Enum_Type: + case ^Enum_Type: if n.base_type != nil { walk(v, n.base_type) } walk_expr_list(v, n.fields) - case Bit_Set_Type: + case ^Bit_Set_Type: walk(v, n.elem) if n.underlying != nil { walk(v, n.underlying) } - case Map_Type: + case ^Map_Type: walk(v, n.key) walk(v, n.value) - case Relative_Type: + case ^Relative_Type: walk(v, n.tag) walk(v, n.type) - case Matrix_Type: + case ^Matrix_Type: walk(v, n.row_count) walk(v, n.column_count) walk(v, n.elem) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index cc802e7d2..7cce986ae 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -195,10 +195,10 @@ parse_file :: proc(p: ^Parser, file: ^ast.File) -> bool { for p.curr_tok.kind != .EOF { stmt := parse_stmt(p) if stmt != nil { - if _, ok := stmt.derived.(ast.Empty_Stmt); !ok { + if _, ok := stmt.derived.(^ast.Empty_Stmt); !ok { append(&p.file.decls, stmt) - if es, es_ok := stmt.derived.(ast.Expr_Stmt); es_ok && es.expr != nil { - if _, pl_ok := es.expr.derived.(ast.Proc_Lit); pl_ok { + if es, es_ok := stmt.derived.(^ast.Expr_Stmt); es_ok && es.expr != nil { + if _, pl_ok := es.expr.derived.(^ast.Proc_Lit); pl_ok { error(p, stmt.pos, "procedure literal evaluated but not used") } } @@ -447,7 +447,7 @@ is_blank_ident_token :: proc(tok: tokenizer.Token) -> bool { return false } is_blank_ident_node :: proc(node: ^ast.Node) -> bool { - if ident, ok := node.derived.(ast.Ident); ok { + if ident, ok := node.derived.(^ast.Ident); ok { return is_blank_ident(ident.name) } return true @@ -490,34 +490,34 @@ is_semicolon_optional_for_node :: proc(p: ^Parser, node: ^ast.Node) -> bool { return true } - switch n in node.derived { - case ast.Empty_Stmt, ast.Block_Stmt: + #partial switch n in node.derived { + case ^ast.Empty_Stmt, ^ast.Block_Stmt: return true - case ast.If_Stmt, ast.When_Stmt, - ast.For_Stmt, ast.Range_Stmt, ast.Inline_Range_Stmt, - ast.Switch_Stmt, ast.Type_Switch_Stmt: + case ^ast.If_Stmt, ^ast.When_Stmt, + ^ast.For_Stmt, ^ast.Range_Stmt, ^ast.Inline_Range_Stmt, + ^ast.Switch_Stmt, ^ast.Type_Switch_Stmt: return true - case ast.Helper_Type: + case ^ast.Helper_Type: return is_semicolon_optional_for_node(p, n.type) - case ast.Distinct_Type: + case ^ast.Distinct_Type: return is_semicolon_optional_for_node(p, n.type) - case ast.Pointer_Type: + case ^ast.Pointer_Type: return is_semicolon_optional_for_node(p, n.elem) - case ast.Struct_Type, ast.Union_Type, ast.Enum_Type: + case ^ast.Struct_Type, ^ast.Union_Type, ^ast.Enum_Type: // Require semicolon within a procedure body return p.curr_proc == nil - case ast.Proc_Lit: + case ^ast.Proc_Lit: return true - case ast.Package_Decl, ast.Import_Decl, ast.Foreign_Import_Decl: + case ^ast.Package_Decl, ^ast.Import_Decl, ^ast.Foreign_Import_Decl: return true - case ast.Foreign_Block_Decl: + case ^ast.Foreign_Block_Decl: return is_semicolon_optional_for_node(p, n.body) - case ast.Value_Decl: + case ^ast.Value_Decl: if n.is_mutable { return false } @@ -629,10 +629,10 @@ parse_stmt_list :: proc(p: ^Parser) -> []^ast.Stmt { p.curr_tok.kind != .EOF { stmt := parse_stmt(p) if stmt != nil { - if _, ok := stmt.derived.(ast.Empty_Stmt); !ok { + if _, ok := stmt.derived.(^ast.Empty_Stmt); !ok { append(&list, stmt) - if es, es_ok := stmt.derived.(ast.Expr_Stmt); es_ok && es.expr != nil { - if _, pl_ok := es.expr.derived.(ast.Proc_Lit); pl_ok { + if es, es_ok := stmt.derived.(^ast.Expr_Stmt); es_ok && es.expr != nil { + if _, pl_ok := es.expr.derived.(^ast.Proc_Lit); pl_ok { error(p, stmt.pos, "procedure literal evaluated but not used") } } @@ -710,7 +710,7 @@ convert_stmt_to_expr :: proc(p: ^Parser, stmt: ^ast.Stmt, kind: string) -> ^ast. if stmt == nil { return nil } - if es, ok := stmt.derived.(ast.Expr_Stmt); ok { + if es, ok := stmt.derived.(^ast.Expr_Stmt); ok { return es.expr } error(p, stmt.pos, "expected %s, found a simple statement", kind) @@ -852,7 +852,7 @@ parse_for_stmt :: proc(p: ^Parser) -> ^ast.Stmt { if p.curr_tok.kind != .Semicolon { cond = parse_simple_stmt(p, {Stmt_Allow_Flag.In}) - if as, ok := cond.derived.(ast.Assign_Stmt); ok && as.op.kind == .In { + if as, ok := cond.derived.(^ast.Assign_Stmt); ok && as.op.kind == .In { is_range = true } } @@ -894,7 +894,7 @@ parse_for_stmt :: proc(p: ^Parser) -> ^ast.Stmt { if is_range { - assign_stmt := cond.derived.(ast.Assign_Stmt) + assign_stmt := cond.derived.(^ast.Assign_Stmt) vals := assign_stmt.lhs[:] rhs: ^ast.Expr @@ -975,7 +975,7 @@ parse_switch_stmt :: proc(p: ^Parser) -> ^ast.Stmt { tag = as } else { tag = parse_simple_stmt(p, {Stmt_Allow_Flag.In}) - if as, ok := tag.derived.(ast.Assign_Stmt); ok && as.op.kind == .In { + if as, ok := tag.derived.(^ast.Assign_Stmt); ok && as.op.kind == .In { is_type_switch = true } else if parse_control_statement_semicolon_separator(p) { init = tag @@ -1062,14 +1062,14 @@ parse_attribute :: proc(p: ^Parser, tok: tokenizer.Token, open_kind, close_kind: skip_possible_newline(p) decl := parse_stmt(p) - switch d in &decl.derived { - case ast.Value_Decl: + #partial switch d in decl.derived_stmt { + case ^ast.Value_Decl: if d.docs == nil { d.docs = docs } append(&d.attributes, attribute) - case ast.Foreign_Block_Decl: + case ^ast.Foreign_Block_Decl: if d.docs == nil { d.docs = docs } append(&d.attributes, attribute) - case ast.Foreign_Import_Decl: + case ^ast.Foreign_Import_Decl: if d.docs == nil { d.docs = docs } append(&d.attributes, attribute) case: @@ -1083,11 +1083,11 @@ parse_attribute :: proc(p: ^Parser, tok: tokenizer.Token, open_kind, close_kind: parse_foreign_block_decl :: proc(p: ^Parser) -> ^ast.Stmt { decl := parse_stmt(p) - switch in decl.derived { - case ast.Empty_Stmt, ast.Bad_Stmt, ast.Bad_Decl: + #partial switch in decl.derived_stmt { + case ^ast.Empty_Stmt, ^ast.Bad_Stmt, ^ast.Bad_Decl: // Ignore return nil - case ast.When_Stmt, ast.Value_Decl: + case ^ast.When_Stmt, ^ast.Value_Decl: return decl } @@ -1291,13 +1291,13 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt { case .Defer: tok := advance_token(p) stmt := parse_stmt(p) - switch s in stmt.derived { - case ast.Empty_Stmt: + #partial switch s in stmt.derived_stmt { + case ^ast.Empty_Stmt: error(p, s.pos, "empty statement after defer (e.g. ';')") - case ast.Defer_Stmt: + case ^ast.Defer_Stmt: error(p, s.pos, "you cannot defer a defer statement") stmt = s.stmt - case ast.Return_Stmt: + case ^ast.Return_Stmt: error(p, s.pos, "you cannot defer a return statement") } ds := ast.new(ast.Defer_Stmt, tok.pos, stmt.end) @@ -1369,8 +1369,8 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt { expect_token_after(p, .Colon, "identifier list") decl := parse_value_decl(p, list, docs) if decl != nil { - switch d in &decl.derived { - case ast.Value_Decl: + #partial switch d in decl.derived_stmt { + case ^ast.Value_Decl: d.is_using = true return decl } @@ -1401,9 +1401,9 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt { return stmt case "partial": stmt := parse_stmt(p) - switch s in &stmt.derived { - case ast.Switch_Stmt: s.partial = true - case ast.Type_Switch_Stmt: s.partial = true + #partial switch s in stmt.derived_stmt { + case ^ast.Switch_Stmt: s.partial = true + case ^ast.Type_Switch_Stmt: s.partial = true case: error(p, stmt.pos, "#partial can only be applied to a switch statement") } return stmt @@ -1548,11 +1548,11 @@ parse_body :: proc(p: ^Parser) -> ^ast.Block_Stmt { } convert_stmt_to_body :: proc(p: ^Parser, stmt: ^ast.Stmt) -> ^ast.Stmt { - switch s in stmt.derived { - case ast.Block_Stmt: + #partial switch s in stmt.derived_stmt { + case ^ast.Block_Stmt: error(p, stmt.pos, "expected a normal statement rather than a block statement") return stmt - case ast.Empty_Stmt: + case ^ast.Empty_Stmt: error(p, stmt.pos, "expected a non-empty statement") } @@ -1629,10 +1629,10 @@ convert_to_ident_list :: proc(p: ^Parser, list: []Expr_And_Flags, ignore_flags, id: ^ast.Expr = ident.expr - switch n in ident.expr.derived { - case ast.Ident: - case ast.Bad_Expr: - case ast.Poly_Type: + #partial switch n in ident.expr.derived_expr { + case ^ast.Ident: + case ^ast.Bad_Expr: + case ^ast.Poly_Type: if allow_poly_names { if n.specialization == nil { break @@ -1794,21 +1794,21 @@ check_procedure_name_list :: proc(p: ^Parser, names: []^ast.Expr) -> bool { return false } - _, first_is_polymorphic := names[0].derived.(ast.Poly_Type) + _, first_is_polymorphic := names[0].derived.(^ast.Poly_Type) any_polymorphic_names := first_is_polymorphic for i := 1; i < len(names); i += 1 { name := names[i] if first_is_polymorphic { - if _, ok := name.derived.(ast.Poly_Type); ok { + if _, ok := name.derived.(^ast.Poly_Type); ok { any_polymorphic_names = true } else { error(p, name.pos, "mixture of polymorphic and non-polymorphic identifiers") return any_polymorphic_names } } else { - if _, ok := name.derived.(ast.Poly_Type); ok { + if _, ok := name.derived.(^ast.Poly_Type); ok { any_polymorphic_names = true error(p, name.pos, "mixture of polymorphic and non-polymorphic identifiers") return any_polymorphic_names @@ -1873,7 +1873,7 @@ parse_field_list :: proc(p: ^Parser, follow: tokenizer.Token_Kind, allowed_flags if type == nil { return false } - _, ok := type.derived.(ast.Ellipsis) + _, ok := type.derived.(^ast.Ellipsis) return ok } @@ -1891,7 +1891,7 @@ parse_field_list :: proc(p: ^Parser, follow: tokenizer.Token_Kind, allowed_flags type = parse_var_type(p, allowed_flags) tt := ast.unparen_expr(type) if is_signature && !any_polymorphic_names { - if ti, ok := tt.derived.(ast.Typeid_Type); ok && ti.specialization != nil { + if ti, ok := tt.derived.(^ast.Typeid_Type); ok && ti.specialization != nil { error(p, tt.pos, "specialization of typeid is not allowed without polymorphic names") } } @@ -1967,7 +1967,7 @@ parse_field_list :: proc(p: ^Parser, follow: tokenizer.Token_Kind, allowed_flags p.curr_tok.kind != .EOF { prefix_flags := parse_field_prefixes(p) param := parse_var_type(p, allowed_flags & {.Typeid_Token, .Ellipsis}) - if _, ok := param.derived.(ast.Ellipsis); ok { + if _, ok := param.derived.(^ast.Ellipsis); ok { if seen_ellipsis { error(p, param.pos, "extra variadic parameter after ellipsis") } @@ -1994,8 +1994,8 @@ parse_field_list :: proc(p: ^Parser, follow: tokenizer.Token_Kind, allowed_flags names := make([]^ast.Expr, 1) names[0] = ast.new(ast.Ident, tok.pos, end_pos(tok)) - switch ident in &names[0].derived { - case ast.Ident: + #partial switch ident in names[0].derived_expr { + case ^ast.Ident: ident.name = tok.text case: unreachable() @@ -2125,12 +2125,12 @@ parse_proc_type :: proc(p: ^Parser, tok: tokenizer.Token) -> ^ast.Proc_Type { loop: for param in params.list { if param.type != nil { - if _, ok := param.type.derived.(ast.Poly_Type); ok { + if _, ok := param.type.derived.(^ast.Poly_Type); ok { is_generic = true break loop } for name in param.names { - if _, ok := name.derived.(ast.Poly_Type); ok { + if _, ok := name.derived.(^ast.Poly_Type); ok { is_generic = true break loop } @@ -2167,13 +2167,13 @@ parse_inlining_operand :: proc(p: ^Parser, lhs: bool, tok: tokenizer.Token) -> ^ } } - switch e in &ast.unparen_expr(expr).derived { - case ast.Proc_Lit: + #partial switch e in ast.unparen_expr(expr).derived_expr { + case ^ast.Proc_Lit: if e.inlining != .None && e.inlining != pi { error(p, expr.pos, "both 'inline' and 'no_inline' cannot be applied to a procedure literal") } e.inlining = pi - case ast.Call_Expr: + case ^ast.Call_Expr: if e.inlining != .None && e.inlining != pi { error(p, expr.pos, "both 'inline' and 'no_inline' cannot be applied to a procedure call") } @@ -2264,9 +2264,9 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { bd.name = name.text original_type := parse_type(p) type := ast.unparen_expr(original_type) - switch t in &type.derived { - case ast.Array_Type: t.tag = bd - case ast.Dynamic_Array_Type: t.tag = bd + #partial switch t in type.derived_expr { + case ^ast.Array_Type: t.tag = bd + case ^ast.Dynamic_Array_Type: t.tag = bd case: error(p, original_type.pos, "expected an array type after #%s", name.text) } @@ -2278,10 +2278,10 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { tag.name = name.text original_expr := parse_expr(p, lhs) expr := ast.unparen_expr(original_expr) - switch t in &expr.derived { - case ast.Comp_Lit: + #partial switch t in expr.derived_expr { + case ^ast.Comp_Lit: t.tag = tag - case ast.Array_Type: + case ^ast.Array_Type: t.tag = tag error(p, tok.pos, "#%s has been replaced with #sparse for non-contiguous enumerated array types", name.text) case: @@ -2296,8 +2296,8 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { tag.name = name.text original_type := parse_type(p) type := ast.unparen_expr(original_type) - switch t in &type.derived { - case ast.Array_Type: + #partial switch t in type.derived_expr { + case ^ast.Array_Type: t.tag = tag case: error(p, tok.pos, "expected an enumerated array type after #%s", name.text) @@ -2677,7 +2677,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { variants: [dynamic]^ast.Expr for p.curr_tok.kind != .Close_Brace && p.curr_tok.kind != .EOF { type := parse_type(p) - if _, ok := type.derived.(ast.Bad_Expr); !ok { + if _, ok := type.derived.(^ast.Bad_Expr); !ok { append(&variants, type) } if !allow_token(p, .Comma) { @@ -2852,19 +2852,19 @@ is_literal_type :: proc(expr: ^ast.Expr) -> bool { if val == nil { return false } - switch _ in val.derived { - case ast.Bad_Expr, - ast.Ident, - ast.Selector_Expr, - ast.Array_Type, - ast.Struct_Type, - ast.Union_Type, - ast.Enum_Type, - ast.Dynamic_Array_Type, - ast.Map_Type, - ast.Bit_Set_Type, - ast.Matrix_Type, - ast.Call_Expr: + #partial switch _ in val.derived_expr { + case ^ast.Bad_Expr, + ^ast.Ident, + ^ast.Selector_Expr, + ^ast.Array_Type, + ^ast.Struct_Type, + ^ast.Union_Type, + ^ast.Enum_Type, + ^ast.Dynamic_Array_Type, + ^ast.Map_Type, + ^ast.Bit_Set_Type, + ^ast.Matrix_Type, + ^ast.Call_Expr: return true } return false @@ -2986,7 +2986,7 @@ parse_call_expr :: proc(p: ^Parser, operand: ^ast.Expr) -> ^ast.Expr { ce.close = close.pos o := ast.unparen_expr(operand) - if se, ok := o.derived.(ast.Selector_Expr); ok && se.op.kind == .Arrow_Right { + if se, ok := o.derived.(^ast.Selector_Expr); ok && se.op.kind == .Arrow_Right { sce := ast.new(ast.Selector_Call_Expr, ce.pos, ce.end) sce.expr = o sce.call = ce @@ -3416,13 +3416,13 @@ parse_simple_stmt :: proc(p: ^Parser, flags: Stmt_Allow_Flags) -> ^ast.Stmt { stmt := parse_stmt(p) if stmt != nil { - switch n in &stmt.derived { - case ast.Block_Stmt: n.label = label - case ast.If_Stmt: n.label = label - case ast.For_Stmt: n.label = label - case ast.Switch_Stmt: n.label = label - case ast.Type_Switch_Stmt: n.label = label - case ast.Range_Stmt: n.label = label + #partial switch n in stmt.derived_stmt { + case ^ast.Block_Stmt: n.label = label + case ^ast.If_Stmt: n.label = label + case ^ast.For_Stmt: n.label = label + case ^ast.Switch_Stmt: n.label = label + case ^ast.Type_Switch_Stmt: n.label = label + case ^ast.Range_Stmt: n.label = label } } diff --git a/core/odin/printer/visit.odin b/core/odin/printer/visit.odin index 023583bde..9eba29987 100644 --- a/core/odin/printer/visit.odin +++ b/core/odin/printer/visit.odin @@ -342,16 +342,16 @@ visit_decl :: proc(p: ^Printer, decl: ^ast.Decl, called_in_stmt := false) { return } - switch v in &decl.derived { - case Expr_Stmt: + #partial switch v in decl.derived_stmt { + case ^Expr_Stmt: move_line(p, decl.pos) visit_expr(p, v.expr) if p.config.semicolons { push_generic_token(p, .Semicolon, 0) } - case When_Stmt: + case ^When_Stmt: visit_stmt(p, cast(^Stmt)decl) - case Foreign_Import_Decl: + case ^Foreign_Import_Decl: if len(v.attributes) > 0 { sort.sort(sort_attribute(&v.attributes)) move_line(p, v.attributes[0].pos) @@ -370,7 +370,7 @@ visit_decl :: proc(p: ^Printer, decl: ^ast.Decl, called_in_stmt := false) { for path in v.fullpaths { push_ident_token(p, path, 0) } - case Foreign_Block_Decl: + case ^Foreign_Block_Decl: if len(v.attributes) > 0 { sort.sort(sort_attribute(&v.attributes)) move_line(p, v.attributes[0].pos) @@ -383,7 +383,7 @@ visit_decl :: proc(p: ^Printer, decl: ^ast.Decl, called_in_stmt := false) { visit_expr(p, v.foreign_library) visit_stmt(p, v.body) - case Import_Decl: + case ^Import_Decl: move_line(p, decl.pos) if v.name.text != "" { @@ -395,7 +395,7 @@ visit_decl :: proc(p: ^Printer, decl: ^ast.Decl, called_in_stmt := false) { push_ident_token(p, v.fullpath, 1) } - case Value_Decl: + case ^Value_Decl: if len(v.attributes) > 0 { sort.sort(sort_attribute(&v.attributes)) move_line(p, v.attributes[0].pos) @@ -446,10 +446,10 @@ visit_decl :: proc(p: ^Printer, decl: ^ast.Decl, called_in_stmt := false) { add_semicolon := true for value in v.values { - switch a in value.derived { - case Union_Type, Enum_Type, Struct_Type: + #partial switch a in value.derived { + case ^Union_Type, ^Enum_Type, ^Struct_Type: add_semicolon = false || called_in_stmt - case Proc_Lit: + case ^Proc_Lit: add_semicolon = false } } @@ -516,23 +516,34 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener return } - switch v in stmt.derived { - case Import_Decl: - visit_decl(p, cast(^Decl)stmt, true) - return - case Value_Decl: - visit_decl(p, cast(^Decl)stmt, true) - return - case Foreign_Import_Decl: - visit_decl(p, cast(^Decl)stmt, true) - return - case Foreign_Block_Decl: - visit_decl(p, cast(^Decl)stmt, true) - return - } - switch v in stmt.derived { - case Using_Stmt: + switch v in stmt.derived_stmt { + case ^Bad_Stmt: + case ^Bad_Decl: + case ^Package_Decl: + + case ^Empty_Stmt: + push_generic_token(p, .Semicolon, 0) + case ^Tag_Stmt: + push_generic_token(p, .Hash, 1) + push_generic_token(p, v.op.kind, 1, v.op.text) + visit_stmt(p, v.stmt) + + + case ^Import_Decl: + visit_decl(p, cast(^Decl)stmt, true) + return + case ^Value_Decl: + visit_decl(p, cast(^Decl)stmt, true) + return + case ^Foreign_Import_Decl: + visit_decl(p, cast(^Decl)stmt, true) + return + case ^Foreign_Block_Decl: + visit_decl(p, cast(^Decl)stmt, true) + return + + case ^Using_Stmt: move_line(p, v.pos) push_generic_token(p, .Using, 1) @@ -542,7 +553,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener if p.config.semicolons { push_generic_token(p, .Semicolon, 0) } - case Block_Stmt: + case ^Block_Stmt: move_line(p, v.pos) if v.pos.line == v.end.line { @@ -572,7 +583,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener visit_end_brace(p, v.end) } } - case If_Stmt: + case ^If_Stmt: move_line(p, v.pos) if v.label != nil { @@ -595,7 +606,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener uses_do := false - if check_stmt, ok := v.body.derived.(Block_Stmt); ok && check_stmt.uses_do { + if check_stmt, ok := v.body.derived.(^Block_Stmt); ok && check_stmt.uses_do { uses_do = true } @@ -626,7 +637,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener visit_stmt(p, v.else_stmt) } - case Switch_Stmt: + case ^Switch_Stmt: move_line(p, v.pos) if v.label != nil { @@ -654,7 +665,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener visit_expr(p, v.cond) visit_stmt(p, v.body) - case Case_Clause: + case ^Case_Clause: move_line(p, v.pos) if !p.config.indent_cases { @@ -678,7 +689,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener if !p.config.indent_cases { indent(p) } - case Type_Switch_Stmt: + case ^Type_Switch_Stmt: move_line(p, v.pos) hint_current_line(p, {.Switch_Stmt}) @@ -696,7 +707,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener visit_stmt(p, v.tag) visit_stmt(p, v.body) - case Assign_Stmt: + case ^Assign_Stmt: move_line(p, v.pos) hint_current_line(p, {.Assign}) @@ -710,13 +721,13 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener if block_stmt && p.config.semicolons { push_generic_token(p, .Semicolon, 0) } - case Expr_Stmt: + case ^Expr_Stmt: move_line(p, v.pos) visit_expr(p, v.expr) if block_stmt && p.config.semicolons { push_generic_token(p, .Semicolon, 0) } - case For_Stmt: + case ^For_Stmt: // this should be simplified move_line(p, v.pos) @@ -753,7 +764,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener visit_stmt(p, v.body) - case Inline_Range_Stmt: + case ^Inline_Range_Stmt: move_line(p, v.pos) if v.label != nil { @@ -779,7 +790,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener visit_expr(p, v.expr) visit_stmt(p, v.body) - case Range_Stmt: + case ^Range_Stmt: move_line(p, v.pos) if v.label != nil { @@ -805,7 +816,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener visit_expr(p, v.expr) visit_stmt(p, v.body) - case Return_Stmt: + case ^Return_Stmt: move_line(p, v.pos) push_generic_token(p, .Return, 1) @@ -817,7 +828,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener if block_stmt && p.config.semicolons { push_generic_token(p, .Semicolon, 0) } - case Defer_Stmt: + case ^Defer_Stmt: move_line(p, v.pos) push_generic_token(p, .Defer, 0) @@ -826,7 +837,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener if p.config.semicolons { push_generic_token(p, .Semicolon, 0) } - case When_Stmt: + case ^When_Stmt: move_line(p, v.pos) push_generic_token(p, .When, 1) visit_expr(p, v.cond) @@ -846,7 +857,7 @@ visit_stmt :: proc(p: ^Printer, stmt: ^ast.Stmt, block_type: Block_Type = .Gener visit_stmt(p, v.else_stmt) } - case Branch_Stmt: + case ^Branch_Stmt: move_line(p, v.pos) push_generic_token(p, v.tok.kind, 0) @@ -918,8 +929,15 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { set_source_position(p, expr.pos) - switch v in expr.derived { - case Inline_Asm_Expr: + switch v in expr.derived_expr { + case ^Bad_Expr: + + case ^Tag_Expr: + push_generic_token(p, .Hash, 1) + push_generic_token(p, v.op.kind, 1, v.op.text) + visit_expr(p, v.expr) + + case ^Inline_Asm_Expr: push_generic_token(p, v.tok.kind, 1, v.tok.text) push_generic_token(p, .Open_Paren, 1) @@ -936,42 +954,42 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { push_generic_token(p, .Comma, 0) visit_expr(p, v.constraints_string) push_generic_token(p, .Close_Brace, 0) - case Undef: + case ^Undef: push_generic_token(p, .Undef, 1) - case Auto_Cast: + case ^Auto_Cast: push_generic_token(p, v.op.kind, 1) visit_expr(p, v.expr) - case Ternary_If_Expr: + case ^Ternary_If_Expr: visit_expr(p, v.x) push_generic_token(p, v.op1.kind, 1) visit_expr(p, v.cond) push_generic_token(p, v.op2.kind, 1) visit_expr(p, v.y) - case Ternary_When_Expr: + case ^Ternary_When_Expr: visit_expr(p, v.x) push_generic_token(p, v.op1.kind, 1) visit_expr(p, v.cond) push_generic_token(p, v.op2.kind, 1) visit_expr(p, v.y) - case Or_Else_Expr: + case ^Or_Else_Expr: visit_expr(p, v.x) push_generic_token(p, v.token.kind, 1) visit_expr(p, v.y) - case Or_Return_Expr: + case ^Or_Return_Expr: visit_expr(p, v.expr) push_generic_token(p, v.token.kind, 1) - case Selector_Call_Expr: + case ^Selector_Call_Expr: visit_expr(p, v.call.expr) push_generic_token(p, .Open_Paren, 1) visit_exprs(p, v.call.args, {.Add_Comma}) push_generic_token(p, .Close_Paren, 0) - case Ellipsis: + case ^Ellipsis: push_generic_token(p, .Ellipsis, 1) visit_expr(p, v.expr) - case Relative_Type: + case ^Relative_Type: visit_expr(p, v.tag) visit_expr(p, v.type) - case Slice_Expr: + case ^Slice_Expr: visit_expr(p, v.expr) push_generic_token(p, .Open_Bracket, 0) visit_expr(p, v.low) @@ -981,37 +999,37 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { visit_expr(p, v.high) } push_generic_token(p, .Close_Bracket, 0) - case Ident: + case ^Ident: if .Enforce_Poly_Names in options { push_generic_token(p, .Dollar, 1) push_ident_token(p, v.name, 0) } else { push_ident_token(p, v.name, 1) } - case Deref_Expr: + case ^Deref_Expr: visit_expr(p, v.expr) push_generic_token(p, v.op.kind, 0) - case Type_Cast: + case ^Type_Cast: push_generic_token(p, v.tok.kind, 1) push_generic_token(p, .Open_Paren, 0) visit_expr(p, v.type) push_generic_token(p, .Close_Paren, 0) merge_next_token(p) visit_expr(p, v.expr) - case Basic_Directive: + case ^Basic_Directive: push_generic_token(p, v.tok.kind, 1) push_ident_token(p, v.name, 0) - case Distinct_Type: + case ^Distinct_Type: push_generic_token(p, .Distinct, 1) visit_expr(p, v.type) - case Dynamic_Array_Type: + case ^Dynamic_Array_Type: visit_expr(p, v.tag) push_generic_token(p, .Open_Bracket, 1) push_generic_token(p, .Dynamic, 0) push_generic_token(p, .Close_Bracket, 0) merge_next_token(p) visit_expr(p, v.elem) - case Bit_Set_Type: + case ^Bit_Set_Type: push_generic_token(p, .Bit_Set, 1) push_generic_token(p, .Open_Bracket, 0) @@ -1023,7 +1041,7 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { } push_generic_token(p, .Close_Bracket, 0) - case Union_Type: + case ^Union_Type: push_generic_token(p, .Union, 1) push_poly_params(p, v.poly_params) @@ -1045,7 +1063,7 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { visit_exprs(p, v.variants, {.Add_Comma, .Trailing}) visit_end_brace(p, v.end) } - case Enum_Type: + case ^Enum_Type: push_generic_token(p, .Enum, 1) hint_current_line(p, {.Enum}) @@ -1068,7 +1086,7 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { } set_source_position(p, v.end) - case Struct_Type: + case ^Struct_Type: push_generic_token(p, .Struct, 1) hint_current_line(p, {.Struct}) @@ -1103,7 +1121,7 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { } set_source_position(p, v.end) - case Proc_Lit: + case ^Proc_Lit: switch v.inlining { case .None: case .Inline: @@ -1112,7 +1130,7 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { push_ident_token(p, "#force_no_inline", 0) } - visit_proc_type(p, v.type^, true) + visit_proc_type(p, v.type, true) push_where_clauses(p, v.where_clauses) @@ -1122,16 +1140,16 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { } else { push_generic_token(p, .Undef, 1) } - case Proc_Type: + case ^Proc_Type: visit_proc_type(p, v) - case Basic_Lit: + case ^Basic_Lit: push_generic_token(p, v.tok.kind, 1, v.tok.text) - case Binary_Expr: + case ^Binary_Expr: visit_binary_expr(p, v) - case Implicit_Selector_Expr: + case ^Implicit_Selector_Expr: push_generic_token(p, .Period, 1) push_ident_token(p, v.field.name, 0) - case Call_Expr: + case ^Call_Expr: visit_expr(p, v.expr) push_format_token(p, @@ -1146,27 +1164,34 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { visit_call_exprs(p, v.args, v.ellipsis.kind == .Ellipsis) push_generic_token(p, .Close_Paren, 0) - case Typeid_Type: + case ^Typeid_Type: push_generic_token(p, .Typeid, 1) if v.specialization != nil { push_generic_token(p, .Quo, 0) visit_expr(p, v.specialization) } - case Selector_Expr: + case ^Selector_Expr: visit_expr(p, v.expr) push_generic_token(p, v.op.kind, 0) visit_expr(p, v.field) - case Paren_Expr: + case ^Paren_Expr: push_generic_token(p, .Open_Paren, 1) visit_expr(p, v.expr) push_generic_token(p, .Close_Paren, 0) - case Index_Expr: + case ^Index_Expr: visit_expr(p, v.expr) push_generic_token(p, .Open_Bracket, 0) visit_expr(p, v.index) push_generic_token(p, .Close_Bracket, 0) - case Proc_Group: + case ^Matrix_Index_Expr: + visit_expr(p, v.expr) + push_generic_token(p, .Open_Bracket, 0) + visit_expr(p, v.row_index) + push_generic_token(p, .Comma, 0) + visit_expr(p, v.column_index) + push_generic_token(p, .Close_Bracket, 0) + case ^Proc_Group: push_generic_token(p, v.tok.kind, 1) if len(v.args) != 0 && v.pos.line != v.args[len(v.args) - 1].pos.line { @@ -1181,7 +1206,7 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { push_generic_token(p, .Close_Brace, 0) } - case Comp_Lit: + case ^Comp_Lit: if v.type != nil { visit_expr(p, v.type) } @@ -1198,18 +1223,18 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { push_generic_token(p, .Close_Brace, 0) } - case Unary_Expr: + case ^Unary_Expr: push_generic_token(p, v.op.kind, 1) merge_next_token(p) visit_expr(p, v.expr) - case Field_Value: + case ^Field_Value: visit_expr(p, v.field) push_generic_token(p, .Eq, 1) visit_expr(p, v.value) - case Type_Assertion: + case ^Type_Assertion: visit_expr(p, v.expr) - if unary, ok := v.type.derived.(Unary_Expr); ok && unary.op.text == "?" { + if unary, ok := v.type.derived.(^Unary_Expr); ok && unary.op.text == "?" { push_generic_token(p, .Period, 0) visit_expr(p, v.type) } else { @@ -1219,13 +1244,13 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { push_generic_token(p, .Close_Paren, 0) } - case Pointer_Type: + case ^Pointer_Type: push_generic_token(p, .Pointer, 1) merge_next_token(p) visit_expr(p, v.elem) - case Implicit: + case ^Implicit: push_generic_token(p, v.tok.kind, 1) - case Poly_Type: + case ^Poly_Type: push_generic_token(p, .Dollar, 1) merge_next_token(p) visit_expr(p, v.type) @@ -1235,22 +1260,35 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, options := List_Options{}) { merge_next_token(p) visit_expr(p, v.specialization) } - case Array_Type: + case ^Array_Type: visit_expr(p, v.tag) push_generic_token(p, .Open_Bracket, 1) visit_expr(p, v.len) push_generic_token(p, .Close_Bracket, 0) merge_next_token(p) visit_expr(p, v.elem) - case Map_Type: + case ^Map_Type: push_generic_token(p, .Map, 1) push_generic_token(p, .Open_Bracket, 0) visit_expr(p, v.key) push_generic_token(p, .Close_Bracket, 0) merge_next_token(p) visit_expr(p, v.value) - case Helper_Type: + case ^Helper_Type: visit_expr(p, v.type) + case ^Multi_Pointer_Type: + push_generic_token(p, .Open_Bracket, 1) + push_generic_token(p, .Pointer, 0) + push_generic_token(p, .Close_Bracket, 0) + visit_expr(p, v.elem) + case ^Matrix_Type: + push_generic_token(p, .Matrix, 1) + push_generic_token(p, .Open_Bracket, 0) + visit_expr(p, v.row_count) + push_generic_token(p, .Comma, 0) + visit_expr(p, v.column_count) + push_generic_token(p, .Close_Bracket, 0) + visit_expr(p, v.elem) case: panic(fmt.aprint(expr.derived)) } @@ -1348,7 +1386,7 @@ visit_field_list :: proc(p: ^Printer, list: ^ast.Field_List, options := List_Opt } } -visit_proc_type :: proc(p: ^Printer, proc_type: ast.Proc_Type, is_proc_lit := false) { +visit_proc_type :: proc(p: ^Printer, proc_type: ^ast.Proc_Type, is_proc_lit := false) { if is_proc_lit { push_format_token(p, Format_Token { kind = .Proc, @@ -1392,7 +1430,7 @@ visit_proc_type :: proc(p: ^Printer, proc_type: ast.Proc_Type, is_proc_lit := fa } else if len(proc_type.results.list) == 1 { for name in proc_type.results.list[0].names { - if ident, ok := name.derived.(ast.Ident); ok { + if ident, ok := name.derived.(^ast.Ident); ok { if ident.name != "_" { use_parens = true } @@ -1410,19 +1448,19 @@ visit_proc_type :: proc(p: ^Printer, proc_type: ast.Proc_Type, is_proc_lit := fa } } -visit_binary_expr :: proc(p: ^Printer, binary: ast.Binary_Expr) { +visit_binary_expr :: proc(p: ^Printer, binary: ^ast.Binary_Expr) { move_line(p, binary.left.pos) - if v, ok := binary.left.derived.(ast.Binary_Expr); ok { + if v, ok := binary.left.derived.(^ast.Binary_Expr); ok { visit_binary_expr(p, v) } else { visit_expr(p, binary.left) } either_implicit_selector := false - if _, ok := binary.left.derived.(ast.Implicit_Selector_Expr); ok { + if _, ok := binary.left.derived.(^ast.Implicit_Selector_Expr); ok { either_implicit_selector = true - } else if _, ok := binary.right.derived.(ast.Implicit_Selector_Expr); ok { + } else if _, ok := binary.right.derived.(^ast.Implicit_Selector_Expr); ok { either_implicit_selector = true } @@ -1439,7 +1477,7 @@ visit_binary_expr :: proc(p: ^Printer, binary: ast.Binary_Expr) { move_line(p, binary.right.pos) - if v, ok := binary.right.derived.(ast.Binary_Expr); ok { + if v, ok := binary.right.derived.(^ast.Binary_Expr); ok { visit_binary_expr(p, v) } else { visit_expr(p, binary.right) @@ -1499,7 +1537,7 @@ visit_signature_list :: proc(p: ^Printer, list: ^ast.Field_List, remove_blank := named := false for name in field.names { - if ident, ok := name.derived.(ast.Ident); ok { + if ident, ok := name.derived.(^ast.Ident); ok { //for some reason the parser uses _ to mean empty if ident.name != "_" || !remove_blank { named = true From 5676c9e7ebcec9af526c59ece1faf2e8b15e457c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Fri, 25 Feb 2022 08:49:25 +0000 Subject: [PATCH 02/74] initial OpenBSD support --- Makefile | 6 + core/c/libc/errno.odin | 13 + core/c/libc/stdio.odin | 25 + core/c/libc/time.odin | 9 +- core/c/libc/wctype.odin | 5 + core/crypto/rand_generic.odin | 2 +- core/crypto/rand_openbsd.odin | 12 + core/dynlib/lib_unix.odin | 2 +- core/os/dir_openbsd.odin | 71 +++ core/os/os_openbsd.odin | 706 +++++++++++++++++++++++ core/os/stat_unix.odin | 2 +- core/path/filepath/path_unix.odin | 7 +- core/runtime/entry_unix.odin | 2 +- core/sync/channel_unix.odin | 2 +- core/sync/sync2/futex_openbsd.odin | 78 +++ core/sync/sync2/primitives_openbsd.odin | 9 + core/sync/sync2/primitives_pthreads.odin | 2 +- core/sync/sync_openbsd.odin | 36 ++ core/sync/sync_unix.odin | 2 +- core/sys/unix/pthread_openbsd.odin | 65 +++ core/sys/unix/pthread_unix.odin | 2 +- core/thread/thread_unix.odin | 2 +- core/time/time_unix.odin | 34 +- src/bug_report.cpp | 14 +- src/build_settings.cpp | 18 + src/check_builtin.cpp | 1 + src/checker.cpp | 1 + src/common.cpp | 2 +- src/gb/gb.h | 46 +- src/threading.cpp | 2 +- 30 files changed, 1151 insertions(+), 27 deletions(-) create mode 100644 core/crypto/rand_openbsd.odin create mode 100644 core/os/dir_openbsd.odin create mode 100644 core/os/os_openbsd.odin create mode 100644 core/sync/sync2/futex_openbsd.odin create mode 100644 core/sync/sync2/primitives_openbsd.odin create mode 100644 core/sync/sync_openbsd.odin create mode 100644 core/sys/unix/pthread_openbsd.odin diff --git a/Makefile b/Makefile index d3d3c6a2d..99c71ccd9 100644 --- a/Makefile +++ b/Makefile @@ -58,6 +58,12 @@ ifeq ($(OS), Linux) CFLAGS:=$(CFLAGS) $(shell $(LLVM_CONFIG) --cxxflags --ldflags) LDFLAGS:=$(LDFLAGS) $(shell $(LLVM_CONFIG) --libs core native --system-libs) endif +ifeq ($(OS), OpenBSD) + LLVM_CONFIG=/usr/local/bin/llvm-config + + CFLAGS:=$(CFLAGS) $(shell $(LLVM_CONFIG) --cxxflags --ldflags) + LDFLAGS:=$(LDFLAGS) -liconv $(shell $(LLVM_CONFIG) --libs core native --system-libs) +endif all: debug demo diff --git a/core/c/libc/errno.odin b/core/c/libc/errno.odin index ecde6af59..53437f42f 100644 --- a/core/c/libc/errno.odin +++ b/core/c/libc/errno.odin @@ -27,6 +27,19 @@ when ODIN_OS == .Linux || ODIN_OS == .FreeBSD { ERANGE :: 34 } +when ODIN_OS == .OpenBSD { + @(private="file") + @(default_calling_convention="c") + foreign libc { + @(link_name="__errno") + _get_errno :: proc() -> ^int --- + } + + EDOM :: 33 + EILSEQ :: 84 + ERANGE :: 34 +} + when ODIN_OS == .Windows { @(private="file") @(default_calling_convention="c") diff --git a/core/c/libc/stdio.odin b/core/c/libc/stdio.odin index 9c4a1a708..fc65b954a 100644 --- a/core/c/libc/stdio.odin +++ b/core/c/libc/stdio.odin @@ -78,6 +78,31 @@ when ODIN_OS == .Linux { } } +when ODIN_OS == .OpenBSD { + fpos_t :: i64 + + _IOFBF :: 0 + _IOLBF :: 1 + _IONBF :: 1 + + BUFSIZ :: 1024 + + EOF :: int(-1) + + FOPEN_MAX :: 20 + FILENAME_MAX :: 1024 + + SEEK_SET :: 0 + SEEK_CUR :: 1 + SEEK_END :: 2 + + foreign libc { + stderr: ^FILE + stdin: ^FILE + stdout: ^FILE + } +} + when ODIN_OS == .Darwin { fpos_t :: distinct i64 diff --git a/core/c/libc/time.odin b/core/c/libc/time.odin index b3539a227..b337e139a 100644 --- a/core/c/libc/time.odin +++ b/core/c/libc/time.odin @@ -45,7 +45,7 @@ when ODIN_OS == .Windows { } } -when ODIN_OS == .Linux || ODIN_OS == .FreeBSD || ODIN_OS == .Darwin { +when ODIN_OS == .Linux || ODIN_OS == .FreeBSD || ODIN_OS == .Darwin || ODIN_OS == .OpenBSD { @(default_calling_convention="c") foreign libc { // 7.27.2 Time manipulation functions @@ -63,7 +63,12 @@ when ODIN_OS == .Linux || ODIN_OS == .FreeBSD || ODIN_OS == .Darwin { strftime :: proc(s: [^]char, maxsize: size_t, format: cstring, timeptr: ^tm) -> size_t --- } - CLOCKS_PER_SEC :: 1000000 + when ODIN_OS == .OpenBSD { + CLOCKS_PER_SEC :: 100 + } else { + CLOCKS_PER_SEC :: 1000000 + } + TIME_UTC :: 1 time_t :: distinct i64 diff --git a/core/c/libc/wctype.odin b/core/c/libc/wctype.odin index 942726ba6..f833af51f 100644 --- a/core/c/libc/wctype.odin +++ b/core/c/libc/wctype.odin @@ -25,6 +25,11 @@ when ODIN_OS == .Darwin { wctype_t :: distinct u32 } +when ODIN_OS == .OpenBSD { + wctrans_t :: distinct rawptr + wctype_t :: distinct rawptr +} + @(default_calling_convention="c") foreign libc { // 7.30.2.1 Wide character classification functions diff --git a/core/crypto/rand_generic.odin b/core/crypto/rand_generic.odin index be6987ee2..10edc1c8a 100644 --- a/core/crypto/rand_generic.odin +++ b/core/crypto/rand_generic.odin @@ -1,6 +1,6 @@ package crypto -when ODIN_OS != .Linux { +when ODIN_OS != .Linux && ODIN_OS != .OpenBSD { _rand_bytes :: proc (dst: []byte) { unimplemented("crypto: rand_bytes not supported on this OS") } diff --git a/core/crypto/rand_openbsd.odin b/core/crypto/rand_openbsd.odin new file mode 100644 index 000000000..bae97e8f0 --- /dev/null +++ b/core/crypto/rand_openbsd.odin @@ -0,0 +1,12 @@ +package crypto + +import "core:c" + +foreign import libc "system:c" +foreign libc { + arc4random_buf :: proc "c" (buf: rawptr, nbytes: c.size_t) --- +} + +_rand_bytes :: proc (dst: []byte) { + arc4random_buf(raw_data(dst), len(dst)) +} diff --git a/core/dynlib/lib_unix.odin b/core/dynlib/lib_unix.odin index bb8affb79..e52ade153 100644 --- a/core/dynlib/lib_unix.odin +++ b/core/dynlib/lib_unix.odin @@ -1,4 +1,4 @@ -// +build linux, darwin, freebsd +// +build linux, darwin, freebsd, openbsd package dynlib import "core:os" diff --git a/core/os/dir_openbsd.odin b/core/os/dir_openbsd.odin new file mode 100644 index 000000000..465fd35ae --- /dev/null +++ b/core/os/dir_openbsd.odin @@ -0,0 +1,71 @@ +package os + +import "core:strings" +import "core:mem" + +read_dir :: proc(fd: Handle, n: int, allocator := context.allocator) -> (fi: []File_Info, err: Errno) { + dirp: Dir + dirp, err = _fdopendir(fd) + if err != ERROR_NONE { + return + } + + defer _closedir(dirp) + + // XXX OpenBSD + dirpath: string + dirpath, err = absolute_path_from_handle(fd) + + if err != ERROR_NONE { + return + } + + defer delete(dirpath) + + n := n + size := n + if n <= 0 { + n = -1 + size = 100 + } + + dfi := make([dynamic]File_Info, 0, size, allocator) + + for { + entry: Dirent + end_of_stream: bool + entry, err, end_of_stream = _readdir(dirp) + if err != ERROR_NONE { + for fi_ in dfi { + file_info_delete(fi_, allocator) + } + delete(dfi) + return + } else if end_of_stream { + break + } + + fi_: File_Info + filename := cast(string)(transmute(cstring)mem.Raw_Cstring{ data = &entry.name[0] }) + + if filename == "." || filename == ".." { + continue + } + + fullpath := strings.join( []string{ dirpath, filename }, "/", context.temp_allocator) + defer delete(fullpath, context.temp_allocator) + + fi_, err = stat(fullpath, allocator) + if err != ERROR_NONE { + for fi__ in dfi { + file_info_delete(fi__, allocator) + } + delete(dfi) + return + } + + append(&dfi, fi_) + } + + return dfi[:], ERROR_NONE +} diff --git a/core/os/os_openbsd.odin b/core/os/os_openbsd.odin new file mode 100644 index 000000000..3862851a1 --- /dev/null +++ b/core/os/os_openbsd.odin @@ -0,0 +1,706 @@ +package os + +foreign import libc "system:c" + +import "core:runtime" +import "core:strings" +import "core:c" + +Handle :: distinct i32 +Pid :: distinct i32 +File_Time :: distinct u64 +Errno :: distinct i32 + +INVALID_HANDLE :: ~Handle(0) + +ERROR_NONE: Errno: 0 + +EPERM: Errno: 1 +ENOENT: Errno: 2 +ESRCH: Errno: 3 +EINTR: Errno: 4 +EIO: Errno: 5 +ENXIO: Errno: 6 +E2BIG: Errno: 7 +ENOEXEC: Errno: 8 +EBADF: Errno: 9 +ECHILD: Errno: 10 +EDEADLK: Errno: 11 +ENOMEM: Errno: 12 +EACCES: Errno: 13 +EFAULT: Errno: 14 +ENOTBLK: Errno: 15 +EBUSY: Errno: 16 +EEXIST: Errno: 17 +EXDEV: Errno: 18 +ENODEV: Errno: 19 +ENOTDIR: Errno: 20 +EISDIR: Errno: 21 +EINVAL: Errno: 22 +ENFILE: Errno: 23 +EMFILE: Errno: 24 +ENOTTY: Errno: 25 +ETXTBSY: Errno: 26 +EFBIG: Errno: 27 +ENOSPC: Errno: 28 +ESPIPE: Errno: 29 +EROFS: Errno: 30 +EMLINK: Errno: 31 +EPIPE: Errno: 32 +EDOM: Errno: 33 +ERANGE: Errno: 34 +EAGAIN: Errno: 35 +EWOULDBLOCK: Errno: EAGAIN +EINPROGRESS: Errno: 36 +EALREADY: Errno: 37 +ENOTSOCK: Errno: 38 +EDESTADDRREQ: Errno: 39 +EMSGSIZE: Errno: 40 +EPROTOTYPE: Errno: 41 +ENOPROTOOPT: Errno: 42 +EPROTONOSUPPORT: Errno: 43 +ESOCKTNOSUPPORT: Errno: 44 +EOPNOTSUPP: Errno: 45 +EPFNOSUPPORT: Errno: 46 +EAFNOSUPPORT: Errno: 47 +EADDRINUSE: Errno: 48 +EADDRNOTAVAIL: Errno: 49 +ENETDOWN: Errno: 50 +ENETUNREACH: Errno: 51 +ENETRESET: Errno: 52 +ECONNABORTED: Errno: 53 +ECONNRESET: Errno: 54 +ENOBUFS: Errno: 55 +EISCONN: Errno: 56 +ENOTCONN: Errno: 57 +ESHUTDOWN: Errno: 58 +ETOOMANYREFS: Errno: 59 +ETIMEDOUT: Errno: 60 +ECONNREFUSED: Errno: 61 +ELOOP: Errno: 62 +ENAMETOOLONG: Errno: 63 +EHOSTDOWN: Errno: 64 +EHOSTUNREACH: Errno: 65 +ENOTEMPTY: Errno: 66 +EPROCLIM: Errno: 67 +EUSERS: Errno: 68 +EDQUOT: Errno: 69 +ESTALE: Errno: 70 +EREMOTE: Errno: 71 +EBADRPC: Errno: 72 +ERPCMISMATCH: Errno: 73 +EPROGUNAVAIL: Errno: 74 +EPROGMISMATCH: Errno: 75 +EPROCUNAVAIL: Errno: 76 +ENOLCK: Errno: 77 +ENOSYS: Errno: 78 +EFTYPE: Errno: 79 +EAUTH: Errno: 80 +ENEEDAUTH: Errno: 81 +EIPSEC: Errno: 82 +ENOATTR: Errno: 83 +EILSEQ: Errno: 84 +ENOMEDIUM: Errno: 85 +EMEDIUMTYPE: Errno: 86 +EOVERFLOW: Errno: 87 +ECANCELED: Errno: 88 +EIDRM: Errno: 89 +ENOMSG: Errno: 90 +ENOTSUP: Errno: 91 +EBADMSG: Errno: 92 +ENOTRECOVERABLE: Errno: 93 +EOWNERDEAD: Errno: 94 +EPROTO: Errno: 95 + +O_RDONLY :: 0x00000 +O_WRONLY :: 0x00001 +O_RDWR :: 0x00002 +O_NONBLOCK :: 0x00004 +O_APPEND :: 0x00008 +O_ASYNC :: 0x00040 +O_SYNC :: 0x00080 +O_CREATE :: 0x00200 +O_TRUNC :: 0x00400 +O_EXCL :: 0x00800 +O_NOCTTY :: 0x08000 +O_CLOEXEC :: 0x10000 + +SEEK_SET :: 0 +SEEK_CUR :: 1 +SEEK_END :: 2 + +RTLD_LAZY :: 0x001 +RTLD_NOW :: 0x002 +RTLD_LOCAL :: 0x000 +RTLD_GLOBAL :: 0x100 +RTLD_TRACE :: 0x200 +RTLD_NODELETE :: 0x400 + +MAX_PATH :: 1024 + +// "Argv" arguments converted to Odin strings +args := _alloc_command_line_arguments() + +pid_t :: i32 +time_t :: i64 +mode_t :: u32 +dev_t :: i32 +ino_t :: u64 +nlink_t :: u32 +uid_t :: u32 +gid_t :: u32 +off_t :: i64 +blkcnt_t :: u64 +blksize_t :: i32 + +Unix_File_Time :: struct { + seconds: time_t, + nanoseconds: c.long, +} + +OS_Stat :: struct { + mode: mode_t, // inode protection mode + device_id: dev_t, // inode's device + serial: ino_t, // inode's number + nlink: nlink_t, // number of hard links + uid: uid_t, // user ID of the file's owner + gid: gid_t, // group ID of the file's group + rdev: dev_t, // device type + + last_access: Unix_File_Time, // time of last access + modified: Unix_File_Time, // time of last data modification + status_change: Unix_File_Time, // time of last file status change + + size: off_t, // file size, in bytes + blocks: blkcnt_t, // blocks allocated for file + block_size: blksize_t, // optimal blocksize for I/O + + flags: u32, // user defined flags for file + gen: u32, // file generation number + birthtime: Unix_File_Time, // time of file creation +} + +MAXNAMLEN :: 255 + +// NOTE(laleksic, 2021-01-21): Comment and rename these to match OS_Stat above +Dirent :: struct { + ino: ino_t, // file number of entry + off: off_t, // offset after this entry + reclen: u16, // length of this record + type: u8, // file type + namlen: u8, // length of string in name + _padding: [4]u8, + name: [MAXNAMLEN + 1]byte, // name +} + +Dir :: distinct rawptr // DIR* + +// File type +S_IFMT :: 0o170000 // Type of file mask +S_IFIFO :: 0o010000 // Named pipe (fifo) +S_IFCHR :: 0o020000 // Character special +S_IFDIR :: 0o040000 // Directory +S_IFBLK :: 0o060000 // Block special +S_IFREG :: 0o100000 // Regular +S_IFLNK :: 0o120000 // Symbolic link +S_IFSOCK :: 0o140000 // Socket +S_ISVTX :: 0o001000 // Save swapped text even after use + +// File mode + // Read, write, execute/search by owner +S_IRWXU :: 0o0700 // RWX mask for owner +S_IRUSR :: 0o0400 // R for owner +S_IWUSR :: 0o0200 // W for owner +S_IXUSR :: 0o0100 // X for owner + + // Read, write, execute/search by group +S_IRWXG :: 0o0070 // RWX mask for group +S_IRGRP :: 0o0040 // R for group +S_IWGRP :: 0o0020 // W for group +S_IXGRP :: 0o0010 // X for group + + // Read, write, execute/search by others +S_IRWXO :: 0o0007 // RWX mask for other +S_IROTH :: 0o0004 // R for other +S_IWOTH :: 0o0002 // W for other +S_IXOTH :: 0o0001 // X for other + +S_ISUID :: 0o4000 // Set user id on execution +S_ISGID :: 0o2000 // Set group id on execution +S_ISTXT :: 0o1000 // Sticky bit + +S_ISLNK :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFLNK } +S_ISREG :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFREG } +S_ISDIR :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFDIR } +S_ISCHR :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFCHR } +S_ISBLK :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFBLK } +S_ISFIFO :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFIFO } +S_ISSOCK :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFSOCK } + +F_OK :: 0x00 // Test for file existance +X_OK :: 0x01 // Test for execute permission +W_OK :: 0x02 // Test for write permission +R_OK :: 0x04 // Test for read permission + +AT_FDCWD :: -100 +AT_EACCESS :: 0x01 +AT_SYMLINK_NOFOLLOW :: 0x02 +AT_SYMLINK_FOLLOW :: 0x04 +AT_REMOVEDIR :: 0x08 + +@(default_calling_convention="c") +foreign libc { + @(link_name="__errno") __errno :: proc() -> ^int --- + + @(link_name="fork") _unix_fork :: proc() -> pid_t --- + @(link_name="getthrid") _unix_getthrid :: proc() -> int --- + + @(link_name="open") _unix_open :: proc(path: cstring, flags: c.int, mode: c.int) -> Handle --- + @(link_name="close") _unix_close :: proc(fd: Handle) -> c.int --- + @(link_name="read") _unix_read :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t --- + @(link_name="write") _unix_write :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t --- + @(link_name="lseek") _unix_seek :: proc(fd: Handle, offset: off_t, whence: c.int) -> off_t --- + @(link_name="stat") _unix_stat :: proc(path: cstring, sb: ^OS_Stat) -> c.int --- + @(link_name="fstat") _unix_fstat :: proc(fd: Handle, sb: ^OS_Stat) -> c.int --- + @(link_name="lstat") _unix_lstat :: proc(path: cstring, sb: ^OS_Stat) -> c.int --- + @(link_name="readlink") _unix_readlink :: proc(path: cstring, buf: ^byte, bufsiz: c.size_t) -> c.ssize_t --- + @(link_name="access") _unix_access :: proc(path: cstring, mask: c.int) -> c.int --- + @(link_name="getcwd") _unix_getcwd :: proc(buf: cstring, len: c.size_t) -> cstring --- + @(link_name="chdir") _unix_chdir :: proc(path: cstring) -> c.int --- + @(link_name="rename") _unix_rename :: proc(old, new: cstring) -> c.int --- + @(link_name="unlink") _unix_unlink :: proc(path: cstring) -> c.int --- + @(link_name="rmdir") _unix_rmdir :: proc(path: cstring) -> c.int --- + @(link_name="mkdir") _unix_mkdir :: proc(path: cstring, mode: mode_t) -> c.int --- + + @(link_name="getpagesize") _unix_getpagesize :: proc() -> c.int --- + @(link_name="fdopendir") _unix_fdopendir :: proc(fd: Handle) -> Dir --- + @(link_name="closedir") _unix_closedir :: proc(dirp: Dir) -> c.int --- + @(link_name="rewinddir") _unix_rewinddir :: proc(dirp: Dir) --- + @(link_name="readdir_r") _unix_readdir_r :: proc(dirp: Dir, entry: ^Dirent, result: ^^Dirent) -> c.int --- + + @(link_name="malloc") _unix_malloc :: proc(size: c.size_t) -> rawptr --- + @(link_name="calloc") _unix_calloc :: proc(num, size: c.size_t) -> rawptr --- + @(link_name="free") _unix_free :: proc(ptr: rawptr) --- + @(link_name="realloc") _unix_realloc :: proc(ptr: rawptr, size: c.size_t) -> rawptr --- + + @(link_name="getenv") _unix_getenv :: proc(cstring) -> cstring --- + @(link_name="realpath") _unix_realpath :: proc(path: cstring, resolved_path: rawptr) -> rawptr --- + + @(link_name="exit") _unix_exit :: proc(status: c.int) -> ! --- + + @(link_name="dlopen") _unix_dlopen :: proc(filename: cstring, flags: c.int) -> rawptr --- + @(link_name="dlsym") _unix_dlsym :: proc(handle: rawptr, symbol: cstring) -> rawptr --- + @(link_name="dlclose") _unix_dlclose :: proc(handle: rawptr) -> c.int --- + @(link_name="dlerror") _unix_dlerror :: proc() -> cstring --- +} + +is_path_separator :: proc(r: rune) -> bool { + return r == '/' +} + +get_last_error :: proc() -> int { + return __errno()^ +} + +fork :: proc() -> (Pid, Errno) { + pid := _unix_fork() + if pid == -1 { + return Pid(-1), Errno(get_last_error()) + } + return Pid(pid), ERROR_NONE +} + +open :: proc(path: string, flags: int = O_RDONLY, mode: int = 0) -> (Handle, Errno) { + cstr := strings.clone_to_cstring(path, context.temp_allocator) + handle := _unix_open(cstr, c.int(flags), c.int(mode)) + if handle == -1 { + return INVALID_HANDLE, Errno(get_last_error()) + } + return handle, ERROR_NONE +} + +close :: proc(fd: Handle) -> Errno { + result := _unix_close(fd) + if result == -1 { + return Errno(get_last_error()) + } + return ERROR_NONE +} + +read :: proc(fd: Handle, data: []byte) -> (int, Errno) { + bytes_read := _unix_read(fd, &data[0], c.size_t(len(data))) + if bytes_read == -1 { + return -1, Errno(get_last_error()) + } + return int(bytes_read), ERROR_NONE +} + +write :: proc(fd: Handle, data: []byte) -> (int, Errno) { + if len(data) == 0 { + return 0, ERROR_NONE + } + bytes_written := _unix_write(fd, &data[0], c.size_t(len(data))) + if bytes_written == -1 { + return -1, Errno(get_last_error()) + } + return int(bytes_written), ERROR_NONE +} + +seek :: proc(fd: Handle, offset: i64, whence: int) -> (i64, Errno) { + res := _unix_seek(fd, offset, c.int(whence)) + if res == -1 { + return -1, Errno(get_last_error()) + } + return res, ERROR_NONE +} + +file_size :: proc(fd: Handle) -> (i64, Errno) { + s, err := _fstat(fd) + if err != ERROR_NONE { + return -1, err + } + return s.size, ERROR_NONE +} + +rename :: proc(old_path, new_path: string) -> Errno { + old_path_cstr := strings.clone_to_cstring(old_path, context.temp_allocator) + new_path_cstr := strings.clone_to_cstring(new_path, context.temp_allocator) + res := _unix_rename(old_path_cstr, new_path_cstr) + if res == -1 { + return Errno(get_last_error()) + } + return ERROR_NONE +} + +remove :: proc(path: string) -> Errno { + path_cstr := strings.clone_to_cstring(path, context.temp_allocator) + res := _unix_unlink(path_cstr) + if res == -1 { + return Errno(get_last_error()) + } + return ERROR_NONE +} + +make_directory :: proc(path: string, mode: mode_t = 0o775) -> Errno { + path_cstr := strings.clone_to_cstring(path, context.temp_allocator) + res := _unix_mkdir(path_cstr, mode) + if res == -1 { + return Errno(get_last_error()) + } + return ERROR_NONE +} + +remove_directory :: proc(path: string) -> Errno { + path_cstr := strings.clone_to_cstring(path, context.temp_allocator) + res := _unix_rmdir(path_cstr) + if res == -1 { + return Errno(get_last_error()) + } + return ERROR_NONE +} + +is_file_handle :: proc(fd: Handle) -> bool { + s, err := _fstat(fd) + if err != ERROR_NONE { + return false + } + return S_ISREG(s.mode) +} + +is_file_path :: proc(path: string, follow_links: bool = true) -> bool { + s: OS_Stat + err: Errno + if follow_links { + s, err = _stat(path) + } else { + s, err = _lstat(path) + } + if err != ERROR_NONE { + return false + } + return S_ISREG(s.mode) +} + +is_dir_handle :: proc(fd: Handle) -> bool { + s, err := _fstat(fd) + if err != ERROR_NONE { + return false + } + return S_ISDIR(s.mode) +} + +is_dir_path :: proc(path: string, follow_links: bool = true) -> bool { + s: OS_Stat + err: Errno + if follow_links { + s, err = _stat(path) + } else { + s, err = _lstat(path) + } + if err != ERROR_NONE { + return false + } + return S_ISDIR(s.mode) +} + +is_file :: proc {is_file_path, is_file_handle} +is_dir :: proc {is_dir_path, is_dir_handle} + +// NOTE(bill): Uses startup to initialize it + +stdin: Handle = 0 +stdout: Handle = 1 +stderr: Handle = 2 + +/* TODO(zangent): Implement these! +last_write_time :: proc(fd: Handle) -> File_Time {} +last_write_time_by_name :: proc(name: string) -> File_Time {} +*/ +last_write_time :: proc(fd: Handle) -> (File_Time, Errno) { + s, err := _fstat(fd) + if err != ERROR_NONE { + return 0, err + } + modified := s.modified.seconds * 1_000_000_000 + s.modified.nanoseconds + return File_Time(modified), ERROR_NONE +} + +last_write_time_by_name :: proc(name: string) -> (File_Time, Errno) { + s, err := _stat(name) + if err != ERROR_NONE { + return 0, err + } + modified := s.modified.seconds * 1_000_000_000 + s.modified.nanoseconds + return File_Time(modified), ERROR_NONE +} + +@private +_stat :: proc(path: string) -> (OS_Stat, Errno) { + cstr := strings.clone_to_cstring(path, context.temp_allocator) + + // deliberately uninitialized + s: OS_Stat = --- + res := _unix_stat(cstr, &s) + if res == -1 { + return s, Errno(get_last_error()) + } + return s, ERROR_NONE +} + +@private +_lstat :: proc(path: string) -> (OS_Stat, Errno) { + cstr := strings.clone_to_cstring(path, context.temp_allocator) + + // deliberately uninitialized + s: OS_Stat = --- + res := _unix_lstat(cstr, &s) + if res == -1 { + return s, Errno(get_last_error()) + } + return s, ERROR_NONE +} + +@private +_fstat :: proc(fd: Handle) -> (OS_Stat, Errno) { + // deliberately uninitialized + s: OS_Stat = --- + res := _unix_fstat(fd, &s) + if res == -1 { + return s, Errno(get_last_error()) + } + return s, ERROR_NONE +} + +@private +_fdopendir :: proc(fd: Handle) -> (Dir, Errno) { + dirp := _unix_fdopendir(fd) + if dirp == cast(Dir)nil { + return nil, Errno(get_last_error()) + } + return dirp, ERROR_NONE +} + +@private +_closedir :: proc(dirp: Dir) -> Errno { + rc := _unix_closedir(dirp) + if rc != 0 { + return Errno(get_last_error()) + } + return ERROR_NONE +} + +@private +_rewinddir :: proc(dirp: Dir) { + _unix_rewinddir(dirp) +} + +@private +_readdir :: proc(dirp: Dir) -> (entry: Dirent, err: Errno, end_of_stream: bool) { + result: ^Dirent + rc := _unix_readdir_r(dirp, &entry, &result) + + if rc != 0 { + err = Errno(get_last_error()) + return + } + err = ERROR_NONE + + if result == nil { + end_of_stream = true + return + } + + return +} + +@private +_readlink :: proc(path: string) -> (string, Errno) { + path_cstr := strings.clone_to_cstring(path, context.temp_allocator) + + bufsz : uint = MAX_PATH + buf := make([]byte, MAX_PATH) + for { + rc := _unix_readlink(path_cstr, &(buf[0]), bufsz) + if rc == -1 { + delete(buf) + return "", Errno(get_last_error()) + } else if rc == int(bufsz) { + bufsz += MAX_PATH + delete(buf) + buf = make([]byte, bufsz) + } else { + return strings.string_from_ptr(&buf[0], rc), ERROR_NONE + } + } + unreachable() +} + +// XXX OpenBSD +absolute_path_from_handle :: proc(fd: Handle) -> (string, Errno) { + return "", Errno(ENOSYS) +} + +absolute_path_from_relative :: proc(rel: string) -> (path: string, err: Errno) { + rel := rel + if rel == "" { + rel = "." + } + + rel_cstr := strings.clone_to_cstring(rel, context.temp_allocator) + + path_ptr := _unix_realpath(rel_cstr, nil) + if path_ptr == nil { + return "", Errno(get_last_error()) + } + defer _unix_free(path_ptr) + + path_cstr := transmute(cstring)path_ptr + path = strings.clone( string(path_cstr) ) + + return path, ERROR_NONE +} + +access :: proc(path: string, mask: int) -> (bool, Errno) { + cstr := strings.clone_to_cstring(path, context.temp_allocator) + res := _unix_access(cstr, c.int(mask)) + if res == -1 { + return false, Errno(get_last_error()) + } + return true, ERROR_NONE +} + +heap_alloc :: proc(size: int) -> rawptr { + assert(size >= 0) + return _unix_calloc(1, c.size_t(size)) +} + +heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr { + // NOTE: _unix_realloc doesn't guarantee new memory will be zeroed on + // POSIX platforms. Ensure your caller takes this into account. + return _unix_realloc(ptr, c.size_t(new_size)) +} + +heap_free :: proc(ptr: rawptr) { + _unix_free(ptr) +} + +getenv :: proc(name: string) -> (string, bool) { + path_str := strings.clone_to_cstring(name, context.temp_allocator) + cstr := _unix_getenv(path_str) + if cstr == nil { + return "", false + } + return string(cstr), true +} + +get_current_directory :: proc() -> string { + buf := make([dynamic]u8, MAX_PATH) + for { + cwd := _unix_getcwd(cstring(raw_data(buf)), c.size_t(len(buf))) + if cwd != nil { + return string(cwd) + } + if Errno(get_last_error()) != ERANGE { + return "" + } + resize(&buf, len(buf) + MAX_PATH) + } + unreachable() +} + +set_current_directory :: proc(path: string) -> (err: Errno) { + cstr := strings.clone_to_cstring(path, context.temp_allocator) + res := _unix_chdir(cstr) + if res == -1 { + return Errno(get_last_error()) + } + return ERROR_NONE +} + +exit :: proc "contextless" (code: int) -> ! { + _unix_exit(c.int(code)) +} + +current_thread_id :: proc "contextless" () -> int { + return _unix_getthrid() +} + +dlopen :: proc(filename: string, flags: int) -> rawptr { + cstr := strings.clone_to_cstring(filename, context.temp_allocator) + handle := _unix_dlopen(cstr, c.int(flags)) + return handle +} +dlsym :: proc(handle: rawptr, symbol: string) -> rawptr { + assert(handle != nil) + cstr := strings.clone_to_cstring(symbol, context.temp_allocator) + proc_handle := _unix_dlsym(handle, cstr) + return proc_handle +} +dlclose :: proc(handle: rawptr) -> bool { + assert(handle != nil) + return _unix_dlclose(handle) == 0 +} +dlerror :: proc() -> string { + return string(_unix_dlerror()) +} + +get_page_size :: proc() -> int { + // NOTE(tetra): The page size never changes, so why do anything complicated + // if we don't have to. + @static page_size := -1 + if page_size != -1 { + return page_size + } + + page_size = int(_unix_getpagesize()) + return page_size +} + + +_alloc_command_line_arguments :: proc() -> []string { + res := make([]string, len(runtime.args__)) + for arg, i in runtime.args__ { + res[i] = string(arg) + } + return res +} diff --git a/core/os/stat_unix.odin b/core/os/stat_unix.odin index 08c6f53c4..2aa9fc283 100644 --- a/core/os/stat_unix.odin +++ b/core/os/stat_unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, freebsd +//+build linux, darwin, freebsd, openbsd package os import "core:time" diff --git a/core/path/filepath/path_unix.odin b/core/path/filepath/path_unix.odin index 3e49c4710..d0eaa3635 100644 --- a/core/path/filepath/path_unix.odin +++ b/core/path/filepath/path_unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, freebsd +//+build linux, darwin, freebsd, openbsd package filepath when ODIN_OS == .Darwin { @@ -59,6 +59,11 @@ when ODIN_OS == .Darwin { foreign libc { @(link_name="__error") __error :: proc() -> ^i32 --- } +} else when ODIN_OS == .OpenBSD { + @(private) + foreign libc { + @(link_name="__errno") __error :: proc() -> ^i32 --- + } } else { @(private) foreign libc { diff --git a/core/runtime/entry_unix.odin b/core/runtime/entry_unix.odin index dd1e06625..1a3def200 100644 --- a/core/runtime/entry_unix.odin +++ b/core/runtime/entry_unix.odin @@ -1,5 +1,5 @@ //+private -//+build linux, darwin, freebsd +//+build linux, darwin, freebsd, openbsd package runtime import "core:intrinsics" diff --git a/core/sync/channel_unix.odin b/core/sync/channel_unix.odin index d6bac2d71..47aa46004 100644 --- a/core/sync/channel_unix.odin +++ b/core/sync/channel_unix.odin @@ -1,4 +1,4 @@ -// +build linux, darwin, freebsd +// +build linux, darwin, freebsd, openbsd package sync import "core:time" diff --git a/core/sync/sync2/futex_openbsd.odin b/core/sync/sync2/futex_openbsd.odin new file mode 100644 index 000000000..dbc80747b --- /dev/null +++ b/core/sync/sync2/futex_openbsd.odin @@ -0,0 +1,78 @@ +//+private +//+build openbsd +package sync2 + +import "core:c" +import "core:os" +import "core:time" + +FUTEX_WAIT :: 1 +FUTEX_WAKE :: 2 + +FUTEX_PRIVATE_FLAG :: 128 + +FUTEX_WAIT_PRIVATE :: (FUTEX_WAIT | FUTEX_PRIVATE_FLAG) +FUTEX_WAKE_PRIVATE :: (FUTEX_WAKE | FUTEX_PRIVATE_FLAG) + +foreign import libc "system:c" + +foreign libc { + @(link_name="futex") + _unix_futex :: proc "c" (f: ^Futex, op: c.int, val: u32, timeout: rawptr) -> c.int --- +} + +_futex_wait :: proc(f: ^Futex, expected: u32) -> bool { + res := _unix_futex(f, FUTEX_WAIT_PRIVATE, expected, nil) + + if res != -1 { + return true + } + + if os.Errno(os.get_last_error()) == os.ETIMEDOUT { + return false + } + + panic("futex_wait failure") +} + +_futex_wait_with_timeout :: proc(f: ^Futex, expected: u32, duration: time.Duration) -> bool { + if duration <= 0 { + return false + } + + timespec_t :: struct { + tv_sec: c.long, + tv_nsec: c.long, + } + + res := _unix_futex(f, FUTEX_WAIT_PRIVATE, expected, ×pec_t{ + tv_sec = (c.long)(duration/1e9), + tv_nsec = (c.long)(duration%1e9), + }) + + if res != -1 { + return true + } + + if os.Errno(os.get_last_error()) == os.ETIMEDOUT { + return false + } + + panic("futex_wait_with_timeout failure") +} + +_futex_signal :: proc(f: ^Futex) { + res := _unix_futex(f, FUTEX_WAKE_PRIVATE, 1, nil) + + if res == -1 { + panic("futex_wake_single failure") + } +} + +_futex_broadcast :: proc(f: ^Futex) { + res := _unix_futex(f, FUTEX_WAKE_PRIVATE, u32(max(i32)), nil) + + if res == -1 { + panic("_futex_wake_all failure") + } +} diff --git a/core/sync/sync2/primitives_openbsd.odin b/core/sync/sync2/primitives_openbsd.odin new file mode 100644 index 000000000..ef122b02e --- /dev/null +++ b/core/sync/sync2/primitives_openbsd.odin @@ -0,0 +1,9 @@ +//+build openbsd +//+private +package sync2 + +import "core:os" + +_current_thread_id :: proc "contextless" () -> int { + return os.current_thread_id() +} diff --git a/core/sync/sync2/primitives_pthreads.odin b/core/sync/sync2/primitives_pthreads.odin index 8d2c3986d..28053f9cc 100644 --- a/core/sync/sync2/primitives_pthreads.odin +++ b/core/sync/sync2/primitives_pthreads.odin @@ -1,4 +1,4 @@ -//+build linux, freebsd +//+build linux, freebsd, openbsd //+private package sync2 diff --git a/core/sync/sync_openbsd.odin b/core/sync/sync_openbsd.odin new file mode 100644 index 000000000..926655f5b --- /dev/null +++ b/core/sync/sync_openbsd.odin @@ -0,0 +1,36 @@ +package sync + +import "core:sys/unix" +import "core:os" + +current_thread_id :: proc "contextless" () -> int { + return os.current_thread_id() +} + +// The Darwin docs say it best: +// A semaphore is much like a lock, except that a finite number of threads can hold it simultaneously. +// Semaphores can be thought of as being much like piles of tokens; multiple threads can take these tokens, +// but when there are none left, a thread must wait until another thread returns one. +Semaphore :: struct #align 16 { + handle: unix.sem_t, +} + +semaphore_init :: proc(s: ^Semaphore, initial_count := 0) { + assert(unix.sem_init(&s.handle, 0, u32(initial_count)) == 0) +} + +semaphore_destroy :: proc(s: ^Semaphore) { + assert(unix.sem_destroy(&s.handle) == 0) + s.handle = {} +} + +semaphore_post :: proc(s: ^Semaphore, count := 1) { + // NOTE: SPEED: If there's one syscall to do this, we should use it instead of the loop. + for in 0.. ^sem_t --- + + sem_init :: proc(sem: ^sem_t, pshared: c.int, initial_value: c.uint) -> c.int --- + sem_destroy :: proc(sem: ^sem_t) -> c.int --- + sem_post :: proc(sem: ^sem_t) -> c.int --- + sem_wait :: proc(sem: ^sem_t) -> c.int --- + sem_trywait :: proc(sem: ^sem_t) -> c.int --- + //sem_timedwait :: proc(sem: ^sem_t, timeout: time.TimeSpec) -> c.int --- + + // NOTE: unclear whether pthread_yield is well-supported on Linux systems, + // see https://linux.die.net/man/3/pthread_yield + pthread_yield :: proc() --- +} diff --git a/core/sys/unix/pthread_unix.odin b/core/sys/unix/pthread_unix.odin index ccd8f7844..62e3701ab 100644 --- a/core/sys/unix/pthread_unix.odin +++ b/core/sys/unix/pthread_unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, freebsd +//+build linux, darwin, freebsd, openbsd package unix foreign import "system:pthread" diff --git a/core/thread/thread_unix.odin b/core/thread/thread_unix.odin index 6cb91df86..b6679bbc2 100644 --- a/core/thread/thread_unix.odin +++ b/core/thread/thread_unix.odin @@ -1,4 +1,4 @@ -// +build linux, darwin, freebsd +// +build linux, darwin, freebsd, openbsd // +private package thread diff --git a/core/time/time_unix.odin b/core/time/time_unix.odin index 9c5c5cc35..37fc1fd3e 100644 --- a/core/time/time_unix.odin +++ b/core/time/time_unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, freebsd +//+build linux, darwin, freebsd, openbsd package time IS_SUPPORTED :: true // NOTE: Times on Darwin are UTC. @@ -22,16 +22,28 @@ TimeSpec :: struct { tv_nsec : i64, /* nanoseconds */ } -CLOCK_REALTIME :: 0 // NOTE(tetra): May jump in time, when user changes the system time. -CLOCK_MONOTONIC :: 1 // NOTE(tetra): May stand still while system is asleep. -CLOCK_PROCESS_CPUTIME_ID :: 2 -CLOCK_THREAD_CPUTIME_ID :: 3 -CLOCK_MONOTONIC_RAW :: 4 // NOTE(tetra): "RAW" means: Not adjusted by NTP. -CLOCK_REALTIME_COARSE :: 5 // NOTE(tetra): "COARSE" clocks are apparently much faster, but not "fine-grained." -CLOCK_MONOTONIC_COARSE :: 6 -CLOCK_BOOTTIME :: 7 // NOTE(tetra): Same as MONOTONIC, except also including time system was asleep. -CLOCK_REALTIME_ALARM :: 8 -CLOCK_BOOTTIME_ALARM :: 9 +when ODIN_OS == .OpenBSD { + CLOCK_REALTIME :: 0 + CLOCK_PROCESS_CPUTIME_ID :: 2 + CLOCK_MONOTONIC :: 3 + CLOCK_THREAD_CPUTIME_ID :: 4 + CLOCK_UPTIME :: 5 + CLOCK_BOOTTIME :: 6 + + // CLOCK_MONOTONIC_RAW doesn't exist, use CLOCK_MONOTONIC + CLOCK_MONOTONIC_RAW :: CLOCK_MONOTONIC +} else { + CLOCK_REALTIME :: 0 // NOTE(tetra): May jump in time, when user changes the system time. + CLOCK_MONOTONIC :: 1 // NOTE(tetra): May stand still while system is asleep. + CLOCK_PROCESS_CPUTIME_ID :: 2 + CLOCK_THREAD_CPUTIME_ID :: 3 + CLOCK_MONOTONIC_RAW :: 4 // NOTE(tetra): "RAW" means: Not adjusted by NTP. + CLOCK_REALTIME_COARSE :: 5 // NOTE(tetra): "COARSE" clocks are apparently much faster, but not "fine-grained." + CLOCK_MONOTONIC_COARSE :: 6 + CLOCK_BOOTTIME :: 7 // NOTE(tetra): Same as MONOTONIC, except also including time system was asleep. + CLOCK_REALTIME_ALARM :: 8 + CLOCK_BOOTTIME_ALARM :: 9 +} // TODO(tetra, 2019-11-05): The original implementation of this package for Darwin used this constants. // I do not know if Darwin programmers are used to the existance of these constants or not, so diff --git a/src/bug_report.cpp b/src/bug_report.cpp index 4dd251f24..7f6b668e8 100644 --- a/src/bug_report.cpp +++ b/src/bug_report.cpp @@ -17,6 +17,10 @@ #include #endif +#if defined(GB_SYSTEM_OPENBSD) + #include +#endif + /* NOTE(Jeroen): This prints the Windows product edition only, to be called from `print_platform_details`. */ @@ -643,6 +647,14 @@ void print_bug_report_help() { } else { gb_printf("macOS: Unknown\n"); } + #elif defined(GB_SYSTEM_OPENBSD) + struct utsname un; + + if (uname(&un) != -1) { + gb_printf("%s %s %s %s\n", un.sysname, un.release, un.version, un.machine); + } else { + gb_printf("OpenBSD: Unknown\n"); + } #else gb_printf("Unknown\n"); @@ -657,4 +669,4 @@ void print_bug_report_help() { And RAM info. */ report_ram_info(); -} \ No newline at end of file +} diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 610e4f847..72a4b35cc 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -16,6 +16,7 @@ enum TargetOsKind { TargetOs_linux, TargetOs_essence, TargetOs_freebsd, + TargetOs_openbsd, TargetOs_wasi, TargetOs_js, @@ -53,6 +54,7 @@ String target_os_names[TargetOs_COUNT] = { str_lit("linux"), str_lit("essence"), str_lit("freebsd"), + str_lit("openbsd"), str_lit("wasi"), str_lit("js"), @@ -354,6 +356,15 @@ gb_global TargetMetrics target_freebsd_amd64 = { str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"), }; +gb_global TargetMetrics target_openbsd_amd64 = { + TargetOs_openbsd, + TargetArch_amd64, + 8, + 16, + str_lit("x86_64-unknown-openbsd-elf"), + str_lit("e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"), +}; + gb_global TargetMetrics target_essence_amd64 = { TargetOs_essence, TargetArch_amd64, @@ -417,6 +428,7 @@ gb_global NamedTargetMetrics named_targets[] = { { str_lit("windows_amd64"), &target_windows_amd64 }, { str_lit("freebsd_386"), &target_freebsd_386 }, { str_lit("freebsd_amd64"), &target_freebsd_amd64 }, + { str_lit("openbsd_amd64"), &target_openbsd_amd64 }, { str_lit("freestanding_wasm32"), &target_freestanding_wasm32 }, { str_lit("wasi_wasm32"), &target_wasi_wasm32 }, { str_lit("js_wasm32"), &target_js_wasm32 }, @@ -723,6 +735,7 @@ String internal_odin_root_dir(void) { #elif defined(GB_SYSTEM_DRAGONFLYBSD) len = readlink("/proc/curproc/file", &path_buf[0], path_buf.count); #else + // XXX OpenBSD len = readlink("/proc/self/exe", &path_buf[0], path_buf.count); #endif if(len == 0) { @@ -922,6 +935,8 @@ void init_build_context(TargetMetrics *cross_target) { #endif #elif defined(GB_SYSTEM_FREEBSD) metrics = &target_freebsd_amd64; + #elif defined(GB_SYSTEM_OPENBSD) + metrics = &target_openbsd_amd64; #elif defined(GB_CPU_ARM) metrics = &target_linux_arm64; #else @@ -980,6 +995,9 @@ void init_build_context(TargetMetrics *cross_target) { case TargetOs_freebsd: bc->link_flags = str_lit("-arch x86-64 "); break; + case TargetOs_openbsd: + bc->link_flags = str_lit("-arch x86-64 "); + break; } } else if (bc->metrics.arch == TargetArch_i386) { switch (bc->metrics.os) { diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index eb9d7f293..69cc40de8 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -3506,6 +3506,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 case TargetOs_linux: case TargetOs_essence: case TargetOs_freebsd: + case TargetOs_openbsd: switch (build_context.metrics.arch) { case TargetArch_i386: case TargetArch_amd64: diff --git a/src/checker.cpp b/src/checker.cpp index f440b7c9a..5a7ece263 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -906,6 +906,7 @@ void init_universal(void) { {"Linux", TargetOs_linux}, {"Essence", TargetOs_essence}, {"FreeBSD", TargetOs_freebsd}, + {"OpenBSD", TargetOs_openbsd}, {"WASI", TargetOs_wasi}, {"JS", TargetOs_js}, {"Freestanding", TargetOs_freestanding}, diff --git a/src/common.cpp b/src/common.cpp index d3ee95b76..aaacda04b 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -848,7 +848,7 @@ ReadDirectoryError read_directory(String path, Array *fi) { return ReadDirectory_None; } -#elif defined(GB_SYSTEM_LINUX) || defined(GB_SYSTEM_OSX) || defined(GB_SYSTEM_FREEBSD) +#elif defined(GB_SYSTEM_LINUX) || defined(GB_SYSTEM_OSX) || defined(GB_SYSTEM_FREEBSD) || defined(GB_SYSTEM_OPENBSD) #include diff --git a/src/gb/gb.h b/src/gb/gb.h index a9d6378c9..293e5063a 100644 --- a/src/gb/gb.h +++ b/src/gb/gb.h @@ -79,6 +79,10 @@ extern "C" { #ifndef GB_SYSTEM_FREEBSD #define GB_SYSTEM_FREEBSD 1 #endif + #elif defined(__OpenBSD__) + #ifndef GB_SYSTEM_OPENBSD + #define GB_SYSTEM_OPENBSD 1 + #endif #else #error This UNIX operating system is not supported #endif @@ -199,7 +203,7 @@ extern "C" { #endif #include // NOTE(bill): malloc on linux #include - #if !defined(GB_SYSTEM_OSX) && !defined(__FreeBSD__) + #if !defined(GB_SYSTEM_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__) #include #endif #include @@ -235,6 +239,15 @@ extern "C" { #define sendfile(out, in, offset, count) sendfile(out, in, offset, count, NULL, NULL, 0) #endif +#if defined(GB_SYSTEM_OPENBSD) + #include + #include + #define lseek64 lseek + + // XXX OpenBSD + #define sendfile(out, in, offset, count) (-1) +#endif + #if defined(GB_SYSTEM_UNIX) #include #endif @@ -783,6 +796,13 @@ typedef struct gbAffinity { isize thread_count; isize threads_per_core; } gbAffinity; +#elif defined(GB_SYSTEM_OPENBSD) +typedef struct gbAffinity { + b32 is_accurate; + isize core_count; + isize thread_count; + isize threads_per_core; +} gbAffinity; #else #error TODO(bill): Unknown system #endif @@ -3678,6 +3698,30 @@ b32 gb_affinity_set(gbAffinity *a, isize core, isize thread_index) { return true; } +isize gb_affinity_thread_count_for_core(gbAffinity *a, isize core) { + GB_ASSERT(0 <= core && core < a->core_count); + return a->threads_per_core; +} + +#elif defined(GB_SYSTEM_OPENBSD) +#include + +void gb_affinity_init(gbAffinity *a) { + a->core_count = sysconf(_SC_NPROCESSORS_ONLN); + a->threads_per_core = 1; + a->is_accurate = a->core_count > 0; + a->core_count = a->is_accurate ? a->core_count : 1; + a->thread_count = a->core_count; +} + +void gb_affinity_destroy(gbAffinity *a) { + gb_unused(a); +} + +b32 gb_affinity_set(gbAffinity *a, isize core, isize thread_index) { + return true; +} + isize gb_affinity_thread_count_for_core(gbAffinity *a, isize core) { GB_ASSERT(0 <= core && core < a->core_count); return a->threads_per_core; diff --git a/src/threading.cpp b/src/threading.cpp index 50d0dfed1..63e3415b2 100644 --- a/src/threading.cpp +++ b/src/threading.cpp @@ -486,7 +486,7 @@ void thread_set_name(Thread *t, char const *name) { #elif defined(GB_SYSTEM_OSX) // TODO(bill): Test if this works pthread_setname_np(name); -#elif defined(GB_SYSTEM_FREEBSD) +#elif defined(GB_SYSTEM_FREEBSD) || defined(GB_SYSTEM_OPENBSD) pthread_set_name_np(t->posix_handle, name); #else // TODO(bill): Test if this works From 00c138ce9f75b7c4911042a32fbc34a7335f2739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Fri, 25 Feb 2022 09:28:04 +0000 Subject: [PATCH 03/74] add RAM information inside report --- src/bug_report.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/bug_report.cpp b/src/bug_report.cpp index 7f6b668e8..02a2b1ba2 100644 --- a/src/bug_report.cpp +++ b/src/bug_report.cpp @@ -18,6 +18,7 @@ #endif #if defined(GB_SYSTEM_OPENBSD) + #include #include #endif @@ -246,6 +247,14 @@ void report_ram_info() { if (sysctl(sysctls, 2, &ram_amount, &val_size, NULL, 0) != -1) { gb_printf("%lld MiB\n", ram_amount / gb_megabytes(1)); } + #elif defined(GB_SYSTEM_OPENBSD) + uint64_t ram_amount; + size_t val_size = sizeof(ram_amount); + + int sysctls[] = { CTL_HW, HW_PHYSMEM64 }; + if (sysctl(sysctls, 2, &ram_amount, &val_size, NULL, 0) != -1) { + gb_printf("%lld MiB\n", ram_amount / gb_megabytes(1)); + } #else gb_printf("Unknown.\n"); #endif From 0a9099440370c902a6d3a08493f6c02363874be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Fri, 25 Feb 2022 12:32:34 +0000 Subject: [PATCH 04/74] provide a simple gb_file_copy() implementation permit to not require sendfile(2) syscall for gb_file_copy() --- src/gb/gb.h | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/src/gb/gb.h b/src/gb/gb.h index 293e5063a..b72a893f7 100644 --- a/src/gb/gb.h +++ b/src/gb/gb.h @@ -243,9 +243,6 @@ extern "C" { #include #include #define lseek64 lseek - - // XXX OpenBSD - #define sendfile(out, in, offset, count) (-1) #endif #if defined(GB_SYSTEM_UNIX) @@ -6069,7 +6066,7 @@ gbFileTime gb_file_last_write_time(char const *filepath) { gb_inline b32 gb_file_copy(char const *existing_filename, char const *new_filename, b32 fail_if_exists) { #if defined(GB_SYSTEM_OSX) return copyfile(existing_filename, new_filename, NULL, COPYFILE_DATA) == 0; -#else +#elif defined(GB_SYSTEM_LINUX) || defined(GB_SYSTEM_FREEBSD) isize size; int existing_fd = open(existing_filename, O_RDONLY, 0); int new_fd = open(new_filename, O_WRONLY|O_CREAT, 0666); @@ -6085,6 +6082,49 @@ gb_inline b32 gb_file_copy(char const *existing_filename, char const *new_filena close(new_fd); close(existing_fd); + return size == stat_existing.st_size; +#else + int new_flags = O_WRONLY | O_CREAT; + if (fail_if_exists) { + new_flags |= O_EXCL; + } + int existing_fd = open(existing_filename, O_RDONLY, 0); + int new_fd = open(new_filename, new_flags, 0666); + + struct stat stat_existing; + if (fstat(existing_fd, &stat_existing) == -1) { + return 0; + } + + size_t bsize = stat_existing.st_blksize > BUFSIZ ? stat_existing.st_blksize : BUFSIZ; + char *buf = (char *)malloc(bsize); + if (buf == NULL) { + close(new_fd); + close(existing_fd); + return 0; + } + + isize size = 0; + ssize_t nread, nwrite, offset; + while ((nread = read(existing_fd, buf, bsize)) != -1 && nread != 0) { + for (offset = 0; nread; nread -= nwrite, offset += nwrite) { + if ((nwrite = write(new_fd, buf + offset, nread)) == -1 || nwrite == 0) { + free(buf); + close(new_fd); + close(existing_fd); + return 0; + } + size += nwrite; + } + } + + free(buf); + close(new_fd); + close(existing_fd); + + if (nread == -1) { + return 0; + } return size == stat_existing.st_size; #endif } From 83523badb7cebd524170fdacffc4d49c217e2b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Fri, 25 Feb 2022 13:02:12 +0000 Subject: [PATCH 05/74] pass -ldl only on Darwin and Linux --- Makefile | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 99c71ccd9..72c1c7b95 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ GIT_SHA=$(shell git rev-parse --short HEAD) DISABLED_WARNINGS=-Wno-switch -Wno-macro-redefined -Wno-unused-value -LDFLAGS=-pthread -ldl -lm -lstdc++ +LDFLAGS=-pthread -lm -lstdc++ CFLAGS=-std=c++14 -DGIT_SHA=\"$(GIT_SHA)\" CFLAGS:=$(CFLAGS) -DODIN_VERSION_RAW=\"dev-$(shell date +"%Y-%m")\" CC=clang @@ -8,7 +8,7 @@ CC=clang OS=$(shell uname) ifeq ($(OS), Darwin) - + ARCH=$(shell uname -m) LLVM_CONFIG= @@ -37,7 +37,7 @@ ifeq ($(OS), Darwin) endif endif - LDFLAGS:=$(LDFLAGS) -liconv + LDFLAGS:=$(LDFLAGS) -liconv -ldl CFLAGS:=$(CFLAGS) $(shell $(LLVM_CONFIG) --cxxflags --ldflags) LDFLAGS:=$(LDFLAGS) -lLLVM-C endif @@ -55,14 +55,16 @@ ifeq ($(OS), Linux) endif endif + LDFLAGS:=$(LDFLAGS) -ldl CFLAGS:=$(CFLAGS) $(shell $(LLVM_CONFIG) --cxxflags --ldflags) LDFLAGS:=$(LDFLAGS) $(shell $(LLVM_CONFIG) --libs core native --system-libs) endif ifeq ($(OS), OpenBSD) LLVM_CONFIG=/usr/local/bin/llvm-config + LDFLAGS:=$(LDFLAGS) -liconv CFLAGS:=$(CFLAGS) $(shell $(LLVM_CONFIG) --cxxflags --ldflags) - LDFLAGS:=$(LDFLAGS) -liconv $(shell $(LLVM_CONFIG) --libs core native --system-libs) + LDFLAGS:=$(LDFLAGS) $(shell $(LLVM_CONFIG) --libs core native --system-libs) endif all: debug demo From ae5cb09041f79a2fcda27ab14aa66c6a4e098f8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Fri, 25 Feb 2022 17:59:57 +0000 Subject: [PATCH 06/74] internal_odin_root_dir: readlink could fail --- src/build_settings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 72a4b35cc..6b22ab4e7 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -738,7 +738,7 @@ String internal_odin_root_dir(void) { // XXX OpenBSD len = readlink("/proc/self/exe", &path_buf[0], path_buf.count); #endif - if(len == 0) { + if(len == 0 || len == -1) { return make_string(nullptr, 0); } if (len < path_buf.count) { From 8e270d3a99fc4a2369c622ae2de6395d7bfeb0c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sat, 26 Feb 2022 08:19:41 +0000 Subject: [PATCH 07/74] openbsd: poor man implementation for getting executable path it tries to get executable path from argv[0]. it is unreliable and unsecure, but should be fine enough for the considered use-case. it still doesn't address all possible cases. --- src/build_settings.cpp | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 6b22ab4e7..c40a70069 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1,4 +1,4 @@ -#if defined(GB_SYSTEM_FREEBSD) +#if defined(GB_SYSTEM_FREEBSD) || defined(GB_SYSTEM_OPENBSD) #include #include #endif @@ -734,9 +734,36 @@ String internal_odin_root_dir(void) { len = readlink("/proc/curproc/exe", &path_buf[0], path_buf.count); #elif defined(GB_SYSTEM_DRAGONFLYBSD) len = readlink("/proc/curproc/file", &path_buf[0], path_buf.count); -#else - // XXX OpenBSD +#elif defined(GB_SYSTEM_LINUX) len = readlink("/proc/self/exe", &path_buf[0], path_buf.count); +#elif defined(GB_SYSTEM_OPENBSD) + int error; + int mib[] = { + CTL_KERN, + KERN_PROC_ARGS, + getpid(), + KERN_PROC_ARGV, + }; + // get argv size + error = sysctl(mib, 4, NULL, (size_t *) &len, NULL, 0); + if (error == -1) { + // sysctl error + return make_string(nullptr, 0); + } + // get argv + char **argv = (char **)gb_malloc(len); + error = sysctl(mib, 4, argv, (size_t *) &len, NULL, 0); + if (error == -1) { + // sysctl error + gb_mfree(argv); + return make_string(nullptr, 0); + } + // copy argv[0] to path_buf + len = gb_strlen(argv[0]); + if(len < path_buf.count) { + gb_memmove(&path_buf[0], argv[0], len); + } + gb_mfree(argv); #endif if(len == 0 || len == -1) { return make_string(nullptr, 0); From 57862846a21a8da2a658e1bea97c52577ae4040a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sat, 26 Feb 2022 08:21:46 +0000 Subject: [PATCH 08/74] tests/vendor: pass extra linker flags on OpenBSD, botan library is third-party and live in /usr/local which isn't a path included by default in linker. --- tests/vendor/Makefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/vendor/Makefile b/tests/vendor/Makefile index f0a456bae..341067c6e 100644 --- a/tests/vendor/Makefile +++ b/tests/vendor/Makefile @@ -1,6 +1,13 @@ ODIN=../../odin +ODINFLAGS= + +OS=$(shell uname) + +ifeq ($(OS), OpenBSD) + ODINFLAGS:=$(ODINFLAGS) -extra-linker-flags:-L/usr/local/lib +endif all: botan_test botan_test: - $(ODIN) run botan -out=botan_hash -o:speed -no-bounds-check \ No newline at end of file + $(ODIN) run botan -out=botan_hash -o:speed -no-bounds-check $(ODINFLAGS) From 553292ffd0b518b5332355cd0c9695e3168b5285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sat, 26 Feb 2022 08:47:58 +0000 Subject: [PATCH 09/74] vendor: botan: add OpenBSD support --- vendor/botan/bindings/botan.odin | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vendor/botan/bindings/botan.odin b/vendor/botan/bindings/botan.odin index 70311523d..3eaad0bc1 100644 --- a/vendor/botan/bindings/botan.odin +++ b/vendor/botan/bindings/botan.odin @@ -146,6 +146,8 @@ when ODIN_OS == .Windows { foreign import botan_lib "system:botan-2" } else when ODIN_OS == .Darwin { foreign import botan_lib "system:botan-2" +} else when ODIN_OS == .OpenBSD { + foreign import botan_lib "system:botan-2" } @(default_calling_convention="c") @@ -471,4 +473,4 @@ foreign botan_lib { fpe_destroy :: proc(fpe: fpe_t) -> c.int --- fpe_encrypt :: proc(fpe: fpe_t, x: mp_t, tweak: ^c.char, tweak_len: c.size_t) -> c.int --- fpe_decrypt :: proc(fpe: fpe_t, x: mp_t, tweak: ^c.char, tweak_len: c.size_t) -> c.int --- -} \ No newline at end of file +} From 04297bb68034196a212b040990bdeb4dc006c340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sat, 26 Feb 2022 14:18:37 +0000 Subject: [PATCH 10/74] ci: add check for OpenBSD amd64 --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c62fcd36b..788c59311 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,6 +38,9 @@ jobs: cd tests/vendor make timeout-minutes: 10 + - name: Odin check examples/all for OpenBSD amd64 + run: ./odin check examples/all -vet -strict-style -target:openbsd_amd64 + timeout-minutes: 10 build_macOS: runs-on: macos-latest steps: From f76f70c7cf369a7e247a52e0c36da2fbe8d960c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Mon, 28 Feb 2022 15:24:22 +0000 Subject: [PATCH 11/74] openbsd: defaults to PIE executable OpenBSD uses PIE code by default to allow the system to load the binary at a random location. don't pass -no-pie to preserve this behaviour, and build objects with -fPIC (LLVMRelocPIC). --- src/llvm_backend.cpp | 5 +++++ src/main.cpp | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 52c46cadc..3b11f95a2 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1295,6 +1295,11 @@ void lb_generate_code(lbGenerator *gen) { reloc_mode = LLVMRelocPIC; } + if (build_context.metrics.os == TargetOs_openbsd) { + // Always use PIC for OpenBSD: it defaults to PIE + reloc_mode = LLVMRelocPIC; + } + for_array(i, gen->modules.entries) { target_machines[i] = LLVMCreateTargetMachine( target, target_triple, llvm_cpu, diff --git a/src/main.cpp b/src/main.cpp index c738b860d..f8a3e6f85 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -463,7 +463,8 @@ i32 linker_stage(lbGenerator *gen) { #endif link_settings = gb_string_appendc(link_settings, "-Wl,-init,'_odin_entry_point' "); link_settings = gb_string_appendc(link_settings, "-Wl,-fini,'_odin_exit_point' "); - } else { + } else if (build_context.metrics.os != TargetOs_openbsd) { + // OpenBSD defaults to PIE executable. do not pass -no-pie for it. link_settings = gb_string_appendc(link_settings, "-no-pie "); } if (build_context.out_filepath.len > 0) { From cba3f1e374d6e41e41df8a659667049a22301133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Mon, 28 Feb 2022 16:17:14 +0000 Subject: [PATCH 12/74] ENet: add openbsd support --- vendor/ENet/unix.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/ENet/unix.odin b/vendor/ENet/unix.odin index ea6b84199..a86e9837c 100644 --- a/vendor/ENet/unix.odin +++ b/vendor/ENet/unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, freebsd +//+build linux, darwin, freebsd, openbsd package ENet // When we implement the appropriate bindings for Unix, the section separated @@ -56,4 +56,4 @@ SOCKETSET_REMOVE :: #force_inline proc(sockset: ^SocketSet, socket: Socket) { SOCKSET_CHECK :: #force_inline proc(sockset: ^SocketSet, socket: Socket) -> bool { return FD_ISSET(i32(socket), cast(^fd_set)sockset) -} \ No newline at end of file +} From 737f440c7f835f400d616fff62f11afef38d7bf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Mon, 28 Feb 2022 16:17:14 +0000 Subject: [PATCH 13/74] glfw: add openbsd support --- vendor/glfw/bindings/bindings.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/vendor/glfw/bindings/bindings.odin b/vendor/glfw/bindings/bindings.odin index f4e39015e..fa9ef0776 100644 --- a/vendor/glfw/bindings/bindings.odin +++ b/vendor/glfw/bindings/bindings.odin @@ -5,6 +5,7 @@ import vk "vendor:vulkan" when ODIN_OS == .Linux { foreign import glfw "system:glfw" } // TODO: Add the billion-or-so static libs to link to in linux when ODIN_OS == .Darwin { foreign import glfw "system:glfw" } +when ODIN_OS == .OpenBSD { foreign import glfw "system:glfw" } when ODIN_OS == .Windows { foreign import glfw { "../lib/glfw3_mt.lib", From 37b4e0de6c80caeb78629a2a1a3d94bf1ed6df6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Mon, 28 Feb 2022 16:17:15 +0000 Subject: [PATCH 14/74] sdl2: add openbsd support --- vendor/sdl2/image/sdl_image.odin | 3 ++- vendor/sdl2/mixer/sdl_mixer.odin | 2 +- vendor/sdl2/net/sdl_net.odin | 3 ++- vendor/sdl2/sdl2.odin | 3 ++- vendor/sdl2/sdl_audio.odin | 1 + vendor/sdl2/sdl_blendmode.odin | 3 ++- vendor/sdl2/sdl_cpuinfo.odin | 3 ++- vendor/sdl2/sdl_events.odin | 3 ++- vendor/sdl2/sdl_gamecontroller.odin | 1 + vendor/sdl2/sdl_gesture_haptic.odin | 3 ++- vendor/sdl2/sdl_hints.odin | 3 ++- vendor/sdl2/sdl_joystick.odin | 3 ++- vendor/sdl2/sdl_keyboard.odin | 1 + vendor/sdl2/sdl_log.odin | 3 ++- vendor/sdl2/sdl_messagebox.odin | 1 + vendor/sdl2/sdl_metal.odin | 3 ++- vendor/sdl2/sdl_mouse.odin | 3 ++- vendor/sdl2/sdl_mutex.odin | 3 ++- vendor/sdl2/sdl_pixels.odin | 3 ++- vendor/sdl2/sdl_rect.odin | 3 ++- vendor/sdl2/sdl_render.odin | 3 ++- vendor/sdl2/sdl_rwops.odin | 3 ++- vendor/sdl2/sdl_stdinc.odin | 3 ++- vendor/sdl2/sdl_surface.odin | 3 ++- vendor/sdl2/sdl_system.odin | 3 ++- vendor/sdl2/sdl_syswm.odin | 3 ++- vendor/sdl2/sdl_thread.odin | 1 + vendor/sdl2/sdl_timer.odin | 3 ++- vendor/sdl2/sdl_touch.odin | 3 ++- vendor/sdl2/sdl_video.odin | 3 ++- vendor/sdl2/sdl_vulkan.odin | 3 ++- vendor/sdl2/ttf/sdl_ttf.odin | 3 ++- 32 files changed, 58 insertions(+), 27 deletions(-) diff --git a/vendor/sdl2/image/sdl_image.odin b/vendor/sdl2/image/sdl_image.odin index 30a7db6a8..ad939a63a 100644 --- a/vendor/sdl2/image/sdl_image.odin +++ b/vendor/sdl2/image/sdl_image.odin @@ -7,6 +7,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2_image.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2_image" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2_image" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2_image" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2_image" } bool :: SDL.bool @@ -119,4 +120,4 @@ foreign lib { /* Individual loading functions */ LoadGIFAnimation_RW :: proc(src: ^SDL.RWops) -> ^Animation --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/mixer/sdl_mixer.odin b/vendor/sdl2/mixer/sdl_mixer.odin index 7fa3f216f..ad7670598 100644 --- a/vendor/sdl2/mixer/sdl_mixer.odin +++ b/vendor/sdl2/mixer/sdl_mixer.odin @@ -7,7 +7,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2_mixer.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2_mixer" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2_mixer" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2_mixer" } - +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2_mixer" } MAJOR_VERSION :: 2 MINOR_VERSION :: 0 diff --git a/vendor/sdl2/net/sdl_net.odin b/vendor/sdl2/net/sdl_net.odin index b3e2c2e62..4aafe0bcf 100644 --- a/vendor/sdl2/net/sdl_net.odin +++ b/vendor/sdl2/net/sdl_net.odin @@ -7,6 +7,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2_net.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2_net" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2_net" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2_net" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2_net" } bool :: SDL.bool @@ -188,4 +189,4 @@ Read16 :: #force_inline proc "c" (areap: rawptr) -> u16 { Read32 :: #force_inline proc "c" (areap: rawptr) -> u32 { area := (^[4]u8)(areap) return u32(area[0])<<24 | u32(area[1])<<16 | u32(area[2])<<8 | u32(area[3]) -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl2.odin b/vendor/sdl2/sdl2.odin index e36c002dd..c270fc52f 100644 --- a/vendor/sdl2/sdl2.odin +++ b/vendor/sdl2/sdl2.odin @@ -29,6 +29,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } version :: struct { major: u8, /**< major version */ @@ -314,4 +315,4 @@ foreign lib { IsShapedWindow :: proc(window: ^Window) -> bool --- SetWindowShape :: proc(window: ^Window, shape: ^Surface, shape_mode: ^WindowShapeMode) -> c.int --- GetShapedWindowMode :: proc(window: ^Window, shape_mode: ^WindowShapeMode) -> c.int --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_audio.odin b/vendor/sdl2/sdl_audio.odin index a03031165..686f1994a 100644 --- a/vendor/sdl2/sdl_audio.odin +++ b/vendor/sdl2/sdl_audio.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } /** * \brief Audio format flags. diff --git a/vendor/sdl2/sdl_blendmode.odin b/vendor/sdl2/sdl_blendmode.odin index 525cf0f38..19e4b37aa 100644 --- a/vendor/sdl2/sdl_blendmode.odin +++ b/vendor/sdl2/sdl_blendmode.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } /** * \brief The blend mode used in SDL_RenderCopy() and drawing operations. @@ -62,4 +63,4 @@ BlendFactor :: enum c.int { foreign lib { ComposeCustomBlendMode :: proc(srcColorFactor, dstColorFactor: BlendFactor, colorOperation: BlendOperation, srcAlphaFactor, dstAlphaFactor: BlendFactor, alphaOperation: BlendOperation) -> BlendMode --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_cpuinfo.odin b/vendor/sdl2/sdl_cpuinfo.odin index 7d2e681fe..01a8d203a 100644 --- a/vendor/sdl2/sdl_cpuinfo.odin +++ b/vendor/sdl2/sdl_cpuinfo.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } /* This is a guess for the cacheline size used for padding. * Most x86 processors have a 64 byte cache line. @@ -41,4 +42,4 @@ foreign lib { SIMDAlloc :: proc(len: c.size_t) -> rawptr --- SIMDRealloc :: proc(mem: rawptr, len: c.size_t) -> rawptr --- SIMDFree :: proc(ptr: rawptr) --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_events.odin b/vendor/sdl2/sdl_events.odin index 3f58b51c3..45f9886a5 100644 --- a/vendor/sdl2/sdl_events.odin +++ b/vendor/sdl2/sdl_events.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } RELEASED :: 0 PRESSED :: 1 @@ -498,4 +499,4 @@ foreign lib { FilterEvents :: proc(filter: EventFilter, userdata: rawptr) --- EventState :: proc(type: EventType, state: c.int) -> u8 --- RegisterEvents :: proc(numevents: c.int) -> u32 --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_gamecontroller.odin b/vendor/sdl2/sdl_gamecontroller.odin index 9fef6b1ab..8c15cd779 100644 --- a/vendor/sdl2/sdl_gamecontroller.odin +++ b/vendor/sdl2/sdl_gamecontroller.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } GameController :: struct {} diff --git a/vendor/sdl2/sdl_gesture_haptic.odin b/vendor/sdl2/sdl_gesture_haptic.odin index 1c8616e99..961ae6ea6 100644 --- a/vendor/sdl2/sdl_gesture_haptic.odin +++ b/vendor/sdl2/sdl_gesture_haptic.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } // Gesture @@ -259,4 +260,4 @@ foreign lib { HapticRumbleInit :: proc(haptic: ^Haptic) -> c.int --- HapticRumblePlay :: proc(haptic: ^Haptic, strength: f32, length: u32) -> c.int --- HapticRumbleStop :: proc(haptic: ^Haptic) -> c.int --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_hints.odin b/vendor/sdl2/sdl_hints.odin index a84e5a090..150c8bcc6 100644 --- a/vendor/sdl2/sdl_hints.odin +++ b/vendor/sdl2/sdl_hints.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } HINT_ACCELEROMETER_AS_JOYSTICK :: "SDL_ACCELEROMETER_AS_JOYSTICK" HINT_ALLOW_ALT_TAB_WHILE_GRABBED :: "SDL_ALLOW_ALT_TAB_WHILE_GRABBED" @@ -146,4 +147,4 @@ foreign lib { AddHintCallback :: proc(name: cstring, callback: HintCallback, userdata: rawptr) --- DelHintCallback :: proc(name: cstring, callback: HintCallback, userdata: rawptr) --- ClearHints :: proc() --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_joystick.odin b/vendor/sdl2/sdl_joystick.odin index 1178eae24..f190c13e4 100644 --- a/vendor/sdl2/sdl_joystick.odin +++ b/vendor/sdl2/sdl_joystick.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } Joystick :: struct {} @@ -106,4 +107,4 @@ foreign lib { JoystickSendEffect :: proc(joystick: ^Joystick, data: rawptr, size: c.int) -> c.int --- JoystickClose :: proc(joystick: ^Joystick) --- JoystickCurrentPowerLevel :: proc(joystick: ^Joystick) -> JoystickPowerLevel --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_keyboard.odin b/vendor/sdl2/sdl_keyboard.odin index a68c644ab..abc6bb838 100644 --- a/vendor/sdl2/sdl_keyboard.odin +++ b/vendor/sdl2/sdl_keyboard.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } Keysym :: struct { scancode: Scancode, /**< SDL physical key code - see ::SDL_Scancode for details */ diff --git a/vendor/sdl2/sdl_log.odin b/vendor/sdl2/sdl_log.odin index d42d82b77..a496f5fbe 100644 --- a/vendor/sdl2/sdl_log.odin +++ b/vendor/sdl2/sdl_log.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } MAX_LOG_MESSAGE :: 4096 @@ -74,4 +75,4 @@ foreign lib { // LogMessageV :: proc(category: c.int, priority: LogPriority, fmt: cstring, ap: va_list) --- LogGetOutputFunction :: proc(callback: ^LogOutputFunction, userdata: ^rawptr) --- LogSetOutputFunction :: proc(callback: LogOutputFunction, userdata: rawptr) --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_messagebox.odin b/vendor/sdl2/sdl_messagebox.odin index c66cc4911..e14cc5463 100644 --- a/vendor/sdl2/sdl_messagebox.odin +++ b/vendor/sdl2/sdl_messagebox.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } MessageBoxFlag :: enum u32 { _ = 0, diff --git a/vendor/sdl2/sdl_metal.odin b/vendor/sdl2/sdl_metal.odin index 953c6d45f..c297113c6 100644 --- a/vendor/sdl2/sdl_metal.odin +++ b/vendor/sdl2/sdl_metal.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } MetalView :: distinct rawptr @@ -15,4 +16,4 @@ foreign lib { Metal_DestroyView :: proc(view: MetalView) --- Metal_GetLayer :: proc(view: MetalView) -> rawptr --- Metal_GetDrawableSize :: proc(window: ^Window, w, h: ^c.int) --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_mouse.odin b/vendor/sdl2/sdl_mouse.odin index 5ca8d9b5e..56478b6fb 100644 --- a/vendor/sdl2/sdl_mouse.odin +++ b/vendor/sdl2/sdl_mouse.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } Cursor :: struct {} @@ -61,4 +62,4 @@ foreign lib { GetDefaultCursor :: proc() -> ^Cursor --- FreeCursor :: proc(cursor: ^Cursor) --- ShowCursor :: proc(toggle: c.int) -> c.int --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_mutex.odin b/vendor/sdl2/sdl_mutex.odin index 6b9c96319..2ce004b52 100644 --- a/vendor/sdl2/sdl_mutex.odin +++ b/vendor/sdl2/sdl_mutex.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } MUTEX_TIMEDOUT :: 1 MUTEX_MAXWAIT :: ~u32(0) @@ -41,4 +42,4 @@ foreign lib { CondBroadcast :: proc(cv: ^cond) -> c.int --- CondWait :: proc(cv: ^cond, m: ^mutex) -> c.int --- CondWaitTimeout :: proc(cv: ^cond, m: ^mutex, ms: u32) -> c.int --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_pixels.odin b/vendor/sdl2/sdl_pixels.odin index 3cd2da5f4..34ff23b14 100644 --- a/vendor/sdl2/sdl_pixels.odin +++ b/vendor/sdl2/sdl_pixels.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } ALPHA_OPAQUE :: 255 ALPHA_TRANSPARENT :: 0 @@ -234,4 +235,4 @@ foreign lib { GetRGB :: proc(pixel: u32, format: ^PixelFormat, r, g, b: ^u8) --- GetRGBA :: proc(pixel: u32, format: ^PixelFormat, r, g, b, a: ^u8) --- CalculateGammaRamp :: proc(gamma: f32, ramp: ^[256]u16) --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_rect.odin b/vendor/sdl2/sdl_rect.odin index b0d6242be..fdf18aa65 100644 --- a/vendor/sdl2/sdl_rect.odin +++ b/vendor/sdl2/sdl_rect.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } Point :: struct { x: c.int, @@ -47,4 +48,4 @@ foreign lib { UnionRect :: proc(A, B: ^Rect, result: ^Rect) --- EnclosePoints :: proc(points: [^]Point, count: c.int, clip: ^Rect, result: ^Rect) -> bool --- IntersectRectAndLine :: proc(rect: ^Rect, X1, Y1, X2, Y2: ^c.int) -> bool --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_render.odin b/vendor/sdl2/sdl_render.odin index 435c40570..dd599f669 100644 --- a/vendor/sdl2/sdl_render.odin +++ b/vendor/sdl2/sdl_render.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } RendererFlag :: enum u32 { SOFTWARE = 0, /**< The renderer is a software fallback */ @@ -140,4 +141,4 @@ foreign lib { GL_UnbindTexture :: proc(texture: ^Texture) -> c.int --- RenderGetMetalLayer :: proc(renderer: ^Renderer) -> rawptr --- RenderGetMetalCommandEncoder :: proc(renderer: ^Renderer) -> rawptr --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_rwops.odin b/vendor/sdl2/sdl_rwops.odin index 3bee66290..fd7abc0c4 100644 --- a/vendor/sdl2/sdl_rwops.odin +++ b/vendor/sdl2/sdl_rwops.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } /* RWops Types */ RWOPS_UNKNOWN :: 0 /**< Unknown stream type */ @@ -105,4 +106,4 @@ foreign lib { WriteBE32 :: proc(dst: ^RWops, value: ^u32) -> c.size_t --- WriteLE64 :: proc(dst: ^RWops, value: ^u64) -> c.size_t --- WriteBE64 :: proc(dst: ^RWops, value: ^u64) -> c.size_t --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_stdinc.odin b/vendor/sdl2/sdl_stdinc.odin index 9bd5df4da..15446eb71 100644 --- a/vendor/sdl2/sdl_stdinc.odin +++ b/vendor/sdl2/sdl_stdinc.odin @@ -9,6 +9,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } bool :: distinct b32 #assert(size_of(bool) == size_of(c.int)) @@ -160,4 +161,4 @@ iconv_utf8_ucs2 :: proc "c" (s: string) -> [^]u16 { iconv_utf8_utf32 :: iconv_utf8_ucs4 iconv_utf8_ucs4 :: proc "c" (s: string) -> [^]rune { return cast([^]rune)iconv_string("UCS-4-INTERNAL", "UTF-8", cstring(raw_data(s)), len(s)+1) -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_surface.odin b/vendor/sdl2/sdl_surface.odin index e5a5da7ef..82545f1f9 100644 --- a/vendor/sdl2/sdl_surface.odin +++ b/vendor/sdl2/sdl_surface.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } SWSURFACE :: 0 /**< Just here for compatibility */ PREALLOC :: 0x00000001 /**< Surface uses preallocated memory */ @@ -108,4 +109,4 @@ foreign lib { SetYUVConversionMode :: proc(mode: YUV_CONVERSION_MODE) --- GetYUVConversionMode :: proc() -> YUV_CONVERSION_MODE --- GetYUVConversionModeForResolution :: proc(width, height: c.int) -> YUV_CONVERSION_MODE --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_system.odin b/vendor/sdl2/sdl_system.odin index 89ae4c707..cd08cfc47 100644 --- a/vendor/sdl2/sdl_system.odin +++ b/vendor/sdl2/sdl_system.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } // General @(default_calling_convention="c", link_prefix="SDL_") @@ -122,4 +123,4 @@ foreign lib { AndroidGetExternalStoragePath :: proc() -> cstring --- AndroidRequestPermission :: proc(permission: cstring) -> bool --- AndroidShowToast :: proc(message: cstring, duration, gravity, xoffset, yoffset: c.int) -> c.int --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_syswm.odin b/vendor/sdl2/sdl_syswm.odin index 37da1d298..f2b52529f 100644 --- a/vendor/sdl2/sdl_syswm.odin +++ b/vendor/sdl2/sdl_syswm.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } SYSWM_TYPE :: enum c.int { UNKNOWN, @@ -105,4 +106,4 @@ SysWMinfo :: struct { @(default_calling_convention="c", link_prefix="SDL_") foreign lib { GetWindowWMInfo :: proc(window: ^Window, info: ^SysWMinfo) -> bool --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_thread.odin b/vendor/sdl2/sdl_thread.odin index 98354438b..0d9d66d30 100644 --- a/vendor/sdl2/sdl_thread.odin +++ b/vendor/sdl2/sdl_thread.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } Thread :: struct {} diff --git a/vendor/sdl2/sdl_timer.odin b/vendor/sdl2/sdl_timer.odin index 357fdd437..13003b5b3 100644 --- a/vendor/sdl2/sdl_timer.odin +++ b/vendor/sdl2/sdl_timer.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } TimerCallback :: proc "c" (interval: u32, param: rawptr) -> u32 TimerID :: distinct c.int @@ -22,4 +23,4 @@ foreign lib { Delay :: proc(ms: u32) --- AddTimer :: proc(interval: u32, callback: TimerCallback, param: rawptr) -> TimerID --- RemoveTimer :: proc(id: TimerID) -> bool --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_touch.odin b/vendor/sdl2/sdl_touch.odin index d90939cb9..ffb91328a 100644 --- a/vendor/sdl2/sdl_touch.odin +++ b/vendor/sdl2/sdl_touch.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } TouchID :: distinct i64 FingerID :: distinct i64 @@ -34,4 +35,4 @@ foreign lib { GetTouchDeviceType :: proc(touchID: TouchID) -> TouchDeviceType --- GetNumTouchFingers :: proc(touchID: TouchID) -> c.int --- GetTouchFinger :: proc(touchID: TouchID, index: c.int) -> ^Finger --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_video.odin b/vendor/sdl2/sdl_video.odin index 01aaee1e7..d050e272d 100644 --- a/vendor/sdl2/sdl_video.odin +++ b/vendor/sdl2/sdl_video.odin @@ -6,6 +6,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } DisplayMode :: struct { format: u32, /**< pixel format */ @@ -310,4 +311,4 @@ foreign lib { // Used by vendor:OpenGL gl_set_proc_address :: proc(p: rawptr, name: cstring) { (^rawptr)(p)^ = GL_GetProcAddress(name) -} \ No newline at end of file +} diff --git a/vendor/sdl2/sdl_vulkan.odin b/vendor/sdl2/sdl_vulkan.odin index 66b054524..13e25f8c2 100644 --- a/vendor/sdl2/sdl_vulkan.odin +++ b/vendor/sdl2/sdl_vulkan.odin @@ -7,6 +7,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } VkInstance :: vk.Instance VkSurfaceKHR :: vk.SurfaceKHR @@ -22,4 +23,4 @@ foreign lib { Vulkan_GetInstanceExtensions :: proc(window: ^Window, pCount: ^c.uint, pNames: [^]cstring) -> bool --- Vulkan_CreateSurface :: proc(window: ^Window, instance: VkInstance, surface: ^VkSurfaceKHR) -> bool --- Vulkan_GetDrawableSize :: proc(window: ^Window, w, h: ^c.int) --- -} \ No newline at end of file +} diff --git a/vendor/sdl2/ttf/sdl_ttf.odin b/vendor/sdl2/ttf/sdl_ttf.odin index 8cd1df505..e84c89136 100644 --- a/vendor/sdl2/ttf/sdl_ttf.odin +++ b/vendor/sdl2/ttf/sdl_ttf.odin @@ -7,6 +7,7 @@ when ODIN_OS == .Windows { foreign import lib "SDL2_ttf.lib" } when ODIN_OS == .Linux { foreign import lib "system:SDL2_ttf" } when ODIN_OS == .Darwin { foreign import lib "system:SDL2_ttf" } when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2_ttf" } +when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2_ttf" } bool :: SDL.bool @@ -163,4 +164,4 @@ foreign lib { SetFontSDF :: proc(font: ^Font, on_off: bool) -> c.int --- GetFontSDF :: proc(font: ^Font) -> bool --- -} \ No newline at end of file +} From d4ccb69ccc56fb57cad48493a9e5e78ca3529a84 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 21:49:19 +0000 Subject: [PATCH 15/74] Check if directory exists with the same target executable name when building a directory --- src/parser.cpp | 16 ++++++++++++++++ src/parser.hpp | 1 + 2 files changed, 17 insertions(+) diff --git a/src/parser.cpp b/src/parser.cpp index 9659e8c18..f70afe346 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -5719,6 +5719,22 @@ ParseFileError parse_packages(Parser *p, String init_filename) { error_line("Expected either a directory or a .odin file, got '%.*s'\n", LIT(init_filename)); return ParseFile_WrongExtension; } + } else if (init_fullpath.len != 0) { + String path = init_fullpath; + if (path[path.len-1] == '/') { + path.len -= 1; + } + if ((build_context.command_kind & Command__does_build) && + build_context.build_mode == BuildMode_Executable) { + String short_path = filename_from_path(path); + char *cpath = alloc_cstring(heap_allocator(), short_path); + defer (gb_free(heap_allocator(), cpath)); + + if (gb_file_exists(cpath)) { + error_line("Please specify the executable name with -out: as a directory exists with the same name in the current working directory"); + return ParseFile_DirectoryAlreadyExists; + } + } } diff --git a/src/parser.hpp b/src/parser.hpp index f6791a291..c33d1520b 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -46,6 +46,7 @@ enum ParseFileError { ParseFile_InvalidToken, ParseFile_GeneralError, ParseFile_FileTooLarge, + ParseFile_DirectoryAlreadyExists, ParseFile_Count, }; From f971126183312f7229c24ea9fd7d36a6a7870404 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 1 Mar 2022 13:51:41 +0100 Subject: [PATCH 16/74] [mem] Add missing `\n` to tracking allocator example. --- core/mem/doc.odin | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/core/mem/doc.odin b/core/mem/doc.odin index 2a5ee06d3..fe53dee83 100644 --- a/core/mem/doc.odin +++ b/core/mem/doc.odin @@ -12,22 +12,22 @@ import "core:mem" import "core:fmt" _main :: proc() { - do stuff + do stuff } main :: proc() { - track: mem.Tracking_Allocator - mem.tracking_allocator_init(&track, context.allocator) - context.allocator = mem.tracking_allocator(&track) + track: mem.Tracking_Allocator + mem.tracking_allocator_init(&track, context.allocator) + context.allocator = mem.tracking_allocator(&track) - _main() + _main() - for _, v in track.allocation_map { - fmt.printf("%v leaked %v bytes", v.location, v.size) - } - for bf in track.bad_free_array { - fmt.printf("%v allocation %p was freed badly", bf.location, bf.memory) - } + for _, leak in track.allocation_map { + fmt.printf("%v leaked %v bytes\n", leak.location, leak.size) + } + for bad_free in track.bad_free_array { + fmt.printf("%v allocation %p was freed badly\n", bad_free.location, bad_free.memory) + } } ``` */ From 49fecbdc5e6579956346e484a418b9501dfddd71 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 1 Mar 2022 14:49:05 +0000 Subject: [PATCH 17/74] Improve error message when there is "no field" found for a large anonymous struct --- src/check_builtin.cpp | 8 ++++---- src/check_expr.cpp | 8 ++++---- src/types.cpp | 39 ++++++++++++++++++++++++--------------- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 69cc40de8..aeeeb9e4d 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1106,7 +1106,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 Selection sel = lookup_field(type, field_name, false); if (sel.entity == nullptr) { - gbString type_str = type_to_string(type); + gbString type_str = type_to_string_shorthand(type); error(ce->args[0], "'%s' has no field named '%.*s'", type_str, LIT(field_name)); gb_string_free(type_str); @@ -1118,7 +1118,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 return false; } if (sel.indirect) { - gbString type_str = type_to_string(type); + gbString type_str = type_to_string_shorthand(type); error(ce->args[0], "Field '%.*s' is embedded via a pointer in '%s'", LIT(field_name), type_str); gb_string_free(type_str); @@ -1179,7 +1179,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 Selection sel = lookup_field(type, field_name, false); if (sel.entity == nullptr) { - gbString type_str = type_to_string(type); + gbString type_str = type_to_string_shorthand(type); error(ce->args[0], "'%s' has no field named '%.*s'", type_str, LIT(field_name)); gb_string_free(type_str); @@ -1191,7 +1191,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 return false; } if (sel.indirect) { - gbString type_str = type_to_string(type); + gbString type_str = type_to_string_shorthand(type); error(ce->args[0], "Field '%.*s' is embedded via a pointer in '%s'", LIT(field_name), type_str); gb_string_free(type_str); diff --git a/src/check_expr.cpp b/src/check_expr.cpp index e07dc3d60..614da2368 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4470,7 +4470,7 @@ Entity *check_selector(CheckerContext *c, Operand *operand, Ast *node, Type *typ if (entity == nullptr) { gbString op_str = expr_to_string(op_expr); - gbString type_str = type_to_string(operand->type); + gbString type_str = type_to_string_shorthand(operand->type); gbString sel_str = expr_to_string(selector); error(op_expr, "'%s' of type '%s' has no field '%s'", op_str, type_str, sel_str); @@ -4511,7 +4511,7 @@ Entity *check_selector(CheckerContext *c, Operand *operand, Ast *node, Type *typ } gbString op_str = expr_to_string(op_expr); - gbString type_str = type_to_string(operand->type); + gbString type_str = type_to_string_shorthand(operand->type); gbString sel_str = expr_to_string(selector); error(op_expr, "Cannot access non-constant field '%s' from '%s'", sel_str, op_str); gb_string_free(sel_str); @@ -4536,7 +4536,7 @@ Entity *check_selector(CheckerContext *c, Operand *operand, Ast *node, Type *typ } gbString op_str = expr_to_string(op_expr); - gbString type_str = type_to_string(operand->type); + gbString type_str = type_to_string_shorthand(operand->type); gbString sel_str = expr_to_string(selector); error(op_expr, "Cannot access non-constant field '%s' from '%s'", sel_str, op_str); gb_string_free(sel_str); @@ -4549,7 +4549,7 @@ Entity *check_selector(CheckerContext *c, Operand *operand, Ast *node, Type *typ if (expr_entity != nullptr && is_type_polymorphic(expr_entity->type)) { gbString op_str = expr_to_string(op_expr); - gbString type_str = type_to_string(operand->type); + gbString type_str = type_to_string_shorthand(operand->type); gbString sel_str = expr_to_string(selector); error(op_expr, "Cannot access field '%s' from non-specialized polymorphic type '%s'", sel_str, op_str); gb_string_free(sel_str); diff --git a/src/types.cpp b/src/types.cpp index 74080334a..58ccdf5b9 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -703,7 +703,7 @@ struct TypePath; i64 type_size_of (Type *t); i64 type_align_of (Type *t); i64 type_offset_of (Type *t, i32 index); -gbString type_to_string (Type *type); +gbString type_to_string (Type *type, bool shorthand=false); i64 type_size_of_internal(Type *t, TypePath *path); void init_map_internal_types(Type *type); Type * bit_set_to_int(Type *t); @@ -3936,7 +3936,7 @@ Type *alloc_type_proc_from_types(Type **param_types, unsigned param_count, Type -gbString write_type_to_string(gbString str, Type *type) { +gbString write_type_to_string(gbString str, Type *type, bool shorthand=false) { if (type == nullptr) { return gb_string_appendc(str, ""); } @@ -4051,15 +4051,21 @@ gbString write_type_to_string(gbString str, Type *type) { if (type->Struct.is_raw_union) str = gb_string_appendc(str, " #raw_union"); if (type->Struct.custom_align != 0) str = gb_string_append_fmt(str, " #align %d", cast(int)type->Struct.custom_align); str = gb_string_appendc(str, " {"); - for_array(i, type->Struct.fields) { - Entity *f = type->Struct.fields[i]; - GB_ASSERT(f->kind == Entity_Variable); - if (i > 0) { - str = gb_string_appendc(str, ", "); + + + if (shorthand && type->Struct.fields.count > 16) { + str = gb_string_append_fmt(str, "%lld fields...", cast(long long)type->Struct.fields.count); + } else { + for_array(i, type->Struct.fields) { + Entity *f = type->Struct.fields[i]; + GB_ASSERT(f->kind == Entity_Variable); + if (i > 0) { + str = gb_string_appendc(str, ", "); + } + str = gb_string_append_length(str, f->token.string.text, f->token.string.len); + str = gb_string_appendc(str, ": "); + str = write_type_to_string(str, f->type); } - str = gb_string_append_length(str, f->token.string.text, f->token.string.len); - str = gb_string_appendc(str, ": "); - str = write_type_to_string(str, f->type); } str = gb_string_append_rune(str, '}'); } break; @@ -4234,13 +4240,16 @@ gbString write_type_to_string(gbString str, Type *type) { } -gbString type_to_string(Type *type, gbAllocator allocator) { - return write_type_to_string(gb_string_make(allocator, ""), type); +gbString type_to_string(Type *type, gbAllocator allocator, bool shorthand=false) { + return write_type_to_string(gb_string_make(allocator, ""), type, shorthand); } -gbString type_to_string(Type *type) { - return write_type_to_string(gb_string_make(heap_allocator(), ""), type); +gbString type_to_string(Type *type, bool shorthand) { + return write_type_to_string(gb_string_make(heap_allocator(), ""), type, shorthand); +} + +gbString type_to_string_shorthand(Type *type) { + return type_to_string(type, true); } - From 18607e53cba060558b7618e2c12245b363ad2a7f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 1 Mar 2022 15:38:04 +0000 Subject: [PATCH 18/74] Correct `alloc_from_memory_block` --- core/mem/virtual/virtual.odin | 40 ++++++++++++++++++-------- core/mem/virtual/virtual_platform.odin | 22 ++++++++++++-- 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/core/mem/virtual/virtual.odin b/core/mem/virtual/virtual.odin index 38c654254..09d18b934 100644 --- a/core/mem/virtual/virtual.odin +++ b/core/mem/virtual/virtual.odin @@ -82,11 +82,13 @@ memory_block_alloc :: proc(committed, reserved: uint, flags: Memory_Block_Flags) pmblock := platform_memory_alloc(0, total_size) or_return pmblock.block.base = ([^]byte)(uintptr(pmblock) + base_offset) - commit(pmblock.block.base, committed) or_return + commit_err := platform_memory_commit(pmblock, uint(base_offset) + committed) + assert(commit_err == nil) + // Should be zeroed assert(pmblock.block.used == 0) assert(pmblock.block.prev == nil) - if (do_protection) { + if do_protection { protect(rawptr(uintptr(pmblock) + protect_offset), page_size, Protect_No_Access) } @@ -115,23 +117,37 @@ alloc_from_memory_block :: proc(block: ^Memory_Block, min_size, alignment: int) return alignment_offset } - + do_commit_if_necessary :: proc(block: ^Memory_Block, size: uint) -> (err: Allocator_Error) { + if block.committed - block.used < size { + pmblock := (^Platform_Memory_Block)(block) + base_offset := uint(uintptr(block) - uintptr(pmblock)) + platform_total_commit := base_offset + block.used + size + + assert(pmblock.committed <= pmblock.reserved) + assert(pmblock.committed < platform_total_commit) + + platform_memory_commit(pmblock, platform_total_commit) or_return + + pmblock.committed = platform_total_commit + block.committed = pmblock.committed - base_offset + } + return nil + } + + alignment_offset := calc_alignment_offset(block, uintptr(alignment)) - size := uint(min_size) + alignment_offset - + if block.used + size > block.reserved { err = .Out_Of_Memory return } - - ptr := block.base[block.used:] - ptr = ptr[alignment_offset:] - + assert(block.committed <= block.reserved) + do_commit_if_necessary(block, size) or_return + + data = block.base[block.used+alignment_offset:][:min_size] block.used += size - assert(block.used <= block.reserved) - - return ptr[:min_size], nil + return } diff --git a/core/mem/virtual/virtual_platform.odin b/core/mem/virtual/virtual_platform.odin index c4211ba5e..85caa6419 100644 --- a/core/mem/virtual/virtual_platform.odin +++ b/core/mem/virtual/virtual_platform.odin @@ -4,8 +4,9 @@ package mem_virtual import sync "core:sync/sync2" Platform_Memory_Block :: struct { - block: Memory_Block, - reserved: uint, + block: Memory_Block, + committed: uint, + reserved: uint, prev, next: ^Platform_Memory_Block, } @@ -20,7 +21,8 @@ platform_memory_alloc :: proc(to_commit, to_reserve: uint) -> (block: ^Platform_ commit(raw_data(data), to_commit) block = (^Platform_Memory_Block)(raw_data(data)) - block.reserved = to_reserve + block.committed = to_commit + block.reserved = to_reserve return } @@ -52,3 +54,17 @@ platform_memory_init :: proc() { global_platform_memory_block_sentinel_set = true } } + +platform_memory_commit :: proc(block: ^Platform_Memory_Block, to_commit: uint) -> (err: Allocator_Error) { + if to_commit < block.committed { + return nil + } + if to_commit > block.reserved { + return .Out_Of_Memory + } + + + commit(block, to_commit) or_return + block.committed = to_commit + return nil +} From 7e5342f41fab561337ebd648407b753bd1813abf Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 1 Mar 2022 15:52:14 +0000 Subject: [PATCH 19/74] Use `contextless` where possible --- core/mem/virtual/virtual.odin | 14 +++++++------- core/mem/virtual/virtual_linux.odin | 10 +++++----- core/mem/virtual/virtual_platform.odin | 6 +++--- core/mem/virtual/virtual_windows.odin | 10 +++++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/core/mem/virtual/virtual.odin b/core/mem/virtual/virtual.odin index 09d18b934..2035171a7 100644 --- a/core/mem/virtual/virtual.odin +++ b/core/mem/virtual/virtual.odin @@ -6,25 +6,25 @@ DEFAULT_PAGE_SIZE := uint(4096) Allocator_Error :: mem.Allocator_Error -reserve :: proc(size: uint) -> (data: []byte, err: Allocator_Error) { +reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { return _reserve(size) } -commit :: proc(data: rawptr, size: uint) -> Allocator_Error { +commit :: proc "contextless" (data: rawptr, size: uint) -> Allocator_Error { return _commit(data, size) } -reserve_and_commit :: proc(size: uint) -> (data: []byte, err: Allocator_Error) { +reserve_and_commit :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { data = reserve(size) or_return commit(raw_data(data), size) or_return return } -decommit :: proc(data: rawptr, size: uint) { +decommit :: proc "contextless" (data: rawptr, size: uint) { _decommit(data, size) } -release :: proc(data: rawptr, size: uint) { +release :: proc "contextless" (data: rawptr, size: uint) { _release(data, size) } @@ -36,7 +36,7 @@ Protect_Flag :: enum u32 { Protect_Flags :: distinct bit_set[Protect_Flag; u32] Protect_No_Access :: Protect_Flags{} -protect :: proc(data: rawptr, size: uint, flags: Protect_Flags) -> bool { +protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) -> bool { return _protect(data, size, flags) } @@ -107,7 +107,7 @@ memory_block_alloc :: proc(committed, reserved: uint, flags: Memory_Block_Flags) } alloc_from_memory_block :: proc(block: ^Memory_Block, min_size, alignment: int) -> (data: []byte, err: Allocator_Error) { - calc_alignment_offset :: proc(block: ^Memory_Block, alignment: uintptr) -> uint { + calc_alignment_offset :: proc "contextless" (block: ^Memory_Block, alignment: uintptr) -> uint { alignment_offset := uint(0) ptr := uintptr(block.base[block.used:]) mask := alignment-1 diff --git a/core/mem/virtual/virtual_linux.odin b/core/mem/virtual/virtual_linux.odin index 71a56e499..6ae926e47 100644 --- a/core/mem/virtual/virtual_linux.odin +++ b/core/mem/virtual/virtual_linux.odin @@ -58,7 +58,7 @@ madvise :: proc "contextless" (addr: rawptr, length: uint, advice: c.int) -> c.i } -_reserve :: proc(size: uint) -> (data: []byte, err: Allocator_Error) { +_reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { MAP_FAILED := rawptr(~uintptr(0)) result := mmap(nil, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) if result == MAP_FAILED { @@ -67,7 +67,7 @@ _reserve :: proc(size: uint) -> (data: []byte, err: Allocator_Error) { return ([^]byte)(result)[:size], nil } -_commit :: proc(data: rawptr, size: uint) -> Allocator_Error { +_commit :: proc "contextless" (data: rawptr, size: uint) -> Allocator_Error { result := mprotect(data, size, PROT_READ|PROT_WRITE) if result != 0 { // TODO(bill): Handle error value correctly @@ -75,14 +75,14 @@ _commit :: proc(data: rawptr, size: uint) -> Allocator_Error { } return nil } -_decommit :: proc(data: rawptr, size: uint) { +_decommit :: proc "contextless" (data: rawptr, size: uint) { mprotect(data, size, PROT_NONE) madvise(data, size, MADV_FREE) } -_release :: proc(data: rawptr, size: uint) { +_release :: proc "contextless" (data: rawptr, size: uint) { munmap(data, size) } -_protect :: proc(data: rawptr, size: uint, flags: Protect_Flags) -> bool { +_protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) -> bool { pflags: c.int pflags = PROT_NONE if .Read in flags { pflags |= PROT_READ } diff --git a/core/mem/virtual/virtual_platform.odin b/core/mem/virtual/virtual_platform.odin index 85caa6419..d707bc427 100644 --- a/core/mem/virtual/virtual_platform.odin +++ b/core/mem/virtual/virtual_platform.odin @@ -10,7 +10,7 @@ Platform_Memory_Block :: struct { prev, next: ^Platform_Memory_Block, } -platform_memory_alloc :: proc(to_commit, to_reserve: uint) -> (block: ^Platform_Memory_Block, err: Allocator_Error) { +platform_memory_alloc :: proc "contextless" (to_commit, to_reserve: uint) -> (block: ^Platform_Memory_Block, err: Allocator_Error) { to_commit, to_reserve := to_commit, to_reserve to_reserve = max(to_commit, to_reserve) @@ -27,7 +27,7 @@ platform_memory_alloc :: proc(to_commit, to_reserve: uint) -> (block: ^Platform_ } -platform_memory_free :: proc(block: ^Platform_Memory_Block) { +platform_memory_free :: proc "contextless" (block: ^Platform_Memory_Block) { if block != nil { release(block, block.reserved) } @@ -55,7 +55,7 @@ platform_memory_init :: proc() { } } -platform_memory_commit :: proc(block: ^Platform_Memory_Block, to_commit: uint) -> (err: Allocator_Error) { +platform_memory_commit :: proc "contextless" (block: ^Platform_Memory_Block, to_commit: uint) -> (err: Allocator_Error) { if to_commit < block.committed { return nil } diff --git a/core/mem/virtual/virtual_windows.odin b/core/mem/virtual/virtual_windows.odin index 623e8d469..ef0bf6f1a 100644 --- a/core/mem/virtual/virtual_windows.odin +++ b/core/mem/virtual/virtual_windows.odin @@ -62,7 +62,7 @@ foreign Kernel32 { } -_reserve :: proc(size: uint) -> (data: []byte, err: Allocator_Error) { +_reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { result := VirtualAlloc(nil, size, MEM_RESERVE, PAGE_READWRITE) if result == nil { err = .Out_Of_Memory @@ -72,7 +72,7 @@ _reserve :: proc(size: uint) -> (data: []byte, err: Allocator_Error) { return } -_commit :: proc(data: rawptr, size: uint) -> Allocator_Error { +_commit :: proc "contextless" (data: rawptr, size: uint) -> Allocator_Error { result := VirtualAlloc(data, size, MEM_COMMIT, PAGE_READWRITE) if result == nil { switch err := GetLastError(); err { @@ -85,13 +85,13 @@ _commit :: proc(data: rawptr, size: uint) -> Allocator_Error { } return nil } -_decommit :: proc(data: rawptr, size: uint) { +_decommit :: proc "contextless" (data: rawptr, size: uint) { VirtualFree(data, size, MEM_DECOMMIT) } -_release :: proc(data: rawptr, size: uint) { +_release :: proc "contextless" (data: rawptr, size: uint) { VirtualFree(data, 0, MEM_RELEASE) } -_protect :: proc(data: rawptr, size: uint, flags: Protect_Flags) -> bool { +_protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) -> bool { pflags: u32 pflags = PAGE_NOACCESS switch flags { From e9ee6f529165aa4883708cf94e4b10f538553ea5 Mon Sep 17 00:00:00 2001 From: Patric Dexheimer Date: Tue, 1 Mar 2022 16:00:18 -0300 Subject: [PATCH 20/74] Fixing bindings https://github.com/raysan5/raylib/blob/master/src/raylib.h#L1179 --- vendor/raylib/raylib.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/raylib/raylib.odin b/vendor/raylib/raylib.odin index 0c8248683..5e1b22b3d 100644 --- a/vendor/raylib/raylib.odin +++ b/vendor/raylib/raylib.odin @@ -1150,7 +1150,7 @@ foreign lib { DrawRectangleGradientH :: proc(posX, posY, width, height: c.int, color1: Color, color2: Color) --- // Draw a horizontal-gradient-filled rectangle DrawRectangleGradientEx :: proc(rec: Rectangle, col1, col2, col3, col4: Color) --- // Draw a gradient-filled rectangle with custom vertex colors DrawRectangleLines :: proc(posX, posY, width, height: c.int, color: Color) --- // Draw rectangle outline - DrawRectangleLinesEx :: proc(rec: Rectangle, lineThick: c.int, color: Color) --- // Draw rectangle outline with extended parameters + DrawRectangleLinesEx :: proc(rec: Rectangle, lineThick: f32, color: Color) --- // Draw rectangle outline with extended parameters DrawRectangleRounded :: proc(rec: Rectangle, roundness: f32, segments: c.int, color: Color) --- // Draw rectangle with rounded edges DrawRectangleRoundedLines :: proc(rec: Rectangle, roundness: f32, segments: c.int, lineThick: c.int, color: Color) --- // Draw rectangle with rounded edges outline DrawTriangle :: proc(v1, v2, v3: Vector2, color: Color) --- // Draw a color-filled triangle (vertex in counter-clockwise order!) From 524d23d45dc38b60e9a99c745fb4a6164c776138 Mon Sep 17 00:00:00 2001 From: Patric Dexheimer Date: Tue, 1 Mar 2022 16:55:34 -0300 Subject: [PATCH 21/74] Update raylib.odin --- vendor/raylib/raylib.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/raylib/raylib.odin b/vendor/raylib/raylib.odin index 5e1b22b3d..93cdf3f04 100644 --- a/vendor/raylib/raylib.odin +++ b/vendor/raylib/raylib.odin @@ -1152,7 +1152,7 @@ foreign lib { DrawRectangleLines :: proc(posX, posY, width, height: c.int, color: Color) --- // Draw rectangle outline DrawRectangleLinesEx :: proc(rec: Rectangle, lineThick: f32, color: Color) --- // Draw rectangle outline with extended parameters DrawRectangleRounded :: proc(rec: Rectangle, roundness: f32, segments: c.int, color: Color) --- // Draw rectangle with rounded edges - DrawRectangleRoundedLines :: proc(rec: Rectangle, roundness: f32, segments: c.int, lineThick: c.int, color: Color) --- // Draw rectangle with rounded edges outline + DrawRectangleRoundedLines :: proc(rec: Rectangle, roundness: f32, segments: c.int, lineThick: f32, color: Color) --- // Draw rectangle with rounded edges outline DrawTriangle :: proc(v1, v2, v3: Vector2, color: Color) --- // Draw a color-filled triangle (vertex in counter-clockwise order!) DrawTriangleLines :: proc(v1, v2, v3: Vector2, color: Color) --- // Draw triangle outline (vertex in counter-clockwise order!) DrawTriangleFan :: proc(points: [^]Vector2, pointsCount: c.int, color: Color) --- // Draw a triangle fan defined by points (first vertex is the center) From 507722954c0390840d1ff0b0e8770428c3252114 Mon Sep 17 00:00:00 2001 From: Lucas Perlind Date: Wed, 2 Mar 2022 16:15:53 +1100 Subject: [PATCH 22/74] Improve core:fmt formatting * Strings will respect widths smaller than the string's length * Strings are right justified by default like integers * Strings accept '-' flag to be left justified * Booleans will be formatted like strings * Enums will be formatted like strings --- core/fmt/fmt.odin | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index d6c1894b7..d006d0ef8 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -605,7 +605,7 @@ fmt_bad_verb :: proc(using fi: ^Info, verb: rune) { fmt_bool :: proc(using fi: ^Info, b: bool, verb: rune) { switch verb { case 't', 'v': - io.write_string(writer, b ? "true" : "false", &fi.n) + fmt_string(fi, b ? "true" : "false", 's') case: fmt_bad_verb(fi, verb) } @@ -943,11 +943,27 @@ fmt_float :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune) { fmt_string :: proc(fi: ^Info, s: string, verb: rune) { switch verb { case 's', 'v': - io.write_string(fi.writer, s, &fi.n) - if fi.width_set && len(s) < fi.width { - for _ in 0.. len(s) { + if fi.minus { + io.write_string(fi.writer, s, &fi.n) + } + + for _ in 0.. Date: Wed, 2 Mar 2022 18:21:43 +0000 Subject: [PATCH 24/74] vendor: botan: simplify foreign import --- vendor/botan/bindings/botan.odin | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/vendor/botan/bindings/botan.odin b/vendor/botan/bindings/botan.odin index 3eaad0bc1..a12706e95 100644 --- a/vendor/botan/bindings/botan.odin +++ b/vendor/botan/bindings/botan.odin @@ -142,11 +142,7 @@ fpe_t :: ^fpe_struct when ODIN_OS == .Windows { foreign import botan_lib "botan.lib" -} else when ODIN_OS == .Linux { - foreign import botan_lib "system:botan-2" -} else when ODIN_OS == .Darwin { - foreign import botan_lib "system:botan-2" -} else when ODIN_OS == .OpenBSD { +} else { foreign import botan_lib "system:botan-2" } From 25430333ba89389c25acfdd78bfcf2b6e04af224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Wed, 2 Mar 2022 18:25:22 +0000 Subject: [PATCH 25/74] vendor: glfw: simplify foreign import --- vendor/glfw/bindings/bindings.odin | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/vendor/glfw/bindings/bindings.odin b/vendor/glfw/bindings/bindings.odin index fa9ef0776..aa1578153 100644 --- a/vendor/glfw/bindings/bindings.odin +++ b/vendor/glfw/bindings/bindings.odin @@ -3,9 +3,6 @@ package glfw_bindings import "core:c" import vk "vendor:vulkan" -when ODIN_OS == .Linux { foreign import glfw "system:glfw" } // TODO: Add the billion-or-so static libs to link to in linux -when ODIN_OS == .Darwin { foreign import glfw "system:glfw" } -when ODIN_OS == .OpenBSD { foreign import glfw "system:glfw" } when ODIN_OS == .Windows { foreign import glfw { "../lib/glfw3_mt.lib", @@ -13,6 +10,11 @@ when ODIN_OS == .Windows { "system:gdi32.lib", "system:shell32.lib", } +} else when ODIN_OS == .Linux { + // TODO: Add the billion-or-so static libs to link to in linux + foreign import glfw "system:glfw" +} else { + foreign import glfw "system:glfw" } #assert(size_of(c.int) == size_of(b32)) From 3145935d6bb1ffc9ca4f3f8ebdb8dc3edcac3ec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Wed, 2 Mar 2022 18:35:13 +0000 Subject: [PATCH 26/74] miniaudio - simplify foreign - enable SUPPORT_SNDIO on OpenBSD - correct ptr type for SUPPORT_PULSEAUDIO (Linux) and SUPPORT_COREAUDIO (Darwin) --- vendor/miniaudio/common.odin | 9 +++++++-- vendor/miniaudio/data_conversion.odin | 10 +++++++--- vendor/miniaudio/decoding.odin | 13 ++++++++----- vendor/miniaudio/device_io_procs.odin | 9 +++++++-- vendor/miniaudio/device_io_types.odin | 8 ++++---- vendor/miniaudio/encoding.odin | 11 ++++++++--- vendor/miniaudio/filtering.odin | 9 +++++++-- vendor/miniaudio/generation.odin | 11 ++++++++--- vendor/miniaudio/logging.odin | 11 ++++++++--- vendor/miniaudio/utilities.odin | 11 ++++++++--- vendor/miniaudio/vfs.odin | 9 +++++++-- 11 files changed, 79 insertions(+), 32 deletions(-) diff --git a/vendor/miniaudio/common.odin b/vendor/miniaudio/common.odin index 75b66101f..89e3d6bd2 100644 --- a/vendor/miniaudio/common.odin +++ b/vendor/miniaudio/common.odin @@ -2,8 +2,13 @@ package miniaudio import "core:c" -when ODIN_OS == .Windows { foreign import lib "lib/miniaudio.lib" } -when ODIN_OS == .Linux { foreign import lib "lib/miniaudio.a" } +when ODIN_OS == .Windows { + foreign import lib "lib/miniaudio.lib" +} else when ODIN_OS == .Linux { + foreign import lib "lib/miniaudio.a" +} else { + foreign import lib "system:miniaudio" +} handle :: distinct rawptr diff --git a/vendor/miniaudio/data_conversion.odin b/vendor/miniaudio/data_conversion.odin index 8a53cc19e..7167270a1 100644 --- a/vendor/miniaudio/data_conversion.odin +++ b/vendor/miniaudio/data_conversion.odin @@ -2,9 +2,13 @@ package miniaudio import "core:c" -when ODIN_OS == .Windows { foreign import lib "lib/miniaudio.lib" } -when ODIN_OS == .Linux { foreign import lib "lib/miniaudio.a" } - +when ODIN_OS == .Windows { + foreign import lib "lib/miniaudio.lib" +} else when ODIN_OS == .Linux { + foreign import lib "lib/miniaudio.a" +} else { + foreign import lib "system:miniaudio" +} /************************************************************************************************************************************************************ ************************************************************************************************************************************************************* diff --git a/vendor/miniaudio/decoding.odin b/vendor/miniaudio/decoding.odin index 52b315f10..dcf3b7a1a 100644 --- a/vendor/miniaudio/decoding.odin +++ b/vendor/miniaudio/decoding.odin @@ -2,10 +2,13 @@ package miniaudio import "core:c" -when ODIN_OS == .Windows { foreign import lib "lib/miniaudio.lib" } -when ODIN_OS == .Linux { foreign import lib "lib/miniaudio.a" } - - +when ODIN_OS == .Windows { + foreign import lib "lib/miniaudio.lib" +} else when ODIN_OS == .Linux { + foreign import lib "lib/miniaudio.a" +} else { + foreign import lib "system:miniaudio" +} /************************************************************************************************************************************************************ @@ -164,4 +167,4 @@ foreign lib { decode_from_vfs :: proc(pVFS: ^vfs, pFilePath: cstring, pConfig: ^decoder_config, pFrameCountOut: ^u64, ppPCMFramesOut: ^rawptr) -> result --- decode_file :: proc(pFilePath: cstring, pConfig: ^decoder_config, pFrameCountOut: ^u64, ppPCMFramesOut: ^rawptr) -> result --- decode_memory :: proc(pData: rawptr, dataSize: c.size_t, pConfig: ^decoder_config, pFrameCountOut: ^u64, ppPCMFramesOut: ^rawptr) -> result --- -} \ No newline at end of file +} diff --git a/vendor/miniaudio/device_io_procs.odin b/vendor/miniaudio/device_io_procs.odin index 8d6609186..7cff3f621 100644 --- a/vendor/miniaudio/device_io_procs.odin +++ b/vendor/miniaudio/device_io_procs.odin @@ -1,7 +1,12 @@ package miniaudio -when ODIN_OS == .Windows { foreign import lib "lib/miniaudio.lib" } -when ODIN_OS == .Linux { foreign import lib "lib/miniaudio.a" } +when ODIN_OS == .Windows { + foreign import lib "lib/miniaudio.lib" +} else when ODIN_OS == .Linux { + foreign import lib "lib/miniaudio.a" +} else { + foreign import lib "system:miniaudio" +} import "core:c" diff --git a/vendor/miniaudio/device_io_types.odin b/vendor/miniaudio/device_io_types.odin index 7778e85cf..e05f94665 100644 --- a/vendor/miniaudio/device_io_types.odin +++ b/vendor/miniaudio/device_io_types.odin @@ -6,7 +6,7 @@ SUPPORT_WASAPI :: ODIN_OS == .Windows SUPPORT_DSOUND :: ODIN_OS == .Windows SUPPORT_WINMM :: ODIN_OS == .Windows SUPPORT_COREAUDIO :: ODIN_OS == .Darwin -SUPPORT_SNDIO :: false // ODIN_OS == .OpenBSD +SUPPORT_SNDIO :: ODIN_OS == .OpenBSD SUPPORT_AUDIO4 :: false // ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD SUPPORT_OSS :: ODIN_OS == .FreeBSD SUPPORT_PULSEAUDIO :: ODIN_OS == .Linux @@ -739,8 +739,8 @@ context_type :: struct { pa_stream_writable_size: proc "system" (), pa_stream_readable_size: proc "system" (), - /*pa_mainloop**/ pMainLoop: ptr, - /*pa_context**/ pPulseContext: ptr, + /*pa_mainloop**/ pMainLoop: rawptr, + /*pa_context**/ pPulseContext: rawptr, } when SUPPORT_PULSEAUDIO else struct {}), jack: (struct { @@ -791,7 +791,7 @@ context_type :: struct { AudioUnitInitialize: proc "system" (), AudioUnitRender: proc "system" (), - /*AudioComponent*/ component: ptr, + /*AudioComponent*/ component: rawptr, noAudioSessionDeactivate: b32, /* For tracking whether or not the iOS audio session should be explicitly deactivated. Set from the config in ma_context_init__coreaudio(). */ } when SUPPORT_COREAUDIO else struct {}), diff --git a/vendor/miniaudio/encoding.odin b/vendor/miniaudio/encoding.odin index 83f9d5252..9b84108dc 100644 --- a/vendor/miniaudio/encoding.odin +++ b/vendor/miniaudio/encoding.odin @@ -2,8 +2,13 @@ package miniaudio import "core:c" -when ODIN_OS == .Windows { foreign import lib "lib/miniaudio.lib" } -when ODIN_OS == .Linux { foreign import lib "lib/miniaudio.a" } +when ODIN_OS == .Windows { + foreign import lib "lib/miniaudio.lib" +} else when ODIN_OS == .Linux { + foreign import lib "lib/miniaudio.a" +} else { + foreign import lib "system:miniaudio" +} /************************************************************************************************************************************************************ @@ -49,4 +54,4 @@ foreign lib { encoder_init_file_w :: proc(pFilePath: [^]c.wchar_t, pConfig: ^encoder_config, pEncoder: ^encoder) -> result --- encoder_uninit :: proc(pEncoder: ^encoder) --- encoder_write_pcm_frames :: proc(pEncoder: ^encoder, FramesIn: rawptr, frameCount: u64) -> u64 --- -} \ No newline at end of file +} diff --git a/vendor/miniaudio/filtering.odin b/vendor/miniaudio/filtering.odin index 4956da173..9949f6338 100644 --- a/vendor/miniaudio/filtering.odin +++ b/vendor/miniaudio/filtering.odin @@ -1,7 +1,12 @@ package miniaudio -when ODIN_OS == .Windows { foreign import lib "lib/miniaudio.lib" } -when ODIN_OS == .Linux { foreign import lib "lib/miniaudio.a" } +when ODIN_OS == .Windows { + foreign import lib "lib/miniaudio.lib" +} else when ODIN_OS == .Linux { + foreign import lib "lib/miniaudio.a" +} else { + foreign import lib "system:miniaudio" +} /************************************************************************************************************************************************************** diff --git a/vendor/miniaudio/generation.odin b/vendor/miniaudio/generation.odin index c241f00b1..97b7d453c 100644 --- a/vendor/miniaudio/generation.odin +++ b/vendor/miniaudio/generation.odin @@ -2,8 +2,13 @@ package miniaudio import "core:c" -when ODIN_OS == .Windows { foreign import lib "lib/miniaudio.lib" } -when ODIN_OS == .Linux { foreign import lib "lib/miniaudio.a" } +when ODIN_OS == .Windows { + foreign import lib "lib/miniaudio.lib" +} else when ODIN_OS == .Linux { + foreign import lib "lib/miniaudio.a" +} else { + foreign import lib "system:miniaudio" +} waveform_type :: enum c.int { sine, @@ -82,4 +87,4 @@ foreign lib { noise_set_amplitude :: proc(pNoise: ^noise, amplitude: f64) -> result --- noise_set_seed :: proc(pNoise: ^noise, seed: i32) -> result --- noise_set_type :: proc(pNoise: ^noise, type: noise_type) -> result --- -} \ No newline at end of file +} diff --git a/vendor/miniaudio/logging.odin b/vendor/miniaudio/logging.odin index 35aa54bc9..0c14a10c2 100644 --- a/vendor/miniaudio/logging.odin +++ b/vendor/miniaudio/logging.odin @@ -2,8 +2,13 @@ package miniaudio import c "core:c/libc" -when ODIN_OS == .Windows { foreign import lib "lib/miniaudio.lib" } -when ODIN_OS == .Linux { foreign import lib "lib/miniaudio.a" } +when ODIN_OS == .Windows { + foreign import lib "lib/miniaudio.lib" +} else when ODIN_OS == .Linux { + foreign import lib "lib/miniaudio.a" +} else { + foreign import lib "system:miniaudio" +} MAX_LOG_CALLBACKS :: 4 @@ -32,4 +37,4 @@ foreign lib { log_post :: proc(pLog: ^log, level: u32, pMessage: cstring) -> result --- log_postv :: proc(pLog: ^log, level: u32, pFormat: cstring, args: c.va_list) -> result --- log_postf :: proc(pLog: ^log, level: u32, pFormat: cstring, #c_vararg args: ..any) -> result --- -} \ No newline at end of file +} diff --git a/vendor/miniaudio/utilities.odin b/vendor/miniaudio/utilities.odin index 19307a77d..9ced019f5 100644 --- a/vendor/miniaudio/utilities.odin +++ b/vendor/miniaudio/utilities.odin @@ -1,7 +1,12 @@ package miniaudio -when ODIN_OS == .Windows { foreign import lib "lib/miniaudio.lib" } -when ODIN_OS == .Linux { foreign import lib "lib/miniaudio.a" } +when ODIN_OS == .Windows { + foreign import lib "lib/miniaudio.lib" +} else when ODIN_OS == .Linux { + foreign import lib "lib/miniaudio.a" +} else { + foreign import lib "system:miniaudio" +} @(default_calling_convention="c", link_prefix="ma_") foreign lib { @@ -228,4 +233,4 @@ foreign lib { audio_buffer_get_cursor_in_pcm_frames :: proc(pAudioBuffer: ^audio_buffer, pCursor: ^u64) -> result --- audio_buffer_get_length_in_pcm_frames :: proc(pAudioBuffer: ^audio_buffer, pLength: ^u64) -> result --- audio_buffer_get_available_frames :: proc(pAudioBuffer: ^audio_buffer, pAvailableFrames: ^u64) -> result --- -} \ No newline at end of file +} diff --git a/vendor/miniaudio/vfs.odin b/vendor/miniaudio/vfs.odin index 547fbd265..85571341e 100644 --- a/vendor/miniaudio/vfs.odin +++ b/vendor/miniaudio/vfs.odin @@ -2,8 +2,13 @@ package miniaudio import "core:c" -when ODIN_OS == .Windows { foreign import lib "lib/miniaudio.lib" } -when ODIN_OS == .Linux { foreign import lib "lib/miniaudio.a" } +when ODIN_OS == .Windows { + foreign import lib "lib/miniaudio.lib" +} else when ODIN_OS == .Linux { + foreign import lib "lib/miniaudio.a" +} else { + foreign import lib "system:miniaudio" +} /************************************************************************************************************************************************************ From d3f3528d1d545c581c368d5d0810c2b5cf061479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Wed, 2 Mar 2022 18:43:17 +0000 Subject: [PATCH 27/74] vendor: portmidi: simplify foreign import --- vendor/portmidi/portmidi.odin | 4 +++- vendor/portmidi/util.odin | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/vendor/portmidi/portmidi.odin b/vendor/portmidi/portmidi.odin index 40fd18b8b..a3db4191c 100644 --- a/vendor/portmidi/portmidi.odin +++ b/vendor/portmidi/portmidi.odin @@ -9,6 +9,8 @@ when ODIN_OS == .Windows { "system:Winmm.lib", "system:Advapi32.lib", } +} else { + foreign import lib "system:portmidi" } #assert(size_of(b32) == size_of(c.int)) @@ -519,4 +521,4 @@ foreign lib { WriteSysEx() writes a timestamped system-exclusive midi message. */ WriteSysEx :: proc(stream: Stream, whence: Timestamp, msg: cstring) -> Error --- -} \ No newline at end of file +} diff --git a/vendor/portmidi/util.odin b/vendor/portmidi/util.odin index ca2e1f4ca..caf73f8ad 100644 --- a/vendor/portmidi/util.odin +++ b/vendor/portmidi/util.odin @@ -7,7 +7,11 @@ package portmidi import "core:c" -when ODIN_OS == .Windows { foreign import lib "portmidi_s.lib" } +when ODIN_OS == .Windows { + foreign import lib "portmidi_s.lib" +} else { + foreign import lib "system:portmidi" +} Queue :: distinct rawptr @@ -118,4 +122,4 @@ foreign lib { state, returns .NoError if successfully set overflow state. */ SetOverflow :: proc(queue: Queue) -> Error --- -} \ No newline at end of file +} From 5b783d637674e6be8724dd0c458777e5162b1ff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Wed, 2 Mar 2022 18:44:29 +0000 Subject: [PATCH 28/74] vendor: raylib: simplify foreign import --- vendor/raylib/raylib.odin | 8 +++++--- vendor/raylib/rlgl.odin | 10 +++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/vendor/raylib/raylib.odin b/vendor/raylib/raylib.odin index 0c8248683..e7c6532ef 100644 --- a/vendor/raylib/raylib.odin +++ b/vendor/raylib/raylib.odin @@ -99,15 +99,17 @@ when ODIN_OS == .Windows { "system:User32.lib", "system:Shell32.lib", } -} -when ODIN_OS == .Linux { +} else when ODIN_OS == .Linux { foreign import lib { "linux/libraylib.a", "system:dl", "system:pthread", } +} else when ODIN_OS == .Darwin { + foreign import lib "macos/libraylib.a" +} else { + foreign import lib "system:raylib" } -when ODIN_OS == .Darwin { foreign import lib "macos/libraylib.a" } VERSION :: "4.0" diff --git a/vendor/raylib/rlgl.odin b/vendor/raylib/rlgl.odin index 936a34765..7e7f2feea 100644 --- a/vendor/raylib/rlgl.odin +++ b/vendor/raylib/rlgl.odin @@ -10,9 +10,13 @@ when ODIN_OS == .Windows { "system:User32.lib", "system:Shell32.lib", } +} else when ODIN_OS == .Linux { + foreign import lib "linux/libraylib.a" +} else when ODIN_OS == .Darwin { + foreign import lib "macos/libraylib.a" +} else { + foreign import lib "system:raylib" } -when ODIN_OS == .Linux { foreign import lib "linux/libraylib.a" } -when ODIN_OS == .Darwin { foreign import lib "macos/libraylib.a" } GRAPHICS_API_OPENGL_11 :: false GRAPHICS_API_OPENGL_21 :: true @@ -378,4 +382,4 @@ foreign lib { // Quick and dirty cube/quad buffers load->draw->unload rlLoadDrawCube :: proc() --- // Load and draw a cube rlLoadDrawQuad :: proc() --- // Load and draw a quad -} \ No newline at end of file +} From 793117ed633a15a94d38be44658f381d03d2e0aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Wed, 2 Mar 2022 18:50:37 +0000 Subject: [PATCH 29/74] vendor: sdl2: simplify foreign import --- vendor/sdl2/image/sdl_image.odin | 10 +++++----- vendor/sdl2/mixer/sdl_mixer.odin | 10 +++++----- vendor/sdl2/net/sdl_net.odin | 10 +++++----- vendor/sdl2/sdl2.odin | 10 +++++----- vendor/sdl2/sdl_audio.odin | 10 +++++----- vendor/sdl2/sdl_blendmode.odin | 10 +++++----- vendor/sdl2/sdl_cpuinfo.odin | 10 +++++----- vendor/sdl2/sdl_events.odin | 10 +++++----- vendor/sdl2/sdl_gamecontroller.odin | 10 +++++----- vendor/sdl2/sdl_gesture_haptic.odin | 10 +++++----- vendor/sdl2/sdl_hints.odin | 10 +++++----- vendor/sdl2/sdl_joystick.odin | 10 +++++----- vendor/sdl2/sdl_keyboard.odin | 10 +++++----- vendor/sdl2/sdl_log.odin | 10 +++++----- vendor/sdl2/sdl_messagebox.odin | 10 +++++----- vendor/sdl2/sdl_metal.odin | 10 +++++----- vendor/sdl2/sdl_mouse.odin | 10 +++++----- vendor/sdl2/sdl_mutex.odin | 10 +++++----- vendor/sdl2/sdl_pixels.odin | 10 +++++----- vendor/sdl2/sdl_rect.odin | 10 +++++----- vendor/sdl2/sdl_render.odin | 10 +++++----- vendor/sdl2/sdl_rwops.odin | 10 +++++----- vendor/sdl2/sdl_stdinc.odin | 10 +++++----- vendor/sdl2/sdl_surface.odin | 10 +++++----- vendor/sdl2/sdl_system.odin | 10 +++++----- vendor/sdl2/sdl_syswm.odin | 10 +++++----- vendor/sdl2/sdl_thread.odin | 10 +++++----- vendor/sdl2/sdl_timer.odin | 10 +++++----- vendor/sdl2/sdl_touch.odin | 10 +++++----- vendor/sdl2/sdl_video.odin | 10 +++++----- vendor/sdl2/sdl_vulkan.odin | 10 +++++----- vendor/sdl2/ttf/sdl_ttf.odin | 10 +++++----- 32 files changed, 160 insertions(+), 160 deletions(-) diff --git a/vendor/sdl2/image/sdl_image.odin b/vendor/sdl2/image/sdl_image.odin index ad939a63a..204ec9a0d 100644 --- a/vendor/sdl2/image/sdl_image.odin +++ b/vendor/sdl2/image/sdl_image.odin @@ -3,11 +3,11 @@ package sdl2_image import "core:c" import SDL ".." -when ODIN_OS == .Windows { foreign import lib "SDL2_image.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2_image" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2_image" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2_image" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2_image" } +when ODIN_OS == .Windows { + foreign import lib "SDL2_image.lib" +} else { + foreign import lib "system:SDL2_image" +} bool :: SDL.bool diff --git a/vendor/sdl2/mixer/sdl_mixer.odin b/vendor/sdl2/mixer/sdl_mixer.odin index ad7670598..b0c16871d 100644 --- a/vendor/sdl2/mixer/sdl_mixer.odin +++ b/vendor/sdl2/mixer/sdl_mixer.odin @@ -3,11 +3,11 @@ package sdl2_mixer import "core:c" import SDL ".." -when ODIN_OS == .Windows { foreign import lib "SDL2_mixer.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2_mixer" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2_mixer" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2_mixer" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2_mixer" } +when ODIN_OS == .Windows { + foreign import lib "SDL2_mixer.lib" +} else { + foreign import lib "system:SDL2_mixer" +} MAJOR_VERSION :: 2 MINOR_VERSION :: 0 diff --git a/vendor/sdl2/net/sdl_net.odin b/vendor/sdl2/net/sdl_net.odin index 4aafe0bcf..579f245e5 100644 --- a/vendor/sdl2/net/sdl_net.odin +++ b/vendor/sdl2/net/sdl_net.odin @@ -3,11 +3,11 @@ package sdl2_net import "core:c" import SDL ".." -when ODIN_OS == .Windows { foreign import lib "SDL2_net.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2_net" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2_net" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2_net" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2_net" } +when ODIN_OS == .Windows { + foreign import lib "SDL2_net.lib" +} else { + foreign import lib "system:SDL2_net" +} bool :: SDL.bool diff --git a/vendor/sdl2/sdl2.odin b/vendor/sdl2/sdl2.odin index c270fc52f..24ecc38e6 100644 --- a/vendor/sdl2/sdl2.odin +++ b/vendor/sdl2/sdl2.odin @@ -25,11 +25,11 @@ package sdl2 import "core:c" import "core:intrinsics" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} version :: struct { major: u8, /**< major version */ diff --git a/vendor/sdl2/sdl_audio.odin b/vendor/sdl2/sdl_audio.odin index 686f1994a..28a59d947 100644 --- a/vendor/sdl2/sdl_audio.odin +++ b/vendor/sdl2/sdl_audio.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} /** * \brief Audio format flags. diff --git a/vendor/sdl2/sdl_blendmode.odin b/vendor/sdl2/sdl_blendmode.odin index 19e4b37aa..4fde5111b 100644 --- a/vendor/sdl2/sdl_blendmode.odin +++ b/vendor/sdl2/sdl_blendmode.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} /** * \brief The blend mode used in SDL_RenderCopy() and drawing operations. diff --git a/vendor/sdl2/sdl_cpuinfo.odin b/vendor/sdl2/sdl_cpuinfo.odin index 01a8d203a..c5175e4d5 100644 --- a/vendor/sdl2/sdl_cpuinfo.odin +++ b/vendor/sdl2/sdl_cpuinfo.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} /* This is a guess for the cacheline size used for padding. * Most x86 processors have a 64 byte cache line. diff --git a/vendor/sdl2/sdl_events.odin b/vendor/sdl2/sdl_events.odin index 45f9886a5..29f6e8a43 100644 --- a/vendor/sdl2/sdl_events.odin +++ b/vendor/sdl2/sdl_events.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} RELEASED :: 0 PRESSED :: 1 diff --git a/vendor/sdl2/sdl_gamecontroller.odin b/vendor/sdl2/sdl_gamecontroller.odin index 8c15cd779..76e0b8966 100644 --- a/vendor/sdl2/sdl_gamecontroller.odin +++ b/vendor/sdl2/sdl_gamecontroller.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} GameController :: struct {} diff --git a/vendor/sdl2/sdl_gesture_haptic.odin b/vendor/sdl2/sdl_gesture_haptic.odin index 961ae6ea6..a21e0df06 100644 --- a/vendor/sdl2/sdl_gesture_haptic.odin +++ b/vendor/sdl2/sdl_gesture_haptic.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} // Gesture diff --git a/vendor/sdl2/sdl_hints.odin b/vendor/sdl2/sdl_hints.odin index 150c8bcc6..913d4ea12 100644 --- a/vendor/sdl2/sdl_hints.odin +++ b/vendor/sdl2/sdl_hints.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} HINT_ACCELEROMETER_AS_JOYSTICK :: "SDL_ACCELEROMETER_AS_JOYSTICK" HINT_ALLOW_ALT_TAB_WHILE_GRABBED :: "SDL_ALLOW_ALT_TAB_WHILE_GRABBED" diff --git a/vendor/sdl2/sdl_joystick.odin b/vendor/sdl2/sdl_joystick.odin index f190c13e4..35ca5cdcc 100644 --- a/vendor/sdl2/sdl_joystick.odin +++ b/vendor/sdl2/sdl_joystick.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} Joystick :: struct {} diff --git a/vendor/sdl2/sdl_keyboard.odin b/vendor/sdl2/sdl_keyboard.odin index abc6bb838..f880286aa 100644 --- a/vendor/sdl2/sdl_keyboard.odin +++ b/vendor/sdl2/sdl_keyboard.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} Keysym :: struct { scancode: Scancode, /**< SDL physical key code - see ::SDL_Scancode for details */ diff --git a/vendor/sdl2/sdl_log.odin b/vendor/sdl2/sdl_log.odin index a496f5fbe..09b7eaef0 100644 --- a/vendor/sdl2/sdl_log.odin +++ b/vendor/sdl2/sdl_log.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} MAX_LOG_MESSAGE :: 4096 diff --git a/vendor/sdl2/sdl_messagebox.odin b/vendor/sdl2/sdl_messagebox.odin index e14cc5463..6228704ac 100644 --- a/vendor/sdl2/sdl_messagebox.odin +++ b/vendor/sdl2/sdl_messagebox.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} MessageBoxFlag :: enum u32 { _ = 0, diff --git a/vendor/sdl2/sdl_metal.odin b/vendor/sdl2/sdl_metal.odin index c297113c6..1eccf7f5a 100644 --- a/vendor/sdl2/sdl_metal.odin +++ b/vendor/sdl2/sdl_metal.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} MetalView :: distinct rawptr diff --git a/vendor/sdl2/sdl_mouse.odin b/vendor/sdl2/sdl_mouse.odin index 56478b6fb..13220c94b 100644 --- a/vendor/sdl2/sdl_mouse.odin +++ b/vendor/sdl2/sdl_mouse.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} Cursor :: struct {} diff --git a/vendor/sdl2/sdl_mutex.odin b/vendor/sdl2/sdl_mutex.odin index 2ce004b52..1fd5849e0 100644 --- a/vendor/sdl2/sdl_mutex.odin +++ b/vendor/sdl2/sdl_mutex.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} MUTEX_TIMEDOUT :: 1 MUTEX_MAXWAIT :: ~u32(0) diff --git a/vendor/sdl2/sdl_pixels.odin b/vendor/sdl2/sdl_pixels.odin index 34ff23b14..8ee06aa1a 100644 --- a/vendor/sdl2/sdl_pixels.odin +++ b/vendor/sdl2/sdl_pixels.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} ALPHA_OPAQUE :: 255 ALPHA_TRANSPARENT :: 0 diff --git a/vendor/sdl2/sdl_rect.odin b/vendor/sdl2/sdl_rect.odin index fdf18aa65..852309cd2 100644 --- a/vendor/sdl2/sdl_rect.odin +++ b/vendor/sdl2/sdl_rect.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} Point :: struct { x: c.int, diff --git a/vendor/sdl2/sdl_render.odin b/vendor/sdl2/sdl_render.odin index dd599f669..57845235b 100644 --- a/vendor/sdl2/sdl_render.odin +++ b/vendor/sdl2/sdl_render.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} RendererFlag :: enum u32 { SOFTWARE = 0, /**< The renderer is a software fallback */ diff --git a/vendor/sdl2/sdl_rwops.odin b/vendor/sdl2/sdl_rwops.odin index fd7abc0c4..86fb23c75 100644 --- a/vendor/sdl2/sdl_rwops.odin +++ b/vendor/sdl2/sdl_rwops.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} /* RWops Types */ RWOPS_UNKNOWN :: 0 /**< Unknown stream type */ diff --git a/vendor/sdl2/sdl_stdinc.odin b/vendor/sdl2/sdl_stdinc.odin index 15446eb71..97722f4fe 100644 --- a/vendor/sdl2/sdl_stdinc.odin +++ b/vendor/sdl2/sdl_stdinc.odin @@ -5,11 +5,11 @@ import "core:intrinsics" import "core:runtime" _, _ :: intrinsics, runtime -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} bool :: distinct b32 #assert(size_of(bool) == size_of(c.int)) diff --git a/vendor/sdl2/sdl_surface.odin b/vendor/sdl2/sdl_surface.odin index 82545f1f9..f50de35f7 100644 --- a/vendor/sdl2/sdl_surface.odin +++ b/vendor/sdl2/sdl_surface.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} SWSURFACE :: 0 /**< Just here for compatibility */ PREALLOC :: 0x00000001 /**< Surface uses preallocated memory */ diff --git a/vendor/sdl2/sdl_system.odin b/vendor/sdl2/sdl_system.odin index cd08cfc47..d9b6b98df 100644 --- a/vendor/sdl2/sdl_system.odin +++ b/vendor/sdl2/sdl_system.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} // General @(default_calling_convention="c", link_prefix="SDL_") diff --git a/vendor/sdl2/sdl_syswm.odin b/vendor/sdl2/sdl_syswm.odin index f2b52529f..62ca9d628 100644 --- a/vendor/sdl2/sdl_syswm.odin +++ b/vendor/sdl2/sdl_syswm.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} SYSWM_TYPE :: enum c.int { UNKNOWN, diff --git a/vendor/sdl2/sdl_thread.odin b/vendor/sdl2/sdl_thread.odin index 0d9d66d30..5d1c0bd37 100644 --- a/vendor/sdl2/sdl_thread.odin +++ b/vendor/sdl2/sdl_thread.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} Thread :: struct {} diff --git a/vendor/sdl2/sdl_timer.odin b/vendor/sdl2/sdl_timer.odin index 13003b5b3..d71ed2da5 100644 --- a/vendor/sdl2/sdl_timer.odin +++ b/vendor/sdl2/sdl_timer.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} TimerCallback :: proc "c" (interval: u32, param: rawptr) -> u32 TimerID :: distinct c.int diff --git a/vendor/sdl2/sdl_touch.odin b/vendor/sdl2/sdl_touch.odin index ffb91328a..f2a8cc695 100644 --- a/vendor/sdl2/sdl_touch.odin +++ b/vendor/sdl2/sdl_touch.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} TouchID :: distinct i64 FingerID :: distinct i64 diff --git a/vendor/sdl2/sdl_video.odin b/vendor/sdl2/sdl_video.odin index d050e272d..86b564541 100644 --- a/vendor/sdl2/sdl_video.odin +++ b/vendor/sdl2/sdl_video.odin @@ -2,11 +2,11 @@ package sdl2 import "core:c" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} DisplayMode :: struct { format: u32, /**< pixel format */ diff --git a/vendor/sdl2/sdl_vulkan.odin b/vendor/sdl2/sdl_vulkan.odin index 13e25f8c2..33bb8e51c 100644 --- a/vendor/sdl2/sdl_vulkan.odin +++ b/vendor/sdl2/sdl_vulkan.odin @@ -3,11 +3,11 @@ package sdl2 import "core:c" import vk "vendor:vulkan" -when ODIN_OS == .Windows { foreign import lib "SDL2.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2" } +when ODIN_OS == .Windows { + foreign import lib "SDL2.lib" +} else { + foreign import lib "system:SDL2" +} VkInstance :: vk.Instance VkSurfaceKHR :: vk.SurfaceKHR diff --git a/vendor/sdl2/ttf/sdl_ttf.odin b/vendor/sdl2/ttf/sdl_ttf.odin index e84c89136..ca9beded0 100644 --- a/vendor/sdl2/ttf/sdl_ttf.odin +++ b/vendor/sdl2/ttf/sdl_ttf.odin @@ -3,11 +3,11 @@ package sdl2_ttf import "core:c" import SDL ".." -when ODIN_OS == .Windows { foreign import lib "SDL2_ttf.lib" } -when ODIN_OS == .Linux { foreign import lib "system:SDL2_ttf" } -when ODIN_OS == .Darwin { foreign import lib "system:SDL2_ttf" } -when ODIN_OS == .FreeBSD { foreign import lib "system:SDL2_ttf" } -when ODIN_OS == .OpenBSD { foreign import lib "system:SDL2_ttf" } +when ODIN_OS == .Windows { + foreign import lib "SDL2_ttf.lib" +} else { + foreign import lib "system:SDL2_ttf" +} bool :: SDL.bool From 562901aedf5a66c9d0664f223818617fa639a718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Wed, 2 Mar 2022 19:21:22 +0000 Subject: [PATCH 30/74] split all_vendor.odin create 3 files: - all_vendor.odin : no specific OS - all_vendor_directx.odin : directx vendor, windows-only - all_vendor_stb.odin : stb vendor, windows and linux only stb could technically be used on others OS. but it is shipped upstream as set of c-files without unified library name. --- examples/all/all_vendor.odin | 23 +---------------------- examples/all/all_vendor_directx.odin | 10 ++++++++++ examples/all/all_vendor_stl.odin | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 22 deletions(-) create mode 100644 examples/all/all_vendor_directx.odin create mode 100644 examples/all/all_vendor_stl.odin diff --git a/examples/all/all_vendor.odin b/examples/all/all_vendor.odin index 9aa109e5b..f83e906a2 100644 --- a/examples/all/all_vendor.odin +++ b/examples/all/all_vendor.odin @@ -1,4 +1,3 @@ -//+build windows package all import botan "vendor:botan" @@ -16,24 +15,12 @@ import IMG "vendor:sdl2/image" import MIX "vendor:sdl2/mixer" import TTF "vendor:sdl2/ttf" -import stb_easy_font "vendor:stb/easy_font" -import stbi "vendor:stb/image" -import stbrp "vendor:stb/rect_pack" -import stbtt "vendor:stb/truetype" -import stb_vorbis "vendor:stb/vorbis" - import vk "vendor:vulkan" -import D3D11 "vendor:directx/d3d11" -import D3D12 "vendor:directx/d3d12" -import DXGI "vendor:directx/dxgi" - -// note these are technicaly darwin only but they are added to aid with documentation generation import NS "vendor:darwin/Foundation" import MTL "vendor:darwin/Metal" import CA "vendor:darwin/QuartzCore" - _ :: botan _ :: ENet _ :: gl @@ -47,15 +34,7 @@ _ :: SDLNet _ :: IMG _ :: MIX _ :: TTF -_ :: stb_easy_font -_ :: stbi -_ :: stbrp -_ :: stbtt -_ :: stb_vorbis _ :: vk -_ :: D3D11 -_ :: D3D12 -_ :: DXGI _ :: NS _ :: MTL -_ :: CA \ No newline at end of file +_ :: CA diff --git a/examples/all/all_vendor_directx.odin b/examples/all/all_vendor_directx.odin new file mode 100644 index 000000000..2f10d92f8 --- /dev/null +++ b/examples/all/all_vendor_directx.odin @@ -0,0 +1,10 @@ +//+build windows +package all + +import D3D11 "vendor:directx/d3d11" +import D3D12 "vendor:directx/d3d12" +import DXGI "vendor:directx/dxgi" + +_ :: D3D11 +_ :: D3D12 +_ :: DXGI diff --git a/examples/all/all_vendor_stl.odin b/examples/all/all_vendor_stl.odin new file mode 100644 index 000000000..9faf53c63 --- /dev/null +++ b/examples/all/all_vendor_stl.odin @@ -0,0 +1,15 @@ +//+build windows, linux +package all + +import stb_easy_font "vendor:stb/easy_font" +import stbi "vendor:stb/image" +import stbrp "vendor:stb/rect_pack" +import stbtt "vendor:stb/truetype" +import stb_vorbis "vendor:stb/vorbis" + +_ :: stb_easy_font +_ :: stbi +_ :: stbrp +_ :: stbtt +_ :: stb_vorbis + From 3b4199a66977dff1c65f90de5270e7b0ef43206e Mon Sep 17 00:00:00 2001 From: zhibog Date: Wed, 2 Mar 2022 21:22:56 +0100 Subject: [PATCH 31/74] Added rand_bytes for Windows in core:crypto --- core/crypto/rand_generic.odin | 2 +- core/crypto/rand_windows.odin | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 core/crypto/rand_windows.odin diff --git a/core/crypto/rand_generic.odin b/core/crypto/rand_generic.odin index 10edc1c8a..52abfe4d7 100644 --- a/core/crypto/rand_generic.odin +++ b/core/crypto/rand_generic.odin @@ -1,6 +1,6 @@ package crypto -when ODIN_OS != .Linux && ODIN_OS != .OpenBSD { +when ODIN_OS != .Linux && ODIN_OS != .OpenBSD && ODIN_OS != .Windows { _rand_bytes :: proc (dst: []byte) { unimplemented("crypto: rand_bytes not supported on this OS") } diff --git a/core/crypto/rand_windows.odin b/core/crypto/rand_windows.odin new file mode 100644 index 000000000..53b58c776 --- /dev/null +++ b/core/crypto/rand_windows.odin @@ -0,0 +1,23 @@ +package crypto + +import win32 "core:sys/windows" +import "core:os" +import "core:fmt" + +_rand_bytes :: proc(dst: []byte) { + ret := (os.Errno)(win32.BCryptGenRandom(nil, raw_data(dst), u32(len(dst)), win32.BCRYPT_USE_SYSTEM_PREFERRED_RNG)) + if ret != os.ERROR_NONE { + switch ret { + case os.ERROR_INVALID_HANDLE: + // The handle to the first parameter is invalid. + // This should not happen here, since we explicitly pass nil to it + panic("crypto: BCryptGenRandom Invalid handle for hAlgorithm") + case os.ERROR_INVALID_PARAMETER: + // One of the parameters was invalid + panic("crypto: BCryptGenRandom Invalid parameter") + case: + // Unknown error + panic(fmt.tprintf("crypto: BCryptGenRandom failed: %d\n", ret)) + } + } +} From f126e050348f7a59f244ca24a5d6e9685bd9f696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Thu, 3 Mar 2022 07:36:47 +0000 Subject: [PATCH 32/74] stb, miniaudio: use default builtin variables of make for CC and AR --- vendor/miniaudio/src/Makefile | 6 +++--- vendor/stb/src/Makefile | 26 +++++++++++++------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/vendor/miniaudio/src/Makefile b/vendor/miniaudio/src/Makefile index 7ff72ebdc..3c61b5e2f 100644 --- a/vendor/miniaudio/src/Makefile +++ b/vendor/miniaudio/src/Makefile @@ -1,6 +1,6 @@ all: mkdir -p ../lib - gcc -c -O2 -Os -fPIC miniaudio.c - ar rcs ../lib/miniaudio.a miniaudio.o - #gcc -fPIC -shared -Wl,-soname=miniaudio.so -o ../lib/miniaudio.so miniaudio.o + $(CC) -c -O2 -Os -fPIC miniaudio.c + $(AR) rcs ../lib/miniaudio.a miniaudio.o + #$(CC) -fPIC -shared -Wl,-soname=miniaudio.so -o ../lib/miniaudio.so miniaudio.o rm *.o diff --git a/vendor/stb/src/Makefile b/vendor/stb/src/Makefile index c65aa7263..5504fede9 100644 --- a/vendor/stb/src/Makefile +++ b/vendor/stb/src/Makefile @@ -1,16 +1,16 @@ all: mkdir -p ../lib - gcc -c -O2 -Os -fPIC stb_image.c stb_image_write.c stb_image_resize.c stb_truetype.c stb_rect_pack.c stb_vorbis.c - ar rcs ../lib/stb_image.a stb_image.o - ar rcs ../lib/stb_image_write.a stb_image_write.o - ar rcs ../lib/stb_image_resize.a stb_image_resize.o - ar rcs ../lib/stb_truetype.a stb_truetype.o - ar rcs ../lib/stb_rect_pack.a stb_rect_pack.o - #ar rcs ../lib/stb_vorbis_pack.a stb_vorbis_pack.o - #gcc -fPIC -shared -Wl,-soname=stb_image.so -o ../lib/stb_image.so stb_image.o - #gcc -fPIC -shared -Wl,-soname=stb_image_write.so -o ../lib/stb_image_write.so stb_image_write.o - #gcc -fPIC -shared -Wl,-soname=stb_image_resize.so -o ../lib/stb_image_resize.so stb_image_resize.o - #gcc -fPIC -shared -Wl,-soname=stb_truetype.so -o ../lib/stb_truetype.so stb_image_truetype.o - #gcc -fPIC -shared -Wl,-soname=stb_rect_pack.so -o ../lib/stb_rect_pack.so stb_rect_packl.o - #gcc -fPIC -shared -Wl,-soname=stb_vorbis.so -o ../lib/stb_vorbis.so stb_vorbisl.o + $(CC) -c -O2 -Os -fPIC stb_image.c stb_image_write.c stb_image_resize.c stb_truetype.c stb_rect_pack.c stb_vorbis.c + $(AR) rcs ../lib/stb_image.a stb_image.o + $(AR) rcs ../lib/stb_image_write.a stb_image_write.o + $(AR) rcs ../lib/stb_image_resize.a stb_image_resize.o + $(AR) rcs ../lib/stb_truetype.a stb_truetype.o + $(AR) rcs ../lib/stb_rect_pack.a stb_rect_pack.o + #$(AR) rcs ../lib/stb_vorbis_pack.a stb_vorbis_pack.o + #$(CC) -fPIC -shared -Wl,-soname=stb_image.so -o ../lib/stb_image.so stb_image.o + #$(CC) -fPIC -shared -Wl,-soname=stb_image_write.so -o ../lib/stb_image_write.so stb_image_write.o + #$(CC) -fPIC -shared -Wl,-soname=stb_image_resize.so -o ../lib/stb_image_resize.so stb_image_resize.o + #$(CC) -fPIC -shared -Wl,-soname=stb_truetype.so -o ../lib/stb_truetype.so stb_image_truetype.o + #$(CC) -fPIC -shared -Wl,-soname=stb_rect_pack.so -o ../lib/stb_rect_pack.so stb_rect_packl.o + #$(CC) -fPIC -shared -Wl,-soname=stb_vorbis.so -o ../lib/stb_vorbis.so stb_vorbisl.o rm *.o From 3dcea60f5b5b390b8cf95085a85e3e65af26133d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Thu, 3 Mar 2022 09:27:10 +0000 Subject: [PATCH 33/74] vendor: ENet: follow strict-style and remove optional semi-colon --- vendor/ENet/unix.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/ENet/unix.odin b/vendor/ENet/unix.odin index a86e9837c..05ce41e05 100644 --- a/vendor/ENet/unix.odin +++ b/vendor/ENet/unix.odin @@ -14,7 +14,7 @@ import "core:c" @(private="file") FD_ZERO :: #force_inline proc(s: ^fd_set) { for i := size_of(fd_set) / size_of(c.long); i != 0; i -= 1 { - s.fds_bits[i] = 0; + s.fds_bits[i] = 0 } } From ee28945e09bc49aa4217fffb6ba8dc2e82681e01 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 3 Mar 2022 11:19:12 +0000 Subject: [PATCH 34/74] Update FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 89b7ffa10..885612f13 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,4 @@ # These are supported funding model platforms +github: odin-lang patreon: gingerbill From 96e36c7c395025a7db5f37675eddbf6d143f3fff Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 3 Mar 2022 13:54:23 +0000 Subject: [PATCH 35/74] Minor fix to strconv.unquote_string --- core/strconv/strconv.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/strconv/strconv.odin b/core/strconv/strconv.odin index 6ea8b39e6..65161a820 100644 --- a/core/strconv/strconv.odin +++ b/core/strconv/strconv.odin @@ -895,6 +895,7 @@ unquote_string :: proc(lit: string, allocator := context.allocator) -> (res: str if s == `""` { return "", false, true } + s = s[1:len(s)-1] if contains_rune(s, '\n') >= 0 { return s, false, false From bd1b54e0db0bb599f3118c60aac7fdaaaa0dacd4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 3 Mar 2022 13:58:22 +0000 Subject: [PATCH 36/74] Fix #1503 --- core/odin/ast/clone.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/odin/ast/clone.odin b/core/odin/ast/clone.odin index 723f7b90d..1f2eee124 100644 --- a/core/odin/ast/clone.odin +++ b/core/odin/ast/clone.odin @@ -98,7 +98,7 @@ clone_node :: proc(node: ^Node) -> ^Node { reflect.set_union_value(res.derived, derived_expr) reflect.set_union_value(res.derived, derived_stmt) - switch r in res.derived { + if res.derived != nil do switch r in res.derived { case ^Package, ^File: case ^Bad_Expr: case ^Ident: @@ -313,7 +313,7 @@ clone_node :: proc(node: ^Node) -> ^Node { r.tag = clone(r.tag) r.type = clone(r.type) case: - fmt.panicf("Unhandled node kind: %T", r) + fmt.panicf("Unhandled node kind: %v", r) } return res From 2944969ca027f87d278233bb327f12b271522f62 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 3 Mar 2022 14:01:37 +0000 Subject: [PATCH 37/74] Correct `clone_node` --- core/odin/ast/clone.odin | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/odin/ast/clone.odin b/core/odin/ast/clone.odin index 1f2eee124..b0d997091 100644 --- a/core/odin/ast/clone.odin +++ b/core/odin/ast/clone.odin @@ -68,12 +68,13 @@ clone_node :: proc(node: ^Node) -> ^Node { return nil } - size := size_of(Node) + size := size_of(Node) align := align_of(Node) ti := reflect.union_variant_type_info(node.derived) if ti != nil { - size = ti.size - align = ti.align + elem := ti.variant.(reflect.Type_Info_Pointer).elem + size = elem.size + align = elem.align } #partial switch in node.derived { From 8af08f2153294174075b569e81f421a2efd4b183 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 3 Mar 2022 15:10:19 +0100 Subject: [PATCH 38/74] [compress] 32-bit cleanness. --- core/compress/common.odin | 8 +++++++- core/compress/gzip/gzip.odin | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/compress/common.odin b/core/compress/common.odin index 5f5ef2413..8bc7d240d 100644 --- a/core/compress/common.odin +++ b/core/compress/common.odin @@ -139,7 +139,13 @@ Context_Memory_Input :: struct #packed { size_packed: i64, size_unpacked: i64, } -#assert(size_of(Context_Memory_Input) == 64) +when size_of(rawptr) == 8 { + #assert(size_of(Context_Memory_Input) == 64) +} else { + // e.g. `-target:windows_386` + #assert(size_of(Context_Memory_Input) == 52) +} + Context_Stream_Input :: struct #packed { input_data: []u8, diff --git a/core/compress/gzip/gzip.odin b/core/compress/gzip/gzip.odin index 96e9c49a0..4482d4a7e 100644 --- a/core/compress/gzip/gzip.odin +++ b/core/compress/gzip/gzip.odin @@ -100,7 +100,7 @@ E_GZIP :: compress.GZIP_Error E_ZLIB :: compress.ZLIB_Error E_Deflate :: compress.Deflate_Error -GZIP_MAX_PAYLOAD_SIZE :: int(max(u32le)) +GZIP_MAX_PAYLOAD_SIZE :: i64(max(u32le)) load :: proc{load_from_slice, load_from_file, load_from_context} @@ -136,7 +136,7 @@ load_from_context :: proc(z: ^$C, buf: ^bytes.Buffer, known_gzip_size := -1, exp z.output = buf - if expected_output_size > GZIP_MAX_PAYLOAD_SIZE { + if i64(expected_output_size) > i64(GZIP_MAX_PAYLOAD_SIZE) { return E_GZIP.Payload_Size_Exceeds_Max_Payload } From 6d9f84ba030c3903dbfb213ee0a0e7a83d410b71 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 3 Mar 2022 15:16:16 +0100 Subject: [PATCH 39/74] [tests] Make test runners exit with errorlevel 1 if a test fails. --- tests/core/compress/test_core_compress.odin | 3 +++ tests/core/crypto/test_core_crypto.odin | 4 ++++ tests/core/encoding/test_core_json.odin | 4 ++++ tests/core/hash/test_core_hash.odin | 4 ++++ tests/core/image/test_core_image.odin | 3 +++ tests/core/math/noise/test_core_math_noise.odin | 4 ++++ tests/core/odin/test_parser.odin | 5 ++++- tests/core/strings/test_core_strings.odin | 4 ++++ tests/vendor/botan/test_vendor_botan.odin | 4 ++++ tests/vendor/glfw/test_vendor_glfw.odin | 4 ++++ 10 files changed, 38 insertions(+), 1 deletion(-) diff --git a/tests/core/compress/test_core_compress.odin b/tests/core/compress/test_core_compress.odin index c925c0258..73c69445a 100644 --- a/tests/core/compress/test_core_compress.odin +++ b/tests/core/compress/test_core_compress.odin @@ -52,6 +52,9 @@ main :: proc() { gzip_test(&t) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } @test diff --git a/tests/core/crypto/test_core_crypto.odin b/tests/core/crypto/test_core_crypto.odin index 5682a6167..f2e5b48d9 100644 --- a/tests/core/crypto/test_core_crypto.odin +++ b/tests/core/crypto/test_core_crypto.odin @@ -37,6 +37,7 @@ import "core:crypto/jh" import "core:crypto/groestl" import "core:crypto/haval" import "core:crypto/siphash" +import "core:os" TEST_count := 0 TEST_fail := 0 @@ -127,6 +128,9 @@ main :: proc() { bench_modern(&t) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } TestHash :: struct { diff --git a/tests/core/encoding/test_core_json.odin b/tests/core/encoding/test_core_json.odin index f536eb4c6..702086ea2 100644 --- a/tests/core/encoding/test_core_json.odin +++ b/tests/core/encoding/test_core_json.odin @@ -3,6 +3,7 @@ package test_core_json import "core:encoding/json" import "core:testing" import "core:fmt" +import "core:os" TEST_count := 0 TEST_fail := 0 @@ -34,6 +35,9 @@ main :: proc() { marshal_json(&t) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } @test diff --git a/tests/core/hash/test_core_hash.odin b/tests/core/hash/test_core_hash.odin index 8baa604b6..f68767612 100644 --- a/tests/core/hash/test_core_hash.odin +++ b/tests/core/hash/test_core_hash.odin @@ -5,6 +5,7 @@ import "core:hash" import "core:time" import "core:testing" import "core:fmt" +import "core:os" TEST_count := 0 TEST_fail := 0 @@ -35,6 +36,9 @@ main :: proc() { test_xxhash_vectors(&t) test_crc64_vectors(&t) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } /* diff --git a/tests/core/image/test_core_image.odin b/tests/core/image/test_core_image.odin index 124166245..2171a0d92 100644 --- a/tests/core/image/test_core_image.odin +++ b/tests/core/image/test_core_image.odin @@ -57,6 +57,9 @@ main :: proc() { png_test(&t) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } PNG_Test :: struct { diff --git a/tests/core/math/noise/test_core_math_noise.odin b/tests/core/math/noise/test_core_math_noise.odin index c3a3e4228..be89d076a 100644 --- a/tests/core/math/noise/test_core_math_noise.odin +++ b/tests/core/math/noise/test_core_math_noise.odin @@ -3,6 +3,7 @@ package test_core_math_noise import "core:testing" import "core:math/noise" import "core:fmt" +import "core:os" TEST_count := 0 TEST_fail := 0 @@ -35,6 +36,9 @@ main :: proc() { t := testing.T{} noise_test(&t) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } Test_Vector :: struct { diff --git a/tests/core/odin/test_parser.odin b/tests/core/odin/test_parser.odin index 90d913d10..ef31f91db 100644 --- a/tests/core/odin/test_parser.odin +++ b/tests/core/odin/test_parser.odin @@ -2,7 +2,7 @@ package test_core_odin_parser import "core:testing" import "core:fmt" - +import "core:os" import "core:odin/parser" @@ -35,6 +35,9 @@ main :: proc() { test_parse_demo(&t) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } diff --git a/tests/core/strings/test_core_strings.odin b/tests/core/strings/test_core_strings.odin index fc1518349..c1f9603fd 100644 --- a/tests/core/strings/test_core_strings.odin +++ b/tests/core/strings/test_core_strings.odin @@ -3,6 +3,7 @@ package test_core_image import "core:strings" import "core:testing" import "core:fmt" +import "core:os" TEST_count := 0 TEST_fail := 0 @@ -35,6 +36,9 @@ main :: proc() { test_index_any_larger_string_found(&t) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } @test diff --git a/tests/vendor/botan/test_vendor_botan.odin b/tests/vendor/botan/test_vendor_botan.odin index 148eb03bd..f0ff44ac9 100644 --- a/tests/vendor/botan/test_vendor_botan.odin +++ b/tests/vendor/botan/test_vendor_botan.odin @@ -14,6 +14,7 @@ package test_vendor_botan import "core:testing" import "core:fmt" +import "core:os" import "vendor:botan/md4" import "vendor:botan/md5" @@ -86,6 +87,9 @@ main :: proc() { test_siphash_2_4(&t) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } TestHash :: struct { diff --git a/tests/vendor/glfw/test_vendor_glfw.odin b/tests/vendor/glfw/test_vendor_glfw.odin index 252df2033..baf46aa7e 100644 --- a/tests/vendor/glfw/test_vendor_glfw.odin +++ b/tests/vendor/glfw/test_vendor_glfw.odin @@ -3,6 +3,7 @@ package test_vendor_glfw import "core:testing" import "core:fmt" import "vendor:glfw" +import "core:os" GLFW_MAJOR :: 3 GLFW_MINOR :: 3 @@ -36,6 +37,9 @@ main :: proc() { test_glfw(&t) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } @(test) From 8c6f39a68d842cee2207eba23b97d17b33fbf36a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Thu, 3 Mar 2022 15:08:34 +0000 Subject: [PATCH 40/74] CI: add linux i386, Darwin arm64 and Windows 386 --- .github/workflows/ci.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 788c59311..107cdf455 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,6 +38,9 @@ jobs: cd tests/vendor make timeout-minutes: 10 + - name: Odin check examples/all for Linux i386 + run: ./odin check examples/all -vet -strict-style -target:linux_386 + timeout-minutes: 10 - name: Odin check examples/all for OpenBSD amd64 run: ./odin check examples/all -vet -strict-style -target:openbsd_amd64 timeout-minutes: 10 @@ -81,6 +84,9 @@ jobs: cd tests/vendor make timeout-minutes: 10 + - name: Odin check examples/all for Darwin arm64 + run: ./odin check examples/all -vet -strict-style -target:darwin_arm64 + timeout-minutes: 10 build_windows: runs-on: windows-2019 steps: @@ -141,3 +147,9 @@ jobs: cd tests\core\math\big call build.bat timeout-minutes: 10 + - name: Odin check examples/all for Windows 32bits + shell: cmd + run: | + call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat + odin check examples/all -strict-style -target:windows_386 + timeout-minutes: 10 From 499c657ffa09868ef306087ff3e71a546ae42021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Thu, 3 Mar 2022 15:28:18 +0000 Subject: [PATCH 41/74] rename architecture from 386 to i386 --- .github/workflows/ci.yml | 4 ++-- core/compress/common.odin | 4 ++-- src/build_settings.cpp | 18 +++++++++--------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 107cdf455..412587b3c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,7 +39,7 @@ jobs: make timeout-minutes: 10 - name: Odin check examples/all for Linux i386 - run: ./odin check examples/all -vet -strict-style -target:linux_386 + run: ./odin check examples/all -vet -strict-style -target:linux_i386 timeout-minutes: 10 - name: Odin check examples/all for OpenBSD amd64 run: ./odin check examples/all -vet -strict-style -target:openbsd_amd64 @@ -151,5 +151,5 @@ jobs: shell: cmd run: | call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat - odin check examples/all -strict-style -target:windows_386 + odin check examples/all -strict-style -target:windows_i386 timeout-minutes: 10 diff --git a/core/compress/common.odin b/core/compress/common.odin index 8bc7d240d..c8e86a97e 100644 --- a/core/compress/common.odin +++ b/core/compress/common.odin @@ -142,7 +142,7 @@ Context_Memory_Input :: struct #packed { when size_of(rawptr) == 8 { #assert(size_of(Context_Memory_Input) == 64) } else { - // e.g. `-target:windows_386` + // e.g. `-target:windows_i386` #assert(size_of(Context_Memory_Input) == 52) } @@ -479,4 +479,4 @@ discard_to_next_byte_lsb_from_stream :: proc(z: ^Context_Stream_Input) { consume_bits_lsb(z, discard) } -discard_to_next_byte_lsb :: proc{discard_to_next_byte_lsb_from_memory, discard_to_next_byte_lsb_from_stream}; \ No newline at end of file +discard_to_next_byte_lsb :: proc{discard_to_next_byte_lsb_from_memory, discard_to_next_byte_lsb_from_stream}; diff --git a/src/build_settings.cpp b/src/build_settings.cpp index c40a70069..9cb281656 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -280,7 +280,7 @@ bool global_ignore_warnings(void) { } -gb_global TargetMetrics target_windows_386 = { +gb_global TargetMetrics target_windows_i386 = { TargetOs_windows, TargetArch_i386, 4, @@ -296,7 +296,7 @@ gb_global TargetMetrics target_windows_amd64 = { str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"), }; -gb_global TargetMetrics target_linux_386 = { +gb_global TargetMetrics target_linux_i386 = { TargetOs_linux, TargetArch_i386, 4, @@ -339,7 +339,7 @@ gb_global TargetMetrics target_darwin_arm64 = { str_lit("e-m:o-i64:64-i128:128-n32:64-S128"), // TODO(bill): Is this correct? }; -gb_global TargetMetrics target_freebsd_386 = { +gb_global TargetMetrics target_freebsd_i386 = { TargetOs_freebsd, TargetArch_i386, 4, @@ -421,12 +421,12 @@ gb_global NamedTargetMetrics named_targets[] = { { str_lit("darwin_amd64"), &target_darwin_amd64 }, { str_lit("darwin_arm64"), &target_darwin_arm64 }, { str_lit("essence_amd64"), &target_essence_amd64 }, - { str_lit("linux_386"), &target_linux_386 }, + { str_lit("linux_i386"), &target_linux_i386 }, { str_lit("linux_amd64"), &target_linux_amd64 }, { str_lit("linux_arm64"), &target_linux_arm64 }, - { str_lit("windows_386"), &target_windows_386 }, + { str_lit("windows_i386"), &target_windows_i386 }, { str_lit("windows_amd64"), &target_windows_amd64 }, - { str_lit("freebsd_386"), &target_freebsd_386 }, + { str_lit("freebsd_i386"), &target_freebsd_i386 }, { str_lit("freebsd_amd64"), &target_freebsd_amd64 }, { str_lit("openbsd_amd64"), &target_openbsd_amd64 }, { str_lit("freestanding_wasm32"), &target_freestanding_wasm32 }, @@ -971,13 +971,13 @@ void init_build_context(TargetMetrics *cross_target) { #endif #else #if defined(GB_SYSTEM_WINDOWS) - metrics = &target_windows_386; + metrics = &target_windows_i386; #elif defined(GB_SYSTEM_OSX) #error "Build Error: Unsupported architecture" #elif defined(GB_SYSTEM_FREEBSD) - metrics = &target_freebsd_386; + metrics = &target_freebsd_i386; #else - metrics = &target_linux_386; + metrics = &target_linux_i386; #endif #endif From 832961d53921ea8084d7107ffacedd4021e7326b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Thu, 3 Mar 2022 15:36:04 +0000 Subject: [PATCH 42/74] semi-colons are deprecated in core --- core/compress/common.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/compress/common.odin b/core/compress/common.odin index c8e86a97e..fb0f74e95 100644 --- a/core/compress/common.odin +++ b/core/compress/common.odin @@ -479,4 +479,4 @@ discard_to_next_byte_lsb_from_stream :: proc(z: ^Context_Stream_Input) { consume_bits_lsb(z, discard) } -discard_to_next_byte_lsb :: proc{discard_to_next_byte_lsb_from_memory, discard_to_next_byte_lsb_from_stream}; +discard_to_next_byte_lsb :: proc{discard_to_next_byte_lsb_from_memory, discard_to_next_byte_lsb_from_stream} From fad851d80c4d2ded5eba6b766ca00d90893c73aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Thu, 3 Mar 2022 15:57:51 +0000 Subject: [PATCH 43/74] check for semi-colon before EOF too --- src/parser.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/parser.cpp b/src/parser.cpp index f70afe346..94a585f35 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1538,7 +1538,7 @@ void fix_advance_to_next_stmt(AstFile *f) { Token expect_closing(AstFile *f, TokenKind kind, String context) { if (f->curr_token.kind != kind && f->curr_token.kind == Token_Semicolon && - f->curr_token.string == "\n") { + (f->curr_token.string == "\n" || f->curr_token.kind == Token_EOF)) { Token tok = f->prev_token; tok.pos.column += cast(i32)tok.string.len; syntax_error(tok, "Missing ',' before newline in %.*s", LIT(context)); @@ -1560,6 +1560,7 @@ void assign_removal_flag_to_semicolon(AstFile *f) { switch (curr_token->kind) { case Token_CloseBrace: case Token_CloseParen: + case Token_EOF: ok = true; break; } From dfe2c0a600aa3d78b56b5df54ba4c46620c59a4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Thu, 3 Mar 2022 15:57:55 +0000 Subject: [PATCH 44/74] remove some leftover semi-colons before EOF --- core/compress/common.odin | 2 +- core/compress/zlib/zlib.odin | 2 +- vendor/sdl2/sdl_keycode.odin | 2 +- vendor/sdl2/sdl_scancode.odin | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/compress/common.odin b/core/compress/common.odin index 8bc7d240d..04fcd3478 100644 --- a/core/compress/common.odin +++ b/core/compress/common.odin @@ -479,4 +479,4 @@ discard_to_next_byte_lsb_from_stream :: proc(z: ^Context_Stream_Input) { consume_bits_lsb(z, discard) } -discard_to_next_byte_lsb :: proc{discard_to_next_byte_lsb_from_memory, discard_to_next_byte_lsb_from_stream}; \ No newline at end of file +discard_to_next_byte_lsb :: proc{discard_to_next_byte_lsb_from_memory, discard_to_next_byte_lsb_from_stream} diff --git a/core/compress/zlib/zlib.odin b/core/compress/zlib/zlib.odin index d4c0f332c..d4b770929 100644 --- a/core/compress/zlib/zlib.odin +++ b/core/compress/zlib/zlib.odin @@ -677,4 +677,4 @@ inflate_from_byte_array_raw :: proc(input: []u8, buf: ^bytes.Buffer, raw := fals return inflate_raw(z=&ctx, expected_output_size=expected_output_size) } -inflate :: proc{inflate_from_context, inflate_from_byte_array}; \ No newline at end of file +inflate :: proc{inflate_from_context, inflate_from_byte_array} diff --git a/vendor/sdl2/sdl_keycode.odin b/vendor/sdl2/sdl_keycode.odin index 73637f072..c03fdc2a9 100644 --- a/vendor/sdl2/sdl_keycode.odin +++ b/vendor/sdl2/sdl_keycode.odin @@ -327,4 +327,4 @@ KMOD_RESERVED :: Keymod{.RESERVED} KMOD_CTRL :: Keymod{.LCTRL, .RCTRL} KMOD_SHIFT :: Keymod{.LSHIFT, .RSHIFT} KMOD_ALT :: Keymod{.LALT, .RALT} -KMOD_GUI :: Keymod{.LGUI, .RGUI}; \ No newline at end of file +KMOD_GUI :: Keymod{.LGUI, .RGUI} diff --git a/vendor/sdl2/sdl_scancode.odin b/vendor/sdl2/sdl_scancode.odin index d27bba7f7..ca2169778 100644 --- a/vendor/sdl2/sdl_scancode.odin +++ b/vendor/sdl2/sdl_scancode.odin @@ -539,4 +539,4 @@ SCANCODE_APP1 :: Scancode.APP1 SCANCODE_APP2 :: Scancode.APP2 SCANCODE_AUDIOREWIND :: Scancode.AUDIOREWIND -SCANCODE_AUDIOFASTFORWARD :: Scancode.AUDIOFASTFORWARD; \ No newline at end of file +SCANCODE_AUDIOFASTFORWARD :: Scancode.AUDIOFASTFORWARD From 913d802e3381f61d3bd6e9e67b91fbe991733c88 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 3 Mar 2022 23:10:38 +0000 Subject: [PATCH 45/74] Fix `ast.clone_node` --- core/odin/ast/clone.odin | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/core/odin/ast/clone.odin b/core/odin/ast/clone.odin index b0d997091..400c064f5 100644 --- a/core/odin/ast/clone.odin +++ b/core/odin/ast/clone.odin @@ -88,16 +88,20 @@ clone_node :: proc(node: ^Node) -> ^Node { src = (^rawptr)(&node.derived)^ } mem.copy(res, src, size) - res_any: any - res_any.data = res - res_any.id = ti.id + res_ptr_any: any + res_ptr_any.data = &res + res_ptr_any.id = ti.id - reflect.set_union_value(res.derived, res_any) + reflect.set_union_value(res.derived, res_ptr_any) - derived_expr := reflect.struct_field_value_by_name(res_any, "derived_expr", true) - derived_stmt := reflect.struct_field_value_by_name(res_any, "derived_stmt", true) - reflect.set_union_value(res.derived, derived_expr) - reflect.set_union_value(res.derived, derived_stmt) + res_ptr := reflect.deref(res_ptr_any) + + if de := reflect.struct_field_value_by_name(res_ptr, "derived_expr", true); de != nil { + reflect.set_union_value(de, res_ptr_any) + } + if ds := reflect.struct_field_value_by_name(res_ptr, "derived_stmt", true); ds != nil { + reflect.set_union_value(ds, res_ptr_any) + } if res.derived != nil do switch r in res.derived { case ^Package, ^File: From 1abd95094d0853fd9bcc5825ef3b63e8d26443bc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 3 Mar 2022 23:25:22 +0000 Subject: [PATCH 46/74] Add `reflect.deref` --- core/reflect/reflect.odin | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index 05b3a5da0..d05026532 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -365,6 +365,19 @@ index :: proc(val: any, i: int, loc := #caller_location) -> any { return nil } +deref :: proc(val: any) -> any { + if val != nil { + ti := type_info_base(type_info_of(val.id)) + if info, ok := ti.variant.(Type_Info_Pointer); ok { + return any{ + (^rawptr)(val.data)^, + info.elem.id, + } + } + } + return val +} + // Struct_Tag represents the type of the string of a struct field @@ -680,7 +693,6 @@ union_variant_typeid :: proc(a: any) -> typeid { return nil } panic("expected a union to reflect.union_variant_typeid") - } get_union_variant_raw_tag :: proc(a: any) -> i64 { From 7e8b9862b9049f6ca1300c34857244828fae1102 Mon Sep 17 00:00:00 2001 From: WalterPlinge <22519813+WalterPlinge@users.noreply.github.com> Date: Thu, 3 Mar 2022 22:21:41 +0000 Subject: [PATCH 47/74] update vulkan generator change procedure file generation - group procedure types together - sort groups by procedure names - overload function `load_proc_addresses` - kept original as `custom` - added `global`, `instance`, and `device` variants for simpler loading - added `device_vtable` variant to support multiple devices --- .../vulkan/_gen/create_vulkan_odin_wrapper.py | 139 +- vendor/vulkan/procedures.odin | 4383 +++++++++++------ 2 files changed, 3110 insertions(+), 1412 deletions(-) diff --git a/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py b/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py index e7fb234c8..f1949f973 100644 --- a/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py +++ b/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py @@ -444,7 +444,7 @@ procedure_map = {} def parse_procedures(f): data = re.findall(r"typedef (\w+\*?) \(\w+ \*(\w+)\)\((.+?)\);", src, re.S) - ff = [] + group_ff = {"Loader":[], "Misc":[], "Instance":[], "Device":[]} for rt, name, fields in data: proc_name = no_vk(name) @@ -464,18 +464,32 @@ def parse_procedures(f): ts += " -> {}".format(rt_str) procedure_map[proc_name] = ts - ff.append( (proc_name, ts) ) - max_len = max(len(n) for n, t in ff) + fields_types_name = [do_type(t) for t in re.findall(r"(?:\s*|)(.+?)\s*\w+(?:,|$)", fields)] + table_name = fields_types_name[0] + nn = (proc_name, ts) + if table_name in ('Device', 'Queue', 'CommandBuffer') and proc_name != 'GetDeviceProcAddr': + group_ff["Device"].append(nn) + elif table_name in ('Instance', 'PhysicalDevice') or proc_name == 'GetDeviceProcAddr': + group_ff["Instance"].append(nn) + elif table_name in ('rawptr', '', 'DebugReportFlagsEXT') or proc_name == 'GetInstanceProcAddr': + group_ff["Misc"].append(nn) + else: + group_ff["Loader"].append(nn) + f.write("import \"core:c\"\n\n") - f.write("// Procedure Types\n\n"); - for n, t in ff: - f.write("{} :: #type {}\n".format(n.ljust(max_len), t.replace('"c"', '"system"'))) + for group_name, ff in group_ff.items(): + ff.sort() + f.write("// {} Procedure Types\n".format(group_name)) + max_len = max(len(n) for n, t in ff) + for n, t in ff: + f.write("{} :: #type {}\n".format(n.ljust(max_len), t.replace('"c"', '"system"'))) + f.write("\n") def group_functions(f): data = re.findall(r"typedef (\w+\*?) \(\w+ \*(\w+)\)\((.+?)\);", src, re.S) - group_map = {"Instance":[], "Device":[], "Loader":[]} + group_map = {"Loader":[], "Instance":[], "Device":[]} for rt, vkname, fields in data: fields_types_name = [do_type(t) for t in re.findall(r"(?:\s*|)(.+?)\s*\w+(?:,|$)", fields)] @@ -493,6 +507,8 @@ def group_functions(f): pass else: group_map["Loader"].append(nn) + for _, group in group_map.items(): + group.sort() for group_name, group_lines in group_map.items(): f.write("// {} Procedures\n".format(group_name)) @@ -502,7 +518,7 @@ def group_functions(f): f.write('{}: {}\n'.format(remove_prefix(name, "Proc"), name.rjust(max_len))) f.write("\n") - f.write("load_proc_addresses :: proc(set_proc_address: SetProcAddressType) {\n") + f.write("load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) {\n") for group_name, group_lines in group_map.items(): f.write("\t// {} Procedures\n".format(group_name)) max_len = max(len(name) for name, _ in group_lines) @@ -514,7 +530,77 @@ def group_functions(f): remove_prefix(vk_name, 'Proc'), )) f.write("\n") - f.write("}\n") + f.write("}\n\n") + + f.write("// Device Procedure VTable\n") + f.write("Device_VTable :: struct {\n") + max_len = max(len(name) for name, _ in group_map["Device"]) + for name, vk_name in group_map["Device"]: + f.write('\t{}: {},\n'.format(remove_prefix(name, "Proc"), name.rjust(max_len))) + f.write("}\n\n") + + f.write("load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable) {\n") + for name, vk_name in group_map["Device"]: + k = max_len - len(name) + f.write('\tvtable.{}{} = auto_cast GetDeviceProcAddr(device, "vk{}")\n'.format( + remove_prefix(name, 'Proc'), + "".ljust(k), + remove_prefix(vk_name, 'Proc'), + )) + f.write("}\n\n") + + f.write("load_proc_addresses_device :: proc(device: Device) {\n") + max_len = max(len(name) for name, _ in group_map["Device"]) + for name, vk_name in group_map["Device"]: + k = max_len - len(name) + f.write('\t{}{} = auto_cast GetDeviceProcAddr(device, "vk{}")\n'.format( + remove_prefix(name, 'Proc'), + "".ljust(k), + remove_prefix(vk_name, 'Proc'), + )) + f.write("}\n\n") + + f.write("load_proc_addresses_instance :: proc(instance: Instance) {\n") + max_len = max(len(name) for name, _ in group_map["Instance"]) + for name, vk_name in group_map["Instance"]: + k = max_len - len(name) + f.write('\t{}{} = auto_cast GetInstanceProcAddr(instance, "vk{}")\n'.format( + remove_prefix(name, 'Proc'), + "".ljust(k), + remove_prefix(vk_name, 'Proc'), + )) + f.write("\n\t// Device Procedures (may call into dispatch)\n") + max_len = max(len(name) for name, _ in group_map["Device"]) + for name, vk_name in group_map["Device"]: + k = max_len - len(name) + f.write('\t{}{} = auto_cast GetInstanceProcAddr(instance, "vk{}")\n'.format( + remove_prefix(name, 'Proc'), + "".ljust(k), + remove_prefix(vk_name, 'Proc'), + )) + f.write("}\n\n") + + f.write("load_proc_addresses_global :: proc(vk_get_instance_proc_addr: rawptr) {\n") + f.write("\tGetInstanceProcAddr = auto_cast vk_get_instance_proc_addr\n\n") + max_len = max(len(name) for name, _ in group_map["Loader"]) + for name, vk_name in group_map["Loader"]: + k = max_len - len(name) + f.write('\t{}{} = auto_cast GetInstanceProcAddr(nil, "vk{}")\n'.format( + remove_prefix(name, 'Proc'), + "".ljust(k), + remove_prefix(vk_name, 'Proc'), + )) + f.write("}\n\n") + + f.write(""" +load_proc_addresses :: proc{ +\tload_proc_addresses_global, +\tload_proc_addresses_instance, +\tload_proc_addresses_device, +\tload_proc_addresses_device_vtable, +\tload_proc_addresses_custom, +}\n +"""[1::]) @@ -581,14 +667,14 @@ MAX_GLOBAL_PRIORITY_SIZE_EXT :: 16 parse_handles_def(f) f.write("\n\n") parse_flags_def(f) - with open("../enums.odin", 'w', encoding='utf-8') as f: - f.write(BASE) - f.write("\n") - parse_enums(f) - f.write("\n\n") - with open("../structs.odin", 'w', encoding='utf-8') as f: - f.write(BASE) - f.write(""" +with open("../enums.odin", 'w', encoding='utf-8') as f: + f.write(BASE) + f.write("\n") + parse_enums(f) + f.write("\n\n") +with open("../structs.odin", 'w', encoding='utf-8') as f: + f.write(BASE) + f.write(""" import "core:c" when ODIN_OS == .Windows { @@ -622,13 +708,12 @@ CAMetalLayer :: struct {} /********************************/ """) - f.write("\n") - parse_structs(f) - f.write("\n\n") - with open("../procedures.odin", 'w', encoding='utf-8') as f: - f.write(BASE) - f.write("\n") - parse_procedures(f) - f.write("\n") - group_functions(f) - f.write("\n\n") \ No newline at end of file + f.write("\n") + parse_structs(f) + f.write("\n\n") +with open("../procedures.odin", 'w', encoding='utf-8') as f: + f.write(BASE) + f.write("\n") + parse_procedures(f) + f.write("\n") + group_functions(f) diff --git a/vendor/vulkan/procedures.odin b/vendor/vulkan/procedures.odin index b40523b6d..7557d3c36 100644 --- a/vendor/vulkan/procedures.odin +++ b/vendor/vulkan/procedures.odin @@ -5,1412 +5,3025 @@ package vulkan import "core:c" -// Procedure Types +// Loader Procedure Types +ProcCreateInstance :: #type proc "system" (pCreateInfo: ^InstanceCreateInfo, pAllocator: ^AllocationCallbacks, pInstance: ^Instance) -> Result +ProcDebugUtilsMessengerCallbackEXT :: #type proc "system" (messageSeverity: DebugUtilsMessageSeverityFlagsEXT, messageTypes: DebugUtilsMessageTypeFlagsEXT, pCallbackData: ^DebugUtilsMessengerCallbackDataEXT, pUserData: rawptr) -> b32 +ProcDeviceMemoryReportCallbackEXT :: #type proc "system" (pCallbackData: ^DeviceMemoryReportCallbackDataEXT, pUserData: rawptr) +ProcEnumerateInstanceExtensionProperties :: #type proc "system" (pLayerName: cstring, pPropertyCount: ^u32, pProperties: [^]ExtensionProperties) -> Result +ProcEnumerateInstanceLayerProperties :: #type proc "system" (pPropertyCount: ^u32, pProperties: [^]LayerProperties) -> Result +ProcEnumerateInstanceVersion :: #type proc "system" (pApiVersion: ^u32) -> Result -ProcAllocationFunction :: #type proc "system" (pUserData: rawptr, size: int, alignment: int, allocationScope: SystemAllocationScope) -> rawptr -ProcFreeFunction :: #type proc "system" (pUserData: rawptr, pMemory: rawptr) -ProcInternalAllocationNotification :: #type proc "system" (pUserData: rawptr, size: int, allocationType: InternalAllocationType, allocationScope: SystemAllocationScope) -ProcInternalFreeNotification :: #type proc "system" (pUserData: rawptr, size: int, allocationType: InternalAllocationType, allocationScope: SystemAllocationScope) -ProcReallocationFunction :: #type proc "system" (pUserData: rawptr, pOriginal: rawptr, size: int, alignment: int, allocationScope: SystemAllocationScope) -> rawptr -ProcVoidFunction :: #type proc "system" () -ProcCreateInstance :: #type proc "system" (pCreateInfo: ^InstanceCreateInfo, pAllocator: ^AllocationCallbacks, pInstance: ^Instance) -> Result -ProcDestroyInstance :: #type proc "system" (instance: Instance, pAllocator: ^AllocationCallbacks) -ProcEnumeratePhysicalDevices :: #type proc "system" (instance: Instance, pPhysicalDeviceCount: ^u32, pPhysicalDevices: [^]PhysicalDevice) -> Result -ProcGetPhysicalDeviceFeatures :: #type proc "system" (physicalDevice: PhysicalDevice, pFeatures: [^]PhysicalDeviceFeatures) -ProcGetPhysicalDeviceFormatProperties :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, pFormatProperties: [^]FormatProperties) -ProcGetPhysicalDeviceImageFormatProperties :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, type: ImageType, tiling: ImageTiling, usage: ImageUsageFlags, flags: ImageCreateFlags, pImageFormatProperties: [^]ImageFormatProperties) -> Result -ProcGetPhysicalDeviceProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pProperties: [^]PhysicalDeviceProperties) -ProcGetPhysicalDeviceQueueFamilyProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pQueueFamilyPropertyCount: ^u32, pQueueFamilyProperties: [^]QueueFamilyProperties) -ProcGetPhysicalDeviceMemoryProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pMemoryProperties: [^]PhysicalDeviceMemoryProperties) -ProcGetInstanceProcAddr :: #type proc "system" (instance: Instance, pName: cstring) -> ProcVoidFunction -ProcGetDeviceProcAddr :: #type proc "system" (device: Device, pName: cstring) -> ProcVoidFunction -ProcCreateDevice :: #type proc "system" (physicalDevice: PhysicalDevice, pCreateInfo: ^DeviceCreateInfo, pAllocator: ^AllocationCallbacks, pDevice: ^Device) -> Result -ProcDestroyDevice :: #type proc "system" (device: Device, pAllocator: ^AllocationCallbacks) -ProcEnumerateInstanceExtensionProperties :: #type proc "system" (pLayerName: cstring, pPropertyCount: ^u32, pProperties: [^]ExtensionProperties) -> Result -ProcEnumerateDeviceExtensionProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pLayerName: cstring, pPropertyCount: ^u32, pProperties: [^]ExtensionProperties) -> Result -ProcEnumerateInstanceLayerProperties :: #type proc "system" (pPropertyCount: ^u32, pProperties: [^]LayerProperties) -> Result -ProcEnumerateDeviceLayerProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]LayerProperties) -> Result -ProcGetDeviceQueue :: #type proc "system" (device: Device, queueFamilyIndex: u32, queueIndex: u32, pQueue: ^Queue) -ProcQueueSubmit :: #type proc "system" (queue: Queue, submitCount: u32, pSubmits: [^]SubmitInfo, fence: Fence) -> Result -ProcQueueWaitIdle :: #type proc "system" (queue: Queue) -> Result -ProcDeviceWaitIdle :: #type proc "system" (device: Device) -> Result -ProcAllocateMemory :: #type proc "system" (device: Device, pAllocateInfo: ^MemoryAllocateInfo, pAllocator: ^AllocationCallbacks, pMemory: ^DeviceMemory) -> Result -ProcFreeMemory :: #type proc "system" (device: Device, memory: DeviceMemory, pAllocator: ^AllocationCallbacks) -ProcMapMemory :: #type proc "system" (device: Device, memory: DeviceMemory, offset: DeviceSize, size: DeviceSize, flags: MemoryMapFlags, ppData: ^rawptr) -> Result -ProcUnmapMemory :: #type proc "system" (device: Device, memory: DeviceMemory) -ProcFlushMappedMemoryRanges :: #type proc "system" (device: Device, memoryRangeCount: u32, pMemoryRanges: [^]MappedMemoryRange) -> Result -ProcInvalidateMappedMemoryRanges :: #type proc "system" (device: Device, memoryRangeCount: u32, pMemoryRanges: [^]MappedMemoryRange) -> Result -ProcGetDeviceMemoryCommitment :: #type proc "system" (device: Device, memory: DeviceMemory, pCommittedMemoryInBytes: [^]DeviceSize) -ProcBindBufferMemory :: #type proc "system" (device: Device, buffer: Buffer, memory: DeviceMemory, memoryOffset: DeviceSize) -> Result -ProcBindImageMemory :: #type proc "system" (device: Device, image: Image, memory: DeviceMemory, memoryOffset: DeviceSize) -> Result -ProcGetBufferMemoryRequirements :: #type proc "system" (device: Device, buffer: Buffer, pMemoryRequirements: [^]MemoryRequirements) -ProcGetImageMemoryRequirements :: #type proc "system" (device: Device, image: Image, pMemoryRequirements: [^]MemoryRequirements) -ProcGetImageSparseMemoryRequirements :: #type proc "system" (device: Device, image: Image, pSparseMemoryRequirementCount: ^u32, pSparseMemoryRequirements: [^]SparseImageMemoryRequirements) -ProcGetPhysicalDeviceSparseImageFormatProperties :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, type: ImageType, samples: SampleCountFlags, usage: ImageUsageFlags, tiling: ImageTiling, pPropertyCount: ^u32, pProperties: [^]SparseImageFormatProperties) -ProcQueueBindSparse :: #type proc "system" (queue: Queue, bindInfoCount: u32, pBindInfo: ^BindSparseInfo, fence: Fence) -> Result -ProcCreateFence :: #type proc "system" (device: Device, pCreateInfo: ^FenceCreateInfo, pAllocator: ^AllocationCallbacks, pFence: ^Fence) -> Result -ProcDestroyFence :: #type proc "system" (device: Device, fence: Fence, pAllocator: ^AllocationCallbacks) -ProcResetFences :: #type proc "system" (device: Device, fenceCount: u32, pFences: [^]Fence) -> Result -ProcGetFenceStatus :: #type proc "system" (device: Device, fence: Fence) -> Result -ProcWaitForFences :: #type proc "system" (device: Device, fenceCount: u32, pFences: [^]Fence, waitAll: b32, timeout: u64) -> Result -ProcCreateSemaphore :: #type proc "system" (device: Device, pCreateInfo: ^SemaphoreCreateInfo, pAllocator: ^AllocationCallbacks, pSemaphore: ^Semaphore) -> Result -ProcDestroySemaphore :: #type proc "system" (device: Device, semaphore: Semaphore, pAllocator: ^AllocationCallbacks) -ProcCreateEvent :: #type proc "system" (device: Device, pCreateInfo: ^EventCreateInfo, pAllocator: ^AllocationCallbacks, pEvent: ^Event) -> Result -ProcDestroyEvent :: #type proc "system" (device: Device, event: Event, pAllocator: ^AllocationCallbacks) -ProcGetEventStatus :: #type proc "system" (device: Device, event: Event) -> Result -ProcSetEvent :: #type proc "system" (device: Device, event: Event) -> Result -ProcResetEvent :: #type proc "system" (device: Device, event: Event) -> Result -ProcCreateQueryPool :: #type proc "system" (device: Device, pCreateInfo: ^QueryPoolCreateInfo, pAllocator: ^AllocationCallbacks, pQueryPool: ^QueryPool) -> Result -ProcDestroyQueryPool :: #type proc "system" (device: Device, queryPool: QueryPool, pAllocator: ^AllocationCallbacks) -ProcGetQueryPoolResults :: #type proc "system" (device: Device, queryPool: QueryPool, firstQuery: u32, queryCount: u32, dataSize: int, pData: rawptr, stride: DeviceSize, flags: QueryResultFlags) -> Result -ProcCreateBuffer :: #type proc "system" (device: Device, pCreateInfo: ^BufferCreateInfo, pAllocator: ^AllocationCallbacks, pBuffer: ^Buffer) -> Result -ProcDestroyBuffer :: #type proc "system" (device: Device, buffer: Buffer, pAllocator: ^AllocationCallbacks) -ProcCreateBufferView :: #type proc "system" (device: Device, pCreateInfo: ^BufferViewCreateInfo, pAllocator: ^AllocationCallbacks, pView: ^BufferView) -> Result -ProcDestroyBufferView :: #type proc "system" (device: Device, bufferView: BufferView, pAllocator: ^AllocationCallbacks) -ProcCreateImage :: #type proc "system" (device: Device, pCreateInfo: ^ImageCreateInfo, pAllocator: ^AllocationCallbacks, pImage: ^Image) -> Result -ProcDestroyImage :: #type proc "system" (device: Device, image: Image, pAllocator: ^AllocationCallbacks) -ProcGetImageSubresourceLayout :: #type proc "system" (device: Device, image: Image, pSubresource: ^ImageSubresource, pLayout: ^SubresourceLayout) -ProcCreateImageView :: #type proc "system" (device: Device, pCreateInfo: ^ImageViewCreateInfo, pAllocator: ^AllocationCallbacks, pView: ^ImageView) -> Result -ProcDestroyImageView :: #type proc "system" (device: Device, imageView: ImageView, pAllocator: ^AllocationCallbacks) -ProcCreateShaderModule :: #type proc "system" (device: Device, pCreateInfo: ^ShaderModuleCreateInfo, pAllocator: ^AllocationCallbacks, pShaderModule: ^ShaderModule) -> Result -ProcDestroyShaderModule :: #type proc "system" (device: Device, shaderModule: ShaderModule, pAllocator: ^AllocationCallbacks) -ProcCreatePipelineCache :: #type proc "system" (device: Device, pCreateInfo: ^PipelineCacheCreateInfo, pAllocator: ^AllocationCallbacks, pPipelineCache: ^PipelineCache) -> Result -ProcDestroyPipelineCache :: #type proc "system" (device: Device, pipelineCache: PipelineCache, pAllocator: ^AllocationCallbacks) -ProcGetPipelineCacheData :: #type proc "system" (device: Device, pipelineCache: PipelineCache, pDataSize: ^int, pData: rawptr) -> Result -ProcMergePipelineCaches :: #type proc "system" (device: Device, dstCache: PipelineCache, srcCacheCount: u32, pSrcCaches: [^]PipelineCache) -> Result -ProcCreateGraphicsPipelines :: #type proc "system" (device: Device, pipelineCache: PipelineCache, createInfoCount: u32, pCreateInfos: [^]GraphicsPipelineCreateInfo, pAllocator: ^AllocationCallbacks, pPipelines: [^]Pipeline) -> Result -ProcCreateComputePipelines :: #type proc "system" (device: Device, pipelineCache: PipelineCache, createInfoCount: u32, pCreateInfos: [^]ComputePipelineCreateInfo, pAllocator: ^AllocationCallbacks, pPipelines: [^]Pipeline) -> Result -ProcDestroyPipeline :: #type proc "system" (device: Device, pipeline: Pipeline, pAllocator: ^AllocationCallbacks) -ProcCreatePipelineLayout :: #type proc "system" (device: Device, pCreateInfo: ^PipelineLayoutCreateInfo, pAllocator: ^AllocationCallbacks, pPipelineLayout: ^PipelineLayout) -> Result -ProcDestroyPipelineLayout :: #type proc "system" (device: Device, pipelineLayout: PipelineLayout, pAllocator: ^AllocationCallbacks) -ProcCreateSampler :: #type proc "system" (device: Device, pCreateInfo: ^SamplerCreateInfo, pAllocator: ^AllocationCallbacks, pSampler: ^Sampler) -> Result -ProcDestroySampler :: #type proc "system" (device: Device, sampler: Sampler, pAllocator: ^AllocationCallbacks) -ProcCreateDescriptorSetLayout :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorSetLayoutCreateInfo, pAllocator: ^AllocationCallbacks, pSetLayout: ^DescriptorSetLayout) -> Result -ProcDestroyDescriptorSetLayout :: #type proc "system" (device: Device, descriptorSetLayout: DescriptorSetLayout, pAllocator: ^AllocationCallbacks) -ProcCreateDescriptorPool :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorPoolCreateInfo, pAllocator: ^AllocationCallbacks, pDescriptorPool: ^DescriptorPool) -> Result -ProcDestroyDescriptorPool :: #type proc "system" (device: Device, descriptorPool: DescriptorPool, pAllocator: ^AllocationCallbacks) -ProcResetDescriptorPool :: #type proc "system" (device: Device, descriptorPool: DescriptorPool, flags: DescriptorPoolResetFlags) -> Result -ProcAllocateDescriptorSets :: #type proc "system" (device: Device, pAllocateInfo: ^DescriptorSetAllocateInfo, pDescriptorSets: [^]DescriptorSet) -> Result -ProcFreeDescriptorSets :: #type proc "system" (device: Device, descriptorPool: DescriptorPool, descriptorSetCount: u32, pDescriptorSets: [^]DescriptorSet) -> Result -ProcUpdateDescriptorSets :: #type proc "system" (device: Device, descriptorWriteCount: u32, pDescriptorWrites: [^]WriteDescriptorSet, descriptorCopyCount: u32, pDescriptorCopies: [^]CopyDescriptorSet) -ProcCreateFramebuffer :: #type proc "system" (device: Device, pCreateInfo: ^FramebufferCreateInfo, pAllocator: ^AllocationCallbacks, pFramebuffer: ^Framebuffer) -> Result -ProcDestroyFramebuffer :: #type proc "system" (device: Device, framebuffer: Framebuffer, pAllocator: ^AllocationCallbacks) -ProcCreateRenderPass :: #type proc "system" (device: Device, pCreateInfo: ^RenderPassCreateInfo, pAllocator: ^AllocationCallbacks, pRenderPass: [^]RenderPass) -> Result -ProcDestroyRenderPass :: #type proc "system" (device: Device, renderPass: RenderPass, pAllocator: ^AllocationCallbacks) -ProcGetRenderAreaGranularity :: #type proc "system" (device: Device, renderPass: RenderPass, pGranularity: ^Extent2D) -ProcCreateCommandPool :: #type proc "system" (device: Device, pCreateInfo: ^CommandPoolCreateInfo, pAllocator: ^AllocationCallbacks, pCommandPool: ^CommandPool) -> Result -ProcDestroyCommandPool :: #type proc "system" (device: Device, commandPool: CommandPool, pAllocator: ^AllocationCallbacks) -ProcResetCommandPool :: #type proc "system" (device: Device, commandPool: CommandPool, flags: CommandPoolResetFlags) -> Result -ProcAllocateCommandBuffers :: #type proc "system" (device: Device, pAllocateInfo: ^CommandBufferAllocateInfo, pCommandBuffers: [^]CommandBuffer) -> Result -ProcFreeCommandBuffers :: #type proc "system" (device: Device, commandPool: CommandPool, commandBufferCount: u32, pCommandBuffers: [^]CommandBuffer) -ProcBeginCommandBuffer :: #type proc "system" (commandBuffer: CommandBuffer, pBeginInfo: ^CommandBufferBeginInfo) -> Result -ProcEndCommandBuffer :: #type proc "system" (commandBuffer: CommandBuffer) -> Result -ProcResetCommandBuffer :: #type proc "system" (commandBuffer: CommandBuffer, flags: CommandBufferResetFlags) -> Result -ProcCmdBindPipeline :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, pipeline: Pipeline) -ProcCmdSetViewport :: #type proc "system" (commandBuffer: CommandBuffer, firstViewport: u32, viewportCount: u32, pViewports: [^]Viewport) -ProcCmdSetScissor :: #type proc "system" (commandBuffer: CommandBuffer, firstScissor: u32, scissorCount: u32, pScissors: [^]Rect2D) -ProcCmdSetLineWidth :: #type proc "system" (commandBuffer: CommandBuffer, lineWidth: f32) -ProcCmdSetDepthBias :: #type proc "system" (commandBuffer: CommandBuffer, depthBiasConstantFactor: f32, depthBiasClamp: f32, depthBiasSlopeFactor: f32) -ProcCmdSetBlendConstants :: #type proc "system" (commandBuffer: CommandBuffer) -ProcCmdSetDepthBounds :: #type proc "system" (commandBuffer: CommandBuffer, minDepthBounds: f32, maxDepthBounds: f32) -ProcCmdSetStencilCompareMask :: #type proc "system" (commandBuffer: CommandBuffer, faceMask: StencilFaceFlags, compareMask: u32) -ProcCmdSetStencilWriteMask :: #type proc "system" (commandBuffer: CommandBuffer, faceMask: StencilFaceFlags, writeMask: u32) -ProcCmdSetStencilReference :: #type proc "system" (commandBuffer: CommandBuffer, faceMask: StencilFaceFlags, reference: u32) -ProcCmdBindDescriptorSets :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, layout: PipelineLayout, firstSet: u32, descriptorSetCount: u32, pDescriptorSets: [^]DescriptorSet, dynamicOffsetCount: u32, pDynamicOffsets: [^]u32) -ProcCmdBindIndexBuffer :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, indexType: IndexType) -ProcCmdBindVertexBuffers :: #type proc "system" (commandBuffer: CommandBuffer, firstBinding: u32, bindingCount: u32, pBuffers: [^]Buffer, pOffsets: [^]DeviceSize) -ProcCmdDraw :: #type proc "system" (commandBuffer: CommandBuffer, vertexCount: u32, instanceCount: u32, firstVertex: u32, firstInstance: u32) -ProcCmdDrawIndexed :: #type proc "system" (commandBuffer: CommandBuffer, indexCount: u32, instanceCount: u32, firstIndex: u32, vertexOffset: i32, firstInstance: u32) -ProcCmdDrawIndirect :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, drawCount: u32, stride: u32) -ProcCmdDrawIndexedIndirect :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, drawCount: u32, stride: u32) -ProcCmdDispatch :: #type proc "system" (commandBuffer: CommandBuffer, groupCountX: u32, groupCountY: u32, groupCountZ: u32) -ProcCmdDispatchIndirect :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize) -ProcCmdCopyBuffer :: #type proc "system" (commandBuffer: CommandBuffer, srcBuffer: Buffer, dstBuffer: Buffer, regionCount: u32, pRegions: [^]BufferCopy) -ProcCmdCopyImage :: #type proc "system" (commandBuffer: CommandBuffer, srcImage: Image, srcImageLayout: ImageLayout, dstImage: Image, dstImageLayout: ImageLayout, regionCount: u32, pRegions: [^]ImageCopy) -ProcCmdBlitImage :: #type proc "system" (commandBuffer: CommandBuffer, srcImage: Image, srcImageLayout: ImageLayout, dstImage: Image, dstImageLayout: ImageLayout, regionCount: u32, pRegions: [^]ImageBlit, filter: Filter) -ProcCmdCopyBufferToImage :: #type proc "system" (commandBuffer: CommandBuffer, srcBuffer: Buffer, dstImage: Image, dstImageLayout: ImageLayout, regionCount: u32, pRegions: [^]BufferImageCopy) -ProcCmdCopyImageToBuffer :: #type proc "system" (commandBuffer: CommandBuffer, srcImage: Image, srcImageLayout: ImageLayout, dstBuffer: Buffer, regionCount: u32, pRegions: [^]BufferImageCopy) -ProcCmdUpdateBuffer :: #type proc "system" (commandBuffer: CommandBuffer, dstBuffer: Buffer, dstOffset: DeviceSize, dataSize: DeviceSize, pData: rawptr) -ProcCmdFillBuffer :: #type proc "system" (commandBuffer: CommandBuffer, dstBuffer: Buffer, dstOffset: DeviceSize, size: DeviceSize, data: u32) -ProcCmdClearColorImage :: #type proc "system" (commandBuffer: CommandBuffer, image: Image, imageLayout: ImageLayout, pColor: ^ClearColorValue, rangeCount: u32, pRanges: [^]ImageSubresourceRange) -ProcCmdClearDepthStencilImage :: #type proc "system" (commandBuffer: CommandBuffer, image: Image, imageLayout: ImageLayout, pDepthStencil: ^ClearDepthStencilValue, rangeCount: u32, pRanges: [^]ImageSubresourceRange) -ProcCmdClearAttachments :: #type proc "system" (commandBuffer: CommandBuffer, attachmentCount: u32, pAttachments: [^]ClearAttachment, rectCount: u32, pRects: [^]ClearRect) -ProcCmdResolveImage :: #type proc "system" (commandBuffer: CommandBuffer, srcImage: Image, srcImageLayout: ImageLayout, dstImage: Image, dstImageLayout: ImageLayout, regionCount: u32, pRegions: [^]ImageResolve) -ProcCmdSetEvent :: #type proc "system" (commandBuffer: CommandBuffer, event: Event, stageMask: PipelineStageFlags) -ProcCmdResetEvent :: #type proc "system" (commandBuffer: CommandBuffer, event: Event, stageMask: PipelineStageFlags) -ProcCmdWaitEvents :: #type proc "system" (commandBuffer: CommandBuffer, eventCount: u32, pEvents: [^]Event, srcStageMask: PipelineStageFlags, dstStageMask: PipelineStageFlags, memoryBarrierCount: u32, pMemoryBarriers: [^]MemoryBarrier, bufferMemoryBarrierCount: u32, pBufferMemoryBarriers: [^]BufferMemoryBarrier, imageMemoryBarrierCount: u32, pImageMemoryBarriers: [^]ImageMemoryBarrier) -ProcCmdPipelineBarrier :: #type proc "system" (commandBuffer: CommandBuffer, srcStageMask: PipelineStageFlags, dstStageMask: PipelineStageFlags, dependencyFlags: DependencyFlags, memoryBarrierCount: u32, pMemoryBarriers: [^]MemoryBarrier, bufferMemoryBarrierCount: u32, pBufferMemoryBarriers: [^]BufferMemoryBarrier, imageMemoryBarrierCount: u32, pImageMemoryBarriers: [^]ImageMemoryBarrier) -ProcCmdBeginQuery :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, query: u32, flags: QueryControlFlags) -ProcCmdEndQuery :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, query: u32) -ProcCmdResetQueryPool :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, firstQuery: u32, queryCount: u32) -ProcCmdWriteTimestamp :: #type proc "system" (commandBuffer: CommandBuffer, pipelineStage: PipelineStageFlags, queryPool: QueryPool, query: u32) -ProcCmdCopyQueryPoolResults :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, firstQuery: u32, queryCount: u32, dstBuffer: Buffer, dstOffset: DeviceSize, stride: DeviceSize, flags: QueryResultFlags) -ProcCmdPushConstants :: #type proc "system" (commandBuffer: CommandBuffer, layout: PipelineLayout, stageFlags: ShaderStageFlags, offset: u32, size: u32, pValues: rawptr) -ProcCmdBeginRenderPass :: #type proc "system" (commandBuffer: CommandBuffer, pRenderPassBegin: ^RenderPassBeginInfo, contents: SubpassContents) -ProcCmdNextSubpass :: #type proc "system" (commandBuffer: CommandBuffer, contents: SubpassContents) -ProcCmdEndRenderPass :: #type proc "system" (commandBuffer: CommandBuffer) -ProcCmdExecuteCommands :: #type proc "system" (commandBuffer: CommandBuffer, commandBufferCount: u32, pCommandBuffers: [^]CommandBuffer) -ProcEnumerateInstanceVersion :: #type proc "system" (pApiVersion: ^u32) -> Result -ProcBindBufferMemory2 :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindBufferMemoryInfo) -> Result -ProcBindImageMemory2 :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindImageMemoryInfo) -> Result -ProcGetDeviceGroupPeerMemoryFeatures :: #type proc "system" (device: Device, heapIndex: u32, localDeviceIndex: u32, remoteDeviceIndex: u32, pPeerMemoryFeatures: [^]PeerMemoryFeatureFlags) -ProcCmdSetDeviceMask :: #type proc "system" (commandBuffer: CommandBuffer, deviceMask: u32) -ProcCmdDispatchBase :: #type proc "system" (commandBuffer: CommandBuffer, baseGroupX: u32, baseGroupY: u32, baseGroupZ: u32, groupCountX: u32, groupCountY: u32, groupCountZ: u32) -ProcEnumeratePhysicalDeviceGroups :: #type proc "system" (instance: Instance, pPhysicalDeviceGroupCount: ^u32, pPhysicalDeviceGroupProperties: [^]PhysicalDeviceGroupProperties) -> Result -ProcGetImageMemoryRequirements2 :: #type proc "system" (device: Device, pInfo: ^ImageMemoryRequirementsInfo2, pMemoryRequirements: [^]MemoryRequirements2) -ProcGetBufferMemoryRequirements2 :: #type proc "system" (device: Device, pInfo: ^BufferMemoryRequirementsInfo2, pMemoryRequirements: [^]MemoryRequirements2) -ProcGetImageSparseMemoryRequirements2 :: #type proc "system" (device: Device, pInfo: ^ImageSparseMemoryRequirementsInfo2, pSparseMemoryRequirementCount: ^u32, pSparseMemoryRequirements: [^]SparseImageMemoryRequirements2) -ProcGetPhysicalDeviceFeatures2 :: #type proc "system" (physicalDevice: PhysicalDevice, pFeatures: [^]PhysicalDeviceFeatures2) -ProcGetPhysicalDeviceProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pProperties: [^]PhysicalDeviceProperties2) -ProcGetPhysicalDeviceFormatProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, pFormatProperties: [^]FormatProperties2) -ProcGetPhysicalDeviceImageFormatProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pImageFormatInfo: ^PhysicalDeviceImageFormatInfo2, pImageFormatProperties: [^]ImageFormatProperties2) -> Result -ProcGetPhysicalDeviceQueueFamilyProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pQueueFamilyPropertyCount: ^u32, pQueueFamilyProperties: [^]QueueFamilyProperties2) -ProcGetPhysicalDeviceMemoryProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pMemoryProperties: [^]PhysicalDeviceMemoryProperties2) -ProcGetPhysicalDeviceSparseImageFormatProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pFormatInfo: ^PhysicalDeviceSparseImageFormatInfo2, pPropertyCount: ^u32, pProperties: [^]SparseImageFormatProperties2) -ProcTrimCommandPool :: #type proc "system" (device: Device, commandPool: CommandPool, flags: CommandPoolTrimFlags) -ProcGetDeviceQueue2 :: #type proc "system" (device: Device, pQueueInfo: ^DeviceQueueInfo2, pQueue: ^Queue) -ProcCreateSamplerYcbcrConversion :: #type proc "system" (device: Device, pCreateInfo: ^SamplerYcbcrConversionCreateInfo, pAllocator: ^AllocationCallbacks, pYcbcrConversion: ^SamplerYcbcrConversion) -> Result -ProcDestroySamplerYcbcrConversion :: #type proc "system" (device: Device, ycbcrConversion: SamplerYcbcrConversion, pAllocator: ^AllocationCallbacks) -ProcCreateDescriptorUpdateTemplate :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorUpdateTemplateCreateInfo, pAllocator: ^AllocationCallbacks, pDescriptorUpdateTemplate: ^DescriptorUpdateTemplate) -> Result -ProcDestroyDescriptorUpdateTemplate :: #type proc "system" (device: Device, descriptorUpdateTemplate: DescriptorUpdateTemplate, pAllocator: ^AllocationCallbacks) -ProcUpdateDescriptorSetWithTemplate :: #type proc "system" (device: Device, descriptorSet: DescriptorSet, descriptorUpdateTemplate: DescriptorUpdateTemplate, pData: rawptr) -ProcGetPhysicalDeviceExternalBufferProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalBufferInfo: ^PhysicalDeviceExternalBufferInfo, pExternalBufferProperties: [^]ExternalBufferProperties) -ProcGetPhysicalDeviceExternalFenceProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalFenceInfo: ^PhysicalDeviceExternalFenceInfo, pExternalFenceProperties: [^]ExternalFenceProperties) -ProcGetPhysicalDeviceExternalSemaphoreProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalSemaphoreInfo: ^PhysicalDeviceExternalSemaphoreInfo, pExternalSemaphoreProperties: [^]ExternalSemaphoreProperties) -ProcGetDescriptorSetLayoutSupport :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorSetLayoutCreateInfo, pSupport: ^DescriptorSetLayoutSupport) -ProcCmdDrawIndirectCount :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) -ProcCmdDrawIndexedIndirectCount :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) -ProcCreateRenderPass2 :: #type proc "system" (device: Device, pCreateInfo: ^RenderPassCreateInfo2, pAllocator: ^AllocationCallbacks, pRenderPass: [^]RenderPass) -> Result -ProcCmdBeginRenderPass2 :: #type proc "system" (commandBuffer: CommandBuffer, pRenderPassBegin: ^RenderPassBeginInfo, pSubpassBeginInfo: ^SubpassBeginInfo) -ProcCmdNextSubpass2 :: #type proc "system" (commandBuffer: CommandBuffer, pSubpassBeginInfo: ^SubpassBeginInfo, pSubpassEndInfo: ^SubpassEndInfo) -ProcCmdEndRenderPass2 :: #type proc "system" (commandBuffer: CommandBuffer, pSubpassEndInfo: ^SubpassEndInfo) -ProcResetQueryPool :: #type proc "system" (device: Device, queryPool: QueryPool, firstQuery: u32, queryCount: u32) -ProcGetSemaphoreCounterValue :: #type proc "system" (device: Device, semaphore: Semaphore, pValue: ^u64) -> Result -ProcWaitSemaphores :: #type proc "system" (device: Device, pWaitInfo: ^SemaphoreWaitInfo, timeout: u64) -> Result -ProcSignalSemaphore :: #type proc "system" (device: Device, pSignalInfo: ^SemaphoreSignalInfo) -> Result -ProcGetBufferDeviceAddress :: #type proc "system" (device: Device, pInfo: ^BufferDeviceAddressInfo) -> DeviceAddress -ProcGetBufferOpaqueCaptureAddress :: #type proc "system" (device: Device, pInfo: ^BufferDeviceAddressInfo) -> u64 -ProcGetDeviceMemoryOpaqueCaptureAddress :: #type proc "system" (device: Device, pInfo: ^DeviceMemoryOpaqueCaptureAddressInfo) -> u64 -ProcDestroySurfaceKHR :: #type proc "system" (instance: Instance, surface: SurfaceKHR, pAllocator: ^AllocationCallbacks) -ProcGetPhysicalDeviceSurfaceSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, surface: SurfaceKHR, pSupported: ^b32) -> Result -ProcGetPhysicalDeviceSurfaceCapabilitiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pSurfaceCapabilities: [^]SurfaceCapabilitiesKHR) -> Result -ProcGetPhysicalDeviceSurfaceFormatsKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pSurfaceFormatCount: ^u32, pSurfaceFormats: [^]SurfaceFormatKHR) -> Result -ProcGetPhysicalDeviceSurfacePresentModesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pPresentModeCount: ^u32, pPresentModes: [^]PresentModeKHR) -> Result -ProcCreateSwapchainKHR :: #type proc "system" (device: Device, pCreateInfo: ^SwapchainCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSwapchain: ^SwapchainKHR) -> Result -ProcDestroySwapchainKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pAllocator: ^AllocationCallbacks) -ProcGetSwapchainImagesKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pSwapchainImageCount: ^u32, pSwapchainImages: [^]Image) -> Result -ProcAcquireNextImageKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR, timeout: u64, semaphore: Semaphore, fence: Fence, pImageIndex: ^u32) -> Result -ProcQueuePresentKHR :: #type proc "system" (queue: Queue, pPresentInfo: ^PresentInfoKHR) -> Result -ProcGetDeviceGroupPresentCapabilitiesKHR :: #type proc "system" (device: Device, pDeviceGroupPresentCapabilities: [^]DeviceGroupPresentCapabilitiesKHR) -> Result -ProcGetDeviceGroupSurfacePresentModesKHR :: #type proc "system" (device: Device, surface: SurfaceKHR, pModes: [^]DeviceGroupPresentModeFlagsKHR) -> Result -ProcGetPhysicalDevicePresentRectanglesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pRectCount: ^u32, pRects: [^]Rect2D) -> Result -ProcAcquireNextImage2KHR :: #type proc "system" (device: Device, pAcquireInfo: ^AcquireNextImageInfoKHR, pImageIndex: ^u32) -> Result -ProcGetPhysicalDeviceDisplayPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayPropertiesKHR) -> Result -ProcGetPhysicalDeviceDisplayPlanePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayPlanePropertiesKHR) -> Result -ProcGetDisplayPlaneSupportedDisplaysKHR :: #type proc "system" (physicalDevice: PhysicalDevice, planeIndex: u32, pDisplayCount: ^u32, pDisplays: [^]DisplayKHR) -> Result -ProcGetDisplayModePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR, pPropertyCount: ^u32, pProperties: [^]DisplayModePropertiesKHR) -> Result -ProcCreateDisplayModeKHR :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR, pCreateInfo: ^DisplayModeCreateInfoKHR, pAllocator: ^AllocationCallbacks, pMode: ^DisplayModeKHR) -> Result -ProcGetDisplayPlaneCapabilitiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, mode: DisplayModeKHR, planeIndex: u32, pCapabilities: [^]DisplayPlaneCapabilitiesKHR) -> Result -ProcCreateDisplayPlaneSurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^DisplaySurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result -ProcCreateSharedSwapchainsKHR :: #type proc "system" (device: Device, swapchainCount: u32, pCreateInfos: [^]SwapchainCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSwapchains: [^]SwapchainKHR) -> Result -ProcGetPhysicalDeviceFeatures2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pFeatures: [^]PhysicalDeviceFeatures2) -ProcGetPhysicalDeviceProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pProperties: [^]PhysicalDeviceProperties2) -ProcGetPhysicalDeviceFormatProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, pFormatProperties: [^]FormatProperties2) -ProcGetPhysicalDeviceImageFormatProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pImageFormatInfo: ^PhysicalDeviceImageFormatInfo2, pImageFormatProperties: [^]ImageFormatProperties2) -> Result -ProcGetPhysicalDeviceQueueFamilyProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pQueueFamilyPropertyCount: ^u32, pQueueFamilyProperties: [^]QueueFamilyProperties2) -ProcGetPhysicalDeviceMemoryProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pMemoryProperties: [^]PhysicalDeviceMemoryProperties2) -ProcGetPhysicalDeviceSparseImageFormatProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pFormatInfo: ^PhysicalDeviceSparseImageFormatInfo2, pPropertyCount: ^u32, pProperties: [^]SparseImageFormatProperties2) -ProcGetDeviceGroupPeerMemoryFeaturesKHR :: #type proc "system" (device: Device, heapIndex: u32, localDeviceIndex: u32, remoteDeviceIndex: u32, pPeerMemoryFeatures: [^]PeerMemoryFeatureFlags) -ProcCmdSetDeviceMaskKHR :: #type proc "system" (commandBuffer: CommandBuffer, deviceMask: u32) -ProcCmdDispatchBaseKHR :: #type proc "system" (commandBuffer: CommandBuffer, baseGroupX: u32, baseGroupY: u32, baseGroupZ: u32, groupCountX: u32, groupCountY: u32, groupCountZ: u32) -ProcTrimCommandPoolKHR :: #type proc "system" (device: Device, commandPool: CommandPool, flags: CommandPoolTrimFlags) -ProcEnumeratePhysicalDeviceGroupsKHR :: #type proc "system" (instance: Instance, pPhysicalDeviceGroupCount: ^u32, pPhysicalDeviceGroupProperties: [^]PhysicalDeviceGroupProperties) -> Result -ProcGetPhysicalDeviceExternalBufferPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalBufferInfo: ^PhysicalDeviceExternalBufferInfo, pExternalBufferProperties: [^]ExternalBufferProperties) -ProcGetMemoryFdKHR :: #type proc "system" (device: Device, pGetFdInfo: ^MemoryGetFdInfoKHR, pFd: ^c.int) -> Result -ProcGetMemoryFdPropertiesKHR :: #type proc "system" (device: Device, handleType: ExternalMemoryHandleTypeFlags, fd: c.int, pMemoryFdProperties: [^]MemoryFdPropertiesKHR) -> Result -ProcGetPhysicalDeviceExternalSemaphorePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalSemaphoreInfo: ^PhysicalDeviceExternalSemaphoreInfo, pExternalSemaphoreProperties: [^]ExternalSemaphoreProperties) -ProcImportSemaphoreFdKHR :: #type proc "system" (device: Device, pImportSemaphoreFdInfo: ^ImportSemaphoreFdInfoKHR) -> Result -ProcGetSemaphoreFdKHR :: #type proc "system" (device: Device, pGetFdInfo: ^SemaphoreGetFdInfoKHR, pFd: ^c.int) -> Result -ProcCmdPushDescriptorSetKHR :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, layout: PipelineLayout, set: u32, descriptorWriteCount: u32, pDescriptorWrites: [^]WriteDescriptorSet) -ProcCmdPushDescriptorSetWithTemplateKHR :: #type proc "system" (commandBuffer: CommandBuffer, descriptorUpdateTemplate: DescriptorUpdateTemplate, layout: PipelineLayout, set: u32, pData: rawptr) -ProcCreateDescriptorUpdateTemplateKHR :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorUpdateTemplateCreateInfo, pAllocator: ^AllocationCallbacks, pDescriptorUpdateTemplate: ^DescriptorUpdateTemplate) -> Result -ProcDestroyDescriptorUpdateTemplateKHR :: #type proc "system" (device: Device, descriptorUpdateTemplate: DescriptorUpdateTemplate, pAllocator: ^AllocationCallbacks) -ProcUpdateDescriptorSetWithTemplateKHR :: #type proc "system" (device: Device, descriptorSet: DescriptorSet, descriptorUpdateTemplate: DescriptorUpdateTemplate, pData: rawptr) -ProcCreateRenderPass2KHR :: #type proc "system" (device: Device, pCreateInfo: ^RenderPassCreateInfo2, pAllocator: ^AllocationCallbacks, pRenderPass: [^]RenderPass) -> Result -ProcCmdBeginRenderPass2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pRenderPassBegin: ^RenderPassBeginInfo, pSubpassBeginInfo: ^SubpassBeginInfo) -ProcCmdNextSubpass2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pSubpassBeginInfo: ^SubpassBeginInfo, pSubpassEndInfo: ^SubpassEndInfo) -ProcCmdEndRenderPass2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pSubpassEndInfo: ^SubpassEndInfo) -ProcGetSwapchainStatusKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR) -> Result -ProcGetPhysicalDeviceExternalFencePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalFenceInfo: ^PhysicalDeviceExternalFenceInfo, pExternalFenceProperties: [^]ExternalFenceProperties) -ProcImportFenceFdKHR :: #type proc "system" (device: Device, pImportFenceFdInfo: ^ImportFenceFdInfoKHR) -> Result -ProcGetFenceFdKHR :: #type proc "system" (device: Device, pGetFdInfo: ^FenceGetFdInfoKHR, pFd: ^c.int) -> Result -ProcEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, pCounterCount: ^u32, pCounters: [^]PerformanceCounterKHR, pCounterDescriptions: [^]PerformanceCounterDescriptionKHR) -> Result -ProcGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPerformanceQueryCreateInfo: ^QueryPoolPerformanceCreateInfoKHR, pNumPasses: [^]u32) -ProcAcquireProfilingLockKHR :: #type proc "system" (device: Device, pInfo: ^AcquireProfilingLockInfoKHR) -> Result -ProcReleaseProfilingLockKHR :: #type proc "system" (device: Device) -ProcGetPhysicalDeviceSurfaceCapabilities2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pSurfaceCapabilities: [^]SurfaceCapabilities2KHR) -> Result -ProcGetPhysicalDeviceSurfaceFormats2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pSurfaceFormatCount: ^u32, pSurfaceFormats: [^]SurfaceFormat2KHR) -> Result -ProcGetPhysicalDeviceDisplayProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayProperties2KHR) -> Result -ProcGetPhysicalDeviceDisplayPlaneProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayPlaneProperties2KHR) -> Result -ProcGetDisplayModeProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR, pPropertyCount: ^u32, pProperties: [^]DisplayModeProperties2KHR) -> Result -ProcGetDisplayPlaneCapabilities2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pDisplayPlaneInfo: ^DisplayPlaneInfo2KHR, pCapabilities: [^]DisplayPlaneCapabilities2KHR) -> Result -ProcGetImageMemoryRequirements2KHR :: #type proc "system" (device: Device, pInfo: ^ImageMemoryRequirementsInfo2, pMemoryRequirements: [^]MemoryRequirements2) -ProcGetBufferMemoryRequirements2KHR :: #type proc "system" (device: Device, pInfo: ^BufferMemoryRequirementsInfo2, pMemoryRequirements: [^]MemoryRequirements2) -ProcGetImageSparseMemoryRequirements2KHR :: #type proc "system" (device: Device, pInfo: ^ImageSparseMemoryRequirementsInfo2, pSparseMemoryRequirementCount: ^u32, pSparseMemoryRequirements: [^]SparseImageMemoryRequirements2) -ProcCreateSamplerYcbcrConversionKHR :: #type proc "system" (device: Device, pCreateInfo: ^SamplerYcbcrConversionCreateInfo, pAllocator: ^AllocationCallbacks, pYcbcrConversion: ^SamplerYcbcrConversion) -> Result -ProcDestroySamplerYcbcrConversionKHR :: #type proc "system" (device: Device, ycbcrConversion: SamplerYcbcrConversion, pAllocator: ^AllocationCallbacks) -ProcBindBufferMemory2KHR :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindBufferMemoryInfo) -> Result -ProcBindImageMemory2KHR :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindImageMemoryInfo) -> Result -ProcGetDescriptorSetLayoutSupportKHR :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorSetLayoutCreateInfo, pSupport: ^DescriptorSetLayoutSupport) -ProcCmdDrawIndirectCountKHR :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) -ProcCmdDrawIndexedIndirectCountKHR :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) -ProcGetSemaphoreCounterValueKHR :: #type proc "system" (device: Device, semaphore: Semaphore, pValue: ^u64) -> Result -ProcWaitSemaphoresKHR :: #type proc "system" (device: Device, pWaitInfo: ^SemaphoreWaitInfo, timeout: u64) -> Result -ProcSignalSemaphoreKHR :: #type proc "system" (device: Device, pSignalInfo: ^SemaphoreSignalInfo) -> Result -ProcGetPhysicalDeviceFragmentShadingRatesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pFragmentShadingRateCount: ^u32, pFragmentShadingRates: [^]PhysicalDeviceFragmentShadingRateKHR) -> Result -ProcCmdSetFragmentShadingRateKHR :: #type proc "system" (commandBuffer: CommandBuffer, pFragmentSize: ^Extent2D) -ProcWaitForPresentKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR, presentId: u64, timeout: u64) -> Result -ProcGetBufferDeviceAddressKHR :: #type proc "system" (device: Device, pInfo: ^BufferDeviceAddressInfo) -> DeviceAddress -ProcGetBufferOpaqueCaptureAddressKHR :: #type proc "system" (device: Device, pInfo: ^BufferDeviceAddressInfo) -> u64 -ProcGetDeviceMemoryOpaqueCaptureAddressKHR :: #type proc "system" (device: Device, pInfo: ^DeviceMemoryOpaqueCaptureAddressInfo) -> u64 -ProcCreateDeferredOperationKHR :: #type proc "system" (device: Device, pAllocator: ^AllocationCallbacks, pDeferredOperation: ^DeferredOperationKHR) -> Result -ProcDestroyDeferredOperationKHR :: #type proc "system" (device: Device, operation: DeferredOperationKHR, pAllocator: ^AllocationCallbacks) -ProcGetDeferredOperationMaxConcurrencyKHR :: #type proc "system" (device: Device, operation: DeferredOperationKHR) -> u32 -ProcGetDeferredOperationResultKHR :: #type proc "system" (device: Device, operation: DeferredOperationKHR) -> Result -ProcDeferredOperationJoinKHR :: #type proc "system" (device: Device, operation: DeferredOperationKHR) -> Result -ProcGetPipelineExecutablePropertiesKHR :: #type proc "system" (device: Device, pPipelineInfo: ^PipelineInfoKHR, pExecutableCount: ^u32, pProperties: [^]PipelineExecutablePropertiesKHR) -> Result -ProcGetPipelineExecutableStatisticsKHR :: #type proc "system" (device: Device, pExecutableInfo: ^PipelineExecutableInfoKHR, pStatisticCount: ^u32, pStatistics: [^]PipelineExecutableStatisticKHR) -> Result -ProcGetPipelineExecutableInternalRepresentationsKHR :: #type proc "system" (device: Device, pExecutableInfo: ^PipelineExecutableInfoKHR, pInternalRepresentationCount: ^u32, pInternalRepresentations: [^]PipelineExecutableInternalRepresentationKHR) -> Result -ProcCmdSetEvent2KHR :: #type proc "system" (commandBuffer: CommandBuffer, event: Event, pDependencyInfo: ^DependencyInfoKHR) -ProcCmdResetEvent2KHR :: #type proc "system" (commandBuffer: CommandBuffer, event: Event, stageMask: PipelineStageFlags2KHR) -ProcCmdWaitEvents2KHR :: #type proc "system" (commandBuffer: CommandBuffer, eventCount: u32, pEvents: [^]Event, pDependencyInfos: [^]DependencyInfoKHR) -ProcCmdPipelineBarrier2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pDependencyInfo: ^DependencyInfoKHR) -ProcCmdWriteTimestamp2KHR :: #type proc "system" (commandBuffer: CommandBuffer, stage: PipelineStageFlags2KHR, queryPool: QueryPool, query: u32) -ProcQueueSubmit2KHR :: #type proc "system" (queue: Queue, submitCount: u32, pSubmits: [^]SubmitInfo2KHR, fence: Fence) -> Result -ProcCmdWriteBufferMarker2AMD :: #type proc "system" (commandBuffer: CommandBuffer, stage: PipelineStageFlags2KHR, dstBuffer: Buffer, dstOffset: DeviceSize, marker: u32) -ProcGetQueueCheckpointData2NV :: #type proc "system" (queue: Queue, pCheckpointDataCount: ^u32, pCheckpointData: ^CheckpointData2NV) -ProcCmdCopyBuffer2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyBufferInfo: ^CopyBufferInfo2KHR) -ProcCmdCopyImage2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyImageInfo: ^CopyImageInfo2KHR) -ProcCmdCopyBufferToImage2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyBufferToImageInfo: ^CopyBufferToImageInfo2KHR) -ProcCmdCopyImageToBuffer2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyImageToBufferInfo: ^CopyImageToBufferInfo2KHR) -ProcCmdBlitImage2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pBlitImageInfo: ^BlitImageInfo2KHR) -ProcCmdResolveImage2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pResolveImageInfo: ^ResolveImageInfo2KHR) -ProcDebugReportCallbackEXT :: #type proc "system" (flags: DebugReportFlagsEXT, objectType: DebugReportObjectTypeEXT, object: u64, location: int, messageCode: i32, pLayerPrefix: cstring, pMessage: cstring, pUserData: rawptr) -> b32 -ProcCreateDebugReportCallbackEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^DebugReportCallbackCreateInfoEXT, pAllocator: ^AllocationCallbacks, pCallback: ^DebugReportCallbackEXT) -> Result -ProcDestroyDebugReportCallbackEXT :: #type proc "system" (instance: Instance, callback: DebugReportCallbackEXT, pAllocator: ^AllocationCallbacks) -ProcDebugReportMessageEXT :: #type proc "system" (instance: Instance, flags: DebugReportFlagsEXT, objectType: DebugReportObjectTypeEXT, object: u64, location: int, messageCode: i32, pLayerPrefix: cstring, pMessage: cstring) -ProcDebugMarkerSetObjectTagEXT :: #type proc "system" (device: Device, pTagInfo: ^DebugMarkerObjectTagInfoEXT) -> Result -ProcDebugMarkerSetObjectNameEXT :: #type proc "system" (device: Device, pNameInfo: ^DebugMarkerObjectNameInfoEXT) -> Result -ProcCmdDebugMarkerBeginEXT :: #type proc "system" (commandBuffer: CommandBuffer, pMarkerInfo: ^DebugMarkerMarkerInfoEXT) -ProcCmdDebugMarkerEndEXT :: #type proc "system" (commandBuffer: CommandBuffer) -ProcCmdDebugMarkerInsertEXT :: #type proc "system" (commandBuffer: CommandBuffer, pMarkerInfo: ^DebugMarkerMarkerInfoEXT) -ProcCmdBindTransformFeedbackBuffersEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstBinding: u32, bindingCount: u32, pBuffers: [^]Buffer, pOffsets: [^]DeviceSize, pSizes: [^]DeviceSize) -ProcCmdBeginTransformFeedbackEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstCounterBuffer: u32, counterBufferCount: u32, pCounterBuffers: [^]Buffer, pCounterBufferOffsets: [^]DeviceSize) -ProcCmdEndTransformFeedbackEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstCounterBuffer: u32, counterBufferCount: u32, pCounterBuffers: [^]Buffer, pCounterBufferOffsets: [^]DeviceSize) -ProcCmdBeginQueryIndexedEXT :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, query: u32, flags: QueryControlFlags, index: u32) -ProcCmdEndQueryIndexedEXT :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, query: u32, index: u32) -ProcCmdDrawIndirectByteCountEXT :: #type proc "system" (commandBuffer: CommandBuffer, instanceCount: u32, firstInstance: u32, counterBuffer: Buffer, counterBufferOffset: DeviceSize, counterOffset: u32, vertexStride: u32) -ProcCreateCuModuleNVX :: #type proc "system" (device: Device, pCreateInfo: ^CuModuleCreateInfoNVX, pAllocator: ^AllocationCallbacks, pModule: ^CuModuleNVX) -> Result -ProcCreateCuFunctionNVX :: #type proc "system" (device: Device, pCreateInfo: ^CuFunctionCreateInfoNVX, pAllocator: ^AllocationCallbacks, pFunction: ^CuFunctionNVX) -> Result -ProcDestroyCuModuleNVX :: #type proc "system" (device: Device, module: CuModuleNVX, pAllocator: ^AllocationCallbacks) -ProcDestroyCuFunctionNVX :: #type proc "system" (device: Device, function: CuFunctionNVX, pAllocator: ^AllocationCallbacks) -ProcCmdCuLaunchKernelNVX :: #type proc "system" (commandBuffer: CommandBuffer, pLaunchInfo: ^CuLaunchInfoNVX) -ProcGetImageViewHandleNVX :: #type proc "system" (device: Device, pInfo: ^ImageViewHandleInfoNVX) -> u32 -ProcGetImageViewAddressNVX :: #type proc "system" (device: Device, imageView: ImageView, pProperties: [^]ImageViewAddressPropertiesNVX) -> Result -ProcCmdDrawIndirectCountAMD :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) -ProcCmdDrawIndexedIndirectCountAMD :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) -ProcGetShaderInfoAMD :: #type proc "system" (device: Device, pipeline: Pipeline, shaderStage: ShaderStageFlags, infoType: ShaderInfoTypeAMD, pInfoSize: ^int, pInfo: rawptr) -> Result -ProcGetPhysicalDeviceExternalImageFormatPropertiesNV :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, type: ImageType, tiling: ImageTiling, usage: ImageUsageFlags, flags: ImageCreateFlags, externalHandleType: ExternalMemoryHandleTypeFlagsNV, pExternalImageFormatProperties: [^]ExternalImageFormatPropertiesNV) -> Result -ProcCmdBeginConditionalRenderingEXT :: #type proc "system" (commandBuffer: CommandBuffer, pConditionalRenderingBegin: ^ConditionalRenderingBeginInfoEXT) -ProcCmdEndConditionalRenderingEXT :: #type proc "system" (commandBuffer: CommandBuffer) -ProcCmdSetViewportWScalingNV :: #type proc "system" (commandBuffer: CommandBuffer, firstViewport: u32, viewportCount: u32, pViewportWScalings: [^]ViewportWScalingNV) -ProcReleaseDisplayEXT :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR) -> Result -ProcGetPhysicalDeviceSurfaceCapabilities2EXT :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pSurfaceCapabilities: [^]SurfaceCapabilities2EXT) -> Result -ProcDisplayPowerControlEXT :: #type proc "system" (device: Device, display: DisplayKHR, pDisplayPowerInfo: ^DisplayPowerInfoEXT) -> Result -ProcRegisterDeviceEventEXT :: #type proc "system" (device: Device, pDeviceEventInfo: ^DeviceEventInfoEXT, pAllocator: ^AllocationCallbacks, pFence: ^Fence) -> Result -ProcRegisterDisplayEventEXT :: #type proc "system" (device: Device, display: DisplayKHR, pDisplayEventInfo: ^DisplayEventInfoEXT, pAllocator: ^AllocationCallbacks, pFence: ^Fence) -> Result -ProcGetSwapchainCounterEXT :: #type proc "system" (device: Device, swapchain: SwapchainKHR, counter: SurfaceCounterFlagsEXT, pCounterValue: ^u64) -> Result -ProcGetRefreshCycleDurationGOOGLE :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pDisplayTimingProperties: [^]RefreshCycleDurationGOOGLE) -> Result -ProcGetPastPresentationTimingGOOGLE :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pPresentationTimingCount: ^u32, pPresentationTimings: [^]PastPresentationTimingGOOGLE) -> Result -ProcCmdSetDiscardRectangleEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstDiscardRectangle: u32, discardRectangleCount: u32, pDiscardRectangles: [^]Rect2D) -ProcSetHdrMetadataEXT :: #type proc "system" (device: Device, swapchainCount: u32, pSwapchains: [^]SwapchainKHR, pMetadata: ^HdrMetadataEXT) -ProcDebugUtilsMessengerCallbackEXT :: #type proc "system" (messageSeverity: DebugUtilsMessageSeverityFlagsEXT, messageTypes: DebugUtilsMessageTypeFlagsEXT, pCallbackData: ^DebugUtilsMessengerCallbackDataEXT, pUserData: rawptr) -> b32 -ProcSetDebugUtilsObjectNameEXT :: #type proc "system" (device: Device, pNameInfo: ^DebugUtilsObjectNameInfoEXT) -> Result -ProcSetDebugUtilsObjectTagEXT :: #type proc "system" (device: Device, pTagInfo: ^DebugUtilsObjectTagInfoEXT) -> Result -ProcQueueBeginDebugUtilsLabelEXT :: #type proc "system" (queue: Queue, pLabelInfo: ^DebugUtilsLabelEXT) -ProcQueueEndDebugUtilsLabelEXT :: #type proc "system" (queue: Queue) -ProcQueueInsertDebugUtilsLabelEXT :: #type proc "system" (queue: Queue, pLabelInfo: ^DebugUtilsLabelEXT) -ProcCmdBeginDebugUtilsLabelEXT :: #type proc "system" (commandBuffer: CommandBuffer, pLabelInfo: ^DebugUtilsLabelEXT) -ProcCmdEndDebugUtilsLabelEXT :: #type proc "system" (commandBuffer: CommandBuffer) -ProcCmdInsertDebugUtilsLabelEXT :: #type proc "system" (commandBuffer: CommandBuffer, pLabelInfo: ^DebugUtilsLabelEXT) -ProcCreateDebugUtilsMessengerEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^DebugUtilsMessengerCreateInfoEXT, pAllocator: ^AllocationCallbacks, pMessenger: ^DebugUtilsMessengerEXT) -> Result -ProcDestroyDebugUtilsMessengerEXT :: #type proc "system" (instance: Instance, messenger: DebugUtilsMessengerEXT, pAllocator: ^AllocationCallbacks) -ProcSubmitDebugUtilsMessageEXT :: #type proc "system" (instance: Instance, messageSeverity: DebugUtilsMessageSeverityFlagsEXT, messageTypes: DebugUtilsMessageTypeFlagsEXT, pCallbackData: ^DebugUtilsMessengerCallbackDataEXT) -ProcCmdSetSampleLocationsEXT :: #type proc "system" (commandBuffer: CommandBuffer, pSampleLocationsInfo: ^SampleLocationsInfoEXT) -ProcGetPhysicalDeviceMultisamplePropertiesEXT :: #type proc "system" (physicalDevice: PhysicalDevice, samples: SampleCountFlags, pMultisampleProperties: [^]MultisamplePropertiesEXT) -ProcGetImageDrmFormatModifierPropertiesEXT :: #type proc "system" (device: Device, image: Image, pProperties: [^]ImageDrmFormatModifierPropertiesEXT) -> Result -ProcCreateValidationCacheEXT :: #type proc "system" (device: Device, pCreateInfo: ^ValidationCacheCreateInfoEXT, pAllocator: ^AllocationCallbacks, pValidationCache: ^ValidationCacheEXT) -> Result -ProcDestroyValidationCacheEXT :: #type proc "system" (device: Device, validationCache: ValidationCacheEXT, pAllocator: ^AllocationCallbacks) -ProcMergeValidationCachesEXT :: #type proc "system" (device: Device, dstCache: ValidationCacheEXT, srcCacheCount: u32, pSrcCaches: [^]ValidationCacheEXT) -> Result -ProcGetValidationCacheDataEXT :: #type proc "system" (device: Device, validationCache: ValidationCacheEXT, pDataSize: ^int, pData: rawptr) -> Result -ProcCmdBindShadingRateImageNV :: #type proc "system" (commandBuffer: CommandBuffer, imageView: ImageView, imageLayout: ImageLayout) -ProcCmdSetViewportShadingRatePaletteNV :: #type proc "system" (commandBuffer: CommandBuffer, firstViewport: u32, viewportCount: u32, pShadingRatePalettes: [^]ShadingRatePaletteNV) -ProcCmdSetCoarseSampleOrderNV :: #type proc "system" (commandBuffer: CommandBuffer, sampleOrderType: CoarseSampleOrderTypeNV, customSampleOrderCount: u32, pCustomSampleOrders: [^]CoarseSampleOrderCustomNV) -ProcCreateAccelerationStructureNV :: #type proc "system" (device: Device, pCreateInfo: ^AccelerationStructureCreateInfoNV, pAllocator: ^AllocationCallbacks, pAccelerationStructure: ^AccelerationStructureNV) -> Result -ProcDestroyAccelerationStructureNV :: #type proc "system" (device: Device, accelerationStructure: AccelerationStructureNV, pAllocator: ^AllocationCallbacks) -ProcGetAccelerationStructureMemoryRequirementsNV :: #type proc "system" (device: Device, pInfo: ^AccelerationStructureMemoryRequirementsInfoNV, pMemoryRequirements: [^]MemoryRequirements2KHR) -ProcBindAccelerationStructureMemoryNV :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindAccelerationStructureMemoryInfoNV) -> Result -ProcCmdBuildAccelerationStructureNV :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^AccelerationStructureInfoNV, instanceData: Buffer, instanceOffset: DeviceSize, update: b32, dst: AccelerationStructureNV, src: AccelerationStructureNV, scratch: Buffer, scratchOffset: DeviceSize) -ProcCmdCopyAccelerationStructureNV :: #type proc "system" (commandBuffer: CommandBuffer, dst: AccelerationStructureNV, src: AccelerationStructureNV, mode: CopyAccelerationStructureModeKHR) -ProcCmdTraceRaysNV :: #type proc "system" (commandBuffer: CommandBuffer, raygenShaderBindingTableBuffer: Buffer, raygenShaderBindingOffset: DeviceSize, missShaderBindingTableBuffer: Buffer, missShaderBindingOffset: DeviceSize, missShaderBindingStride: DeviceSize, hitShaderBindingTableBuffer: Buffer, hitShaderBindingOffset: DeviceSize, hitShaderBindingStride: DeviceSize, callableShaderBindingTableBuffer: Buffer, callableShaderBindingOffset: DeviceSize, callableShaderBindingStride: DeviceSize, width: u32, height: u32, depth: u32) -ProcCreateRayTracingPipelinesNV :: #type proc "system" (device: Device, pipelineCache: PipelineCache, createInfoCount: u32, pCreateInfos: [^]RayTracingPipelineCreateInfoNV, pAllocator: ^AllocationCallbacks, pPipelines: [^]Pipeline) -> Result -ProcGetRayTracingShaderGroupHandlesKHR :: #type proc "system" (device: Device, pipeline: Pipeline, firstGroup: u32, groupCount: u32, dataSize: int, pData: rawptr) -> Result -ProcGetRayTracingShaderGroupHandlesNV :: #type proc "system" (device: Device, pipeline: Pipeline, firstGroup: u32, groupCount: u32, dataSize: int, pData: rawptr) -> Result -ProcGetAccelerationStructureHandleNV :: #type proc "system" (device: Device, accelerationStructure: AccelerationStructureNV, dataSize: int, pData: rawptr) -> Result -ProcCmdWriteAccelerationStructuresPropertiesNV :: #type proc "system" (commandBuffer: CommandBuffer, accelerationStructureCount: u32, pAccelerationStructures: [^]AccelerationStructureNV, queryType: QueryType, queryPool: QueryPool, firstQuery: u32) -ProcCompileDeferredNV :: #type proc "system" (device: Device, pipeline: Pipeline, shader: u32) -> Result -ProcGetMemoryHostPointerPropertiesEXT :: #type proc "system" (device: Device, handleType: ExternalMemoryHandleTypeFlags, pHostPointer: rawptr, pMemoryHostPointerProperties: [^]MemoryHostPointerPropertiesEXT) -> Result -ProcCmdWriteBufferMarkerAMD :: #type proc "system" (commandBuffer: CommandBuffer, pipelineStage: PipelineStageFlags, dstBuffer: Buffer, dstOffset: DeviceSize, marker: u32) -ProcGetPhysicalDeviceCalibrateableTimeDomainsEXT :: #type proc "system" (physicalDevice: PhysicalDevice, pTimeDomainCount: ^u32, pTimeDomains: [^]TimeDomainEXT) -> Result -ProcGetCalibratedTimestampsEXT :: #type proc "system" (device: Device, timestampCount: u32, pTimestampInfos: [^]CalibratedTimestampInfoEXT, pTimestamps: [^]u64, pMaxDeviation: ^u64) -> Result -ProcCmdDrawMeshTasksNV :: #type proc "system" (commandBuffer: CommandBuffer, taskCount: u32, firstTask: u32) -ProcCmdDrawMeshTasksIndirectNV :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, drawCount: u32, stride: u32) -ProcCmdDrawMeshTasksIndirectCountNV :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) -ProcCmdSetExclusiveScissorNV :: #type proc "system" (commandBuffer: CommandBuffer, firstExclusiveScissor: u32, exclusiveScissorCount: u32, pExclusiveScissors: [^]Rect2D) -ProcCmdSetCheckpointNV :: #type proc "system" (commandBuffer: CommandBuffer, pCheckpointMarker: rawptr) -ProcGetQueueCheckpointDataNV :: #type proc "system" (queue: Queue, pCheckpointDataCount: ^u32, pCheckpointData: ^CheckpointDataNV) -ProcInitializePerformanceApiINTEL :: #type proc "system" (device: Device, pInitializeInfo: ^InitializePerformanceApiInfoINTEL) -> Result -ProcUninitializePerformanceApiINTEL :: #type proc "system" (device: Device) -ProcCmdSetPerformanceMarkerINTEL :: #type proc "system" (commandBuffer: CommandBuffer, pMarkerInfo: ^PerformanceMarkerInfoINTEL) -> Result -ProcCmdSetPerformanceStreamMarkerINTEL :: #type proc "system" (commandBuffer: CommandBuffer, pMarkerInfo: ^PerformanceStreamMarkerInfoINTEL) -> Result -ProcCmdSetPerformanceOverrideINTEL :: #type proc "system" (commandBuffer: CommandBuffer, pOverrideInfo: ^PerformanceOverrideInfoINTEL) -> Result -ProcAcquirePerformanceConfigurationINTEL :: #type proc "system" (device: Device, pAcquireInfo: ^PerformanceConfigurationAcquireInfoINTEL, pConfiguration: ^PerformanceConfigurationINTEL) -> Result -ProcReleasePerformanceConfigurationINTEL :: #type proc "system" (device: Device, configuration: PerformanceConfigurationINTEL) -> Result -ProcQueueSetPerformanceConfigurationINTEL :: #type proc "system" (queue: Queue, configuration: PerformanceConfigurationINTEL) -> Result -ProcGetPerformanceParameterINTEL :: #type proc "system" (device: Device, parameter: PerformanceParameterTypeINTEL, pValue: ^PerformanceValueINTEL) -> Result -ProcSetLocalDimmingAMD :: #type proc "system" (device: Device, swapChain: SwapchainKHR, localDimmingEnable: b32) -ProcGetBufferDeviceAddressEXT :: #type proc "system" (device: Device, pInfo: ^BufferDeviceAddressInfo) -> DeviceAddress -ProcGetPhysicalDeviceToolPropertiesEXT :: #type proc "system" (physicalDevice: PhysicalDevice, pToolCount: ^u32, pToolProperties: [^]PhysicalDeviceToolPropertiesEXT) -> Result -ProcGetPhysicalDeviceCooperativeMatrixPropertiesNV :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]CooperativeMatrixPropertiesNV) -> Result -ProcGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV :: #type proc "system" (physicalDevice: PhysicalDevice, pCombinationCount: ^u32, pCombinations: [^]FramebufferMixedSamplesCombinationNV) -> Result -ProcCreateHeadlessSurfaceEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^HeadlessSurfaceCreateInfoEXT, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result -ProcCmdSetLineStippleEXT :: #type proc "system" (commandBuffer: CommandBuffer, lineStippleFactor: u32, lineStipplePattern: u16) -ProcResetQueryPoolEXT :: #type proc "system" (device: Device, queryPool: QueryPool, firstQuery: u32, queryCount: u32) -ProcCmdSetCullModeEXT :: #type proc "system" (commandBuffer: CommandBuffer, cullMode: CullModeFlags) -ProcCmdSetFrontFaceEXT :: #type proc "system" (commandBuffer: CommandBuffer, frontFace: FrontFace) -ProcCmdSetPrimitiveTopologyEXT :: #type proc "system" (commandBuffer: CommandBuffer, primitiveTopology: PrimitiveTopology) -ProcCmdSetViewportWithCountEXT :: #type proc "system" (commandBuffer: CommandBuffer, viewportCount: u32, pViewports: [^]Viewport) -ProcCmdSetScissorWithCountEXT :: #type proc "system" (commandBuffer: CommandBuffer, scissorCount: u32, pScissors: [^]Rect2D) -ProcCmdBindVertexBuffers2EXT :: #type proc "system" (commandBuffer: CommandBuffer, firstBinding: u32, bindingCount: u32, pBuffers: [^]Buffer, pOffsets: [^]DeviceSize, pSizes: [^]DeviceSize, pStrides: [^]DeviceSize) -ProcCmdSetDepthTestEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, depthTestEnable: b32) -ProcCmdSetDepthWriteEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, depthWriteEnable: b32) -ProcCmdSetDepthCompareOpEXT :: #type proc "system" (commandBuffer: CommandBuffer, depthCompareOp: CompareOp) -ProcCmdSetDepthBoundsTestEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, depthBoundsTestEnable: b32) -ProcCmdSetStencilTestEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, stencilTestEnable: b32) -ProcCmdSetStencilOpEXT :: #type proc "system" (commandBuffer: CommandBuffer, faceMask: StencilFaceFlags, failOp: StencilOp, passOp: StencilOp, depthFailOp: StencilOp, compareOp: CompareOp) -ProcGetGeneratedCommandsMemoryRequirementsNV :: #type proc "system" (device: Device, pInfo: ^GeneratedCommandsMemoryRequirementsInfoNV, pMemoryRequirements: [^]MemoryRequirements2) -ProcCmdPreprocessGeneratedCommandsNV :: #type proc "system" (commandBuffer: CommandBuffer, pGeneratedCommandsInfo: ^GeneratedCommandsInfoNV) -ProcCmdExecuteGeneratedCommandsNV :: #type proc "system" (commandBuffer: CommandBuffer, isPreprocessed: b32, pGeneratedCommandsInfo: ^GeneratedCommandsInfoNV) -ProcCmdBindPipelineShaderGroupNV :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, pipeline: Pipeline, groupIndex: u32) -ProcCreateIndirectCommandsLayoutNV :: #type proc "system" (device: Device, pCreateInfo: ^IndirectCommandsLayoutCreateInfoNV, pAllocator: ^AllocationCallbacks, pIndirectCommandsLayout: ^IndirectCommandsLayoutNV) -> Result -ProcDestroyIndirectCommandsLayoutNV :: #type proc "system" (device: Device, indirectCommandsLayout: IndirectCommandsLayoutNV, pAllocator: ^AllocationCallbacks) -ProcDeviceMemoryReportCallbackEXT :: #type proc "system" (pCallbackData: ^DeviceMemoryReportCallbackDataEXT, pUserData: rawptr) +// Misc Procedure Types +ProcAllocationFunction :: #type proc "system" (pUserData: rawptr, size: int, alignment: int, allocationScope: SystemAllocationScope) -> rawptr +ProcDebugReportCallbackEXT :: #type proc "system" (flags: DebugReportFlagsEXT, objectType: DebugReportObjectTypeEXT, object: u64, location: int, messageCode: i32, pLayerPrefix: cstring, pMessage: cstring, pUserData: rawptr) -> b32 +ProcFreeFunction :: #type proc "system" (pUserData: rawptr, pMemory: rawptr) +ProcInternalAllocationNotification :: #type proc "system" (pUserData: rawptr, size: int, allocationType: InternalAllocationType, allocationScope: SystemAllocationScope) +ProcInternalFreeNotification :: #type proc "system" (pUserData: rawptr, size: int, allocationType: InternalAllocationType, allocationScope: SystemAllocationScope) +ProcReallocationFunction :: #type proc "system" (pUserData: rawptr, pOriginal: rawptr, size: int, alignment: int, allocationScope: SystemAllocationScope) -> rawptr +ProcVoidFunction :: #type proc "system" () + +// Instance Procedure Types ProcAcquireDrmDisplayEXT :: #type proc "system" (physicalDevice: PhysicalDevice, drmFd: i32, display: DisplayKHR) -> Result -ProcGetDrmDisplayEXT :: #type proc "system" (physicalDevice: PhysicalDevice, drmFd: i32, connectorId: u32, display: ^DisplayKHR) -> Result -ProcCreatePrivateDataSlotEXT :: #type proc "system" (device: Device, pCreateInfo: ^PrivateDataSlotCreateInfoEXT, pAllocator: ^AllocationCallbacks, pPrivateDataSlot: ^PrivateDataSlotEXT) -> Result -ProcDestroyPrivateDataSlotEXT :: #type proc "system" (device: Device, privateDataSlot: PrivateDataSlotEXT, pAllocator: ^AllocationCallbacks) -ProcSetPrivateDataEXT :: #type proc "system" (device: Device, objectType: ObjectType, objectHandle: u64, privateDataSlot: PrivateDataSlotEXT, data: u64) -> Result -ProcGetPrivateDataEXT :: #type proc "system" (device: Device, objectType: ObjectType, objectHandle: u64, privateDataSlot: PrivateDataSlotEXT, pData: ^u64) -ProcCmdSetFragmentShadingRateEnumNV :: #type proc "system" (commandBuffer: CommandBuffer, shadingRate: FragmentShadingRateNV) ProcAcquireWinrtDisplayNV :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR) -> Result -ProcGetWinrtDisplayNV :: #type proc "system" (physicalDevice: PhysicalDevice, deviceRelativeId: u32, pDisplay: ^DisplayKHR) -> Result -ProcCmdSetVertexInputEXT :: #type proc "system" (commandBuffer: CommandBuffer, vertexBindingDescriptionCount: u32, pVertexBindingDescriptions: [^]VertexInputBindingDescription2EXT, vertexAttributeDescriptionCount: u32, pVertexAttributeDescriptions: [^]VertexInputAttributeDescription2EXT) -ProcGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI :: #type proc "system" (device: Device, renderpass: RenderPass, pMaxWorkgroupSize: ^Extent2D) -> Result -ProcCmdSubpassShadingHUAWEI :: #type proc "system" (commandBuffer: CommandBuffer) -ProcCmdBindInvocationMaskHUAWEI :: #type proc "system" (commandBuffer: CommandBuffer, imageView: ImageView, imageLayout: ImageLayout) -ProcGetMemoryRemoteAddressNV :: #type proc "system" (device: Device, pMemoryGetRemoteAddressInfo: ^MemoryGetRemoteAddressInfoNV, pAddress: [^]RemoteAddressNV) -> Result -ProcCmdSetPatchControlPointsEXT :: #type proc "system" (commandBuffer: CommandBuffer, patchControlPoints: u32) -ProcCmdSetRasterizerDiscardEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, rasterizerDiscardEnable: b32) -ProcCmdSetDepthBiasEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, depthBiasEnable: b32) -ProcCmdSetLogicOpEXT :: #type proc "system" (commandBuffer: CommandBuffer, logicOp: LogicOp) -ProcCmdSetPrimitiveRestartEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, primitiveRestartEnable: b32) -ProcCmdDrawMultiEXT :: #type proc "system" (commandBuffer: CommandBuffer, drawCount: u32, pVertexInfo: ^MultiDrawInfoEXT, instanceCount: u32, firstInstance: u32, stride: u32) -ProcCmdDrawMultiIndexedEXT :: #type proc "system" (commandBuffer: CommandBuffer, drawCount: u32, pIndexInfo: ^MultiDrawIndexedInfoEXT, instanceCount: u32, firstInstance: u32, stride: u32, pVertexOffset: ^i32) -ProcSetDeviceMemoryPriorityEXT :: #type proc "system" (device: Device, memory: DeviceMemory, priority: f32) -ProcCreateAccelerationStructureKHR :: #type proc "system" (device: Device, pCreateInfo: ^AccelerationStructureCreateInfoKHR, pAllocator: ^AllocationCallbacks, pAccelerationStructure: ^AccelerationStructureKHR) -> Result -ProcDestroyAccelerationStructureKHR :: #type proc "system" (device: Device, accelerationStructure: AccelerationStructureKHR, pAllocator: ^AllocationCallbacks) -ProcCmdBuildAccelerationStructuresKHR :: #type proc "system" (commandBuffer: CommandBuffer, infoCount: u32, pInfos: [^]AccelerationStructureBuildGeometryInfoKHR, ppBuildRangeInfos: ^[^]AccelerationStructureBuildRangeInfoKHR) -ProcCmdBuildAccelerationStructuresIndirectKHR :: #type proc "system" (commandBuffer: CommandBuffer, infoCount: u32, pInfos: [^]AccelerationStructureBuildGeometryInfoKHR, pIndirectDeviceAddresses: [^]DeviceAddress, pIndirectStrides: [^]u32, ppMaxPrimitiveCounts: ^[^]u32) -ProcBuildAccelerationStructuresKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, infoCount: u32, pInfos: [^]AccelerationStructureBuildGeometryInfoKHR, ppBuildRangeInfos: ^[^]AccelerationStructureBuildRangeInfoKHR) -> Result -ProcCopyAccelerationStructureKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pInfo: ^CopyAccelerationStructureInfoKHR) -> Result -ProcCopyAccelerationStructureToMemoryKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pInfo: ^CopyAccelerationStructureToMemoryInfoKHR) -> Result -ProcCopyMemoryToAccelerationStructureKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pInfo: ^CopyMemoryToAccelerationStructureInfoKHR) -> Result -ProcWriteAccelerationStructuresPropertiesKHR :: #type proc "system" (device: Device, accelerationStructureCount: u32, pAccelerationStructures: [^]AccelerationStructureKHR, queryType: QueryType, dataSize: int, pData: rawptr, stride: int) -> Result -ProcCmdCopyAccelerationStructureKHR :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^CopyAccelerationStructureInfoKHR) -ProcCmdCopyAccelerationStructureToMemoryKHR :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^CopyAccelerationStructureToMemoryInfoKHR) -ProcCmdCopyMemoryToAccelerationStructureKHR :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^CopyMemoryToAccelerationStructureInfoKHR) -ProcGetAccelerationStructureDeviceAddressKHR :: #type proc "system" (device: Device, pInfo: ^AccelerationStructureDeviceAddressInfoKHR) -> DeviceAddress -ProcCmdWriteAccelerationStructuresPropertiesKHR :: #type proc "system" (commandBuffer: CommandBuffer, accelerationStructureCount: u32, pAccelerationStructures: [^]AccelerationStructureKHR, queryType: QueryType, queryPool: QueryPool, firstQuery: u32) -ProcGetDeviceAccelerationStructureCompatibilityKHR :: #type proc "system" (device: Device, pVersionInfo: ^AccelerationStructureVersionInfoKHR, pCompatibility: ^AccelerationStructureCompatibilityKHR) -ProcGetAccelerationStructureBuildSizesKHR :: #type proc "system" (device: Device, buildType: AccelerationStructureBuildTypeKHR, pBuildInfo: ^AccelerationStructureBuildGeometryInfoKHR, pMaxPrimitiveCounts: [^]u32, pSizeInfo: ^AccelerationStructureBuildSizesInfoKHR) -ProcCmdTraceRaysKHR :: #type proc "system" (commandBuffer: CommandBuffer, pRaygenShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pMissShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pHitShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pCallableShaderBindingTable: [^]StridedDeviceAddressRegionKHR, width: u32, height: u32, depth: u32) -ProcCreateRayTracingPipelinesKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pipelineCache: PipelineCache, createInfoCount: u32, pCreateInfos: [^]RayTracingPipelineCreateInfoKHR, pAllocator: ^AllocationCallbacks, pPipelines: [^]Pipeline) -> Result -ProcGetRayTracingCaptureReplayShaderGroupHandlesKHR :: #type proc "system" (device: Device, pipeline: Pipeline, firstGroup: u32, groupCount: u32, dataSize: int, pData: rawptr) -> Result -ProcCmdTraceRaysIndirectKHR :: #type proc "system" (commandBuffer: CommandBuffer, pRaygenShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pMissShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pHitShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pCallableShaderBindingTable: [^]StridedDeviceAddressRegionKHR, indirectDeviceAddress: DeviceAddress) -ProcGetRayTracingShaderGroupStackSizeKHR :: #type proc "system" (device: Device, pipeline: Pipeline, group: u32, groupShader: ShaderGroupShaderKHR) -> DeviceSize -ProcCmdSetRayTracingPipelineStackSizeKHR :: #type proc "system" (commandBuffer: CommandBuffer, pipelineStackSize: u32) -ProcCreateWin32SurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^Win32SurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result -ProcGetPhysicalDeviceWin32PresentationSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32) -> b32 -ProcGetMemoryWin32HandleKHR :: #type proc "system" (device: Device, pGetWin32HandleInfo: ^MemoryGetWin32HandleInfoKHR, pHandle: ^HANDLE) -> Result -ProcGetMemoryWin32HandlePropertiesKHR :: #type proc "system" (device: Device, handleType: ExternalMemoryHandleTypeFlags, handle: HANDLE, pMemoryWin32HandleProperties: [^]MemoryWin32HandlePropertiesKHR) -> Result -ProcImportSemaphoreWin32HandleKHR :: #type proc "system" (device: Device, pImportSemaphoreWin32HandleInfo: ^ImportSemaphoreWin32HandleInfoKHR) -> Result -ProcGetSemaphoreWin32HandleKHR :: #type proc "system" (device: Device, pGetWin32HandleInfo: ^SemaphoreGetWin32HandleInfoKHR, pHandle: ^HANDLE) -> Result -ProcImportFenceWin32HandleKHR :: #type proc "system" (device: Device, pImportFenceWin32HandleInfo: ^ImportFenceWin32HandleInfoKHR) -> Result -ProcGetFenceWin32HandleKHR :: #type proc "system" (device: Device, pGetWin32HandleInfo: ^FenceGetWin32HandleInfoKHR, pHandle: ^HANDLE) -> Result -ProcGetMemoryWin32HandleNV :: #type proc "system" (device: Device, memory: DeviceMemory, handleType: ExternalMemoryHandleTypeFlagsNV, pHandle: ^HANDLE) -> Result -ProcGetPhysicalDeviceSurfacePresentModes2EXT :: #type proc "system" (physicalDevice: PhysicalDevice, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pPresentModeCount: ^u32, pPresentModes: [^]PresentModeKHR) -> Result -ProcAcquireFullScreenExclusiveModeEXT :: #type proc "system" (device: Device, swapchain: SwapchainKHR) -> Result -ProcReleaseFullScreenExclusiveModeEXT :: #type proc "system" (device: Device, swapchain: SwapchainKHR) -> Result -ProcGetDeviceGroupSurfacePresentModes2EXT :: #type proc "system" (device: Device, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pModes: [^]DeviceGroupPresentModeFlagsKHR) -> Result -ProcCreateMetalSurfaceEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^MetalSurfaceCreateInfoEXT, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result -ProcCreateMacOSSurfaceMVK :: #type proc "system" (instance: Instance, pCreateInfo: ^MacOSSurfaceCreateInfoMVK, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcCreateDebugReportCallbackEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^DebugReportCallbackCreateInfoEXT, pAllocator: ^AllocationCallbacks, pCallback: ^DebugReportCallbackEXT) -> Result +ProcCreateDebugUtilsMessengerEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^DebugUtilsMessengerCreateInfoEXT, pAllocator: ^AllocationCallbacks, pMessenger: ^DebugUtilsMessengerEXT) -> Result +ProcCreateDevice :: #type proc "system" (physicalDevice: PhysicalDevice, pCreateInfo: ^DeviceCreateInfo, pAllocator: ^AllocationCallbacks, pDevice: ^Device) -> Result +ProcCreateDisplayModeKHR :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR, pCreateInfo: ^DisplayModeCreateInfoKHR, pAllocator: ^AllocationCallbacks, pMode: ^DisplayModeKHR) -> Result +ProcCreateDisplayPlaneSurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^DisplaySurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcCreateHeadlessSurfaceEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^HeadlessSurfaceCreateInfoEXT, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result ProcCreateIOSSurfaceMVK :: #type proc "system" (instance: Instance, pCreateInfo: ^IOSSurfaceCreateInfoMVK, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcCreateMacOSSurfaceMVK :: #type proc "system" (instance: Instance, pCreateInfo: ^MacOSSurfaceCreateInfoMVK, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcCreateMetalSurfaceEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^MetalSurfaceCreateInfoEXT, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcCreateWin32SurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^Win32SurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcDebugReportMessageEXT :: #type proc "system" (instance: Instance, flags: DebugReportFlagsEXT, objectType: DebugReportObjectTypeEXT, object: u64, location: int, messageCode: i32, pLayerPrefix: cstring, pMessage: cstring) +ProcDestroyDebugReportCallbackEXT :: #type proc "system" (instance: Instance, callback: DebugReportCallbackEXT, pAllocator: ^AllocationCallbacks) +ProcDestroyDebugUtilsMessengerEXT :: #type proc "system" (instance: Instance, messenger: DebugUtilsMessengerEXT, pAllocator: ^AllocationCallbacks) +ProcDestroyInstance :: #type proc "system" (instance: Instance, pAllocator: ^AllocationCallbacks) +ProcDestroySurfaceKHR :: #type proc "system" (instance: Instance, surface: SurfaceKHR, pAllocator: ^AllocationCallbacks) +ProcEnumerateDeviceExtensionProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pLayerName: cstring, pPropertyCount: ^u32, pProperties: [^]ExtensionProperties) -> Result +ProcEnumerateDeviceLayerProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]LayerProperties) -> Result +ProcEnumeratePhysicalDeviceGroups :: #type proc "system" (instance: Instance, pPhysicalDeviceGroupCount: ^u32, pPhysicalDeviceGroupProperties: [^]PhysicalDeviceGroupProperties) -> Result +ProcEnumeratePhysicalDeviceGroupsKHR :: #type proc "system" (instance: Instance, pPhysicalDeviceGroupCount: ^u32, pPhysicalDeviceGroupProperties: [^]PhysicalDeviceGroupProperties) -> Result +ProcEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, pCounterCount: ^u32, pCounters: [^]PerformanceCounterKHR, pCounterDescriptions: [^]PerformanceCounterDescriptionKHR) -> Result +ProcEnumeratePhysicalDevices :: #type proc "system" (instance: Instance, pPhysicalDeviceCount: ^u32, pPhysicalDevices: [^]PhysicalDevice) -> Result +ProcGetDisplayModeProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR, pPropertyCount: ^u32, pProperties: [^]DisplayModeProperties2KHR) -> Result +ProcGetDisplayModePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR, pPropertyCount: ^u32, pProperties: [^]DisplayModePropertiesKHR) -> Result +ProcGetDisplayPlaneCapabilities2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pDisplayPlaneInfo: ^DisplayPlaneInfo2KHR, pCapabilities: [^]DisplayPlaneCapabilities2KHR) -> Result +ProcGetDisplayPlaneCapabilitiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, mode: DisplayModeKHR, planeIndex: u32, pCapabilities: [^]DisplayPlaneCapabilitiesKHR) -> Result +ProcGetDisplayPlaneSupportedDisplaysKHR :: #type proc "system" (physicalDevice: PhysicalDevice, planeIndex: u32, pDisplayCount: ^u32, pDisplays: [^]DisplayKHR) -> Result +ProcGetDrmDisplayEXT :: #type proc "system" (physicalDevice: PhysicalDevice, drmFd: i32, connectorId: u32, display: ^DisplayKHR) -> Result +ProcGetInstanceProcAddr :: #type proc "system" (instance: Instance, pName: cstring) -> ProcVoidFunction +ProcGetPhysicalDeviceCalibrateableTimeDomainsEXT :: #type proc "system" (physicalDevice: PhysicalDevice, pTimeDomainCount: ^u32, pTimeDomains: [^]TimeDomainEXT) -> Result +ProcGetPhysicalDeviceCooperativeMatrixPropertiesNV :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]CooperativeMatrixPropertiesNV) -> Result +ProcGetPhysicalDeviceDisplayPlaneProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayPlaneProperties2KHR) -> Result +ProcGetPhysicalDeviceDisplayPlanePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayPlanePropertiesKHR) -> Result +ProcGetPhysicalDeviceDisplayProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayProperties2KHR) -> Result +ProcGetPhysicalDeviceDisplayPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayPropertiesKHR) -> Result +ProcGetPhysicalDeviceExternalBufferProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalBufferInfo: ^PhysicalDeviceExternalBufferInfo, pExternalBufferProperties: [^]ExternalBufferProperties) +ProcGetPhysicalDeviceExternalBufferPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalBufferInfo: ^PhysicalDeviceExternalBufferInfo, pExternalBufferProperties: [^]ExternalBufferProperties) +ProcGetPhysicalDeviceExternalFenceProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalFenceInfo: ^PhysicalDeviceExternalFenceInfo, pExternalFenceProperties: [^]ExternalFenceProperties) +ProcGetPhysicalDeviceExternalFencePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalFenceInfo: ^PhysicalDeviceExternalFenceInfo, pExternalFenceProperties: [^]ExternalFenceProperties) +ProcGetPhysicalDeviceExternalImageFormatPropertiesNV :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, type: ImageType, tiling: ImageTiling, usage: ImageUsageFlags, flags: ImageCreateFlags, externalHandleType: ExternalMemoryHandleTypeFlagsNV, pExternalImageFormatProperties: [^]ExternalImageFormatPropertiesNV) -> Result +ProcGetPhysicalDeviceExternalSemaphoreProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalSemaphoreInfo: ^PhysicalDeviceExternalSemaphoreInfo, pExternalSemaphoreProperties: [^]ExternalSemaphoreProperties) +ProcGetPhysicalDeviceExternalSemaphorePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalSemaphoreInfo: ^PhysicalDeviceExternalSemaphoreInfo, pExternalSemaphoreProperties: [^]ExternalSemaphoreProperties) +ProcGetPhysicalDeviceFeatures :: #type proc "system" (physicalDevice: PhysicalDevice, pFeatures: [^]PhysicalDeviceFeatures) +ProcGetPhysicalDeviceFeatures2 :: #type proc "system" (physicalDevice: PhysicalDevice, pFeatures: [^]PhysicalDeviceFeatures2) +ProcGetPhysicalDeviceFeatures2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pFeatures: [^]PhysicalDeviceFeatures2) +ProcGetPhysicalDeviceFormatProperties :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, pFormatProperties: [^]FormatProperties) +ProcGetPhysicalDeviceFormatProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, pFormatProperties: [^]FormatProperties2) +ProcGetPhysicalDeviceFormatProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, pFormatProperties: [^]FormatProperties2) +ProcGetPhysicalDeviceFragmentShadingRatesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pFragmentShadingRateCount: ^u32, pFragmentShadingRates: [^]PhysicalDeviceFragmentShadingRateKHR) -> Result +ProcGetPhysicalDeviceImageFormatProperties :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, type: ImageType, tiling: ImageTiling, usage: ImageUsageFlags, flags: ImageCreateFlags, pImageFormatProperties: [^]ImageFormatProperties) -> Result +ProcGetPhysicalDeviceImageFormatProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pImageFormatInfo: ^PhysicalDeviceImageFormatInfo2, pImageFormatProperties: [^]ImageFormatProperties2) -> Result +ProcGetPhysicalDeviceImageFormatProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pImageFormatInfo: ^PhysicalDeviceImageFormatInfo2, pImageFormatProperties: [^]ImageFormatProperties2) -> Result +ProcGetPhysicalDeviceMemoryProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pMemoryProperties: [^]PhysicalDeviceMemoryProperties) +ProcGetPhysicalDeviceMemoryProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pMemoryProperties: [^]PhysicalDeviceMemoryProperties2) +ProcGetPhysicalDeviceMemoryProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pMemoryProperties: [^]PhysicalDeviceMemoryProperties2) +ProcGetPhysicalDeviceMultisamplePropertiesEXT :: #type proc "system" (physicalDevice: PhysicalDevice, samples: SampleCountFlags, pMultisampleProperties: [^]MultisamplePropertiesEXT) +ProcGetPhysicalDevicePresentRectanglesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pRectCount: ^u32, pRects: [^]Rect2D) -> Result +ProcGetPhysicalDeviceProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pProperties: [^]PhysicalDeviceProperties) +ProcGetPhysicalDeviceProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pProperties: [^]PhysicalDeviceProperties2) +ProcGetPhysicalDeviceProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pProperties: [^]PhysicalDeviceProperties2) +ProcGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPerformanceQueryCreateInfo: ^QueryPoolPerformanceCreateInfoKHR, pNumPasses: [^]u32) +ProcGetPhysicalDeviceQueueFamilyProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pQueueFamilyPropertyCount: ^u32, pQueueFamilyProperties: [^]QueueFamilyProperties) +ProcGetPhysicalDeviceQueueFamilyProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pQueueFamilyPropertyCount: ^u32, pQueueFamilyProperties: [^]QueueFamilyProperties2) +ProcGetPhysicalDeviceQueueFamilyProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pQueueFamilyPropertyCount: ^u32, pQueueFamilyProperties: [^]QueueFamilyProperties2) +ProcGetPhysicalDeviceSparseImageFormatProperties :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, type: ImageType, samples: SampleCountFlags, usage: ImageUsageFlags, tiling: ImageTiling, pPropertyCount: ^u32, pProperties: [^]SparseImageFormatProperties) +ProcGetPhysicalDeviceSparseImageFormatProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pFormatInfo: ^PhysicalDeviceSparseImageFormatInfo2, pPropertyCount: ^u32, pProperties: [^]SparseImageFormatProperties2) +ProcGetPhysicalDeviceSparseImageFormatProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pFormatInfo: ^PhysicalDeviceSparseImageFormatInfo2, pPropertyCount: ^u32, pProperties: [^]SparseImageFormatProperties2) +ProcGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV :: #type proc "system" (physicalDevice: PhysicalDevice, pCombinationCount: ^u32, pCombinations: [^]FramebufferMixedSamplesCombinationNV) -> Result +ProcGetPhysicalDeviceSurfaceCapabilities2EXT :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pSurfaceCapabilities: [^]SurfaceCapabilities2EXT) -> Result +ProcGetPhysicalDeviceSurfaceCapabilities2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pSurfaceCapabilities: [^]SurfaceCapabilities2KHR) -> Result +ProcGetPhysicalDeviceSurfaceCapabilitiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pSurfaceCapabilities: [^]SurfaceCapabilitiesKHR) -> Result +ProcGetPhysicalDeviceSurfaceFormats2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pSurfaceFormatCount: ^u32, pSurfaceFormats: [^]SurfaceFormat2KHR) -> Result +ProcGetPhysicalDeviceSurfaceFormatsKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pSurfaceFormatCount: ^u32, pSurfaceFormats: [^]SurfaceFormatKHR) -> Result +ProcGetPhysicalDeviceSurfacePresentModes2EXT :: #type proc "system" (physicalDevice: PhysicalDevice, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pPresentModeCount: ^u32, pPresentModes: [^]PresentModeKHR) -> Result +ProcGetPhysicalDeviceSurfacePresentModesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pPresentModeCount: ^u32, pPresentModes: [^]PresentModeKHR) -> Result +ProcGetPhysicalDeviceSurfaceSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, surface: SurfaceKHR, pSupported: ^b32) -> Result +ProcGetPhysicalDeviceToolPropertiesEXT :: #type proc "system" (physicalDevice: PhysicalDevice, pToolCount: ^u32, pToolProperties: [^]PhysicalDeviceToolPropertiesEXT) -> Result +ProcGetPhysicalDeviceWin32PresentationSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32) -> b32 +ProcGetWinrtDisplayNV :: #type proc "system" (physicalDevice: PhysicalDevice, deviceRelativeId: u32, pDisplay: ^DisplayKHR) -> Result +ProcReleaseDisplayEXT :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR) -> Result +ProcSubmitDebugUtilsMessageEXT :: #type proc "system" (instance: Instance, messageSeverity: DebugUtilsMessageSeverityFlagsEXT, messageTypes: DebugUtilsMessageTypeFlagsEXT, pCallbackData: ^DebugUtilsMessengerCallbackDataEXT) -// Instance Procedures -DestroyInstance: ProcDestroyInstance -EnumeratePhysicalDevices: ProcEnumeratePhysicalDevices -GetPhysicalDeviceFeatures: ProcGetPhysicalDeviceFeatures -GetPhysicalDeviceFormatProperties: ProcGetPhysicalDeviceFormatProperties -GetPhysicalDeviceImageFormatProperties: ProcGetPhysicalDeviceImageFormatProperties -GetPhysicalDeviceProperties: ProcGetPhysicalDeviceProperties -GetPhysicalDeviceQueueFamilyProperties: ProcGetPhysicalDeviceQueueFamilyProperties -GetPhysicalDeviceMemoryProperties: ProcGetPhysicalDeviceMemoryProperties -GetInstanceProcAddr: ProcGetInstanceProcAddr -CreateDevice: ProcCreateDevice -EnumerateDeviceExtensionProperties: ProcEnumerateDeviceExtensionProperties -EnumerateDeviceLayerProperties: ProcEnumerateDeviceLayerProperties -GetPhysicalDeviceSparseImageFormatProperties: ProcGetPhysicalDeviceSparseImageFormatProperties -EnumeratePhysicalDeviceGroups: ProcEnumeratePhysicalDeviceGroups -GetPhysicalDeviceFeatures2: ProcGetPhysicalDeviceFeatures2 -GetPhysicalDeviceProperties2: ProcGetPhysicalDeviceProperties2 -GetPhysicalDeviceFormatProperties2: ProcGetPhysicalDeviceFormatProperties2 -GetPhysicalDeviceImageFormatProperties2: ProcGetPhysicalDeviceImageFormatProperties2 -GetPhysicalDeviceQueueFamilyProperties2: ProcGetPhysicalDeviceQueueFamilyProperties2 -GetPhysicalDeviceMemoryProperties2: ProcGetPhysicalDeviceMemoryProperties2 -GetPhysicalDeviceSparseImageFormatProperties2: ProcGetPhysicalDeviceSparseImageFormatProperties2 -GetPhysicalDeviceExternalBufferProperties: ProcGetPhysicalDeviceExternalBufferProperties -GetPhysicalDeviceExternalFenceProperties: ProcGetPhysicalDeviceExternalFenceProperties -GetPhysicalDeviceExternalSemaphoreProperties: ProcGetPhysicalDeviceExternalSemaphoreProperties -DestroySurfaceKHR: ProcDestroySurfaceKHR -GetPhysicalDeviceSurfaceSupportKHR: ProcGetPhysicalDeviceSurfaceSupportKHR -GetPhysicalDeviceSurfaceCapabilitiesKHR: ProcGetPhysicalDeviceSurfaceCapabilitiesKHR -GetPhysicalDeviceSurfaceFormatsKHR: ProcGetPhysicalDeviceSurfaceFormatsKHR -GetPhysicalDeviceSurfacePresentModesKHR: ProcGetPhysicalDeviceSurfacePresentModesKHR -GetPhysicalDevicePresentRectanglesKHR: ProcGetPhysicalDevicePresentRectanglesKHR -GetPhysicalDeviceDisplayPropertiesKHR: ProcGetPhysicalDeviceDisplayPropertiesKHR -GetPhysicalDeviceDisplayPlanePropertiesKHR: ProcGetPhysicalDeviceDisplayPlanePropertiesKHR -GetDisplayPlaneSupportedDisplaysKHR: ProcGetDisplayPlaneSupportedDisplaysKHR -GetDisplayModePropertiesKHR: ProcGetDisplayModePropertiesKHR -CreateDisplayModeKHR: ProcCreateDisplayModeKHR -GetDisplayPlaneCapabilitiesKHR: ProcGetDisplayPlaneCapabilitiesKHR -CreateDisplayPlaneSurfaceKHR: ProcCreateDisplayPlaneSurfaceKHR -GetPhysicalDeviceFeatures2KHR: ProcGetPhysicalDeviceFeatures2KHR -GetPhysicalDeviceProperties2KHR: ProcGetPhysicalDeviceProperties2KHR -GetPhysicalDeviceFormatProperties2KHR: ProcGetPhysicalDeviceFormatProperties2KHR -GetPhysicalDeviceImageFormatProperties2KHR: ProcGetPhysicalDeviceImageFormatProperties2KHR -GetPhysicalDeviceQueueFamilyProperties2KHR: ProcGetPhysicalDeviceQueueFamilyProperties2KHR -GetPhysicalDeviceMemoryProperties2KHR: ProcGetPhysicalDeviceMemoryProperties2KHR -GetPhysicalDeviceSparseImageFormatProperties2KHR: ProcGetPhysicalDeviceSparseImageFormatProperties2KHR -EnumeratePhysicalDeviceGroupsKHR: ProcEnumeratePhysicalDeviceGroupsKHR -GetPhysicalDeviceExternalBufferPropertiesKHR: ProcGetPhysicalDeviceExternalBufferPropertiesKHR -GetPhysicalDeviceExternalSemaphorePropertiesKHR: ProcGetPhysicalDeviceExternalSemaphorePropertiesKHR -GetPhysicalDeviceExternalFencePropertiesKHR: ProcGetPhysicalDeviceExternalFencePropertiesKHR -EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR: ProcEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR -GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR: ProcGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR -GetPhysicalDeviceSurfaceCapabilities2KHR: ProcGetPhysicalDeviceSurfaceCapabilities2KHR -GetPhysicalDeviceSurfaceFormats2KHR: ProcGetPhysicalDeviceSurfaceFormats2KHR -GetPhysicalDeviceDisplayProperties2KHR: ProcGetPhysicalDeviceDisplayProperties2KHR -GetPhysicalDeviceDisplayPlaneProperties2KHR: ProcGetPhysicalDeviceDisplayPlaneProperties2KHR -GetDisplayModeProperties2KHR: ProcGetDisplayModeProperties2KHR -GetDisplayPlaneCapabilities2KHR: ProcGetDisplayPlaneCapabilities2KHR -GetPhysicalDeviceFragmentShadingRatesKHR: ProcGetPhysicalDeviceFragmentShadingRatesKHR -CreateDebugReportCallbackEXT: ProcCreateDebugReportCallbackEXT -DestroyDebugReportCallbackEXT: ProcDestroyDebugReportCallbackEXT -DebugReportMessageEXT: ProcDebugReportMessageEXT -GetPhysicalDeviceExternalImageFormatPropertiesNV: ProcGetPhysicalDeviceExternalImageFormatPropertiesNV -ReleaseDisplayEXT: ProcReleaseDisplayEXT -GetPhysicalDeviceSurfaceCapabilities2EXT: ProcGetPhysicalDeviceSurfaceCapabilities2EXT -CreateDebugUtilsMessengerEXT: ProcCreateDebugUtilsMessengerEXT -DestroyDebugUtilsMessengerEXT: ProcDestroyDebugUtilsMessengerEXT -SubmitDebugUtilsMessageEXT: ProcSubmitDebugUtilsMessageEXT -GetPhysicalDeviceMultisamplePropertiesEXT: ProcGetPhysicalDeviceMultisamplePropertiesEXT -GetPhysicalDeviceCalibrateableTimeDomainsEXT: ProcGetPhysicalDeviceCalibrateableTimeDomainsEXT -GetPhysicalDeviceToolPropertiesEXT: ProcGetPhysicalDeviceToolPropertiesEXT -GetPhysicalDeviceCooperativeMatrixPropertiesNV: ProcGetPhysicalDeviceCooperativeMatrixPropertiesNV -GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV: ProcGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV -CreateHeadlessSurfaceEXT: ProcCreateHeadlessSurfaceEXT -AcquireDrmDisplayEXT: ProcAcquireDrmDisplayEXT -GetDrmDisplayEXT: ProcGetDrmDisplayEXT -AcquireWinrtDisplayNV: ProcAcquireWinrtDisplayNV -GetWinrtDisplayNV: ProcGetWinrtDisplayNV -CreateWin32SurfaceKHR: ProcCreateWin32SurfaceKHR -GetPhysicalDeviceWin32PresentationSupportKHR: ProcGetPhysicalDeviceWin32PresentationSupportKHR -GetPhysicalDeviceSurfacePresentModes2EXT: ProcGetPhysicalDeviceSurfacePresentModes2EXT -CreateMetalSurfaceEXT: ProcCreateMetalSurfaceEXT -CreateMacOSSurfaceMVK: ProcCreateMacOSSurfaceMVK -CreateIOSSurfaceMVK: ProcCreateIOSSurfaceMVK +// Device Procedure Types +ProcAcquireFullScreenExclusiveModeEXT :: #type proc "system" (device: Device, swapchain: SwapchainKHR) -> Result +ProcAcquireNextImage2KHR :: #type proc "system" (device: Device, pAcquireInfo: ^AcquireNextImageInfoKHR, pImageIndex: ^u32) -> Result +ProcAcquireNextImageKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR, timeout: u64, semaphore: Semaphore, fence: Fence, pImageIndex: ^u32) -> Result +ProcAcquirePerformanceConfigurationINTEL :: #type proc "system" (device: Device, pAcquireInfo: ^PerformanceConfigurationAcquireInfoINTEL, pConfiguration: ^PerformanceConfigurationINTEL) -> Result +ProcAcquireProfilingLockKHR :: #type proc "system" (device: Device, pInfo: ^AcquireProfilingLockInfoKHR) -> Result +ProcAllocateCommandBuffers :: #type proc "system" (device: Device, pAllocateInfo: ^CommandBufferAllocateInfo, pCommandBuffers: [^]CommandBuffer) -> Result +ProcAllocateDescriptorSets :: #type proc "system" (device: Device, pAllocateInfo: ^DescriptorSetAllocateInfo, pDescriptorSets: [^]DescriptorSet) -> Result +ProcAllocateMemory :: #type proc "system" (device: Device, pAllocateInfo: ^MemoryAllocateInfo, pAllocator: ^AllocationCallbacks, pMemory: ^DeviceMemory) -> Result +ProcBeginCommandBuffer :: #type proc "system" (commandBuffer: CommandBuffer, pBeginInfo: ^CommandBufferBeginInfo) -> Result +ProcBindAccelerationStructureMemoryNV :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindAccelerationStructureMemoryInfoNV) -> Result +ProcBindBufferMemory :: #type proc "system" (device: Device, buffer: Buffer, memory: DeviceMemory, memoryOffset: DeviceSize) -> Result +ProcBindBufferMemory2 :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindBufferMemoryInfo) -> Result +ProcBindBufferMemory2KHR :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindBufferMemoryInfo) -> Result +ProcBindImageMemory :: #type proc "system" (device: Device, image: Image, memory: DeviceMemory, memoryOffset: DeviceSize) -> Result +ProcBindImageMemory2 :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindImageMemoryInfo) -> Result +ProcBindImageMemory2KHR :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindImageMemoryInfo) -> Result +ProcBuildAccelerationStructuresKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, infoCount: u32, pInfos: [^]AccelerationStructureBuildGeometryInfoKHR, ppBuildRangeInfos: ^[^]AccelerationStructureBuildRangeInfoKHR) -> Result +ProcCmdBeginConditionalRenderingEXT :: #type proc "system" (commandBuffer: CommandBuffer, pConditionalRenderingBegin: ^ConditionalRenderingBeginInfoEXT) +ProcCmdBeginDebugUtilsLabelEXT :: #type proc "system" (commandBuffer: CommandBuffer, pLabelInfo: ^DebugUtilsLabelEXT) +ProcCmdBeginQuery :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, query: u32, flags: QueryControlFlags) +ProcCmdBeginQueryIndexedEXT :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, query: u32, flags: QueryControlFlags, index: u32) +ProcCmdBeginRenderPass :: #type proc "system" (commandBuffer: CommandBuffer, pRenderPassBegin: ^RenderPassBeginInfo, contents: SubpassContents) +ProcCmdBeginRenderPass2 :: #type proc "system" (commandBuffer: CommandBuffer, pRenderPassBegin: ^RenderPassBeginInfo, pSubpassBeginInfo: ^SubpassBeginInfo) +ProcCmdBeginRenderPass2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pRenderPassBegin: ^RenderPassBeginInfo, pSubpassBeginInfo: ^SubpassBeginInfo) +ProcCmdBeginTransformFeedbackEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstCounterBuffer: u32, counterBufferCount: u32, pCounterBuffers: [^]Buffer, pCounterBufferOffsets: [^]DeviceSize) +ProcCmdBindDescriptorSets :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, layout: PipelineLayout, firstSet: u32, descriptorSetCount: u32, pDescriptorSets: [^]DescriptorSet, dynamicOffsetCount: u32, pDynamicOffsets: [^]u32) +ProcCmdBindIndexBuffer :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, indexType: IndexType) +ProcCmdBindInvocationMaskHUAWEI :: #type proc "system" (commandBuffer: CommandBuffer, imageView: ImageView, imageLayout: ImageLayout) +ProcCmdBindPipeline :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, pipeline: Pipeline) +ProcCmdBindPipelineShaderGroupNV :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, pipeline: Pipeline, groupIndex: u32) +ProcCmdBindShadingRateImageNV :: #type proc "system" (commandBuffer: CommandBuffer, imageView: ImageView, imageLayout: ImageLayout) +ProcCmdBindTransformFeedbackBuffersEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstBinding: u32, bindingCount: u32, pBuffers: [^]Buffer, pOffsets: [^]DeviceSize, pSizes: [^]DeviceSize) +ProcCmdBindVertexBuffers :: #type proc "system" (commandBuffer: CommandBuffer, firstBinding: u32, bindingCount: u32, pBuffers: [^]Buffer, pOffsets: [^]DeviceSize) +ProcCmdBindVertexBuffers2EXT :: #type proc "system" (commandBuffer: CommandBuffer, firstBinding: u32, bindingCount: u32, pBuffers: [^]Buffer, pOffsets: [^]DeviceSize, pSizes: [^]DeviceSize, pStrides: [^]DeviceSize) +ProcCmdBlitImage :: #type proc "system" (commandBuffer: CommandBuffer, srcImage: Image, srcImageLayout: ImageLayout, dstImage: Image, dstImageLayout: ImageLayout, regionCount: u32, pRegions: [^]ImageBlit, filter: Filter) +ProcCmdBlitImage2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pBlitImageInfo: ^BlitImageInfo2KHR) +ProcCmdBuildAccelerationStructureNV :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^AccelerationStructureInfoNV, instanceData: Buffer, instanceOffset: DeviceSize, update: b32, dst: AccelerationStructureNV, src: AccelerationStructureNV, scratch: Buffer, scratchOffset: DeviceSize) +ProcCmdBuildAccelerationStructuresIndirectKHR :: #type proc "system" (commandBuffer: CommandBuffer, infoCount: u32, pInfos: [^]AccelerationStructureBuildGeometryInfoKHR, pIndirectDeviceAddresses: [^]DeviceAddress, pIndirectStrides: [^]u32, ppMaxPrimitiveCounts: ^[^]u32) +ProcCmdBuildAccelerationStructuresKHR :: #type proc "system" (commandBuffer: CommandBuffer, infoCount: u32, pInfos: [^]AccelerationStructureBuildGeometryInfoKHR, ppBuildRangeInfos: ^[^]AccelerationStructureBuildRangeInfoKHR) +ProcCmdClearAttachments :: #type proc "system" (commandBuffer: CommandBuffer, attachmentCount: u32, pAttachments: [^]ClearAttachment, rectCount: u32, pRects: [^]ClearRect) +ProcCmdClearColorImage :: #type proc "system" (commandBuffer: CommandBuffer, image: Image, imageLayout: ImageLayout, pColor: ^ClearColorValue, rangeCount: u32, pRanges: [^]ImageSubresourceRange) +ProcCmdClearDepthStencilImage :: #type proc "system" (commandBuffer: CommandBuffer, image: Image, imageLayout: ImageLayout, pDepthStencil: ^ClearDepthStencilValue, rangeCount: u32, pRanges: [^]ImageSubresourceRange) +ProcCmdCopyAccelerationStructureKHR :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^CopyAccelerationStructureInfoKHR) +ProcCmdCopyAccelerationStructureNV :: #type proc "system" (commandBuffer: CommandBuffer, dst: AccelerationStructureNV, src: AccelerationStructureNV, mode: CopyAccelerationStructureModeKHR) +ProcCmdCopyAccelerationStructureToMemoryKHR :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^CopyAccelerationStructureToMemoryInfoKHR) +ProcCmdCopyBuffer :: #type proc "system" (commandBuffer: CommandBuffer, srcBuffer: Buffer, dstBuffer: Buffer, regionCount: u32, pRegions: [^]BufferCopy) +ProcCmdCopyBuffer2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyBufferInfo: ^CopyBufferInfo2KHR) +ProcCmdCopyBufferToImage :: #type proc "system" (commandBuffer: CommandBuffer, srcBuffer: Buffer, dstImage: Image, dstImageLayout: ImageLayout, regionCount: u32, pRegions: [^]BufferImageCopy) +ProcCmdCopyBufferToImage2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyBufferToImageInfo: ^CopyBufferToImageInfo2KHR) +ProcCmdCopyImage :: #type proc "system" (commandBuffer: CommandBuffer, srcImage: Image, srcImageLayout: ImageLayout, dstImage: Image, dstImageLayout: ImageLayout, regionCount: u32, pRegions: [^]ImageCopy) +ProcCmdCopyImage2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyImageInfo: ^CopyImageInfo2KHR) +ProcCmdCopyImageToBuffer :: #type proc "system" (commandBuffer: CommandBuffer, srcImage: Image, srcImageLayout: ImageLayout, dstBuffer: Buffer, regionCount: u32, pRegions: [^]BufferImageCopy) +ProcCmdCopyImageToBuffer2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyImageToBufferInfo: ^CopyImageToBufferInfo2KHR) +ProcCmdCopyMemoryToAccelerationStructureKHR :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^CopyMemoryToAccelerationStructureInfoKHR) +ProcCmdCopyQueryPoolResults :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, firstQuery: u32, queryCount: u32, dstBuffer: Buffer, dstOffset: DeviceSize, stride: DeviceSize, flags: QueryResultFlags) +ProcCmdCuLaunchKernelNVX :: #type proc "system" (commandBuffer: CommandBuffer, pLaunchInfo: ^CuLaunchInfoNVX) +ProcCmdDebugMarkerBeginEXT :: #type proc "system" (commandBuffer: CommandBuffer, pMarkerInfo: ^DebugMarkerMarkerInfoEXT) +ProcCmdDebugMarkerEndEXT :: #type proc "system" (commandBuffer: CommandBuffer) +ProcCmdDebugMarkerInsertEXT :: #type proc "system" (commandBuffer: CommandBuffer, pMarkerInfo: ^DebugMarkerMarkerInfoEXT) +ProcCmdDispatch :: #type proc "system" (commandBuffer: CommandBuffer, groupCountX: u32, groupCountY: u32, groupCountZ: u32) +ProcCmdDispatchBase :: #type proc "system" (commandBuffer: CommandBuffer, baseGroupX: u32, baseGroupY: u32, baseGroupZ: u32, groupCountX: u32, groupCountY: u32, groupCountZ: u32) +ProcCmdDispatchBaseKHR :: #type proc "system" (commandBuffer: CommandBuffer, baseGroupX: u32, baseGroupY: u32, baseGroupZ: u32, groupCountX: u32, groupCountY: u32, groupCountZ: u32) +ProcCmdDispatchIndirect :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize) +ProcCmdDraw :: #type proc "system" (commandBuffer: CommandBuffer, vertexCount: u32, instanceCount: u32, firstVertex: u32, firstInstance: u32) +ProcCmdDrawIndexed :: #type proc "system" (commandBuffer: CommandBuffer, indexCount: u32, instanceCount: u32, firstIndex: u32, vertexOffset: i32, firstInstance: u32) +ProcCmdDrawIndexedIndirect :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, drawCount: u32, stride: u32) +ProcCmdDrawIndexedIndirectCount :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) +ProcCmdDrawIndexedIndirectCountAMD :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) +ProcCmdDrawIndexedIndirectCountKHR :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) +ProcCmdDrawIndirect :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, drawCount: u32, stride: u32) +ProcCmdDrawIndirectByteCountEXT :: #type proc "system" (commandBuffer: CommandBuffer, instanceCount: u32, firstInstance: u32, counterBuffer: Buffer, counterBufferOffset: DeviceSize, counterOffset: u32, vertexStride: u32) +ProcCmdDrawIndirectCount :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) +ProcCmdDrawIndirectCountAMD :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) +ProcCmdDrawIndirectCountKHR :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) +ProcCmdDrawMeshTasksIndirectCountNV :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) +ProcCmdDrawMeshTasksIndirectNV :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, drawCount: u32, stride: u32) +ProcCmdDrawMeshTasksNV :: #type proc "system" (commandBuffer: CommandBuffer, taskCount: u32, firstTask: u32) +ProcCmdDrawMultiEXT :: #type proc "system" (commandBuffer: CommandBuffer, drawCount: u32, pVertexInfo: ^MultiDrawInfoEXT, instanceCount: u32, firstInstance: u32, stride: u32) +ProcCmdDrawMultiIndexedEXT :: #type proc "system" (commandBuffer: CommandBuffer, drawCount: u32, pIndexInfo: ^MultiDrawIndexedInfoEXT, instanceCount: u32, firstInstance: u32, stride: u32, pVertexOffset: ^i32) +ProcCmdEndConditionalRenderingEXT :: #type proc "system" (commandBuffer: CommandBuffer) +ProcCmdEndDebugUtilsLabelEXT :: #type proc "system" (commandBuffer: CommandBuffer) +ProcCmdEndQuery :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, query: u32) +ProcCmdEndQueryIndexedEXT :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, query: u32, index: u32) +ProcCmdEndRenderPass :: #type proc "system" (commandBuffer: CommandBuffer) +ProcCmdEndRenderPass2 :: #type proc "system" (commandBuffer: CommandBuffer, pSubpassEndInfo: ^SubpassEndInfo) +ProcCmdEndRenderPass2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pSubpassEndInfo: ^SubpassEndInfo) +ProcCmdEndTransformFeedbackEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstCounterBuffer: u32, counterBufferCount: u32, pCounterBuffers: [^]Buffer, pCounterBufferOffsets: [^]DeviceSize) +ProcCmdExecuteCommands :: #type proc "system" (commandBuffer: CommandBuffer, commandBufferCount: u32, pCommandBuffers: [^]CommandBuffer) +ProcCmdExecuteGeneratedCommandsNV :: #type proc "system" (commandBuffer: CommandBuffer, isPreprocessed: b32, pGeneratedCommandsInfo: ^GeneratedCommandsInfoNV) +ProcCmdFillBuffer :: #type proc "system" (commandBuffer: CommandBuffer, dstBuffer: Buffer, dstOffset: DeviceSize, size: DeviceSize, data: u32) +ProcCmdInsertDebugUtilsLabelEXT :: #type proc "system" (commandBuffer: CommandBuffer, pLabelInfo: ^DebugUtilsLabelEXT) +ProcCmdNextSubpass :: #type proc "system" (commandBuffer: CommandBuffer, contents: SubpassContents) +ProcCmdNextSubpass2 :: #type proc "system" (commandBuffer: CommandBuffer, pSubpassBeginInfo: ^SubpassBeginInfo, pSubpassEndInfo: ^SubpassEndInfo) +ProcCmdNextSubpass2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pSubpassBeginInfo: ^SubpassBeginInfo, pSubpassEndInfo: ^SubpassEndInfo) +ProcCmdPipelineBarrier :: #type proc "system" (commandBuffer: CommandBuffer, srcStageMask: PipelineStageFlags, dstStageMask: PipelineStageFlags, dependencyFlags: DependencyFlags, memoryBarrierCount: u32, pMemoryBarriers: [^]MemoryBarrier, bufferMemoryBarrierCount: u32, pBufferMemoryBarriers: [^]BufferMemoryBarrier, imageMemoryBarrierCount: u32, pImageMemoryBarriers: [^]ImageMemoryBarrier) +ProcCmdPipelineBarrier2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pDependencyInfo: ^DependencyInfoKHR) +ProcCmdPreprocessGeneratedCommandsNV :: #type proc "system" (commandBuffer: CommandBuffer, pGeneratedCommandsInfo: ^GeneratedCommandsInfoNV) +ProcCmdPushConstants :: #type proc "system" (commandBuffer: CommandBuffer, layout: PipelineLayout, stageFlags: ShaderStageFlags, offset: u32, size: u32, pValues: rawptr) +ProcCmdPushDescriptorSetKHR :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, layout: PipelineLayout, set: u32, descriptorWriteCount: u32, pDescriptorWrites: [^]WriteDescriptorSet) +ProcCmdPushDescriptorSetWithTemplateKHR :: #type proc "system" (commandBuffer: CommandBuffer, descriptorUpdateTemplate: DescriptorUpdateTemplate, layout: PipelineLayout, set: u32, pData: rawptr) +ProcCmdResetEvent :: #type proc "system" (commandBuffer: CommandBuffer, event: Event, stageMask: PipelineStageFlags) +ProcCmdResetEvent2KHR :: #type proc "system" (commandBuffer: CommandBuffer, event: Event, stageMask: PipelineStageFlags2KHR) +ProcCmdResetQueryPool :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, firstQuery: u32, queryCount: u32) +ProcCmdResolveImage :: #type proc "system" (commandBuffer: CommandBuffer, srcImage: Image, srcImageLayout: ImageLayout, dstImage: Image, dstImageLayout: ImageLayout, regionCount: u32, pRegions: [^]ImageResolve) +ProcCmdResolveImage2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pResolveImageInfo: ^ResolveImageInfo2KHR) +ProcCmdSetBlendConstants :: #type proc "system" (commandBuffer: CommandBuffer) +ProcCmdSetCheckpointNV :: #type proc "system" (commandBuffer: CommandBuffer, pCheckpointMarker: rawptr) +ProcCmdSetCoarseSampleOrderNV :: #type proc "system" (commandBuffer: CommandBuffer, sampleOrderType: CoarseSampleOrderTypeNV, customSampleOrderCount: u32, pCustomSampleOrders: [^]CoarseSampleOrderCustomNV) +ProcCmdSetCullModeEXT :: #type proc "system" (commandBuffer: CommandBuffer, cullMode: CullModeFlags) +ProcCmdSetDepthBias :: #type proc "system" (commandBuffer: CommandBuffer, depthBiasConstantFactor: f32, depthBiasClamp: f32, depthBiasSlopeFactor: f32) +ProcCmdSetDepthBiasEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, depthBiasEnable: b32) +ProcCmdSetDepthBounds :: #type proc "system" (commandBuffer: CommandBuffer, minDepthBounds: f32, maxDepthBounds: f32) +ProcCmdSetDepthBoundsTestEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, depthBoundsTestEnable: b32) +ProcCmdSetDepthCompareOpEXT :: #type proc "system" (commandBuffer: CommandBuffer, depthCompareOp: CompareOp) +ProcCmdSetDepthTestEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, depthTestEnable: b32) +ProcCmdSetDepthWriteEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, depthWriteEnable: b32) +ProcCmdSetDeviceMask :: #type proc "system" (commandBuffer: CommandBuffer, deviceMask: u32) +ProcCmdSetDeviceMaskKHR :: #type proc "system" (commandBuffer: CommandBuffer, deviceMask: u32) +ProcCmdSetDiscardRectangleEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstDiscardRectangle: u32, discardRectangleCount: u32, pDiscardRectangles: [^]Rect2D) +ProcCmdSetEvent :: #type proc "system" (commandBuffer: CommandBuffer, event: Event, stageMask: PipelineStageFlags) +ProcCmdSetEvent2KHR :: #type proc "system" (commandBuffer: CommandBuffer, event: Event, pDependencyInfo: ^DependencyInfoKHR) +ProcCmdSetExclusiveScissorNV :: #type proc "system" (commandBuffer: CommandBuffer, firstExclusiveScissor: u32, exclusiveScissorCount: u32, pExclusiveScissors: [^]Rect2D) +ProcCmdSetFragmentShadingRateEnumNV :: #type proc "system" (commandBuffer: CommandBuffer, shadingRate: FragmentShadingRateNV) +ProcCmdSetFragmentShadingRateKHR :: #type proc "system" (commandBuffer: CommandBuffer, pFragmentSize: ^Extent2D) +ProcCmdSetFrontFaceEXT :: #type proc "system" (commandBuffer: CommandBuffer, frontFace: FrontFace) +ProcCmdSetLineStippleEXT :: #type proc "system" (commandBuffer: CommandBuffer, lineStippleFactor: u32, lineStipplePattern: u16) +ProcCmdSetLineWidth :: #type proc "system" (commandBuffer: CommandBuffer, lineWidth: f32) +ProcCmdSetLogicOpEXT :: #type proc "system" (commandBuffer: CommandBuffer, logicOp: LogicOp) +ProcCmdSetPatchControlPointsEXT :: #type proc "system" (commandBuffer: CommandBuffer, patchControlPoints: u32) +ProcCmdSetPerformanceMarkerINTEL :: #type proc "system" (commandBuffer: CommandBuffer, pMarkerInfo: ^PerformanceMarkerInfoINTEL) -> Result +ProcCmdSetPerformanceOverrideINTEL :: #type proc "system" (commandBuffer: CommandBuffer, pOverrideInfo: ^PerformanceOverrideInfoINTEL) -> Result +ProcCmdSetPerformanceStreamMarkerINTEL :: #type proc "system" (commandBuffer: CommandBuffer, pMarkerInfo: ^PerformanceStreamMarkerInfoINTEL) -> Result +ProcCmdSetPrimitiveRestartEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, primitiveRestartEnable: b32) +ProcCmdSetPrimitiveTopologyEXT :: #type proc "system" (commandBuffer: CommandBuffer, primitiveTopology: PrimitiveTopology) +ProcCmdSetRasterizerDiscardEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, rasterizerDiscardEnable: b32) +ProcCmdSetRayTracingPipelineStackSizeKHR :: #type proc "system" (commandBuffer: CommandBuffer, pipelineStackSize: u32) +ProcCmdSetSampleLocationsEXT :: #type proc "system" (commandBuffer: CommandBuffer, pSampleLocationsInfo: ^SampleLocationsInfoEXT) +ProcCmdSetScissor :: #type proc "system" (commandBuffer: CommandBuffer, firstScissor: u32, scissorCount: u32, pScissors: [^]Rect2D) +ProcCmdSetScissorWithCountEXT :: #type proc "system" (commandBuffer: CommandBuffer, scissorCount: u32, pScissors: [^]Rect2D) +ProcCmdSetStencilCompareMask :: #type proc "system" (commandBuffer: CommandBuffer, faceMask: StencilFaceFlags, compareMask: u32) +ProcCmdSetStencilOpEXT :: #type proc "system" (commandBuffer: CommandBuffer, faceMask: StencilFaceFlags, failOp: StencilOp, passOp: StencilOp, depthFailOp: StencilOp, compareOp: CompareOp) +ProcCmdSetStencilReference :: #type proc "system" (commandBuffer: CommandBuffer, faceMask: StencilFaceFlags, reference: u32) +ProcCmdSetStencilTestEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, stencilTestEnable: b32) +ProcCmdSetStencilWriteMask :: #type proc "system" (commandBuffer: CommandBuffer, faceMask: StencilFaceFlags, writeMask: u32) +ProcCmdSetVertexInputEXT :: #type proc "system" (commandBuffer: CommandBuffer, vertexBindingDescriptionCount: u32, pVertexBindingDescriptions: [^]VertexInputBindingDescription2EXT, vertexAttributeDescriptionCount: u32, pVertexAttributeDescriptions: [^]VertexInputAttributeDescription2EXT) +ProcCmdSetViewport :: #type proc "system" (commandBuffer: CommandBuffer, firstViewport: u32, viewportCount: u32, pViewports: [^]Viewport) +ProcCmdSetViewportShadingRatePaletteNV :: #type proc "system" (commandBuffer: CommandBuffer, firstViewport: u32, viewportCount: u32, pShadingRatePalettes: [^]ShadingRatePaletteNV) +ProcCmdSetViewportWScalingNV :: #type proc "system" (commandBuffer: CommandBuffer, firstViewport: u32, viewportCount: u32, pViewportWScalings: [^]ViewportWScalingNV) +ProcCmdSetViewportWithCountEXT :: #type proc "system" (commandBuffer: CommandBuffer, viewportCount: u32, pViewports: [^]Viewport) +ProcCmdSubpassShadingHUAWEI :: #type proc "system" (commandBuffer: CommandBuffer) +ProcCmdTraceRaysIndirectKHR :: #type proc "system" (commandBuffer: CommandBuffer, pRaygenShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pMissShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pHitShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pCallableShaderBindingTable: [^]StridedDeviceAddressRegionKHR, indirectDeviceAddress: DeviceAddress) +ProcCmdTraceRaysKHR :: #type proc "system" (commandBuffer: CommandBuffer, pRaygenShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pMissShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pHitShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pCallableShaderBindingTable: [^]StridedDeviceAddressRegionKHR, width: u32, height: u32, depth: u32) +ProcCmdTraceRaysNV :: #type proc "system" (commandBuffer: CommandBuffer, raygenShaderBindingTableBuffer: Buffer, raygenShaderBindingOffset: DeviceSize, missShaderBindingTableBuffer: Buffer, missShaderBindingOffset: DeviceSize, missShaderBindingStride: DeviceSize, hitShaderBindingTableBuffer: Buffer, hitShaderBindingOffset: DeviceSize, hitShaderBindingStride: DeviceSize, callableShaderBindingTableBuffer: Buffer, callableShaderBindingOffset: DeviceSize, callableShaderBindingStride: DeviceSize, width: u32, height: u32, depth: u32) +ProcCmdUpdateBuffer :: #type proc "system" (commandBuffer: CommandBuffer, dstBuffer: Buffer, dstOffset: DeviceSize, dataSize: DeviceSize, pData: rawptr) +ProcCmdWaitEvents :: #type proc "system" (commandBuffer: CommandBuffer, eventCount: u32, pEvents: [^]Event, srcStageMask: PipelineStageFlags, dstStageMask: PipelineStageFlags, memoryBarrierCount: u32, pMemoryBarriers: [^]MemoryBarrier, bufferMemoryBarrierCount: u32, pBufferMemoryBarriers: [^]BufferMemoryBarrier, imageMemoryBarrierCount: u32, pImageMemoryBarriers: [^]ImageMemoryBarrier) +ProcCmdWaitEvents2KHR :: #type proc "system" (commandBuffer: CommandBuffer, eventCount: u32, pEvents: [^]Event, pDependencyInfos: [^]DependencyInfoKHR) +ProcCmdWriteAccelerationStructuresPropertiesKHR :: #type proc "system" (commandBuffer: CommandBuffer, accelerationStructureCount: u32, pAccelerationStructures: [^]AccelerationStructureKHR, queryType: QueryType, queryPool: QueryPool, firstQuery: u32) +ProcCmdWriteAccelerationStructuresPropertiesNV :: #type proc "system" (commandBuffer: CommandBuffer, accelerationStructureCount: u32, pAccelerationStructures: [^]AccelerationStructureNV, queryType: QueryType, queryPool: QueryPool, firstQuery: u32) +ProcCmdWriteBufferMarker2AMD :: #type proc "system" (commandBuffer: CommandBuffer, stage: PipelineStageFlags2KHR, dstBuffer: Buffer, dstOffset: DeviceSize, marker: u32) +ProcCmdWriteBufferMarkerAMD :: #type proc "system" (commandBuffer: CommandBuffer, pipelineStage: PipelineStageFlags, dstBuffer: Buffer, dstOffset: DeviceSize, marker: u32) +ProcCmdWriteTimestamp :: #type proc "system" (commandBuffer: CommandBuffer, pipelineStage: PipelineStageFlags, queryPool: QueryPool, query: u32) +ProcCmdWriteTimestamp2KHR :: #type proc "system" (commandBuffer: CommandBuffer, stage: PipelineStageFlags2KHR, queryPool: QueryPool, query: u32) +ProcCompileDeferredNV :: #type proc "system" (device: Device, pipeline: Pipeline, shader: u32) -> Result +ProcCopyAccelerationStructureKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pInfo: ^CopyAccelerationStructureInfoKHR) -> Result +ProcCopyAccelerationStructureToMemoryKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pInfo: ^CopyAccelerationStructureToMemoryInfoKHR) -> Result +ProcCopyMemoryToAccelerationStructureKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pInfo: ^CopyMemoryToAccelerationStructureInfoKHR) -> Result +ProcCreateAccelerationStructureKHR :: #type proc "system" (device: Device, pCreateInfo: ^AccelerationStructureCreateInfoKHR, pAllocator: ^AllocationCallbacks, pAccelerationStructure: ^AccelerationStructureKHR) -> Result +ProcCreateAccelerationStructureNV :: #type proc "system" (device: Device, pCreateInfo: ^AccelerationStructureCreateInfoNV, pAllocator: ^AllocationCallbacks, pAccelerationStructure: ^AccelerationStructureNV) -> Result +ProcCreateBuffer :: #type proc "system" (device: Device, pCreateInfo: ^BufferCreateInfo, pAllocator: ^AllocationCallbacks, pBuffer: ^Buffer) -> Result +ProcCreateBufferView :: #type proc "system" (device: Device, pCreateInfo: ^BufferViewCreateInfo, pAllocator: ^AllocationCallbacks, pView: ^BufferView) -> Result +ProcCreateCommandPool :: #type proc "system" (device: Device, pCreateInfo: ^CommandPoolCreateInfo, pAllocator: ^AllocationCallbacks, pCommandPool: ^CommandPool) -> Result +ProcCreateComputePipelines :: #type proc "system" (device: Device, pipelineCache: PipelineCache, createInfoCount: u32, pCreateInfos: [^]ComputePipelineCreateInfo, pAllocator: ^AllocationCallbacks, pPipelines: [^]Pipeline) -> Result +ProcCreateCuFunctionNVX :: #type proc "system" (device: Device, pCreateInfo: ^CuFunctionCreateInfoNVX, pAllocator: ^AllocationCallbacks, pFunction: ^CuFunctionNVX) -> Result +ProcCreateCuModuleNVX :: #type proc "system" (device: Device, pCreateInfo: ^CuModuleCreateInfoNVX, pAllocator: ^AllocationCallbacks, pModule: ^CuModuleNVX) -> Result +ProcCreateDeferredOperationKHR :: #type proc "system" (device: Device, pAllocator: ^AllocationCallbacks, pDeferredOperation: ^DeferredOperationKHR) -> Result +ProcCreateDescriptorPool :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorPoolCreateInfo, pAllocator: ^AllocationCallbacks, pDescriptorPool: ^DescriptorPool) -> Result +ProcCreateDescriptorSetLayout :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorSetLayoutCreateInfo, pAllocator: ^AllocationCallbacks, pSetLayout: ^DescriptorSetLayout) -> Result +ProcCreateDescriptorUpdateTemplate :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorUpdateTemplateCreateInfo, pAllocator: ^AllocationCallbacks, pDescriptorUpdateTemplate: ^DescriptorUpdateTemplate) -> Result +ProcCreateDescriptorUpdateTemplateKHR :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorUpdateTemplateCreateInfo, pAllocator: ^AllocationCallbacks, pDescriptorUpdateTemplate: ^DescriptorUpdateTemplate) -> Result +ProcCreateEvent :: #type proc "system" (device: Device, pCreateInfo: ^EventCreateInfo, pAllocator: ^AllocationCallbacks, pEvent: ^Event) -> Result +ProcCreateFence :: #type proc "system" (device: Device, pCreateInfo: ^FenceCreateInfo, pAllocator: ^AllocationCallbacks, pFence: ^Fence) -> Result +ProcCreateFramebuffer :: #type proc "system" (device: Device, pCreateInfo: ^FramebufferCreateInfo, pAllocator: ^AllocationCallbacks, pFramebuffer: ^Framebuffer) -> Result +ProcCreateGraphicsPipelines :: #type proc "system" (device: Device, pipelineCache: PipelineCache, createInfoCount: u32, pCreateInfos: [^]GraphicsPipelineCreateInfo, pAllocator: ^AllocationCallbacks, pPipelines: [^]Pipeline) -> Result +ProcCreateImage :: #type proc "system" (device: Device, pCreateInfo: ^ImageCreateInfo, pAllocator: ^AllocationCallbacks, pImage: ^Image) -> Result +ProcCreateImageView :: #type proc "system" (device: Device, pCreateInfo: ^ImageViewCreateInfo, pAllocator: ^AllocationCallbacks, pView: ^ImageView) -> Result +ProcCreateIndirectCommandsLayoutNV :: #type proc "system" (device: Device, pCreateInfo: ^IndirectCommandsLayoutCreateInfoNV, pAllocator: ^AllocationCallbacks, pIndirectCommandsLayout: ^IndirectCommandsLayoutNV) -> Result +ProcCreatePipelineCache :: #type proc "system" (device: Device, pCreateInfo: ^PipelineCacheCreateInfo, pAllocator: ^AllocationCallbacks, pPipelineCache: ^PipelineCache) -> Result +ProcCreatePipelineLayout :: #type proc "system" (device: Device, pCreateInfo: ^PipelineLayoutCreateInfo, pAllocator: ^AllocationCallbacks, pPipelineLayout: ^PipelineLayout) -> Result +ProcCreatePrivateDataSlotEXT :: #type proc "system" (device: Device, pCreateInfo: ^PrivateDataSlotCreateInfoEXT, pAllocator: ^AllocationCallbacks, pPrivateDataSlot: ^PrivateDataSlotEXT) -> Result +ProcCreateQueryPool :: #type proc "system" (device: Device, pCreateInfo: ^QueryPoolCreateInfo, pAllocator: ^AllocationCallbacks, pQueryPool: ^QueryPool) -> Result +ProcCreateRayTracingPipelinesKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pipelineCache: PipelineCache, createInfoCount: u32, pCreateInfos: [^]RayTracingPipelineCreateInfoKHR, pAllocator: ^AllocationCallbacks, pPipelines: [^]Pipeline) -> Result +ProcCreateRayTracingPipelinesNV :: #type proc "system" (device: Device, pipelineCache: PipelineCache, createInfoCount: u32, pCreateInfos: [^]RayTracingPipelineCreateInfoNV, pAllocator: ^AllocationCallbacks, pPipelines: [^]Pipeline) -> Result +ProcCreateRenderPass :: #type proc "system" (device: Device, pCreateInfo: ^RenderPassCreateInfo, pAllocator: ^AllocationCallbacks, pRenderPass: [^]RenderPass) -> Result +ProcCreateRenderPass2 :: #type proc "system" (device: Device, pCreateInfo: ^RenderPassCreateInfo2, pAllocator: ^AllocationCallbacks, pRenderPass: [^]RenderPass) -> Result +ProcCreateRenderPass2KHR :: #type proc "system" (device: Device, pCreateInfo: ^RenderPassCreateInfo2, pAllocator: ^AllocationCallbacks, pRenderPass: [^]RenderPass) -> Result +ProcCreateSampler :: #type proc "system" (device: Device, pCreateInfo: ^SamplerCreateInfo, pAllocator: ^AllocationCallbacks, pSampler: ^Sampler) -> Result +ProcCreateSamplerYcbcrConversion :: #type proc "system" (device: Device, pCreateInfo: ^SamplerYcbcrConversionCreateInfo, pAllocator: ^AllocationCallbacks, pYcbcrConversion: ^SamplerYcbcrConversion) -> Result +ProcCreateSamplerYcbcrConversionKHR :: #type proc "system" (device: Device, pCreateInfo: ^SamplerYcbcrConversionCreateInfo, pAllocator: ^AllocationCallbacks, pYcbcrConversion: ^SamplerYcbcrConversion) -> Result +ProcCreateSemaphore :: #type proc "system" (device: Device, pCreateInfo: ^SemaphoreCreateInfo, pAllocator: ^AllocationCallbacks, pSemaphore: ^Semaphore) -> Result +ProcCreateShaderModule :: #type proc "system" (device: Device, pCreateInfo: ^ShaderModuleCreateInfo, pAllocator: ^AllocationCallbacks, pShaderModule: ^ShaderModule) -> Result +ProcCreateSharedSwapchainsKHR :: #type proc "system" (device: Device, swapchainCount: u32, pCreateInfos: [^]SwapchainCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSwapchains: [^]SwapchainKHR) -> Result +ProcCreateSwapchainKHR :: #type proc "system" (device: Device, pCreateInfo: ^SwapchainCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSwapchain: ^SwapchainKHR) -> Result +ProcCreateValidationCacheEXT :: #type proc "system" (device: Device, pCreateInfo: ^ValidationCacheCreateInfoEXT, pAllocator: ^AllocationCallbacks, pValidationCache: ^ValidationCacheEXT) -> Result +ProcDebugMarkerSetObjectNameEXT :: #type proc "system" (device: Device, pNameInfo: ^DebugMarkerObjectNameInfoEXT) -> Result +ProcDebugMarkerSetObjectTagEXT :: #type proc "system" (device: Device, pTagInfo: ^DebugMarkerObjectTagInfoEXT) -> Result +ProcDeferredOperationJoinKHR :: #type proc "system" (device: Device, operation: DeferredOperationKHR) -> Result +ProcDestroyAccelerationStructureKHR :: #type proc "system" (device: Device, accelerationStructure: AccelerationStructureKHR, pAllocator: ^AllocationCallbacks) +ProcDestroyAccelerationStructureNV :: #type proc "system" (device: Device, accelerationStructure: AccelerationStructureNV, pAllocator: ^AllocationCallbacks) +ProcDestroyBuffer :: #type proc "system" (device: Device, buffer: Buffer, pAllocator: ^AllocationCallbacks) +ProcDestroyBufferView :: #type proc "system" (device: Device, bufferView: BufferView, pAllocator: ^AllocationCallbacks) +ProcDestroyCommandPool :: #type proc "system" (device: Device, commandPool: CommandPool, pAllocator: ^AllocationCallbacks) +ProcDestroyCuFunctionNVX :: #type proc "system" (device: Device, function: CuFunctionNVX, pAllocator: ^AllocationCallbacks) +ProcDestroyCuModuleNVX :: #type proc "system" (device: Device, module: CuModuleNVX, pAllocator: ^AllocationCallbacks) +ProcDestroyDeferredOperationKHR :: #type proc "system" (device: Device, operation: DeferredOperationKHR, pAllocator: ^AllocationCallbacks) +ProcDestroyDescriptorPool :: #type proc "system" (device: Device, descriptorPool: DescriptorPool, pAllocator: ^AllocationCallbacks) +ProcDestroyDescriptorSetLayout :: #type proc "system" (device: Device, descriptorSetLayout: DescriptorSetLayout, pAllocator: ^AllocationCallbacks) +ProcDestroyDescriptorUpdateTemplate :: #type proc "system" (device: Device, descriptorUpdateTemplate: DescriptorUpdateTemplate, pAllocator: ^AllocationCallbacks) +ProcDestroyDescriptorUpdateTemplateKHR :: #type proc "system" (device: Device, descriptorUpdateTemplate: DescriptorUpdateTemplate, pAllocator: ^AllocationCallbacks) +ProcDestroyDevice :: #type proc "system" (device: Device, pAllocator: ^AllocationCallbacks) +ProcDestroyEvent :: #type proc "system" (device: Device, event: Event, pAllocator: ^AllocationCallbacks) +ProcDestroyFence :: #type proc "system" (device: Device, fence: Fence, pAllocator: ^AllocationCallbacks) +ProcDestroyFramebuffer :: #type proc "system" (device: Device, framebuffer: Framebuffer, pAllocator: ^AllocationCallbacks) +ProcDestroyImage :: #type proc "system" (device: Device, image: Image, pAllocator: ^AllocationCallbacks) +ProcDestroyImageView :: #type proc "system" (device: Device, imageView: ImageView, pAllocator: ^AllocationCallbacks) +ProcDestroyIndirectCommandsLayoutNV :: #type proc "system" (device: Device, indirectCommandsLayout: IndirectCommandsLayoutNV, pAllocator: ^AllocationCallbacks) +ProcDestroyPipeline :: #type proc "system" (device: Device, pipeline: Pipeline, pAllocator: ^AllocationCallbacks) +ProcDestroyPipelineCache :: #type proc "system" (device: Device, pipelineCache: PipelineCache, pAllocator: ^AllocationCallbacks) +ProcDestroyPipelineLayout :: #type proc "system" (device: Device, pipelineLayout: PipelineLayout, pAllocator: ^AllocationCallbacks) +ProcDestroyPrivateDataSlotEXT :: #type proc "system" (device: Device, privateDataSlot: PrivateDataSlotEXT, pAllocator: ^AllocationCallbacks) +ProcDestroyQueryPool :: #type proc "system" (device: Device, queryPool: QueryPool, pAllocator: ^AllocationCallbacks) +ProcDestroyRenderPass :: #type proc "system" (device: Device, renderPass: RenderPass, pAllocator: ^AllocationCallbacks) +ProcDestroySampler :: #type proc "system" (device: Device, sampler: Sampler, pAllocator: ^AllocationCallbacks) +ProcDestroySamplerYcbcrConversion :: #type proc "system" (device: Device, ycbcrConversion: SamplerYcbcrConversion, pAllocator: ^AllocationCallbacks) +ProcDestroySamplerYcbcrConversionKHR :: #type proc "system" (device: Device, ycbcrConversion: SamplerYcbcrConversion, pAllocator: ^AllocationCallbacks) +ProcDestroySemaphore :: #type proc "system" (device: Device, semaphore: Semaphore, pAllocator: ^AllocationCallbacks) +ProcDestroyShaderModule :: #type proc "system" (device: Device, shaderModule: ShaderModule, pAllocator: ^AllocationCallbacks) +ProcDestroySwapchainKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pAllocator: ^AllocationCallbacks) +ProcDestroyValidationCacheEXT :: #type proc "system" (device: Device, validationCache: ValidationCacheEXT, pAllocator: ^AllocationCallbacks) +ProcDeviceWaitIdle :: #type proc "system" (device: Device) -> Result +ProcDisplayPowerControlEXT :: #type proc "system" (device: Device, display: DisplayKHR, pDisplayPowerInfo: ^DisplayPowerInfoEXT) -> Result +ProcEndCommandBuffer :: #type proc "system" (commandBuffer: CommandBuffer) -> Result +ProcFlushMappedMemoryRanges :: #type proc "system" (device: Device, memoryRangeCount: u32, pMemoryRanges: [^]MappedMemoryRange) -> Result +ProcFreeCommandBuffers :: #type proc "system" (device: Device, commandPool: CommandPool, commandBufferCount: u32, pCommandBuffers: [^]CommandBuffer) +ProcFreeDescriptorSets :: #type proc "system" (device: Device, descriptorPool: DescriptorPool, descriptorSetCount: u32, pDescriptorSets: [^]DescriptorSet) -> Result +ProcFreeMemory :: #type proc "system" (device: Device, memory: DeviceMemory, pAllocator: ^AllocationCallbacks) +ProcGetAccelerationStructureBuildSizesKHR :: #type proc "system" (device: Device, buildType: AccelerationStructureBuildTypeKHR, pBuildInfo: ^AccelerationStructureBuildGeometryInfoKHR, pMaxPrimitiveCounts: [^]u32, pSizeInfo: ^AccelerationStructureBuildSizesInfoKHR) +ProcGetAccelerationStructureDeviceAddressKHR :: #type proc "system" (device: Device, pInfo: ^AccelerationStructureDeviceAddressInfoKHR) -> DeviceAddress +ProcGetAccelerationStructureHandleNV :: #type proc "system" (device: Device, accelerationStructure: AccelerationStructureNV, dataSize: int, pData: rawptr) -> Result +ProcGetAccelerationStructureMemoryRequirementsNV :: #type proc "system" (device: Device, pInfo: ^AccelerationStructureMemoryRequirementsInfoNV, pMemoryRequirements: [^]MemoryRequirements2KHR) +ProcGetBufferDeviceAddress :: #type proc "system" (device: Device, pInfo: ^BufferDeviceAddressInfo) -> DeviceAddress +ProcGetBufferDeviceAddressEXT :: #type proc "system" (device: Device, pInfo: ^BufferDeviceAddressInfo) -> DeviceAddress +ProcGetBufferDeviceAddressKHR :: #type proc "system" (device: Device, pInfo: ^BufferDeviceAddressInfo) -> DeviceAddress +ProcGetBufferMemoryRequirements :: #type proc "system" (device: Device, buffer: Buffer, pMemoryRequirements: [^]MemoryRequirements) +ProcGetBufferMemoryRequirements2 :: #type proc "system" (device: Device, pInfo: ^BufferMemoryRequirementsInfo2, pMemoryRequirements: [^]MemoryRequirements2) +ProcGetBufferMemoryRequirements2KHR :: #type proc "system" (device: Device, pInfo: ^BufferMemoryRequirementsInfo2, pMemoryRequirements: [^]MemoryRequirements2) +ProcGetBufferOpaqueCaptureAddress :: #type proc "system" (device: Device, pInfo: ^BufferDeviceAddressInfo) -> u64 +ProcGetBufferOpaqueCaptureAddressKHR :: #type proc "system" (device: Device, pInfo: ^BufferDeviceAddressInfo) -> u64 +ProcGetCalibratedTimestampsEXT :: #type proc "system" (device: Device, timestampCount: u32, pTimestampInfos: [^]CalibratedTimestampInfoEXT, pTimestamps: [^]u64, pMaxDeviation: ^u64) -> Result +ProcGetDeferredOperationMaxConcurrencyKHR :: #type proc "system" (device: Device, operation: DeferredOperationKHR) -> u32 +ProcGetDeferredOperationResultKHR :: #type proc "system" (device: Device, operation: DeferredOperationKHR) -> Result +ProcGetDescriptorSetLayoutSupport :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorSetLayoutCreateInfo, pSupport: ^DescriptorSetLayoutSupport) +ProcGetDescriptorSetLayoutSupportKHR :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorSetLayoutCreateInfo, pSupport: ^DescriptorSetLayoutSupport) +ProcGetDeviceAccelerationStructureCompatibilityKHR :: #type proc "system" (device: Device, pVersionInfo: ^AccelerationStructureVersionInfoKHR, pCompatibility: ^AccelerationStructureCompatibilityKHR) +ProcGetDeviceGroupPeerMemoryFeatures :: #type proc "system" (device: Device, heapIndex: u32, localDeviceIndex: u32, remoteDeviceIndex: u32, pPeerMemoryFeatures: [^]PeerMemoryFeatureFlags) +ProcGetDeviceGroupPeerMemoryFeaturesKHR :: #type proc "system" (device: Device, heapIndex: u32, localDeviceIndex: u32, remoteDeviceIndex: u32, pPeerMemoryFeatures: [^]PeerMemoryFeatureFlags) +ProcGetDeviceGroupPresentCapabilitiesKHR :: #type proc "system" (device: Device, pDeviceGroupPresentCapabilities: [^]DeviceGroupPresentCapabilitiesKHR) -> Result +ProcGetDeviceGroupSurfacePresentModes2EXT :: #type proc "system" (device: Device, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pModes: [^]DeviceGroupPresentModeFlagsKHR) -> Result +ProcGetDeviceGroupSurfacePresentModesKHR :: #type proc "system" (device: Device, surface: SurfaceKHR, pModes: [^]DeviceGroupPresentModeFlagsKHR) -> Result +ProcGetDeviceMemoryCommitment :: #type proc "system" (device: Device, memory: DeviceMemory, pCommittedMemoryInBytes: [^]DeviceSize) +ProcGetDeviceMemoryOpaqueCaptureAddress :: #type proc "system" (device: Device, pInfo: ^DeviceMemoryOpaqueCaptureAddressInfo) -> u64 +ProcGetDeviceMemoryOpaqueCaptureAddressKHR :: #type proc "system" (device: Device, pInfo: ^DeviceMemoryOpaqueCaptureAddressInfo) -> u64 +ProcGetDeviceProcAddr :: #type proc "system" (device: Device, pName: cstring) -> ProcVoidFunction +ProcGetDeviceQueue :: #type proc "system" (device: Device, queueFamilyIndex: u32, queueIndex: u32, pQueue: ^Queue) +ProcGetDeviceQueue2 :: #type proc "system" (device: Device, pQueueInfo: ^DeviceQueueInfo2, pQueue: ^Queue) +ProcGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI :: #type proc "system" (device: Device, renderpass: RenderPass, pMaxWorkgroupSize: ^Extent2D) -> Result +ProcGetEventStatus :: #type proc "system" (device: Device, event: Event) -> Result +ProcGetFenceFdKHR :: #type proc "system" (device: Device, pGetFdInfo: ^FenceGetFdInfoKHR, pFd: ^c.int) -> Result +ProcGetFenceStatus :: #type proc "system" (device: Device, fence: Fence) -> Result +ProcGetFenceWin32HandleKHR :: #type proc "system" (device: Device, pGetWin32HandleInfo: ^FenceGetWin32HandleInfoKHR, pHandle: ^HANDLE) -> Result +ProcGetGeneratedCommandsMemoryRequirementsNV :: #type proc "system" (device: Device, pInfo: ^GeneratedCommandsMemoryRequirementsInfoNV, pMemoryRequirements: [^]MemoryRequirements2) +ProcGetImageDrmFormatModifierPropertiesEXT :: #type proc "system" (device: Device, image: Image, pProperties: [^]ImageDrmFormatModifierPropertiesEXT) -> Result +ProcGetImageMemoryRequirements :: #type proc "system" (device: Device, image: Image, pMemoryRequirements: [^]MemoryRequirements) +ProcGetImageMemoryRequirements2 :: #type proc "system" (device: Device, pInfo: ^ImageMemoryRequirementsInfo2, pMemoryRequirements: [^]MemoryRequirements2) +ProcGetImageMemoryRequirements2KHR :: #type proc "system" (device: Device, pInfo: ^ImageMemoryRequirementsInfo2, pMemoryRequirements: [^]MemoryRequirements2) +ProcGetImageSparseMemoryRequirements :: #type proc "system" (device: Device, image: Image, pSparseMemoryRequirementCount: ^u32, pSparseMemoryRequirements: [^]SparseImageMemoryRequirements) +ProcGetImageSparseMemoryRequirements2 :: #type proc "system" (device: Device, pInfo: ^ImageSparseMemoryRequirementsInfo2, pSparseMemoryRequirementCount: ^u32, pSparseMemoryRequirements: [^]SparseImageMemoryRequirements2) +ProcGetImageSparseMemoryRequirements2KHR :: #type proc "system" (device: Device, pInfo: ^ImageSparseMemoryRequirementsInfo2, pSparseMemoryRequirementCount: ^u32, pSparseMemoryRequirements: [^]SparseImageMemoryRequirements2) +ProcGetImageSubresourceLayout :: #type proc "system" (device: Device, image: Image, pSubresource: ^ImageSubresource, pLayout: ^SubresourceLayout) +ProcGetImageViewAddressNVX :: #type proc "system" (device: Device, imageView: ImageView, pProperties: [^]ImageViewAddressPropertiesNVX) -> Result +ProcGetImageViewHandleNVX :: #type proc "system" (device: Device, pInfo: ^ImageViewHandleInfoNVX) -> u32 +ProcGetMemoryFdKHR :: #type proc "system" (device: Device, pGetFdInfo: ^MemoryGetFdInfoKHR, pFd: ^c.int) -> Result +ProcGetMemoryFdPropertiesKHR :: #type proc "system" (device: Device, handleType: ExternalMemoryHandleTypeFlags, fd: c.int, pMemoryFdProperties: [^]MemoryFdPropertiesKHR) -> Result +ProcGetMemoryHostPointerPropertiesEXT :: #type proc "system" (device: Device, handleType: ExternalMemoryHandleTypeFlags, pHostPointer: rawptr, pMemoryHostPointerProperties: [^]MemoryHostPointerPropertiesEXT) -> Result +ProcGetMemoryRemoteAddressNV :: #type proc "system" (device: Device, pMemoryGetRemoteAddressInfo: ^MemoryGetRemoteAddressInfoNV, pAddress: [^]RemoteAddressNV) -> Result +ProcGetMemoryWin32HandleKHR :: #type proc "system" (device: Device, pGetWin32HandleInfo: ^MemoryGetWin32HandleInfoKHR, pHandle: ^HANDLE) -> Result +ProcGetMemoryWin32HandleNV :: #type proc "system" (device: Device, memory: DeviceMemory, handleType: ExternalMemoryHandleTypeFlagsNV, pHandle: ^HANDLE) -> Result +ProcGetMemoryWin32HandlePropertiesKHR :: #type proc "system" (device: Device, handleType: ExternalMemoryHandleTypeFlags, handle: HANDLE, pMemoryWin32HandleProperties: [^]MemoryWin32HandlePropertiesKHR) -> Result +ProcGetPastPresentationTimingGOOGLE :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pPresentationTimingCount: ^u32, pPresentationTimings: [^]PastPresentationTimingGOOGLE) -> Result +ProcGetPerformanceParameterINTEL :: #type proc "system" (device: Device, parameter: PerformanceParameterTypeINTEL, pValue: ^PerformanceValueINTEL) -> Result +ProcGetPipelineCacheData :: #type proc "system" (device: Device, pipelineCache: PipelineCache, pDataSize: ^int, pData: rawptr) -> Result +ProcGetPipelineExecutableInternalRepresentationsKHR :: #type proc "system" (device: Device, pExecutableInfo: ^PipelineExecutableInfoKHR, pInternalRepresentationCount: ^u32, pInternalRepresentations: [^]PipelineExecutableInternalRepresentationKHR) -> Result +ProcGetPipelineExecutablePropertiesKHR :: #type proc "system" (device: Device, pPipelineInfo: ^PipelineInfoKHR, pExecutableCount: ^u32, pProperties: [^]PipelineExecutablePropertiesKHR) -> Result +ProcGetPipelineExecutableStatisticsKHR :: #type proc "system" (device: Device, pExecutableInfo: ^PipelineExecutableInfoKHR, pStatisticCount: ^u32, pStatistics: [^]PipelineExecutableStatisticKHR) -> Result +ProcGetPrivateDataEXT :: #type proc "system" (device: Device, objectType: ObjectType, objectHandle: u64, privateDataSlot: PrivateDataSlotEXT, pData: ^u64) +ProcGetQueryPoolResults :: #type proc "system" (device: Device, queryPool: QueryPool, firstQuery: u32, queryCount: u32, dataSize: int, pData: rawptr, stride: DeviceSize, flags: QueryResultFlags) -> Result +ProcGetQueueCheckpointData2NV :: #type proc "system" (queue: Queue, pCheckpointDataCount: ^u32, pCheckpointData: ^CheckpointData2NV) +ProcGetQueueCheckpointDataNV :: #type proc "system" (queue: Queue, pCheckpointDataCount: ^u32, pCheckpointData: ^CheckpointDataNV) +ProcGetRayTracingCaptureReplayShaderGroupHandlesKHR :: #type proc "system" (device: Device, pipeline: Pipeline, firstGroup: u32, groupCount: u32, dataSize: int, pData: rawptr) -> Result +ProcGetRayTracingShaderGroupHandlesKHR :: #type proc "system" (device: Device, pipeline: Pipeline, firstGroup: u32, groupCount: u32, dataSize: int, pData: rawptr) -> Result +ProcGetRayTracingShaderGroupHandlesNV :: #type proc "system" (device: Device, pipeline: Pipeline, firstGroup: u32, groupCount: u32, dataSize: int, pData: rawptr) -> Result +ProcGetRayTracingShaderGroupStackSizeKHR :: #type proc "system" (device: Device, pipeline: Pipeline, group: u32, groupShader: ShaderGroupShaderKHR) -> DeviceSize +ProcGetRefreshCycleDurationGOOGLE :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pDisplayTimingProperties: [^]RefreshCycleDurationGOOGLE) -> Result +ProcGetRenderAreaGranularity :: #type proc "system" (device: Device, renderPass: RenderPass, pGranularity: ^Extent2D) +ProcGetSemaphoreCounterValue :: #type proc "system" (device: Device, semaphore: Semaphore, pValue: ^u64) -> Result +ProcGetSemaphoreCounterValueKHR :: #type proc "system" (device: Device, semaphore: Semaphore, pValue: ^u64) -> Result +ProcGetSemaphoreFdKHR :: #type proc "system" (device: Device, pGetFdInfo: ^SemaphoreGetFdInfoKHR, pFd: ^c.int) -> Result +ProcGetSemaphoreWin32HandleKHR :: #type proc "system" (device: Device, pGetWin32HandleInfo: ^SemaphoreGetWin32HandleInfoKHR, pHandle: ^HANDLE) -> Result +ProcGetShaderInfoAMD :: #type proc "system" (device: Device, pipeline: Pipeline, shaderStage: ShaderStageFlags, infoType: ShaderInfoTypeAMD, pInfoSize: ^int, pInfo: rawptr) -> Result +ProcGetSwapchainCounterEXT :: #type proc "system" (device: Device, swapchain: SwapchainKHR, counter: SurfaceCounterFlagsEXT, pCounterValue: ^u64) -> Result +ProcGetSwapchainImagesKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pSwapchainImageCount: ^u32, pSwapchainImages: [^]Image) -> Result +ProcGetSwapchainStatusKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR) -> Result +ProcGetValidationCacheDataEXT :: #type proc "system" (device: Device, validationCache: ValidationCacheEXT, pDataSize: ^int, pData: rawptr) -> Result +ProcImportFenceFdKHR :: #type proc "system" (device: Device, pImportFenceFdInfo: ^ImportFenceFdInfoKHR) -> Result +ProcImportFenceWin32HandleKHR :: #type proc "system" (device: Device, pImportFenceWin32HandleInfo: ^ImportFenceWin32HandleInfoKHR) -> Result +ProcImportSemaphoreFdKHR :: #type proc "system" (device: Device, pImportSemaphoreFdInfo: ^ImportSemaphoreFdInfoKHR) -> Result +ProcImportSemaphoreWin32HandleKHR :: #type proc "system" (device: Device, pImportSemaphoreWin32HandleInfo: ^ImportSemaphoreWin32HandleInfoKHR) -> Result +ProcInitializePerformanceApiINTEL :: #type proc "system" (device: Device, pInitializeInfo: ^InitializePerformanceApiInfoINTEL) -> Result +ProcInvalidateMappedMemoryRanges :: #type proc "system" (device: Device, memoryRangeCount: u32, pMemoryRanges: [^]MappedMemoryRange) -> Result +ProcMapMemory :: #type proc "system" (device: Device, memory: DeviceMemory, offset: DeviceSize, size: DeviceSize, flags: MemoryMapFlags, ppData: ^rawptr) -> Result +ProcMergePipelineCaches :: #type proc "system" (device: Device, dstCache: PipelineCache, srcCacheCount: u32, pSrcCaches: [^]PipelineCache) -> Result +ProcMergeValidationCachesEXT :: #type proc "system" (device: Device, dstCache: ValidationCacheEXT, srcCacheCount: u32, pSrcCaches: [^]ValidationCacheEXT) -> Result +ProcQueueBeginDebugUtilsLabelEXT :: #type proc "system" (queue: Queue, pLabelInfo: ^DebugUtilsLabelEXT) +ProcQueueBindSparse :: #type proc "system" (queue: Queue, bindInfoCount: u32, pBindInfo: ^BindSparseInfo, fence: Fence) -> Result +ProcQueueEndDebugUtilsLabelEXT :: #type proc "system" (queue: Queue) +ProcQueueInsertDebugUtilsLabelEXT :: #type proc "system" (queue: Queue, pLabelInfo: ^DebugUtilsLabelEXT) +ProcQueuePresentKHR :: #type proc "system" (queue: Queue, pPresentInfo: ^PresentInfoKHR) -> Result +ProcQueueSetPerformanceConfigurationINTEL :: #type proc "system" (queue: Queue, configuration: PerformanceConfigurationINTEL) -> Result +ProcQueueSubmit :: #type proc "system" (queue: Queue, submitCount: u32, pSubmits: [^]SubmitInfo, fence: Fence) -> Result +ProcQueueSubmit2KHR :: #type proc "system" (queue: Queue, submitCount: u32, pSubmits: [^]SubmitInfo2KHR, fence: Fence) -> Result +ProcQueueWaitIdle :: #type proc "system" (queue: Queue) -> Result +ProcRegisterDeviceEventEXT :: #type proc "system" (device: Device, pDeviceEventInfo: ^DeviceEventInfoEXT, pAllocator: ^AllocationCallbacks, pFence: ^Fence) -> Result +ProcRegisterDisplayEventEXT :: #type proc "system" (device: Device, display: DisplayKHR, pDisplayEventInfo: ^DisplayEventInfoEXT, pAllocator: ^AllocationCallbacks, pFence: ^Fence) -> Result +ProcReleaseFullScreenExclusiveModeEXT :: #type proc "system" (device: Device, swapchain: SwapchainKHR) -> Result +ProcReleasePerformanceConfigurationINTEL :: #type proc "system" (device: Device, configuration: PerformanceConfigurationINTEL) -> Result +ProcReleaseProfilingLockKHR :: #type proc "system" (device: Device) +ProcResetCommandBuffer :: #type proc "system" (commandBuffer: CommandBuffer, flags: CommandBufferResetFlags) -> Result +ProcResetCommandPool :: #type proc "system" (device: Device, commandPool: CommandPool, flags: CommandPoolResetFlags) -> Result +ProcResetDescriptorPool :: #type proc "system" (device: Device, descriptorPool: DescriptorPool, flags: DescriptorPoolResetFlags) -> Result +ProcResetEvent :: #type proc "system" (device: Device, event: Event) -> Result +ProcResetFences :: #type proc "system" (device: Device, fenceCount: u32, pFences: [^]Fence) -> Result +ProcResetQueryPool :: #type proc "system" (device: Device, queryPool: QueryPool, firstQuery: u32, queryCount: u32) +ProcResetQueryPoolEXT :: #type proc "system" (device: Device, queryPool: QueryPool, firstQuery: u32, queryCount: u32) +ProcSetDebugUtilsObjectNameEXT :: #type proc "system" (device: Device, pNameInfo: ^DebugUtilsObjectNameInfoEXT) -> Result +ProcSetDebugUtilsObjectTagEXT :: #type proc "system" (device: Device, pTagInfo: ^DebugUtilsObjectTagInfoEXT) -> Result +ProcSetDeviceMemoryPriorityEXT :: #type proc "system" (device: Device, memory: DeviceMemory, priority: f32) +ProcSetEvent :: #type proc "system" (device: Device, event: Event) -> Result +ProcSetHdrMetadataEXT :: #type proc "system" (device: Device, swapchainCount: u32, pSwapchains: [^]SwapchainKHR, pMetadata: ^HdrMetadataEXT) +ProcSetLocalDimmingAMD :: #type proc "system" (device: Device, swapChain: SwapchainKHR, localDimmingEnable: b32) +ProcSetPrivateDataEXT :: #type proc "system" (device: Device, objectType: ObjectType, objectHandle: u64, privateDataSlot: PrivateDataSlotEXT, data: u64) -> Result +ProcSignalSemaphore :: #type proc "system" (device: Device, pSignalInfo: ^SemaphoreSignalInfo) -> Result +ProcSignalSemaphoreKHR :: #type proc "system" (device: Device, pSignalInfo: ^SemaphoreSignalInfo) -> Result +ProcTrimCommandPool :: #type proc "system" (device: Device, commandPool: CommandPool, flags: CommandPoolTrimFlags) +ProcTrimCommandPoolKHR :: #type proc "system" (device: Device, commandPool: CommandPool, flags: CommandPoolTrimFlags) +ProcUninitializePerformanceApiINTEL :: #type proc "system" (device: Device) +ProcUnmapMemory :: #type proc "system" (device: Device, memory: DeviceMemory) +ProcUpdateDescriptorSetWithTemplate :: #type proc "system" (device: Device, descriptorSet: DescriptorSet, descriptorUpdateTemplate: DescriptorUpdateTemplate, pData: rawptr) +ProcUpdateDescriptorSetWithTemplateKHR :: #type proc "system" (device: Device, descriptorSet: DescriptorSet, descriptorUpdateTemplate: DescriptorUpdateTemplate, pData: rawptr) +ProcUpdateDescriptorSets :: #type proc "system" (device: Device, descriptorWriteCount: u32, pDescriptorWrites: [^]WriteDescriptorSet, descriptorCopyCount: u32, pDescriptorCopies: [^]CopyDescriptorSet) +ProcWaitForFences :: #type proc "system" (device: Device, fenceCount: u32, pFences: [^]Fence, waitAll: b32, timeout: u64) -> Result +ProcWaitForPresentKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR, presentId: u64, timeout: u64) -> Result +ProcWaitSemaphores :: #type proc "system" (device: Device, pWaitInfo: ^SemaphoreWaitInfo, timeout: u64) -> Result +ProcWaitSemaphoresKHR :: #type proc "system" (device: Device, pWaitInfo: ^SemaphoreWaitInfo, timeout: u64) -> Result +ProcWriteAccelerationStructuresPropertiesKHR :: #type proc "system" (device: Device, accelerationStructureCount: u32, pAccelerationStructures: [^]AccelerationStructureKHR, queryType: QueryType, dataSize: int, pData: rawptr, stride: int) -> Result -// Device Procedures -GetDeviceProcAddr: ProcGetDeviceProcAddr -DestroyDevice: ProcDestroyDevice -GetDeviceQueue: ProcGetDeviceQueue -QueueSubmit: ProcQueueSubmit -QueueWaitIdle: ProcQueueWaitIdle -DeviceWaitIdle: ProcDeviceWaitIdle -AllocateMemory: ProcAllocateMemory -FreeMemory: ProcFreeMemory -MapMemory: ProcMapMemory -UnmapMemory: ProcUnmapMemory -FlushMappedMemoryRanges: ProcFlushMappedMemoryRanges -InvalidateMappedMemoryRanges: ProcInvalidateMappedMemoryRanges -GetDeviceMemoryCommitment: ProcGetDeviceMemoryCommitment -BindBufferMemory: ProcBindBufferMemory -BindImageMemory: ProcBindImageMemory -GetBufferMemoryRequirements: ProcGetBufferMemoryRequirements -GetImageMemoryRequirements: ProcGetImageMemoryRequirements -GetImageSparseMemoryRequirements: ProcGetImageSparseMemoryRequirements -QueueBindSparse: ProcQueueBindSparse -CreateFence: ProcCreateFence -DestroyFence: ProcDestroyFence -ResetFences: ProcResetFences -GetFenceStatus: ProcGetFenceStatus -WaitForFences: ProcWaitForFences -CreateSemaphore: ProcCreateSemaphore -DestroySemaphore: ProcDestroySemaphore -CreateEvent: ProcCreateEvent -DestroyEvent: ProcDestroyEvent -GetEventStatus: ProcGetEventStatus -SetEvent: ProcSetEvent -ResetEvent: ProcResetEvent -CreateQueryPool: ProcCreateQueryPool -DestroyQueryPool: ProcDestroyQueryPool -GetQueryPoolResults: ProcGetQueryPoolResults -CreateBuffer: ProcCreateBuffer -DestroyBuffer: ProcDestroyBuffer -CreateBufferView: ProcCreateBufferView -DestroyBufferView: ProcDestroyBufferView -CreateImage: ProcCreateImage -DestroyImage: ProcDestroyImage -GetImageSubresourceLayout: ProcGetImageSubresourceLayout -CreateImageView: ProcCreateImageView -DestroyImageView: ProcDestroyImageView -CreateShaderModule: ProcCreateShaderModule -DestroyShaderModule: ProcDestroyShaderModule -CreatePipelineCache: ProcCreatePipelineCache -DestroyPipelineCache: ProcDestroyPipelineCache -GetPipelineCacheData: ProcGetPipelineCacheData -MergePipelineCaches: ProcMergePipelineCaches -CreateGraphicsPipelines: ProcCreateGraphicsPipelines -CreateComputePipelines: ProcCreateComputePipelines -DestroyPipeline: ProcDestroyPipeline -CreatePipelineLayout: ProcCreatePipelineLayout -DestroyPipelineLayout: ProcDestroyPipelineLayout -CreateSampler: ProcCreateSampler -DestroySampler: ProcDestroySampler -CreateDescriptorSetLayout: ProcCreateDescriptorSetLayout -DestroyDescriptorSetLayout: ProcDestroyDescriptorSetLayout -CreateDescriptorPool: ProcCreateDescriptorPool -DestroyDescriptorPool: ProcDestroyDescriptorPool -ResetDescriptorPool: ProcResetDescriptorPool -AllocateDescriptorSets: ProcAllocateDescriptorSets -FreeDescriptorSets: ProcFreeDescriptorSets -UpdateDescriptorSets: ProcUpdateDescriptorSets -CreateFramebuffer: ProcCreateFramebuffer -DestroyFramebuffer: ProcDestroyFramebuffer -CreateRenderPass: ProcCreateRenderPass -DestroyRenderPass: ProcDestroyRenderPass -GetRenderAreaGranularity: ProcGetRenderAreaGranularity -CreateCommandPool: ProcCreateCommandPool -DestroyCommandPool: ProcDestroyCommandPool -ResetCommandPool: ProcResetCommandPool -AllocateCommandBuffers: ProcAllocateCommandBuffers -FreeCommandBuffers: ProcFreeCommandBuffers -BeginCommandBuffer: ProcBeginCommandBuffer -EndCommandBuffer: ProcEndCommandBuffer -ResetCommandBuffer: ProcResetCommandBuffer -CmdBindPipeline: ProcCmdBindPipeline -CmdSetViewport: ProcCmdSetViewport -CmdSetScissor: ProcCmdSetScissor -CmdSetLineWidth: ProcCmdSetLineWidth -CmdSetDepthBias: ProcCmdSetDepthBias -CmdSetBlendConstants: ProcCmdSetBlendConstants -CmdSetDepthBounds: ProcCmdSetDepthBounds -CmdSetStencilCompareMask: ProcCmdSetStencilCompareMask -CmdSetStencilWriteMask: ProcCmdSetStencilWriteMask -CmdSetStencilReference: ProcCmdSetStencilReference -CmdBindDescriptorSets: ProcCmdBindDescriptorSets -CmdBindIndexBuffer: ProcCmdBindIndexBuffer -CmdBindVertexBuffers: ProcCmdBindVertexBuffers -CmdDraw: ProcCmdDraw -CmdDrawIndexed: ProcCmdDrawIndexed -CmdDrawIndirect: ProcCmdDrawIndirect -CmdDrawIndexedIndirect: ProcCmdDrawIndexedIndirect -CmdDispatch: ProcCmdDispatch -CmdDispatchIndirect: ProcCmdDispatchIndirect -CmdCopyBuffer: ProcCmdCopyBuffer -CmdCopyImage: ProcCmdCopyImage -CmdBlitImage: ProcCmdBlitImage -CmdCopyBufferToImage: ProcCmdCopyBufferToImage -CmdCopyImageToBuffer: ProcCmdCopyImageToBuffer -CmdUpdateBuffer: ProcCmdUpdateBuffer -CmdFillBuffer: ProcCmdFillBuffer -CmdClearColorImage: ProcCmdClearColorImage -CmdClearDepthStencilImage: ProcCmdClearDepthStencilImage -CmdClearAttachments: ProcCmdClearAttachments -CmdResolveImage: ProcCmdResolveImage -CmdSetEvent: ProcCmdSetEvent -CmdResetEvent: ProcCmdResetEvent -CmdWaitEvents: ProcCmdWaitEvents -CmdPipelineBarrier: ProcCmdPipelineBarrier -CmdBeginQuery: ProcCmdBeginQuery -CmdEndQuery: ProcCmdEndQuery -CmdResetQueryPool: ProcCmdResetQueryPool -CmdWriteTimestamp: ProcCmdWriteTimestamp -CmdCopyQueryPoolResults: ProcCmdCopyQueryPoolResults -CmdPushConstants: ProcCmdPushConstants -CmdBeginRenderPass: ProcCmdBeginRenderPass -CmdNextSubpass: ProcCmdNextSubpass -CmdEndRenderPass: ProcCmdEndRenderPass -CmdExecuteCommands: ProcCmdExecuteCommands -BindBufferMemory2: ProcBindBufferMemory2 -BindImageMemory2: ProcBindImageMemory2 -GetDeviceGroupPeerMemoryFeatures: ProcGetDeviceGroupPeerMemoryFeatures -CmdSetDeviceMask: ProcCmdSetDeviceMask -CmdDispatchBase: ProcCmdDispatchBase -GetImageMemoryRequirements2: ProcGetImageMemoryRequirements2 -GetBufferMemoryRequirements2: ProcGetBufferMemoryRequirements2 -GetImageSparseMemoryRequirements2: ProcGetImageSparseMemoryRequirements2 -TrimCommandPool: ProcTrimCommandPool -GetDeviceQueue2: ProcGetDeviceQueue2 -CreateSamplerYcbcrConversion: ProcCreateSamplerYcbcrConversion -DestroySamplerYcbcrConversion: ProcDestroySamplerYcbcrConversion -CreateDescriptorUpdateTemplate: ProcCreateDescriptorUpdateTemplate -DestroyDescriptorUpdateTemplate: ProcDestroyDescriptorUpdateTemplate -UpdateDescriptorSetWithTemplate: ProcUpdateDescriptorSetWithTemplate -GetDescriptorSetLayoutSupport: ProcGetDescriptorSetLayoutSupport -CmdDrawIndirectCount: ProcCmdDrawIndirectCount -CmdDrawIndexedIndirectCount: ProcCmdDrawIndexedIndirectCount -CreateRenderPass2: ProcCreateRenderPass2 -CmdBeginRenderPass2: ProcCmdBeginRenderPass2 -CmdNextSubpass2: ProcCmdNextSubpass2 -CmdEndRenderPass2: ProcCmdEndRenderPass2 -ResetQueryPool: ProcResetQueryPool -GetSemaphoreCounterValue: ProcGetSemaphoreCounterValue -WaitSemaphores: ProcWaitSemaphores -SignalSemaphore: ProcSignalSemaphore -GetBufferDeviceAddress: ProcGetBufferDeviceAddress -GetBufferOpaqueCaptureAddress: ProcGetBufferOpaqueCaptureAddress -GetDeviceMemoryOpaqueCaptureAddress: ProcGetDeviceMemoryOpaqueCaptureAddress -CreateSwapchainKHR: ProcCreateSwapchainKHR -DestroySwapchainKHR: ProcDestroySwapchainKHR -GetSwapchainImagesKHR: ProcGetSwapchainImagesKHR -AcquireNextImageKHR: ProcAcquireNextImageKHR -QueuePresentKHR: ProcQueuePresentKHR -GetDeviceGroupPresentCapabilitiesKHR: ProcGetDeviceGroupPresentCapabilitiesKHR -GetDeviceGroupSurfacePresentModesKHR: ProcGetDeviceGroupSurfacePresentModesKHR -AcquireNextImage2KHR: ProcAcquireNextImage2KHR -CreateSharedSwapchainsKHR: ProcCreateSharedSwapchainsKHR -GetDeviceGroupPeerMemoryFeaturesKHR: ProcGetDeviceGroupPeerMemoryFeaturesKHR -CmdSetDeviceMaskKHR: ProcCmdSetDeviceMaskKHR -CmdDispatchBaseKHR: ProcCmdDispatchBaseKHR -TrimCommandPoolKHR: ProcTrimCommandPoolKHR -GetMemoryFdKHR: ProcGetMemoryFdKHR -GetMemoryFdPropertiesKHR: ProcGetMemoryFdPropertiesKHR -ImportSemaphoreFdKHR: ProcImportSemaphoreFdKHR -GetSemaphoreFdKHR: ProcGetSemaphoreFdKHR -CmdPushDescriptorSetKHR: ProcCmdPushDescriptorSetKHR -CmdPushDescriptorSetWithTemplateKHR: ProcCmdPushDescriptorSetWithTemplateKHR -CreateDescriptorUpdateTemplateKHR: ProcCreateDescriptorUpdateTemplateKHR -DestroyDescriptorUpdateTemplateKHR: ProcDestroyDescriptorUpdateTemplateKHR -UpdateDescriptorSetWithTemplateKHR: ProcUpdateDescriptorSetWithTemplateKHR -CreateRenderPass2KHR: ProcCreateRenderPass2KHR -CmdBeginRenderPass2KHR: ProcCmdBeginRenderPass2KHR -CmdNextSubpass2KHR: ProcCmdNextSubpass2KHR -CmdEndRenderPass2KHR: ProcCmdEndRenderPass2KHR -GetSwapchainStatusKHR: ProcGetSwapchainStatusKHR -ImportFenceFdKHR: ProcImportFenceFdKHR -GetFenceFdKHR: ProcGetFenceFdKHR -AcquireProfilingLockKHR: ProcAcquireProfilingLockKHR -ReleaseProfilingLockKHR: ProcReleaseProfilingLockKHR -GetImageMemoryRequirements2KHR: ProcGetImageMemoryRequirements2KHR -GetBufferMemoryRequirements2KHR: ProcGetBufferMemoryRequirements2KHR -GetImageSparseMemoryRequirements2KHR: ProcGetImageSparseMemoryRequirements2KHR -CreateSamplerYcbcrConversionKHR: ProcCreateSamplerYcbcrConversionKHR -DestroySamplerYcbcrConversionKHR: ProcDestroySamplerYcbcrConversionKHR -BindBufferMemory2KHR: ProcBindBufferMemory2KHR -BindImageMemory2KHR: ProcBindImageMemory2KHR -GetDescriptorSetLayoutSupportKHR: ProcGetDescriptorSetLayoutSupportKHR -CmdDrawIndirectCountKHR: ProcCmdDrawIndirectCountKHR -CmdDrawIndexedIndirectCountKHR: ProcCmdDrawIndexedIndirectCountKHR -GetSemaphoreCounterValueKHR: ProcGetSemaphoreCounterValueKHR -WaitSemaphoresKHR: ProcWaitSemaphoresKHR -SignalSemaphoreKHR: ProcSignalSemaphoreKHR -CmdSetFragmentShadingRateKHR: ProcCmdSetFragmentShadingRateKHR -WaitForPresentKHR: ProcWaitForPresentKHR -GetBufferDeviceAddressKHR: ProcGetBufferDeviceAddressKHR -GetBufferOpaqueCaptureAddressKHR: ProcGetBufferOpaqueCaptureAddressKHR -GetDeviceMemoryOpaqueCaptureAddressKHR: ProcGetDeviceMemoryOpaqueCaptureAddressKHR -CreateDeferredOperationKHR: ProcCreateDeferredOperationKHR -DestroyDeferredOperationKHR: ProcDestroyDeferredOperationKHR -GetDeferredOperationMaxConcurrencyKHR: ProcGetDeferredOperationMaxConcurrencyKHR -GetDeferredOperationResultKHR: ProcGetDeferredOperationResultKHR -DeferredOperationJoinKHR: ProcDeferredOperationJoinKHR -GetPipelineExecutablePropertiesKHR: ProcGetPipelineExecutablePropertiesKHR -GetPipelineExecutableStatisticsKHR: ProcGetPipelineExecutableStatisticsKHR -GetPipelineExecutableInternalRepresentationsKHR: ProcGetPipelineExecutableInternalRepresentationsKHR -CmdSetEvent2KHR: ProcCmdSetEvent2KHR -CmdResetEvent2KHR: ProcCmdResetEvent2KHR -CmdWaitEvents2KHR: ProcCmdWaitEvents2KHR -CmdPipelineBarrier2KHR: ProcCmdPipelineBarrier2KHR -CmdWriteTimestamp2KHR: ProcCmdWriteTimestamp2KHR -QueueSubmit2KHR: ProcQueueSubmit2KHR -CmdWriteBufferMarker2AMD: ProcCmdWriteBufferMarker2AMD -GetQueueCheckpointData2NV: ProcGetQueueCheckpointData2NV -CmdCopyBuffer2KHR: ProcCmdCopyBuffer2KHR -CmdCopyImage2KHR: ProcCmdCopyImage2KHR -CmdCopyBufferToImage2KHR: ProcCmdCopyBufferToImage2KHR -CmdCopyImageToBuffer2KHR: ProcCmdCopyImageToBuffer2KHR -CmdBlitImage2KHR: ProcCmdBlitImage2KHR -CmdResolveImage2KHR: ProcCmdResolveImage2KHR -DebugMarkerSetObjectTagEXT: ProcDebugMarkerSetObjectTagEXT -DebugMarkerSetObjectNameEXT: ProcDebugMarkerSetObjectNameEXT -CmdDebugMarkerBeginEXT: ProcCmdDebugMarkerBeginEXT -CmdDebugMarkerEndEXT: ProcCmdDebugMarkerEndEXT -CmdDebugMarkerInsertEXT: ProcCmdDebugMarkerInsertEXT -CmdBindTransformFeedbackBuffersEXT: ProcCmdBindTransformFeedbackBuffersEXT -CmdBeginTransformFeedbackEXT: ProcCmdBeginTransformFeedbackEXT -CmdEndTransformFeedbackEXT: ProcCmdEndTransformFeedbackEXT -CmdBeginQueryIndexedEXT: ProcCmdBeginQueryIndexedEXT -CmdEndQueryIndexedEXT: ProcCmdEndQueryIndexedEXT -CmdDrawIndirectByteCountEXT: ProcCmdDrawIndirectByteCountEXT -CreateCuModuleNVX: ProcCreateCuModuleNVX -CreateCuFunctionNVX: ProcCreateCuFunctionNVX -DestroyCuModuleNVX: ProcDestroyCuModuleNVX -DestroyCuFunctionNVX: ProcDestroyCuFunctionNVX -CmdCuLaunchKernelNVX: ProcCmdCuLaunchKernelNVX -GetImageViewHandleNVX: ProcGetImageViewHandleNVX -GetImageViewAddressNVX: ProcGetImageViewAddressNVX -CmdDrawIndirectCountAMD: ProcCmdDrawIndirectCountAMD -CmdDrawIndexedIndirectCountAMD: ProcCmdDrawIndexedIndirectCountAMD -GetShaderInfoAMD: ProcGetShaderInfoAMD -CmdBeginConditionalRenderingEXT: ProcCmdBeginConditionalRenderingEXT -CmdEndConditionalRenderingEXT: ProcCmdEndConditionalRenderingEXT -CmdSetViewportWScalingNV: ProcCmdSetViewportWScalingNV -DisplayPowerControlEXT: ProcDisplayPowerControlEXT -RegisterDeviceEventEXT: ProcRegisterDeviceEventEXT -RegisterDisplayEventEXT: ProcRegisterDisplayEventEXT -GetSwapchainCounterEXT: ProcGetSwapchainCounterEXT -GetRefreshCycleDurationGOOGLE: ProcGetRefreshCycleDurationGOOGLE -GetPastPresentationTimingGOOGLE: ProcGetPastPresentationTimingGOOGLE -CmdSetDiscardRectangleEXT: ProcCmdSetDiscardRectangleEXT -SetHdrMetadataEXT: ProcSetHdrMetadataEXT -SetDebugUtilsObjectNameEXT: ProcSetDebugUtilsObjectNameEXT -SetDebugUtilsObjectTagEXT: ProcSetDebugUtilsObjectTagEXT -QueueBeginDebugUtilsLabelEXT: ProcQueueBeginDebugUtilsLabelEXT -QueueEndDebugUtilsLabelEXT: ProcQueueEndDebugUtilsLabelEXT -QueueInsertDebugUtilsLabelEXT: ProcQueueInsertDebugUtilsLabelEXT -CmdBeginDebugUtilsLabelEXT: ProcCmdBeginDebugUtilsLabelEXT -CmdEndDebugUtilsLabelEXT: ProcCmdEndDebugUtilsLabelEXT -CmdInsertDebugUtilsLabelEXT: ProcCmdInsertDebugUtilsLabelEXT -CmdSetSampleLocationsEXT: ProcCmdSetSampleLocationsEXT -GetImageDrmFormatModifierPropertiesEXT: ProcGetImageDrmFormatModifierPropertiesEXT -CreateValidationCacheEXT: ProcCreateValidationCacheEXT -DestroyValidationCacheEXT: ProcDestroyValidationCacheEXT -MergeValidationCachesEXT: ProcMergeValidationCachesEXT -GetValidationCacheDataEXT: ProcGetValidationCacheDataEXT -CmdBindShadingRateImageNV: ProcCmdBindShadingRateImageNV -CmdSetViewportShadingRatePaletteNV: ProcCmdSetViewportShadingRatePaletteNV -CmdSetCoarseSampleOrderNV: ProcCmdSetCoarseSampleOrderNV -CreateAccelerationStructureNV: ProcCreateAccelerationStructureNV -DestroyAccelerationStructureNV: ProcDestroyAccelerationStructureNV -GetAccelerationStructureMemoryRequirementsNV: ProcGetAccelerationStructureMemoryRequirementsNV -BindAccelerationStructureMemoryNV: ProcBindAccelerationStructureMemoryNV -CmdBuildAccelerationStructureNV: ProcCmdBuildAccelerationStructureNV -CmdCopyAccelerationStructureNV: ProcCmdCopyAccelerationStructureNV -CmdTraceRaysNV: ProcCmdTraceRaysNV -CreateRayTracingPipelinesNV: ProcCreateRayTracingPipelinesNV -GetRayTracingShaderGroupHandlesKHR: ProcGetRayTracingShaderGroupHandlesKHR -GetRayTracingShaderGroupHandlesNV: ProcGetRayTracingShaderGroupHandlesNV -GetAccelerationStructureHandleNV: ProcGetAccelerationStructureHandleNV -CmdWriteAccelerationStructuresPropertiesNV: ProcCmdWriteAccelerationStructuresPropertiesNV -CompileDeferredNV: ProcCompileDeferredNV -GetMemoryHostPointerPropertiesEXT: ProcGetMemoryHostPointerPropertiesEXT -CmdWriteBufferMarkerAMD: ProcCmdWriteBufferMarkerAMD -GetCalibratedTimestampsEXT: ProcGetCalibratedTimestampsEXT -CmdDrawMeshTasksNV: ProcCmdDrawMeshTasksNV -CmdDrawMeshTasksIndirectNV: ProcCmdDrawMeshTasksIndirectNV -CmdDrawMeshTasksIndirectCountNV: ProcCmdDrawMeshTasksIndirectCountNV -CmdSetExclusiveScissorNV: ProcCmdSetExclusiveScissorNV -CmdSetCheckpointNV: ProcCmdSetCheckpointNV -GetQueueCheckpointDataNV: ProcGetQueueCheckpointDataNV -InitializePerformanceApiINTEL: ProcInitializePerformanceApiINTEL -UninitializePerformanceApiINTEL: ProcUninitializePerformanceApiINTEL -CmdSetPerformanceMarkerINTEL: ProcCmdSetPerformanceMarkerINTEL -CmdSetPerformanceStreamMarkerINTEL: ProcCmdSetPerformanceStreamMarkerINTEL -CmdSetPerformanceOverrideINTEL: ProcCmdSetPerformanceOverrideINTEL -AcquirePerformanceConfigurationINTEL: ProcAcquirePerformanceConfigurationINTEL -ReleasePerformanceConfigurationINTEL: ProcReleasePerformanceConfigurationINTEL -QueueSetPerformanceConfigurationINTEL: ProcQueueSetPerformanceConfigurationINTEL -GetPerformanceParameterINTEL: ProcGetPerformanceParameterINTEL -SetLocalDimmingAMD: ProcSetLocalDimmingAMD -GetBufferDeviceAddressEXT: ProcGetBufferDeviceAddressEXT -CmdSetLineStippleEXT: ProcCmdSetLineStippleEXT -ResetQueryPoolEXT: ProcResetQueryPoolEXT -CmdSetCullModeEXT: ProcCmdSetCullModeEXT -CmdSetFrontFaceEXT: ProcCmdSetFrontFaceEXT -CmdSetPrimitiveTopologyEXT: ProcCmdSetPrimitiveTopologyEXT -CmdSetViewportWithCountEXT: ProcCmdSetViewportWithCountEXT -CmdSetScissorWithCountEXT: ProcCmdSetScissorWithCountEXT -CmdBindVertexBuffers2EXT: ProcCmdBindVertexBuffers2EXT -CmdSetDepthTestEnableEXT: ProcCmdSetDepthTestEnableEXT -CmdSetDepthWriteEnableEXT: ProcCmdSetDepthWriteEnableEXT -CmdSetDepthCompareOpEXT: ProcCmdSetDepthCompareOpEXT -CmdSetDepthBoundsTestEnableEXT: ProcCmdSetDepthBoundsTestEnableEXT -CmdSetStencilTestEnableEXT: ProcCmdSetStencilTestEnableEXT -CmdSetStencilOpEXT: ProcCmdSetStencilOpEXT -GetGeneratedCommandsMemoryRequirementsNV: ProcGetGeneratedCommandsMemoryRequirementsNV -CmdPreprocessGeneratedCommandsNV: ProcCmdPreprocessGeneratedCommandsNV -CmdExecuteGeneratedCommandsNV: ProcCmdExecuteGeneratedCommandsNV -CmdBindPipelineShaderGroupNV: ProcCmdBindPipelineShaderGroupNV -CreateIndirectCommandsLayoutNV: ProcCreateIndirectCommandsLayoutNV -DestroyIndirectCommandsLayoutNV: ProcDestroyIndirectCommandsLayoutNV -CreatePrivateDataSlotEXT: ProcCreatePrivateDataSlotEXT -DestroyPrivateDataSlotEXT: ProcDestroyPrivateDataSlotEXT -SetPrivateDataEXT: ProcSetPrivateDataEXT -GetPrivateDataEXT: ProcGetPrivateDataEXT -CmdSetFragmentShadingRateEnumNV: ProcCmdSetFragmentShadingRateEnumNV -CmdSetVertexInputEXT: ProcCmdSetVertexInputEXT -GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI: ProcGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI -CmdSubpassShadingHUAWEI: ProcCmdSubpassShadingHUAWEI -CmdBindInvocationMaskHUAWEI: ProcCmdBindInvocationMaskHUAWEI -GetMemoryRemoteAddressNV: ProcGetMemoryRemoteAddressNV -CmdSetPatchControlPointsEXT: ProcCmdSetPatchControlPointsEXT -CmdSetRasterizerDiscardEnableEXT: ProcCmdSetRasterizerDiscardEnableEXT -CmdSetDepthBiasEnableEXT: ProcCmdSetDepthBiasEnableEXT -CmdSetLogicOpEXT: ProcCmdSetLogicOpEXT -CmdSetPrimitiveRestartEnableEXT: ProcCmdSetPrimitiveRestartEnableEXT -CmdDrawMultiEXT: ProcCmdDrawMultiEXT -CmdDrawMultiIndexedEXT: ProcCmdDrawMultiIndexedEXT -SetDeviceMemoryPriorityEXT: ProcSetDeviceMemoryPriorityEXT -CreateAccelerationStructureKHR: ProcCreateAccelerationStructureKHR -DestroyAccelerationStructureKHR: ProcDestroyAccelerationStructureKHR -CmdBuildAccelerationStructuresKHR: ProcCmdBuildAccelerationStructuresKHR -CmdBuildAccelerationStructuresIndirectKHR: ProcCmdBuildAccelerationStructuresIndirectKHR -BuildAccelerationStructuresKHR: ProcBuildAccelerationStructuresKHR -CopyAccelerationStructureKHR: ProcCopyAccelerationStructureKHR -CopyAccelerationStructureToMemoryKHR: ProcCopyAccelerationStructureToMemoryKHR -CopyMemoryToAccelerationStructureKHR: ProcCopyMemoryToAccelerationStructureKHR -WriteAccelerationStructuresPropertiesKHR: ProcWriteAccelerationStructuresPropertiesKHR -CmdCopyAccelerationStructureKHR: ProcCmdCopyAccelerationStructureKHR -CmdCopyAccelerationStructureToMemoryKHR: ProcCmdCopyAccelerationStructureToMemoryKHR -CmdCopyMemoryToAccelerationStructureKHR: ProcCmdCopyMemoryToAccelerationStructureKHR -GetAccelerationStructureDeviceAddressKHR: ProcGetAccelerationStructureDeviceAddressKHR -CmdWriteAccelerationStructuresPropertiesKHR: ProcCmdWriteAccelerationStructuresPropertiesKHR -GetDeviceAccelerationStructureCompatibilityKHR: ProcGetDeviceAccelerationStructureCompatibilityKHR -GetAccelerationStructureBuildSizesKHR: ProcGetAccelerationStructureBuildSizesKHR -CmdTraceRaysKHR: ProcCmdTraceRaysKHR -CreateRayTracingPipelinesKHR: ProcCreateRayTracingPipelinesKHR -GetRayTracingCaptureReplayShaderGroupHandlesKHR: ProcGetRayTracingCaptureReplayShaderGroupHandlesKHR -CmdTraceRaysIndirectKHR: ProcCmdTraceRaysIndirectKHR -GetRayTracingShaderGroupStackSizeKHR: ProcGetRayTracingShaderGroupStackSizeKHR -CmdSetRayTracingPipelineStackSizeKHR: ProcCmdSetRayTracingPipelineStackSizeKHR -GetMemoryWin32HandleKHR: ProcGetMemoryWin32HandleKHR -GetMemoryWin32HandlePropertiesKHR: ProcGetMemoryWin32HandlePropertiesKHR -ImportSemaphoreWin32HandleKHR: ProcImportSemaphoreWin32HandleKHR -GetSemaphoreWin32HandleKHR: ProcGetSemaphoreWin32HandleKHR -ImportFenceWin32HandleKHR: ProcImportFenceWin32HandleKHR -GetFenceWin32HandleKHR: ProcGetFenceWin32HandleKHR -GetMemoryWin32HandleNV: ProcGetMemoryWin32HandleNV -AcquireFullScreenExclusiveModeEXT: ProcAcquireFullScreenExclusiveModeEXT -ReleaseFullScreenExclusiveModeEXT: ProcReleaseFullScreenExclusiveModeEXT -GetDeviceGroupSurfacePresentModes2EXT: ProcGetDeviceGroupSurfacePresentModes2EXT // Loader Procedures CreateInstance: ProcCreateInstance +DebugUtilsMessengerCallbackEXT: ProcDebugUtilsMessengerCallbackEXT +DeviceMemoryReportCallbackEXT: ProcDeviceMemoryReportCallbackEXT EnumerateInstanceExtensionProperties: ProcEnumerateInstanceExtensionProperties EnumerateInstanceLayerProperties: ProcEnumerateInstanceLayerProperties EnumerateInstanceVersion: ProcEnumerateInstanceVersion -DebugUtilsMessengerCallbackEXT: ProcDebugUtilsMessengerCallbackEXT -DeviceMemoryReportCallbackEXT: ProcDeviceMemoryReportCallbackEXT -load_proc_addresses :: proc(set_proc_address: SetProcAddressType) { - // Instance Procedures - set_proc_address(&DestroyInstance, "vkDestroyInstance") - set_proc_address(&EnumeratePhysicalDevices, "vkEnumeratePhysicalDevices") - set_proc_address(&GetPhysicalDeviceFeatures, "vkGetPhysicalDeviceFeatures") - set_proc_address(&GetPhysicalDeviceFormatProperties, "vkGetPhysicalDeviceFormatProperties") - set_proc_address(&GetPhysicalDeviceImageFormatProperties, "vkGetPhysicalDeviceImageFormatProperties") - set_proc_address(&GetPhysicalDeviceProperties, "vkGetPhysicalDeviceProperties") - set_proc_address(&GetPhysicalDeviceQueueFamilyProperties, "vkGetPhysicalDeviceQueueFamilyProperties") - set_proc_address(&GetPhysicalDeviceMemoryProperties, "vkGetPhysicalDeviceMemoryProperties") - set_proc_address(&GetInstanceProcAddr, "vkGetInstanceProcAddr") - set_proc_address(&CreateDevice, "vkCreateDevice") - set_proc_address(&EnumerateDeviceExtensionProperties, "vkEnumerateDeviceExtensionProperties") - set_proc_address(&EnumerateDeviceLayerProperties, "vkEnumerateDeviceLayerProperties") - set_proc_address(&GetPhysicalDeviceSparseImageFormatProperties, "vkGetPhysicalDeviceSparseImageFormatProperties") - set_proc_address(&EnumeratePhysicalDeviceGroups, "vkEnumeratePhysicalDeviceGroups") - set_proc_address(&GetPhysicalDeviceFeatures2, "vkGetPhysicalDeviceFeatures2") - set_proc_address(&GetPhysicalDeviceProperties2, "vkGetPhysicalDeviceProperties2") - set_proc_address(&GetPhysicalDeviceFormatProperties2, "vkGetPhysicalDeviceFormatProperties2") - set_proc_address(&GetPhysicalDeviceImageFormatProperties2, "vkGetPhysicalDeviceImageFormatProperties2") - set_proc_address(&GetPhysicalDeviceQueueFamilyProperties2, "vkGetPhysicalDeviceQueueFamilyProperties2") - set_proc_address(&GetPhysicalDeviceMemoryProperties2, "vkGetPhysicalDeviceMemoryProperties2") - set_proc_address(&GetPhysicalDeviceSparseImageFormatProperties2, "vkGetPhysicalDeviceSparseImageFormatProperties2") - set_proc_address(&GetPhysicalDeviceExternalBufferProperties, "vkGetPhysicalDeviceExternalBufferProperties") - set_proc_address(&GetPhysicalDeviceExternalFenceProperties, "vkGetPhysicalDeviceExternalFenceProperties") - set_proc_address(&GetPhysicalDeviceExternalSemaphoreProperties, "vkGetPhysicalDeviceExternalSemaphoreProperties") - set_proc_address(&DestroySurfaceKHR, "vkDestroySurfaceKHR") - set_proc_address(&GetPhysicalDeviceSurfaceSupportKHR, "vkGetPhysicalDeviceSurfaceSupportKHR") - set_proc_address(&GetPhysicalDeviceSurfaceCapabilitiesKHR, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR") - set_proc_address(&GetPhysicalDeviceSurfaceFormatsKHR, "vkGetPhysicalDeviceSurfaceFormatsKHR") - set_proc_address(&GetPhysicalDeviceSurfacePresentModesKHR, "vkGetPhysicalDeviceSurfacePresentModesKHR") - set_proc_address(&GetPhysicalDevicePresentRectanglesKHR, "vkGetPhysicalDevicePresentRectanglesKHR") - set_proc_address(&GetPhysicalDeviceDisplayPropertiesKHR, "vkGetPhysicalDeviceDisplayPropertiesKHR") - set_proc_address(&GetPhysicalDeviceDisplayPlanePropertiesKHR, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR") - set_proc_address(&GetDisplayPlaneSupportedDisplaysKHR, "vkGetDisplayPlaneSupportedDisplaysKHR") - set_proc_address(&GetDisplayModePropertiesKHR, "vkGetDisplayModePropertiesKHR") - set_proc_address(&CreateDisplayModeKHR, "vkCreateDisplayModeKHR") - set_proc_address(&GetDisplayPlaneCapabilitiesKHR, "vkGetDisplayPlaneCapabilitiesKHR") - set_proc_address(&CreateDisplayPlaneSurfaceKHR, "vkCreateDisplayPlaneSurfaceKHR") - set_proc_address(&GetPhysicalDeviceFeatures2KHR, "vkGetPhysicalDeviceFeatures2KHR") - set_proc_address(&GetPhysicalDeviceProperties2KHR, "vkGetPhysicalDeviceProperties2KHR") - set_proc_address(&GetPhysicalDeviceFormatProperties2KHR, "vkGetPhysicalDeviceFormatProperties2KHR") - set_proc_address(&GetPhysicalDeviceImageFormatProperties2KHR, "vkGetPhysicalDeviceImageFormatProperties2KHR") - set_proc_address(&GetPhysicalDeviceQueueFamilyProperties2KHR, "vkGetPhysicalDeviceQueueFamilyProperties2KHR") - set_proc_address(&GetPhysicalDeviceMemoryProperties2KHR, "vkGetPhysicalDeviceMemoryProperties2KHR") - set_proc_address(&GetPhysicalDeviceSparseImageFormatProperties2KHR, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR") - set_proc_address(&EnumeratePhysicalDeviceGroupsKHR, "vkEnumeratePhysicalDeviceGroupsKHR") - set_proc_address(&GetPhysicalDeviceExternalBufferPropertiesKHR, "vkGetPhysicalDeviceExternalBufferPropertiesKHR") - set_proc_address(&GetPhysicalDeviceExternalSemaphorePropertiesKHR, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR") - set_proc_address(&GetPhysicalDeviceExternalFencePropertiesKHR, "vkGetPhysicalDeviceExternalFencePropertiesKHR") - set_proc_address(&EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR") - set_proc_address(&GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR") - set_proc_address(&GetPhysicalDeviceSurfaceCapabilities2KHR, "vkGetPhysicalDeviceSurfaceCapabilities2KHR") - set_proc_address(&GetPhysicalDeviceSurfaceFormats2KHR, "vkGetPhysicalDeviceSurfaceFormats2KHR") - set_proc_address(&GetPhysicalDeviceDisplayProperties2KHR, "vkGetPhysicalDeviceDisplayProperties2KHR") - set_proc_address(&GetPhysicalDeviceDisplayPlaneProperties2KHR, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR") - set_proc_address(&GetDisplayModeProperties2KHR, "vkGetDisplayModeProperties2KHR") - set_proc_address(&GetDisplayPlaneCapabilities2KHR, "vkGetDisplayPlaneCapabilities2KHR") - set_proc_address(&GetPhysicalDeviceFragmentShadingRatesKHR, "vkGetPhysicalDeviceFragmentShadingRatesKHR") - set_proc_address(&CreateDebugReportCallbackEXT, "vkCreateDebugReportCallbackEXT") - set_proc_address(&DestroyDebugReportCallbackEXT, "vkDestroyDebugReportCallbackEXT") - set_proc_address(&DebugReportMessageEXT, "vkDebugReportMessageEXT") - set_proc_address(&GetPhysicalDeviceExternalImageFormatPropertiesNV, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV") - set_proc_address(&ReleaseDisplayEXT, "vkReleaseDisplayEXT") - set_proc_address(&GetPhysicalDeviceSurfaceCapabilities2EXT, "vkGetPhysicalDeviceSurfaceCapabilities2EXT") - set_proc_address(&CreateDebugUtilsMessengerEXT, "vkCreateDebugUtilsMessengerEXT") - set_proc_address(&DestroyDebugUtilsMessengerEXT, "vkDestroyDebugUtilsMessengerEXT") - set_proc_address(&SubmitDebugUtilsMessageEXT, "vkSubmitDebugUtilsMessageEXT") - set_proc_address(&GetPhysicalDeviceMultisamplePropertiesEXT, "vkGetPhysicalDeviceMultisamplePropertiesEXT") - set_proc_address(&GetPhysicalDeviceCalibrateableTimeDomainsEXT, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT") - set_proc_address(&GetPhysicalDeviceToolPropertiesEXT, "vkGetPhysicalDeviceToolPropertiesEXT") - set_proc_address(&GetPhysicalDeviceCooperativeMatrixPropertiesNV, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV") - set_proc_address(&GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV") - set_proc_address(&CreateHeadlessSurfaceEXT, "vkCreateHeadlessSurfaceEXT") - set_proc_address(&AcquireDrmDisplayEXT, "vkAcquireDrmDisplayEXT") - set_proc_address(&GetDrmDisplayEXT, "vkGetDrmDisplayEXT") - set_proc_address(&AcquireWinrtDisplayNV, "vkAcquireWinrtDisplayNV") - set_proc_address(&GetWinrtDisplayNV, "vkGetWinrtDisplayNV") - set_proc_address(&CreateWin32SurfaceKHR, "vkCreateWin32SurfaceKHR") - set_proc_address(&GetPhysicalDeviceWin32PresentationSupportKHR, "vkGetPhysicalDeviceWin32PresentationSupportKHR") - set_proc_address(&GetPhysicalDeviceSurfacePresentModes2EXT, "vkGetPhysicalDeviceSurfacePresentModes2EXT") - set_proc_address(&CreateMetalSurfaceEXT, "vkCreateMetalSurfaceEXT") - set_proc_address(&CreateMacOSSurfaceMVK, "vkCreateMacOSSurfaceMVK") - set_proc_address(&CreateIOSSurfaceMVK, "vkCreateIOSSurfaceMVK") +// Instance Procedures +AcquireDrmDisplayEXT: ProcAcquireDrmDisplayEXT +AcquireWinrtDisplayNV: ProcAcquireWinrtDisplayNV +CreateDebugReportCallbackEXT: ProcCreateDebugReportCallbackEXT +CreateDebugUtilsMessengerEXT: ProcCreateDebugUtilsMessengerEXT +CreateDevice: ProcCreateDevice +CreateDisplayModeKHR: ProcCreateDisplayModeKHR +CreateDisplayPlaneSurfaceKHR: ProcCreateDisplayPlaneSurfaceKHR +CreateHeadlessSurfaceEXT: ProcCreateHeadlessSurfaceEXT +CreateIOSSurfaceMVK: ProcCreateIOSSurfaceMVK +CreateMacOSSurfaceMVK: ProcCreateMacOSSurfaceMVK +CreateMetalSurfaceEXT: ProcCreateMetalSurfaceEXT +CreateWin32SurfaceKHR: ProcCreateWin32SurfaceKHR +DebugReportMessageEXT: ProcDebugReportMessageEXT +DestroyDebugReportCallbackEXT: ProcDestroyDebugReportCallbackEXT +DestroyDebugUtilsMessengerEXT: ProcDestroyDebugUtilsMessengerEXT +DestroyInstance: ProcDestroyInstance +DestroySurfaceKHR: ProcDestroySurfaceKHR +EnumerateDeviceExtensionProperties: ProcEnumerateDeviceExtensionProperties +EnumerateDeviceLayerProperties: ProcEnumerateDeviceLayerProperties +EnumeratePhysicalDeviceGroups: ProcEnumeratePhysicalDeviceGroups +EnumeratePhysicalDeviceGroupsKHR: ProcEnumeratePhysicalDeviceGroupsKHR +EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR: ProcEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR +EnumeratePhysicalDevices: ProcEnumeratePhysicalDevices +GetDisplayModeProperties2KHR: ProcGetDisplayModeProperties2KHR +GetDisplayModePropertiesKHR: ProcGetDisplayModePropertiesKHR +GetDisplayPlaneCapabilities2KHR: ProcGetDisplayPlaneCapabilities2KHR +GetDisplayPlaneCapabilitiesKHR: ProcGetDisplayPlaneCapabilitiesKHR +GetDisplayPlaneSupportedDisplaysKHR: ProcGetDisplayPlaneSupportedDisplaysKHR +GetDrmDisplayEXT: ProcGetDrmDisplayEXT +GetInstanceProcAddr: ProcGetInstanceProcAddr +GetPhysicalDeviceCalibrateableTimeDomainsEXT: ProcGetPhysicalDeviceCalibrateableTimeDomainsEXT +GetPhysicalDeviceCooperativeMatrixPropertiesNV: ProcGetPhysicalDeviceCooperativeMatrixPropertiesNV +GetPhysicalDeviceDisplayPlaneProperties2KHR: ProcGetPhysicalDeviceDisplayPlaneProperties2KHR +GetPhysicalDeviceDisplayPlanePropertiesKHR: ProcGetPhysicalDeviceDisplayPlanePropertiesKHR +GetPhysicalDeviceDisplayProperties2KHR: ProcGetPhysicalDeviceDisplayProperties2KHR +GetPhysicalDeviceDisplayPropertiesKHR: ProcGetPhysicalDeviceDisplayPropertiesKHR +GetPhysicalDeviceExternalBufferProperties: ProcGetPhysicalDeviceExternalBufferProperties +GetPhysicalDeviceExternalBufferPropertiesKHR: ProcGetPhysicalDeviceExternalBufferPropertiesKHR +GetPhysicalDeviceExternalFenceProperties: ProcGetPhysicalDeviceExternalFenceProperties +GetPhysicalDeviceExternalFencePropertiesKHR: ProcGetPhysicalDeviceExternalFencePropertiesKHR +GetPhysicalDeviceExternalImageFormatPropertiesNV: ProcGetPhysicalDeviceExternalImageFormatPropertiesNV +GetPhysicalDeviceExternalSemaphoreProperties: ProcGetPhysicalDeviceExternalSemaphoreProperties +GetPhysicalDeviceExternalSemaphorePropertiesKHR: ProcGetPhysicalDeviceExternalSemaphorePropertiesKHR +GetPhysicalDeviceFeatures: ProcGetPhysicalDeviceFeatures +GetPhysicalDeviceFeatures2: ProcGetPhysicalDeviceFeatures2 +GetPhysicalDeviceFeatures2KHR: ProcGetPhysicalDeviceFeatures2KHR +GetPhysicalDeviceFormatProperties: ProcGetPhysicalDeviceFormatProperties +GetPhysicalDeviceFormatProperties2: ProcGetPhysicalDeviceFormatProperties2 +GetPhysicalDeviceFormatProperties2KHR: ProcGetPhysicalDeviceFormatProperties2KHR +GetPhysicalDeviceFragmentShadingRatesKHR: ProcGetPhysicalDeviceFragmentShadingRatesKHR +GetPhysicalDeviceImageFormatProperties: ProcGetPhysicalDeviceImageFormatProperties +GetPhysicalDeviceImageFormatProperties2: ProcGetPhysicalDeviceImageFormatProperties2 +GetPhysicalDeviceImageFormatProperties2KHR: ProcGetPhysicalDeviceImageFormatProperties2KHR +GetPhysicalDeviceMemoryProperties: ProcGetPhysicalDeviceMemoryProperties +GetPhysicalDeviceMemoryProperties2: ProcGetPhysicalDeviceMemoryProperties2 +GetPhysicalDeviceMemoryProperties2KHR: ProcGetPhysicalDeviceMemoryProperties2KHR +GetPhysicalDeviceMultisamplePropertiesEXT: ProcGetPhysicalDeviceMultisamplePropertiesEXT +GetPhysicalDevicePresentRectanglesKHR: ProcGetPhysicalDevicePresentRectanglesKHR +GetPhysicalDeviceProperties: ProcGetPhysicalDeviceProperties +GetPhysicalDeviceProperties2: ProcGetPhysicalDeviceProperties2 +GetPhysicalDeviceProperties2KHR: ProcGetPhysicalDeviceProperties2KHR +GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR: ProcGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR +GetPhysicalDeviceQueueFamilyProperties: ProcGetPhysicalDeviceQueueFamilyProperties +GetPhysicalDeviceQueueFamilyProperties2: ProcGetPhysicalDeviceQueueFamilyProperties2 +GetPhysicalDeviceQueueFamilyProperties2KHR: ProcGetPhysicalDeviceQueueFamilyProperties2KHR +GetPhysicalDeviceSparseImageFormatProperties: ProcGetPhysicalDeviceSparseImageFormatProperties +GetPhysicalDeviceSparseImageFormatProperties2: ProcGetPhysicalDeviceSparseImageFormatProperties2 +GetPhysicalDeviceSparseImageFormatProperties2KHR: ProcGetPhysicalDeviceSparseImageFormatProperties2KHR +GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV: ProcGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV +GetPhysicalDeviceSurfaceCapabilities2EXT: ProcGetPhysicalDeviceSurfaceCapabilities2EXT +GetPhysicalDeviceSurfaceCapabilities2KHR: ProcGetPhysicalDeviceSurfaceCapabilities2KHR +GetPhysicalDeviceSurfaceCapabilitiesKHR: ProcGetPhysicalDeviceSurfaceCapabilitiesKHR +GetPhysicalDeviceSurfaceFormats2KHR: ProcGetPhysicalDeviceSurfaceFormats2KHR +GetPhysicalDeviceSurfaceFormatsKHR: ProcGetPhysicalDeviceSurfaceFormatsKHR +GetPhysicalDeviceSurfacePresentModes2EXT: ProcGetPhysicalDeviceSurfacePresentModes2EXT +GetPhysicalDeviceSurfacePresentModesKHR: ProcGetPhysicalDeviceSurfacePresentModesKHR +GetPhysicalDeviceSurfaceSupportKHR: ProcGetPhysicalDeviceSurfaceSupportKHR +GetPhysicalDeviceToolPropertiesEXT: ProcGetPhysicalDeviceToolPropertiesEXT +GetPhysicalDeviceWin32PresentationSupportKHR: ProcGetPhysicalDeviceWin32PresentationSupportKHR +GetWinrtDisplayNV: ProcGetWinrtDisplayNV +ReleaseDisplayEXT: ProcReleaseDisplayEXT +SubmitDebugUtilsMessageEXT: ProcSubmitDebugUtilsMessageEXT - // Device Procedures - set_proc_address(&GetDeviceProcAddr, "vkGetDeviceProcAddr") - set_proc_address(&DestroyDevice, "vkDestroyDevice") - set_proc_address(&GetDeviceQueue, "vkGetDeviceQueue") - set_proc_address(&QueueSubmit, "vkQueueSubmit") - set_proc_address(&QueueWaitIdle, "vkQueueWaitIdle") - set_proc_address(&DeviceWaitIdle, "vkDeviceWaitIdle") - set_proc_address(&AllocateMemory, "vkAllocateMemory") - set_proc_address(&FreeMemory, "vkFreeMemory") - set_proc_address(&MapMemory, "vkMapMemory") - set_proc_address(&UnmapMemory, "vkUnmapMemory") - set_proc_address(&FlushMappedMemoryRanges, "vkFlushMappedMemoryRanges") - set_proc_address(&InvalidateMappedMemoryRanges, "vkInvalidateMappedMemoryRanges") - set_proc_address(&GetDeviceMemoryCommitment, "vkGetDeviceMemoryCommitment") - set_proc_address(&BindBufferMemory, "vkBindBufferMemory") - set_proc_address(&BindImageMemory, "vkBindImageMemory") - set_proc_address(&GetBufferMemoryRequirements, "vkGetBufferMemoryRequirements") - set_proc_address(&GetImageMemoryRequirements, "vkGetImageMemoryRequirements") - set_proc_address(&GetImageSparseMemoryRequirements, "vkGetImageSparseMemoryRequirements") - set_proc_address(&QueueBindSparse, "vkQueueBindSparse") - set_proc_address(&CreateFence, "vkCreateFence") - set_proc_address(&DestroyFence, "vkDestroyFence") - set_proc_address(&ResetFences, "vkResetFences") - set_proc_address(&GetFenceStatus, "vkGetFenceStatus") - set_proc_address(&WaitForFences, "vkWaitForFences") - set_proc_address(&CreateSemaphore, "vkCreateSemaphore") - set_proc_address(&DestroySemaphore, "vkDestroySemaphore") - set_proc_address(&CreateEvent, "vkCreateEvent") - set_proc_address(&DestroyEvent, "vkDestroyEvent") - set_proc_address(&GetEventStatus, "vkGetEventStatus") - set_proc_address(&SetEvent, "vkSetEvent") - set_proc_address(&ResetEvent, "vkResetEvent") - set_proc_address(&CreateQueryPool, "vkCreateQueryPool") - set_proc_address(&DestroyQueryPool, "vkDestroyQueryPool") - set_proc_address(&GetQueryPoolResults, "vkGetQueryPoolResults") - set_proc_address(&CreateBuffer, "vkCreateBuffer") - set_proc_address(&DestroyBuffer, "vkDestroyBuffer") - set_proc_address(&CreateBufferView, "vkCreateBufferView") - set_proc_address(&DestroyBufferView, "vkDestroyBufferView") - set_proc_address(&CreateImage, "vkCreateImage") - set_proc_address(&DestroyImage, "vkDestroyImage") - set_proc_address(&GetImageSubresourceLayout, "vkGetImageSubresourceLayout") - set_proc_address(&CreateImageView, "vkCreateImageView") - set_proc_address(&DestroyImageView, "vkDestroyImageView") - set_proc_address(&CreateShaderModule, "vkCreateShaderModule") - set_proc_address(&DestroyShaderModule, "vkDestroyShaderModule") - set_proc_address(&CreatePipelineCache, "vkCreatePipelineCache") - set_proc_address(&DestroyPipelineCache, "vkDestroyPipelineCache") - set_proc_address(&GetPipelineCacheData, "vkGetPipelineCacheData") - set_proc_address(&MergePipelineCaches, "vkMergePipelineCaches") - set_proc_address(&CreateGraphicsPipelines, "vkCreateGraphicsPipelines") - set_proc_address(&CreateComputePipelines, "vkCreateComputePipelines") - set_proc_address(&DestroyPipeline, "vkDestroyPipeline") - set_proc_address(&CreatePipelineLayout, "vkCreatePipelineLayout") - set_proc_address(&DestroyPipelineLayout, "vkDestroyPipelineLayout") - set_proc_address(&CreateSampler, "vkCreateSampler") - set_proc_address(&DestroySampler, "vkDestroySampler") - set_proc_address(&CreateDescriptorSetLayout, "vkCreateDescriptorSetLayout") - set_proc_address(&DestroyDescriptorSetLayout, "vkDestroyDescriptorSetLayout") - set_proc_address(&CreateDescriptorPool, "vkCreateDescriptorPool") - set_proc_address(&DestroyDescriptorPool, "vkDestroyDescriptorPool") - set_proc_address(&ResetDescriptorPool, "vkResetDescriptorPool") - set_proc_address(&AllocateDescriptorSets, "vkAllocateDescriptorSets") - set_proc_address(&FreeDescriptorSets, "vkFreeDescriptorSets") - set_proc_address(&UpdateDescriptorSets, "vkUpdateDescriptorSets") - set_proc_address(&CreateFramebuffer, "vkCreateFramebuffer") - set_proc_address(&DestroyFramebuffer, "vkDestroyFramebuffer") - set_proc_address(&CreateRenderPass, "vkCreateRenderPass") - set_proc_address(&DestroyRenderPass, "vkDestroyRenderPass") - set_proc_address(&GetRenderAreaGranularity, "vkGetRenderAreaGranularity") - set_proc_address(&CreateCommandPool, "vkCreateCommandPool") - set_proc_address(&DestroyCommandPool, "vkDestroyCommandPool") - set_proc_address(&ResetCommandPool, "vkResetCommandPool") - set_proc_address(&AllocateCommandBuffers, "vkAllocateCommandBuffers") - set_proc_address(&FreeCommandBuffers, "vkFreeCommandBuffers") - set_proc_address(&BeginCommandBuffer, "vkBeginCommandBuffer") - set_proc_address(&EndCommandBuffer, "vkEndCommandBuffer") - set_proc_address(&ResetCommandBuffer, "vkResetCommandBuffer") - set_proc_address(&CmdBindPipeline, "vkCmdBindPipeline") - set_proc_address(&CmdSetViewport, "vkCmdSetViewport") - set_proc_address(&CmdSetScissor, "vkCmdSetScissor") - set_proc_address(&CmdSetLineWidth, "vkCmdSetLineWidth") - set_proc_address(&CmdSetDepthBias, "vkCmdSetDepthBias") - set_proc_address(&CmdSetBlendConstants, "vkCmdSetBlendConstants") - set_proc_address(&CmdSetDepthBounds, "vkCmdSetDepthBounds") - set_proc_address(&CmdSetStencilCompareMask, "vkCmdSetStencilCompareMask") - set_proc_address(&CmdSetStencilWriteMask, "vkCmdSetStencilWriteMask") - set_proc_address(&CmdSetStencilReference, "vkCmdSetStencilReference") - set_proc_address(&CmdBindDescriptorSets, "vkCmdBindDescriptorSets") - set_proc_address(&CmdBindIndexBuffer, "vkCmdBindIndexBuffer") - set_proc_address(&CmdBindVertexBuffers, "vkCmdBindVertexBuffers") - set_proc_address(&CmdDraw, "vkCmdDraw") - set_proc_address(&CmdDrawIndexed, "vkCmdDrawIndexed") - set_proc_address(&CmdDrawIndirect, "vkCmdDrawIndirect") - set_proc_address(&CmdDrawIndexedIndirect, "vkCmdDrawIndexedIndirect") - set_proc_address(&CmdDispatch, "vkCmdDispatch") - set_proc_address(&CmdDispatchIndirect, "vkCmdDispatchIndirect") - set_proc_address(&CmdCopyBuffer, "vkCmdCopyBuffer") - set_proc_address(&CmdCopyImage, "vkCmdCopyImage") - set_proc_address(&CmdBlitImage, "vkCmdBlitImage") - set_proc_address(&CmdCopyBufferToImage, "vkCmdCopyBufferToImage") - set_proc_address(&CmdCopyImageToBuffer, "vkCmdCopyImageToBuffer") - set_proc_address(&CmdUpdateBuffer, "vkCmdUpdateBuffer") - set_proc_address(&CmdFillBuffer, "vkCmdFillBuffer") - set_proc_address(&CmdClearColorImage, "vkCmdClearColorImage") - set_proc_address(&CmdClearDepthStencilImage, "vkCmdClearDepthStencilImage") - set_proc_address(&CmdClearAttachments, "vkCmdClearAttachments") - set_proc_address(&CmdResolveImage, "vkCmdResolveImage") - set_proc_address(&CmdSetEvent, "vkCmdSetEvent") - set_proc_address(&CmdResetEvent, "vkCmdResetEvent") - set_proc_address(&CmdWaitEvents, "vkCmdWaitEvents") - set_proc_address(&CmdPipelineBarrier, "vkCmdPipelineBarrier") - set_proc_address(&CmdBeginQuery, "vkCmdBeginQuery") - set_proc_address(&CmdEndQuery, "vkCmdEndQuery") - set_proc_address(&CmdResetQueryPool, "vkCmdResetQueryPool") - set_proc_address(&CmdWriteTimestamp, "vkCmdWriteTimestamp") - set_proc_address(&CmdCopyQueryPoolResults, "vkCmdCopyQueryPoolResults") - set_proc_address(&CmdPushConstants, "vkCmdPushConstants") - set_proc_address(&CmdBeginRenderPass, "vkCmdBeginRenderPass") - set_proc_address(&CmdNextSubpass, "vkCmdNextSubpass") - set_proc_address(&CmdEndRenderPass, "vkCmdEndRenderPass") - set_proc_address(&CmdExecuteCommands, "vkCmdExecuteCommands") - set_proc_address(&BindBufferMemory2, "vkBindBufferMemory2") - set_proc_address(&BindImageMemory2, "vkBindImageMemory2") - set_proc_address(&GetDeviceGroupPeerMemoryFeatures, "vkGetDeviceGroupPeerMemoryFeatures") - set_proc_address(&CmdSetDeviceMask, "vkCmdSetDeviceMask") - set_proc_address(&CmdDispatchBase, "vkCmdDispatchBase") - set_proc_address(&GetImageMemoryRequirements2, "vkGetImageMemoryRequirements2") - set_proc_address(&GetBufferMemoryRequirements2, "vkGetBufferMemoryRequirements2") - set_proc_address(&GetImageSparseMemoryRequirements2, "vkGetImageSparseMemoryRequirements2") - set_proc_address(&TrimCommandPool, "vkTrimCommandPool") - set_proc_address(&GetDeviceQueue2, "vkGetDeviceQueue2") - set_proc_address(&CreateSamplerYcbcrConversion, "vkCreateSamplerYcbcrConversion") - set_proc_address(&DestroySamplerYcbcrConversion, "vkDestroySamplerYcbcrConversion") - set_proc_address(&CreateDescriptorUpdateTemplate, "vkCreateDescriptorUpdateTemplate") - set_proc_address(&DestroyDescriptorUpdateTemplate, "vkDestroyDescriptorUpdateTemplate") - set_proc_address(&UpdateDescriptorSetWithTemplate, "vkUpdateDescriptorSetWithTemplate") - set_proc_address(&GetDescriptorSetLayoutSupport, "vkGetDescriptorSetLayoutSupport") - set_proc_address(&CmdDrawIndirectCount, "vkCmdDrawIndirectCount") - set_proc_address(&CmdDrawIndexedIndirectCount, "vkCmdDrawIndexedIndirectCount") - set_proc_address(&CreateRenderPass2, "vkCreateRenderPass2") - set_proc_address(&CmdBeginRenderPass2, "vkCmdBeginRenderPass2") - set_proc_address(&CmdNextSubpass2, "vkCmdNextSubpass2") - set_proc_address(&CmdEndRenderPass2, "vkCmdEndRenderPass2") - set_proc_address(&ResetQueryPool, "vkResetQueryPool") - set_proc_address(&GetSemaphoreCounterValue, "vkGetSemaphoreCounterValue") - set_proc_address(&WaitSemaphores, "vkWaitSemaphores") - set_proc_address(&SignalSemaphore, "vkSignalSemaphore") - set_proc_address(&GetBufferDeviceAddress, "vkGetBufferDeviceAddress") - set_proc_address(&GetBufferOpaqueCaptureAddress, "vkGetBufferOpaqueCaptureAddress") - set_proc_address(&GetDeviceMemoryOpaqueCaptureAddress, "vkGetDeviceMemoryOpaqueCaptureAddress") - set_proc_address(&CreateSwapchainKHR, "vkCreateSwapchainKHR") - set_proc_address(&DestroySwapchainKHR, "vkDestroySwapchainKHR") - set_proc_address(&GetSwapchainImagesKHR, "vkGetSwapchainImagesKHR") - set_proc_address(&AcquireNextImageKHR, "vkAcquireNextImageKHR") - set_proc_address(&QueuePresentKHR, "vkQueuePresentKHR") - set_proc_address(&GetDeviceGroupPresentCapabilitiesKHR, "vkGetDeviceGroupPresentCapabilitiesKHR") - set_proc_address(&GetDeviceGroupSurfacePresentModesKHR, "vkGetDeviceGroupSurfacePresentModesKHR") - set_proc_address(&AcquireNextImage2KHR, "vkAcquireNextImage2KHR") - set_proc_address(&CreateSharedSwapchainsKHR, "vkCreateSharedSwapchainsKHR") - set_proc_address(&GetDeviceGroupPeerMemoryFeaturesKHR, "vkGetDeviceGroupPeerMemoryFeaturesKHR") - set_proc_address(&CmdSetDeviceMaskKHR, "vkCmdSetDeviceMaskKHR") - set_proc_address(&CmdDispatchBaseKHR, "vkCmdDispatchBaseKHR") - set_proc_address(&TrimCommandPoolKHR, "vkTrimCommandPoolKHR") - set_proc_address(&GetMemoryFdKHR, "vkGetMemoryFdKHR") - set_proc_address(&GetMemoryFdPropertiesKHR, "vkGetMemoryFdPropertiesKHR") - set_proc_address(&ImportSemaphoreFdKHR, "vkImportSemaphoreFdKHR") - set_proc_address(&GetSemaphoreFdKHR, "vkGetSemaphoreFdKHR") - set_proc_address(&CmdPushDescriptorSetKHR, "vkCmdPushDescriptorSetKHR") - set_proc_address(&CmdPushDescriptorSetWithTemplateKHR, "vkCmdPushDescriptorSetWithTemplateKHR") - set_proc_address(&CreateDescriptorUpdateTemplateKHR, "vkCreateDescriptorUpdateTemplateKHR") - set_proc_address(&DestroyDescriptorUpdateTemplateKHR, "vkDestroyDescriptorUpdateTemplateKHR") - set_proc_address(&UpdateDescriptorSetWithTemplateKHR, "vkUpdateDescriptorSetWithTemplateKHR") - set_proc_address(&CreateRenderPass2KHR, "vkCreateRenderPass2KHR") - set_proc_address(&CmdBeginRenderPass2KHR, "vkCmdBeginRenderPass2KHR") - set_proc_address(&CmdNextSubpass2KHR, "vkCmdNextSubpass2KHR") - set_proc_address(&CmdEndRenderPass2KHR, "vkCmdEndRenderPass2KHR") - set_proc_address(&GetSwapchainStatusKHR, "vkGetSwapchainStatusKHR") - set_proc_address(&ImportFenceFdKHR, "vkImportFenceFdKHR") - set_proc_address(&GetFenceFdKHR, "vkGetFenceFdKHR") - set_proc_address(&AcquireProfilingLockKHR, "vkAcquireProfilingLockKHR") - set_proc_address(&ReleaseProfilingLockKHR, "vkReleaseProfilingLockKHR") - set_proc_address(&GetImageMemoryRequirements2KHR, "vkGetImageMemoryRequirements2KHR") - set_proc_address(&GetBufferMemoryRequirements2KHR, "vkGetBufferMemoryRequirements2KHR") - set_proc_address(&GetImageSparseMemoryRequirements2KHR, "vkGetImageSparseMemoryRequirements2KHR") - set_proc_address(&CreateSamplerYcbcrConversionKHR, "vkCreateSamplerYcbcrConversionKHR") - set_proc_address(&DestroySamplerYcbcrConversionKHR, "vkDestroySamplerYcbcrConversionKHR") - set_proc_address(&BindBufferMemory2KHR, "vkBindBufferMemory2KHR") - set_proc_address(&BindImageMemory2KHR, "vkBindImageMemory2KHR") - set_proc_address(&GetDescriptorSetLayoutSupportKHR, "vkGetDescriptorSetLayoutSupportKHR") - set_proc_address(&CmdDrawIndirectCountKHR, "vkCmdDrawIndirectCountKHR") - set_proc_address(&CmdDrawIndexedIndirectCountKHR, "vkCmdDrawIndexedIndirectCountKHR") - set_proc_address(&GetSemaphoreCounterValueKHR, "vkGetSemaphoreCounterValueKHR") - set_proc_address(&WaitSemaphoresKHR, "vkWaitSemaphoresKHR") - set_proc_address(&SignalSemaphoreKHR, "vkSignalSemaphoreKHR") - set_proc_address(&CmdSetFragmentShadingRateKHR, "vkCmdSetFragmentShadingRateKHR") - set_proc_address(&WaitForPresentKHR, "vkWaitForPresentKHR") - set_proc_address(&GetBufferDeviceAddressKHR, "vkGetBufferDeviceAddressKHR") - set_proc_address(&GetBufferOpaqueCaptureAddressKHR, "vkGetBufferOpaqueCaptureAddressKHR") - set_proc_address(&GetDeviceMemoryOpaqueCaptureAddressKHR, "vkGetDeviceMemoryOpaqueCaptureAddressKHR") - set_proc_address(&CreateDeferredOperationKHR, "vkCreateDeferredOperationKHR") - set_proc_address(&DestroyDeferredOperationKHR, "vkDestroyDeferredOperationKHR") - set_proc_address(&GetDeferredOperationMaxConcurrencyKHR, "vkGetDeferredOperationMaxConcurrencyKHR") - set_proc_address(&GetDeferredOperationResultKHR, "vkGetDeferredOperationResultKHR") - set_proc_address(&DeferredOperationJoinKHR, "vkDeferredOperationJoinKHR") - set_proc_address(&GetPipelineExecutablePropertiesKHR, "vkGetPipelineExecutablePropertiesKHR") - set_proc_address(&GetPipelineExecutableStatisticsKHR, "vkGetPipelineExecutableStatisticsKHR") - set_proc_address(&GetPipelineExecutableInternalRepresentationsKHR, "vkGetPipelineExecutableInternalRepresentationsKHR") - set_proc_address(&CmdSetEvent2KHR, "vkCmdSetEvent2KHR") - set_proc_address(&CmdResetEvent2KHR, "vkCmdResetEvent2KHR") - set_proc_address(&CmdWaitEvents2KHR, "vkCmdWaitEvents2KHR") - set_proc_address(&CmdPipelineBarrier2KHR, "vkCmdPipelineBarrier2KHR") - set_proc_address(&CmdWriteTimestamp2KHR, "vkCmdWriteTimestamp2KHR") - set_proc_address(&QueueSubmit2KHR, "vkQueueSubmit2KHR") - set_proc_address(&CmdWriteBufferMarker2AMD, "vkCmdWriteBufferMarker2AMD") - set_proc_address(&GetQueueCheckpointData2NV, "vkGetQueueCheckpointData2NV") - set_proc_address(&CmdCopyBuffer2KHR, "vkCmdCopyBuffer2KHR") - set_proc_address(&CmdCopyImage2KHR, "vkCmdCopyImage2KHR") - set_proc_address(&CmdCopyBufferToImage2KHR, "vkCmdCopyBufferToImage2KHR") - set_proc_address(&CmdCopyImageToBuffer2KHR, "vkCmdCopyImageToBuffer2KHR") - set_proc_address(&CmdBlitImage2KHR, "vkCmdBlitImage2KHR") - set_proc_address(&CmdResolveImage2KHR, "vkCmdResolveImage2KHR") - set_proc_address(&DebugMarkerSetObjectTagEXT, "vkDebugMarkerSetObjectTagEXT") - set_proc_address(&DebugMarkerSetObjectNameEXT, "vkDebugMarkerSetObjectNameEXT") - set_proc_address(&CmdDebugMarkerBeginEXT, "vkCmdDebugMarkerBeginEXT") - set_proc_address(&CmdDebugMarkerEndEXT, "vkCmdDebugMarkerEndEXT") - set_proc_address(&CmdDebugMarkerInsertEXT, "vkCmdDebugMarkerInsertEXT") - set_proc_address(&CmdBindTransformFeedbackBuffersEXT, "vkCmdBindTransformFeedbackBuffersEXT") - set_proc_address(&CmdBeginTransformFeedbackEXT, "vkCmdBeginTransformFeedbackEXT") - set_proc_address(&CmdEndTransformFeedbackEXT, "vkCmdEndTransformFeedbackEXT") - set_proc_address(&CmdBeginQueryIndexedEXT, "vkCmdBeginQueryIndexedEXT") - set_proc_address(&CmdEndQueryIndexedEXT, "vkCmdEndQueryIndexedEXT") - set_proc_address(&CmdDrawIndirectByteCountEXT, "vkCmdDrawIndirectByteCountEXT") - set_proc_address(&CreateCuModuleNVX, "vkCreateCuModuleNVX") - set_proc_address(&CreateCuFunctionNVX, "vkCreateCuFunctionNVX") - set_proc_address(&DestroyCuModuleNVX, "vkDestroyCuModuleNVX") - set_proc_address(&DestroyCuFunctionNVX, "vkDestroyCuFunctionNVX") - set_proc_address(&CmdCuLaunchKernelNVX, "vkCmdCuLaunchKernelNVX") - set_proc_address(&GetImageViewHandleNVX, "vkGetImageViewHandleNVX") - set_proc_address(&GetImageViewAddressNVX, "vkGetImageViewAddressNVX") - set_proc_address(&CmdDrawIndirectCountAMD, "vkCmdDrawIndirectCountAMD") - set_proc_address(&CmdDrawIndexedIndirectCountAMD, "vkCmdDrawIndexedIndirectCountAMD") - set_proc_address(&GetShaderInfoAMD, "vkGetShaderInfoAMD") - set_proc_address(&CmdBeginConditionalRenderingEXT, "vkCmdBeginConditionalRenderingEXT") - set_proc_address(&CmdEndConditionalRenderingEXT, "vkCmdEndConditionalRenderingEXT") - set_proc_address(&CmdSetViewportWScalingNV, "vkCmdSetViewportWScalingNV") - set_proc_address(&DisplayPowerControlEXT, "vkDisplayPowerControlEXT") - set_proc_address(&RegisterDeviceEventEXT, "vkRegisterDeviceEventEXT") - set_proc_address(&RegisterDisplayEventEXT, "vkRegisterDisplayEventEXT") - set_proc_address(&GetSwapchainCounterEXT, "vkGetSwapchainCounterEXT") - set_proc_address(&GetRefreshCycleDurationGOOGLE, "vkGetRefreshCycleDurationGOOGLE") - set_proc_address(&GetPastPresentationTimingGOOGLE, "vkGetPastPresentationTimingGOOGLE") - set_proc_address(&CmdSetDiscardRectangleEXT, "vkCmdSetDiscardRectangleEXT") - set_proc_address(&SetHdrMetadataEXT, "vkSetHdrMetadataEXT") - set_proc_address(&SetDebugUtilsObjectNameEXT, "vkSetDebugUtilsObjectNameEXT") - set_proc_address(&SetDebugUtilsObjectTagEXT, "vkSetDebugUtilsObjectTagEXT") - set_proc_address(&QueueBeginDebugUtilsLabelEXT, "vkQueueBeginDebugUtilsLabelEXT") - set_proc_address(&QueueEndDebugUtilsLabelEXT, "vkQueueEndDebugUtilsLabelEXT") - set_proc_address(&QueueInsertDebugUtilsLabelEXT, "vkQueueInsertDebugUtilsLabelEXT") - set_proc_address(&CmdBeginDebugUtilsLabelEXT, "vkCmdBeginDebugUtilsLabelEXT") - set_proc_address(&CmdEndDebugUtilsLabelEXT, "vkCmdEndDebugUtilsLabelEXT") - set_proc_address(&CmdInsertDebugUtilsLabelEXT, "vkCmdInsertDebugUtilsLabelEXT") - set_proc_address(&CmdSetSampleLocationsEXT, "vkCmdSetSampleLocationsEXT") - set_proc_address(&GetImageDrmFormatModifierPropertiesEXT, "vkGetImageDrmFormatModifierPropertiesEXT") - set_proc_address(&CreateValidationCacheEXT, "vkCreateValidationCacheEXT") - set_proc_address(&DestroyValidationCacheEXT, "vkDestroyValidationCacheEXT") - set_proc_address(&MergeValidationCachesEXT, "vkMergeValidationCachesEXT") - set_proc_address(&GetValidationCacheDataEXT, "vkGetValidationCacheDataEXT") - set_proc_address(&CmdBindShadingRateImageNV, "vkCmdBindShadingRateImageNV") - set_proc_address(&CmdSetViewportShadingRatePaletteNV, "vkCmdSetViewportShadingRatePaletteNV") - set_proc_address(&CmdSetCoarseSampleOrderNV, "vkCmdSetCoarseSampleOrderNV") - set_proc_address(&CreateAccelerationStructureNV, "vkCreateAccelerationStructureNV") - set_proc_address(&DestroyAccelerationStructureNV, "vkDestroyAccelerationStructureNV") - set_proc_address(&GetAccelerationStructureMemoryRequirementsNV, "vkGetAccelerationStructureMemoryRequirementsNV") - set_proc_address(&BindAccelerationStructureMemoryNV, "vkBindAccelerationStructureMemoryNV") - set_proc_address(&CmdBuildAccelerationStructureNV, "vkCmdBuildAccelerationStructureNV") - set_proc_address(&CmdCopyAccelerationStructureNV, "vkCmdCopyAccelerationStructureNV") - set_proc_address(&CmdTraceRaysNV, "vkCmdTraceRaysNV") - set_proc_address(&CreateRayTracingPipelinesNV, "vkCreateRayTracingPipelinesNV") - set_proc_address(&GetRayTracingShaderGroupHandlesKHR, "vkGetRayTracingShaderGroupHandlesKHR") - set_proc_address(&GetRayTracingShaderGroupHandlesNV, "vkGetRayTracingShaderGroupHandlesNV") - set_proc_address(&GetAccelerationStructureHandleNV, "vkGetAccelerationStructureHandleNV") - set_proc_address(&CmdWriteAccelerationStructuresPropertiesNV, "vkCmdWriteAccelerationStructuresPropertiesNV") - set_proc_address(&CompileDeferredNV, "vkCompileDeferredNV") - set_proc_address(&GetMemoryHostPointerPropertiesEXT, "vkGetMemoryHostPointerPropertiesEXT") - set_proc_address(&CmdWriteBufferMarkerAMD, "vkCmdWriteBufferMarkerAMD") - set_proc_address(&GetCalibratedTimestampsEXT, "vkGetCalibratedTimestampsEXT") - set_proc_address(&CmdDrawMeshTasksNV, "vkCmdDrawMeshTasksNV") - set_proc_address(&CmdDrawMeshTasksIndirectNV, "vkCmdDrawMeshTasksIndirectNV") - set_proc_address(&CmdDrawMeshTasksIndirectCountNV, "vkCmdDrawMeshTasksIndirectCountNV") - set_proc_address(&CmdSetExclusiveScissorNV, "vkCmdSetExclusiveScissorNV") - set_proc_address(&CmdSetCheckpointNV, "vkCmdSetCheckpointNV") - set_proc_address(&GetQueueCheckpointDataNV, "vkGetQueueCheckpointDataNV") - set_proc_address(&InitializePerformanceApiINTEL, "vkInitializePerformanceApiINTEL") - set_proc_address(&UninitializePerformanceApiINTEL, "vkUninitializePerformanceApiINTEL") - set_proc_address(&CmdSetPerformanceMarkerINTEL, "vkCmdSetPerformanceMarkerINTEL") - set_proc_address(&CmdSetPerformanceStreamMarkerINTEL, "vkCmdSetPerformanceStreamMarkerINTEL") - set_proc_address(&CmdSetPerformanceOverrideINTEL, "vkCmdSetPerformanceOverrideINTEL") - set_proc_address(&AcquirePerformanceConfigurationINTEL, "vkAcquirePerformanceConfigurationINTEL") - set_proc_address(&ReleasePerformanceConfigurationINTEL, "vkReleasePerformanceConfigurationINTEL") - set_proc_address(&QueueSetPerformanceConfigurationINTEL, "vkQueueSetPerformanceConfigurationINTEL") - set_proc_address(&GetPerformanceParameterINTEL, "vkGetPerformanceParameterINTEL") - set_proc_address(&SetLocalDimmingAMD, "vkSetLocalDimmingAMD") - set_proc_address(&GetBufferDeviceAddressEXT, "vkGetBufferDeviceAddressEXT") - set_proc_address(&CmdSetLineStippleEXT, "vkCmdSetLineStippleEXT") - set_proc_address(&ResetQueryPoolEXT, "vkResetQueryPoolEXT") - set_proc_address(&CmdSetCullModeEXT, "vkCmdSetCullModeEXT") - set_proc_address(&CmdSetFrontFaceEXT, "vkCmdSetFrontFaceEXT") - set_proc_address(&CmdSetPrimitiveTopologyEXT, "vkCmdSetPrimitiveTopologyEXT") - set_proc_address(&CmdSetViewportWithCountEXT, "vkCmdSetViewportWithCountEXT") - set_proc_address(&CmdSetScissorWithCountEXT, "vkCmdSetScissorWithCountEXT") - set_proc_address(&CmdBindVertexBuffers2EXT, "vkCmdBindVertexBuffers2EXT") - set_proc_address(&CmdSetDepthTestEnableEXT, "vkCmdSetDepthTestEnableEXT") - set_proc_address(&CmdSetDepthWriteEnableEXT, "vkCmdSetDepthWriteEnableEXT") - set_proc_address(&CmdSetDepthCompareOpEXT, "vkCmdSetDepthCompareOpEXT") - set_proc_address(&CmdSetDepthBoundsTestEnableEXT, "vkCmdSetDepthBoundsTestEnableEXT") - set_proc_address(&CmdSetStencilTestEnableEXT, "vkCmdSetStencilTestEnableEXT") - set_proc_address(&CmdSetStencilOpEXT, "vkCmdSetStencilOpEXT") - set_proc_address(&GetGeneratedCommandsMemoryRequirementsNV, "vkGetGeneratedCommandsMemoryRequirementsNV") - set_proc_address(&CmdPreprocessGeneratedCommandsNV, "vkCmdPreprocessGeneratedCommandsNV") - set_proc_address(&CmdExecuteGeneratedCommandsNV, "vkCmdExecuteGeneratedCommandsNV") - set_proc_address(&CmdBindPipelineShaderGroupNV, "vkCmdBindPipelineShaderGroupNV") - set_proc_address(&CreateIndirectCommandsLayoutNV, "vkCreateIndirectCommandsLayoutNV") - set_proc_address(&DestroyIndirectCommandsLayoutNV, "vkDestroyIndirectCommandsLayoutNV") - set_proc_address(&CreatePrivateDataSlotEXT, "vkCreatePrivateDataSlotEXT") - set_proc_address(&DestroyPrivateDataSlotEXT, "vkDestroyPrivateDataSlotEXT") - set_proc_address(&SetPrivateDataEXT, "vkSetPrivateDataEXT") - set_proc_address(&GetPrivateDataEXT, "vkGetPrivateDataEXT") - set_proc_address(&CmdSetFragmentShadingRateEnumNV, "vkCmdSetFragmentShadingRateEnumNV") - set_proc_address(&CmdSetVertexInputEXT, "vkCmdSetVertexInputEXT") - set_proc_address(&GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI") - set_proc_address(&CmdSubpassShadingHUAWEI, "vkCmdSubpassShadingHUAWEI") - set_proc_address(&CmdBindInvocationMaskHUAWEI, "vkCmdBindInvocationMaskHUAWEI") - set_proc_address(&GetMemoryRemoteAddressNV, "vkGetMemoryRemoteAddressNV") - set_proc_address(&CmdSetPatchControlPointsEXT, "vkCmdSetPatchControlPointsEXT") - set_proc_address(&CmdSetRasterizerDiscardEnableEXT, "vkCmdSetRasterizerDiscardEnableEXT") - set_proc_address(&CmdSetDepthBiasEnableEXT, "vkCmdSetDepthBiasEnableEXT") - set_proc_address(&CmdSetLogicOpEXT, "vkCmdSetLogicOpEXT") - set_proc_address(&CmdSetPrimitiveRestartEnableEXT, "vkCmdSetPrimitiveRestartEnableEXT") - set_proc_address(&CmdDrawMultiEXT, "vkCmdDrawMultiEXT") - set_proc_address(&CmdDrawMultiIndexedEXT, "vkCmdDrawMultiIndexedEXT") - set_proc_address(&SetDeviceMemoryPriorityEXT, "vkSetDeviceMemoryPriorityEXT") - set_proc_address(&CreateAccelerationStructureKHR, "vkCreateAccelerationStructureKHR") - set_proc_address(&DestroyAccelerationStructureKHR, "vkDestroyAccelerationStructureKHR") - set_proc_address(&CmdBuildAccelerationStructuresKHR, "vkCmdBuildAccelerationStructuresKHR") - set_proc_address(&CmdBuildAccelerationStructuresIndirectKHR, "vkCmdBuildAccelerationStructuresIndirectKHR") - set_proc_address(&BuildAccelerationStructuresKHR, "vkBuildAccelerationStructuresKHR") - set_proc_address(&CopyAccelerationStructureKHR, "vkCopyAccelerationStructureKHR") - set_proc_address(&CopyAccelerationStructureToMemoryKHR, "vkCopyAccelerationStructureToMemoryKHR") - set_proc_address(&CopyMemoryToAccelerationStructureKHR, "vkCopyMemoryToAccelerationStructureKHR") - set_proc_address(&WriteAccelerationStructuresPropertiesKHR, "vkWriteAccelerationStructuresPropertiesKHR") - set_proc_address(&CmdCopyAccelerationStructureKHR, "vkCmdCopyAccelerationStructureKHR") - set_proc_address(&CmdCopyAccelerationStructureToMemoryKHR, "vkCmdCopyAccelerationStructureToMemoryKHR") - set_proc_address(&CmdCopyMemoryToAccelerationStructureKHR, "vkCmdCopyMemoryToAccelerationStructureKHR") - set_proc_address(&GetAccelerationStructureDeviceAddressKHR, "vkGetAccelerationStructureDeviceAddressKHR") - set_proc_address(&CmdWriteAccelerationStructuresPropertiesKHR, "vkCmdWriteAccelerationStructuresPropertiesKHR") - set_proc_address(&GetDeviceAccelerationStructureCompatibilityKHR, "vkGetDeviceAccelerationStructureCompatibilityKHR") - set_proc_address(&GetAccelerationStructureBuildSizesKHR, "vkGetAccelerationStructureBuildSizesKHR") - set_proc_address(&CmdTraceRaysKHR, "vkCmdTraceRaysKHR") - set_proc_address(&CreateRayTracingPipelinesKHR, "vkCreateRayTracingPipelinesKHR") - set_proc_address(&GetRayTracingCaptureReplayShaderGroupHandlesKHR, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR") - set_proc_address(&CmdTraceRaysIndirectKHR, "vkCmdTraceRaysIndirectKHR") - set_proc_address(&GetRayTracingShaderGroupStackSizeKHR, "vkGetRayTracingShaderGroupStackSizeKHR") - set_proc_address(&CmdSetRayTracingPipelineStackSizeKHR, "vkCmdSetRayTracingPipelineStackSizeKHR") - set_proc_address(&GetMemoryWin32HandleKHR, "vkGetMemoryWin32HandleKHR") - set_proc_address(&GetMemoryWin32HandlePropertiesKHR, "vkGetMemoryWin32HandlePropertiesKHR") - set_proc_address(&ImportSemaphoreWin32HandleKHR, "vkImportSemaphoreWin32HandleKHR") - set_proc_address(&GetSemaphoreWin32HandleKHR, "vkGetSemaphoreWin32HandleKHR") - set_proc_address(&ImportFenceWin32HandleKHR, "vkImportFenceWin32HandleKHR") - set_proc_address(&GetFenceWin32HandleKHR, "vkGetFenceWin32HandleKHR") - set_proc_address(&GetMemoryWin32HandleNV, "vkGetMemoryWin32HandleNV") - set_proc_address(&AcquireFullScreenExclusiveModeEXT, "vkAcquireFullScreenExclusiveModeEXT") - set_proc_address(&ReleaseFullScreenExclusiveModeEXT, "vkReleaseFullScreenExclusiveModeEXT") - set_proc_address(&GetDeviceGroupSurfacePresentModes2EXT, "vkGetDeviceGroupSurfacePresentModes2EXT") +// Device Procedures +AcquireFullScreenExclusiveModeEXT: ProcAcquireFullScreenExclusiveModeEXT +AcquireNextImage2KHR: ProcAcquireNextImage2KHR +AcquireNextImageKHR: ProcAcquireNextImageKHR +AcquirePerformanceConfigurationINTEL: ProcAcquirePerformanceConfigurationINTEL +AcquireProfilingLockKHR: ProcAcquireProfilingLockKHR +AllocateCommandBuffers: ProcAllocateCommandBuffers +AllocateDescriptorSets: ProcAllocateDescriptorSets +AllocateMemory: ProcAllocateMemory +BeginCommandBuffer: ProcBeginCommandBuffer +BindAccelerationStructureMemoryNV: ProcBindAccelerationStructureMemoryNV +BindBufferMemory: ProcBindBufferMemory +BindBufferMemory2: ProcBindBufferMemory2 +BindBufferMemory2KHR: ProcBindBufferMemory2KHR +BindImageMemory: ProcBindImageMemory +BindImageMemory2: ProcBindImageMemory2 +BindImageMemory2KHR: ProcBindImageMemory2KHR +BuildAccelerationStructuresKHR: ProcBuildAccelerationStructuresKHR +CmdBeginConditionalRenderingEXT: ProcCmdBeginConditionalRenderingEXT +CmdBeginDebugUtilsLabelEXT: ProcCmdBeginDebugUtilsLabelEXT +CmdBeginQuery: ProcCmdBeginQuery +CmdBeginQueryIndexedEXT: ProcCmdBeginQueryIndexedEXT +CmdBeginRenderPass: ProcCmdBeginRenderPass +CmdBeginRenderPass2: ProcCmdBeginRenderPass2 +CmdBeginRenderPass2KHR: ProcCmdBeginRenderPass2KHR +CmdBeginTransformFeedbackEXT: ProcCmdBeginTransformFeedbackEXT +CmdBindDescriptorSets: ProcCmdBindDescriptorSets +CmdBindIndexBuffer: ProcCmdBindIndexBuffer +CmdBindInvocationMaskHUAWEI: ProcCmdBindInvocationMaskHUAWEI +CmdBindPipeline: ProcCmdBindPipeline +CmdBindPipelineShaderGroupNV: ProcCmdBindPipelineShaderGroupNV +CmdBindShadingRateImageNV: ProcCmdBindShadingRateImageNV +CmdBindTransformFeedbackBuffersEXT: ProcCmdBindTransformFeedbackBuffersEXT +CmdBindVertexBuffers: ProcCmdBindVertexBuffers +CmdBindVertexBuffers2EXT: ProcCmdBindVertexBuffers2EXT +CmdBlitImage: ProcCmdBlitImage +CmdBlitImage2KHR: ProcCmdBlitImage2KHR +CmdBuildAccelerationStructureNV: ProcCmdBuildAccelerationStructureNV +CmdBuildAccelerationStructuresIndirectKHR: ProcCmdBuildAccelerationStructuresIndirectKHR +CmdBuildAccelerationStructuresKHR: ProcCmdBuildAccelerationStructuresKHR +CmdClearAttachments: ProcCmdClearAttachments +CmdClearColorImage: ProcCmdClearColorImage +CmdClearDepthStencilImage: ProcCmdClearDepthStencilImage +CmdCopyAccelerationStructureKHR: ProcCmdCopyAccelerationStructureKHR +CmdCopyAccelerationStructureNV: ProcCmdCopyAccelerationStructureNV +CmdCopyAccelerationStructureToMemoryKHR: ProcCmdCopyAccelerationStructureToMemoryKHR +CmdCopyBuffer: ProcCmdCopyBuffer +CmdCopyBuffer2KHR: ProcCmdCopyBuffer2KHR +CmdCopyBufferToImage: ProcCmdCopyBufferToImage +CmdCopyBufferToImage2KHR: ProcCmdCopyBufferToImage2KHR +CmdCopyImage: ProcCmdCopyImage +CmdCopyImage2KHR: ProcCmdCopyImage2KHR +CmdCopyImageToBuffer: ProcCmdCopyImageToBuffer +CmdCopyImageToBuffer2KHR: ProcCmdCopyImageToBuffer2KHR +CmdCopyMemoryToAccelerationStructureKHR: ProcCmdCopyMemoryToAccelerationStructureKHR +CmdCopyQueryPoolResults: ProcCmdCopyQueryPoolResults +CmdCuLaunchKernelNVX: ProcCmdCuLaunchKernelNVX +CmdDebugMarkerBeginEXT: ProcCmdDebugMarkerBeginEXT +CmdDebugMarkerEndEXT: ProcCmdDebugMarkerEndEXT +CmdDebugMarkerInsertEXT: ProcCmdDebugMarkerInsertEXT +CmdDispatch: ProcCmdDispatch +CmdDispatchBase: ProcCmdDispatchBase +CmdDispatchBaseKHR: ProcCmdDispatchBaseKHR +CmdDispatchIndirect: ProcCmdDispatchIndirect +CmdDraw: ProcCmdDraw +CmdDrawIndexed: ProcCmdDrawIndexed +CmdDrawIndexedIndirect: ProcCmdDrawIndexedIndirect +CmdDrawIndexedIndirectCount: ProcCmdDrawIndexedIndirectCount +CmdDrawIndexedIndirectCountAMD: ProcCmdDrawIndexedIndirectCountAMD +CmdDrawIndexedIndirectCountKHR: ProcCmdDrawIndexedIndirectCountKHR +CmdDrawIndirect: ProcCmdDrawIndirect +CmdDrawIndirectByteCountEXT: ProcCmdDrawIndirectByteCountEXT +CmdDrawIndirectCount: ProcCmdDrawIndirectCount +CmdDrawIndirectCountAMD: ProcCmdDrawIndirectCountAMD +CmdDrawIndirectCountKHR: ProcCmdDrawIndirectCountKHR +CmdDrawMeshTasksIndirectCountNV: ProcCmdDrawMeshTasksIndirectCountNV +CmdDrawMeshTasksIndirectNV: ProcCmdDrawMeshTasksIndirectNV +CmdDrawMeshTasksNV: ProcCmdDrawMeshTasksNV +CmdDrawMultiEXT: ProcCmdDrawMultiEXT +CmdDrawMultiIndexedEXT: ProcCmdDrawMultiIndexedEXT +CmdEndConditionalRenderingEXT: ProcCmdEndConditionalRenderingEXT +CmdEndDebugUtilsLabelEXT: ProcCmdEndDebugUtilsLabelEXT +CmdEndQuery: ProcCmdEndQuery +CmdEndQueryIndexedEXT: ProcCmdEndQueryIndexedEXT +CmdEndRenderPass: ProcCmdEndRenderPass +CmdEndRenderPass2: ProcCmdEndRenderPass2 +CmdEndRenderPass2KHR: ProcCmdEndRenderPass2KHR +CmdEndTransformFeedbackEXT: ProcCmdEndTransformFeedbackEXT +CmdExecuteCommands: ProcCmdExecuteCommands +CmdExecuteGeneratedCommandsNV: ProcCmdExecuteGeneratedCommandsNV +CmdFillBuffer: ProcCmdFillBuffer +CmdInsertDebugUtilsLabelEXT: ProcCmdInsertDebugUtilsLabelEXT +CmdNextSubpass: ProcCmdNextSubpass +CmdNextSubpass2: ProcCmdNextSubpass2 +CmdNextSubpass2KHR: ProcCmdNextSubpass2KHR +CmdPipelineBarrier: ProcCmdPipelineBarrier +CmdPipelineBarrier2KHR: ProcCmdPipelineBarrier2KHR +CmdPreprocessGeneratedCommandsNV: ProcCmdPreprocessGeneratedCommandsNV +CmdPushConstants: ProcCmdPushConstants +CmdPushDescriptorSetKHR: ProcCmdPushDescriptorSetKHR +CmdPushDescriptorSetWithTemplateKHR: ProcCmdPushDescriptorSetWithTemplateKHR +CmdResetEvent: ProcCmdResetEvent +CmdResetEvent2KHR: ProcCmdResetEvent2KHR +CmdResetQueryPool: ProcCmdResetQueryPool +CmdResolveImage: ProcCmdResolveImage +CmdResolveImage2KHR: ProcCmdResolveImage2KHR +CmdSetBlendConstants: ProcCmdSetBlendConstants +CmdSetCheckpointNV: ProcCmdSetCheckpointNV +CmdSetCoarseSampleOrderNV: ProcCmdSetCoarseSampleOrderNV +CmdSetCullModeEXT: ProcCmdSetCullModeEXT +CmdSetDepthBias: ProcCmdSetDepthBias +CmdSetDepthBiasEnableEXT: ProcCmdSetDepthBiasEnableEXT +CmdSetDepthBounds: ProcCmdSetDepthBounds +CmdSetDepthBoundsTestEnableEXT: ProcCmdSetDepthBoundsTestEnableEXT +CmdSetDepthCompareOpEXT: ProcCmdSetDepthCompareOpEXT +CmdSetDepthTestEnableEXT: ProcCmdSetDepthTestEnableEXT +CmdSetDepthWriteEnableEXT: ProcCmdSetDepthWriteEnableEXT +CmdSetDeviceMask: ProcCmdSetDeviceMask +CmdSetDeviceMaskKHR: ProcCmdSetDeviceMaskKHR +CmdSetDiscardRectangleEXT: ProcCmdSetDiscardRectangleEXT +CmdSetEvent: ProcCmdSetEvent +CmdSetEvent2KHR: ProcCmdSetEvent2KHR +CmdSetExclusiveScissorNV: ProcCmdSetExclusiveScissorNV +CmdSetFragmentShadingRateEnumNV: ProcCmdSetFragmentShadingRateEnumNV +CmdSetFragmentShadingRateKHR: ProcCmdSetFragmentShadingRateKHR +CmdSetFrontFaceEXT: ProcCmdSetFrontFaceEXT +CmdSetLineStippleEXT: ProcCmdSetLineStippleEXT +CmdSetLineWidth: ProcCmdSetLineWidth +CmdSetLogicOpEXT: ProcCmdSetLogicOpEXT +CmdSetPatchControlPointsEXT: ProcCmdSetPatchControlPointsEXT +CmdSetPerformanceMarkerINTEL: ProcCmdSetPerformanceMarkerINTEL +CmdSetPerformanceOverrideINTEL: ProcCmdSetPerformanceOverrideINTEL +CmdSetPerformanceStreamMarkerINTEL: ProcCmdSetPerformanceStreamMarkerINTEL +CmdSetPrimitiveRestartEnableEXT: ProcCmdSetPrimitiveRestartEnableEXT +CmdSetPrimitiveTopologyEXT: ProcCmdSetPrimitiveTopologyEXT +CmdSetRasterizerDiscardEnableEXT: ProcCmdSetRasterizerDiscardEnableEXT +CmdSetRayTracingPipelineStackSizeKHR: ProcCmdSetRayTracingPipelineStackSizeKHR +CmdSetSampleLocationsEXT: ProcCmdSetSampleLocationsEXT +CmdSetScissor: ProcCmdSetScissor +CmdSetScissorWithCountEXT: ProcCmdSetScissorWithCountEXT +CmdSetStencilCompareMask: ProcCmdSetStencilCompareMask +CmdSetStencilOpEXT: ProcCmdSetStencilOpEXT +CmdSetStencilReference: ProcCmdSetStencilReference +CmdSetStencilTestEnableEXT: ProcCmdSetStencilTestEnableEXT +CmdSetStencilWriteMask: ProcCmdSetStencilWriteMask +CmdSetVertexInputEXT: ProcCmdSetVertexInputEXT +CmdSetViewport: ProcCmdSetViewport +CmdSetViewportShadingRatePaletteNV: ProcCmdSetViewportShadingRatePaletteNV +CmdSetViewportWScalingNV: ProcCmdSetViewportWScalingNV +CmdSetViewportWithCountEXT: ProcCmdSetViewportWithCountEXT +CmdSubpassShadingHUAWEI: ProcCmdSubpassShadingHUAWEI +CmdTraceRaysIndirectKHR: ProcCmdTraceRaysIndirectKHR +CmdTraceRaysKHR: ProcCmdTraceRaysKHR +CmdTraceRaysNV: ProcCmdTraceRaysNV +CmdUpdateBuffer: ProcCmdUpdateBuffer +CmdWaitEvents: ProcCmdWaitEvents +CmdWaitEvents2KHR: ProcCmdWaitEvents2KHR +CmdWriteAccelerationStructuresPropertiesKHR: ProcCmdWriteAccelerationStructuresPropertiesKHR +CmdWriteAccelerationStructuresPropertiesNV: ProcCmdWriteAccelerationStructuresPropertiesNV +CmdWriteBufferMarker2AMD: ProcCmdWriteBufferMarker2AMD +CmdWriteBufferMarkerAMD: ProcCmdWriteBufferMarkerAMD +CmdWriteTimestamp: ProcCmdWriteTimestamp +CmdWriteTimestamp2KHR: ProcCmdWriteTimestamp2KHR +CompileDeferredNV: ProcCompileDeferredNV +CopyAccelerationStructureKHR: ProcCopyAccelerationStructureKHR +CopyAccelerationStructureToMemoryKHR: ProcCopyAccelerationStructureToMemoryKHR +CopyMemoryToAccelerationStructureKHR: ProcCopyMemoryToAccelerationStructureKHR +CreateAccelerationStructureKHR: ProcCreateAccelerationStructureKHR +CreateAccelerationStructureNV: ProcCreateAccelerationStructureNV +CreateBuffer: ProcCreateBuffer +CreateBufferView: ProcCreateBufferView +CreateCommandPool: ProcCreateCommandPool +CreateComputePipelines: ProcCreateComputePipelines +CreateCuFunctionNVX: ProcCreateCuFunctionNVX +CreateCuModuleNVX: ProcCreateCuModuleNVX +CreateDeferredOperationKHR: ProcCreateDeferredOperationKHR +CreateDescriptorPool: ProcCreateDescriptorPool +CreateDescriptorSetLayout: ProcCreateDescriptorSetLayout +CreateDescriptorUpdateTemplate: ProcCreateDescriptorUpdateTemplate +CreateDescriptorUpdateTemplateKHR: ProcCreateDescriptorUpdateTemplateKHR +CreateEvent: ProcCreateEvent +CreateFence: ProcCreateFence +CreateFramebuffer: ProcCreateFramebuffer +CreateGraphicsPipelines: ProcCreateGraphicsPipelines +CreateImage: ProcCreateImage +CreateImageView: ProcCreateImageView +CreateIndirectCommandsLayoutNV: ProcCreateIndirectCommandsLayoutNV +CreatePipelineCache: ProcCreatePipelineCache +CreatePipelineLayout: ProcCreatePipelineLayout +CreatePrivateDataSlotEXT: ProcCreatePrivateDataSlotEXT +CreateQueryPool: ProcCreateQueryPool +CreateRayTracingPipelinesKHR: ProcCreateRayTracingPipelinesKHR +CreateRayTracingPipelinesNV: ProcCreateRayTracingPipelinesNV +CreateRenderPass: ProcCreateRenderPass +CreateRenderPass2: ProcCreateRenderPass2 +CreateRenderPass2KHR: ProcCreateRenderPass2KHR +CreateSampler: ProcCreateSampler +CreateSamplerYcbcrConversion: ProcCreateSamplerYcbcrConversion +CreateSamplerYcbcrConversionKHR: ProcCreateSamplerYcbcrConversionKHR +CreateSemaphore: ProcCreateSemaphore +CreateShaderModule: ProcCreateShaderModule +CreateSharedSwapchainsKHR: ProcCreateSharedSwapchainsKHR +CreateSwapchainKHR: ProcCreateSwapchainKHR +CreateValidationCacheEXT: ProcCreateValidationCacheEXT +DebugMarkerSetObjectNameEXT: ProcDebugMarkerSetObjectNameEXT +DebugMarkerSetObjectTagEXT: ProcDebugMarkerSetObjectTagEXT +DeferredOperationJoinKHR: ProcDeferredOperationJoinKHR +DestroyAccelerationStructureKHR: ProcDestroyAccelerationStructureKHR +DestroyAccelerationStructureNV: ProcDestroyAccelerationStructureNV +DestroyBuffer: ProcDestroyBuffer +DestroyBufferView: ProcDestroyBufferView +DestroyCommandPool: ProcDestroyCommandPool +DestroyCuFunctionNVX: ProcDestroyCuFunctionNVX +DestroyCuModuleNVX: ProcDestroyCuModuleNVX +DestroyDeferredOperationKHR: ProcDestroyDeferredOperationKHR +DestroyDescriptorPool: ProcDestroyDescriptorPool +DestroyDescriptorSetLayout: ProcDestroyDescriptorSetLayout +DestroyDescriptorUpdateTemplate: ProcDestroyDescriptorUpdateTemplate +DestroyDescriptorUpdateTemplateKHR: ProcDestroyDescriptorUpdateTemplateKHR +DestroyDevice: ProcDestroyDevice +DestroyEvent: ProcDestroyEvent +DestroyFence: ProcDestroyFence +DestroyFramebuffer: ProcDestroyFramebuffer +DestroyImage: ProcDestroyImage +DestroyImageView: ProcDestroyImageView +DestroyIndirectCommandsLayoutNV: ProcDestroyIndirectCommandsLayoutNV +DestroyPipeline: ProcDestroyPipeline +DestroyPipelineCache: ProcDestroyPipelineCache +DestroyPipelineLayout: ProcDestroyPipelineLayout +DestroyPrivateDataSlotEXT: ProcDestroyPrivateDataSlotEXT +DestroyQueryPool: ProcDestroyQueryPool +DestroyRenderPass: ProcDestroyRenderPass +DestroySampler: ProcDestroySampler +DestroySamplerYcbcrConversion: ProcDestroySamplerYcbcrConversion +DestroySamplerYcbcrConversionKHR: ProcDestroySamplerYcbcrConversionKHR +DestroySemaphore: ProcDestroySemaphore +DestroyShaderModule: ProcDestroyShaderModule +DestroySwapchainKHR: ProcDestroySwapchainKHR +DestroyValidationCacheEXT: ProcDestroyValidationCacheEXT +DeviceWaitIdle: ProcDeviceWaitIdle +DisplayPowerControlEXT: ProcDisplayPowerControlEXT +EndCommandBuffer: ProcEndCommandBuffer +FlushMappedMemoryRanges: ProcFlushMappedMemoryRanges +FreeCommandBuffers: ProcFreeCommandBuffers +FreeDescriptorSets: ProcFreeDescriptorSets +FreeMemory: ProcFreeMemory +GetAccelerationStructureBuildSizesKHR: ProcGetAccelerationStructureBuildSizesKHR +GetAccelerationStructureDeviceAddressKHR: ProcGetAccelerationStructureDeviceAddressKHR +GetAccelerationStructureHandleNV: ProcGetAccelerationStructureHandleNV +GetAccelerationStructureMemoryRequirementsNV: ProcGetAccelerationStructureMemoryRequirementsNV +GetBufferDeviceAddress: ProcGetBufferDeviceAddress +GetBufferDeviceAddressEXT: ProcGetBufferDeviceAddressEXT +GetBufferDeviceAddressKHR: ProcGetBufferDeviceAddressKHR +GetBufferMemoryRequirements: ProcGetBufferMemoryRequirements +GetBufferMemoryRequirements2: ProcGetBufferMemoryRequirements2 +GetBufferMemoryRequirements2KHR: ProcGetBufferMemoryRequirements2KHR +GetBufferOpaqueCaptureAddress: ProcGetBufferOpaqueCaptureAddress +GetBufferOpaqueCaptureAddressKHR: ProcGetBufferOpaqueCaptureAddressKHR +GetCalibratedTimestampsEXT: ProcGetCalibratedTimestampsEXT +GetDeferredOperationMaxConcurrencyKHR: ProcGetDeferredOperationMaxConcurrencyKHR +GetDeferredOperationResultKHR: ProcGetDeferredOperationResultKHR +GetDescriptorSetLayoutSupport: ProcGetDescriptorSetLayoutSupport +GetDescriptorSetLayoutSupportKHR: ProcGetDescriptorSetLayoutSupportKHR +GetDeviceAccelerationStructureCompatibilityKHR: ProcGetDeviceAccelerationStructureCompatibilityKHR +GetDeviceGroupPeerMemoryFeatures: ProcGetDeviceGroupPeerMemoryFeatures +GetDeviceGroupPeerMemoryFeaturesKHR: ProcGetDeviceGroupPeerMemoryFeaturesKHR +GetDeviceGroupPresentCapabilitiesKHR: ProcGetDeviceGroupPresentCapabilitiesKHR +GetDeviceGroupSurfacePresentModes2EXT: ProcGetDeviceGroupSurfacePresentModes2EXT +GetDeviceGroupSurfacePresentModesKHR: ProcGetDeviceGroupSurfacePresentModesKHR +GetDeviceMemoryCommitment: ProcGetDeviceMemoryCommitment +GetDeviceMemoryOpaqueCaptureAddress: ProcGetDeviceMemoryOpaqueCaptureAddress +GetDeviceMemoryOpaqueCaptureAddressKHR: ProcGetDeviceMemoryOpaqueCaptureAddressKHR +GetDeviceProcAddr: ProcGetDeviceProcAddr +GetDeviceQueue: ProcGetDeviceQueue +GetDeviceQueue2: ProcGetDeviceQueue2 +GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI: ProcGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI +GetEventStatus: ProcGetEventStatus +GetFenceFdKHR: ProcGetFenceFdKHR +GetFenceStatus: ProcGetFenceStatus +GetFenceWin32HandleKHR: ProcGetFenceWin32HandleKHR +GetGeneratedCommandsMemoryRequirementsNV: ProcGetGeneratedCommandsMemoryRequirementsNV +GetImageDrmFormatModifierPropertiesEXT: ProcGetImageDrmFormatModifierPropertiesEXT +GetImageMemoryRequirements: ProcGetImageMemoryRequirements +GetImageMemoryRequirements2: ProcGetImageMemoryRequirements2 +GetImageMemoryRequirements2KHR: ProcGetImageMemoryRequirements2KHR +GetImageSparseMemoryRequirements: ProcGetImageSparseMemoryRequirements +GetImageSparseMemoryRequirements2: ProcGetImageSparseMemoryRequirements2 +GetImageSparseMemoryRequirements2KHR: ProcGetImageSparseMemoryRequirements2KHR +GetImageSubresourceLayout: ProcGetImageSubresourceLayout +GetImageViewAddressNVX: ProcGetImageViewAddressNVX +GetImageViewHandleNVX: ProcGetImageViewHandleNVX +GetMemoryFdKHR: ProcGetMemoryFdKHR +GetMemoryFdPropertiesKHR: ProcGetMemoryFdPropertiesKHR +GetMemoryHostPointerPropertiesEXT: ProcGetMemoryHostPointerPropertiesEXT +GetMemoryRemoteAddressNV: ProcGetMemoryRemoteAddressNV +GetMemoryWin32HandleKHR: ProcGetMemoryWin32HandleKHR +GetMemoryWin32HandleNV: ProcGetMemoryWin32HandleNV +GetMemoryWin32HandlePropertiesKHR: ProcGetMemoryWin32HandlePropertiesKHR +GetPastPresentationTimingGOOGLE: ProcGetPastPresentationTimingGOOGLE +GetPerformanceParameterINTEL: ProcGetPerformanceParameterINTEL +GetPipelineCacheData: ProcGetPipelineCacheData +GetPipelineExecutableInternalRepresentationsKHR: ProcGetPipelineExecutableInternalRepresentationsKHR +GetPipelineExecutablePropertiesKHR: ProcGetPipelineExecutablePropertiesKHR +GetPipelineExecutableStatisticsKHR: ProcGetPipelineExecutableStatisticsKHR +GetPrivateDataEXT: ProcGetPrivateDataEXT +GetQueryPoolResults: ProcGetQueryPoolResults +GetQueueCheckpointData2NV: ProcGetQueueCheckpointData2NV +GetQueueCheckpointDataNV: ProcGetQueueCheckpointDataNV +GetRayTracingCaptureReplayShaderGroupHandlesKHR: ProcGetRayTracingCaptureReplayShaderGroupHandlesKHR +GetRayTracingShaderGroupHandlesKHR: ProcGetRayTracingShaderGroupHandlesKHR +GetRayTracingShaderGroupHandlesNV: ProcGetRayTracingShaderGroupHandlesNV +GetRayTracingShaderGroupStackSizeKHR: ProcGetRayTracingShaderGroupStackSizeKHR +GetRefreshCycleDurationGOOGLE: ProcGetRefreshCycleDurationGOOGLE +GetRenderAreaGranularity: ProcGetRenderAreaGranularity +GetSemaphoreCounterValue: ProcGetSemaphoreCounterValue +GetSemaphoreCounterValueKHR: ProcGetSemaphoreCounterValueKHR +GetSemaphoreFdKHR: ProcGetSemaphoreFdKHR +GetSemaphoreWin32HandleKHR: ProcGetSemaphoreWin32HandleKHR +GetShaderInfoAMD: ProcGetShaderInfoAMD +GetSwapchainCounterEXT: ProcGetSwapchainCounterEXT +GetSwapchainImagesKHR: ProcGetSwapchainImagesKHR +GetSwapchainStatusKHR: ProcGetSwapchainStatusKHR +GetValidationCacheDataEXT: ProcGetValidationCacheDataEXT +ImportFenceFdKHR: ProcImportFenceFdKHR +ImportFenceWin32HandleKHR: ProcImportFenceWin32HandleKHR +ImportSemaphoreFdKHR: ProcImportSemaphoreFdKHR +ImportSemaphoreWin32HandleKHR: ProcImportSemaphoreWin32HandleKHR +InitializePerformanceApiINTEL: ProcInitializePerformanceApiINTEL +InvalidateMappedMemoryRanges: ProcInvalidateMappedMemoryRanges +MapMemory: ProcMapMemory +MergePipelineCaches: ProcMergePipelineCaches +MergeValidationCachesEXT: ProcMergeValidationCachesEXT +QueueBeginDebugUtilsLabelEXT: ProcQueueBeginDebugUtilsLabelEXT +QueueBindSparse: ProcQueueBindSparse +QueueEndDebugUtilsLabelEXT: ProcQueueEndDebugUtilsLabelEXT +QueueInsertDebugUtilsLabelEXT: ProcQueueInsertDebugUtilsLabelEXT +QueuePresentKHR: ProcQueuePresentKHR +QueueSetPerformanceConfigurationINTEL: ProcQueueSetPerformanceConfigurationINTEL +QueueSubmit: ProcQueueSubmit +QueueSubmit2KHR: ProcQueueSubmit2KHR +QueueWaitIdle: ProcQueueWaitIdle +RegisterDeviceEventEXT: ProcRegisterDeviceEventEXT +RegisterDisplayEventEXT: ProcRegisterDisplayEventEXT +ReleaseFullScreenExclusiveModeEXT: ProcReleaseFullScreenExclusiveModeEXT +ReleasePerformanceConfigurationINTEL: ProcReleasePerformanceConfigurationINTEL +ReleaseProfilingLockKHR: ProcReleaseProfilingLockKHR +ResetCommandBuffer: ProcResetCommandBuffer +ResetCommandPool: ProcResetCommandPool +ResetDescriptorPool: ProcResetDescriptorPool +ResetEvent: ProcResetEvent +ResetFences: ProcResetFences +ResetQueryPool: ProcResetQueryPool +ResetQueryPoolEXT: ProcResetQueryPoolEXT +SetDebugUtilsObjectNameEXT: ProcSetDebugUtilsObjectNameEXT +SetDebugUtilsObjectTagEXT: ProcSetDebugUtilsObjectTagEXT +SetDeviceMemoryPriorityEXT: ProcSetDeviceMemoryPriorityEXT +SetEvent: ProcSetEvent +SetHdrMetadataEXT: ProcSetHdrMetadataEXT +SetLocalDimmingAMD: ProcSetLocalDimmingAMD +SetPrivateDataEXT: ProcSetPrivateDataEXT +SignalSemaphore: ProcSignalSemaphore +SignalSemaphoreKHR: ProcSignalSemaphoreKHR +TrimCommandPool: ProcTrimCommandPool +TrimCommandPoolKHR: ProcTrimCommandPoolKHR +UninitializePerformanceApiINTEL: ProcUninitializePerformanceApiINTEL +UnmapMemory: ProcUnmapMemory +UpdateDescriptorSetWithTemplate: ProcUpdateDescriptorSetWithTemplate +UpdateDescriptorSetWithTemplateKHR: ProcUpdateDescriptorSetWithTemplateKHR +UpdateDescriptorSets: ProcUpdateDescriptorSets +WaitForFences: ProcWaitForFences +WaitForPresentKHR: ProcWaitForPresentKHR +WaitSemaphores: ProcWaitSemaphores +WaitSemaphoresKHR: ProcWaitSemaphoresKHR +WriteAccelerationStructuresPropertiesKHR: ProcWriteAccelerationStructuresPropertiesKHR +load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { // Loader Procedures set_proc_address(&CreateInstance, "vkCreateInstance") + set_proc_address(&DebugUtilsMessengerCallbackEXT, "vkDebugUtilsMessengerCallbackEXT") + set_proc_address(&DeviceMemoryReportCallbackEXT, "vkDeviceMemoryReportCallbackEXT") set_proc_address(&EnumerateInstanceExtensionProperties, "vkEnumerateInstanceExtensionProperties") set_proc_address(&EnumerateInstanceLayerProperties, "vkEnumerateInstanceLayerProperties") set_proc_address(&EnumerateInstanceVersion, "vkEnumerateInstanceVersion") - set_proc_address(&DebugUtilsMessengerCallbackEXT, "vkDebugUtilsMessengerCallbackEXT") - set_proc_address(&DeviceMemoryReportCallbackEXT, "vkDeviceMemoryReportCallbackEXT") + + // Instance Procedures + set_proc_address(&AcquireDrmDisplayEXT, "vkAcquireDrmDisplayEXT") + set_proc_address(&AcquireWinrtDisplayNV, "vkAcquireWinrtDisplayNV") + set_proc_address(&CreateDebugReportCallbackEXT, "vkCreateDebugReportCallbackEXT") + set_proc_address(&CreateDebugUtilsMessengerEXT, "vkCreateDebugUtilsMessengerEXT") + set_proc_address(&CreateDevice, "vkCreateDevice") + set_proc_address(&CreateDisplayModeKHR, "vkCreateDisplayModeKHR") + set_proc_address(&CreateDisplayPlaneSurfaceKHR, "vkCreateDisplayPlaneSurfaceKHR") + set_proc_address(&CreateHeadlessSurfaceEXT, "vkCreateHeadlessSurfaceEXT") + set_proc_address(&CreateIOSSurfaceMVK, "vkCreateIOSSurfaceMVK") + set_proc_address(&CreateMacOSSurfaceMVK, "vkCreateMacOSSurfaceMVK") + set_proc_address(&CreateMetalSurfaceEXT, "vkCreateMetalSurfaceEXT") + set_proc_address(&CreateWin32SurfaceKHR, "vkCreateWin32SurfaceKHR") + set_proc_address(&DebugReportMessageEXT, "vkDebugReportMessageEXT") + set_proc_address(&DestroyDebugReportCallbackEXT, "vkDestroyDebugReportCallbackEXT") + set_proc_address(&DestroyDebugUtilsMessengerEXT, "vkDestroyDebugUtilsMessengerEXT") + set_proc_address(&DestroyInstance, "vkDestroyInstance") + set_proc_address(&DestroySurfaceKHR, "vkDestroySurfaceKHR") + set_proc_address(&EnumerateDeviceExtensionProperties, "vkEnumerateDeviceExtensionProperties") + set_proc_address(&EnumerateDeviceLayerProperties, "vkEnumerateDeviceLayerProperties") + set_proc_address(&EnumeratePhysicalDeviceGroups, "vkEnumeratePhysicalDeviceGroups") + set_proc_address(&EnumeratePhysicalDeviceGroupsKHR, "vkEnumeratePhysicalDeviceGroupsKHR") + set_proc_address(&EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR") + set_proc_address(&EnumeratePhysicalDevices, "vkEnumeratePhysicalDevices") + set_proc_address(&GetDisplayModeProperties2KHR, "vkGetDisplayModeProperties2KHR") + set_proc_address(&GetDisplayModePropertiesKHR, "vkGetDisplayModePropertiesKHR") + set_proc_address(&GetDisplayPlaneCapabilities2KHR, "vkGetDisplayPlaneCapabilities2KHR") + set_proc_address(&GetDisplayPlaneCapabilitiesKHR, "vkGetDisplayPlaneCapabilitiesKHR") + set_proc_address(&GetDisplayPlaneSupportedDisplaysKHR, "vkGetDisplayPlaneSupportedDisplaysKHR") + set_proc_address(&GetDrmDisplayEXT, "vkGetDrmDisplayEXT") + set_proc_address(&GetInstanceProcAddr, "vkGetInstanceProcAddr") + set_proc_address(&GetPhysicalDeviceCalibrateableTimeDomainsEXT, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT") + set_proc_address(&GetPhysicalDeviceCooperativeMatrixPropertiesNV, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV") + set_proc_address(&GetPhysicalDeviceDisplayPlaneProperties2KHR, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR") + set_proc_address(&GetPhysicalDeviceDisplayPlanePropertiesKHR, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR") + set_proc_address(&GetPhysicalDeviceDisplayProperties2KHR, "vkGetPhysicalDeviceDisplayProperties2KHR") + set_proc_address(&GetPhysicalDeviceDisplayPropertiesKHR, "vkGetPhysicalDeviceDisplayPropertiesKHR") + set_proc_address(&GetPhysicalDeviceExternalBufferProperties, "vkGetPhysicalDeviceExternalBufferProperties") + set_proc_address(&GetPhysicalDeviceExternalBufferPropertiesKHR, "vkGetPhysicalDeviceExternalBufferPropertiesKHR") + set_proc_address(&GetPhysicalDeviceExternalFenceProperties, "vkGetPhysicalDeviceExternalFenceProperties") + set_proc_address(&GetPhysicalDeviceExternalFencePropertiesKHR, "vkGetPhysicalDeviceExternalFencePropertiesKHR") + set_proc_address(&GetPhysicalDeviceExternalImageFormatPropertiesNV, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV") + set_proc_address(&GetPhysicalDeviceExternalSemaphoreProperties, "vkGetPhysicalDeviceExternalSemaphoreProperties") + set_proc_address(&GetPhysicalDeviceExternalSemaphorePropertiesKHR, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR") + set_proc_address(&GetPhysicalDeviceFeatures, "vkGetPhysicalDeviceFeatures") + set_proc_address(&GetPhysicalDeviceFeatures2, "vkGetPhysicalDeviceFeatures2") + set_proc_address(&GetPhysicalDeviceFeatures2KHR, "vkGetPhysicalDeviceFeatures2KHR") + set_proc_address(&GetPhysicalDeviceFormatProperties, "vkGetPhysicalDeviceFormatProperties") + set_proc_address(&GetPhysicalDeviceFormatProperties2, "vkGetPhysicalDeviceFormatProperties2") + set_proc_address(&GetPhysicalDeviceFormatProperties2KHR, "vkGetPhysicalDeviceFormatProperties2KHR") + set_proc_address(&GetPhysicalDeviceFragmentShadingRatesKHR, "vkGetPhysicalDeviceFragmentShadingRatesKHR") + set_proc_address(&GetPhysicalDeviceImageFormatProperties, "vkGetPhysicalDeviceImageFormatProperties") + set_proc_address(&GetPhysicalDeviceImageFormatProperties2, "vkGetPhysicalDeviceImageFormatProperties2") + set_proc_address(&GetPhysicalDeviceImageFormatProperties2KHR, "vkGetPhysicalDeviceImageFormatProperties2KHR") + set_proc_address(&GetPhysicalDeviceMemoryProperties, "vkGetPhysicalDeviceMemoryProperties") + set_proc_address(&GetPhysicalDeviceMemoryProperties2, "vkGetPhysicalDeviceMemoryProperties2") + set_proc_address(&GetPhysicalDeviceMemoryProperties2KHR, "vkGetPhysicalDeviceMemoryProperties2KHR") + set_proc_address(&GetPhysicalDeviceMultisamplePropertiesEXT, "vkGetPhysicalDeviceMultisamplePropertiesEXT") + set_proc_address(&GetPhysicalDevicePresentRectanglesKHR, "vkGetPhysicalDevicePresentRectanglesKHR") + set_proc_address(&GetPhysicalDeviceProperties, "vkGetPhysicalDeviceProperties") + set_proc_address(&GetPhysicalDeviceProperties2, "vkGetPhysicalDeviceProperties2") + set_proc_address(&GetPhysicalDeviceProperties2KHR, "vkGetPhysicalDeviceProperties2KHR") + set_proc_address(&GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR") + set_proc_address(&GetPhysicalDeviceQueueFamilyProperties, "vkGetPhysicalDeviceQueueFamilyProperties") + set_proc_address(&GetPhysicalDeviceQueueFamilyProperties2, "vkGetPhysicalDeviceQueueFamilyProperties2") + set_proc_address(&GetPhysicalDeviceQueueFamilyProperties2KHR, "vkGetPhysicalDeviceQueueFamilyProperties2KHR") + set_proc_address(&GetPhysicalDeviceSparseImageFormatProperties, "vkGetPhysicalDeviceSparseImageFormatProperties") + set_proc_address(&GetPhysicalDeviceSparseImageFormatProperties2, "vkGetPhysicalDeviceSparseImageFormatProperties2") + set_proc_address(&GetPhysicalDeviceSparseImageFormatProperties2KHR, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR") + set_proc_address(&GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV") + set_proc_address(&GetPhysicalDeviceSurfaceCapabilities2EXT, "vkGetPhysicalDeviceSurfaceCapabilities2EXT") + set_proc_address(&GetPhysicalDeviceSurfaceCapabilities2KHR, "vkGetPhysicalDeviceSurfaceCapabilities2KHR") + set_proc_address(&GetPhysicalDeviceSurfaceCapabilitiesKHR, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR") + set_proc_address(&GetPhysicalDeviceSurfaceFormats2KHR, "vkGetPhysicalDeviceSurfaceFormats2KHR") + set_proc_address(&GetPhysicalDeviceSurfaceFormatsKHR, "vkGetPhysicalDeviceSurfaceFormatsKHR") + set_proc_address(&GetPhysicalDeviceSurfacePresentModes2EXT, "vkGetPhysicalDeviceSurfacePresentModes2EXT") + set_proc_address(&GetPhysicalDeviceSurfacePresentModesKHR, "vkGetPhysicalDeviceSurfacePresentModesKHR") + set_proc_address(&GetPhysicalDeviceSurfaceSupportKHR, "vkGetPhysicalDeviceSurfaceSupportKHR") + set_proc_address(&GetPhysicalDeviceToolPropertiesEXT, "vkGetPhysicalDeviceToolPropertiesEXT") + set_proc_address(&GetPhysicalDeviceWin32PresentationSupportKHR, "vkGetPhysicalDeviceWin32PresentationSupportKHR") + set_proc_address(&GetWinrtDisplayNV, "vkGetWinrtDisplayNV") + set_proc_address(&ReleaseDisplayEXT, "vkReleaseDisplayEXT") + set_proc_address(&SubmitDebugUtilsMessageEXT, "vkSubmitDebugUtilsMessageEXT") + + // Device Procedures + set_proc_address(&AcquireFullScreenExclusiveModeEXT, "vkAcquireFullScreenExclusiveModeEXT") + set_proc_address(&AcquireNextImage2KHR, "vkAcquireNextImage2KHR") + set_proc_address(&AcquireNextImageKHR, "vkAcquireNextImageKHR") + set_proc_address(&AcquirePerformanceConfigurationINTEL, "vkAcquirePerformanceConfigurationINTEL") + set_proc_address(&AcquireProfilingLockKHR, "vkAcquireProfilingLockKHR") + set_proc_address(&AllocateCommandBuffers, "vkAllocateCommandBuffers") + set_proc_address(&AllocateDescriptorSets, "vkAllocateDescriptorSets") + set_proc_address(&AllocateMemory, "vkAllocateMemory") + set_proc_address(&BeginCommandBuffer, "vkBeginCommandBuffer") + set_proc_address(&BindAccelerationStructureMemoryNV, "vkBindAccelerationStructureMemoryNV") + set_proc_address(&BindBufferMemory, "vkBindBufferMemory") + set_proc_address(&BindBufferMemory2, "vkBindBufferMemory2") + set_proc_address(&BindBufferMemory2KHR, "vkBindBufferMemory2KHR") + set_proc_address(&BindImageMemory, "vkBindImageMemory") + set_proc_address(&BindImageMemory2, "vkBindImageMemory2") + set_proc_address(&BindImageMemory2KHR, "vkBindImageMemory2KHR") + set_proc_address(&BuildAccelerationStructuresKHR, "vkBuildAccelerationStructuresKHR") + set_proc_address(&CmdBeginConditionalRenderingEXT, "vkCmdBeginConditionalRenderingEXT") + set_proc_address(&CmdBeginDebugUtilsLabelEXT, "vkCmdBeginDebugUtilsLabelEXT") + set_proc_address(&CmdBeginQuery, "vkCmdBeginQuery") + set_proc_address(&CmdBeginQueryIndexedEXT, "vkCmdBeginQueryIndexedEXT") + set_proc_address(&CmdBeginRenderPass, "vkCmdBeginRenderPass") + set_proc_address(&CmdBeginRenderPass2, "vkCmdBeginRenderPass2") + set_proc_address(&CmdBeginRenderPass2KHR, "vkCmdBeginRenderPass2KHR") + set_proc_address(&CmdBeginTransformFeedbackEXT, "vkCmdBeginTransformFeedbackEXT") + set_proc_address(&CmdBindDescriptorSets, "vkCmdBindDescriptorSets") + set_proc_address(&CmdBindIndexBuffer, "vkCmdBindIndexBuffer") + set_proc_address(&CmdBindInvocationMaskHUAWEI, "vkCmdBindInvocationMaskHUAWEI") + set_proc_address(&CmdBindPipeline, "vkCmdBindPipeline") + set_proc_address(&CmdBindPipelineShaderGroupNV, "vkCmdBindPipelineShaderGroupNV") + set_proc_address(&CmdBindShadingRateImageNV, "vkCmdBindShadingRateImageNV") + set_proc_address(&CmdBindTransformFeedbackBuffersEXT, "vkCmdBindTransformFeedbackBuffersEXT") + set_proc_address(&CmdBindVertexBuffers, "vkCmdBindVertexBuffers") + set_proc_address(&CmdBindVertexBuffers2EXT, "vkCmdBindVertexBuffers2EXT") + set_proc_address(&CmdBlitImage, "vkCmdBlitImage") + set_proc_address(&CmdBlitImage2KHR, "vkCmdBlitImage2KHR") + set_proc_address(&CmdBuildAccelerationStructureNV, "vkCmdBuildAccelerationStructureNV") + set_proc_address(&CmdBuildAccelerationStructuresIndirectKHR, "vkCmdBuildAccelerationStructuresIndirectKHR") + set_proc_address(&CmdBuildAccelerationStructuresKHR, "vkCmdBuildAccelerationStructuresKHR") + set_proc_address(&CmdClearAttachments, "vkCmdClearAttachments") + set_proc_address(&CmdClearColorImage, "vkCmdClearColorImage") + set_proc_address(&CmdClearDepthStencilImage, "vkCmdClearDepthStencilImage") + set_proc_address(&CmdCopyAccelerationStructureKHR, "vkCmdCopyAccelerationStructureKHR") + set_proc_address(&CmdCopyAccelerationStructureNV, "vkCmdCopyAccelerationStructureNV") + set_proc_address(&CmdCopyAccelerationStructureToMemoryKHR, "vkCmdCopyAccelerationStructureToMemoryKHR") + set_proc_address(&CmdCopyBuffer, "vkCmdCopyBuffer") + set_proc_address(&CmdCopyBuffer2KHR, "vkCmdCopyBuffer2KHR") + set_proc_address(&CmdCopyBufferToImage, "vkCmdCopyBufferToImage") + set_proc_address(&CmdCopyBufferToImage2KHR, "vkCmdCopyBufferToImage2KHR") + set_proc_address(&CmdCopyImage, "vkCmdCopyImage") + set_proc_address(&CmdCopyImage2KHR, "vkCmdCopyImage2KHR") + set_proc_address(&CmdCopyImageToBuffer, "vkCmdCopyImageToBuffer") + set_proc_address(&CmdCopyImageToBuffer2KHR, "vkCmdCopyImageToBuffer2KHR") + set_proc_address(&CmdCopyMemoryToAccelerationStructureKHR, "vkCmdCopyMemoryToAccelerationStructureKHR") + set_proc_address(&CmdCopyQueryPoolResults, "vkCmdCopyQueryPoolResults") + set_proc_address(&CmdCuLaunchKernelNVX, "vkCmdCuLaunchKernelNVX") + set_proc_address(&CmdDebugMarkerBeginEXT, "vkCmdDebugMarkerBeginEXT") + set_proc_address(&CmdDebugMarkerEndEXT, "vkCmdDebugMarkerEndEXT") + set_proc_address(&CmdDebugMarkerInsertEXT, "vkCmdDebugMarkerInsertEXT") + set_proc_address(&CmdDispatch, "vkCmdDispatch") + set_proc_address(&CmdDispatchBase, "vkCmdDispatchBase") + set_proc_address(&CmdDispatchBaseKHR, "vkCmdDispatchBaseKHR") + set_proc_address(&CmdDispatchIndirect, "vkCmdDispatchIndirect") + set_proc_address(&CmdDraw, "vkCmdDraw") + set_proc_address(&CmdDrawIndexed, "vkCmdDrawIndexed") + set_proc_address(&CmdDrawIndexedIndirect, "vkCmdDrawIndexedIndirect") + set_proc_address(&CmdDrawIndexedIndirectCount, "vkCmdDrawIndexedIndirectCount") + set_proc_address(&CmdDrawIndexedIndirectCountAMD, "vkCmdDrawIndexedIndirectCountAMD") + set_proc_address(&CmdDrawIndexedIndirectCountKHR, "vkCmdDrawIndexedIndirectCountKHR") + set_proc_address(&CmdDrawIndirect, "vkCmdDrawIndirect") + set_proc_address(&CmdDrawIndirectByteCountEXT, "vkCmdDrawIndirectByteCountEXT") + set_proc_address(&CmdDrawIndirectCount, "vkCmdDrawIndirectCount") + set_proc_address(&CmdDrawIndirectCountAMD, "vkCmdDrawIndirectCountAMD") + set_proc_address(&CmdDrawIndirectCountKHR, "vkCmdDrawIndirectCountKHR") + set_proc_address(&CmdDrawMeshTasksIndirectCountNV, "vkCmdDrawMeshTasksIndirectCountNV") + set_proc_address(&CmdDrawMeshTasksIndirectNV, "vkCmdDrawMeshTasksIndirectNV") + set_proc_address(&CmdDrawMeshTasksNV, "vkCmdDrawMeshTasksNV") + set_proc_address(&CmdDrawMultiEXT, "vkCmdDrawMultiEXT") + set_proc_address(&CmdDrawMultiIndexedEXT, "vkCmdDrawMultiIndexedEXT") + set_proc_address(&CmdEndConditionalRenderingEXT, "vkCmdEndConditionalRenderingEXT") + set_proc_address(&CmdEndDebugUtilsLabelEXT, "vkCmdEndDebugUtilsLabelEXT") + set_proc_address(&CmdEndQuery, "vkCmdEndQuery") + set_proc_address(&CmdEndQueryIndexedEXT, "vkCmdEndQueryIndexedEXT") + set_proc_address(&CmdEndRenderPass, "vkCmdEndRenderPass") + set_proc_address(&CmdEndRenderPass2, "vkCmdEndRenderPass2") + set_proc_address(&CmdEndRenderPass2KHR, "vkCmdEndRenderPass2KHR") + set_proc_address(&CmdEndTransformFeedbackEXT, "vkCmdEndTransformFeedbackEXT") + set_proc_address(&CmdExecuteCommands, "vkCmdExecuteCommands") + set_proc_address(&CmdExecuteGeneratedCommandsNV, "vkCmdExecuteGeneratedCommandsNV") + set_proc_address(&CmdFillBuffer, "vkCmdFillBuffer") + set_proc_address(&CmdInsertDebugUtilsLabelEXT, "vkCmdInsertDebugUtilsLabelEXT") + set_proc_address(&CmdNextSubpass, "vkCmdNextSubpass") + set_proc_address(&CmdNextSubpass2, "vkCmdNextSubpass2") + set_proc_address(&CmdNextSubpass2KHR, "vkCmdNextSubpass2KHR") + set_proc_address(&CmdPipelineBarrier, "vkCmdPipelineBarrier") + set_proc_address(&CmdPipelineBarrier2KHR, "vkCmdPipelineBarrier2KHR") + set_proc_address(&CmdPreprocessGeneratedCommandsNV, "vkCmdPreprocessGeneratedCommandsNV") + set_proc_address(&CmdPushConstants, "vkCmdPushConstants") + set_proc_address(&CmdPushDescriptorSetKHR, "vkCmdPushDescriptorSetKHR") + set_proc_address(&CmdPushDescriptorSetWithTemplateKHR, "vkCmdPushDescriptorSetWithTemplateKHR") + set_proc_address(&CmdResetEvent, "vkCmdResetEvent") + set_proc_address(&CmdResetEvent2KHR, "vkCmdResetEvent2KHR") + set_proc_address(&CmdResetQueryPool, "vkCmdResetQueryPool") + set_proc_address(&CmdResolveImage, "vkCmdResolveImage") + set_proc_address(&CmdResolveImage2KHR, "vkCmdResolveImage2KHR") + set_proc_address(&CmdSetBlendConstants, "vkCmdSetBlendConstants") + set_proc_address(&CmdSetCheckpointNV, "vkCmdSetCheckpointNV") + set_proc_address(&CmdSetCoarseSampleOrderNV, "vkCmdSetCoarseSampleOrderNV") + set_proc_address(&CmdSetCullModeEXT, "vkCmdSetCullModeEXT") + set_proc_address(&CmdSetDepthBias, "vkCmdSetDepthBias") + set_proc_address(&CmdSetDepthBiasEnableEXT, "vkCmdSetDepthBiasEnableEXT") + set_proc_address(&CmdSetDepthBounds, "vkCmdSetDepthBounds") + set_proc_address(&CmdSetDepthBoundsTestEnableEXT, "vkCmdSetDepthBoundsTestEnableEXT") + set_proc_address(&CmdSetDepthCompareOpEXT, "vkCmdSetDepthCompareOpEXT") + set_proc_address(&CmdSetDepthTestEnableEXT, "vkCmdSetDepthTestEnableEXT") + set_proc_address(&CmdSetDepthWriteEnableEXT, "vkCmdSetDepthWriteEnableEXT") + set_proc_address(&CmdSetDeviceMask, "vkCmdSetDeviceMask") + set_proc_address(&CmdSetDeviceMaskKHR, "vkCmdSetDeviceMaskKHR") + set_proc_address(&CmdSetDiscardRectangleEXT, "vkCmdSetDiscardRectangleEXT") + set_proc_address(&CmdSetEvent, "vkCmdSetEvent") + set_proc_address(&CmdSetEvent2KHR, "vkCmdSetEvent2KHR") + set_proc_address(&CmdSetExclusiveScissorNV, "vkCmdSetExclusiveScissorNV") + set_proc_address(&CmdSetFragmentShadingRateEnumNV, "vkCmdSetFragmentShadingRateEnumNV") + set_proc_address(&CmdSetFragmentShadingRateKHR, "vkCmdSetFragmentShadingRateKHR") + set_proc_address(&CmdSetFrontFaceEXT, "vkCmdSetFrontFaceEXT") + set_proc_address(&CmdSetLineStippleEXT, "vkCmdSetLineStippleEXT") + set_proc_address(&CmdSetLineWidth, "vkCmdSetLineWidth") + set_proc_address(&CmdSetLogicOpEXT, "vkCmdSetLogicOpEXT") + set_proc_address(&CmdSetPatchControlPointsEXT, "vkCmdSetPatchControlPointsEXT") + set_proc_address(&CmdSetPerformanceMarkerINTEL, "vkCmdSetPerformanceMarkerINTEL") + set_proc_address(&CmdSetPerformanceOverrideINTEL, "vkCmdSetPerformanceOverrideINTEL") + set_proc_address(&CmdSetPerformanceStreamMarkerINTEL, "vkCmdSetPerformanceStreamMarkerINTEL") + set_proc_address(&CmdSetPrimitiveRestartEnableEXT, "vkCmdSetPrimitiveRestartEnableEXT") + set_proc_address(&CmdSetPrimitiveTopologyEXT, "vkCmdSetPrimitiveTopologyEXT") + set_proc_address(&CmdSetRasterizerDiscardEnableEXT, "vkCmdSetRasterizerDiscardEnableEXT") + set_proc_address(&CmdSetRayTracingPipelineStackSizeKHR, "vkCmdSetRayTracingPipelineStackSizeKHR") + set_proc_address(&CmdSetSampleLocationsEXT, "vkCmdSetSampleLocationsEXT") + set_proc_address(&CmdSetScissor, "vkCmdSetScissor") + set_proc_address(&CmdSetScissorWithCountEXT, "vkCmdSetScissorWithCountEXT") + set_proc_address(&CmdSetStencilCompareMask, "vkCmdSetStencilCompareMask") + set_proc_address(&CmdSetStencilOpEXT, "vkCmdSetStencilOpEXT") + set_proc_address(&CmdSetStencilReference, "vkCmdSetStencilReference") + set_proc_address(&CmdSetStencilTestEnableEXT, "vkCmdSetStencilTestEnableEXT") + set_proc_address(&CmdSetStencilWriteMask, "vkCmdSetStencilWriteMask") + set_proc_address(&CmdSetVertexInputEXT, "vkCmdSetVertexInputEXT") + set_proc_address(&CmdSetViewport, "vkCmdSetViewport") + set_proc_address(&CmdSetViewportShadingRatePaletteNV, "vkCmdSetViewportShadingRatePaletteNV") + set_proc_address(&CmdSetViewportWScalingNV, "vkCmdSetViewportWScalingNV") + set_proc_address(&CmdSetViewportWithCountEXT, "vkCmdSetViewportWithCountEXT") + set_proc_address(&CmdSubpassShadingHUAWEI, "vkCmdSubpassShadingHUAWEI") + set_proc_address(&CmdTraceRaysIndirectKHR, "vkCmdTraceRaysIndirectKHR") + set_proc_address(&CmdTraceRaysKHR, "vkCmdTraceRaysKHR") + set_proc_address(&CmdTraceRaysNV, "vkCmdTraceRaysNV") + set_proc_address(&CmdUpdateBuffer, "vkCmdUpdateBuffer") + set_proc_address(&CmdWaitEvents, "vkCmdWaitEvents") + set_proc_address(&CmdWaitEvents2KHR, "vkCmdWaitEvents2KHR") + set_proc_address(&CmdWriteAccelerationStructuresPropertiesKHR, "vkCmdWriteAccelerationStructuresPropertiesKHR") + set_proc_address(&CmdWriteAccelerationStructuresPropertiesNV, "vkCmdWriteAccelerationStructuresPropertiesNV") + set_proc_address(&CmdWriteBufferMarker2AMD, "vkCmdWriteBufferMarker2AMD") + set_proc_address(&CmdWriteBufferMarkerAMD, "vkCmdWriteBufferMarkerAMD") + set_proc_address(&CmdWriteTimestamp, "vkCmdWriteTimestamp") + set_proc_address(&CmdWriteTimestamp2KHR, "vkCmdWriteTimestamp2KHR") + set_proc_address(&CompileDeferredNV, "vkCompileDeferredNV") + set_proc_address(&CopyAccelerationStructureKHR, "vkCopyAccelerationStructureKHR") + set_proc_address(&CopyAccelerationStructureToMemoryKHR, "vkCopyAccelerationStructureToMemoryKHR") + set_proc_address(&CopyMemoryToAccelerationStructureKHR, "vkCopyMemoryToAccelerationStructureKHR") + set_proc_address(&CreateAccelerationStructureKHR, "vkCreateAccelerationStructureKHR") + set_proc_address(&CreateAccelerationStructureNV, "vkCreateAccelerationStructureNV") + set_proc_address(&CreateBuffer, "vkCreateBuffer") + set_proc_address(&CreateBufferView, "vkCreateBufferView") + set_proc_address(&CreateCommandPool, "vkCreateCommandPool") + set_proc_address(&CreateComputePipelines, "vkCreateComputePipelines") + set_proc_address(&CreateCuFunctionNVX, "vkCreateCuFunctionNVX") + set_proc_address(&CreateCuModuleNVX, "vkCreateCuModuleNVX") + set_proc_address(&CreateDeferredOperationKHR, "vkCreateDeferredOperationKHR") + set_proc_address(&CreateDescriptorPool, "vkCreateDescriptorPool") + set_proc_address(&CreateDescriptorSetLayout, "vkCreateDescriptorSetLayout") + set_proc_address(&CreateDescriptorUpdateTemplate, "vkCreateDescriptorUpdateTemplate") + set_proc_address(&CreateDescriptorUpdateTemplateKHR, "vkCreateDescriptorUpdateTemplateKHR") + set_proc_address(&CreateEvent, "vkCreateEvent") + set_proc_address(&CreateFence, "vkCreateFence") + set_proc_address(&CreateFramebuffer, "vkCreateFramebuffer") + set_proc_address(&CreateGraphicsPipelines, "vkCreateGraphicsPipelines") + set_proc_address(&CreateImage, "vkCreateImage") + set_proc_address(&CreateImageView, "vkCreateImageView") + set_proc_address(&CreateIndirectCommandsLayoutNV, "vkCreateIndirectCommandsLayoutNV") + set_proc_address(&CreatePipelineCache, "vkCreatePipelineCache") + set_proc_address(&CreatePipelineLayout, "vkCreatePipelineLayout") + set_proc_address(&CreatePrivateDataSlotEXT, "vkCreatePrivateDataSlotEXT") + set_proc_address(&CreateQueryPool, "vkCreateQueryPool") + set_proc_address(&CreateRayTracingPipelinesKHR, "vkCreateRayTracingPipelinesKHR") + set_proc_address(&CreateRayTracingPipelinesNV, "vkCreateRayTracingPipelinesNV") + set_proc_address(&CreateRenderPass, "vkCreateRenderPass") + set_proc_address(&CreateRenderPass2, "vkCreateRenderPass2") + set_proc_address(&CreateRenderPass2KHR, "vkCreateRenderPass2KHR") + set_proc_address(&CreateSampler, "vkCreateSampler") + set_proc_address(&CreateSamplerYcbcrConversion, "vkCreateSamplerYcbcrConversion") + set_proc_address(&CreateSamplerYcbcrConversionKHR, "vkCreateSamplerYcbcrConversionKHR") + set_proc_address(&CreateSemaphore, "vkCreateSemaphore") + set_proc_address(&CreateShaderModule, "vkCreateShaderModule") + set_proc_address(&CreateSharedSwapchainsKHR, "vkCreateSharedSwapchainsKHR") + set_proc_address(&CreateSwapchainKHR, "vkCreateSwapchainKHR") + set_proc_address(&CreateValidationCacheEXT, "vkCreateValidationCacheEXT") + set_proc_address(&DebugMarkerSetObjectNameEXT, "vkDebugMarkerSetObjectNameEXT") + set_proc_address(&DebugMarkerSetObjectTagEXT, "vkDebugMarkerSetObjectTagEXT") + set_proc_address(&DeferredOperationJoinKHR, "vkDeferredOperationJoinKHR") + set_proc_address(&DestroyAccelerationStructureKHR, "vkDestroyAccelerationStructureKHR") + set_proc_address(&DestroyAccelerationStructureNV, "vkDestroyAccelerationStructureNV") + set_proc_address(&DestroyBuffer, "vkDestroyBuffer") + set_proc_address(&DestroyBufferView, "vkDestroyBufferView") + set_proc_address(&DestroyCommandPool, "vkDestroyCommandPool") + set_proc_address(&DestroyCuFunctionNVX, "vkDestroyCuFunctionNVX") + set_proc_address(&DestroyCuModuleNVX, "vkDestroyCuModuleNVX") + set_proc_address(&DestroyDeferredOperationKHR, "vkDestroyDeferredOperationKHR") + set_proc_address(&DestroyDescriptorPool, "vkDestroyDescriptorPool") + set_proc_address(&DestroyDescriptorSetLayout, "vkDestroyDescriptorSetLayout") + set_proc_address(&DestroyDescriptorUpdateTemplate, "vkDestroyDescriptorUpdateTemplate") + set_proc_address(&DestroyDescriptorUpdateTemplateKHR, "vkDestroyDescriptorUpdateTemplateKHR") + set_proc_address(&DestroyDevice, "vkDestroyDevice") + set_proc_address(&DestroyEvent, "vkDestroyEvent") + set_proc_address(&DestroyFence, "vkDestroyFence") + set_proc_address(&DestroyFramebuffer, "vkDestroyFramebuffer") + set_proc_address(&DestroyImage, "vkDestroyImage") + set_proc_address(&DestroyImageView, "vkDestroyImageView") + set_proc_address(&DestroyIndirectCommandsLayoutNV, "vkDestroyIndirectCommandsLayoutNV") + set_proc_address(&DestroyPipeline, "vkDestroyPipeline") + set_proc_address(&DestroyPipelineCache, "vkDestroyPipelineCache") + set_proc_address(&DestroyPipelineLayout, "vkDestroyPipelineLayout") + set_proc_address(&DestroyPrivateDataSlotEXT, "vkDestroyPrivateDataSlotEXT") + set_proc_address(&DestroyQueryPool, "vkDestroyQueryPool") + set_proc_address(&DestroyRenderPass, "vkDestroyRenderPass") + set_proc_address(&DestroySampler, "vkDestroySampler") + set_proc_address(&DestroySamplerYcbcrConversion, "vkDestroySamplerYcbcrConversion") + set_proc_address(&DestroySamplerYcbcrConversionKHR, "vkDestroySamplerYcbcrConversionKHR") + set_proc_address(&DestroySemaphore, "vkDestroySemaphore") + set_proc_address(&DestroyShaderModule, "vkDestroyShaderModule") + set_proc_address(&DestroySwapchainKHR, "vkDestroySwapchainKHR") + set_proc_address(&DestroyValidationCacheEXT, "vkDestroyValidationCacheEXT") + set_proc_address(&DeviceWaitIdle, "vkDeviceWaitIdle") + set_proc_address(&DisplayPowerControlEXT, "vkDisplayPowerControlEXT") + set_proc_address(&EndCommandBuffer, "vkEndCommandBuffer") + set_proc_address(&FlushMappedMemoryRanges, "vkFlushMappedMemoryRanges") + set_proc_address(&FreeCommandBuffers, "vkFreeCommandBuffers") + set_proc_address(&FreeDescriptorSets, "vkFreeDescriptorSets") + set_proc_address(&FreeMemory, "vkFreeMemory") + set_proc_address(&GetAccelerationStructureBuildSizesKHR, "vkGetAccelerationStructureBuildSizesKHR") + set_proc_address(&GetAccelerationStructureDeviceAddressKHR, "vkGetAccelerationStructureDeviceAddressKHR") + set_proc_address(&GetAccelerationStructureHandleNV, "vkGetAccelerationStructureHandleNV") + set_proc_address(&GetAccelerationStructureMemoryRequirementsNV, "vkGetAccelerationStructureMemoryRequirementsNV") + set_proc_address(&GetBufferDeviceAddress, "vkGetBufferDeviceAddress") + set_proc_address(&GetBufferDeviceAddressEXT, "vkGetBufferDeviceAddressEXT") + set_proc_address(&GetBufferDeviceAddressKHR, "vkGetBufferDeviceAddressKHR") + set_proc_address(&GetBufferMemoryRequirements, "vkGetBufferMemoryRequirements") + set_proc_address(&GetBufferMemoryRequirements2, "vkGetBufferMemoryRequirements2") + set_proc_address(&GetBufferMemoryRequirements2KHR, "vkGetBufferMemoryRequirements2KHR") + set_proc_address(&GetBufferOpaqueCaptureAddress, "vkGetBufferOpaqueCaptureAddress") + set_proc_address(&GetBufferOpaqueCaptureAddressKHR, "vkGetBufferOpaqueCaptureAddressKHR") + set_proc_address(&GetCalibratedTimestampsEXT, "vkGetCalibratedTimestampsEXT") + set_proc_address(&GetDeferredOperationMaxConcurrencyKHR, "vkGetDeferredOperationMaxConcurrencyKHR") + set_proc_address(&GetDeferredOperationResultKHR, "vkGetDeferredOperationResultKHR") + set_proc_address(&GetDescriptorSetLayoutSupport, "vkGetDescriptorSetLayoutSupport") + set_proc_address(&GetDescriptorSetLayoutSupportKHR, "vkGetDescriptorSetLayoutSupportKHR") + set_proc_address(&GetDeviceAccelerationStructureCompatibilityKHR, "vkGetDeviceAccelerationStructureCompatibilityKHR") + set_proc_address(&GetDeviceGroupPeerMemoryFeatures, "vkGetDeviceGroupPeerMemoryFeatures") + set_proc_address(&GetDeviceGroupPeerMemoryFeaturesKHR, "vkGetDeviceGroupPeerMemoryFeaturesKHR") + set_proc_address(&GetDeviceGroupPresentCapabilitiesKHR, "vkGetDeviceGroupPresentCapabilitiesKHR") + set_proc_address(&GetDeviceGroupSurfacePresentModes2EXT, "vkGetDeviceGroupSurfacePresentModes2EXT") + set_proc_address(&GetDeviceGroupSurfacePresentModesKHR, "vkGetDeviceGroupSurfacePresentModesKHR") + set_proc_address(&GetDeviceMemoryCommitment, "vkGetDeviceMemoryCommitment") + set_proc_address(&GetDeviceMemoryOpaqueCaptureAddress, "vkGetDeviceMemoryOpaqueCaptureAddress") + set_proc_address(&GetDeviceMemoryOpaqueCaptureAddressKHR, "vkGetDeviceMemoryOpaqueCaptureAddressKHR") + set_proc_address(&GetDeviceProcAddr, "vkGetDeviceProcAddr") + set_proc_address(&GetDeviceQueue, "vkGetDeviceQueue") + set_proc_address(&GetDeviceQueue2, "vkGetDeviceQueue2") + set_proc_address(&GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI") + set_proc_address(&GetEventStatus, "vkGetEventStatus") + set_proc_address(&GetFenceFdKHR, "vkGetFenceFdKHR") + set_proc_address(&GetFenceStatus, "vkGetFenceStatus") + set_proc_address(&GetFenceWin32HandleKHR, "vkGetFenceWin32HandleKHR") + set_proc_address(&GetGeneratedCommandsMemoryRequirementsNV, "vkGetGeneratedCommandsMemoryRequirementsNV") + set_proc_address(&GetImageDrmFormatModifierPropertiesEXT, "vkGetImageDrmFormatModifierPropertiesEXT") + set_proc_address(&GetImageMemoryRequirements, "vkGetImageMemoryRequirements") + set_proc_address(&GetImageMemoryRequirements2, "vkGetImageMemoryRequirements2") + set_proc_address(&GetImageMemoryRequirements2KHR, "vkGetImageMemoryRequirements2KHR") + set_proc_address(&GetImageSparseMemoryRequirements, "vkGetImageSparseMemoryRequirements") + set_proc_address(&GetImageSparseMemoryRequirements2, "vkGetImageSparseMemoryRequirements2") + set_proc_address(&GetImageSparseMemoryRequirements2KHR, "vkGetImageSparseMemoryRequirements2KHR") + set_proc_address(&GetImageSubresourceLayout, "vkGetImageSubresourceLayout") + set_proc_address(&GetImageViewAddressNVX, "vkGetImageViewAddressNVX") + set_proc_address(&GetImageViewHandleNVX, "vkGetImageViewHandleNVX") + set_proc_address(&GetMemoryFdKHR, "vkGetMemoryFdKHR") + set_proc_address(&GetMemoryFdPropertiesKHR, "vkGetMemoryFdPropertiesKHR") + set_proc_address(&GetMemoryHostPointerPropertiesEXT, "vkGetMemoryHostPointerPropertiesEXT") + set_proc_address(&GetMemoryRemoteAddressNV, "vkGetMemoryRemoteAddressNV") + set_proc_address(&GetMemoryWin32HandleKHR, "vkGetMemoryWin32HandleKHR") + set_proc_address(&GetMemoryWin32HandleNV, "vkGetMemoryWin32HandleNV") + set_proc_address(&GetMemoryWin32HandlePropertiesKHR, "vkGetMemoryWin32HandlePropertiesKHR") + set_proc_address(&GetPastPresentationTimingGOOGLE, "vkGetPastPresentationTimingGOOGLE") + set_proc_address(&GetPerformanceParameterINTEL, "vkGetPerformanceParameterINTEL") + set_proc_address(&GetPipelineCacheData, "vkGetPipelineCacheData") + set_proc_address(&GetPipelineExecutableInternalRepresentationsKHR, "vkGetPipelineExecutableInternalRepresentationsKHR") + set_proc_address(&GetPipelineExecutablePropertiesKHR, "vkGetPipelineExecutablePropertiesKHR") + set_proc_address(&GetPipelineExecutableStatisticsKHR, "vkGetPipelineExecutableStatisticsKHR") + set_proc_address(&GetPrivateDataEXT, "vkGetPrivateDataEXT") + set_proc_address(&GetQueryPoolResults, "vkGetQueryPoolResults") + set_proc_address(&GetQueueCheckpointData2NV, "vkGetQueueCheckpointData2NV") + set_proc_address(&GetQueueCheckpointDataNV, "vkGetQueueCheckpointDataNV") + set_proc_address(&GetRayTracingCaptureReplayShaderGroupHandlesKHR, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR") + set_proc_address(&GetRayTracingShaderGroupHandlesKHR, "vkGetRayTracingShaderGroupHandlesKHR") + set_proc_address(&GetRayTracingShaderGroupHandlesNV, "vkGetRayTracingShaderGroupHandlesNV") + set_proc_address(&GetRayTracingShaderGroupStackSizeKHR, "vkGetRayTracingShaderGroupStackSizeKHR") + set_proc_address(&GetRefreshCycleDurationGOOGLE, "vkGetRefreshCycleDurationGOOGLE") + set_proc_address(&GetRenderAreaGranularity, "vkGetRenderAreaGranularity") + set_proc_address(&GetSemaphoreCounterValue, "vkGetSemaphoreCounterValue") + set_proc_address(&GetSemaphoreCounterValueKHR, "vkGetSemaphoreCounterValueKHR") + set_proc_address(&GetSemaphoreFdKHR, "vkGetSemaphoreFdKHR") + set_proc_address(&GetSemaphoreWin32HandleKHR, "vkGetSemaphoreWin32HandleKHR") + set_proc_address(&GetShaderInfoAMD, "vkGetShaderInfoAMD") + set_proc_address(&GetSwapchainCounterEXT, "vkGetSwapchainCounterEXT") + set_proc_address(&GetSwapchainImagesKHR, "vkGetSwapchainImagesKHR") + set_proc_address(&GetSwapchainStatusKHR, "vkGetSwapchainStatusKHR") + set_proc_address(&GetValidationCacheDataEXT, "vkGetValidationCacheDataEXT") + set_proc_address(&ImportFenceFdKHR, "vkImportFenceFdKHR") + set_proc_address(&ImportFenceWin32HandleKHR, "vkImportFenceWin32HandleKHR") + set_proc_address(&ImportSemaphoreFdKHR, "vkImportSemaphoreFdKHR") + set_proc_address(&ImportSemaphoreWin32HandleKHR, "vkImportSemaphoreWin32HandleKHR") + set_proc_address(&InitializePerformanceApiINTEL, "vkInitializePerformanceApiINTEL") + set_proc_address(&InvalidateMappedMemoryRanges, "vkInvalidateMappedMemoryRanges") + set_proc_address(&MapMemory, "vkMapMemory") + set_proc_address(&MergePipelineCaches, "vkMergePipelineCaches") + set_proc_address(&MergeValidationCachesEXT, "vkMergeValidationCachesEXT") + set_proc_address(&QueueBeginDebugUtilsLabelEXT, "vkQueueBeginDebugUtilsLabelEXT") + set_proc_address(&QueueBindSparse, "vkQueueBindSparse") + set_proc_address(&QueueEndDebugUtilsLabelEXT, "vkQueueEndDebugUtilsLabelEXT") + set_proc_address(&QueueInsertDebugUtilsLabelEXT, "vkQueueInsertDebugUtilsLabelEXT") + set_proc_address(&QueuePresentKHR, "vkQueuePresentKHR") + set_proc_address(&QueueSetPerformanceConfigurationINTEL, "vkQueueSetPerformanceConfigurationINTEL") + set_proc_address(&QueueSubmit, "vkQueueSubmit") + set_proc_address(&QueueSubmit2KHR, "vkQueueSubmit2KHR") + set_proc_address(&QueueWaitIdle, "vkQueueWaitIdle") + set_proc_address(&RegisterDeviceEventEXT, "vkRegisterDeviceEventEXT") + set_proc_address(&RegisterDisplayEventEXT, "vkRegisterDisplayEventEXT") + set_proc_address(&ReleaseFullScreenExclusiveModeEXT, "vkReleaseFullScreenExclusiveModeEXT") + set_proc_address(&ReleasePerformanceConfigurationINTEL, "vkReleasePerformanceConfigurationINTEL") + set_proc_address(&ReleaseProfilingLockKHR, "vkReleaseProfilingLockKHR") + set_proc_address(&ResetCommandBuffer, "vkResetCommandBuffer") + set_proc_address(&ResetCommandPool, "vkResetCommandPool") + set_proc_address(&ResetDescriptorPool, "vkResetDescriptorPool") + set_proc_address(&ResetEvent, "vkResetEvent") + set_proc_address(&ResetFences, "vkResetFences") + set_proc_address(&ResetQueryPool, "vkResetQueryPool") + set_proc_address(&ResetQueryPoolEXT, "vkResetQueryPoolEXT") + set_proc_address(&SetDebugUtilsObjectNameEXT, "vkSetDebugUtilsObjectNameEXT") + set_proc_address(&SetDebugUtilsObjectTagEXT, "vkSetDebugUtilsObjectTagEXT") + set_proc_address(&SetDeviceMemoryPriorityEXT, "vkSetDeviceMemoryPriorityEXT") + set_proc_address(&SetEvent, "vkSetEvent") + set_proc_address(&SetHdrMetadataEXT, "vkSetHdrMetadataEXT") + set_proc_address(&SetLocalDimmingAMD, "vkSetLocalDimmingAMD") + set_proc_address(&SetPrivateDataEXT, "vkSetPrivateDataEXT") + set_proc_address(&SignalSemaphore, "vkSignalSemaphore") + set_proc_address(&SignalSemaphoreKHR, "vkSignalSemaphoreKHR") + set_proc_address(&TrimCommandPool, "vkTrimCommandPool") + set_proc_address(&TrimCommandPoolKHR, "vkTrimCommandPoolKHR") + set_proc_address(&UninitializePerformanceApiINTEL, "vkUninitializePerformanceApiINTEL") + set_proc_address(&UnmapMemory, "vkUnmapMemory") + set_proc_address(&UpdateDescriptorSetWithTemplate, "vkUpdateDescriptorSetWithTemplate") + set_proc_address(&UpdateDescriptorSetWithTemplateKHR, "vkUpdateDescriptorSetWithTemplateKHR") + set_proc_address(&UpdateDescriptorSets, "vkUpdateDescriptorSets") + set_proc_address(&WaitForFences, "vkWaitForFences") + set_proc_address(&WaitForPresentKHR, "vkWaitForPresentKHR") + set_proc_address(&WaitSemaphores, "vkWaitSemaphores") + set_proc_address(&WaitSemaphoresKHR, "vkWaitSemaphoresKHR") + set_proc_address(&WriteAccelerationStructuresPropertiesKHR, "vkWriteAccelerationStructuresPropertiesKHR") } +// Device Procedure VTable +Device_VTable :: struct { + AcquireFullScreenExclusiveModeEXT: ProcAcquireFullScreenExclusiveModeEXT, + AcquireNextImage2KHR: ProcAcquireNextImage2KHR, + AcquireNextImageKHR: ProcAcquireNextImageKHR, + AcquirePerformanceConfigurationINTEL: ProcAcquirePerformanceConfigurationINTEL, + AcquireProfilingLockKHR: ProcAcquireProfilingLockKHR, + AllocateCommandBuffers: ProcAllocateCommandBuffers, + AllocateDescriptorSets: ProcAllocateDescriptorSets, + AllocateMemory: ProcAllocateMemory, + BeginCommandBuffer: ProcBeginCommandBuffer, + BindAccelerationStructureMemoryNV: ProcBindAccelerationStructureMemoryNV, + BindBufferMemory: ProcBindBufferMemory, + BindBufferMemory2: ProcBindBufferMemory2, + BindBufferMemory2KHR: ProcBindBufferMemory2KHR, + BindImageMemory: ProcBindImageMemory, + BindImageMemory2: ProcBindImageMemory2, + BindImageMemory2KHR: ProcBindImageMemory2KHR, + BuildAccelerationStructuresKHR: ProcBuildAccelerationStructuresKHR, + CmdBeginConditionalRenderingEXT: ProcCmdBeginConditionalRenderingEXT, + CmdBeginDebugUtilsLabelEXT: ProcCmdBeginDebugUtilsLabelEXT, + CmdBeginQuery: ProcCmdBeginQuery, + CmdBeginQueryIndexedEXT: ProcCmdBeginQueryIndexedEXT, + CmdBeginRenderPass: ProcCmdBeginRenderPass, + CmdBeginRenderPass2: ProcCmdBeginRenderPass2, + CmdBeginRenderPass2KHR: ProcCmdBeginRenderPass2KHR, + CmdBeginTransformFeedbackEXT: ProcCmdBeginTransformFeedbackEXT, + CmdBindDescriptorSets: ProcCmdBindDescriptorSets, + CmdBindIndexBuffer: ProcCmdBindIndexBuffer, + CmdBindInvocationMaskHUAWEI: ProcCmdBindInvocationMaskHUAWEI, + CmdBindPipeline: ProcCmdBindPipeline, + CmdBindPipelineShaderGroupNV: ProcCmdBindPipelineShaderGroupNV, + CmdBindShadingRateImageNV: ProcCmdBindShadingRateImageNV, + CmdBindTransformFeedbackBuffersEXT: ProcCmdBindTransformFeedbackBuffersEXT, + CmdBindVertexBuffers: ProcCmdBindVertexBuffers, + CmdBindVertexBuffers2EXT: ProcCmdBindVertexBuffers2EXT, + CmdBlitImage: ProcCmdBlitImage, + CmdBlitImage2KHR: ProcCmdBlitImage2KHR, + CmdBuildAccelerationStructureNV: ProcCmdBuildAccelerationStructureNV, + CmdBuildAccelerationStructuresIndirectKHR: ProcCmdBuildAccelerationStructuresIndirectKHR, + CmdBuildAccelerationStructuresKHR: ProcCmdBuildAccelerationStructuresKHR, + CmdClearAttachments: ProcCmdClearAttachments, + CmdClearColorImage: ProcCmdClearColorImage, + CmdClearDepthStencilImage: ProcCmdClearDepthStencilImage, + CmdCopyAccelerationStructureKHR: ProcCmdCopyAccelerationStructureKHR, + CmdCopyAccelerationStructureNV: ProcCmdCopyAccelerationStructureNV, + CmdCopyAccelerationStructureToMemoryKHR: ProcCmdCopyAccelerationStructureToMemoryKHR, + CmdCopyBuffer: ProcCmdCopyBuffer, + CmdCopyBuffer2KHR: ProcCmdCopyBuffer2KHR, + CmdCopyBufferToImage: ProcCmdCopyBufferToImage, + CmdCopyBufferToImage2KHR: ProcCmdCopyBufferToImage2KHR, + CmdCopyImage: ProcCmdCopyImage, + CmdCopyImage2KHR: ProcCmdCopyImage2KHR, + CmdCopyImageToBuffer: ProcCmdCopyImageToBuffer, + CmdCopyImageToBuffer2KHR: ProcCmdCopyImageToBuffer2KHR, + CmdCopyMemoryToAccelerationStructureKHR: ProcCmdCopyMemoryToAccelerationStructureKHR, + CmdCopyQueryPoolResults: ProcCmdCopyQueryPoolResults, + CmdCuLaunchKernelNVX: ProcCmdCuLaunchKernelNVX, + CmdDebugMarkerBeginEXT: ProcCmdDebugMarkerBeginEXT, + CmdDebugMarkerEndEXT: ProcCmdDebugMarkerEndEXT, + CmdDebugMarkerInsertEXT: ProcCmdDebugMarkerInsertEXT, + CmdDispatch: ProcCmdDispatch, + CmdDispatchBase: ProcCmdDispatchBase, + CmdDispatchBaseKHR: ProcCmdDispatchBaseKHR, + CmdDispatchIndirect: ProcCmdDispatchIndirect, + CmdDraw: ProcCmdDraw, + CmdDrawIndexed: ProcCmdDrawIndexed, + CmdDrawIndexedIndirect: ProcCmdDrawIndexedIndirect, + CmdDrawIndexedIndirectCount: ProcCmdDrawIndexedIndirectCount, + CmdDrawIndexedIndirectCountAMD: ProcCmdDrawIndexedIndirectCountAMD, + CmdDrawIndexedIndirectCountKHR: ProcCmdDrawIndexedIndirectCountKHR, + CmdDrawIndirect: ProcCmdDrawIndirect, + CmdDrawIndirectByteCountEXT: ProcCmdDrawIndirectByteCountEXT, + CmdDrawIndirectCount: ProcCmdDrawIndirectCount, + CmdDrawIndirectCountAMD: ProcCmdDrawIndirectCountAMD, + CmdDrawIndirectCountKHR: ProcCmdDrawIndirectCountKHR, + CmdDrawMeshTasksIndirectCountNV: ProcCmdDrawMeshTasksIndirectCountNV, + CmdDrawMeshTasksIndirectNV: ProcCmdDrawMeshTasksIndirectNV, + CmdDrawMeshTasksNV: ProcCmdDrawMeshTasksNV, + CmdDrawMultiEXT: ProcCmdDrawMultiEXT, + CmdDrawMultiIndexedEXT: ProcCmdDrawMultiIndexedEXT, + CmdEndConditionalRenderingEXT: ProcCmdEndConditionalRenderingEXT, + CmdEndDebugUtilsLabelEXT: ProcCmdEndDebugUtilsLabelEXT, + CmdEndQuery: ProcCmdEndQuery, + CmdEndQueryIndexedEXT: ProcCmdEndQueryIndexedEXT, + CmdEndRenderPass: ProcCmdEndRenderPass, + CmdEndRenderPass2: ProcCmdEndRenderPass2, + CmdEndRenderPass2KHR: ProcCmdEndRenderPass2KHR, + CmdEndTransformFeedbackEXT: ProcCmdEndTransformFeedbackEXT, + CmdExecuteCommands: ProcCmdExecuteCommands, + CmdExecuteGeneratedCommandsNV: ProcCmdExecuteGeneratedCommandsNV, + CmdFillBuffer: ProcCmdFillBuffer, + CmdInsertDebugUtilsLabelEXT: ProcCmdInsertDebugUtilsLabelEXT, + CmdNextSubpass: ProcCmdNextSubpass, + CmdNextSubpass2: ProcCmdNextSubpass2, + CmdNextSubpass2KHR: ProcCmdNextSubpass2KHR, + CmdPipelineBarrier: ProcCmdPipelineBarrier, + CmdPipelineBarrier2KHR: ProcCmdPipelineBarrier2KHR, + CmdPreprocessGeneratedCommandsNV: ProcCmdPreprocessGeneratedCommandsNV, + CmdPushConstants: ProcCmdPushConstants, + CmdPushDescriptorSetKHR: ProcCmdPushDescriptorSetKHR, + CmdPushDescriptorSetWithTemplateKHR: ProcCmdPushDescriptorSetWithTemplateKHR, + CmdResetEvent: ProcCmdResetEvent, + CmdResetEvent2KHR: ProcCmdResetEvent2KHR, + CmdResetQueryPool: ProcCmdResetQueryPool, + CmdResolveImage: ProcCmdResolveImage, + CmdResolveImage2KHR: ProcCmdResolveImage2KHR, + CmdSetBlendConstants: ProcCmdSetBlendConstants, + CmdSetCheckpointNV: ProcCmdSetCheckpointNV, + CmdSetCoarseSampleOrderNV: ProcCmdSetCoarseSampleOrderNV, + CmdSetCullModeEXT: ProcCmdSetCullModeEXT, + CmdSetDepthBias: ProcCmdSetDepthBias, + CmdSetDepthBiasEnableEXT: ProcCmdSetDepthBiasEnableEXT, + CmdSetDepthBounds: ProcCmdSetDepthBounds, + CmdSetDepthBoundsTestEnableEXT: ProcCmdSetDepthBoundsTestEnableEXT, + CmdSetDepthCompareOpEXT: ProcCmdSetDepthCompareOpEXT, + CmdSetDepthTestEnableEXT: ProcCmdSetDepthTestEnableEXT, + CmdSetDepthWriteEnableEXT: ProcCmdSetDepthWriteEnableEXT, + CmdSetDeviceMask: ProcCmdSetDeviceMask, + CmdSetDeviceMaskKHR: ProcCmdSetDeviceMaskKHR, + CmdSetDiscardRectangleEXT: ProcCmdSetDiscardRectangleEXT, + CmdSetEvent: ProcCmdSetEvent, + CmdSetEvent2KHR: ProcCmdSetEvent2KHR, + CmdSetExclusiveScissorNV: ProcCmdSetExclusiveScissorNV, + CmdSetFragmentShadingRateEnumNV: ProcCmdSetFragmentShadingRateEnumNV, + CmdSetFragmentShadingRateKHR: ProcCmdSetFragmentShadingRateKHR, + CmdSetFrontFaceEXT: ProcCmdSetFrontFaceEXT, + CmdSetLineStippleEXT: ProcCmdSetLineStippleEXT, + CmdSetLineWidth: ProcCmdSetLineWidth, + CmdSetLogicOpEXT: ProcCmdSetLogicOpEXT, + CmdSetPatchControlPointsEXT: ProcCmdSetPatchControlPointsEXT, + CmdSetPerformanceMarkerINTEL: ProcCmdSetPerformanceMarkerINTEL, + CmdSetPerformanceOverrideINTEL: ProcCmdSetPerformanceOverrideINTEL, + CmdSetPerformanceStreamMarkerINTEL: ProcCmdSetPerformanceStreamMarkerINTEL, + CmdSetPrimitiveRestartEnableEXT: ProcCmdSetPrimitiveRestartEnableEXT, + CmdSetPrimitiveTopologyEXT: ProcCmdSetPrimitiveTopologyEXT, + CmdSetRasterizerDiscardEnableEXT: ProcCmdSetRasterizerDiscardEnableEXT, + CmdSetRayTracingPipelineStackSizeKHR: ProcCmdSetRayTracingPipelineStackSizeKHR, + CmdSetSampleLocationsEXT: ProcCmdSetSampleLocationsEXT, + CmdSetScissor: ProcCmdSetScissor, + CmdSetScissorWithCountEXT: ProcCmdSetScissorWithCountEXT, + CmdSetStencilCompareMask: ProcCmdSetStencilCompareMask, + CmdSetStencilOpEXT: ProcCmdSetStencilOpEXT, + CmdSetStencilReference: ProcCmdSetStencilReference, + CmdSetStencilTestEnableEXT: ProcCmdSetStencilTestEnableEXT, + CmdSetStencilWriteMask: ProcCmdSetStencilWriteMask, + CmdSetVertexInputEXT: ProcCmdSetVertexInputEXT, + CmdSetViewport: ProcCmdSetViewport, + CmdSetViewportShadingRatePaletteNV: ProcCmdSetViewportShadingRatePaletteNV, + CmdSetViewportWScalingNV: ProcCmdSetViewportWScalingNV, + CmdSetViewportWithCountEXT: ProcCmdSetViewportWithCountEXT, + CmdSubpassShadingHUAWEI: ProcCmdSubpassShadingHUAWEI, + CmdTraceRaysIndirectKHR: ProcCmdTraceRaysIndirectKHR, + CmdTraceRaysKHR: ProcCmdTraceRaysKHR, + CmdTraceRaysNV: ProcCmdTraceRaysNV, + CmdUpdateBuffer: ProcCmdUpdateBuffer, + CmdWaitEvents: ProcCmdWaitEvents, + CmdWaitEvents2KHR: ProcCmdWaitEvents2KHR, + CmdWriteAccelerationStructuresPropertiesKHR: ProcCmdWriteAccelerationStructuresPropertiesKHR, + CmdWriteAccelerationStructuresPropertiesNV: ProcCmdWriteAccelerationStructuresPropertiesNV, + CmdWriteBufferMarker2AMD: ProcCmdWriteBufferMarker2AMD, + CmdWriteBufferMarkerAMD: ProcCmdWriteBufferMarkerAMD, + CmdWriteTimestamp: ProcCmdWriteTimestamp, + CmdWriteTimestamp2KHR: ProcCmdWriteTimestamp2KHR, + CompileDeferredNV: ProcCompileDeferredNV, + CopyAccelerationStructureKHR: ProcCopyAccelerationStructureKHR, + CopyAccelerationStructureToMemoryKHR: ProcCopyAccelerationStructureToMemoryKHR, + CopyMemoryToAccelerationStructureKHR: ProcCopyMemoryToAccelerationStructureKHR, + CreateAccelerationStructureKHR: ProcCreateAccelerationStructureKHR, + CreateAccelerationStructureNV: ProcCreateAccelerationStructureNV, + CreateBuffer: ProcCreateBuffer, + CreateBufferView: ProcCreateBufferView, + CreateCommandPool: ProcCreateCommandPool, + CreateComputePipelines: ProcCreateComputePipelines, + CreateCuFunctionNVX: ProcCreateCuFunctionNVX, + CreateCuModuleNVX: ProcCreateCuModuleNVX, + CreateDeferredOperationKHR: ProcCreateDeferredOperationKHR, + CreateDescriptorPool: ProcCreateDescriptorPool, + CreateDescriptorSetLayout: ProcCreateDescriptorSetLayout, + CreateDescriptorUpdateTemplate: ProcCreateDescriptorUpdateTemplate, + CreateDescriptorUpdateTemplateKHR: ProcCreateDescriptorUpdateTemplateKHR, + CreateEvent: ProcCreateEvent, + CreateFence: ProcCreateFence, + CreateFramebuffer: ProcCreateFramebuffer, + CreateGraphicsPipelines: ProcCreateGraphicsPipelines, + CreateImage: ProcCreateImage, + CreateImageView: ProcCreateImageView, + CreateIndirectCommandsLayoutNV: ProcCreateIndirectCommandsLayoutNV, + CreatePipelineCache: ProcCreatePipelineCache, + CreatePipelineLayout: ProcCreatePipelineLayout, + CreatePrivateDataSlotEXT: ProcCreatePrivateDataSlotEXT, + CreateQueryPool: ProcCreateQueryPool, + CreateRayTracingPipelinesKHR: ProcCreateRayTracingPipelinesKHR, + CreateRayTracingPipelinesNV: ProcCreateRayTracingPipelinesNV, + CreateRenderPass: ProcCreateRenderPass, + CreateRenderPass2: ProcCreateRenderPass2, + CreateRenderPass2KHR: ProcCreateRenderPass2KHR, + CreateSampler: ProcCreateSampler, + CreateSamplerYcbcrConversion: ProcCreateSamplerYcbcrConversion, + CreateSamplerYcbcrConversionKHR: ProcCreateSamplerYcbcrConversionKHR, + CreateSemaphore: ProcCreateSemaphore, + CreateShaderModule: ProcCreateShaderModule, + CreateSharedSwapchainsKHR: ProcCreateSharedSwapchainsKHR, + CreateSwapchainKHR: ProcCreateSwapchainKHR, + CreateValidationCacheEXT: ProcCreateValidationCacheEXT, + DebugMarkerSetObjectNameEXT: ProcDebugMarkerSetObjectNameEXT, + DebugMarkerSetObjectTagEXT: ProcDebugMarkerSetObjectTagEXT, + DeferredOperationJoinKHR: ProcDeferredOperationJoinKHR, + DestroyAccelerationStructureKHR: ProcDestroyAccelerationStructureKHR, + DestroyAccelerationStructureNV: ProcDestroyAccelerationStructureNV, + DestroyBuffer: ProcDestroyBuffer, + DestroyBufferView: ProcDestroyBufferView, + DestroyCommandPool: ProcDestroyCommandPool, + DestroyCuFunctionNVX: ProcDestroyCuFunctionNVX, + DestroyCuModuleNVX: ProcDestroyCuModuleNVX, + DestroyDeferredOperationKHR: ProcDestroyDeferredOperationKHR, + DestroyDescriptorPool: ProcDestroyDescriptorPool, + DestroyDescriptorSetLayout: ProcDestroyDescriptorSetLayout, + DestroyDescriptorUpdateTemplate: ProcDestroyDescriptorUpdateTemplate, + DestroyDescriptorUpdateTemplateKHR: ProcDestroyDescriptorUpdateTemplateKHR, + DestroyDevice: ProcDestroyDevice, + DestroyEvent: ProcDestroyEvent, + DestroyFence: ProcDestroyFence, + DestroyFramebuffer: ProcDestroyFramebuffer, + DestroyImage: ProcDestroyImage, + DestroyImageView: ProcDestroyImageView, + DestroyIndirectCommandsLayoutNV: ProcDestroyIndirectCommandsLayoutNV, + DestroyPipeline: ProcDestroyPipeline, + DestroyPipelineCache: ProcDestroyPipelineCache, + DestroyPipelineLayout: ProcDestroyPipelineLayout, + DestroyPrivateDataSlotEXT: ProcDestroyPrivateDataSlotEXT, + DestroyQueryPool: ProcDestroyQueryPool, + DestroyRenderPass: ProcDestroyRenderPass, + DestroySampler: ProcDestroySampler, + DestroySamplerYcbcrConversion: ProcDestroySamplerYcbcrConversion, + DestroySamplerYcbcrConversionKHR: ProcDestroySamplerYcbcrConversionKHR, + DestroySemaphore: ProcDestroySemaphore, + DestroyShaderModule: ProcDestroyShaderModule, + DestroySwapchainKHR: ProcDestroySwapchainKHR, + DestroyValidationCacheEXT: ProcDestroyValidationCacheEXT, + DeviceWaitIdle: ProcDeviceWaitIdle, + DisplayPowerControlEXT: ProcDisplayPowerControlEXT, + EndCommandBuffer: ProcEndCommandBuffer, + FlushMappedMemoryRanges: ProcFlushMappedMemoryRanges, + FreeCommandBuffers: ProcFreeCommandBuffers, + FreeDescriptorSets: ProcFreeDescriptorSets, + FreeMemory: ProcFreeMemory, + GetAccelerationStructureBuildSizesKHR: ProcGetAccelerationStructureBuildSizesKHR, + GetAccelerationStructureDeviceAddressKHR: ProcGetAccelerationStructureDeviceAddressKHR, + GetAccelerationStructureHandleNV: ProcGetAccelerationStructureHandleNV, + GetAccelerationStructureMemoryRequirementsNV: ProcGetAccelerationStructureMemoryRequirementsNV, + GetBufferDeviceAddress: ProcGetBufferDeviceAddress, + GetBufferDeviceAddressEXT: ProcGetBufferDeviceAddressEXT, + GetBufferDeviceAddressKHR: ProcGetBufferDeviceAddressKHR, + GetBufferMemoryRequirements: ProcGetBufferMemoryRequirements, + GetBufferMemoryRequirements2: ProcGetBufferMemoryRequirements2, + GetBufferMemoryRequirements2KHR: ProcGetBufferMemoryRequirements2KHR, + GetBufferOpaqueCaptureAddress: ProcGetBufferOpaqueCaptureAddress, + GetBufferOpaqueCaptureAddressKHR: ProcGetBufferOpaqueCaptureAddressKHR, + GetCalibratedTimestampsEXT: ProcGetCalibratedTimestampsEXT, + GetDeferredOperationMaxConcurrencyKHR: ProcGetDeferredOperationMaxConcurrencyKHR, + GetDeferredOperationResultKHR: ProcGetDeferredOperationResultKHR, + GetDescriptorSetLayoutSupport: ProcGetDescriptorSetLayoutSupport, + GetDescriptorSetLayoutSupportKHR: ProcGetDescriptorSetLayoutSupportKHR, + GetDeviceAccelerationStructureCompatibilityKHR: ProcGetDeviceAccelerationStructureCompatibilityKHR, + GetDeviceGroupPeerMemoryFeatures: ProcGetDeviceGroupPeerMemoryFeatures, + GetDeviceGroupPeerMemoryFeaturesKHR: ProcGetDeviceGroupPeerMemoryFeaturesKHR, + GetDeviceGroupPresentCapabilitiesKHR: ProcGetDeviceGroupPresentCapabilitiesKHR, + GetDeviceGroupSurfacePresentModes2EXT: ProcGetDeviceGroupSurfacePresentModes2EXT, + GetDeviceGroupSurfacePresentModesKHR: ProcGetDeviceGroupSurfacePresentModesKHR, + GetDeviceMemoryCommitment: ProcGetDeviceMemoryCommitment, + GetDeviceMemoryOpaqueCaptureAddress: ProcGetDeviceMemoryOpaqueCaptureAddress, + GetDeviceMemoryOpaqueCaptureAddressKHR: ProcGetDeviceMemoryOpaqueCaptureAddressKHR, + GetDeviceProcAddr: ProcGetDeviceProcAddr, + GetDeviceQueue: ProcGetDeviceQueue, + GetDeviceQueue2: ProcGetDeviceQueue2, + GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI: ProcGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI, + GetEventStatus: ProcGetEventStatus, + GetFenceFdKHR: ProcGetFenceFdKHR, + GetFenceStatus: ProcGetFenceStatus, + GetFenceWin32HandleKHR: ProcGetFenceWin32HandleKHR, + GetGeneratedCommandsMemoryRequirementsNV: ProcGetGeneratedCommandsMemoryRequirementsNV, + GetImageDrmFormatModifierPropertiesEXT: ProcGetImageDrmFormatModifierPropertiesEXT, + GetImageMemoryRequirements: ProcGetImageMemoryRequirements, + GetImageMemoryRequirements2: ProcGetImageMemoryRequirements2, + GetImageMemoryRequirements2KHR: ProcGetImageMemoryRequirements2KHR, + GetImageSparseMemoryRequirements: ProcGetImageSparseMemoryRequirements, + GetImageSparseMemoryRequirements2: ProcGetImageSparseMemoryRequirements2, + GetImageSparseMemoryRequirements2KHR: ProcGetImageSparseMemoryRequirements2KHR, + GetImageSubresourceLayout: ProcGetImageSubresourceLayout, + GetImageViewAddressNVX: ProcGetImageViewAddressNVX, + GetImageViewHandleNVX: ProcGetImageViewHandleNVX, + GetMemoryFdKHR: ProcGetMemoryFdKHR, + GetMemoryFdPropertiesKHR: ProcGetMemoryFdPropertiesKHR, + GetMemoryHostPointerPropertiesEXT: ProcGetMemoryHostPointerPropertiesEXT, + GetMemoryRemoteAddressNV: ProcGetMemoryRemoteAddressNV, + GetMemoryWin32HandleKHR: ProcGetMemoryWin32HandleKHR, + GetMemoryWin32HandleNV: ProcGetMemoryWin32HandleNV, + GetMemoryWin32HandlePropertiesKHR: ProcGetMemoryWin32HandlePropertiesKHR, + GetPastPresentationTimingGOOGLE: ProcGetPastPresentationTimingGOOGLE, + GetPerformanceParameterINTEL: ProcGetPerformanceParameterINTEL, + GetPipelineCacheData: ProcGetPipelineCacheData, + GetPipelineExecutableInternalRepresentationsKHR: ProcGetPipelineExecutableInternalRepresentationsKHR, + GetPipelineExecutablePropertiesKHR: ProcGetPipelineExecutablePropertiesKHR, + GetPipelineExecutableStatisticsKHR: ProcGetPipelineExecutableStatisticsKHR, + GetPrivateDataEXT: ProcGetPrivateDataEXT, + GetQueryPoolResults: ProcGetQueryPoolResults, + GetQueueCheckpointData2NV: ProcGetQueueCheckpointData2NV, + GetQueueCheckpointDataNV: ProcGetQueueCheckpointDataNV, + GetRayTracingCaptureReplayShaderGroupHandlesKHR: ProcGetRayTracingCaptureReplayShaderGroupHandlesKHR, + GetRayTracingShaderGroupHandlesKHR: ProcGetRayTracingShaderGroupHandlesKHR, + GetRayTracingShaderGroupHandlesNV: ProcGetRayTracingShaderGroupHandlesNV, + GetRayTracingShaderGroupStackSizeKHR: ProcGetRayTracingShaderGroupStackSizeKHR, + GetRefreshCycleDurationGOOGLE: ProcGetRefreshCycleDurationGOOGLE, + GetRenderAreaGranularity: ProcGetRenderAreaGranularity, + GetSemaphoreCounterValue: ProcGetSemaphoreCounterValue, + GetSemaphoreCounterValueKHR: ProcGetSemaphoreCounterValueKHR, + GetSemaphoreFdKHR: ProcGetSemaphoreFdKHR, + GetSemaphoreWin32HandleKHR: ProcGetSemaphoreWin32HandleKHR, + GetShaderInfoAMD: ProcGetShaderInfoAMD, + GetSwapchainCounterEXT: ProcGetSwapchainCounterEXT, + GetSwapchainImagesKHR: ProcGetSwapchainImagesKHR, + GetSwapchainStatusKHR: ProcGetSwapchainStatusKHR, + GetValidationCacheDataEXT: ProcGetValidationCacheDataEXT, + ImportFenceFdKHR: ProcImportFenceFdKHR, + ImportFenceWin32HandleKHR: ProcImportFenceWin32HandleKHR, + ImportSemaphoreFdKHR: ProcImportSemaphoreFdKHR, + ImportSemaphoreWin32HandleKHR: ProcImportSemaphoreWin32HandleKHR, + InitializePerformanceApiINTEL: ProcInitializePerformanceApiINTEL, + InvalidateMappedMemoryRanges: ProcInvalidateMappedMemoryRanges, + MapMemory: ProcMapMemory, + MergePipelineCaches: ProcMergePipelineCaches, + MergeValidationCachesEXT: ProcMergeValidationCachesEXT, + QueueBeginDebugUtilsLabelEXT: ProcQueueBeginDebugUtilsLabelEXT, + QueueBindSparse: ProcQueueBindSparse, + QueueEndDebugUtilsLabelEXT: ProcQueueEndDebugUtilsLabelEXT, + QueueInsertDebugUtilsLabelEXT: ProcQueueInsertDebugUtilsLabelEXT, + QueuePresentKHR: ProcQueuePresentKHR, + QueueSetPerformanceConfigurationINTEL: ProcQueueSetPerformanceConfigurationINTEL, + QueueSubmit: ProcQueueSubmit, + QueueSubmit2KHR: ProcQueueSubmit2KHR, + QueueWaitIdle: ProcQueueWaitIdle, + RegisterDeviceEventEXT: ProcRegisterDeviceEventEXT, + RegisterDisplayEventEXT: ProcRegisterDisplayEventEXT, + ReleaseFullScreenExclusiveModeEXT: ProcReleaseFullScreenExclusiveModeEXT, + ReleasePerformanceConfigurationINTEL: ProcReleasePerformanceConfigurationINTEL, + ReleaseProfilingLockKHR: ProcReleaseProfilingLockKHR, + ResetCommandBuffer: ProcResetCommandBuffer, + ResetCommandPool: ProcResetCommandPool, + ResetDescriptorPool: ProcResetDescriptorPool, + ResetEvent: ProcResetEvent, + ResetFences: ProcResetFences, + ResetQueryPool: ProcResetQueryPool, + ResetQueryPoolEXT: ProcResetQueryPoolEXT, + SetDebugUtilsObjectNameEXT: ProcSetDebugUtilsObjectNameEXT, + SetDebugUtilsObjectTagEXT: ProcSetDebugUtilsObjectTagEXT, + SetDeviceMemoryPriorityEXT: ProcSetDeviceMemoryPriorityEXT, + SetEvent: ProcSetEvent, + SetHdrMetadataEXT: ProcSetHdrMetadataEXT, + SetLocalDimmingAMD: ProcSetLocalDimmingAMD, + SetPrivateDataEXT: ProcSetPrivateDataEXT, + SignalSemaphore: ProcSignalSemaphore, + SignalSemaphoreKHR: ProcSignalSemaphoreKHR, + TrimCommandPool: ProcTrimCommandPool, + TrimCommandPoolKHR: ProcTrimCommandPoolKHR, + UninitializePerformanceApiINTEL: ProcUninitializePerformanceApiINTEL, + UnmapMemory: ProcUnmapMemory, + UpdateDescriptorSetWithTemplate: ProcUpdateDescriptorSetWithTemplate, + UpdateDescriptorSetWithTemplateKHR: ProcUpdateDescriptorSetWithTemplateKHR, + UpdateDescriptorSets: ProcUpdateDescriptorSets, + WaitForFences: ProcWaitForFences, + WaitForPresentKHR: ProcWaitForPresentKHR, + WaitSemaphores: ProcWaitSemaphores, + WaitSemaphoresKHR: ProcWaitSemaphoresKHR, + WriteAccelerationStructuresPropertiesKHR: ProcWriteAccelerationStructuresPropertiesKHR, +} + +load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable) { + vtable.AcquireFullScreenExclusiveModeEXT = auto_cast GetDeviceProcAddr(device, "vkAcquireFullScreenExclusiveModeEXT") + vtable.AcquireNextImage2KHR = auto_cast GetDeviceProcAddr(device, "vkAcquireNextImage2KHR") + vtable.AcquireNextImageKHR = auto_cast GetDeviceProcAddr(device, "vkAcquireNextImageKHR") + vtable.AcquirePerformanceConfigurationINTEL = auto_cast GetDeviceProcAddr(device, "vkAcquirePerformanceConfigurationINTEL") + vtable.AcquireProfilingLockKHR = auto_cast GetDeviceProcAddr(device, "vkAcquireProfilingLockKHR") + vtable.AllocateCommandBuffers = auto_cast GetDeviceProcAddr(device, "vkAllocateCommandBuffers") + vtable.AllocateDescriptorSets = auto_cast GetDeviceProcAddr(device, "vkAllocateDescriptorSets") + vtable.AllocateMemory = auto_cast GetDeviceProcAddr(device, "vkAllocateMemory") + vtable.BeginCommandBuffer = auto_cast GetDeviceProcAddr(device, "vkBeginCommandBuffer") + vtable.BindAccelerationStructureMemoryNV = auto_cast GetDeviceProcAddr(device, "vkBindAccelerationStructureMemoryNV") + vtable.BindBufferMemory = auto_cast GetDeviceProcAddr(device, "vkBindBufferMemory") + vtable.BindBufferMemory2 = auto_cast GetDeviceProcAddr(device, "vkBindBufferMemory2") + vtable.BindBufferMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkBindBufferMemory2KHR") + vtable.BindImageMemory = auto_cast GetDeviceProcAddr(device, "vkBindImageMemory") + vtable.BindImageMemory2 = auto_cast GetDeviceProcAddr(device, "vkBindImageMemory2") + vtable.BindImageMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkBindImageMemory2KHR") + vtable.BuildAccelerationStructuresKHR = auto_cast GetDeviceProcAddr(device, "vkBuildAccelerationStructuresKHR") + vtable.CmdBeginConditionalRenderingEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginConditionalRenderingEXT") + vtable.CmdBeginDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginDebugUtilsLabelEXT") + vtable.CmdBeginQuery = auto_cast GetDeviceProcAddr(device, "vkCmdBeginQuery") + vtable.CmdBeginQueryIndexedEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginQueryIndexedEXT") + vtable.CmdBeginRenderPass = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRenderPass") + vtable.CmdBeginRenderPass2 = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRenderPass2") + vtable.CmdBeginRenderPass2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRenderPass2KHR") + vtable.CmdBeginTransformFeedbackEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginTransformFeedbackEXT") + vtable.CmdBindDescriptorSets = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorSets") + vtable.CmdBindIndexBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer") + vtable.CmdBindInvocationMaskHUAWEI = auto_cast GetDeviceProcAddr(device, "vkCmdBindInvocationMaskHUAWEI") + vtable.CmdBindPipeline = auto_cast GetDeviceProcAddr(device, "vkCmdBindPipeline") + vtable.CmdBindPipelineShaderGroupNV = auto_cast GetDeviceProcAddr(device, "vkCmdBindPipelineShaderGroupNV") + vtable.CmdBindShadingRateImageNV = auto_cast GetDeviceProcAddr(device, "vkCmdBindShadingRateImageNV") + vtable.CmdBindTransformFeedbackBuffersEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindTransformFeedbackBuffersEXT") + vtable.CmdBindVertexBuffers = auto_cast GetDeviceProcAddr(device, "vkCmdBindVertexBuffers") + vtable.CmdBindVertexBuffers2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindVertexBuffers2EXT") + vtable.CmdBlitImage = auto_cast GetDeviceProcAddr(device, "vkCmdBlitImage") + vtable.CmdBlitImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBlitImage2KHR") + vtable.CmdBuildAccelerationStructureNV = auto_cast GetDeviceProcAddr(device, "vkCmdBuildAccelerationStructureNV") + vtable.CmdBuildAccelerationStructuresIndirectKHR = auto_cast GetDeviceProcAddr(device, "vkCmdBuildAccelerationStructuresIndirectKHR") + vtable.CmdBuildAccelerationStructuresKHR = auto_cast GetDeviceProcAddr(device, "vkCmdBuildAccelerationStructuresKHR") + vtable.CmdClearAttachments = auto_cast GetDeviceProcAddr(device, "vkCmdClearAttachments") + vtable.CmdClearColorImage = auto_cast GetDeviceProcAddr(device, "vkCmdClearColorImage") + vtable.CmdClearDepthStencilImage = auto_cast GetDeviceProcAddr(device, "vkCmdClearDepthStencilImage") + vtable.CmdCopyAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyAccelerationStructureKHR") + vtable.CmdCopyAccelerationStructureNV = auto_cast GetDeviceProcAddr(device, "vkCmdCopyAccelerationStructureNV") + vtable.CmdCopyAccelerationStructureToMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyAccelerationStructureToMemoryKHR") + vtable.CmdCopyBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBuffer") + vtable.CmdCopyBuffer2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBuffer2KHR") + vtable.CmdCopyBufferToImage = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBufferToImage") + vtable.CmdCopyBufferToImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBufferToImage2KHR") + vtable.CmdCopyImage = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImage") + vtable.CmdCopyImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImage2KHR") + vtable.CmdCopyImageToBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImageToBuffer") + vtable.CmdCopyImageToBuffer2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImageToBuffer2KHR") + vtable.CmdCopyMemoryToAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryToAccelerationStructureKHR") + vtable.CmdCopyQueryPoolResults = auto_cast GetDeviceProcAddr(device, "vkCmdCopyQueryPoolResults") + vtable.CmdCuLaunchKernelNVX = auto_cast GetDeviceProcAddr(device, "vkCmdCuLaunchKernelNVX") + vtable.CmdDebugMarkerBeginEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT") + vtable.CmdDebugMarkerEndEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT") + vtable.CmdDebugMarkerInsertEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDebugMarkerInsertEXT") + vtable.CmdDispatch = auto_cast GetDeviceProcAddr(device, "vkCmdDispatch") + vtable.CmdDispatchBase = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchBase") + vtable.CmdDispatchBaseKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchBaseKHR") + vtable.CmdDispatchIndirect = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchIndirect") + vtable.CmdDraw = auto_cast GetDeviceProcAddr(device, "vkCmdDraw") + vtable.CmdDrawIndexed = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexed") + vtable.CmdDrawIndexedIndirect = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirect") + vtable.CmdDrawIndexedIndirectCount = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCount") + vtable.CmdDrawIndexedIndirectCountAMD = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCountAMD") + vtable.CmdDrawIndexedIndirectCountKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCountKHR") + vtable.CmdDrawIndirect = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirect") + vtable.CmdDrawIndirectByteCountEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectByteCountEXT") + vtable.CmdDrawIndirectCount = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCount") + vtable.CmdDrawIndirectCountAMD = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCountAMD") + vtable.CmdDrawIndirectCountKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCountKHR") + vtable.CmdDrawMeshTasksIndirectCountNV = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectCountNV") + vtable.CmdDrawMeshTasksIndirectNV = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectNV") + vtable.CmdDrawMeshTasksNV = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksNV") + vtable.CmdDrawMultiEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMultiEXT") + vtable.CmdDrawMultiIndexedEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMultiIndexedEXT") + vtable.CmdEndConditionalRenderingEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndConditionalRenderingEXT") + vtable.CmdEndDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndDebugUtilsLabelEXT") + vtable.CmdEndQuery = auto_cast GetDeviceProcAddr(device, "vkCmdEndQuery") + vtable.CmdEndQueryIndexedEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndQueryIndexedEXT") + vtable.CmdEndRenderPass = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderPass") + vtable.CmdEndRenderPass2 = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderPass2") + vtable.CmdEndRenderPass2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderPass2KHR") + vtable.CmdEndTransformFeedbackEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndTransformFeedbackEXT") + vtable.CmdExecuteCommands = auto_cast GetDeviceProcAddr(device, "vkCmdExecuteCommands") + vtable.CmdExecuteGeneratedCommandsNV = auto_cast GetDeviceProcAddr(device, "vkCmdExecuteGeneratedCommandsNV") + vtable.CmdFillBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdFillBuffer") + vtable.CmdInsertDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkCmdInsertDebugUtilsLabelEXT") + vtable.CmdNextSubpass = auto_cast GetDeviceProcAddr(device, "vkCmdNextSubpass") + vtable.CmdNextSubpass2 = auto_cast GetDeviceProcAddr(device, "vkCmdNextSubpass2") + vtable.CmdNextSubpass2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdNextSubpass2KHR") + vtable.CmdPipelineBarrier = auto_cast GetDeviceProcAddr(device, "vkCmdPipelineBarrier") + vtable.CmdPipelineBarrier2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdPipelineBarrier2KHR") + vtable.CmdPreprocessGeneratedCommandsNV = auto_cast GetDeviceProcAddr(device, "vkCmdPreprocessGeneratedCommandsNV") + vtable.CmdPushConstants = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants") + vtable.CmdPushDescriptorSetKHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetKHR") + vtable.CmdPushDescriptorSetWithTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetWithTemplateKHR") + vtable.CmdResetEvent = auto_cast GetDeviceProcAddr(device, "vkCmdResetEvent") + vtable.CmdResetEvent2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdResetEvent2KHR") + vtable.CmdResetQueryPool = auto_cast GetDeviceProcAddr(device, "vkCmdResetQueryPool") + vtable.CmdResolveImage = auto_cast GetDeviceProcAddr(device, "vkCmdResolveImage") + vtable.CmdResolveImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdResolveImage2KHR") + vtable.CmdSetBlendConstants = auto_cast GetDeviceProcAddr(device, "vkCmdSetBlendConstants") + vtable.CmdSetCheckpointNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetCheckpointNV") + vtable.CmdSetCoarseSampleOrderNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetCoarseSampleOrderNV") + vtable.CmdSetCullModeEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetCullModeEXT") + vtable.CmdSetDepthBias = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthBias") + vtable.CmdSetDepthBiasEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthBiasEnableEXT") + vtable.CmdSetDepthBounds = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthBounds") + vtable.CmdSetDepthBoundsTestEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthBoundsTestEnableEXT") + vtable.CmdSetDepthCompareOpEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthCompareOpEXT") + vtable.CmdSetDepthTestEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthTestEnableEXT") + vtable.CmdSetDepthWriteEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthWriteEnableEXT") + vtable.CmdSetDeviceMask = auto_cast GetDeviceProcAddr(device, "vkCmdSetDeviceMask") + vtable.CmdSetDeviceMaskKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetDeviceMaskKHR") + vtable.CmdSetDiscardRectangleEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDiscardRectangleEXT") + vtable.CmdSetEvent = auto_cast GetDeviceProcAddr(device, "vkCmdSetEvent") + vtable.CmdSetEvent2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetEvent2KHR") + vtable.CmdSetExclusiveScissorNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetExclusiveScissorNV") + vtable.CmdSetFragmentShadingRateEnumNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetFragmentShadingRateEnumNV") + vtable.CmdSetFragmentShadingRateKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetFragmentShadingRateKHR") + vtable.CmdSetFrontFaceEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetFrontFaceEXT") + vtable.CmdSetLineStippleEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineStippleEXT") + vtable.CmdSetLineWidth = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineWidth") + vtable.CmdSetLogicOpEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetLogicOpEXT") + vtable.CmdSetPatchControlPointsEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPatchControlPointsEXT") + vtable.CmdSetPerformanceMarkerINTEL = auto_cast GetDeviceProcAddr(device, "vkCmdSetPerformanceMarkerINTEL") + vtable.CmdSetPerformanceOverrideINTEL = auto_cast GetDeviceProcAddr(device, "vkCmdSetPerformanceOverrideINTEL") + vtable.CmdSetPerformanceStreamMarkerINTEL = auto_cast GetDeviceProcAddr(device, "vkCmdSetPerformanceStreamMarkerINTEL") + vtable.CmdSetPrimitiveRestartEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveRestartEnableEXT") + vtable.CmdSetPrimitiveTopologyEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveTopologyEXT") + vtable.CmdSetRasterizerDiscardEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetRasterizerDiscardEnableEXT") + vtable.CmdSetRayTracingPipelineStackSizeKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetRayTracingPipelineStackSizeKHR") + vtable.CmdSetSampleLocationsEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetSampleLocationsEXT") + vtable.CmdSetScissor = auto_cast GetDeviceProcAddr(device, "vkCmdSetScissor") + vtable.CmdSetScissorWithCountEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetScissorWithCountEXT") + vtable.CmdSetStencilCompareMask = auto_cast GetDeviceProcAddr(device, "vkCmdSetStencilCompareMask") + vtable.CmdSetStencilOpEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetStencilOpEXT") + vtable.CmdSetStencilReference = auto_cast GetDeviceProcAddr(device, "vkCmdSetStencilReference") + vtable.CmdSetStencilTestEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetStencilTestEnableEXT") + vtable.CmdSetStencilWriteMask = auto_cast GetDeviceProcAddr(device, "vkCmdSetStencilWriteMask") + vtable.CmdSetVertexInputEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetVertexInputEXT") + vtable.CmdSetViewport = auto_cast GetDeviceProcAddr(device, "vkCmdSetViewport") + vtable.CmdSetViewportShadingRatePaletteNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetViewportShadingRatePaletteNV") + vtable.CmdSetViewportWScalingNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetViewportWScalingNV") + vtable.CmdSetViewportWithCountEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetViewportWithCountEXT") + vtable.CmdSubpassShadingHUAWEI = auto_cast GetDeviceProcAddr(device, "vkCmdSubpassShadingHUAWEI") + vtable.CmdTraceRaysIndirectKHR = auto_cast GetDeviceProcAddr(device, "vkCmdTraceRaysIndirectKHR") + vtable.CmdTraceRaysKHR = auto_cast GetDeviceProcAddr(device, "vkCmdTraceRaysKHR") + vtable.CmdTraceRaysNV = auto_cast GetDeviceProcAddr(device, "vkCmdTraceRaysNV") + vtable.CmdUpdateBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdUpdateBuffer") + vtable.CmdWaitEvents = auto_cast GetDeviceProcAddr(device, "vkCmdWaitEvents") + vtable.CmdWaitEvents2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdWaitEvents2KHR") + vtable.CmdWriteAccelerationStructuresPropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkCmdWriteAccelerationStructuresPropertiesKHR") + vtable.CmdWriteAccelerationStructuresPropertiesNV = auto_cast GetDeviceProcAddr(device, "vkCmdWriteAccelerationStructuresPropertiesNV") + vtable.CmdWriteBufferMarker2AMD = auto_cast GetDeviceProcAddr(device, "vkCmdWriteBufferMarker2AMD") + vtable.CmdWriteBufferMarkerAMD = auto_cast GetDeviceProcAddr(device, "vkCmdWriteBufferMarkerAMD") + vtable.CmdWriteTimestamp = auto_cast GetDeviceProcAddr(device, "vkCmdWriteTimestamp") + vtable.CmdWriteTimestamp2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdWriteTimestamp2KHR") + vtable.CompileDeferredNV = auto_cast GetDeviceProcAddr(device, "vkCompileDeferredNV") + vtable.CopyAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCopyAccelerationStructureKHR") + vtable.CopyAccelerationStructureToMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCopyAccelerationStructureToMemoryKHR") + vtable.CopyMemoryToAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCopyMemoryToAccelerationStructureKHR") + vtable.CreateAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCreateAccelerationStructureKHR") + vtable.CreateAccelerationStructureNV = auto_cast GetDeviceProcAddr(device, "vkCreateAccelerationStructureNV") + vtable.CreateBuffer = auto_cast GetDeviceProcAddr(device, "vkCreateBuffer") + vtable.CreateBufferView = auto_cast GetDeviceProcAddr(device, "vkCreateBufferView") + vtable.CreateCommandPool = auto_cast GetDeviceProcAddr(device, "vkCreateCommandPool") + vtable.CreateComputePipelines = auto_cast GetDeviceProcAddr(device, "vkCreateComputePipelines") + vtable.CreateCuFunctionNVX = auto_cast GetDeviceProcAddr(device, "vkCreateCuFunctionNVX") + vtable.CreateCuModuleNVX = auto_cast GetDeviceProcAddr(device, "vkCreateCuModuleNVX") + vtable.CreateDeferredOperationKHR = auto_cast GetDeviceProcAddr(device, "vkCreateDeferredOperationKHR") + vtable.CreateDescriptorPool = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorPool") + vtable.CreateDescriptorSetLayout = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorSetLayout") + vtable.CreateDescriptorUpdateTemplate = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorUpdateTemplate") + vtable.CreateDescriptorUpdateTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorUpdateTemplateKHR") + vtable.CreateEvent = auto_cast GetDeviceProcAddr(device, "vkCreateEvent") + vtable.CreateFence = auto_cast GetDeviceProcAddr(device, "vkCreateFence") + vtable.CreateFramebuffer = auto_cast GetDeviceProcAddr(device, "vkCreateFramebuffer") + vtable.CreateGraphicsPipelines = auto_cast GetDeviceProcAddr(device, "vkCreateGraphicsPipelines") + vtable.CreateImage = auto_cast GetDeviceProcAddr(device, "vkCreateImage") + vtable.CreateImageView = auto_cast GetDeviceProcAddr(device, "vkCreateImageView") + vtable.CreateIndirectCommandsLayoutNV = auto_cast GetDeviceProcAddr(device, "vkCreateIndirectCommandsLayoutNV") + vtable.CreatePipelineCache = auto_cast GetDeviceProcAddr(device, "vkCreatePipelineCache") + vtable.CreatePipelineLayout = auto_cast GetDeviceProcAddr(device, "vkCreatePipelineLayout") + vtable.CreatePrivateDataSlotEXT = auto_cast GetDeviceProcAddr(device, "vkCreatePrivateDataSlotEXT") + vtable.CreateQueryPool = auto_cast GetDeviceProcAddr(device, "vkCreateQueryPool") + vtable.CreateRayTracingPipelinesKHR = auto_cast GetDeviceProcAddr(device, "vkCreateRayTracingPipelinesKHR") + vtable.CreateRayTracingPipelinesNV = auto_cast GetDeviceProcAddr(device, "vkCreateRayTracingPipelinesNV") + vtable.CreateRenderPass = auto_cast GetDeviceProcAddr(device, "vkCreateRenderPass") + vtable.CreateRenderPass2 = auto_cast GetDeviceProcAddr(device, "vkCreateRenderPass2") + vtable.CreateRenderPass2KHR = auto_cast GetDeviceProcAddr(device, "vkCreateRenderPass2KHR") + vtable.CreateSampler = auto_cast GetDeviceProcAddr(device, "vkCreateSampler") + vtable.CreateSamplerYcbcrConversion = auto_cast GetDeviceProcAddr(device, "vkCreateSamplerYcbcrConversion") + vtable.CreateSamplerYcbcrConversionKHR = auto_cast GetDeviceProcAddr(device, "vkCreateSamplerYcbcrConversionKHR") + vtable.CreateSemaphore = auto_cast GetDeviceProcAddr(device, "vkCreateSemaphore") + vtable.CreateShaderModule = auto_cast GetDeviceProcAddr(device, "vkCreateShaderModule") + vtable.CreateSharedSwapchainsKHR = auto_cast GetDeviceProcAddr(device, "vkCreateSharedSwapchainsKHR") + vtable.CreateSwapchainKHR = auto_cast GetDeviceProcAddr(device, "vkCreateSwapchainKHR") + vtable.CreateValidationCacheEXT = auto_cast GetDeviceProcAddr(device, "vkCreateValidationCacheEXT") + vtable.DebugMarkerSetObjectNameEXT = auto_cast GetDeviceProcAddr(device, "vkDebugMarkerSetObjectNameEXT") + vtable.DebugMarkerSetObjectTagEXT = auto_cast GetDeviceProcAddr(device, "vkDebugMarkerSetObjectTagEXT") + vtable.DeferredOperationJoinKHR = auto_cast GetDeviceProcAddr(device, "vkDeferredOperationJoinKHR") + vtable.DestroyAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyAccelerationStructureKHR") + vtable.DestroyAccelerationStructureNV = auto_cast GetDeviceProcAddr(device, "vkDestroyAccelerationStructureNV") + vtable.DestroyBuffer = auto_cast GetDeviceProcAddr(device, "vkDestroyBuffer") + vtable.DestroyBufferView = auto_cast GetDeviceProcAddr(device, "vkDestroyBufferView") + vtable.DestroyCommandPool = auto_cast GetDeviceProcAddr(device, "vkDestroyCommandPool") + vtable.DestroyCuFunctionNVX = auto_cast GetDeviceProcAddr(device, "vkDestroyCuFunctionNVX") + vtable.DestroyCuModuleNVX = auto_cast GetDeviceProcAddr(device, "vkDestroyCuModuleNVX") + vtable.DestroyDeferredOperationKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyDeferredOperationKHR") + vtable.DestroyDescriptorPool = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorPool") + vtable.DestroyDescriptorSetLayout = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorSetLayout") + vtable.DestroyDescriptorUpdateTemplate = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorUpdateTemplate") + vtable.DestroyDescriptorUpdateTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorUpdateTemplateKHR") + vtable.DestroyDevice = auto_cast GetDeviceProcAddr(device, "vkDestroyDevice") + vtable.DestroyEvent = auto_cast GetDeviceProcAddr(device, "vkDestroyEvent") + vtable.DestroyFence = auto_cast GetDeviceProcAddr(device, "vkDestroyFence") + vtable.DestroyFramebuffer = auto_cast GetDeviceProcAddr(device, "vkDestroyFramebuffer") + vtable.DestroyImage = auto_cast GetDeviceProcAddr(device, "vkDestroyImage") + vtable.DestroyImageView = auto_cast GetDeviceProcAddr(device, "vkDestroyImageView") + vtable.DestroyIndirectCommandsLayoutNV = auto_cast GetDeviceProcAddr(device, "vkDestroyIndirectCommandsLayoutNV") + vtable.DestroyPipeline = auto_cast GetDeviceProcAddr(device, "vkDestroyPipeline") + vtable.DestroyPipelineCache = auto_cast GetDeviceProcAddr(device, "vkDestroyPipelineCache") + vtable.DestroyPipelineLayout = auto_cast GetDeviceProcAddr(device, "vkDestroyPipelineLayout") + vtable.DestroyPrivateDataSlotEXT = auto_cast GetDeviceProcAddr(device, "vkDestroyPrivateDataSlotEXT") + vtable.DestroyQueryPool = auto_cast GetDeviceProcAddr(device, "vkDestroyQueryPool") + vtable.DestroyRenderPass = auto_cast GetDeviceProcAddr(device, "vkDestroyRenderPass") + vtable.DestroySampler = auto_cast GetDeviceProcAddr(device, "vkDestroySampler") + vtable.DestroySamplerYcbcrConversion = auto_cast GetDeviceProcAddr(device, "vkDestroySamplerYcbcrConversion") + vtable.DestroySamplerYcbcrConversionKHR = auto_cast GetDeviceProcAddr(device, "vkDestroySamplerYcbcrConversionKHR") + vtable.DestroySemaphore = auto_cast GetDeviceProcAddr(device, "vkDestroySemaphore") + vtable.DestroyShaderModule = auto_cast GetDeviceProcAddr(device, "vkDestroyShaderModule") + vtable.DestroySwapchainKHR = auto_cast GetDeviceProcAddr(device, "vkDestroySwapchainKHR") + vtable.DestroyValidationCacheEXT = auto_cast GetDeviceProcAddr(device, "vkDestroyValidationCacheEXT") + vtable.DeviceWaitIdle = auto_cast GetDeviceProcAddr(device, "vkDeviceWaitIdle") + vtable.DisplayPowerControlEXT = auto_cast GetDeviceProcAddr(device, "vkDisplayPowerControlEXT") + vtable.EndCommandBuffer = auto_cast GetDeviceProcAddr(device, "vkEndCommandBuffer") + vtable.FlushMappedMemoryRanges = auto_cast GetDeviceProcAddr(device, "vkFlushMappedMemoryRanges") + vtable.FreeCommandBuffers = auto_cast GetDeviceProcAddr(device, "vkFreeCommandBuffers") + vtable.FreeDescriptorSets = auto_cast GetDeviceProcAddr(device, "vkFreeDescriptorSets") + vtable.FreeMemory = auto_cast GetDeviceProcAddr(device, "vkFreeMemory") + vtable.GetAccelerationStructureBuildSizesKHR = auto_cast GetDeviceProcAddr(device, "vkGetAccelerationStructureBuildSizesKHR") + vtable.GetAccelerationStructureDeviceAddressKHR = auto_cast GetDeviceProcAddr(device, "vkGetAccelerationStructureDeviceAddressKHR") + vtable.GetAccelerationStructureHandleNV = auto_cast GetDeviceProcAddr(device, "vkGetAccelerationStructureHandleNV") + vtable.GetAccelerationStructureMemoryRequirementsNV = auto_cast GetDeviceProcAddr(device, "vkGetAccelerationStructureMemoryRequirementsNV") + vtable.GetBufferDeviceAddress = auto_cast GetDeviceProcAddr(device, "vkGetBufferDeviceAddress") + vtable.GetBufferDeviceAddressEXT = auto_cast GetDeviceProcAddr(device, "vkGetBufferDeviceAddressEXT") + vtable.GetBufferDeviceAddressKHR = auto_cast GetDeviceProcAddr(device, "vkGetBufferDeviceAddressKHR") + vtable.GetBufferMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetBufferMemoryRequirements") + vtable.GetBufferMemoryRequirements2 = auto_cast GetDeviceProcAddr(device, "vkGetBufferMemoryRequirements2") + vtable.GetBufferMemoryRequirements2KHR = auto_cast GetDeviceProcAddr(device, "vkGetBufferMemoryRequirements2KHR") + vtable.GetBufferOpaqueCaptureAddress = auto_cast GetDeviceProcAddr(device, "vkGetBufferOpaqueCaptureAddress") + vtable.GetBufferOpaqueCaptureAddressKHR = auto_cast GetDeviceProcAddr(device, "vkGetBufferOpaqueCaptureAddressKHR") + vtable.GetCalibratedTimestampsEXT = auto_cast GetDeviceProcAddr(device, "vkGetCalibratedTimestampsEXT") + vtable.GetDeferredOperationMaxConcurrencyKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeferredOperationMaxConcurrencyKHR") + vtable.GetDeferredOperationResultKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeferredOperationResultKHR") + vtable.GetDescriptorSetLayoutSupport = auto_cast GetDeviceProcAddr(device, "vkGetDescriptorSetLayoutSupport") + vtable.GetDescriptorSetLayoutSupportKHR = auto_cast GetDeviceProcAddr(device, "vkGetDescriptorSetLayoutSupportKHR") + vtable.GetDeviceAccelerationStructureCompatibilityKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceAccelerationStructureCompatibilityKHR") + vtable.GetDeviceGroupPeerMemoryFeatures = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupPeerMemoryFeatures") + vtable.GetDeviceGroupPeerMemoryFeaturesKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupPeerMemoryFeaturesKHR") + vtable.GetDeviceGroupPresentCapabilitiesKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupPresentCapabilitiesKHR") + vtable.GetDeviceGroupSurfacePresentModes2EXT = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupSurfacePresentModes2EXT") + vtable.GetDeviceGroupSurfacePresentModesKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupSurfacePresentModesKHR") + vtable.GetDeviceMemoryCommitment = auto_cast GetDeviceProcAddr(device, "vkGetDeviceMemoryCommitment") + vtable.GetDeviceMemoryOpaqueCaptureAddress = auto_cast GetDeviceProcAddr(device, "vkGetDeviceMemoryOpaqueCaptureAddress") + vtable.GetDeviceMemoryOpaqueCaptureAddressKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceMemoryOpaqueCaptureAddressKHR") + vtable.GetDeviceProcAddr = auto_cast GetDeviceProcAddr(device, "vkGetDeviceProcAddr") + vtable.GetDeviceQueue = auto_cast GetDeviceProcAddr(device, "vkGetDeviceQueue") + vtable.GetDeviceQueue2 = auto_cast GetDeviceProcAddr(device, "vkGetDeviceQueue2") + vtable.GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = auto_cast GetDeviceProcAddr(device, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI") + vtable.GetEventStatus = auto_cast GetDeviceProcAddr(device, "vkGetEventStatus") + vtable.GetFenceFdKHR = auto_cast GetDeviceProcAddr(device, "vkGetFenceFdKHR") + vtable.GetFenceStatus = auto_cast GetDeviceProcAddr(device, "vkGetFenceStatus") + vtable.GetFenceWin32HandleKHR = auto_cast GetDeviceProcAddr(device, "vkGetFenceWin32HandleKHR") + vtable.GetGeneratedCommandsMemoryRequirementsNV = auto_cast GetDeviceProcAddr(device, "vkGetGeneratedCommandsMemoryRequirementsNV") + vtable.GetImageDrmFormatModifierPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkGetImageDrmFormatModifierPropertiesEXT") + vtable.GetImageMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetImageMemoryRequirements") + vtable.GetImageMemoryRequirements2 = auto_cast GetDeviceProcAddr(device, "vkGetImageMemoryRequirements2") + vtable.GetImageMemoryRequirements2KHR = auto_cast GetDeviceProcAddr(device, "vkGetImageMemoryRequirements2KHR") + vtable.GetImageSparseMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements") + vtable.GetImageSparseMemoryRequirements2 = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2") + vtable.GetImageSparseMemoryRequirements2KHR = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2KHR") + vtable.GetImageSubresourceLayout = auto_cast GetDeviceProcAddr(device, "vkGetImageSubresourceLayout") + vtable.GetImageViewAddressNVX = auto_cast GetDeviceProcAddr(device, "vkGetImageViewAddressNVX") + vtable.GetImageViewHandleNVX = auto_cast GetDeviceProcAddr(device, "vkGetImageViewHandleNVX") + vtable.GetMemoryFdKHR = auto_cast GetDeviceProcAddr(device, "vkGetMemoryFdKHR") + vtable.GetMemoryFdPropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkGetMemoryFdPropertiesKHR") + vtable.GetMemoryHostPointerPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkGetMemoryHostPointerPropertiesEXT") + vtable.GetMemoryRemoteAddressNV = auto_cast GetDeviceProcAddr(device, "vkGetMemoryRemoteAddressNV") + vtable.GetMemoryWin32HandleKHR = auto_cast GetDeviceProcAddr(device, "vkGetMemoryWin32HandleKHR") + vtable.GetMemoryWin32HandleNV = auto_cast GetDeviceProcAddr(device, "vkGetMemoryWin32HandleNV") + vtable.GetMemoryWin32HandlePropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkGetMemoryWin32HandlePropertiesKHR") + vtable.GetPastPresentationTimingGOOGLE = auto_cast GetDeviceProcAddr(device, "vkGetPastPresentationTimingGOOGLE") + vtable.GetPerformanceParameterINTEL = auto_cast GetDeviceProcAddr(device, "vkGetPerformanceParameterINTEL") + vtable.GetPipelineCacheData = auto_cast GetDeviceProcAddr(device, "vkGetPipelineCacheData") + vtable.GetPipelineExecutableInternalRepresentationsKHR = auto_cast GetDeviceProcAddr(device, "vkGetPipelineExecutableInternalRepresentationsKHR") + vtable.GetPipelineExecutablePropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkGetPipelineExecutablePropertiesKHR") + vtable.GetPipelineExecutableStatisticsKHR = auto_cast GetDeviceProcAddr(device, "vkGetPipelineExecutableStatisticsKHR") + vtable.GetPrivateDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetPrivateDataEXT") + vtable.GetQueryPoolResults = auto_cast GetDeviceProcAddr(device, "vkGetQueryPoolResults") + vtable.GetQueueCheckpointData2NV = auto_cast GetDeviceProcAddr(device, "vkGetQueueCheckpointData2NV") + vtable.GetQueueCheckpointDataNV = auto_cast GetDeviceProcAddr(device, "vkGetQueueCheckpointDataNV") + vtable.GetRayTracingCaptureReplayShaderGroupHandlesKHR = auto_cast GetDeviceProcAddr(device, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR") + vtable.GetRayTracingShaderGroupHandlesKHR = auto_cast GetDeviceProcAddr(device, "vkGetRayTracingShaderGroupHandlesKHR") + vtable.GetRayTracingShaderGroupHandlesNV = auto_cast GetDeviceProcAddr(device, "vkGetRayTracingShaderGroupHandlesNV") + vtable.GetRayTracingShaderGroupStackSizeKHR = auto_cast GetDeviceProcAddr(device, "vkGetRayTracingShaderGroupStackSizeKHR") + vtable.GetRefreshCycleDurationGOOGLE = auto_cast GetDeviceProcAddr(device, "vkGetRefreshCycleDurationGOOGLE") + vtable.GetRenderAreaGranularity = auto_cast GetDeviceProcAddr(device, "vkGetRenderAreaGranularity") + vtable.GetSemaphoreCounterValue = auto_cast GetDeviceProcAddr(device, "vkGetSemaphoreCounterValue") + vtable.GetSemaphoreCounterValueKHR = auto_cast GetDeviceProcAddr(device, "vkGetSemaphoreCounterValueKHR") + vtable.GetSemaphoreFdKHR = auto_cast GetDeviceProcAddr(device, "vkGetSemaphoreFdKHR") + vtable.GetSemaphoreWin32HandleKHR = auto_cast GetDeviceProcAddr(device, "vkGetSemaphoreWin32HandleKHR") + vtable.GetShaderInfoAMD = auto_cast GetDeviceProcAddr(device, "vkGetShaderInfoAMD") + vtable.GetSwapchainCounterEXT = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainCounterEXT") + vtable.GetSwapchainImagesKHR = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainImagesKHR") + vtable.GetSwapchainStatusKHR = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainStatusKHR") + vtable.GetValidationCacheDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetValidationCacheDataEXT") + vtable.ImportFenceFdKHR = auto_cast GetDeviceProcAddr(device, "vkImportFenceFdKHR") + vtable.ImportFenceWin32HandleKHR = auto_cast GetDeviceProcAddr(device, "vkImportFenceWin32HandleKHR") + vtable.ImportSemaphoreFdKHR = auto_cast GetDeviceProcAddr(device, "vkImportSemaphoreFdKHR") + vtable.ImportSemaphoreWin32HandleKHR = auto_cast GetDeviceProcAddr(device, "vkImportSemaphoreWin32HandleKHR") + vtable.InitializePerformanceApiINTEL = auto_cast GetDeviceProcAddr(device, "vkInitializePerformanceApiINTEL") + vtable.InvalidateMappedMemoryRanges = auto_cast GetDeviceProcAddr(device, "vkInvalidateMappedMemoryRanges") + vtable.MapMemory = auto_cast GetDeviceProcAddr(device, "vkMapMemory") + vtable.MergePipelineCaches = auto_cast GetDeviceProcAddr(device, "vkMergePipelineCaches") + vtable.MergeValidationCachesEXT = auto_cast GetDeviceProcAddr(device, "vkMergeValidationCachesEXT") + vtable.QueueBeginDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkQueueBeginDebugUtilsLabelEXT") + vtable.QueueBindSparse = auto_cast GetDeviceProcAddr(device, "vkQueueBindSparse") + vtable.QueueEndDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkQueueEndDebugUtilsLabelEXT") + vtable.QueueInsertDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkQueueInsertDebugUtilsLabelEXT") + vtable.QueuePresentKHR = auto_cast GetDeviceProcAddr(device, "vkQueuePresentKHR") + vtable.QueueSetPerformanceConfigurationINTEL = auto_cast GetDeviceProcAddr(device, "vkQueueSetPerformanceConfigurationINTEL") + vtable.QueueSubmit = auto_cast GetDeviceProcAddr(device, "vkQueueSubmit") + vtable.QueueSubmit2KHR = auto_cast GetDeviceProcAddr(device, "vkQueueSubmit2KHR") + vtable.QueueWaitIdle = auto_cast GetDeviceProcAddr(device, "vkQueueWaitIdle") + vtable.RegisterDeviceEventEXT = auto_cast GetDeviceProcAddr(device, "vkRegisterDeviceEventEXT") + vtable.RegisterDisplayEventEXT = auto_cast GetDeviceProcAddr(device, "vkRegisterDisplayEventEXT") + vtable.ReleaseFullScreenExclusiveModeEXT = auto_cast GetDeviceProcAddr(device, "vkReleaseFullScreenExclusiveModeEXT") + vtable.ReleasePerformanceConfigurationINTEL = auto_cast GetDeviceProcAddr(device, "vkReleasePerformanceConfigurationINTEL") + vtable.ReleaseProfilingLockKHR = auto_cast GetDeviceProcAddr(device, "vkReleaseProfilingLockKHR") + vtable.ResetCommandBuffer = auto_cast GetDeviceProcAddr(device, "vkResetCommandBuffer") + vtable.ResetCommandPool = auto_cast GetDeviceProcAddr(device, "vkResetCommandPool") + vtable.ResetDescriptorPool = auto_cast GetDeviceProcAddr(device, "vkResetDescriptorPool") + vtable.ResetEvent = auto_cast GetDeviceProcAddr(device, "vkResetEvent") + vtable.ResetFences = auto_cast GetDeviceProcAddr(device, "vkResetFences") + vtable.ResetQueryPool = auto_cast GetDeviceProcAddr(device, "vkResetQueryPool") + vtable.ResetQueryPoolEXT = auto_cast GetDeviceProcAddr(device, "vkResetQueryPoolEXT") + vtable.SetDebugUtilsObjectNameEXT = auto_cast GetDeviceProcAddr(device, "vkSetDebugUtilsObjectNameEXT") + vtable.SetDebugUtilsObjectTagEXT = auto_cast GetDeviceProcAddr(device, "vkSetDebugUtilsObjectTagEXT") + vtable.SetDeviceMemoryPriorityEXT = auto_cast GetDeviceProcAddr(device, "vkSetDeviceMemoryPriorityEXT") + vtable.SetEvent = auto_cast GetDeviceProcAddr(device, "vkSetEvent") + vtable.SetHdrMetadataEXT = auto_cast GetDeviceProcAddr(device, "vkSetHdrMetadataEXT") + vtable.SetLocalDimmingAMD = auto_cast GetDeviceProcAddr(device, "vkSetLocalDimmingAMD") + vtable.SetPrivateDataEXT = auto_cast GetDeviceProcAddr(device, "vkSetPrivateDataEXT") + vtable.SignalSemaphore = auto_cast GetDeviceProcAddr(device, "vkSignalSemaphore") + vtable.SignalSemaphoreKHR = auto_cast GetDeviceProcAddr(device, "vkSignalSemaphoreKHR") + vtable.TrimCommandPool = auto_cast GetDeviceProcAddr(device, "vkTrimCommandPool") + vtable.TrimCommandPoolKHR = auto_cast GetDeviceProcAddr(device, "vkTrimCommandPoolKHR") + vtable.UninitializePerformanceApiINTEL = auto_cast GetDeviceProcAddr(device, "vkUninitializePerformanceApiINTEL") + vtable.UnmapMemory = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory") + vtable.UpdateDescriptorSetWithTemplate = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplate") + vtable.UpdateDescriptorSetWithTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplateKHR") + vtable.UpdateDescriptorSets = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSets") + vtable.WaitForFences = auto_cast GetDeviceProcAddr(device, "vkWaitForFences") + vtable.WaitForPresentKHR = auto_cast GetDeviceProcAddr(device, "vkWaitForPresentKHR") + vtable.WaitSemaphores = auto_cast GetDeviceProcAddr(device, "vkWaitSemaphores") + vtable.WaitSemaphoresKHR = auto_cast GetDeviceProcAddr(device, "vkWaitSemaphoresKHR") + vtable.WriteAccelerationStructuresPropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkWriteAccelerationStructuresPropertiesKHR") +} + +load_proc_addresses_device :: proc(device: Device) { + AcquireFullScreenExclusiveModeEXT = auto_cast GetDeviceProcAddr(device, "vkAcquireFullScreenExclusiveModeEXT") + AcquireNextImage2KHR = auto_cast GetDeviceProcAddr(device, "vkAcquireNextImage2KHR") + AcquireNextImageKHR = auto_cast GetDeviceProcAddr(device, "vkAcquireNextImageKHR") + AcquirePerformanceConfigurationINTEL = auto_cast GetDeviceProcAddr(device, "vkAcquirePerformanceConfigurationINTEL") + AcquireProfilingLockKHR = auto_cast GetDeviceProcAddr(device, "vkAcquireProfilingLockKHR") + AllocateCommandBuffers = auto_cast GetDeviceProcAddr(device, "vkAllocateCommandBuffers") + AllocateDescriptorSets = auto_cast GetDeviceProcAddr(device, "vkAllocateDescriptorSets") + AllocateMemory = auto_cast GetDeviceProcAddr(device, "vkAllocateMemory") + BeginCommandBuffer = auto_cast GetDeviceProcAddr(device, "vkBeginCommandBuffer") + BindAccelerationStructureMemoryNV = auto_cast GetDeviceProcAddr(device, "vkBindAccelerationStructureMemoryNV") + BindBufferMemory = auto_cast GetDeviceProcAddr(device, "vkBindBufferMemory") + BindBufferMemory2 = auto_cast GetDeviceProcAddr(device, "vkBindBufferMemory2") + BindBufferMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkBindBufferMemory2KHR") + BindImageMemory = auto_cast GetDeviceProcAddr(device, "vkBindImageMemory") + BindImageMemory2 = auto_cast GetDeviceProcAddr(device, "vkBindImageMemory2") + BindImageMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkBindImageMemory2KHR") + BuildAccelerationStructuresKHR = auto_cast GetDeviceProcAddr(device, "vkBuildAccelerationStructuresKHR") + CmdBeginConditionalRenderingEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginConditionalRenderingEXT") + CmdBeginDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginDebugUtilsLabelEXT") + CmdBeginQuery = auto_cast GetDeviceProcAddr(device, "vkCmdBeginQuery") + CmdBeginQueryIndexedEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginQueryIndexedEXT") + CmdBeginRenderPass = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRenderPass") + CmdBeginRenderPass2 = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRenderPass2") + CmdBeginRenderPass2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRenderPass2KHR") + CmdBeginTransformFeedbackEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginTransformFeedbackEXT") + CmdBindDescriptorSets = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorSets") + CmdBindIndexBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer") + CmdBindInvocationMaskHUAWEI = auto_cast GetDeviceProcAddr(device, "vkCmdBindInvocationMaskHUAWEI") + CmdBindPipeline = auto_cast GetDeviceProcAddr(device, "vkCmdBindPipeline") + CmdBindPipelineShaderGroupNV = auto_cast GetDeviceProcAddr(device, "vkCmdBindPipelineShaderGroupNV") + CmdBindShadingRateImageNV = auto_cast GetDeviceProcAddr(device, "vkCmdBindShadingRateImageNV") + CmdBindTransformFeedbackBuffersEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindTransformFeedbackBuffersEXT") + CmdBindVertexBuffers = auto_cast GetDeviceProcAddr(device, "vkCmdBindVertexBuffers") + CmdBindVertexBuffers2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindVertexBuffers2EXT") + CmdBlitImage = auto_cast GetDeviceProcAddr(device, "vkCmdBlitImage") + CmdBlitImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBlitImage2KHR") + CmdBuildAccelerationStructureNV = auto_cast GetDeviceProcAddr(device, "vkCmdBuildAccelerationStructureNV") + CmdBuildAccelerationStructuresIndirectKHR = auto_cast GetDeviceProcAddr(device, "vkCmdBuildAccelerationStructuresIndirectKHR") + CmdBuildAccelerationStructuresKHR = auto_cast GetDeviceProcAddr(device, "vkCmdBuildAccelerationStructuresKHR") + CmdClearAttachments = auto_cast GetDeviceProcAddr(device, "vkCmdClearAttachments") + CmdClearColorImage = auto_cast GetDeviceProcAddr(device, "vkCmdClearColorImage") + CmdClearDepthStencilImage = auto_cast GetDeviceProcAddr(device, "vkCmdClearDepthStencilImage") + CmdCopyAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyAccelerationStructureKHR") + CmdCopyAccelerationStructureNV = auto_cast GetDeviceProcAddr(device, "vkCmdCopyAccelerationStructureNV") + CmdCopyAccelerationStructureToMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyAccelerationStructureToMemoryKHR") + CmdCopyBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBuffer") + CmdCopyBuffer2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBuffer2KHR") + CmdCopyBufferToImage = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBufferToImage") + CmdCopyBufferToImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBufferToImage2KHR") + CmdCopyImage = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImage") + CmdCopyImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImage2KHR") + CmdCopyImageToBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImageToBuffer") + CmdCopyImageToBuffer2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImageToBuffer2KHR") + CmdCopyMemoryToAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryToAccelerationStructureKHR") + CmdCopyQueryPoolResults = auto_cast GetDeviceProcAddr(device, "vkCmdCopyQueryPoolResults") + CmdCuLaunchKernelNVX = auto_cast GetDeviceProcAddr(device, "vkCmdCuLaunchKernelNVX") + CmdDebugMarkerBeginEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT") + CmdDebugMarkerEndEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT") + CmdDebugMarkerInsertEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDebugMarkerInsertEXT") + CmdDispatch = auto_cast GetDeviceProcAddr(device, "vkCmdDispatch") + CmdDispatchBase = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchBase") + CmdDispatchBaseKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchBaseKHR") + CmdDispatchIndirect = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchIndirect") + CmdDraw = auto_cast GetDeviceProcAddr(device, "vkCmdDraw") + CmdDrawIndexed = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexed") + CmdDrawIndexedIndirect = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirect") + CmdDrawIndexedIndirectCount = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCount") + CmdDrawIndexedIndirectCountAMD = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCountAMD") + CmdDrawIndexedIndirectCountKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCountKHR") + CmdDrawIndirect = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirect") + CmdDrawIndirectByteCountEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectByteCountEXT") + CmdDrawIndirectCount = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCount") + CmdDrawIndirectCountAMD = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCountAMD") + CmdDrawIndirectCountKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCountKHR") + CmdDrawMeshTasksIndirectCountNV = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectCountNV") + CmdDrawMeshTasksIndirectNV = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectNV") + CmdDrawMeshTasksNV = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksNV") + CmdDrawMultiEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMultiEXT") + CmdDrawMultiIndexedEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMultiIndexedEXT") + CmdEndConditionalRenderingEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndConditionalRenderingEXT") + CmdEndDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndDebugUtilsLabelEXT") + CmdEndQuery = auto_cast GetDeviceProcAddr(device, "vkCmdEndQuery") + CmdEndQueryIndexedEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndQueryIndexedEXT") + CmdEndRenderPass = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderPass") + CmdEndRenderPass2 = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderPass2") + CmdEndRenderPass2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderPass2KHR") + CmdEndTransformFeedbackEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndTransformFeedbackEXT") + CmdExecuteCommands = auto_cast GetDeviceProcAddr(device, "vkCmdExecuteCommands") + CmdExecuteGeneratedCommandsNV = auto_cast GetDeviceProcAddr(device, "vkCmdExecuteGeneratedCommandsNV") + CmdFillBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdFillBuffer") + CmdInsertDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkCmdInsertDebugUtilsLabelEXT") + CmdNextSubpass = auto_cast GetDeviceProcAddr(device, "vkCmdNextSubpass") + CmdNextSubpass2 = auto_cast GetDeviceProcAddr(device, "vkCmdNextSubpass2") + CmdNextSubpass2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdNextSubpass2KHR") + CmdPipelineBarrier = auto_cast GetDeviceProcAddr(device, "vkCmdPipelineBarrier") + CmdPipelineBarrier2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdPipelineBarrier2KHR") + CmdPreprocessGeneratedCommandsNV = auto_cast GetDeviceProcAddr(device, "vkCmdPreprocessGeneratedCommandsNV") + CmdPushConstants = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants") + CmdPushDescriptorSetKHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetKHR") + CmdPushDescriptorSetWithTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetWithTemplateKHR") + CmdResetEvent = auto_cast GetDeviceProcAddr(device, "vkCmdResetEvent") + CmdResetEvent2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdResetEvent2KHR") + CmdResetQueryPool = auto_cast GetDeviceProcAddr(device, "vkCmdResetQueryPool") + CmdResolveImage = auto_cast GetDeviceProcAddr(device, "vkCmdResolveImage") + CmdResolveImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdResolveImage2KHR") + CmdSetBlendConstants = auto_cast GetDeviceProcAddr(device, "vkCmdSetBlendConstants") + CmdSetCheckpointNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetCheckpointNV") + CmdSetCoarseSampleOrderNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetCoarseSampleOrderNV") + CmdSetCullModeEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetCullModeEXT") + CmdSetDepthBias = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthBias") + CmdSetDepthBiasEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthBiasEnableEXT") + CmdSetDepthBounds = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthBounds") + CmdSetDepthBoundsTestEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthBoundsTestEnableEXT") + CmdSetDepthCompareOpEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthCompareOpEXT") + CmdSetDepthTestEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthTestEnableEXT") + CmdSetDepthWriteEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDepthWriteEnableEXT") + CmdSetDeviceMask = auto_cast GetDeviceProcAddr(device, "vkCmdSetDeviceMask") + CmdSetDeviceMaskKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetDeviceMaskKHR") + CmdSetDiscardRectangleEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDiscardRectangleEXT") + CmdSetEvent = auto_cast GetDeviceProcAddr(device, "vkCmdSetEvent") + CmdSetEvent2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetEvent2KHR") + CmdSetExclusiveScissorNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetExclusiveScissorNV") + CmdSetFragmentShadingRateEnumNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetFragmentShadingRateEnumNV") + CmdSetFragmentShadingRateKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetFragmentShadingRateKHR") + CmdSetFrontFaceEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetFrontFaceEXT") + CmdSetLineStippleEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineStippleEXT") + CmdSetLineWidth = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineWidth") + CmdSetLogicOpEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetLogicOpEXT") + CmdSetPatchControlPointsEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPatchControlPointsEXT") + CmdSetPerformanceMarkerINTEL = auto_cast GetDeviceProcAddr(device, "vkCmdSetPerformanceMarkerINTEL") + CmdSetPerformanceOverrideINTEL = auto_cast GetDeviceProcAddr(device, "vkCmdSetPerformanceOverrideINTEL") + CmdSetPerformanceStreamMarkerINTEL = auto_cast GetDeviceProcAddr(device, "vkCmdSetPerformanceStreamMarkerINTEL") + CmdSetPrimitiveRestartEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveRestartEnableEXT") + CmdSetPrimitiveTopologyEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveTopologyEXT") + CmdSetRasterizerDiscardEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetRasterizerDiscardEnableEXT") + CmdSetRayTracingPipelineStackSizeKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetRayTracingPipelineStackSizeKHR") + CmdSetSampleLocationsEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetSampleLocationsEXT") + CmdSetScissor = auto_cast GetDeviceProcAddr(device, "vkCmdSetScissor") + CmdSetScissorWithCountEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetScissorWithCountEXT") + CmdSetStencilCompareMask = auto_cast GetDeviceProcAddr(device, "vkCmdSetStencilCompareMask") + CmdSetStencilOpEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetStencilOpEXT") + CmdSetStencilReference = auto_cast GetDeviceProcAddr(device, "vkCmdSetStencilReference") + CmdSetStencilTestEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetStencilTestEnableEXT") + CmdSetStencilWriteMask = auto_cast GetDeviceProcAddr(device, "vkCmdSetStencilWriteMask") + CmdSetVertexInputEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetVertexInputEXT") + CmdSetViewport = auto_cast GetDeviceProcAddr(device, "vkCmdSetViewport") + CmdSetViewportShadingRatePaletteNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetViewportShadingRatePaletteNV") + CmdSetViewportWScalingNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetViewportWScalingNV") + CmdSetViewportWithCountEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetViewportWithCountEXT") + CmdSubpassShadingHUAWEI = auto_cast GetDeviceProcAddr(device, "vkCmdSubpassShadingHUAWEI") + CmdTraceRaysIndirectKHR = auto_cast GetDeviceProcAddr(device, "vkCmdTraceRaysIndirectKHR") + CmdTraceRaysKHR = auto_cast GetDeviceProcAddr(device, "vkCmdTraceRaysKHR") + CmdTraceRaysNV = auto_cast GetDeviceProcAddr(device, "vkCmdTraceRaysNV") + CmdUpdateBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdUpdateBuffer") + CmdWaitEvents = auto_cast GetDeviceProcAddr(device, "vkCmdWaitEvents") + CmdWaitEvents2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdWaitEvents2KHR") + CmdWriteAccelerationStructuresPropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkCmdWriteAccelerationStructuresPropertiesKHR") + CmdWriteAccelerationStructuresPropertiesNV = auto_cast GetDeviceProcAddr(device, "vkCmdWriteAccelerationStructuresPropertiesNV") + CmdWriteBufferMarker2AMD = auto_cast GetDeviceProcAddr(device, "vkCmdWriteBufferMarker2AMD") + CmdWriteBufferMarkerAMD = auto_cast GetDeviceProcAddr(device, "vkCmdWriteBufferMarkerAMD") + CmdWriteTimestamp = auto_cast GetDeviceProcAddr(device, "vkCmdWriteTimestamp") + CmdWriteTimestamp2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdWriteTimestamp2KHR") + CompileDeferredNV = auto_cast GetDeviceProcAddr(device, "vkCompileDeferredNV") + CopyAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCopyAccelerationStructureKHR") + CopyAccelerationStructureToMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCopyAccelerationStructureToMemoryKHR") + CopyMemoryToAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCopyMemoryToAccelerationStructureKHR") + CreateAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCreateAccelerationStructureKHR") + CreateAccelerationStructureNV = auto_cast GetDeviceProcAddr(device, "vkCreateAccelerationStructureNV") + CreateBuffer = auto_cast GetDeviceProcAddr(device, "vkCreateBuffer") + CreateBufferView = auto_cast GetDeviceProcAddr(device, "vkCreateBufferView") + CreateCommandPool = auto_cast GetDeviceProcAddr(device, "vkCreateCommandPool") + CreateComputePipelines = auto_cast GetDeviceProcAddr(device, "vkCreateComputePipelines") + CreateCuFunctionNVX = auto_cast GetDeviceProcAddr(device, "vkCreateCuFunctionNVX") + CreateCuModuleNVX = auto_cast GetDeviceProcAddr(device, "vkCreateCuModuleNVX") + CreateDeferredOperationKHR = auto_cast GetDeviceProcAddr(device, "vkCreateDeferredOperationKHR") + CreateDescriptorPool = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorPool") + CreateDescriptorSetLayout = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorSetLayout") + CreateDescriptorUpdateTemplate = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorUpdateTemplate") + CreateDescriptorUpdateTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorUpdateTemplateKHR") + CreateEvent = auto_cast GetDeviceProcAddr(device, "vkCreateEvent") + CreateFence = auto_cast GetDeviceProcAddr(device, "vkCreateFence") + CreateFramebuffer = auto_cast GetDeviceProcAddr(device, "vkCreateFramebuffer") + CreateGraphicsPipelines = auto_cast GetDeviceProcAddr(device, "vkCreateGraphicsPipelines") + CreateImage = auto_cast GetDeviceProcAddr(device, "vkCreateImage") + CreateImageView = auto_cast GetDeviceProcAddr(device, "vkCreateImageView") + CreateIndirectCommandsLayoutNV = auto_cast GetDeviceProcAddr(device, "vkCreateIndirectCommandsLayoutNV") + CreatePipelineCache = auto_cast GetDeviceProcAddr(device, "vkCreatePipelineCache") + CreatePipelineLayout = auto_cast GetDeviceProcAddr(device, "vkCreatePipelineLayout") + CreatePrivateDataSlotEXT = auto_cast GetDeviceProcAddr(device, "vkCreatePrivateDataSlotEXT") + CreateQueryPool = auto_cast GetDeviceProcAddr(device, "vkCreateQueryPool") + CreateRayTracingPipelinesKHR = auto_cast GetDeviceProcAddr(device, "vkCreateRayTracingPipelinesKHR") + CreateRayTracingPipelinesNV = auto_cast GetDeviceProcAddr(device, "vkCreateRayTracingPipelinesNV") + CreateRenderPass = auto_cast GetDeviceProcAddr(device, "vkCreateRenderPass") + CreateRenderPass2 = auto_cast GetDeviceProcAddr(device, "vkCreateRenderPass2") + CreateRenderPass2KHR = auto_cast GetDeviceProcAddr(device, "vkCreateRenderPass2KHR") + CreateSampler = auto_cast GetDeviceProcAddr(device, "vkCreateSampler") + CreateSamplerYcbcrConversion = auto_cast GetDeviceProcAddr(device, "vkCreateSamplerYcbcrConversion") + CreateSamplerYcbcrConversionKHR = auto_cast GetDeviceProcAddr(device, "vkCreateSamplerYcbcrConversionKHR") + CreateSemaphore = auto_cast GetDeviceProcAddr(device, "vkCreateSemaphore") + CreateShaderModule = auto_cast GetDeviceProcAddr(device, "vkCreateShaderModule") + CreateSharedSwapchainsKHR = auto_cast GetDeviceProcAddr(device, "vkCreateSharedSwapchainsKHR") + CreateSwapchainKHR = auto_cast GetDeviceProcAddr(device, "vkCreateSwapchainKHR") + CreateValidationCacheEXT = auto_cast GetDeviceProcAddr(device, "vkCreateValidationCacheEXT") + DebugMarkerSetObjectNameEXT = auto_cast GetDeviceProcAddr(device, "vkDebugMarkerSetObjectNameEXT") + DebugMarkerSetObjectTagEXT = auto_cast GetDeviceProcAddr(device, "vkDebugMarkerSetObjectTagEXT") + DeferredOperationJoinKHR = auto_cast GetDeviceProcAddr(device, "vkDeferredOperationJoinKHR") + DestroyAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyAccelerationStructureKHR") + DestroyAccelerationStructureNV = auto_cast GetDeviceProcAddr(device, "vkDestroyAccelerationStructureNV") + DestroyBuffer = auto_cast GetDeviceProcAddr(device, "vkDestroyBuffer") + DestroyBufferView = auto_cast GetDeviceProcAddr(device, "vkDestroyBufferView") + DestroyCommandPool = auto_cast GetDeviceProcAddr(device, "vkDestroyCommandPool") + DestroyCuFunctionNVX = auto_cast GetDeviceProcAddr(device, "vkDestroyCuFunctionNVX") + DestroyCuModuleNVX = auto_cast GetDeviceProcAddr(device, "vkDestroyCuModuleNVX") + DestroyDeferredOperationKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyDeferredOperationKHR") + DestroyDescriptorPool = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorPool") + DestroyDescriptorSetLayout = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorSetLayout") + DestroyDescriptorUpdateTemplate = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorUpdateTemplate") + DestroyDescriptorUpdateTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorUpdateTemplateKHR") + DestroyDevice = auto_cast GetDeviceProcAddr(device, "vkDestroyDevice") + DestroyEvent = auto_cast GetDeviceProcAddr(device, "vkDestroyEvent") + DestroyFence = auto_cast GetDeviceProcAddr(device, "vkDestroyFence") + DestroyFramebuffer = auto_cast GetDeviceProcAddr(device, "vkDestroyFramebuffer") + DestroyImage = auto_cast GetDeviceProcAddr(device, "vkDestroyImage") + DestroyImageView = auto_cast GetDeviceProcAddr(device, "vkDestroyImageView") + DestroyIndirectCommandsLayoutNV = auto_cast GetDeviceProcAddr(device, "vkDestroyIndirectCommandsLayoutNV") + DestroyPipeline = auto_cast GetDeviceProcAddr(device, "vkDestroyPipeline") + DestroyPipelineCache = auto_cast GetDeviceProcAddr(device, "vkDestroyPipelineCache") + DestroyPipelineLayout = auto_cast GetDeviceProcAddr(device, "vkDestroyPipelineLayout") + DestroyPrivateDataSlotEXT = auto_cast GetDeviceProcAddr(device, "vkDestroyPrivateDataSlotEXT") + DestroyQueryPool = auto_cast GetDeviceProcAddr(device, "vkDestroyQueryPool") + DestroyRenderPass = auto_cast GetDeviceProcAddr(device, "vkDestroyRenderPass") + DestroySampler = auto_cast GetDeviceProcAddr(device, "vkDestroySampler") + DestroySamplerYcbcrConversion = auto_cast GetDeviceProcAddr(device, "vkDestroySamplerYcbcrConversion") + DestroySamplerYcbcrConversionKHR = auto_cast GetDeviceProcAddr(device, "vkDestroySamplerYcbcrConversionKHR") + DestroySemaphore = auto_cast GetDeviceProcAddr(device, "vkDestroySemaphore") + DestroyShaderModule = auto_cast GetDeviceProcAddr(device, "vkDestroyShaderModule") + DestroySwapchainKHR = auto_cast GetDeviceProcAddr(device, "vkDestroySwapchainKHR") + DestroyValidationCacheEXT = auto_cast GetDeviceProcAddr(device, "vkDestroyValidationCacheEXT") + DeviceWaitIdle = auto_cast GetDeviceProcAddr(device, "vkDeviceWaitIdle") + DisplayPowerControlEXT = auto_cast GetDeviceProcAddr(device, "vkDisplayPowerControlEXT") + EndCommandBuffer = auto_cast GetDeviceProcAddr(device, "vkEndCommandBuffer") + FlushMappedMemoryRanges = auto_cast GetDeviceProcAddr(device, "vkFlushMappedMemoryRanges") + FreeCommandBuffers = auto_cast GetDeviceProcAddr(device, "vkFreeCommandBuffers") + FreeDescriptorSets = auto_cast GetDeviceProcAddr(device, "vkFreeDescriptorSets") + FreeMemory = auto_cast GetDeviceProcAddr(device, "vkFreeMemory") + GetAccelerationStructureBuildSizesKHR = auto_cast GetDeviceProcAddr(device, "vkGetAccelerationStructureBuildSizesKHR") + GetAccelerationStructureDeviceAddressKHR = auto_cast GetDeviceProcAddr(device, "vkGetAccelerationStructureDeviceAddressKHR") + GetAccelerationStructureHandleNV = auto_cast GetDeviceProcAddr(device, "vkGetAccelerationStructureHandleNV") + GetAccelerationStructureMemoryRequirementsNV = auto_cast GetDeviceProcAddr(device, "vkGetAccelerationStructureMemoryRequirementsNV") + GetBufferDeviceAddress = auto_cast GetDeviceProcAddr(device, "vkGetBufferDeviceAddress") + GetBufferDeviceAddressEXT = auto_cast GetDeviceProcAddr(device, "vkGetBufferDeviceAddressEXT") + GetBufferDeviceAddressKHR = auto_cast GetDeviceProcAddr(device, "vkGetBufferDeviceAddressKHR") + GetBufferMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetBufferMemoryRequirements") + GetBufferMemoryRequirements2 = auto_cast GetDeviceProcAddr(device, "vkGetBufferMemoryRequirements2") + GetBufferMemoryRequirements2KHR = auto_cast GetDeviceProcAddr(device, "vkGetBufferMemoryRequirements2KHR") + GetBufferOpaqueCaptureAddress = auto_cast GetDeviceProcAddr(device, "vkGetBufferOpaqueCaptureAddress") + GetBufferOpaqueCaptureAddressKHR = auto_cast GetDeviceProcAddr(device, "vkGetBufferOpaqueCaptureAddressKHR") + GetCalibratedTimestampsEXT = auto_cast GetDeviceProcAddr(device, "vkGetCalibratedTimestampsEXT") + GetDeferredOperationMaxConcurrencyKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeferredOperationMaxConcurrencyKHR") + GetDeferredOperationResultKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeferredOperationResultKHR") + GetDescriptorSetLayoutSupport = auto_cast GetDeviceProcAddr(device, "vkGetDescriptorSetLayoutSupport") + GetDescriptorSetLayoutSupportKHR = auto_cast GetDeviceProcAddr(device, "vkGetDescriptorSetLayoutSupportKHR") + GetDeviceAccelerationStructureCompatibilityKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceAccelerationStructureCompatibilityKHR") + GetDeviceGroupPeerMemoryFeatures = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupPeerMemoryFeatures") + GetDeviceGroupPeerMemoryFeaturesKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupPeerMemoryFeaturesKHR") + GetDeviceGroupPresentCapabilitiesKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupPresentCapabilitiesKHR") + GetDeviceGroupSurfacePresentModes2EXT = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupSurfacePresentModes2EXT") + GetDeviceGroupSurfacePresentModesKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupSurfacePresentModesKHR") + GetDeviceMemoryCommitment = auto_cast GetDeviceProcAddr(device, "vkGetDeviceMemoryCommitment") + GetDeviceMemoryOpaqueCaptureAddress = auto_cast GetDeviceProcAddr(device, "vkGetDeviceMemoryOpaqueCaptureAddress") + GetDeviceMemoryOpaqueCaptureAddressKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceMemoryOpaqueCaptureAddressKHR") + GetDeviceProcAddr = auto_cast GetDeviceProcAddr(device, "vkGetDeviceProcAddr") + GetDeviceQueue = auto_cast GetDeviceProcAddr(device, "vkGetDeviceQueue") + GetDeviceQueue2 = auto_cast GetDeviceProcAddr(device, "vkGetDeviceQueue2") + GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = auto_cast GetDeviceProcAddr(device, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI") + GetEventStatus = auto_cast GetDeviceProcAddr(device, "vkGetEventStatus") + GetFenceFdKHR = auto_cast GetDeviceProcAddr(device, "vkGetFenceFdKHR") + GetFenceStatus = auto_cast GetDeviceProcAddr(device, "vkGetFenceStatus") + GetFenceWin32HandleKHR = auto_cast GetDeviceProcAddr(device, "vkGetFenceWin32HandleKHR") + GetGeneratedCommandsMemoryRequirementsNV = auto_cast GetDeviceProcAddr(device, "vkGetGeneratedCommandsMemoryRequirementsNV") + GetImageDrmFormatModifierPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkGetImageDrmFormatModifierPropertiesEXT") + GetImageMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetImageMemoryRequirements") + GetImageMemoryRequirements2 = auto_cast GetDeviceProcAddr(device, "vkGetImageMemoryRequirements2") + GetImageMemoryRequirements2KHR = auto_cast GetDeviceProcAddr(device, "vkGetImageMemoryRequirements2KHR") + GetImageSparseMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements") + GetImageSparseMemoryRequirements2 = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2") + GetImageSparseMemoryRequirements2KHR = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2KHR") + GetImageSubresourceLayout = auto_cast GetDeviceProcAddr(device, "vkGetImageSubresourceLayout") + GetImageViewAddressNVX = auto_cast GetDeviceProcAddr(device, "vkGetImageViewAddressNVX") + GetImageViewHandleNVX = auto_cast GetDeviceProcAddr(device, "vkGetImageViewHandleNVX") + GetMemoryFdKHR = auto_cast GetDeviceProcAddr(device, "vkGetMemoryFdKHR") + GetMemoryFdPropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkGetMemoryFdPropertiesKHR") + GetMemoryHostPointerPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkGetMemoryHostPointerPropertiesEXT") + GetMemoryRemoteAddressNV = auto_cast GetDeviceProcAddr(device, "vkGetMemoryRemoteAddressNV") + GetMemoryWin32HandleKHR = auto_cast GetDeviceProcAddr(device, "vkGetMemoryWin32HandleKHR") + GetMemoryWin32HandleNV = auto_cast GetDeviceProcAddr(device, "vkGetMemoryWin32HandleNV") + GetMemoryWin32HandlePropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkGetMemoryWin32HandlePropertiesKHR") + GetPastPresentationTimingGOOGLE = auto_cast GetDeviceProcAddr(device, "vkGetPastPresentationTimingGOOGLE") + GetPerformanceParameterINTEL = auto_cast GetDeviceProcAddr(device, "vkGetPerformanceParameterINTEL") + GetPipelineCacheData = auto_cast GetDeviceProcAddr(device, "vkGetPipelineCacheData") + GetPipelineExecutableInternalRepresentationsKHR = auto_cast GetDeviceProcAddr(device, "vkGetPipelineExecutableInternalRepresentationsKHR") + GetPipelineExecutablePropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkGetPipelineExecutablePropertiesKHR") + GetPipelineExecutableStatisticsKHR = auto_cast GetDeviceProcAddr(device, "vkGetPipelineExecutableStatisticsKHR") + GetPrivateDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetPrivateDataEXT") + GetQueryPoolResults = auto_cast GetDeviceProcAddr(device, "vkGetQueryPoolResults") + GetQueueCheckpointData2NV = auto_cast GetDeviceProcAddr(device, "vkGetQueueCheckpointData2NV") + GetQueueCheckpointDataNV = auto_cast GetDeviceProcAddr(device, "vkGetQueueCheckpointDataNV") + GetRayTracingCaptureReplayShaderGroupHandlesKHR = auto_cast GetDeviceProcAddr(device, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR") + GetRayTracingShaderGroupHandlesKHR = auto_cast GetDeviceProcAddr(device, "vkGetRayTracingShaderGroupHandlesKHR") + GetRayTracingShaderGroupHandlesNV = auto_cast GetDeviceProcAddr(device, "vkGetRayTracingShaderGroupHandlesNV") + GetRayTracingShaderGroupStackSizeKHR = auto_cast GetDeviceProcAddr(device, "vkGetRayTracingShaderGroupStackSizeKHR") + GetRefreshCycleDurationGOOGLE = auto_cast GetDeviceProcAddr(device, "vkGetRefreshCycleDurationGOOGLE") + GetRenderAreaGranularity = auto_cast GetDeviceProcAddr(device, "vkGetRenderAreaGranularity") + GetSemaphoreCounterValue = auto_cast GetDeviceProcAddr(device, "vkGetSemaphoreCounterValue") + GetSemaphoreCounterValueKHR = auto_cast GetDeviceProcAddr(device, "vkGetSemaphoreCounterValueKHR") + GetSemaphoreFdKHR = auto_cast GetDeviceProcAddr(device, "vkGetSemaphoreFdKHR") + GetSemaphoreWin32HandleKHR = auto_cast GetDeviceProcAddr(device, "vkGetSemaphoreWin32HandleKHR") + GetShaderInfoAMD = auto_cast GetDeviceProcAddr(device, "vkGetShaderInfoAMD") + GetSwapchainCounterEXT = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainCounterEXT") + GetSwapchainImagesKHR = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainImagesKHR") + GetSwapchainStatusKHR = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainStatusKHR") + GetValidationCacheDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetValidationCacheDataEXT") + ImportFenceFdKHR = auto_cast GetDeviceProcAddr(device, "vkImportFenceFdKHR") + ImportFenceWin32HandleKHR = auto_cast GetDeviceProcAddr(device, "vkImportFenceWin32HandleKHR") + ImportSemaphoreFdKHR = auto_cast GetDeviceProcAddr(device, "vkImportSemaphoreFdKHR") + ImportSemaphoreWin32HandleKHR = auto_cast GetDeviceProcAddr(device, "vkImportSemaphoreWin32HandleKHR") + InitializePerformanceApiINTEL = auto_cast GetDeviceProcAddr(device, "vkInitializePerformanceApiINTEL") + InvalidateMappedMemoryRanges = auto_cast GetDeviceProcAddr(device, "vkInvalidateMappedMemoryRanges") + MapMemory = auto_cast GetDeviceProcAddr(device, "vkMapMemory") + MergePipelineCaches = auto_cast GetDeviceProcAddr(device, "vkMergePipelineCaches") + MergeValidationCachesEXT = auto_cast GetDeviceProcAddr(device, "vkMergeValidationCachesEXT") + QueueBeginDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkQueueBeginDebugUtilsLabelEXT") + QueueBindSparse = auto_cast GetDeviceProcAddr(device, "vkQueueBindSparse") + QueueEndDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkQueueEndDebugUtilsLabelEXT") + QueueInsertDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkQueueInsertDebugUtilsLabelEXT") + QueuePresentKHR = auto_cast GetDeviceProcAddr(device, "vkQueuePresentKHR") + QueueSetPerformanceConfigurationINTEL = auto_cast GetDeviceProcAddr(device, "vkQueueSetPerformanceConfigurationINTEL") + QueueSubmit = auto_cast GetDeviceProcAddr(device, "vkQueueSubmit") + QueueSubmit2KHR = auto_cast GetDeviceProcAddr(device, "vkQueueSubmit2KHR") + QueueWaitIdle = auto_cast GetDeviceProcAddr(device, "vkQueueWaitIdle") + RegisterDeviceEventEXT = auto_cast GetDeviceProcAddr(device, "vkRegisterDeviceEventEXT") + RegisterDisplayEventEXT = auto_cast GetDeviceProcAddr(device, "vkRegisterDisplayEventEXT") + ReleaseFullScreenExclusiveModeEXT = auto_cast GetDeviceProcAddr(device, "vkReleaseFullScreenExclusiveModeEXT") + ReleasePerformanceConfigurationINTEL = auto_cast GetDeviceProcAddr(device, "vkReleasePerformanceConfigurationINTEL") + ReleaseProfilingLockKHR = auto_cast GetDeviceProcAddr(device, "vkReleaseProfilingLockKHR") + ResetCommandBuffer = auto_cast GetDeviceProcAddr(device, "vkResetCommandBuffer") + ResetCommandPool = auto_cast GetDeviceProcAddr(device, "vkResetCommandPool") + ResetDescriptorPool = auto_cast GetDeviceProcAddr(device, "vkResetDescriptorPool") + ResetEvent = auto_cast GetDeviceProcAddr(device, "vkResetEvent") + ResetFences = auto_cast GetDeviceProcAddr(device, "vkResetFences") + ResetQueryPool = auto_cast GetDeviceProcAddr(device, "vkResetQueryPool") + ResetQueryPoolEXT = auto_cast GetDeviceProcAddr(device, "vkResetQueryPoolEXT") + SetDebugUtilsObjectNameEXT = auto_cast GetDeviceProcAddr(device, "vkSetDebugUtilsObjectNameEXT") + SetDebugUtilsObjectTagEXT = auto_cast GetDeviceProcAddr(device, "vkSetDebugUtilsObjectTagEXT") + SetDeviceMemoryPriorityEXT = auto_cast GetDeviceProcAddr(device, "vkSetDeviceMemoryPriorityEXT") + SetEvent = auto_cast GetDeviceProcAddr(device, "vkSetEvent") + SetHdrMetadataEXT = auto_cast GetDeviceProcAddr(device, "vkSetHdrMetadataEXT") + SetLocalDimmingAMD = auto_cast GetDeviceProcAddr(device, "vkSetLocalDimmingAMD") + SetPrivateDataEXT = auto_cast GetDeviceProcAddr(device, "vkSetPrivateDataEXT") + SignalSemaphore = auto_cast GetDeviceProcAddr(device, "vkSignalSemaphore") + SignalSemaphoreKHR = auto_cast GetDeviceProcAddr(device, "vkSignalSemaphoreKHR") + TrimCommandPool = auto_cast GetDeviceProcAddr(device, "vkTrimCommandPool") + TrimCommandPoolKHR = auto_cast GetDeviceProcAddr(device, "vkTrimCommandPoolKHR") + UninitializePerformanceApiINTEL = auto_cast GetDeviceProcAddr(device, "vkUninitializePerformanceApiINTEL") + UnmapMemory = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory") + UpdateDescriptorSetWithTemplate = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplate") + UpdateDescriptorSetWithTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplateKHR") + UpdateDescriptorSets = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSets") + WaitForFences = auto_cast GetDeviceProcAddr(device, "vkWaitForFences") + WaitForPresentKHR = auto_cast GetDeviceProcAddr(device, "vkWaitForPresentKHR") + WaitSemaphores = auto_cast GetDeviceProcAddr(device, "vkWaitSemaphores") + WaitSemaphoresKHR = auto_cast GetDeviceProcAddr(device, "vkWaitSemaphoresKHR") + WriteAccelerationStructuresPropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkWriteAccelerationStructuresPropertiesKHR") +} + +load_proc_addresses_instance :: proc(instance: Instance) { + AcquireDrmDisplayEXT = auto_cast GetInstanceProcAddr(instance, "vkAcquireDrmDisplayEXT") + AcquireWinrtDisplayNV = auto_cast GetInstanceProcAddr(instance, "vkAcquireWinrtDisplayNV") + CreateDebugReportCallbackEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateDebugReportCallbackEXT") + CreateDebugUtilsMessengerEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT") + CreateDevice = auto_cast GetInstanceProcAddr(instance, "vkCreateDevice") + CreateDisplayModeKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateDisplayModeKHR") + CreateDisplayPlaneSurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateDisplayPlaneSurfaceKHR") + CreateHeadlessSurfaceEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateHeadlessSurfaceEXT") + CreateIOSSurfaceMVK = auto_cast GetInstanceProcAddr(instance, "vkCreateIOSSurfaceMVK") + CreateMacOSSurfaceMVK = auto_cast GetInstanceProcAddr(instance, "vkCreateMacOSSurfaceMVK") + CreateMetalSurfaceEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateMetalSurfaceEXT") + CreateWin32SurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateWin32SurfaceKHR") + DebugReportMessageEXT = auto_cast GetInstanceProcAddr(instance, "vkDebugReportMessageEXT") + DestroyDebugReportCallbackEXT = auto_cast GetInstanceProcAddr(instance, "vkDestroyDebugReportCallbackEXT") + DestroyDebugUtilsMessengerEXT = auto_cast GetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT") + DestroyInstance = auto_cast GetInstanceProcAddr(instance, "vkDestroyInstance") + DestroySurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroySurfaceKHR") + EnumerateDeviceExtensionProperties = auto_cast GetInstanceProcAddr(instance, "vkEnumerateDeviceExtensionProperties") + EnumerateDeviceLayerProperties = auto_cast GetInstanceProcAddr(instance, "vkEnumerateDeviceLayerProperties") + EnumeratePhysicalDeviceGroups = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceGroups") + EnumeratePhysicalDeviceGroupsKHR = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceGroupsKHR") + EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR") + EnumeratePhysicalDevices = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDevices") + GetDisplayModeProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayModeProperties2KHR") + GetDisplayModePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayModePropertiesKHR") + GetDisplayPlaneCapabilities2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayPlaneCapabilities2KHR") + GetDisplayPlaneCapabilitiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayPlaneCapabilitiesKHR") + GetDisplayPlaneSupportedDisplaysKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayPlaneSupportedDisplaysKHR") + GetDrmDisplayEXT = auto_cast GetInstanceProcAddr(instance, "vkGetDrmDisplayEXT") + GetInstanceProcAddr = auto_cast GetInstanceProcAddr(instance, "vkGetInstanceProcAddr") + GetPhysicalDeviceCalibrateableTimeDomainsEXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT") + GetPhysicalDeviceCooperativeMatrixPropertiesNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV") + GetPhysicalDeviceDisplayPlaneProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR") + GetPhysicalDeviceDisplayPlanePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR") + GetPhysicalDeviceDisplayProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayProperties2KHR") + GetPhysicalDeviceDisplayPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPropertiesKHR") + GetPhysicalDeviceExternalBufferProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalBufferProperties") + GetPhysicalDeviceExternalBufferPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalBufferPropertiesKHR") + GetPhysicalDeviceExternalFenceProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalFenceProperties") + GetPhysicalDeviceExternalFencePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalFencePropertiesKHR") + GetPhysicalDeviceExternalImageFormatPropertiesNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV") + GetPhysicalDeviceExternalSemaphoreProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalSemaphoreProperties") + GetPhysicalDeviceExternalSemaphorePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR") + GetPhysicalDeviceFeatures = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures") + GetPhysicalDeviceFeatures2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2") + GetPhysicalDeviceFeatures2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2KHR") + GetPhysicalDeviceFormatProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties") + GetPhysicalDeviceFormatProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2") + GetPhysicalDeviceFormatProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2KHR") + GetPhysicalDeviceFragmentShadingRatesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFragmentShadingRatesKHR") + GetPhysicalDeviceImageFormatProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties") + GetPhysicalDeviceImageFormatProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties2") + GetPhysicalDeviceImageFormatProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties2KHR") + GetPhysicalDeviceMemoryProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties") + GetPhysicalDeviceMemoryProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties2") + GetPhysicalDeviceMemoryProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties2KHR") + GetPhysicalDeviceMultisamplePropertiesEXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceMultisamplePropertiesEXT") + GetPhysicalDevicePresentRectanglesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDevicePresentRectanglesKHR") + GetPhysicalDeviceProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties") + GetPhysicalDeviceProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2") + GetPhysicalDeviceProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2KHR") + GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR") + GetPhysicalDeviceQueueFamilyProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties") + GetPhysicalDeviceQueueFamilyProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2") + GetPhysicalDeviceQueueFamilyProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR") + GetPhysicalDeviceSparseImageFormatProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties") + GetPhysicalDeviceSparseImageFormatProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2") + GetPhysicalDeviceSparseImageFormatProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR") + GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV") + GetPhysicalDeviceSurfaceCapabilities2EXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT") + GetPhysicalDeviceSurfaceCapabilities2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilities2KHR") + GetPhysicalDeviceSurfaceCapabilitiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR") + GetPhysicalDeviceSurfaceFormats2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormats2KHR") + GetPhysicalDeviceSurfaceFormatsKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR") + GetPhysicalDeviceSurfacePresentModes2EXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModes2EXT") + GetPhysicalDeviceSurfacePresentModesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR") + GetPhysicalDeviceSurfaceSupportKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceSupportKHR") + GetPhysicalDeviceToolPropertiesEXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceToolPropertiesEXT") + GetPhysicalDeviceWin32PresentationSupportKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR") + GetWinrtDisplayNV = auto_cast GetInstanceProcAddr(instance, "vkGetWinrtDisplayNV") + ReleaseDisplayEXT = auto_cast GetInstanceProcAddr(instance, "vkReleaseDisplayEXT") + SubmitDebugUtilsMessageEXT = auto_cast GetInstanceProcAddr(instance, "vkSubmitDebugUtilsMessageEXT") + + // Device Procedures (may call into dispatch) + AcquireFullScreenExclusiveModeEXT = auto_cast GetInstanceProcAddr(instance, "vkAcquireFullScreenExclusiveModeEXT") + AcquireNextImage2KHR = auto_cast GetInstanceProcAddr(instance, "vkAcquireNextImage2KHR") + AcquireNextImageKHR = auto_cast GetInstanceProcAddr(instance, "vkAcquireNextImageKHR") + AcquirePerformanceConfigurationINTEL = auto_cast GetInstanceProcAddr(instance, "vkAcquirePerformanceConfigurationINTEL") + AcquireProfilingLockKHR = auto_cast GetInstanceProcAddr(instance, "vkAcquireProfilingLockKHR") + AllocateCommandBuffers = auto_cast GetInstanceProcAddr(instance, "vkAllocateCommandBuffers") + AllocateDescriptorSets = auto_cast GetInstanceProcAddr(instance, "vkAllocateDescriptorSets") + AllocateMemory = auto_cast GetInstanceProcAddr(instance, "vkAllocateMemory") + BeginCommandBuffer = auto_cast GetInstanceProcAddr(instance, "vkBeginCommandBuffer") + BindAccelerationStructureMemoryNV = auto_cast GetInstanceProcAddr(instance, "vkBindAccelerationStructureMemoryNV") + BindBufferMemory = auto_cast GetInstanceProcAddr(instance, "vkBindBufferMemory") + BindBufferMemory2 = auto_cast GetInstanceProcAddr(instance, "vkBindBufferMemory2") + BindBufferMemory2KHR = auto_cast GetInstanceProcAddr(instance, "vkBindBufferMemory2KHR") + BindImageMemory = auto_cast GetInstanceProcAddr(instance, "vkBindImageMemory") + BindImageMemory2 = auto_cast GetInstanceProcAddr(instance, "vkBindImageMemory2") + BindImageMemory2KHR = auto_cast GetInstanceProcAddr(instance, "vkBindImageMemory2KHR") + BuildAccelerationStructuresKHR = auto_cast GetInstanceProcAddr(instance, "vkBuildAccelerationStructuresKHR") + CmdBeginConditionalRenderingEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginConditionalRenderingEXT") + CmdBeginDebugUtilsLabelEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginDebugUtilsLabelEXT") + CmdBeginQuery = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginQuery") + CmdBeginQueryIndexedEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginQueryIndexedEXT") + CmdBeginRenderPass = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginRenderPass") + CmdBeginRenderPass2 = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginRenderPass2") + CmdBeginRenderPass2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginRenderPass2KHR") + CmdBeginTransformFeedbackEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginTransformFeedbackEXT") + CmdBindDescriptorSets = auto_cast GetInstanceProcAddr(instance, "vkCmdBindDescriptorSets") + CmdBindIndexBuffer = auto_cast GetInstanceProcAddr(instance, "vkCmdBindIndexBuffer") + CmdBindInvocationMaskHUAWEI = auto_cast GetInstanceProcAddr(instance, "vkCmdBindInvocationMaskHUAWEI") + CmdBindPipeline = auto_cast GetInstanceProcAddr(instance, "vkCmdBindPipeline") + CmdBindPipelineShaderGroupNV = auto_cast GetInstanceProcAddr(instance, "vkCmdBindPipelineShaderGroupNV") + CmdBindShadingRateImageNV = auto_cast GetInstanceProcAddr(instance, "vkCmdBindShadingRateImageNV") + CmdBindTransformFeedbackBuffersEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBindTransformFeedbackBuffersEXT") + CmdBindVertexBuffers = auto_cast GetInstanceProcAddr(instance, "vkCmdBindVertexBuffers") + CmdBindVertexBuffers2EXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBindVertexBuffers2EXT") + CmdBlitImage = auto_cast GetInstanceProcAddr(instance, "vkCmdBlitImage") + CmdBlitImage2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdBlitImage2KHR") + CmdBuildAccelerationStructureNV = auto_cast GetInstanceProcAddr(instance, "vkCmdBuildAccelerationStructureNV") + CmdBuildAccelerationStructuresIndirectKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdBuildAccelerationStructuresIndirectKHR") + CmdBuildAccelerationStructuresKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdBuildAccelerationStructuresKHR") + CmdClearAttachments = auto_cast GetInstanceProcAddr(instance, "vkCmdClearAttachments") + CmdClearColorImage = auto_cast GetInstanceProcAddr(instance, "vkCmdClearColorImage") + CmdClearDepthStencilImage = auto_cast GetInstanceProcAddr(instance, "vkCmdClearDepthStencilImage") + CmdCopyAccelerationStructureKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyAccelerationStructureKHR") + CmdCopyAccelerationStructureNV = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyAccelerationStructureNV") + CmdCopyAccelerationStructureToMemoryKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyAccelerationStructureToMemoryKHR") + CmdCopyBuffer = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyBuffer") + CmdCopyBuffer2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyBuffer2KHR") + CmdCopyBufferToImage = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyBufferToImage") + CmdCopyBufferToImage2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyBufferToImage2KHR") + CmdCopyImage = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyImage") + CmdCopyImage2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyImage2KHR") + CmdCopyImageToBuffer = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyImageToBuffer") + CmdCopyImageToBuffer2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyImageToBuffer2KHR") + CmdCopyMemoryToAccelerationStructureKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyMemoryToAccelerationStructureKHR") + CmdCopyQueryPoolResults = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyQueryPoolResults") + CmdCuLaunchKernelNVX = auto_cast GetInstanceProcAddr(instance, "vkCmdCuLaunchKernelNVX") + CmdDebugMarkerBeginEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDebugMarkerBeginEXT") + CmdDebugMarkerEndEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDebugMarkerEndEXT") + CmdDebugMarkerInsertEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDebugMarkerInsertEXT") + CmdDispatch = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatch") + CmdDispatchBase = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatchBase") + CmdDispatchBaseKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatchBaseKHR") + CmdDispatchIndirect = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatchIndirect") + CmdDraw = auto_cast GetInstanceProcAddr(instance, "vkCmdDraw") + CmdDrawIndexed = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndexed") + CmdDrawIndexedIndirect = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirect") + CmdDrawIndexedIndirectCount = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirectCount") + CmdDrawIndexedIndirectCountAMD = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirectCountAMD") + CmdDrawIndexedIndirectCountKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirectCountKHR") + CmdDrawIndirect = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndirect") + CmdDrawIndirectByteCountEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndirectByteCountEXT") + CmdDrawIndirectCount = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndirectCount") + CmdDrawIndirectCountAMD = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndirectCountAMD") + CmdDrawIndirectCountKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndirectCountKHR") + CmdDrawMeshTasksIndirectCountNV = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawMeshTasksIndirectCountNV") + CmdDrawMeshTasksIndirectNV = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawMeshTasksIndirectNV") + CmdDrawMeshTasksNV = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawMeshTasksNV") + CmdDrawMultiEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawMultiEXT") + CmdDrawMultiIndexedEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawMultiIndexedEXT") + CmdEndConditionalRenderingEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdEndConditionalRenderingEXT") + CmdEndDebugUtilsLabelEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdEndDebugUtilsLabelEXT") + CmdEndQuery = auto_cast GetInstanceProcAddr(instance, "vkCmdEndQuery") + CmdEndQueryIndexedEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdEndQueryIndexedEXT") + CmdEndRenderPass = auto_cast GetInstanceProcAddr(instance, "vkCmdEndRenderPass") + CmdEndRenderPass2 = auto_cast GetInstanceProcAddr(instance, "vkCmdEndRenderPass2") + CmdEndRenderPass2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdEndRenderPass2KHR") + CmdEndTransformFeedbackEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdEndTransformFeedbackEXT") + CmdExecuteCommands = auto_cast GetInstanceProcAddr(instance, "vkCmdExecuteCommands") + CmdExecuteGeneratedCommandsNV = auto_cast GetInstanceProcAddr(instance, "vkCmdExecuteGeneratedCommandsNV") + CmdFillBuffer = auto_cast GetInstanceProcAddr(instance, "vkCmdFillBuffer") + CmdInsertDebugUtilsLabelEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdInsertDebugUtilsLabelEXT") + CmdNextSubpass = auto_cast GetInstanceProcAddr(instance, "vkCmdNextSubpass") + CmdNextSubpass2 = auto_cast GetInstanceProcAddr(instance, "vkCmdNextSubpass2") + CmdNextSubpass2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdNextSubpass2KHR") + CmdPipelineBarrier = auto_cast GetInstanceProcAddr(instance, "vkCmdPipelineBarrier") + CmdPipelineBarrier2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdPipelineBarrier2KHR") + CmdPreprocessGeneratedCommandsNV = auto_cast GetInstanceProcAddr(instance, "vkCmdPreprocessGeneratedCommandsNV") + CmdPushConstants = auto_cast GetInstanceProcAddr(instance, "vkCmdPushConstants") + CmdPushDescriptorSetKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDescriptorSetKHR") + CmdPushDescriptorSetWithTemplateKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDescriptorSetWithTemplateKHR") + CmdResetEvent = auto_cast GetInstanceProcAddr(instance, "vkCmdResetEvent") + CmdResetEvent2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdResetEvent2KHR") + CmdResetQueryPool = auto_cast GetInstanceProcAddr(instance, "vkCmdResetQueryPool") + CmdResolveImage = auto_cast GetInstanceProcAddr(instance, "vkCmdResolveImage") + CmdResolveImage2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdResolveImage2KHR") + CmdSetBlendConstants = auto_cast GetInstanceProcAddr(instance, "vkCmdSetBlendConstants") + CmdSetCheckpointNV = auto_cast GetInstanceProcAddr(instance, "vkCmdSetCheckpointNV") + CmdSetCoarseSampleOrderNV = auto_cast GetInstanceProcAddr(instance, "vkCmdSetCoarseSampleOrderNV") + CmdSetCullModeEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetCullModeEXT") + CmdSetDepthBias = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDepthBias") + CmdSetDepthBiasEnableEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDepthBiasEnableEXT") + CmdSetDepthBounds = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDepthBounds") + CmdSetDepthBoundsTestEnableEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDepthBoundsTestEnableEXT") + CmdSetDepthCompareOpEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDepthCompareOpEXT") + CmdSetDepthTestEnableEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDepthTestEnableEXT") + CmdSetDepthWriteEnableEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDepthWriteEnableEXT") + CmdSetDeviceMask = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDeviceMask") + CmdSetDeviceMaskKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDeviceMaskKHR") + CmdSetDiscardRectangleEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDiscardRectangleEXT") + CmdSetEvent = auto_cast GetInstanceProcAddr(instance, "vkCmdSetEvent") + CmdSetEvent2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdSetEvent2KHR") + CmdSetExclusiveScissorNV = auto_cast GetInstanceProcAddr(instance, "vkCmdSetExclusiveScissorNV") + CmdSetFragmentShadingRateEnumNV = auto_cast GetInstanceProcAddr(instance, "vkCmdSetFragmentShadingRateEnumNV") + CmdSetFragmentShadingRateKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdSetFragmentShadingRateKHR") + CmdSetFrontFaceEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetFrontFaceEXT") + CmdSetLineStippleEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetLineStippleEXT") + CmdSetLineWidth = auto_cast GetInstanceProcAddr(instance, "vkCmdSetLineWidth") + CmdSetLogicOpEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetLogicOpEXT") + CmdSetPatchControlPointsEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetPatchControlPointsEXT") + CmdSetPerformanceMarkerINTEL = auto_cast GetInstanceProcAddr(instance, "vkCmdSetPerformanceMarkerINTEL") + CmdSetPerformanceOverrideINTEL = auto_cast GetInstanceProcAddr(instance, "vkCmdSetPerformanceOverrideINTEL") + CmdSetPerformanceStreamMarkerINTEL = auto_cast GetInstanceProcAddr(instance, "vkCmdSetPerformanceStreamMarkerINTEL") + CmdSetPrimitiveRestartEnableEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetPrimitiveRestartEnableEXT") + CmdSetPrimitiveTopologyEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetPrimitiveTopologyEXT") + CmdSetRasterizerDiscardEnableEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetRasterizerDiscardEnableEXT") + CmdSetRayTracingPipelineStackSizeKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdSetRayTracingPipelineStackSizeKHR") + CmdSetSampleLocationsEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetSampleLocationsEXT") + CmdSetScissor = auto_cast GetInstanceProcAddr(instance, "vkCmdSetScissor") + CmdSetScissorWithCountEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetScissorWithCountEXT") + CmdSetStencilCompareMask = auto_cast GetInstanceProcAddr(instance, "vkCmdSetStencilCompareMask") + CmdSetStencilOpEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetStencilOpEXT") + CmdSetStencilReference = auto_cast GetInstanceProcAddr(instance, "vkCmdSetStencilReference") + CmdSetStencilTestEnableEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetStencilTestEnableEXT") + CmdSetStencilWriteMask = auto_cast GetInstanceProcAddr(instance, "vkCmdSetStencilWriteMask") + CmdSetVertexInputEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetVertexInputEXT") + CmdSetViewport = auto_cast GetInstanceProcAddr(instance, "vkCmdSetViewport") + CmdSetViewportShadingRatePaletteNV = auto_cast GetInstanceProcAddr(instance, "vkCmdSetViewportShadingRatePaletteNV") + CmdSetViewportWScalingNV = auto_cast GetInstanceProcAddr(instance, "vkCmdSetViewportWScalingNV") + CmdSetViewportWithCountEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetViewportWithCountEXT") + CmdSubpassShadingHUAWEI = auto_cast GetInstanceProcAddr(instance, "vkCmdSubpassShadingHUAWEI") + CmdTraceRaysIndirectKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdTraceRaysIndirectKHR") + CmdTraceRaysKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdTraceRaysKHR") + CmdTraceRaysNV = auto_cast GetInstanceProcAddr(instance, "vkCmdTraceRaysNV") + CmdUpdateBuffer = auto_cast GetInstanceProcAddr(instance, "vkCmdUpdateBuffer") + CmdWaitEvents = auto_cast GetInstanceProcAddr(instance, "vkCmdWaitEvents") + CmdWaitEvents2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdWaitEvents2KHR") + CmdWriteAccelerationStructuresPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdWriteAccelerationStructuresPropertiesKHR") + CmdWriteAccelerationStructuresPropertiesNV = auto_cast GetInstanceProcAddr(instance, "vkCmdWriteAccelerationStructuresPropertiesNV") + CmdWriteBufferMarker2AMD = auto_cast GetInstanceProcAddr(instance, "vkCmdWriteBufferMarker2AMD") + CmdWriteBufferMarkerAMD = auto_cast GetInstanceProcAddr(instance, "vkCmdWriteBufferMarkerAMD") + CmdWriteTimestamp = auto_cast GetInstanceProcAddr(instance, "vkCmdWriteTimestamp") + CmdWriteTimestamp2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdWriteTimestamp2KHR") + CompileDeferredNV = auto_cast GetInstanceProcAddr(instance, "vkCompileDeferredNV") + CopyAccelerationStructureKHR = auto_cast GetInstanceProcAddr(instance, "vkCopyAccelerationStructureKHR") + CopyAccelerationStructureToMemoryKHR = auto_cast GetInstanceProcAddr(instance, "vkCopyAccelerationStructureToMemoryKHR") + CopyMemoryToAccelerationStructureKHR = auto_cast GetInstanceProcAddr(instance, "vkCopyMemoryToAccelerationStructureKHR") + CreateAccelerationStructureKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateAccelerationStructureKHR") + CreateAccelerationStructureNV = auto_cast GetInstanceProcAddr(instance, "vkCreateAccelerationStructureNV") + CreateBuffer = auto_cast GetInstanceProcAddr(instance, "vkCreateBuffer") + CreateBufferView = auto_cast GetInstanceProcAddr(instance, "vkCreateBufferView") + CreateCommandPool = auto_cast GetInstanceProcAddr(instance, "vkCreateCommandPool") + CreateComputePipelines = auto_cast GetInstanceProcAddr(instance, "vkCreateComputePipelines") + CreateCuFunctionNVX = auto_cast GetInstanceProcAddr(instance, "vkCreateCuFunctionNVX") + CreateCuModuleNVX = auto_cast GetInstanceProcAddr(instance, "vkCreateCuModuleNVX") + CreateDeferredOperationKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateDeferredOperationKHR") + CreateDescriptorPool = auto_cast GetInstanceProcAddr(instance, "vkCreateDescriptorPool") + CreateDescriptorSetLayout = auto_cast GetInstanceProcAddr(instance, "vkCreateDescriptorSetLayout") + CreateDescriptorUpdateTemplate = auto_cast GetInstanceProcAddr(instance, "vkCreateDescriptorUpdateTemplate") + CreateDescriptorUpdateTemplateKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateDescriptorUpdateTemplateKHR") + CreateEvent = auto_cast GetInstanceProcAddr(instance, "vkCreateEvent") + CreateFence = auto_cast GetInstanceProcAddr(instance, "vkCreateFence") + CreateFramebuffer = auto_cast GetInstanceProcAddr(instance, "vkCreateFramebuffer") + CreateGraphicsPipelines = auto_cast GetInstanceProcAddr(instance, "vkCreateGraphicsPipelines") + CreateImage = auto_cast GetInstanceProcAddr(instance, "vkCreateImage") + CreateImageView = auto_cast GetInstanceProcAddr(instance, "vkCreateImageView") + CreateIndirectCommandsLayoutNV = auto_cast GetInstanceProcAddr(instance, "vkCreateIndirectCommandsLayoutNV") + CreatePipelineCache = auto_cast GetInstanceProcAddr(instance, "vkCreatePipelineCache") + CreatePipelineLayout = auto_cast GetInstanceProcAddr(instance, "vkCreatePipelineLayout") + CreatePrivateDataSlotEXT = auto_cast GetInstanceProcAddr(instance, "vkCreatePrivateDataSlotEXT") + CreateQueryPool = auto_cast GetInstanceProcAddr(instance, "vkCreateQueryPool") + CreateRayTracingPipelinesKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateRayTracingPipelinesKHR") + CreateRayTracingPipelinesNV = auto_cast GetInstanceProcAddr(instance, "vkCreateRayTracingPipelinesNV") + CreateRenderPass = auto_cast GetInstanceProcAddr(instance, "vkCreateRenderPass") + CreateRenderPass2 = auto_cast GetInstanceProcAddr(instance, "vkCreateRenderPass2") + CreateRenderPass2KHR = auto_cast GetInstanceProcAddr(instance, "vkCreateRenderPass2KHR") + CreateSampler = auto_cast GetInstanceProcAddr(instance, "vkCreateSampler") + CreateSamplerYcbcrConversion = auto_cast GetInstanceProcAddr(instance, "vkCreateSamplerYcbcrConversion") + CreateSamplerYcbcrConversionKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateSamplerYcbcrConversionKHR") + CreateSemaphore = auto_cast GetInstanceProcAddr(instance, "vkCreateSemaphore") + CreateShaderModule = auto_cast GetInstanceProcAddr(instance, "vkCreateShaderModule") + CreateSharedSwapchainsKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateSharedSwapchainsKHR") + CreateSwapchainKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateSwapchainKHR") + CreateValidationCacheEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateValidationCacheEXT") + DebugMarkerSetObjectNameEXT = auto_cast GetInstanceProcAddr(instance, "vkDebugMarkerSetObjectNameEXT") + DebugMarkerSetObjectTagEXT = auto_cast GetInstanceProcAddr(instance, "vkDebugMarkerSetObjectTagEXT") + DeferredOperationJoinKHR = auto_cast GetInstanceProcAddr(instance, "vkDeferredOperationJoinKHR") + DestroyAccelerationStructureKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroyAccelerationStructureKHR") + DestroyAccelerationStructureNV = auto_cast GetInstanceProcAddr(instance, "vkDestroyAccelerationStructureNV") + DestroyBuffer = auto_cast GetInstanceProcAddr(instance, "vkDestroyBuffer") + DestroyBufferView = auto_cast GetInstanceProcAddr(instance, "vkDestroyBufferView") + DestroyCommandPool = auto_cast GetInstanceProcAddr(instance, "vkDestroyCommandPool") + DestroyCuFunctionNVX = auto_cast GetInstanceProcAddr(instance, "vkDestroyCuFunctionNVX") + DestroyCuModuleNVX = auto_cast GetInstanceProcAddr(instance, "vkDestroyCuModuleNVX") + DestroyDeferredOperationKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroyDeferredOperationKHR") + DestroyDescriptorPool = auto_cast GetInstanceProcAddr(instance, "vkDestroyDescriptorPool") + DestroyDescriptorSetLayout = auto_cast GetInstanceProcAddr(instance, "vkDestroyDescriptorSetLayout") + DestroyDescriptorUpdateTemplate = auto_cast GetInstanceProcAddr(instance, "vkDestroyDescriptorUpdateTemplate") + DestroyDescriptorUpdateTemplateKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroyDescriptorUpdateTemplateKHR") + DestroyDevice = auto_cast GetInstanceProcAddr(instance, "vkDestroyDevice") + DestroyEvent = auto_cast GetInstanceProcAddr(instance, "vkDestroyEvent") + DestroyFence = auto_cast GetInstanceProcAddr(instance, "vkDestroyFence") + DestroyFramebuffer = auto_cast GetInstanceProcAddr(instance, "vkDestroyFramebuffer") + DestroyImage = auto_cast GetInstanceProcAddr(instance, "vkDestroyImage") + DestroyImageView = auto_cast GetInstanceProcAddr(instance, "vkDestroyImageView") + DestroyIndirectCommandsLayoutNV = auto_cast GetInstanceProcAddr(instance, "vkDestroyIndirectCommandsLayoutNV") + DestroyPipeline = auto_cast GetInstanceProcAddr(instance, "vkDestroyPipeline") + DestroyPipelineCache = auto_cast GetInstanceProcAddr(instance, "vkDestroyPipelineCache") + DestroyPipelineLayout = auto_cast GetInstanceProcAddr(instance, "vkDestroyPipelineLayout") + DestroyPrivateDataSlotEXT = auto_cast GetInstanceProcAddr(instance, "vkDestroyPrivateDataSlotEXT") + DestroyQueryPool = auto_cast GetInstanceProcAddr(instance, "vkDestroyQueryPool") + DestroyRenderPass = auto_cast GetInstanceProcAddr(instance, "vkDestroyRenderPass") + DestroySampler = auto_cast GetInstanceProcAddr(instance, "vkDestroySampler") + DestroySamplerYcbcrConversion = auto_cast GetInstanceProcAddr(instance, "vkDestroySamplerYcbcrConversion") + DestroySamplerYcbcrConversionKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroySamplerYcbcrConversionKHR") + DestroySemaphore = auto_cast GetInstanceProcAddr(instance, "vkDestroySemaphore") + DestroyShaderModule = auto_cast GetInstanceProcAddr(instance, "vkDestroyShaderModule") + DestroySwapchainKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroySwapchainKHR") + DestroyValidationCacheEXT = auto_cast GetInstanceProcAddr(instance, "vkDestroyValidationCacheEXT") + DeviceWaitIdle = auto_cast GetInstanceProcAddr(instance, "vkDeviceWaitIdle") + DisplayPowerControlEXT = auto_cast GetInstanceProcAddr(instance, "vkDisplayPowerControlEXT") + EndCommandBuffer = auto_cast GetInstanceProcAddr(instance, "vkEndCommandBuffer") + FlushMappedMemoryRanges = auto_cast GetInstanceProcAddr(instance, "vkFlushMappedMemoryRanges") + FreeCommandBuffers = auto_cast GetInstanceProcAddr(instance, "vkFreeCommandBuffers") + FreeDescriptorSets = auto_cast GetInstanceProcAddr(instance, "vkFreeDescriptorSets") + FreeMemory = auto_cast GetInstanceProcAddr(instance, "vkFreeMemory") + GetAccelerationStructureBuildSizesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetAccelerationStructureBuildSizesKHR") + GetAccelerationStructureDeviceAddressKHR = auto_cast GetInstanceProcAddr(instance, "vkGetAccelerationStructureDeviceAddressKHR") + GetAccelerationStructureHandleNV = auto_cast GetInstanceProcAddr(instance, "vkGetAccelerationStructureHandleNV") + GetAccelerationStructureMemoryRequirementsNV = auto_cast GetInstanceProcAddr(instance, "vkGetAccelerationStructureMemoryRequirementsNV") + GetBufferDeviceAddress = auto_cast GetInstanceProcAddr(instance, "vkGetBufferDeviceAddress") + GetBufferDeviceAddressEXT = auto_cast GetInstanceProcAddr(instance, "vkGetBufferDeviceAddressEXT") + GetBufferDeviceAddressKHR = auto_cast GetInstanceProcAddr(instance, "vkGetBufferDeviceAddressKHR") + GetBufferMemoryRequirements = auto_cast GetInstanceProcAddr(instance, "vkGetBufferMemoryRequirements") + GetBufferMemoryRequirements2 = auto_cast GetInstanceProcAddr(instance, "vkGetBufferMemoryRequirements2") + GetBufferMemoryRequirements2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetBufferMemoryRequirements2KHR") + GetBufferOpaqueCaptureAddress = auto_cast GetInstanceProcAddr(instance, "vkGetBufferOpaqueCaptureAddress") + GetBufferOpaqueCaptureAddressKHR = auto_cast GetInstanceProcAddr(instance, "vkGetBufferOpaqueCaptureAddressKHR") + GetCalibratedTimestampsEXT = auto_cast GetInstanceProcAddr(instance, "vkGetCalibratedTimestampsEXT") + GetDeferredOperationMaxConcurrencyKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeferredOperationMaxConcurrencyKHR") + GetDeferredOperationResultKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeferredOperationResultKHR") + GetDescriptorSetLayoutSupport = auto_cast GetInstanceProcAddr(instance, "vkGetDescriptorSetLayoutSupport") + GetDescriptorSetLayoutSupportKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDescriptorSetLayoutSupportKHR") + GetDeviceAccelerationStructureCompatibilityKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceAccelerationStructureCompatibilityKHR") + GetDeviceGroupPeerMemoryFeatures = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceGroupPeerMemoryFeatures") + GetDeviceGroupPeerMemoryFeaturesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceGroupPeerMemoryFeaturesKHR") + GetDeviceGroupPresentCapabilitiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceGroupPresentCapabilitiesKHR") + GetDeviceGroupSurfacePresentModes2EXT = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceGroupSurfacePresentModes2EXT") + GetDeviceGroupSurfacePresentModesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceGroupSurfacePresentModesKHR") + GetDeviceMemoryCommitment = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceMemoryCommitment") + GetDeviceMemoryOpaqueCaptureAddress = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceMemoryOpaqueCaptureAddress") + GetDeviceMemoryOpaqueCaptureAddressKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceMemoryOpaqueCaptureAddressKHR") + GetDeviceProcAddr = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceProcAddr") + GetDeviceQueue = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceQueue") + GetDeviceQueue2 = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceQueue2") + GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI") + GetEventStatus = auto_cast GetInstanceProcAddr(instance, "vkGetEventStatus") + GetFenceFdKHR = auto_cast GetInstanceProcAddr(instance, "vkGetFenceFdKHR") + GetFenceStatus = auto_cast GetInstanceProcAddr(instance, "vkGetFenceStatus") + GetFenceWin32HandleKHR = auto_cast GetInstanceProcAddr(instance, "vkGetFenceWin32HandleKHR") + GetGeneratedCommandsMemoryRequirementsNV = auto_cast GetInstanceProcAddr(instance, "vkGetGeneratedCommandsMemoryRequirementsNV") + GetImageDrmFormatModifierPropertiesEXT = auto_cast GetInstanceProcAddr(instance, "vkGetImageDrmFormatModifierPropertiesEXT") + GetImageMemoryRequirements = auto_cast GetInstanceProcAddr(instance, "vkGetImageMemoryRequirements") + GetImageMemoryRequirements2 = auto_cast GetInstanceProcAddr(instance, "vkGetImageMemoryRequirements2") + GetImageMemoryRequirements2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetImageMemoryRequirements2KHR") + GetImageSparseMemoryRequirements = auto_cast GetInstanceProcAddr(instance, "vkGetImageSparseMemoryRequirements") + GetImageSparseMemoryRequirements2 = auto_cast GetInstanceProcAddr(instance, "vkGetImageSparseMemoryRequirements2") + GetImageSparseMemoryRequirements2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetImageSparseMemoryRequirements2KHR") + GetImageSubresourceLayout = auto_cast GetInstanceProcAddr(instance, "vkGetImageSubresourceLayout") + GetImageViewAddressNVX = auto_cast GetInstanceProcAddr(instance, "vkGetImageViewAddressNVX") + GetImageViewHandleNVX = auto_cast GetInstanceProcAddr(instance, "vkGetImageViewHandleNVX") + GetMemoryFdKHR = auto_cast GetInstanceProcAddr(instance, "vkGetMemoryFdKHR") + GetMemoryFdPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetMemoryFdPropertiesKHR") + GetMemoryHostPointerPropertiesEXT = auto_cast GetInstanceProcAddr(instance, "vkGetMemoryHostPointerPropertiesEXT") + GetMemoryRemoteAddressNV = auto_cast GetInstanceProcAddr(instance, "vkGetMemoryRemoteAddressNV") + GetMemoryWin32HandleKHR = auto_cast GetInstanceProcAddr(instance, "vkGetMemoryWin32HandleKHR") + GetMemoryWin32HandleNV = auto_cast GetInstanceProcAddr(instance, "vkGetMemoryWin32HandleNV") + GetMemoryWin32HandlePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetMemoryWin32HandlePropertiesKHR") + GetPastPresentationTimingGOOGLE = auto_cast GetInstanceProcAddr(instance, "vkGetPastPresentationTimingGOOGLE") + GetPerformanceParameterINTEL = auto_cast GetInstanceProcAddr(instance, "vkGetPerformanceParameterINTEL") + GetPipelineCacheData = auto_cast GetInstanceProcAddr(instance, "vkGetPipelineCacheData") + GetPipelineExecutableInternalRepresentationsKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPipelineExecutableInternalRepresentationsKHR") + GetPipelineExecutablePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPipelineExecutablePropertiesKHR") + GetPipelineExecutableStatisticsKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPipelineExecutableStatisticsKHR") + GetPrivateDataEXT = auto_cast GetInstanceProcAddr(instance, "vkGetPrivateDataEXT") + GetQueryPoolResults = auto_cast GetInstanceProcAddr(instance, "vkGetQueryPoolResults") + GetQueueCheckpointData2NV = auto_cast GetInstanceProcAddr(instance, "vkGetQueueCheckpointData2NV") + GetQueueCheckpointDataNV = auto_cast GetInstanceProcAddr(instance, "vkGetQueueCheckpointDataNV") + GetRayTracingCaptureReplayShaderGroupHandlesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR") + GetRayTracingShaderGroupHandlesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetRayTracingShaderGroupHandlesKHR") + GetRayTracingShaderGroupHandlesNV = auto_cast GetInstanceProcAddr(instance, "vkGetRayTracingShaderGroupHandlesNV") + GetRayTracingShaderGroupStackSizeKHR = auto_cast GetInstanceProcAddr(instance, "vkGetRayTracingShaderGroupStackSizeKHR") + GetRefreshCycleDurationGOOGLE = auto_cast GetInstanceProcAddr(instance, "vkGetRefreshCycleDurationGOOGLE") + GetRenderAreaGranularity = auto_cast GetInstanceProcAddr(instance, "vkGetRenderAreaGranularity") + GetSemaphoreCounterValue = auto_cast GetInstanceProcAddr(instance, "vkGetSemaphoreCounterValue") + GetSemaphoreCounterValueKHR = auto_cast GetInstanceProcAddr(instance, "vkGetSemaphoreCounterValueKHR") + GetSemaphoreFdKHR = auto_cast GetInstanceProcAddr(instance, "vkGetSemaphoreFdKHR") + GetSemaphoreWin32HandleKHR = auto_cast GetInstanceProcAddr(instance, "vkGetSemaphoreWin32HandleKHR") + GetShaderInfoAMD = auto_cast GetInstanceProcAddr(instance, "vkGetShaderInfoAMD") + GetSwapchainCounterEXT = auto_cast GetInstanceProcAddr(instance, "vkGetSwapchainCounterEXT") + GetSwapchainImagesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetSwapchainImagesKHR") + GetSwapchainStatusKHR = auto_cast GetInstanceProcAddr(instance, "vkGetSwapchainStatusKHR") + GetValidationCacheDataEXT = auto_cast GetInstanceProcAddr(instance, "vkGetValidationCacheDataEXT") + ImportFenceFdKHR = auto_cast GetInstanceProcAddr(instance, "vkImportFenceFdKHR") + ImportFenceWin32HandleKHR = auto_cast GetInstanceProcAddr(instance, "vkImportFenceWin32HandleKHR") + ImportSemaphoreFdKHR = auto_cast GetInstanceProcAddr(instance, "vkImportSemaphoreFdKHR") + ImportSemaphoreWin32HandleKHR = auto_cast GetInstanceProcAddr(instance, "vkImportSemaphoreWin32HandleKHR") + InitializePerformanceApiINTEL = auto_cast GetInstanceProcAddr(instance, "vkInitializePerformanceApiINTEL") + InvalidateMappedMemoryRanges = auto_cast GetInstanceProcAddr(instance, "vkInvalidateMappedMemoryRanges") + MapMemory = auto_cast GetInstanceProcAddr(instance, "vkMapMemory") + MergePipelineCaches = auto_cast GetInstanceProcAddr(instance, "vkMergePipelineCaches") + MergeValidationCachesEXT = auto_cast GetInstanceProcAddr(instance, "vkMergeValidationCachesEXT") + QueueBeginDebugUtilsLabelEXT = auto_cast GetInstanceProcAddr(instance, "vkQueueBeginDebugUtilsLabelEXT") + QueueBindSparse = auto_cast GetInstanceProcAddr(instance, "vkQueueBindSparse") + QueueEndDebugUtilsLabelEXT = auto_cast GetInstanceProcAddr(instance, "vkQueueEndDebugUtilsLabelEXT") + QueueInsertDebugUtilsLabelEXT = auto_cast GetInstanceProcAddr(instance, "vkQueueInsertDebugUtilsLabelEXT") + QueuePresentKHR = auto_cast GetInstanceProcAddr(instance, "vkQueuePresentKHR") + QueueSetPerformanceConfigurationINTEL = auto_cast GetInstanceProcAddr(instance, "vkQueueSetPerformanceConfigurationINTEL") + QueueSubmit = auto_cast GetInstanceProcAddr(instance, "vkQueueSubmit") + QueueSubmit2KHR = auto_cast GetInstanceProcAddr(instance, "vkQueueSubmit2KHR") + QueueWaitIdle = auto_cast GetInstanceProcAddr(instance, "vkQueueWaitIdle") + RegisterDeviceEventEXT = auto_cast GetInstanceProcAddr(instance, "vkRegisterDeviceEventEXT") + RegisterDisplayEventEXT = auto_cast GetInstanceProcAddr(instance, "vkRegisterDisplayEventEXT") + ReleaseFullScreenExclusiveModeEXT = auto_cast GetInstanceProcAddr(instance, "vkReleaseFullScreenExclusiveModeEXT") + ReleasePerformanceConfigurationINTEL = auto_cast GetInstanceProcAddr(instance, "vkReleasePerformanceConfigurationINTEL") + ReleaseProfilingLockKHR = auto_cast GetInstanceProcAddr(instance, "vkReleaseProfilingLockKHR") + ResetCommandBuffer = auto_cast GetInstanceProcAddr(instance, "vkResetCommandBuffer") + ResetCommandPool = auto_cast GetInstanceProcAddr(instance, "vkResetCommandPool") + ResetDescriptorPool = auto_cast GetInstanceProcAddr(instance, "vkResetDescriptorPool") + ResetEvent = auto_cast GetInstanceProcAddr(instance, "vkResetEvent") + ResetFences = auto_cast GetInstanceProcAddr(instance, "vkResetFences") + ResetQueryPool = auto_cast GetInstanceProcAddr(instance, "vkResetQueryPool") + ResetQueryPoolEXT = auto_cast GetInstanceProcAddr(instance, "vkResetQueryPoolEXT") + SetDebugUtilsObjectNameEXT = auto_cast GetInstanceProcAddr(instance, "vkSetDebugUtilsObjectNameEXT") + SetDebugUtilsObjectTagEXT = auto_cast GetInstanceProcAddr(instance, "vkSetDebugUtilsObjectTagEXT") + SetDeviceMemoryPriorityEXT = auto_cast GetInstanceProcAddr(instance, "vkSetDeviceMemoryPriorityEXT") + SetEvent = auto_cast GetInstanceProcAddr(instance, "vkSetEvent") + SetHdrMetadataEXT = auto_cast GetInstanceProcAddr(instance, "vkSetHdrMetadataEXT") + SetLocalDimmingAMD = auto_cast GetInstanceProcAddr(instance, "vkSetLocalDimmingAMD") + SetPrivateDataEXT = auto_cast GetInstanceProcAddr(instance, "vkSetPrivateDataEXT") + SignalSemaphore = auto_cast GetInstanceProcAddr(instance, "vkSignalSemaphore") + SignalSemaphoreKHR = auto_cast GetInstanceProcAddr(instance, "vkSignalSemaphoreKHR") + TrimCommandPool = auto_cast GetInstanceProcAddr(instance, "vkTrimCommandPool") + TrimCommandPoolKHR = auto_cast GetInstanceProcAddr(instance, "vkTrimCommandPoolKHR") + UninitializePerformanceApiINTEL = auto_cast GetInstanceProcAddr(instance, "vkUninitializePerformanceApiINTEL") + UnmapMemory = auto_cast GetInstanceProcAddr(instance, "vkUnmapMemory") + UpdateDescriptorSetWithTemplate = auto_cast GetInstanceProcAddr(instance, "vkUpdateDescriptorSetWithTemplate") + UpdateDescriptorSetWithTemplateKHR = auto_cast GetInstanceProcAddr(instance, "vkUpdateDescriptorSetWithTemplateKHR") + UpdateDescriptorSets = auto_cast GetInstanceProcAddr(instance, "vkUpdateDescriptorSets") + WaitForFences = auto_cast GetInstanceProcAddr(instance, "vkWaitForFences") + WaitForPresentKHR = auto_cast GetInstanceProcAddr(instance, "vkWaitForPresentKHR") + WaitSemaphores = auto_cast GetInstanceProcAddr(instance, "vkWaitSemaphores") + WaitSemaphoresKHR = auto_cast GetInstanceProcAddr(instance, "vkWaitSemaphoresKHR") + WriteAccelerationStructuresPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkWriteAccelerationStructuresPropertiesKHR") +} + +load_proc_addresses_global :: proc(vk_get_instance_proc_addr: rawptr) { + GetInstanceProcAddr = auto_cast vk_get_instance_proc_addr + + CreateInstance = auto_cast GetInstanceProcAddr(nil, "vkCreateInstance") + DebugUtilsMessengerCallbackEXT = auto_cast GetInstanceProcAddr(nil, "vkDebugUtilsMessengerCallbackEXT") + DeviceMemoryReportCallbackEXT = auto_cast GetInstanceProcAddr(nil, "vkDeviceMemoryReportCallbackEXT") + EnumerateInstanceExtensionProperties = auto_cast GetInstanceProcAddr(nil, "vkEnumerateInstanceExtensionProperties") + EnumerateInstanceLayerProperties = auto_cast GetInstanceProcAddr(nil, "vkEnumerateInstanceLayerProperties") + EnumerateInstanceVersion = auto_cast GetInstanceProcAddr(nil, "vkEnumerateInstanceVersion") +} + +load_proc_addresses :: proc{ + load_proc_addresses_global, + load_proc_addresses_instance, + load_proc_addresses_device, + load_proc_addresses_device_vtable, + load_proc_addresses_custom, +} From 1cd89b2da36134fc43e0cc2fe25a1dc9bfb9932a Mon Sep 17 00:00:00 2001 From: kstrb <(none)> Date: Sat, 5 Mar 2022 17:28:34 +0100 Subject: [PATCH 48/74] Linux: allow 'foreign import' of object files --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index f8a3e6f85..8db3a09ec 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -406,8 +406,8 @@ i32 linker_stage(lbGenerator *gen) { // available at runtime wherever the executable is run, so we make require those to be // local to the executable (unless the system collection is used, in which case we search // the system library paths for the library file). - if (string_ends_with(lib, str_lit(".a"))) { - // static libs, absolute full path relative to the file in which the lib was imported from + if (string_ends_with(lib, str_lit(".a")) || string_ends_with(lib, str_lit(".o"))) { + // static libs and object files, absolute full path relative to the file in which the lib was imported from lib_str = gb_string_append_fmt(lib_str, " -l:\"%.*s\" ", LIT(lib)); } else if (string_ends_with(lib, str_lit(".so"))) { // dynamic lib, relative path to executable From bff3426d254bf728b330c6f93fac97339cc41c67 Mon Sep 17 00:00:00 2001 From: Andrea Piseri Date: Sun, 6 Mar 2022 10:21:46 +0100 Subject: [PATCH 49/74] Fix leak in `core:container/bit_array` calling `clear` on a `bit_array` no longer leaks the previous allocation, instead it sets all bits to `false` preserving the same backing dynamic array. --- core/container/bit_array/bit_array.odin | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/container/bit_array/bit_array.odin b/core/container/bit_array/bit_array.odin index 5eebe1bcb..0016ca105 100644 --- a/core/container/bit_array/bit_array.odin +++ b/core/container/bit_array/bit_array.odin @@ -1,6 +1,7 @@ package dynamic_bit_array import "core:intrinsics" +import "core:mem" /* Note that these constants are dependent on the backing being a u64. @@ -206,7 +207,7 @@ create :: proc(max_index: int, min_index := 0, allocator := context.allocator) - */ clear :: proc(ba: ^Bit_Array) { if ba == nil { return } - ba.bits = {} + mem.zero_slice(ba.bits[:]) } /* From ce057ff755d2fe852cb83e4025686d9efd3053d7 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 6 Mar 2022 12:29:17 +0100 Subject: [PATCH 50/74] [bit_array] Really fix the leak. --- core/container/bit_array/bit_array.odin | 26 ++++++++++++++----------- core/container/bit_array/doc.odin | 13 +++++++------ 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/core/container/bit_array/bit_array.odin b/core/container/bit_array/bit_array.odin index 0016ca105..98ef4b542 100644 --- a/core/container/bit_array/bit_array.odin +++ b/core/container/bit_array/bit_array.odin @@ -16,15 +16,16 @@ INDEX_MASK :: 63 NUM_BITS :: 64 Bit_Array :: struct { - bits: [dynamic]u64, - bias: int, - max_index: int, + bits: [dynamic]u64, + bias: int, + max_index: int, + free_pointer: bool, } Bit_Array_Iterator :: struct { - array: ^Bit_Array, + array: ^Bit_Array, word_idx: int, - bit_idx: uint, + bit_idx: uint, } /* @@ -187,7 +188,7 @@ set :: proc(ba: ^Bit_Array, #any_int index: uint, allocator := context.allocator /* A helper function to create a Bit Array with optional bias, in case your smallest index is non-zero (including negative). */ -create :: proc(max_index: int, min_index := 0, allocator := context.allocator) -> (res: Bit_Array, ok: bool) #optional_ok { +create :: proc(max_index: int, min_index := 0, allocator := context.allocator) -> (res: ^Bit_Array, ok: bool) #optional_ok { context.allocator = allocator size_in_bits := max_index - min_index @@ -195,11 +196,11 @@ create :: proc(max_index: int, min_index := 0, allocator := context.allocator) - legs := size_in_bits >> INDEX_SHIFT - res = Bit_Array{ - bias = min_index, - max_index = max_index, - } - return res, resize_if_needed(&res, legs) + res = new(Bit_Array) + res.bias = min_index + res.max_index = max_index + res.free_pointer = true + return res, resize_if_needed(res, legs) } /* @@ -216,6 +217,9 @@ clear :: proc(ba: ^Bit_Array) { destroy :: proc(ba: ^Bit_Array) { if ba == nil { return } delete(ba.bits) + if ba.free_pointer { // Only free if this Bit_Array was created using `create`, not when on the stack. + free(ba) + } } /* diff --git a/core/container/bit_array/doc.odin b/core/container/bit_array/doc.odin index 91e1362dd..52e252d8a 100644 --- a/core/container/bit_array/doc.odin +++ b/core/container/bit_array/doc.odin @@ -21,6 +21,7 @@ package dynamic_bit_array // returns `false`, `false`, because this Bit Array wasn't created to allow negative indices. was_set, was_retrieved := get(&bits, -1) fmt.println(was_set, was_retrieved) + destroy(&bits) } -- A Bit Array can optionally allow for negative indices, if the mininum value was given during creation: @@ -40,13 +41,13 @@ package dynamic_bit_array using bit_array bits := create(int(max(Foo)), int(min(Foo))) - defer destroy(&bits) + defer destroy(bits) - fmt.printf("Set(Bar): %v\n", set(&bits, Foo.Bar)) - fmt.printf("Get(Bar): %v, %v\n", get(&bits, Foo.Bar)) - fmt.printf("Set(Negative_Test): %v\n", set(&bits, Foo.Negative_Test)) - fmt.printf("Get(Leaves): %v, %v\n", get(&bits, Foo.Leaves)) - fmt.printf("Get(Negative_Test): %v, %v\n", get(&bits, Foo.Negative_Test)) + fmt.printf("Set(Bar): %v\n", set(bits, Foo.Bar)) + fmt.printf("Get(Bar): %v, %v\n", get(bits, Foo.Bar)) + fmt.printf("Set(Negative_Test): %v\n", set(bits, Foo.Negative_Test)) + fmt.printf("Get(Leaves): %v, %v\n", get(bits, Foo.Leaves)) + fmt.printf("Get(Negative_Test): %v, %v\n", get(bits, Foo.Negative_Test)) fmt.printf("Freed.\n") } */ \ No newline at end of file From a6c5143993e503b3892d41b7266aa450c03b8bd6 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 6 Mar 2022 14:46:20 +0100 Subject: [PATCH 51/74] [intrinsics] Add existing `unaligned_load`. --- core/intrinsics/intrinsics.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/intrinsics/intrinsics.odin b/core/intrinsics/intrinsics.odin index 803b04d17..0196786ec 100644 --- a/core/intrinsics/intrinsics.odin +++ b/core/intrinsics/intrinsics.odin @@ -41,6 +41,7 @@ mem_copy_non_overlapping :: proc(dst, src: rawptr, len: int) --- mem_zero :: proc(ptr: rawptr, len: int) --- mem_zero_volatile :: proc(ptr: rawptr, len: int) --- +unaligned_load :: proc(ptr: ^$T) -> T --- fixed_point_mul :: proc(lhs, rhs: $T, #const scale: uint) -> T where type_is_integer(T) --- fixed_point_div :: proc(lhs, rhs: $T, #const scale: uint) -> T where type_is_integer(T) --- From deed20dea6114c6a15bccb83dc53855e560f4565 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sun, 6 Mar 2022 14:53:06 +0100 Subject: [PATCH 52/74] [intrinsics] Add `unaligned_store`. --- core/intrinsics/intrinsics.odin | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/intrinsics/intrinsics.odin b/core/intrinsics/intrinsics.odin index 0196786ec..c3ef787bc 100644 --- a/core/intrinsics/intrinsics.odin +++ b/core/intrinsics/intrinsics.odin @@ -41,7 +41,8 @@ mem_copy_non_overlapping :: proc(dst, src: rawptr, len: int) --- mem_zero :: proc(ptr: rawptr, len: int) --- mem_zero_volatile :: proc(ptr: rawptr, len: int) --- -unaligned_load :: proc(ptr: ^$T) -> T --- +unaligned_load :: proc(src: ^$T) -> T --- +unaligned_store :: proc(dst: ^$T, val: T) -> T --- fixed_point_mul :: proc(lhs, rhs: $T, #const scale: uint) -> T where type_is_integer(T) --- fixed_point_div :: proc(lhs, rhs: $T, #const scale: uint) -> T where type_is_integer(T) --- From 31959b07514e22c2ea9ec34abf781887df885af5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 8 Mar 2022 10:01:44 +0000 Subject: [PATCH 53/74] Correct `cleanpath_from_handle` for `os.fstat` --- core/os/stat_windows.odin | 43 +++++++++------------------------------ 1 file changed, 10 insertions(+), 33 deletions(-) diff --git a/core/os/stat_windows.odin b/core/os/stat_windows.odin index 2d9f98fd4..964625315 100644 --- a/core/os/stat_windows.odin +++ b/core/os/stat_windows.odin @@ -132,26 +132,11 @@ cleanpath_strip_prefix :: proc(buf: []u16) -> []u16 { @(private) cleanpath_from_handle :: proc(fd: Handle) -> (string, Errno) { - if fd == 0 { - return "", ERROR_INVALID_HANDLE + buf, err := cleanpath_from_handle_u16(fd) + if err != 0 { + return "", err } - h := win32.HANDLE(fd) - - MAX_PATH := win32.DWORD(260) + 1 - buf: []u16 - for { - buf = make([]u16, MAX_PATH, context.temp_allocator) - err := win32.GetFinalPathNameByHandleW(h, raw_data(buf), MAX_PATH, 0) - switch Errno(err) { - case ERROR_PATH_NOT_FOUND, ERROR_INVALID_PARAMETER: - return "", Errno(err) - case ERROR_NOT_ENOUGH_MEMORY: - MAX_PATH = MAX_PATH*2 + 1 - continue - } - break - } - return cleanpath_from_buf(buf), ERROR_NONE + return win32.utf16_to_utf8(buf, context.allocator), err } @(private) cleanpath_from_handle_u16 :: proc(fd: Handle) -> ([]u16, Errno) { @@ -160,21 +145,13 @@ cleanpath_from_handle_u16 :: proc(fd: Handle) -> ([]u16, Errno) { } h := win32.HANDLE(fd) - MAX_PATH := win32.DWORD(260) + 1 - buf: []u16 - for { - buf = make([]u16, MAX_PATH, context.temp_allocator) - err := win32.GetFinalPathNameByHandleW(h, raw_data(buf), MAX_PATH, 0) - switch Errno(err) { - case ERROR_PATH_NOT_FOUND, ERROR_INVALID_PARAMETER: - return nil, Errno(err) - case ERROR_NOT_ENOUGH_MEMORY: - MAX_PATH = MAX_PATH*2 + 1 - continue - } - break + n := win32.GetFinalPathNameByHandleW(h, nil, 0, 0) + if n == 0 { + return nil, Errno(win32.GetLastError()) } - return cleanpath_strip_prefix(buf), ERROR_NONE + buf := make([]u16, max(n, win32.DWORD(260))+1, context.temp_allocator) + buf_len := win32.GetFinalPathNameByHandleW(h, raw_data(buf), n, 0) + return buf[:buf_len], ERROR_NONE } @(private) cleanpath_from_buf :: proc(buf: []u16) -> string { From 29e660b16f18df2c3d6781fef5d1baa3faac0c94 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 8 Mar 2022 10:02:40 +0000 Subject: [PATCH 54/74] Add more things to `package slice` min_max any_of(_proc) none_of(_proc) all_of(_proc) count(_proc) --- core/slice/slice.odin | 101 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 96 insertions(+), 5 deletions(-) diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 5fecc76b1..520e3e1e0 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -304,7 +304,7 @@ filter :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator) - return r[:] } -scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U)->V, allocator := context.allocator) -> []V { +scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U) -> V, allocator := context.allocator) -> []V { if len(s) == 0 { return {} } res := make([]V, len(s), allocator) @@ -344,15 +344,106 @@ max :: proc(s: $S/[]$T) -> (res: T, ok: bool) where intrinsics.type_is_ordered(T return } +min_max :: proc(s: $S/[]$T) -> (min, max: T, ok: bool) where intrinsics.type_is_ordered(T) { + if len(s) != 0 { + min, max = s[0], s[0] + ok = true + for v in s[1:] { + min = builtin.min(min, v) + max = builtin.max(max, v) + } + } + return +} -dot_product :: proc(a, b: $S/[]$T) -> T +any_of :: proc(s: $S/[]$T, value: T) -> bool where intrinsics.type_is_comparable(T) { + for v in s { + if v == value { + return true + } + } + return false +} + +none_of :: proc(s: $S/[]$T, value: T) -> bool where intrinsics.type_is_comparable(T) { + for v in s { + if v == value { + return false + } + } + return true +} + +all_of :: proc(s: $S/[]$T, value: T) -> bool where intrinsics.type_is_comparable(T) { + if len(s) == 0 { + return false + } + for v in s { + if v != value { + return false + } + } + return true +} + + +any_of_proc :: proc(s: $S/[]$T, f: proc(T) -> bool) -> bool { + for v in s { + if f(v) { + return true + } + } + return false +} + +none_of_proc :: proc(s: $S/[]$T, f: proc(T) -> bool) -> bool { + for v in s { + if f(v) { + return false + } + } + return true +} + +all_of_proc :: proc(s: $S/[]$T, f: proc(T) -> bool) -> bool { + if len(s) == 0 { + return false + } + for v in s { + if !f(v) { + return false + } + } + return true +} + + +count :: proc(s: $S/[]$T, value: T) -> (n: int) where intrinsics.type_is_comparable(T) { + for v in s { + if v == value { + n += 1 + } + } + return +} + +count_proc :: proc(s: $S/[]$T, f: proc(T) -> bool) -> (n: int) { + for v in s { + if f(v) { + n += 1 + } + } + return +} + + +dot_product :: proc(a, b: $S/[]$T) -> (r: T, ok: bool) where intrinsics.type_is_numeric(T) { if len(a) != len(b) { - panic("slice.dot_product: slices of unequal length") + return } - r: T #no_bounds_check for _, i in a { r += a[i] * b[i] } - return r + return r, true } From 17dab044224c8c464cbbc5840ab1592d59f0a6a0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 8 Mar 2022 11:13:59 +0000 Subject: [PATCH 55/74] Refactor link flag creation for nix systems --- src/main.cpp | 57 ++++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 8db3a09ec..1e1e957cb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -475,34 +475,39 @@ i32 linker_stage(lbGenerator *gen) { } } - result = system_exec_command_line_app("ld-link", - "clang -Wno-unused-command-line-argument %s -o \"%.*s%.*s\" %s " - " %s " - " %.*s " - " %.*s " - " %s " - #if defined(GB_SYSTEM_OSX) - // This sets a requirement of Mountain Lion and up, but the compiler doesn't work without this limit. - // NOTE: If you change this (although this minimum is as low as you can go with Odin working) - // make sure to also change the 'mtriple' param passed to 'opt' - #if defined(GB_CPU_ARM) - " -mmacosx-version-min=12.0.0 " - #else - " -mmacosx-version-min=10.8.0 " - #endif - // This points the linker to where the entry point is - " -e _main " - #endif - , object_files, LIT(output_base), LIT(output_ext), - #if defined(GB_SYSTEM_OSX) - "-lSystem -lm -Wl,-syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -L/usr/local/lib", + gbString platform_lib_str = gb_string_make(heap_allocator(), ""); + defer (gb_string_free(platform_lib_str)); + #if defined(GB_SYSTEM_OSX) + platform_lib_str = gb_string_appendc(platform_lib_str, "-lSystem -lm -Wl,-syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -L/usr/local/lib"); + #else + platform_lib_str = gb_string_appendc(platform_lib_str, "-lc -lm"); + #endif + + #if defined(GB_SYSTEM_OSX) + // This sets a requirement of Mountain Lion and up, but the compiler doesn't work without this limit. + // NOTE: If you change this (although this minimum is as low as you can go with Odin working) + // make sure to also change the 'mtriple' param passed to 'opt' + #if defined(GB_CPU_ARM) + link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=12.0.0 "); #else - "-lc -lm", + link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=10.8.0 "); #endif - lib_str, - LIT(build_context.link_flags), - LIT(build_context.extra_linker_flags), - link_settings); + // This points the linker to where the entry point is + link_settings = gb_string_appendc(link_settings, " -e _main "); + #endif + + gbString link_command_line = gb_string_make(heap_allocator(), "clang -Wno-unused-command-line-argument "); + defer (gb_string_free(link_command_line)); + + link_command_line = gb_string_appendc(link_command_line, object_files); + link_command_line = gb_string_append_fmt(link_command_line, " -o \"%.*s%.*s\" ", LIT(output_base), LIT(output_ext)); + link_command_line = gb_string_append_fmt(link_command_line, " %s ", platform_lib_str); + link_command_line = gb_string_append_fmt(link_command_line, " %s ", lib_str); + link_command_line = gb_string_append_fmt(link_command_line, " %.*s ", LIT(build_context.link_flags)); + link_command_line = gb_string_append_fmt(link_command_line, " %.*s ", LIT(build_context.extra_linker_flags)); + link_command_line = gb_string_append_fmt(link_command_line, " %s ", link_settings); + + result = system_exec_command_line_app("ld-link", link_command_line); if (result) { return result; From 6d7217f37a241c688e4734d7b8f6904299cadd2b Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 15:40:00 +0100 Subject: [PATCH 56/74] [varint] Add LEB128 decoding + tests Also make tests in general less spammy: Don't print [PASS] for each successful test, only report failures and progress. --- core/encoding/varint/leb128.odin | 67 + tests/core/Makefile | 8 +- tests/core/build.bat | 3 +- tests/core/compress/test_core_compress.odin | 4 +- tests/core/crypto/test_core_crypto.odin | 1766 ++++++++--------- tests/core/crypto_hash | Bin 0 -> 621648 bytes .../encoding/{ => json}/test_core_json.odin | 36 +- .../encoding/varint/test_core_varint.odin | 81 + tests/core/hash/test_core_hash.odin | 4 +- tests/core/image/test_core_image.odin | 30 +- .../core/math/noise/test_core_math_noise.odin | 30 +- tests/core/odin/test_parser.odin | 45 +- tests/core/strings/test_core_strings.odin | 66 +- 13 files changed, 1138 insertions(+), 1002 deletions(-) create mode 100644 core/encoding/varint/leb128.odin create mode 100644 tests/core/crypto_hash rename tests/core/encoding/{ => json}/test_core_json.odin (64%) create mode 100644 tests/core/encoding/varint/test_core_varint.odin diff --git a/core/encoding/varint/leb128.odin b/core/encoding/varint/leb128.odin new file mode 100644 index 000000000..0c314b3f8 --- /dev/null +++ b/core/encoding/varint/leb128.odin @@ -0,0 +1,67 @@ +/* + Copyright 2022 Jeroen van Rijn . + Made available under Odin's BSD-3 license. + + List of contributors: + Jeroen van Rijn: Initial implementation. +*/ + +// package varint implements variable length integer encoding and decoding +// using the LEB128 format as used by DWARF debug and other file formats +package varint + +// Decode a slice of bytes encoding an unsigned LEB128 integer into value and number of bytes used. +// Returns `size` == 0 for an invalid value, empty slice, or a varint > 16 bytes. +// In theory we should use the bigint package. In practice, varints bigger than this indicate a corrupted file. +decode_uleb128 :: proc(buf: []u8) -> (val: u128, size: int) { + more := true + + for v, i in buf { + size = i + 1 + + if size > size_of(u128) { + return + } + + val |= u128(v & 0x7f) << uint(i * 7) + + if v < 128 { + more = false + break + } + } + + // If the buffer runs out before the number ends, return an error. + if more { + return 0, 0 + } + return +} + +// Decode a slice of bytes encoding a signed LEB128 integer into value and number of bytes used. +// Returns `size` == 0 for an invalid value, empty slice, or a varint > 16 bytes. +// In theory we should use the bigint package. In practice, varints bigger than this indicate a corrupted file. +decode_ileb128 :: proc(buf: []u8) -> (val: i128, size: int) { + shift: uint + + if len(buf) == 0 { + return + } + + for v in buf { + size += 1 + if size > size_of(i128) { + return + } + + val |= i128(v & 0x7f) << shift + shift += 7 + + if v < 128 { break } + } + + if buf[size - 1] & 0x40 == 0x40 { + val |= max(i128) << shift + } + return +} \ No newline at end of file diff --git a/tests/core/Makefile b/tests/core/Makefile index 1c2cee6bd..fac5b6203 100644 --- a/tests/core/Makefile +++ b/tests/core/Makefile @@ -1,7 +1,7 @@ ODIN=../../odin PYTHON=$(shell which python3) -all: download_test_assets image_test compress_test strings_test hash_test crypto_test noise_test +all: download_test_assets image_test compress_test strings_test hash_test crypto_test noise_test encoding_test download_test_assets: $(PYTHON) download_assets.py @@ -22,4 +22,8 @@ crypto_test: $(ODIN) run crypto -out=crypto_hash -o:speed -no-bounds-check noise_test: - $(ODIN) run math/noise -out=test_noise \ No newline at end of file + $(ODIN) run math/noise -out=test_noise + +encoding_test: + $(ODIN) run encoding/json -out=test_json + $(ODIN) run encoding/varint -out=test_varint \ No newline at end of file diff --git a/tests/core/build.bat b/tests/core/build.bat index 6af39e688..0227ac6bb 100644 --- a/tests/core/build.bat +++ b/tests/core/build.bat @@ -35,7 +35,8 @@ echo --- echo --- echo Running core:encoding tests echo --- -%PATH_TO_ODIN% run encoding %COMMON% +%PATH_TO_ODIN% run encoding/json %COMMON% +%PATH_TO_ODIN% run encoding/varint %COMMON% echo --- echo Running core:math/noise tests diff --git a/tests/core/compress/test_core_compress.odin b/tests/core/compress/test_core_compress.odin index 73c69445a..51952a568 100644 --- a/tests/core/compress/test_core_compress.odin +++ b/tests/core/compress/test_core_compress.odin @@ -30,14 +30,12 @@ when ODIN_TEST { log :: testing.log } else { expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) TEST_count += 1 if !condition { TEST_fail += 1 - fmt.println(message) + fmt.printf("[%v] %v\n", loc, message) return } - fmt.println(" PASS") } log :: proc(t: ^testing.T, v: any, loc := #caller_location) { fmt.printf("[%v] ", loc) diff --git a/tests/core/crypto/test_core_crypto.odin b/tests/core/crypto/test_core_crypto.odin index f2e5b48d9..636632d71 100644 --- a/tests/core/crypto/test_core_crypto.odin +++ b/tests/core/crypto/test_core_crypto.odin @@ -1,15 +1,15 @@ package test_core_crypto /* - Copyright 2021 zhibog - Made available under the BSD-3 license. + Copyright 2021 zhibog + Made available under the BSD-3 license. - List of contributors: - zhibog, dotbmp: Initial implementation. - Jeroen van Rijn: Test runner setup. + List of contributors: + zhibog, dotbmp: Initial implementation. + Jeroen van Rijn: Test runner setup. - Tests for the hashing algorithms within the crypto library. - Where possible, the official test vectors are used to validate the implementation. + Tests for the hashing algorithms within the crypto library. + Where possible, the official test vectors are used to validate the implementation. */ import "core:testing" @@ -43,1110 +43,1108 @@ TEST_count := 0 TEST_fail := 0 when ODIN_TEST { - expect :: testing.expect - log :: testing.log + expect :: testing.expect + log :: testing.log } else { - expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) - TEST_count += 1 - if !condition { - TEST_fail += 1 - fmt.println(message) - return - } - fmt.println(" PASS") - } - log :: proc(t: ^testing.T, v: any, loc := #caller_location) { - fmt.printf("[%v] ", loc) - fmt.printf("log: %v\n", v) - } + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } } main :: proc() { - t := testing.T{} - test_md2(&t) - test_md4(&t) - test_md5(&t) - test_sha1(&t) - test_sha224(&t) - test_sha256(&t) - test_sha384(&t) - test_sha512(&t) - test_sha3_224(&t) - test_sha3_256(&t) - test_sha3_384(&t) - test_sha3_512(&t) - test_shake_128(&t) - test_shake_256(&t) - test_keccak_224(&t) - test_keccak_256(&t) - test_keccak_384(&t) - test_keccak_512(&t) - test_whirlpool(&t) - test_gost(&t) - test_streebog_256(&t) - test_streebog_512(&t) - test_blake_224(&t) - test_blake_256(&t) - test_blake_384(&t) - test_blake_512(&t) - test_blake2b(&t) - test_blake2s(&t) - test_ripemd_128(&t) - test_ripemd_160(&t) - test_ripemd_256(&t) - test_ripemd_320(&t) - test_tiger_128(&t) - test_tiger_160(&t) - test_tiger_192(&t) - test_tiger2_128(&t) - test_tiger2_160(&t) - test_tiger2_192(&t) - test_sm3(&t) - test_jh_224(&t) - test_jh_256(&t) - test_jh_384(&t) - test_jh_512(&t) - test_groestl_224(&t) - test_groestl_256(&t) - test_groestl_384(&t) - test_groestl_512(&t) - test_haval_128(&t) - test_haval_160(&t) - test_haval_192(&t) - test_haval_224(&t) - test_haval_256(&t) - test_siphash_2_4(&t) + t := testing.T{} + test_md2(&t) + test_md4(&t) + test_md5(&t) + test_sha1(&t) + test_sha224(&t) + test_sha256(&t) + test_sha384(&t) + test_sha512(&t) + test_sha3_224(&t) + test_sha3_256(&t) + test_sha3_384(&t) + test_sha3_512(&t) + test_shake_128(&t) + test_shake_256(&t) + test_keccak_224(&t) + test_keccak_256(&t) + test_keccak_384(&t) + test_keccak_512(&t) + test_whirlpool(&t) + test_gost(&t) + test_streebog_256(&t) + test_streebog_512(&t) + test_blake_224(&t) + test_blake_256(&t) + test_blake_384(&t) + test_blake_512(&t) + test_blake2b(&t) + test_blake2s(&t) + test_ripemd_128(&t) + test_ripemd_160(&t) + test_ripemd_256(&t) + test_ripemd_320(&t) + test_tiger_128(&t) + test_tiger_160(&t) + test_tiger_192(&t) + test_tiger2_128(&t) + test_tiger2_160(&t) + test_tiger2_192(&t) + test_sm3(&t) + test_jh_224(&t) + test_jh_256(&t) + test_jh_384(&t) + test_jh_512(&t) + test_groestl_224(&t) + test_groestl_256(&t) + test_groestl_384(&t) + test_groestl_512(&t) + test_haval_128(&t) + test_haval_160(&t) + test_haval_192(&t) + test_haval_224(&t) + test_haval_256(&t) + test_siphash_2_4(&t) - // "modern" crypto tests - test_chacha20(&t) - test_poly1305(&t) - test_chacha20poly1305(&t) - test_x25519(&t) - test_rand_bytes(&t) + // "modern" crypto tests + test_chacha20(&t) + test_poly1305(&t) + test_chacha20poly1305(&t) + test_x25519(&t) + test_rand_bytes(&t) - bench_modern(&t) + bench_modern(&t) - fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) - if TEST_fail > 0 { - os.exit(1) - } + fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } TestHash :: struct { - hash: string, - str: string, + hash: string, + str: string, } hex_string :: proc(bytes: []byte, allocator := context.temp_allocator) -> string { - lut: [16]byte = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'} - buf := make([]byte, len(bytes) * 2, allocator) - for i := 0; i < len(bytes); i += 1 { - buf[i * 2 + 0] = lut[bytes[i] >> 4 & 0xf] - buf[i * 2 + 1] = lut[bytes[i] & 0xf] - } - return string(buf) + lut: [16]byte = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'} + buf := make([]byte, len(bytes) * 2, allocator) + for i := 0; i < len(bytes); i += 1 { + buf[i * 2 + 0] = lut[bytes[i] >> 4 & 0xf] + buf[i * 2 + 1] = lut[bytes[i] & 0xf] + } + return string(buf) } @(test) test_md2 :: proc(t: ^testing.T) { - // Official test vectors from https://datatracker.ietf.org/doc/html/rfc1319 - test_vectors := [?]TestHash { - TestHash{"8350e5a3e24c153df2275c9f80692773", ""}, - TestHash{"32ec01ec4a6dac72c0ab96fb34c0b5d1", "a"}, - TestHash{"da853b0d3f88d99b30283a69e6ded6bb", "abc"}, - TestHash{"ab4f496bfb2a530b219ff33031fe06b0", "message digest"}, - TestHash{"4e8ddff3650292ab5a4108c3aa47940b", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"da33def2a42df13975352846c30338cd", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"d5976f79d83d3a0dc9806c3c66f3efd8", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := md2.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Official test vectors from https://datatracker.ietf.org/doc/html/rfc1319 + test_vectors := [?]TestHash { + TestHash{"8350e5a3e24c153df2275c9f80692773", ""}, + TestHash{"32ec01ec4a6dac72c0ab96fb34c0b5d1", "a"}, + TestHash{"da853b0d3f88d99b30283a69e6ded6bb", "abc"}, + TestHash{"ab4f496bfb2a530b219ff33031fe06b0", "message digest"}, + TestHash{"4e8ddff3650292ab5a4108c3aa47940b", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"da33def2a42df13975352846c30338cd", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"d5976f79d83d3a0dc9806c3c66f3efd8", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := md2.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_md4 :: proc(t: ^testing.T) { - // Official test vectors from https://datatracker.ietf.org/doc/html/rfc1320 - test_vectors := [?]TestHash { - TestHash{"31d6cfe0d16ae931b73c59d7e0c089c0", ""}, - TestHash{"bde52cb31de33e46245e05fbdbd6fb24", "a"}, - TestHash{"a448017aaf21d8525fc10ae87aa6729d", "abc"}, - TestHash{"d9130a8164549fe818874806e1c7014b", "message digest"}, - TestHash{"d79e1c308aa5bbcdeea8ed63df412da9", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"043f8582f241db351ce627e153e7f0e4", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"e33b4ddc9c38f2199c3e7b164fcc0536", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := md4.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Official test vectors from https://datatracker.ietf.org/doc/html/rfc1320 + test_vectors := [?]TestHash { + TestHash{"31d6cfe0d16ae931b73c59d7e0c089c0", ""}, + TestHash{"bde52cb31de33e46245e05fbdbd6fb24", "a"}, + TestHash{"a448017aaf21d8525fc10ae87aa6729d", "abc"}, + TestHash{"d9130a8164549fe818874806e1c7014b", "message digest"}, + TestHash{"d79e1c308aa5bbcdeea8ed63df412da9", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"043f8582f241db351ce627e153e7f0e4", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"e33b4ddc9c38f2199c3e7b164fcc0536", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := md4.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_md5 :: proc(t: ^testing.T) { - // Official test vectors from https://datatracker.ietf.org/doc/html/rfc1321 - test_vectors := [?]TestHash { - TestHash{"d41d8cd98f00b204e9800998ecf8427e", ""}, - TestHash{"0cc175b9c0f1b6a831c399e269772661", "a"}, - TestHash{"900150983cd24fb0d6963f7d28e17f72", "abc"}, - TestHash{"f96b697d7cb7938d525a2f31aaf161d0", "message digest"}, - TestHash{"c3fcd3d76192e4007dfb496cca67e13b", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"d174ab98d277d9f5a5611c2c9f419d9f", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"57edf4a22be3c955ac49da2e2107b67a", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := md5.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Official test vectors from https://datatracker.ietf.org/doc/html/rfc1321 + test_vectors := [?]TestHash { + TestHash{"d41d8cd98f00b204e9800998ecf8427e", ""}, + TestHash{"0cc175b9c0f1b6a831c399e269772661", "a"}, + TestHash{"900150983cd24fb0d6963f7d28e17f72", "abc"}, + TestHash{"f96b697d7cb7938d525a2f31aaf161d0", "message digest"}, + TestHash{"c3fcd3d76192e4007dfb496cca67e13b", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"d174ab98d277d9f5a5611c2c9f419d9f", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"57edf4a22be3c955ac49da2e2107b67a", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := md5.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha1 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"da39a3ee5e6b4b0d3255bfef95601890afd80709", ""}, - TestHash{"a9993e364706816aba3e25717850c26c9cd0d89d", "abc"}, - TestHash{"f9537c23893d2014f365adf8ffe33b8eb0297ed1", "abcdbcdecdefdefgefghfghighijhi"}, - TestHash{"346fb528a24b48f563cb061470bcfd23740427ad", "jkijkljklmklmnlmnomnopnopq"}, - TestHash{"86f7e437faa5a7fce15d1ddcb9eaeaea377667b8", "a"}, - TestHash{"c729c8996ee0a6f74f4f3248e8957edf704fb624", "01234567012345670123456701234567"}, - TestHash{"84983e441c3bd26ebaae4aa1f95129e5e54670f1", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"a49b2446a02c645bf419f995b67091253a04a259", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha1.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"da39a3ee5e6b4b0d3255bfef95601890afd80709", ""}, + TestHash{"a9993e364706816aba3e25717850c26c9cd0d89d", "abc"}, + TestHash{"f9537c23893d2014f365adf8ffe33b8eb0297ed1", "abcdbcdecdefdefgefghfghighijhi"}, + TestHash{"346fb528a24b48f563cb061470bcfd23740427ad", "jkijkljklmklmnlmnomnopnopq"}, + TestHash{"86f7e437faa5a7fce15d1ddcb9eaeaea377667b8", "a"}, + TestHash{"c729c8996ee0a6f74f4f3248e8957edf704fb624", "01234567012345670123456701234567"}, + TestHash{"84983e441c3bd26ebaae4aa1f95129e5e54670f1", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"a49b2446a02c645bf419f995b67091253a04a259", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha1.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha224 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f", ""}, - TestHash{"23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7", "abc"}, - TestHash{"75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"c97ca9a559850ce97a04a96def6d99a9e0e0e2ab14e6b8df265fc0b3", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha2.hash_224(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f", ""}, + TestHash{"23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7", "abc"}, + TestHash{"75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"c97ca9a559850ce97a04a96def6d99a9e0e0e2ab14e6b8df265fc0b3", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha2.hash_224(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha256 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ""}, - TestHash{"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", "abc"}, - TestHash{"248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha2.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ""}, + TestHash{"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", "abc"}, + TestHash{"248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha2.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha384 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b", ""}, - TestHash{"cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7", "abc"}, - TestHash{"3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha2.hash_384(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b", ""}, + TestHash{"cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7", "abc"}, + TestHash{"3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha2.hash_384(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha512 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", ""}, - TestHash{"ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f", "abc"}, - TestHash{"204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha2.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", ""}, + TestHash{"ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f", "abc"}, + TestHash{"204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha2.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha3_224 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7", ""}, - TestHash{"e642824c3f8cf24ad09234ee7d3c766fc9a3a5168d0c94ad73b46fdf", "abc"}, - TestHash{"10241ac5187380bd501192e4e56b5280908727dd8fe0d10d4e5ad91e", "abcdbcdecdefdefgefghfghighijhi"}, - TestHash{"fd645fe07d814c397e85e85f92fe58b949f55efa4d3468b2468da45a", "jkijkljklmklmnlmnomnopnopq"}, - TestHash{"9e86ff69557ca95f405f081269685b38e3a819b309ee942f482b6a8b", "a"}, - TestHash{"6961f694b2ff3ed6f0c830d2c66da0c5e7ca9445f7c0dca679171112", "01234567012345670123456701234567"}, - TestHash{"8a24108b154ada21c9fd5574494479ba5c7e7ab76ef264ead0fcce33", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"543e6868e1666c1a643630df77367ae5a62a85070a51c14cbf665cbc", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha3.hash_224(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7", ""}, + TestHash{"e642824c3f8cf24ad09234ee7d3c766fc9a3a5168d0c94ad73b46fdf", "abc"}, + TestHash{"10241ac5187380bd501192e4e56b5280908727dd8fe0d10d4e5ad91e", "abcdbcdecdefdefgefghfghighijhi"}, + TestHash{"fd645fe07d814c397e85e85f92fe58b949f55efa4d3468b2468da45a", "jkijkljklmklmnlmnomnopnopq"}, + TestHash{"9e86ff69557ca95f405f081269685b38e3a819b309ee942f482b6a8b", "a"}, + TestHash{"6961f694b2ff3ed6f0c830d2c66da0c5e7ca9445f7c0dca679171112", "01234567012345670123456701234567"}, + TestHash{"8a24108b154ada21c9fd5574494479ba5c7e7ab76ef264ead0fcce33", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"543e6868e1666c1a643630df77367ae5a62a85070a51c14cbf665cbc", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha3.hash_224(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha3_256 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a", ""}, - TestHash{"3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532", "abc"}, - TestHash{"565ada1ced21278cfaffdde00dea0107964121ac25e4e978abc59412be74550a", "abcdbcdecdefdefgefghfghighijhi"}, - TestHash{"8cc1709d520f495ce972ece48b0d2e1f74ec80d53bc5c47457142158fae15d98", "jkijkljklmklmnlmnomnopnopq"}, - TestHash{"80084bf2fba02475726feb2cab2d8215eab14bc6bdd8bfb2c8151257032ecd8b", "a"}, - TestHash{"e4786de5f88f7d374b7288f225ea9f2f7654da200bab5d417e1fb52d49202767", "01234567012345670123456701234567"}, - TestHash{"41c0dba2a9d6240849100376a8235e2c82e1b9998a999e21db32dd97496d3376", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"916f6061fe879741ca6469b43971dfdb28b1a32dc36cb3254e812be27aad1d18", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha3.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a", ""}, + TestHash{"3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532", "abc"}, + TestHash{"565ada1ced21278cfaffdde00dea0107964121ac25e4e978abc59412be74550a", "abcdbcdecdefdefgefghfghighijhi"}, + TestHash{"8cc1709d520f495ce972ece48b0d2e1f74ec80d53bc5c47457142158fae15d98", "jkijkljklmklmnlmnomnopnopq"}, + TestHash{"80084bf2fba02475726feb2cab2d8215eab14bc6bdd8bfb2c8151257032ecd8b", "a"}, + TestHash{"e4786de5f88f7d374b7288f225ea9f2f7654da200bab5d417e1fb52d49202767", "01234567012345670123456701234567"}, + TestHash{"41c0dba2a9d6240849100376a8235e2c82e1b9998a999e21db32dd97496d3376", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"916f6061fe879741ca6469b43971dfdb28b1a32dc36cb3254e812be27aad1d18", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha3.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha3_384 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004", ""}, - TestHash{"ec01498288516fc926459f58e2c6ad8df9b473cb0fc08c2596da7cf0e49be4b298d88cea927ac7f539f1edf228376d25", "abc"}, - TestHash{"9aa92dbb716ebb573def0d5e3cdd28d6add38ada310b602b8916e690a3257b7144e5ddd3d0dbbc559c48480d34d57a9a", "abcdbcdecdefdefgefghfghighijhi"}, - TestHash{"77c90323d7392bcdee8a3e7f74f19f47b7d1b1a825ac6a2d8d882a72317879cc26597035f1fc24fe65090b125a691282", "jkijkljklmklmnlmnomnopnopq"}, - TestHash{"1815f774f320491b48569efec794d249eeb59aae46d22bf77dafe25c5edc28d7ea44f93ee1234aa88f61c91912a4ccd9", "a"}, - TestHash{"51072590ad4c51b27ff8265590d74f92de7cc55284168e414ca960087c693285b08a283c6b19d77632994cb9eb93f1be", "01234567012345670123456701234567"}, - TestHash{"991c665755eb3a4b6bbdfb75c78a492e8c56a22c5c4d7e429bfdbc32b9d4ad5aa04a1f076e62fea19eef51acd0657c22", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"79407d3b5916b59c3e30b09822974791c313fb9ecc849e406f23592d04f625dc8c709b98b43b3852b337216179aa7fc7", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha3.hash_384(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004", ""}, + TestHash{"ec01498288516fc926459f58e2c6ad8df9b473cb0fc08c2596da7cf0e49be4b298d88cea927ac7f539f1edf228376d25", "abc"}, + TestHash{"9aa92dbb716ebb573def0d5e3cdd28d6add38ada310b602b8916e690a3257b7144e5ddd3d0dbbc559c48480d34d57a9a", "abcdbcdecdefdefgefghfghighijhi"}, + TestHash{"77c90323d7392bcdee8a3e7f74f19f47b7d1b1a825ac6a2d8d882a72317879cc26597035f1fc24fe65090b125a691282", "jkijkljklmklmnlmnomnopnopq"}, + TestHash{"1815f774f320491b48569efec794d249eeb59aae46d22bf77dafe25c5edc28d7ea44f93ee1234aa88f61c91912a4ccd9", "a"}, + TestHash{"51072590ad4c51b27ff8265590d74f92de7cc55284168e414ca960087c693285b08a283c6b19d77632994cb9eb93f1be", "01234567012345670123456701234567"}, + TestHash{"991c665755eb3a4b6bbdfb75c78a492e8c56a22c5c4d7e429bfdbc32b9d4ad5aa04a1f076e62fea19eef51acd0657c22", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"79407d3b5916b59c3e30b09822974791c313fb9ecc849e406f23592d04f625dc8c709b98b43b3852b337216179aa7fc7", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha3.hash_384(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sha3_512 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26", ""}, - TestHash{"b751850b1a57168a5693cd924b6b096e08f621827444f70d884f5d0240d2712e10e116e9192af3c91a7ec57647e3934057340b4cf408d5a56592f8274eec53f0", "abc"}, - TestHash{"9f9a327944a35988d67effc4fa748b3c07744f736ac70b479d8e12a3d10d6884d00a7ef593690305462e9e9030a67c51636fd346fd8fa0ee28a5ac2aee103d2e", "abcdbcdecdefdefgefghfghighijhi"}, - TestHash{"dbb124a0deda966eb4d199d0844fa0beb0770ea1ccddabcd335a7939a931ac6fb4fa6aebc6573f462ced2e4e7178277803be0d24d8bc2864626d9603109b7891", "jkijkljklmklmnlmnomnopnopq"}, - TestHash{"697f2d856172cb8309d6b8b97dac4de344b549d4dee61edfb4962d8698b7fa803f4f93ff24393586e28b5b957ac3d1d369420ce53332712f997bd336d09ab02a", "a"}, - TestHash{"5679e353bc8eeea3e801ca60448b249bcfd3ac4a6c3abe429a807bcbd4c9cd12da87a5a9dc74fde64c0d44718632cae966b078397c6f9ec155c6a238f2347cf1", "01234567012345670123456701234567"}, - TestHash{"04a371e84ecfb5b8b77cb48610fca8182dd457ce6f326a0fd3d7ec2f1e91636dee691fbe0c985302ba1b0d8dc78c086346b533b49c030d99a27daf1139d6e75e", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"afebb2ef542e6579c50cad06d2e578f9f8dd6881d7dc824d26360feebf18a4fa73e3261122948efcfd492e74e82e2189ed0fb440d187f382270cb455f21dd185", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, - } - for v, _ in test_vectors { - computed := sha3.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26", ""}, + TestHash{"b751850b1a57168a5693cd924b6b096e08f621827444f70d884f5d0240d2712e10e116e9192af3c91a7ec57647e3934057340b4cf408d5a56592f8274eec53f0", "abc"}, + TestHash{"9f9a327944a35988d67effc4fa748b3c07744f736ac70b479d8e12a3d10d6884d00a7ef593690305462e9e9030a67c51636fd346fd8fa0ee28a5ac2aee103d2e", "abcdbcdecdefdefgefghfghighijhi"}, + TestHash{"dbb124a0deda966eb4d199d0844fa0beb0770ea1ccddabcd335a7939a931ac6fb4fa6aebc6573f462ced2e4e7178277803be0d24d8bc2864626d9603109b7891", "jkijkljklmklmnlmnomnopnopq"}, + TestHash{"697f2d856172cb8309d6b8b97dac4de344b549d4dee61edfb4962d8698b7fa803f4f93ff24393586e28b5b957ac3d1d369420ce53332712f997bd336d09ab02a", "a"}, + TestHash{"5679e353bc8eeea3e801ca60448b249bcfd3ac4a6c3abe429a807bcbd4c9cd12da87a5a9dc74fde64c0d44718632cae966b078397c6f9ec155c6a238f2347cf1", "01234567012345670123456701234567"}, + TestHash{"04a371e84ecfb5b8b77cb48610fca8182dd457ce6f326a0fd3d7ec2f1e91636dee691fbe0c985302ba1b0d8dc78c086346b533b49c030d99a27daf1139d6e75e", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"afebb2ef542e6579c50cad06d2e578f9f8dd6881d7dc824d26360feebf18a4fa73e3261122948efcfd492e74e82e2189ed0fb440d187f382270cb455f21dd185", "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"}, + } + for v, _ in test_vectors { + computed := sha3.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_shake_128 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"7f9c2ba4e88f827d616045507605853e", ""}, - TestHash{"f4202e3c5852f9182a0430fd8144f0a7", "The quick brown fox jumps over the lazy dog"}, - TestHash{"853f4538be0db9621a6cea659a06c110", "The quick brown fox jumps over the lazy dof"}, - } - for v, _ in test_vectors { - computed := shake.hash_128(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"7f9c2ba4e88f827d616045507605853e", ""}, + TestHash{"f4202e3c5852f9182a0430fd8144f0a7", "The quick brown fox jumps over the lazy dog"}, + TestHash{"853f4538be0db9621a6cea659a06c110", "The quick brown fox jumps over the lazy dof"}, + } + for v, _ in test_vectors { + computed := shake.hash_128(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_shake_256 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762f", ""}, - TestHash{"2f671343d9b2e1604dc9dcf0753e5fe15c7c64a0d283cbbf722d411a0e36f6ca", "The quick brown fox jumps over the lazy dog"}, - TestHash{"46b1ebb2e142c38b9ac9081bef72877fe4723959640fa57119b366ce6899d401", "The quick brown fox jumps over the lazy dof"}, - } - for v, _ in test_vectors { - computed := shake.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762f", ""}, + TestHash{"2f671343d9b2e1604dc9dcf0753e5fe15c7c64a0d283cbbf722d411a0e36f6ca", "The quick brown fox jumps over the lazy dog"}, + TestHash{"46b1ebb2e142c38b9ac9081bef72877fe4723959640fa57119b366ce6899d401", "The quick brown fox jumps over the lazy dof"}, + } + for v, _ in test_vectors { + computed := shake.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_keccak_224 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd", ""}, - TestHash{"c30411768506ebe1c2871b1ee2e87d38df342317300a9b97a95ec6a8", "abc"}, - } - for v, _ in test_vectors { - computed := keccak.hash_224(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd", ""}, + TestHash{"c30411768506ebe1c2871b1ee2e87d38df342317300a9b97a95ec6a8", "abc"}, + } + for v, _ in test_vectors { + computed := keccak.hash_224(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_keccak_256 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", ""}, - TestHash{"4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45", "abc"}, - } - for v, _ in test_vectors { - computed := keccak.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", ""}, + TestHash{"4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45", "abc"}, + } + for v, _ in test_vectors { + computed := keccak.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_keccak_384 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff", ""}, - TestHash{"f7df1165f033337be098e7d288ad6a2f74409d7a60b49c36642218de161b1f99f8c681e4afaf31a34db29fb763e3c28e", "abc"}, - } - for v, _ in test_vectors { - computed := keccak.hash_384(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff", ""}, + TestHash{"f7df1165f033337be098e7d288ad6a2f74409d7a60b49c36642218de161b1f99f8c681e4afaf31a34db29fb763e3c28e", "abc"}, + } + for v, _ in test_vectors { + computed := keccak.hash_384(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_keccak_512 :: proc(t: ^testing.T) { - // Test vectors from - // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf - // https://www.di-mgt.com.au/sha_testvectors.html - test_vectors := [?]TestHash { - TestHash{"0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e", ""}, - TestHash{"18587dc2ea106b9a1563e32b3312421ca164c7f1f07bc922a9c83d77cea3a1e5d0c69910739025372dc14ac9642629379540c17e2a65b19d77aa511a9d00bb96", "abc"}, - } - for v, _ in test_vectors { - computed := keccak.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf + // https://www.di-mgt.com.au/sha_testvectors.html + test_vectors := [?]TestHash { + TestHash{"0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e", ""}, + TestHash{"18587dc2ea106b9a1563e32b3312421ca164c7f1f07bc922a9c83d77cea3a1e5d0c69910739025372dc14ac9642629379540c17e2a65b19d77aa511a9d00bb96", "abc"}, + } + for v, _ in test_vectors { + computed := keccak.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_whirlpool :: proc(t: ^testing.T) { - // Test vectors from - // https://web.archive.org/web/20171129084214/http://www.larc.usp.br/~pbarreto/WhirlpoolPage.html - test_vectors := [?]TestHash { - TestHash{"19fa61d75522a4669b44e39c1d2e1726c530232130d407f89afee0964997f7a73e83be698b288febcf88e3e03c4f0757ea8964e59b63d93708b138cc42a66eb3", ""}, - TestHash{"8aca2602792aec6f11a67206531fb7d7f0dff59413145e6973c45001d0087b42d11bc645413aeff63a42391a39145a591a92200d560195e53b478584fdae231a", "a"}, - TestHash{"33e24e6cbebf168016942df8a7174048f9cebc45cbd829c3b94b401a498acb11c5abcca7f2a1238aaf534371e87a4e4b19758965d5a35a7cad87cf5517043d97", "ab"}, - TestHash{"4e2448a4c6f486bb16b6562c73b4020bf3043e3a731bce721ae1b303d97e6d4c7181eebdb6c57e277d0e34957114cbd6c797fc9d95d8b582d225292076d4eef5", "abc"}, - TestHash{"bda164f0b930c43a1bacb5df880b205d15ac847add35145bf25d991ae74f0b72b1ac794f8aacda5fcb3c47038c954742b1857b5856519de4d1e54bfa2fa4eac5", "abcd"}, - TestHash{"5d745e26ccb20fe655d39c9e7f69455758fbae541cb892b3581e4869244ab35b4fd6078f5d28b1f1a217452a67d9801033d92724a221255a5e377fe9e9e5f0b2", "abcde"}, - TestHash{"a73e425459567308ba5f9eb2ae23570d0d0575eb1357ecf6ac88d4e0358b0ac3ea2371261f5d4c070211784b525911b9eec0ad968429bb7c7891d341cff4e811", "abcdef"}, - TestHash{"08b388f68fd3eb51906ac3d3c699b8e9c3ac65d7ceb49d2e34f8a482cbc3082bc401cead90e85a97b8647c948bf35e448740b79659f3bee42145f0bd653d1f25", "abcdefg"}, - TestHash{"1f1a84d30612820243afe2022712f9dac6d07c4c8bb41b40eacab0184c8d82275da5bcadbb35c7ca1960ff21c90acbae8c14e48d9309e4819027900e882c7ad9", "abcdefgh"}, - TestHash{"11882bc9a31ac1cf1c41dcd9fd6fdd3ccdb9b017fc7f4582680134f314d7bb49af4c71f5a920bc0a6a3c1ff9a00021bf361d9867fe636b0bc1da1552e4237de4", "abcdefghi"}, - TestHash{"717163de24809ffcf7ff6d5aba72b8d67c2129721953c252a4ddfb107614be857cbd76a9d5927de14633d6bdc9ddf335160b919db5c6f12cb2e6549181912eef", "abcdefghij"}, - TestHash{"b97de512e91e3828b40d2b0fdce9ceb3c4a71f9bea8d88e75c4fa854df36725fd2b52eb6544edcacd6f8beddfea403cb55ae31f03ad62a5ef54e42ee82c3fb35", "The quick brown fox jumps over the lazy dog"}, - TestHash{"c27ba124205f72e6847f3e19834f925cc666d0974167af915bb462420ed40cc50900d85a1f923219d832357750492d5c143011a76988344c2635e69d06f2d38c", "The quick brown fox jumps over the lazy eog"}, - } - for v, _ in test_vectors { - computed := whirlpool.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://web.archive.org/web/20171129084214/http://www.larc.usp.br/~pbarreto/WhirlpoolPage.html + test_vectors := [?]TestHash { + TestHash{"19fa61d75522a4669b44e39c1d2e1726c530232130d407f89afee0964997f7a73e83be698b288febcf88e3e03c4f0757ea8964e59b63d93708b138cc42a66eb3", ""}, + TestHash{"8aca2602792aec6f11a67206531fb7d7f0dff59413145e6973c45001d0087b42d11bc645413aeff63a42391a39145a591a92200d560195e53b478584fdae231a", "a"}, + TestHash{"33e24e6cbebf168016942df8a7174048f9cebc45cbd829c3b94b401a498acb11c5abcca7f2a1238aaf534371e87a4e4b19758965d5a35a7cad87cf5517043d97", "ab"}, + TestHash{"4e2448a4c6f486bb16b6562c73b4020bf3043e3a731bce721ae1b303d97e6d4c7181eebdb6c57e277d0e34957114cbd6c797fc9d95d8b582d225292076d4eef5", "abc"}, + TestHash{"bda164f0b930c43a1bacb5df880b205d15ac847add35145bf25d991ae74f0b72b1ac794f8aacda5fcb3c47038c954742b1857b5856519de4d1e54bfa2fa4eac5", "abcd"}, + TestHash{"5d745e26ccb20fe655d39c9e7f69455758fbae541cb892b3581e4869244ab35b4fd6078f5d28b1f1a217452a67d9801033d92724a221255a5e377fe9e9e5f0b2", "abcde"}, + TestHash{"a73e425459567308ba5f9eb2ae23570d0d0575eb1357ecf6ac88d4e0358b0ac3ea2371261f5d4c070211784b525911b9eec0ad968429bb7c7891d341cff4e811", "abcdef"}, + TestHash{"08b388f68fd3eb51906ac3d3c699b8e9c3ac65d7ceb49d2e34f8a482cbc3082bc401cead90e85a97b8647c948bf35e448740b79659f3bee42145f0bd653d1f25", "abcdefg"}, + TestHash{"1f1a84d30612820243afe2022712f9dac6d07c4c8bb41b40eacab0184c8d82275da5bcadbb35c7ca1960ff21c90acbae8c14e48d9309e4819027900e882c7ad9", "abcdefgh"}, + TestHash{"11882bc9a31ac1cf1c41dcd9fd6fdd3ccdb9b017fc7f4582680134f314d7bb49af4c71f5a920bc0a6a3c1ff9a00021bf361d9867fe636b0bc1da1552e4237de4", "abcdefghi"}, + TestHash{"717163de24809ffcf7ff6d5aba72b8d67c2129721953c252a4ddfb107614be857cbd76a9d5927de14633d6bdc9ddf335160b919db5c6f12cb2e6549181912eef", "abcdefghij"}, + TestHash{"b97de512e91e3828b40d2b0fdce9ceb3c4a71f9bea8d88e75c4fa854df36725fd2b52eb6544edcacd6f8beddfea403cb55ae31f03ad62a5ef54e42ee82c3fb35", "The quick brown fox jumps over the lazy dog"}, + TestHash{"c27ba124205f72e6847f3e19834f925cc666d0974167af915bb462420ed40cc50900d85a1f923219d832357750492d5c143011a76988344c2635e69d06f2d38c", "The quick brown fox jumps over the lazy eog"}, + } + for v, _ in test_vectors { + computed := whirlpool.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_gost :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0", ""}, - TestHash{"e74c52dd282183bf37af0079c9f78055715a103f17e3133ceff1aacf2f403011", "a"}, - TestHash{"b285056dbf18d7392d7677369524dd14747459ed8143997e163b2986f92fd42c", "abc"}, - TestHash{"bc6041dd2aa401ebfa6e9886734174febdb4729aa972d60f549ac39b29721ba0", "message digest"}, - TestHash{"9004294a361a508c586fe53d1f1b02746765e71b765472786e4770d565830a76", "The quick brown fox jumps over the lazy dog"}, - TestHash{"73b70a39497de53a6e08c67b6d4db853540f03e9389299d9b0156ef7e85d0f61", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"6bc7b38989b28cf93ae8842bf9d752905910a7528a61e5bce0782de43e610c90", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - TestHash{"2cefc2f7b7bdc514e18ea57fa74ff357e7fa17d652c75f69cb1be7893ede48eb", "This is message, length=32 bytes"}, - TestHash{"c3730c5cbccacf915ac292676f21e8bd4ef75331d9405e5f1a61dc3130a65011", "Suppose the original message has length = 50 bytes"}, - } - for v, _ in test_vectors { - computed := gost.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0", ""}, + TestHash{"e74c52dd282183bf37af0079c9f78055715a103f17e3133ceff1aacf2f403011", "a"}, + TestHash{"b285056dbf18d7392d7677369524dd14747459ed8143997e163b2986f92fd42c", "abc"}, + TestHash{"bc6041dd2aa401ebfa6e9886734174febdb4729aa972d60f549ac39b29721ba0", "message digest"}, + TestHash{"9004294a361a508c586fe53d1f1b02746765e71b765472786e4770d565830a76", "The quick brown fox jumps over the lazy dog"}, + TestHash{"73b70a39497de53a6e08c67b6d4db853540f03e9389299d9b0156ef7e85d0f61", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"6bc7b38989b28cf93ae8842bf9d752905910a7528a61e5bce0782de43e610c90", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + TestHash{"2cefc2f7b7bdc514e18ea57fa74ff357e7fa17d652c75f69cb1be7893ede48eb", "This is message, length=32 bytes"}, + TestHash{"c3730c5cbccacf915ac292676f21e8bd4ef75331d9405e5f1a61dc3130a65011", "Suppose the original message has length = 50 bytes"}, + } + for v, _ in test_vectors { + computed := gost.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_streebog_256 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"3f539a213e97c802cc229d474c6aa32a825a360b2a933a949fd925208d9ce1bb", ""}, - TestHash{"3e7dea7f2384b6c5a3d0e24aaa29c05e89ddd762145030ec22c71a6db8b2c1f4", "The quick brown fox jumps over the lazy dog"}, - TestHash{"36816a824dcbe7d6171aa58500741f2ea2757ae2e1784ab72c5c3c6c198d71da", "The quick brown fox jumps over the lazy dog."}, - } - for v, _ in test_vectors { - computed := streebog.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"3f539a213e97c802cc229d474c6aa32a825a360b2a933a949fd925208d9ce1bb", ""}, + TestHash{"3e7dea7f2384b6c5a3d0e24aaa29c05e89ddd762145030ec22c71a6db8b2c1f4", "The quick brown fox jumps over the lazy dog"}, + TestHash{"36816a824dcbe7d6171aa58500741f2ea2757ae2e1784ab72c5c3c6c198d71da", "The quick brown fox jumps over the lazy dog."}, + } + for v, _ in test_vectors { + computed := streebog.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_streebog_512 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"8e945da209aa869f0455928529bcae4679e9873ab707b55315f56ceb98bef0a7362f715528356ee83cda5f2aac4c6ad2ba3a715c1bcd81cb8e9f90bf4c1c1a8a", ""}, - TestHash{"d2b793a0bb6cb5904828b5b6dcfb443bb8f33efc06ad09368878ae4cdc8245b97e60802469bed1e7c21a64ff0b179a6a1e0bb74d92965450a0adab69162c00fe", "The quick brown fox jumps over the lazy dog"}, - TestHash{"fe0c42f267d921f940faa72bd9fcf84f9f1bd7e9d055e9816e4c2ace1ec83be82d2957cd59b86e123d8f5adee80b3ca08a017599a9fc1a14d940cf87c77df070", "The quick brown fox jumps over the lazy dog."}, - } - for v, _ in test_vectors { - computed := streebog.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"8e945da209aa869f0455928529bcae4679e9873ab707b55315f56ceb98bef0a7362f715528356ee83cda5f2aac4c6ad2ba3a715c1bcd81cb8e9f90bf4c1c1a8a", ""}, + TestHash{"d2b793a0bb6cb5904828b5b6dcfb443bb8f33efc06ad09368878ae4cdc8245b97e60802469bed1e7c21a64ff0b179a6a1e0bb74d92965450a0adab69162c00fe", "The quick brown fox jumps over the lazy dog"}, + TestHash{"fe0c42f267d921f940faa72bd9fcf84f9f1bd7e9d055e9816e4c2ace1ec83be82d2957cd59b86e123d8f5adee80b3ca08a017599a9fc1a14d940cf87c77df070", "The quick brown fox jumps over the lazy dog."}, + } + for v, _ in test_vectors { + computed := streebog.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_blake_224 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"7dc5313b1c04512a174bd6503b89607aecbee0903d40a8a569c94eed", ""}, - TestHash{"304c27fdbf308aea06955e331adc6814223a21fccd24c09fde9eda7b", "ube"}, - TestHash{"cfb6848add73e1cb47994c4765df33b8f973702705a30a71fe4747a3", "BLAKE"}, - } - for v, _ in test_vectors { - computed := blake.hash_224(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"7dc5313b1c04512a174bd6503b89607aecbee0903d40a8a569c94eed", ""}, + TestHash{"304c27fdbf308aea06955e331adc6814223a21fccd24c09fde9eda7b", "ube"}, + TestHash{"cfb6848add73e1cb47994c4765df33b8f973702705a30a71fe4747a3", "BLAKE"}, + } + for v, _ in test_vectors { + computed := blake.hash_224(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_blake_256 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"716f6e863f744b9ac22c97ec7b76ea5f5908bc5b2f67c61510bfc4751384ea7a", ""}, - TestHash{"e802fe2a73fbe5853408f051d040aeb3a76a4d7a0fc5c3415d1af090f76a2c81", "ube"}, - TestHash{"07663e00cf96fbc136cf7b1ee099c95346ba3920893d18cc8851f22ee2e36aa6", "BLAKE"}, - } - for v, _ in test_vectors { - computed := blake.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"716f6e863f744b9ac22c97ec7b76ea5f5908bc5b2f67c61510bfc4751384ea7a", ""}, + TestHash{"e802fe2a73fbe5853408f051d040aeb3a76a4d7a0fc5c3415d1af090f76a2c81", "ube"}, + TestHash{"07663e00cf96fbc136cf7b1ee099c95346ba3920893d18cc8851f22ee2e36aa6", "BLAKE"}, + } + for v, _ in test_vectors { + computed := blake.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_blake_384 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"c6cbd89c926ab525c242e6621f2f5fa73aa4afe3d9e24aed727faaadd6af38b620bdb623dd2b4788b1c8086984af8706", ""}, - TestHash{"8f22f120b2b99dd4fd32b98c8c83bd87abd6413f7317be936b1997511247fc68ae781c6f42113224ccbc1567b0e88593", "ube"}, - TestHash{"f28742f7243990875d07e6afcff962edabdf7e9d19ddea6eae31d094c7fa6d9b00c8213a02ddf1e2d9894f3162345d85", "BLAKE"}, - } - for v, _ in test_vectors { - computed := blake.hash_384(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"c6cbd89c926ab525c242e6621f2f5fa73aa4afe3d9e24aed727faaadd6af38b620bdb623dd2b4788b1c8086984af8706", ""}, + TestHash{"8f22f120b2b99dd4fd32b98c8c83bd87abd6413f7317be936b1997511247fc68ae781c6f42113224ccbc1567b0e88593", "ube"}, + TestHash{"f28742f7243990875d07e6afcff962edabdf7e9d19ddea6eae31d094c7fa6d9b00c8213a02ddf1e2d9894f3162345d85", "BLAKE"}, + } + for v, _ in test_vectors { + computed := blake.hash_384(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_blake_512 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"a8cfbbd73726062df0c6864dda65defe58ef0cc52a5625090fa17601e1eecd1b628e94f396ae402a00acc9eab77b4d4c2e852aaaa25a636d80af3fc7913ef5b8", ""}, - TestHash{"49a24ca8f230936f938c19484d46b58f13ea4448ddadafecdf01419b1e1dd922680be2de84069187973ab61b10574da2ee50cbeaade68ea9391c8ec041b76be0", "ube"}, - TestHash{"7bf805d0d8de36802b882e65d0515aa7682a2be97a9d9ec1399f4be2eff7de07684d7099124c8ac81c1c7c200d24ba68c6222e75062e04feb0e9dd589aa6e3b7", "BLAKE"}, - } - for v, _ in test_vectors { - computed := blake.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"a8cfbbd73726062df0c6864dda65defe58ef0cc52a5625090fa17601e1eecd1b628e94f396ae402a00acc9eab77b4d4c2e852aaaa25a636d80af3fc7913ef5b8", ""}, + TestHash{"49a24ca8f230936f938c19484d46b58f13ea4448ddadafecdf01419b1e1dd922680be2de84069187973ab61b10574da2ee50cbeaade68ea9391c8ec041b76be0", "ube"}, + TestHash{"7bf805d0d8de36802b882e65d0515aa7682a2be97a9d9ec1399f4be2eff7de07684d7099124c8ac81c1c7c200d24ba68c6222e75062e04feb0e9dd589aa6e3b7", "BLAKE"}, + } + for v, _ in test_vectors { + computed := blake.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_blake2b :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce", ""}, - TestHash{"a8add4bdddfd93e4877d2746e62817b116364a1fa7bc148d95090bc7333b3673f82401cf7aa2e4cb1ecd90296e3f14cb5413f8ed77be73045b13914cdcd6a918", "The quick brown fox jumps over the lazy dog"}, - } - for v, _ in test_vectors { - computed := blake2b.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce", ""}, + TestHash{"a8add4bdddfd93e4877d2746e62817b116364a1fa7bc148d95090bc7333b3673f82401cf7aa2e4cb1ecd90296e3f14cb5413f8ed77be73045b13914cdcd6a918", "The quick brown fox jumps over the lazy dog"}, + } + for v, _ in test_vectors { + computed := blake2b.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_blake2s :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"69217a3079908094e11121d042354a7c1f55b6482ca1a51e1b250dfd1ed0eef9", ""}, - TestHash{"606beeec743ccbeff6cbcdf5d5302aa855c256c29b88c8ed331ea1a6bf3c8812", "The quick brown fox jumps over the lazy dog"}, - } - for v, _ in test_vectors { - computed := blake2s.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"69217a3079908094e11121d042354a7c1f55b6482ca1a51e1b250dfd1ed0eef9", ""}, + TestHash{"606beeec743ccbeff6cbcdf5d5302aa855c256c29b88c8ed331ea1a6bf3c8812", "The quick brown fox jumps over the lazy dog"}, + } + for v, _ in test_vectors { + computed := blake2s.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_ripemd_128 :: proc(t: ^testing.T) { - // Test vectors from - // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html - test_vectors := [?]TestHash { - TestHash{"cdf26213a150dc3ecb610f18f6b38b46", ""}, - TestHash{"86be7afa339d0fc7cfc785e72f578d33", "a"}, - TestHash{"c14a12199c66e4ba84636b0f69144c77", "abc"}, - TestHash{"9e327b3d6e523062afc1132d7df9d1b8", "message digest"}, - TestHash{"fd2aa607f71dc8f510714922b371834e", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"a1aa0689d0fafa2ddc22e88b49133a06", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"d1e959eb179c911faea4624c60c5c702", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - } - for v, _ in test_vectors { - computed := ripemd.hash_128(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html + test_vectors := [?]TestHash { + TestHash{"cdf26213a150dc3ecb610f18f6b38b46", ""}, + TestHash{"86be7afa339d0fc7cfc785e72f578d33", "a"}, + TestHash{"c14a12199c66e4ba84636b0f69144c77", "abc"}, + TestHash{"9e327b3d6e523062afc1132d7df9d1b8", "message digest"}, + TestHash{"fd2aa607f71dc8f510714922b371834e", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"a1aa0689d0fafa2ddc22e88b49133a06", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"d1e959eb179c911faea4624c60c5c702", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + } + for v, _ in test_vectors { + computed := ripemd.hash_128(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_ripemd_160 :: proc(t: ^testing.T) { - // Test vectors from - // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html - test_vectors := [?]TestHash { - TestHash{"9c1185a5c5e9fc54612808977ee8f548b2258d31", ""}, - TestHash{"0bdc9d2d256b3ee9daae347be6f4dc835a467ffe", "a"}, - TestHash{"8eb208f7e05d987a9b044a8e98c6b087f15a0bfc", "abc"}, - TestHash{"5d0689ef49d2fae572b881b123a85ffa21595f36", "message digest"}, - TestHash{"f71c27109c692c1b56bbdceb5b9d2865b3708dbc", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"12a053384a9c0c88e405a06c27dcf49ada62eb2b", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"b0e20b6e3116640286ed3a87a5713079b21f5189", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - } - for v, _ in test_vectors { - computed := ripemd.hash_160(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html + test_vectors := [?]TestHash { + TestHash{"9c1185a5c5e9fc54612808977ee8f548b2258d31", ""}, + TestHash{"0bdc9d2d256b3ee9daae347be6f4dc835a467ffe", "a"}, + TestHash{"8eb208f7e05d987a9b044a8e98c6b087f15a0bfc", "abc"}, + TestHash{"5d0689ef49d2fae572b881b123a85ffa21595f36", "message digest"}, + TestHash{"f71c27109c692c1b56bbdceb5b9d2865b3708dbc", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"12a053384a9c0c88e405a06c27dcf49ada62eb2b", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"b0e20b6e3116640286ed3a87a5713079b21f5189", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + } + for v, _ in test_vectors { + computed := ripemd.hash_160(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_ripemd_256 :: proc(t: ^testing.T) { - // Test vectors from - // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html - test_vectors := [?]TestHash { - TestHash{"02ba4c4e5f8ecd1877fc52d64d30e37a2d9774fb1e5d026380ae0168e3c5522d", ""}, - TestHash{"f9333e45d857f5d90a91bab70a1eba0cfb1be4b0783c9acfcd883a9134692925", "a"}, - TestHash{"afbd6e228b9d8cbbcef5ca2d03e6dba10ac0bc7dcbe4680e1e42d2e975459b65", "abc"}, - TestHash{"87e971759a1ce47a514d5c914c392c9018c7c46bc14465554afcdf54a5070c0e", "message digest"}, - TestHash{"649d3034751ea216776bf9a18acc81bc7896118a5197968782dd1fd97d8d5133", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"3843045583aac6c8c8d9128573e7a9809afb2a0f34ccc36ea9e72f16f6368e3f", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"5740a408ac16b720b84424ae931cbb1fe363d1d0bf4017f1a89f7ea6de77a0b8", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - } - for v, _ in test_vectors { - computed := ripemd.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html + test_vectors := [?]TestHash { + TestHash{"02ba4c4e5f8ecd1877fc52d64d30e37a2d9774fb1e5d026380ae0168e3c5522d", ""}, + TestHash{"f9333e45d857f5d90a91bab70a1eba0cfb1be4b0783c9acfcd883a9134692925", "a"}, + TestHash{"afbd6e228b9d8cbbcef5ca2d03e6dba10ac0bc7dcbe4680e1e42d2e975459b65", "abc"}, + TestHash{"87e971759a1ce47a514d5c914c392c9018c7c46bc14465554afcdf54a5070c0e", "message digest"}, + TestHash{"649d3034751ea216776bf9a18acc81bc7896118a5197968782dd1fd97d8d5133", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"3843045583aac6c8c8d9128573e7a9809afb2a0f34ccc36ea9e72f16f6368e3f", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"5740a408ac16b720b84424ae931cbb1fe363d1d0bf4017f1a89f7ea6de77a0b8", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + } + for v, _ in test_vectors { + computed := ripemd.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_ripemd_320 :: proc(t: ^testing.T) { - // Test vectors from - // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html - test_vectors := [?]TestHash { - TestHash{"22d65d5661536cdc75c1fdf5c6de7b41b9f27325ebc61e8557177d705a0ec880151c3a32a00899b8", ""}, - TestHash{"ce78850638f92658a5a585097579926dda667a5716562cfcf6fbe77f63542f99b04705d6970dff5d", "a"}, - TestHash{"de4c01b3054f8930a79d09ae738e92301e5a17085beffdc1b8d116713e74f82fa942d64cdbc4682d", "abc"}, - TestHash{"3a8e28502ed45d422f68844f9dd316e7b98533fa3f2a91d29f84d425c88d6b4eff727df66a7c0197", "message digest"}, - TestHash{"cabdb1810b92470a2093aa6bce05952c28348cf43ff60841975166bb40ed234004b8824463e6b009", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"d034a7950cf722021ba4b84df769a5de2060e259df4c9bb4a4268c0e935bbc7470a969c9d072a1ac", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"ed544940c86d67f250d232c30b7b3e5770e0c60c8cb9a4cafe3b11388af9920e1b99230b843c86a4", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - } - for v, _ in test_vectors { - computed := ripemd.hash_320(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + // Test vectors from + // https://homes.esat.kuleuven.be/~bosselae/ripemd160.html + test_vectors := [?]TestHash { + TestHash{"22d65d5661536cdc75c1fdf5c6de7b41b9f27325ebc61e8557177d705a0ec880151c3a32a00899b8", ""}, + TestHash{"ce78850638f92658a5a585097579926dda667a5716562cfcf6fbe77f63542f99b04705d6970dff5d", "a"}, + TestHash{"de4c01b3054f8930a79d09ae738e92301e5a17085beffdc1b8d116713e74f82fa942d64cdbc4682d", "abc"}, + TestHash{"3a8e28502ed45d422f68844f9dd316e7b98533fa3f2a91d29f84d425c88d6b4eff727df66a7c0197", "message digest"}, + TestHash{"cabdb1810b92470a2093aa6bce05952c28348cf43ff60841975166bb40ed234004b8824463e6b009", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"d034a7950cf722021ba4b84df769a5de2060e259df4c9bb4a4268c0e935bbc7470a969c9d072a1ac", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"ed544940c86d67f250d232c30b7b3e5770e0c60c8cb9a4cafe3b11388af9920e1b99230b843c86a4", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + } + for v, _ in test_vectors { + computed := ripemd.hash_320(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_tiger_128 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"3293ac630c13f0245f92bbb1766e1616", ""}, - TestHash{"77befbef2e7ef8ab2ec8f93bf587a7fc", "a"}, - TestHash{"2aab1484e8c158f2bfb8c5ff41b57a52", "abc"}, - TestHash{"d981f8cb78201a950dcf3048751e441c", "message digest"}, - TestHash{"1714a472eee57d30040412bfcc55032a", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"0f7bf9a19b9c58f2b7610df7e84f0ac3", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"8dcea680a17583ee502ba38a3c368651", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"1c14795529fd9f207a958f84c52f11e8", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - TestHash{"6d12a41e72e644f017b6f0e2f7b44c62", "The quick brown fox jumps over the lazy dog"}, - } - for v, _ in test_vectors { - computed := tiger.hash_128(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"3293ac630c13f0245f92bbb1766e1616", ""}, + TestHash{"77befbef2e7ef8ab2ec8f93bf587a7fc", "a"}, + TestHash{"2aab1484e8c158f2bfb8c5ff41b57a52", "abc"}, + TestHash{"d981f8cb78201a950dcf3048751e441c", "message digest"}, + TestHash{"1714a472eee57d30040412bfcc55032a", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"0f7bf9a19b9c58f2b7610df7e84f0ac3", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"8dcea680a17583ee502ba38a3c368651", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"1c14795529fd9f207a958f84c52f11e8", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + TestHash{"6d12a41e72e644f017b6f0e2f7b44c62", "The quick brown fox jumps over the lazy dog"}, + } + for v, _ in test_vectors { + computed := tiger.hash_128(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_tiger_160 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"3293ac630c13f0245f92bbb1766e16167a4e5849", ""}, - TestHash{"77befbef2e7ef8ab2ec8f93bf587a7fc613e247f", "a"}, - TestHash{"2aab1484e8c158f2bfb8c5ff41b57a525129131c", "abc"}, - TestHash{"d981f8cb78201a950dcf3048751e441c517fca1a", "message digest"}, - TestHash{"1714a472eee57d30040412bfcc55032a0b11602f", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"0f7bf9a19b9c58f2b7610df7e84f0ac3a71c631e", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"8dcea680a17583ee502ba38a3c368651890ffbcc", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"1c14795529fd9f207a958f84c52f11e887fa0cab", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - TestHash{"6d12a41e72e644f017b6f0e2f7b44c6285f06dd5", "The quick brown fox jumps over the lazy dog"}, - } - for v, _ in test_vectors { - computed := tiger.hash_160(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"3293ac630c13f0245f92bbb1766e16167a4e5849", ""}, + TestHash{"77befbef2e7ef8ab2ec8f93bf587a7fc613e247f", "a"}, + TestHash{"2aab1484e8c158f2bfb8c5ff41b57a525129131c", "abc"}, + TestHash{"d981f8cb78201a950dcf3048751e441c517fca1a", "message digest"}, + TestHash{"1714a472eee57d30040412bfcc55032a0b11602f", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"0f7bf9a19b9c58f2b7610df7e84f0ac3a71c631e", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"8dcea680a17583ee502ba38a3c368651890ffbcc", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"1c14795529fd9f207a958f84c52f11e887fa0cab", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + TestHash{"6d12a41e72e644f017b6f0e2f7b44c6285f06dd5", "The quick brown fox jumps over the lazy dog"}, + } + for v, _ in test_vectors { + computed := tiger.hash_160(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_tiger_192 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"3293ac630c13f0245f92bbb1766e16167a4e58492dde73f3", ""}, - TestHash{"77befbef2e7ef8ab2ec8f93bf587a7fc613e247f5f247809", "a"}, - TestHash{"2aab1484e8c158f2bfb8c5ff41b57a525129131c957b5f93", "abc"}, - TestHash{"d981f8cb78201a950dcf3048751e441c517fca1aa55a29f6", "message digest"}, - TestHash{"1714a472eee57d30040412bfcc55032a0b11602ff37beee9", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"0f7bf9a19b9c58f2b7610df7e84f0ac3a71c631e7b53f78e", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"8dcea680a17583ee502ba38a3c368651890ffbccdc49a8cc", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - TestHash{"1c14795529fd9f207a958f84c52f11e887fa0cabdfd91bfd", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - TestHash{"6d12a41e72e644f017b6f0e2f7b44c6285f06dd5d2c5b075", "The quick brown fox jumps over the lazy dog"}, - } - for v, _ in test_vectors { - computed := tiger.hash_192(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"3293ac630c13f0245f92bbb1766e16167a4e58492dde73f3", ""}, + TestHash{"77befbef2e7ef8ab2ec8f93bf587a7fc613e247f5f247809", "a"}, + TestHash{"2aab1484e8c158f2bfb8c5ff41b57a525129131c957b5f93", "abc"}, + TestHash{"d981f8cb78201a950dcf3048751e441c517fca1aa55a29f6", "message digest"}, + TestHash{"1714a472eee57d30040412bfcc55032a0b11602ff37beee9", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"0f7bf9a19b9c58f2b7610df7e84f0ac3a71c631e7b53f78e", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"8dcea680a17583ee502ba38a3c368651890ffbccdc49a8cc", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + TestHash{"1c14795529fd9f207a958f84c52f11e887fa0cabdfd91bfd", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + TestHash{"6d12a41e72e644f017b6f0e2f7b44c6285f06dd5d2c5b075", "The quick brown fox jumps over the lazy dog"}, + } + for v, _ in test_vectors { + computed := tiger.hash_192(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_tiger2_128 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"4441be75f6018773c206c22745374b92", ""}, - TestHash{"976abff8062a2e9dcea3a1ace966ed9c", "The quick brown fox jumps over the lazy dog"}, - TestHash{"09c11330283a27efb51930aa7dc1ec62", "The quick brown fox jumps over the lazy cog"}, - } - for v, _ in test_vectors { - computed := tiger2.hash_128(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"4441be75f6018773c206c22745374b92", ""}, + TestHash{"976abff8062a2e9dcea3a1ace966ed9c", "The quick brown fox jumps over the lazy dog"}, + TestHash{"09c11330283a27efb51930aa7dc1ec62", "The quick brown fox jumps over the lazy cog"}, + } + for v, _ in test_vectors { + computed := tiger2.hash_128(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_tiger2_160 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"4441be75f6018773c206c22745374b924aa8313f", ""}, - TestHash{"976abff8062a2e9dcea3a1ace966ed9c19cb8555", "The quick brown fox jumps over the lazy dog"}, - TestHash{"09c11330283a27efb51930aa7dc1ec624ff738a8", "The quick brown fox jumps over the lazy cog"}, - } - for v, _ in test_vectors { - computed := tiger2.hash_160(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"4441be75f6018773c206c22745374b924aa8313f", ""}, + TestHash{"976abff8062a2e9dcea3a1ace966ed9c19cb8555", "The quick brown fox jumps over the lazy dog"}, + TestHash{"09c11330283a27efb51930aa7dc1ec624ff738a8", "The quick brown fox jumps over the lazy cog"}, + } + for v, _ in test_vectors { + computed := tiger2.hash_160(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_tiger2_192 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"4441be75f6018773c206c22745374b924aa8313fef919f41", ""}, - TestHash{"976abff8062a2e9dcea3a1ace966ed9c19cb85558b4976d8", "The quick brown fox jumps over the lazy dog"}, - TestHash{"09c11330283a27efb51930aa7dc1ec624ff738a8d9bdd3df", "The quick brown fox jumps over the lazy cog"}, - } - for v, _ in test_vectors { - computed := tiger2.hash_192(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"4441be75f6018773c206c22745374b924aa8313fef919f41", ""}, + TestHash{"976abff8062a2e9dcea3a1ace966ed9c19cb85558b4976d8", "The quick brown fox jumps over the lazy dog"}, + TestHash{"09c11330283a27efb51930aa7dc1ec624ff738a8d9bdd3df", "The quick brown fox jumps over the lazy cog"}, + } + for v, _ in test_vectors { + computed := tiger2.hash_192(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_sm3 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"1ab21d8355cfa17f8e61194831e81a8f22bec8c728fefb747ed035eb5082aa2b", ""}, - TestHash{"66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0", "abc"}, - TestHash{"debe9ff92275b8a138604889c18e5a4d6fdb70e5387e5765293dcba39c0c5732", "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"}, - TestHash{"5fdfe814b8573ca021983970fc79b2218c9570369b4859684e2e4c3fc76cb8ea", "The quick brown fox jumps over the lazy dog"}, - TestHash{"ca27d14a42fc04c1e5ecf574a95a8c2d70ecb5805e9b429026ccac8f28b20098", "The quick brown fox jumps over the lazy cog"}, - } - for v, _ in test_vectors { - computed := sm3.hash(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"1ab21d8355cfa17f8e61194831e81a8f22bec8c728fefb747ed035eb5082aa2b", ""}, + TestHash{"66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0", "abc"}, + TestHash{"debe9ff92275b8a138604889c18e5a4d6fdb70e5387e5765293dcba39c0c5732", "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"}, + TestHash{"5fdfe814b8573ca021983970fc79b2218c9570369b4859684e2e4c3fc76cb8ea", "The quick brown fox jumps over the lazy dog"}, + TestHash{"ca27d14a42fc04c1e5ecf574a95a8c2d70ecb5805e9b429026ccac8f28b20098", "The quick brown fox jumps over the lazy cog"}, + } + for v, _ in test_vectors { + computed := sm3.hash(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_jh_224 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"2c99df889b019309051c60fecc2bd285a774940e43175b76b2626630", ""}, - TestHash{"e715f969fb61b203a97e494aab92d91a9cec52f0933436b0d63bf722", "a"}, - TestHash{"c2b1967e635bd55b6a4d36f863ac4a877be302251d68692873007281", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := jh.hash_224(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"2c99df889b019309051c60fecc2bd285a774940e43175b76b2626630", ""}, + TestHash{"e715f969fb61b203a97e494aab92d91a9cec52f0933436b0d63bf722", "a"}, + TestHash{"c2b1967e635bd55b6a4d36f863ac4a877be302251d68692873007281", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := jh.hash_224(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_jh_256 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"46e64619c18bb0a92a5e87185a47eef83ca747b8fcc8e1412921357e326df434", ""}, - TestHash{"d52c0c130a1bc0ae5136375637a52773e150c71efe1c968df8956f6745b05386", "a"}, - TestHash{"fc4214867025a8af94c614353b3553b10e561ae749fc18c40e5fd44a7a4ecd1b", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := jh.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"46e64619c18bb0a92a5e87185a47eef83ca747b8fcc8e1412921357e326df434", ""}, + TestHash{"d52c0c130a1bc0ae5136375637a52773e150c71efe1c968df8956f6745b05386", "a"}, + TestHash{"fc4214867025a8af94c614353b3553b10e561ae749fc18c40e5fd44a7a4ecd1b", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := jh.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_jh_384 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"2fe5f71b1b3290d3c017fb3c1a4d02a5cbeb03a0476481e25082434a881994b0ff99e078d2c16b105ad069b569315328", ""}, - TestHash{"77de897ca4fd5dadfbcbd1d8d4ea3c3c1426855e38661325853e92b069f3fe156729f6bbb9a5892c7c18a77f1cb9d0bb", "a"}, - TestHash{"6f73d9b9b8ed362f8180fb26020725b40bd6ca75b3b947405f26c4c37a885ce028876dc42e379d2faf6146fed3ea0e42", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := jh.hash_384(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"2fe5f71b1b3290d3c017fb3c1a4d02a5cbeb03a0476481e25082434a881994b0ff99e078d2c16b105ad069b569315328", ""}, + TestHash{"77de897ca4fd5dadfbcbd1d8d4ea3c3c1426855e38661325853e92b069f3fe156729f6bbb9a5892c7c18a77f1cb9d0bb", "a"}, + TestHash{"6f73d9b9b8ed362f8180fb26020725b40bd6ca75b3b947405f26c4c37a885ce028876dc42e379d2faf6146fed3ea0e42", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := jh.hash_384(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_jh_512 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"90ecf2f76f9d2c8017d979ad5ab96b87d58fc8fc4b83060f3f900774faa2c8fabe69c5f4ff1ec2b61d6b316941cedee117fb04b1f4c5bc1b919ae841c50eec4f", ""}, - TestHash{"f12c87e986daff17c481c81a99a39b603ca6bafcd320c5735523b97cb9a26f7681bad62ffad9aad0e21160a05f773fb0d1434ca4cbcb0483f480a171ada1561b", "a"}, - TestHash{"bafb8e710b35eabeb1a48220c4b0987c2c985b6e73b7b31d164bfb9d67c94d99d7bc43b474a25e647cd6cc36334b6a00a5f2a85fae74907fd2885c6168132fe7", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := jh.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"90ecf2f76f9d2c8017d979ad5ab96b87d58fc8fc4b83060f3f900774faa2c8fabe69c5f4ff1ec2b61d6b316941cedee117fb04b1f4c5bc1b919ae841c50eec4f", ""}, + TestHash{"f12c87e986daff17c481c81a99a39b603ca6bafcd320c5735523b97cb9a26f7681bad62ffad9aad0e21160a05f773fb0d1434ca4cbcb0483f480a171ada1561b", "a"}, + TestHash{"bafb8e710b35eabeb1a48220c4b0987c2c985b6e73b7b31d164bfb9d67c94d99d7bc43b474a25e647cd6cc36334b6a00a5f2a85fae74907fd2885c6168132fe7", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := jh.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_groestl_224 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"f2e180fb5947be964cd584e22e496242c6a329c577fc4ce8c36d34c3", ""}, - TestHash{"2dfa5bd326c23c451b1202d99e6cee98a98c45927e1a31077f538712", "a"}, - TestHash{"c8a3e7274d599900ae673419683c3626a2e49ed57308ed2687508bef", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := groestl.hash_224(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"f2e180fb5947be964cd584e22e496242c6a329c577fc4ce8c36d34c3", ""}, + TestHash{"2dfa5bd326c23c451b1202d99e6cee98a98c45927e1a31077f538712", "a"}, + TestHash{"c8a3e7274d599900ae673419683c3626a2e49ed57308ed2687508bef", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := groestl.hash_224(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_groestl_256 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"1a52d11d550039be16107f9c58db9ebcc417f16f736adb2502567119f0083467", ""}, - TestHash{"3645c245bb31223ad93c80885b719aa40b4bed0a9d9d6e7c11fe99e59ca350b5", "a"}, - TestHash{"2679d98913bee62e57fdbdde97ddb328373548c6b24fc587cc3d08f2a02a529c", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := groestl.hash_256(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"1a52d11d550039be16107f9c58db9ebcc417f16f736adb2502567119f0083467", ""}, + TestHash{"3645c245bb31223ad93c80885b719aa40b4bed0a9d9d6e7c11fe99e59ca350b5", "a"}, + TestHash{"2679d98913bee62e57fdbdde97ddb328373548c6b24fc587cc3d08f2a02a529c", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := groestl.hash_256(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_groestl_384 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"ac353c1095ace21439251007862d6c62f829ddbe6de4f78e68d310a9205a736d8b11d99bffe448f57a1cfa2934f044a5", ""}, - TestHash{"13fce7bd9fc69b67cc12c77e765a0a97794c585f89df39fbff32408e060d7d9225c7e80fd87da647686888bda896c342", "a"}, - TestHash{"1c446cd70a6de52c9db386f5305aae029fe5a4120bc6230b7cd3a5e1ef1949cc8e6d2548c24cd7347b5ba512628a62f6", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := groestl.hash_384(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"ac353c1095ace21439251007862d6c62f829ddbe6de4f78e68d310a9205a736d8b11d99bffe448f57a1cfa2934f044a5", ""}, + TestHash{"13fce7bd9fc69b67cc12c77e765a0a97794c585f89df39fbff32408e060d7d9225c7e80fd87da647686888bda896c342", "a"}, + TestHash{"1c446cd70a6de52c9db386f5305aae029fe5a4120bc6230b7cd3a5e1ef1949cc8e6d2548c24cd7347b5ba512628a62f6", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := groestl.hash_384(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_groestl_512 :: proc(t: ^testing.T) { - test_vectors := [?]TestHash { - TestHash{"6d3ad29d279110eef3adbd66de2a0345a77baede1557f5d099fce0c03d6dc2ba8e6d4a6633dfbd66053c20faa87d1a11f39a7fbe4a6c2f009801370308fc4ad8", ""}, - TestHash{"9ef345a835ee35d6d0d462ce45f722d84b5ca41fde9c81a98a22cfb4f7425720511b03a258cdc055bf8e9179dc9bdb5d88bed906c71125d4cf0cd39d3d7bebc7", "a"}, - TestHash{"862849fd911852cd54beefa88759db4cead0ef8e36aaf15398303c5c4cbc016d9b4c42b32081cbdcba710d2693e7663d244fae116ec29ffb40168baf44f944e7", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, - } - for v, _ in test_vectors { - computed := groestl.hash_512(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors := [?]TestHash { + TestHash{"6d3ad29d279110eef3adbd66de2a0345a77baede1557f5d099fce0c03d6dc2ba8e6d4a6633dfbd66053c20faa87d1a11f39a7fbe4a6c2f009801370308fc4ad8", ""}, + TestHash{"9ef345a835ee35d6d0d462ce45f722d84b5ca41fde9c81a98a22cfb4f7425720511b03a258cdc055bf8e9179dc9bdb5d88bed906c71125d4cf0cd39d3d7bebc7", "a"}, + TestHash{"862849fd911852cd54beefa88759db4cead0ef8e36aaf15398303c5c4cbc016d9b4c42b32081cbdcba710d2693e7663d244fae116ec29ffb40168baf44f944e7", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"}, + } + for v, _ in test_vectors { + computed := groestl.hash_512(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_haval_128 :: proc(t: ^testing.T) { - test_vectors_3 := [?]TestHash { - TestHash{"c68f39913f901f3ddf44c707357a7d70", ""}, - TestHash{"0cd40739683e15f01ca5dbceef4059f1", "a"}, - TestHash{"9e40ed883fb63e985d299b40cda2b8f2", "abc"}, - TestHash{"3caf4a79e81adcd6d1716bcc1cef4573", "message digest"}, - TestHash{"dc502247fb3eb8376109eda32d361d82", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"44068770868768964d1f2c3bff4aa3d8", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"de5eb3f7d9eb08fae7a07d68e3047ec6", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - } - for v, _ in test_vectors_3 { - computed := haval.hash_128_3(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_4 := [?]TestHash { - TestHash{"ee6bbf4d6a46a679b3a856c88538bb98", ""}, - TestHash{"5cd07f03330c3b5020b29ba75911e17d", "a"}, - } - for v, _ in test_vectors_4 { - computed := haval.hash_128_4(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_5 := [?]TestHash { - TestHash{"184b8482a0c050dca54b59c7f05bf5dd", ""}, - TestHash{"f23fbe704be8494bfa7a7fb4f8ab09e5", "a"}, - } - for v, _ in test_vectors_5 { - computed := haval.hash_128_5(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors_3 := [?]TestHash { + TestHash{"c68f39913f901f3ddf44c707357a7d70", ""}, + TestHash{"0cd40739683e15f01ca5dbceef4059f1", "a"}, + TestHash{"9e40ed883fb63e985d299b40cda2b8f2", "abc"}, + TestHash{"3caf4a79e81adcd6d1716bcc1cef4573", "message digest"}, + TestHash{"dc502247fb3eb8376109eda32d361d82", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"44068770868768964d1f2c3bff4aa3d8", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"de5eb3f7d9eb08fae7a07d68e3047ec6", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + } + for v, _ in test_vectors_3 { + computed := haval.hash_128_3(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_4 := [?]TestHash { + TestHash{"ee6bbf4d6a46a679b3a856c88538bb98", ""}, + TestHash{"5cd07f03330c3b5020b29ba75911e17d", "a"}, + } + for v, _ in test_vectors_4 { + computed := haval.hash_128_4(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_5 := [?]TestHash { + TestHash{"184b8482a0c050dca54b59c7f05bf5dd", ""}, + TestHash{"f23fbe704be8494bfa7a7fb4f8ab09e5", "a"}, + } + for v, _ in test_vectors_5 { + computed := haval.hash_128_5(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_haval_160 :: proc(t: ^testing.T) { - test_vectors_3 := [?]TestHash { - TestHash{"d353c3ae22a25401d257643836d7231a9a95f953", ""}, - TestHash{"4da08f514a7275dbc4cece4a347385983983a830", "a"}, - TestHash{"b21e876c4d391e2a897661149d83576b5530a089", "abc"}, - TestHash{"43a47f6f1c016207f08be8115c0977bf155346da", "message digest"}, - TestHash{"eba9fa6050f24c07c29d1834a60900ea4e32e61b", "abcdefghijklmnopqrstuvwxyz"}, - TestHash{"c30bce448cf8cfe957c141e90c0a063497cdfeeb", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, - TestHash{"97dc988d97caae757be7523c4e8d4ea63007a4b9", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, - } - for v, _ in test_vectors_3 { - computed := haval.hash_160_3(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_4 := [?]TestHash { - TestHash{"1d33aae1be4146dbaaca0b6e70d7a11f10801525", ""}, - TestHash{"e0a5be29627332034d4dd8a910a1a0e6fe04084d", "a"}, - } - for v, _ in test_vectors_4 { - computed := haval.hash_160_4(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_5 := [?]TestHash { - TestHash{"255158cfc1eed1a7be7c55ddd64d9790415b933b", ""}, - TestHash{"f5147df7abc5e3c81b031268927c2b5761b5a2b5", "a"}, - } - for v, _ in test_vectors_5 { - computed := haval.hash_160_5(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors_3 := [?]TestHash { + TestHash{"d353c3ae22a25401d257643836d7231a9a95f953", ""}, + TestHash{"4da08f514a7275dbc4cece4a347385983983a830", "a"}, + TestHash{"b21e876c4d391e2a897661149d83576b5530a089", "abc"}, + TestHash{"43a47f6f1c016207f08be8115c0977bf155346da", "message digest"}, + TestHash{"eba9fa6050f24c07c29d1834a60900ea4e32e61b", "abcdefghijklmnopqrstuvwxyz"}, + TestHash{"c30bce448cf8cfe957c141e90c0a063497cdfeeb", "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, + TestHash{"97dc988d97caae757be7523c4e8d4ea63007a4b9", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"}, + } + for v, _ in test_vectors_3 { + computed := haval.hash_160_3(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_4 := [?]TestHash { + TestHash{"1d33aae1be4146dbaaca0b6e70d7a11f10801525", ""}, + TestHash{"e0a5be29627332034d4dd8a910a1a0e6fe04084d", "a"}, + } + for v, _ in test_vectors_4 { + computed := haval.hash_160_4(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_5 := [?]TestHash { + TestHash{"255158cfc1eed1a7be7c55ddd64d9790415b933b", ""}, + TestHash{"f5147df7abc5e3c81b031268927c2b5761b5a2b5", "a"}, + } + for v, _ in test_vectors_5 { + computed := haval.hash_160_5(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_haval_192 :: proc(t: ^testing.T) { - test_vectors_3 := [?]TestHash { - TestHash{"e9c48d7903eaf2a91c5b350151efcb175c0fc82de2289a4e", ""}, - TestHash{"b359c8835647f5697472431c142731ff6e2cddcacc4f6e08", "a"}, - } - for v, _ in test_vectors_3 { - computed := haval.hash_192_3(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_4 := [?]TestHash { - TestHash{"4a8372945afa55c7dead800311272523ca19d42ea47b72da", ""}, - TestHash{"856c19f86214ea9a8a2f0c4b758b973cce72a2d8ff55505c", "a"}, - } - for v, _ in test_vectors_4 { - computed := haval.hash_192_4(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_5 := [?]TestHash { - TestHash{"4839d0626f95935e17ee2fc4509387bbe2cc46cb382ffe85", ""}, - TestHash{"5ffa3b3548a6e2cfc06b7908ceb5263595df67cf9c4b9341", "a"}, - } - for v, _ in test_vectors_5 { - computed := haval.hash_192_5(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors_3 := [?]TestHash { + TestHash{"e9c48d7903eaf2a91c5b350151efcb175c0fc82de2289a4e", ""}, + TestHash{"b359c8835647f5697472431c142731ff6e2cddcacc4f6e08", "a"}, + } + for v, _ in test_vectors_3 { + computed := haval.hash_192_3(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_4 := [?]TestHash { + TestHash{"4a8372945afa55c7dead800311272523ca19d42ea47b72da", ""}, + TestHash{"856c19f86214ea9a8a2f0c4b758b973cce72a2d8ff55505c", "a"}, + } + for v, _ in test_vectors_4 { + computed := haval.hash_192_4(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_5 := [?]TestHash { + TestHash{"4839d0626f95935e17ee2fc4509387bbe2cc46cb382ffe85", ""}, + TestHash{"5ffa3b3548a6e2cfc06b7908ceb5263595df67cf9c4b9341", "a"}, + } + for v, _ in test_vectors_5 { + computed := haval.hash_192_5(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_haval_224 :: proc(t: ^testing.T) { - test_vectors_3 := [?]TestHash { - TestHash{"c5aae9d47bffcaaf84a8c6e7ccacd60a0dd1932be7b1a192b9214b6d", ""}, - TestHash{"731814ba5605c59b673e4caae4ad28eeb515b3abc2b198336794e17b", "a"}, - } - for v, _ in test_vectors_3 { - computed := haval.hash_224_3(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_4 := [?]TestHash { - TestHash{"3e56243275b3b81561750550e36fcd676ad2f5dd9e15f2e89e6ed78e", ""}, - TestHash{"742f1dbeeaf17f74960558b44f08aa98bdc7d967e6c0ab8f799b3ac1", "a"}, - } - for v, _ in test_vectors_4 { - computed := haval.hash_224_4(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_5 := [?]TestHash { - TestHash{"4a0513c032754f5582a758d35917ac9adf3854219b39e3ac77d1837e", ""}, - TestHash{"67b3cb8d4068e3641fa4f156e03b52978b421947328bfb9168c7655d", "a"}, - } - for v, _ in test_vectors_5 { - computed := haval.hash_224_5(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors_3 := [?]TestHash { + TestHash{"c5aae9d47bffcaaf84a8c6e7ccacd60a0dd1932be7b1a192b9214b6d", ""}, + TestHash{"731814ba5605c59b673e4caae4ad28eeb515b3abc2b198336794e17b", "a"}, + } + for v, _ in test_vectors_3 { + computed := haval.hash_224_3(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_4 := [?]TestHash { + TestHash{"3e56243275b3b81561750550e36fcd676ad2f5dd9e15f2e89e6ed78e", ""}, + TestHash{"742f1dbeeaf17f74960558b44f08aa98bdc7d967e6c0ab8f799b3ac1", "a"}, + } + for v, _ in test_vectors_4 { + computed := haval.hash_224_4(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_5 := [?]TestHash { + TestHash{"4a0513c032754f5582a758d35917ac9adf3854219b39e3ac77d1837e", ""}, + TestHash{"67b3cb8d4068e3641fa4f156e03b52978b421947328bfb9168c7655d", "a"}, + } + for v, _ in test_vectors_5 { + computed := haval.hash_224_5(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_haval_256 :: proc(t: ^testing.T) { - test_vectors_3 := [?]TestHash { - TestHash{"4f6938531f0bc8991f62da7bbd6f7de3fad44562b8c6f4ebf146d5b4e46f7c17", ""}, - TestHash{"47c838fbb4081d9525a0ff9b1e2c05a98f625714e72db289010374e27db021d8", "a"}, - } - for v, _ in test_vectors_3 { - computed := haval.hash_256_3(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_4 := [?]TestHash { - TestHash{"c92b2e23091e80e375dadce26982482d197b1a2521be82da819f8ca2c579b99b", ""}, - TestHash{"e686d2394a49b44d306ece295cf9021553221db132b36cc0ff5b593d39295899", "a"}, - } - for v, _ in test_vectors_4 { - computed := haval.hash_256_4(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } - test_vectors_5 := [?]TestHash { - TestHash{"be417bb4dd5cfb76c7126f4f8eeb1553a449039307b1a3cd451dbfdc0fbbe330", ""}, - TestHash{"de8fd5ee72a5e4265af0a756f4e1a1f65c9b2b2f47cf17ecf0d1b88679a3e22f", "a"}, - } - for v, _ in test_vectors_5 { - computed := haval.hash_256_5(v.str) - computed_str := hex_string(computed[:]) - expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) - } + test_vectors_3 := [?]TestHash { + TestHash{"4f6938531f0bc8991f62da7bbd6f7de3fad44562b8c6f4ebf146d5b4e46f7c17", ""}, + TestHash{"47c838fbb4081d9525a0ff9b1e2c05a98f625714e72db289010374e27db021d8", "a"}, + } + for v, _ in test_vectors_3 { + computed := haval.hash_256_3(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_4 := [?]TestHash { + TestHash{"c92b2e23091e80e375dadce26982482d197b1a2521be82da819f8ca2c579b99b", ""}, + TestHash{"e686d2394a49b44d306ece295cf9021553221db132b36cc0ff5b593d39295899", "a"}, + } + for v, _ in test_vectors_4 { + computed := haval.hash_256_4(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } + test_vectors_5 := [?]TestHash { + TestHash{"be417bb4dd5cfb76c7126f4f8eeb1553a449039307b1a3cd451dbfdc0fbbe330", ""}, + TestHash{"de8fd5ee72a5e4265af0a756f4e1a1f65c9b2b2f47cf17ecf0d1b88679a3e22f", "a"}, + } + for v, _ in test_vectors_5 { + computed := haval.hash_256_5(v.str) + computed_str := hex_string(computed[:]) + expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str)) + } } @(test) test_siphash_2_4 :: proc(t: ^testing.T) { - // Test vectors from - // https://github.com/veorq/SipHash/blob/master/vectors.h - test_vectors := [?]u64 { - 0x726fdb47dd0e0e31, 0x74f839c593dc67fd, 0x0d6c8009d9a94f5a, 0x85676696d7fb7e2d, - 0xcf2794e0277187b7, 0x18765564cd99a68d, 0xcbc9466e58fee3ce, 0xab0200f58b01d137, - 0x93f5f5799a932462, 0x9e0082df0ba9e4b0, 0x7a5dbbc594ddb9f3, 0xf4b32f46226bada7, - 0x751e8fbc860ee5fb, 0x14ea5627c0843d90, 0xf723ca908e7af2ee, 0xa129ca6149be45e5, - 0x3f2acc7f57c29bdb, 0x699ae9f52cbe4794, 0x4bc1b3f0968dd39c, 0xbb6dc91da77961bd, - 0xbed65cf21aa2ee98, 0xd0f2cbb02e3b67c7, 0x93536795e3a33e88, 0xa80c038ccd5ccec8, - 0xb8ad50c6f649af94, 0xbce192de8a85b8ea, 0x17d835b85bbb15f3, 0x2f2e6163076bcfad, - 0xde4daaaca71dc9a5, 0xa6a2506687956571, 0xad87a3535c49ef28, 0x32d892fad841c342, - 0x7127512f72f27cce, 0xa7f32346f95978e3, 0x12e0b01abb051238, 0x15e034d40fa197ae, - 0x314dffbe0815a3b4, 0x027990f029623981, 0xcadcd4e59ef40c4d, 0x9abfd8766a33735c, - 0x0e3ea96b5304a7d0, 0xad0c42d6fc585992, 0x187306c89bc215a9, 0xd4a60abcf3792b95, - 0xf935451de4f21df2, 0xa9538f0419755787, 0xdb9acddff56ca510, 0xd06c98cd5c0975eb, - 0xe612a3cb9ecba951, 0xc766e62cfcadaf96, 0xee64435a9752fe72, 0xa192d576b245165a, - 0x0a8787bf8ecb74b2, 0x81b3e73d20b49b6f, 0x7fa8220ba3b2ecea, 0x245731c13ca42499, - 0xb78dbfaf3a8d83bd, 0xea1ad565322a1a0b, 0x60e61c23a3795013, 0x6606d7e446282b93, - 0x6ca4ecb15c5f91e1, 0x9f626da15c9625f3, 0xe51b38608ef25f57, 0x958a324ceb064572, - } + // Test vectors from + // https://github.com/veorq/SipHash/blob/master/vectors.h + test_vectors := [?]u64 { + 0x726fdb47dd0e0e31, 0x74f839c593dc67fd, 0x0d6c8009d9a94f5a, 0x85676696d7fb7e2d, + 0xcf2794e0277187b7, 0x18765564cd99a68d, 0xcbc9466e58fee3ce, 0xab0200f58b01d137, + 0x93f5f5799a932462, 0x9e0082df0ba9e4b0, 0x7a5dbbc594ddb9f3, 0xf4b32f46226bada7, + 0x751e8fbc860ee5fb, 0x14ea5627c0843d90, 0xf723ca908e7af2ee, 0xa129ca6149be45e5, + 0x3f2acc7f57c29bdb, 0x699ae9f52cbe4794, 0x4bc1b3f0968dd39c, 0xbb6dc91da77961bd, + 0xbed65cf21aa2ee98, 0xd0f2cbb02e3b67c7, 0x93536795e3a33e88, 0xa80c038ccd5ccec8, + 0xb8ad50c6f649af94, 0xbce192de8a85b8ea, 0x17d835b85bbb15f3, 0x2f2e6163076bcfad, + 0xde4daaaca71dc9a5, 0xa6a2506687956571, 0xad87a3535c49ef28, 0x32d892fad841c342, + 0x7127512f72f27cce, 0xa7f32346f95978e3, 0x12e0b01abb051238, 0x15e034d40fa197ae, + 0x314dffbe0815a3b4, 0x027990f029623981, 0xcadcd4e59ef40c4d, 0x9abfd8766a33735c, + 0x0e3ea96b5304a7d0, 0xad0c42d6fc585992, 0x187306c89bc215a9, 0xd4a60abcf3792b95, + 0xf935451de4f21df2, 0xa9538f0419755787, 0xdb9acddff56ca510, 0xd06c98cd5c0975eb, + 0xe612a3cb9ecba951, 0xc766e62cfcadaf96, 0xee64435a9752fe72, 0xa192d576b245165a, + 0x0a8787bf8ecb74b2, 0x81b3e73d20b49b6f, 0x7fa8220ba3b2ecea, 0x245731c13ca42499, + 0xb78dbfaf3a8d83bd, 0xea1ad565322a1a0b, 0x60e61c23a3795013, 0x6606d7e446282b93, + 0x6ca4ecb15c5f91e1, 0x9f626da15c9625f3, 0xe51b38608ef25f57, 0x958a324ceb064572, + } - key: [16]byte - for i in 0..<16 { - key[i] = byte(i) - } + key: [16]byte + for i in 0..<16 { + key[i] = byte(i) + } - for i in 0..bW8EMSp7Qw|AOrFSH{)UB5#v zb!G}3dikXn9x?jR%P$^v`K4FRnmuav*dsSg>Gu#?moJ`h@|mGGw)}DY z>bu^Ua7y>#7ks7Sh>EYCaN!-&TRKRdc=Qp!-<;_FKb7t5N0N5m4)drT&`0cmK4Ay+ zVLPB-484GVAO9QxVSDgVbP*+An{vt2>gr3cm@48GSABhIXv!4Hm@>2af*I9QuDIaRD?`&} zOr0vhS6IPQrd)ExRaZKODWMa}6UR-Ma@ZjyqXT$kA3W@kF{sKo_UE7e(>(Bz#2_eJl?qG!*8VO5r2 z^HKife+shbzR#(wFpDmK^gqQ}bQAAf!PqRii)5xGo<+Aa*;eqf=t1NUg(|Y>yZVj( zH~p^#{%e8%THwDH_^$>2Yk~h-;J+65KVyOQk$pFNwQuKn_2JBvypT6HRo$<*)2n?f zZ@KA1@0eF0_l|sx@5qQaNcrh1%XIbf8Tq{O+OlRkO@5W~+Nx$!CjW%;+M;HfO@5j3 z+7f4)On!;-+Nx$6P5wdUwKdMvnEWr5*OoO?MPB-rypu>ibH0~+#jAa-yW)&QN2>9r z6GC1`TY*VBsx}`V>K(c}_5R){{^ipSiHxX2LMYVOvSPg#^2Y1CdXE;7)a8M#BJ_4m zYg|4pU{-&Z8vZ%&nk3onwY__+*VfbD%W3zX*;+lgPr@!v!pG~Y{hIMpUtw=OYmYO% z6{=tX<@bSOFJE&oJ&;$L@bpu?G^Upc+>;T&(=#z@^A(l)u?OMc|lAM4f6V$k;R z>QBl`f0KemIn`Ht^%JAsQ4^xGF7fJb90o^$SARO`Nd;-0`(QcQ8~3;BaIbTRPojQz3G4R8Ju|B%QQMZ6s9l!l^>&nx>zJ`N zzM(z0dhgQufpFemTE9Dti{NX7FBiUC%KKICUmAI2;50aX4%mGfJaj-P*Q( zF!qBH<<5dqdh5W_FYg+en*e8y=gajs7@z9IcE@Jj*4|zW|JgQOW*9$a)6kivXO(`X z^vu#TPLC9hpK|#wp-9pA^nih(j_|vDYuY9L;Ld-$CK@IlHyh zBt7WkYcEN?xA-=FT&izArRB*nFGHkOmnoyxq^`bNx8=$*3-~s*8YYgTJ9m(UO=UG( zjXkyiWe?i9A)|I~;oH^t95rqxOAVD3^qOvswB35c7OW$&w#b0=@fN$o_F-N_X+9!e zpdfNqDpC~Q`z?gEEP+WaP?RGA;|IqVMd=8y1y;;5s;vMj*g^drFm9=L0aIuK^>&~R z(3s|^$Aj}9ghJbokZ9`Q7a-$Gt-5&0=Lp90esQ&G zIkH|hek}z0`hw^k;X6paZ|!lL3gClU4-DlP73Kk*v&{uMGu{Gpj(Ias?n(%m&2k(W zJajP>ge)boiaiRliVcO4&z>muTg$b=FSGiql)868?doR~xEtxb0yiM%|wPB$wFMMPTd* zzrnXLO-J}upyD2yOeW^)`W+2rrfFsk{QycwxW~j|R+Yv1l=9i5JemIIsMV3&o@ z0&DUObu}>cIRiU^l@SB~B;LUWJ^?J)!@v$;(@+B+6T_YcwgGECZ{Sj3{0j#D9$2}* zfi1wMn1R0o7JSLT2Z3D&8u)8b4>s_AV9LT@07Hiu>d%4kLlYW|_1IZn@w!PvB0X;) zM(l7j;6uPB8@hf9oJ}35w*kLk;q|~m6AXr)G1Yj3B*OC+iESbcGNapY-L80p%4zL2 z5;L}=Y_*f^0G>`_tDOq6)vi@FQ{Ebv3(2F zalpM1*B%Z{unW{!_}uC~KHxhLIKnnN!8TiVtQM%}u~GYR)RYS0po!h#*KP`G?~wyT zF{%RJ9u4P419Jj~cVQ^BvUjnvdsuYZ!&gf#w(Dm*xC@Cs$kC`Y4UTJoo&(B5{%BI; zAt?i4djO!R4*UVI(XKMz45-z>$L%U}K|nnjIM%K*M+MYEVCYQaphE*{KT%IJ)T@Ad z&>ACCaghlGnKcRo@9}M&A-@~wwGJldyko?3#ybi~Q1UMn7h6lM0%}o$`ZTb~8tqA- z^Ny83=QHg<=SjmCbm&$cQ`AijxuWn`tHyW|eW z_+CJ*1J1Tib9F#HA6R1@?4*D?78u7FFFIu9(+SLTqD}eLtv{Oto7U(dxY_ijC zbU>AlR+wow{JL|EL&-l-qtWrO5A?Ykt{qONOnGY}Fs&QM-`jc`85aZH5XgU>^J(l&_#8a+CqQ($o5ULUE{7QHebGhb7`RJpttSR5b%?;emc)(r zPk~Op`r}%?9_VzLE@(A86X-S%#{nzpjYeBOhtNkztTMlI2xUf~j45wDDbV6&%F*r> zTTePUWu%u=MtV7Aq?c1hdWGznM0)8t4_cO9HBK4%9Hb{mtTHPc!u6z#%DHBC2wO^2 z7-2ndkn_N;6zW6NUvD6i@&XTh-4$oa2ddw3>w*4wK)nNMr}e;_fX>&x25ht*I60tB z1U6d_JS?D&08W+%4jwL_L*{o}A=iI=wuWo>qf@55wH(b&JIV2_l+!&o4`-2UvaUA+ z=v?nApc~lB1+D8{3Uqd#26Urw5zx7w`iL&SAh8C%*C9sxi|C?qnwG7+)=7a%nzPi? ze08I(`Re4WKdx2HSEq~SiPKQ?Rp(tKoB(`~-Vj$?fKdKGVs+76GbU)bc7Jp+<*g?N zO1w!q%B5|+Kan_HG*_K2>W|aqWAV@FqWI@*cn&aSJg+c((PXnP4lCB7l>E-dwRVtG zDuz-jM~7Ve%48Et0p6nKy?Fr5S>WUCh^VAtuamJZ@HqZ@%=8;4146(*o-0z$WVt@qjuC*lGP? z?|`}saJq?$`5GG}rS6NmJgsH$~3Wn%i`5k*z0xtF&&Q_@bvMk#-g^ zKG@jy3_%+gPX)ShI2q_h=OmzYgTeXrV5%z?TV*s4h1k_f8CR~h-LXXRyx>|-wQdQh zR{?9RR@$T5U2XovGtAy!u>|%%lGveH2{N5)xb`3#G3Bl21U>$ca(cYM*3;-YA5(mC zz4#r_^-c50_4syR&F;nyHvrv^PwPVqI?KltOHk%T606J$Agj!5DWh_ZEk8KjsJ?EL zTy609^`vN|Sc8iVHerP;wJy9s>Y&4wDgciBJB!b%3c(`4Cw5B3DAwk#XvVk7XUSKsC1cC>4#7d(nMla z`Z35^Un;3QGI->IgE9BuQ9n|``QO(4iE?g#$W>4{^+B5Ag+2_!BL>=)-jURTVUsUA z9W}=~?HEiAsHXv+vtw{W0d)W{ZpT39OeePs*u)s%G9xSCK)EwXY*!U8 z)YZhJqorCXbU}G?q{h-~J&2sKLUO!f4ZXZh^p5bMBn8)bg3`lnWQ%~Ip~e9Y0J<^Q zAL#Tb0JV6^SPtOJeb9AIbf9&YxA zgW0u%Bhn+=yRj6ud8>E(CU2&zT!gwcbY0GrUs*YB{jkdd|3j zs&QOnX7BLZPm$HL_s_PA--g9@@!G@bqGGn!dRbs~t;KjwN_2Z}pKLuxdbmiaIPL6v zx!_Lip9@D0GAfPykrl0YYgN)b)`xAh{72(wm07Z>62)+DI2GTn>FmR5u9Hqad#$Wx=K!e?XC4F#%y}d{?IuzwZ~BV zdb04T%-#Q(1$0N!=Ygut#5rgZK3J4r{kmja$G1L=@|Tfu4Oy?X3W5t+KZk&+?-iZs zLDFa)?`)ux{S{!By+3w3(2a5h(2e~hp!0|mf$|gd_-(m~Ky^?Mog}g5`6fso4#-kT zigWua)`Ijw>!YcdRc`d?2+x2)SHQX4@~W+z?yLL;$hCSLm0fw4U!!nn z!nS(in?~JJNUXY(Kt}!_bkU#B!CrDynYdcDteT?a_?ZxJh-%S0!e^7Xz;is%x!K`B zf4u}cm&_L|Fjn7;Hg4DZCU7fG&B7i&3l4;yOJY^}D#)~JuFRsuAbNDFt8gC%xt~}A0`wsH7@?8?!$^ysh{oXTmLW8~J@OsPDMB>6y z1F-olqyKdQ^%CIZ(;14Q@ii&U>2L5Yof8eScJY#9YRS@C4~cH&b3n`_q{gUUQjvmR zlZc)Bh#-BuhM7EUHO7^x%xhDjYTc1Y_sn2%_yT zlGsiafNZC(<~hnSrhMsqD9)wIDW{i{Y`uOYFWNDb9`2Ti{4_q&s4stWcHRJV+N}q= zG3f?sqzDsZimlKwBvzTjK~|Y6DWh`Q)-zPta<(Z%`39e>BYc^I6i+d*BYbL5dNj}- z{fdCi*1~%R)c(MY*22=u@%|0C!dm!=fcglqVzTMv-2qiGXpxz;!(|(^+l9pTCJfRi z(Qu7NZ(OP#(9;8I9GGH2bv|tdqv!8PYifVZv|!h=D~6^p zLSn1tJIk|vA$W`{-vw$K!@!yg>}PwU=kGeL5j9Gp;+s<@7~ia*5cV@ktmM-{`tS^V zgr(V)Plaka(h)ul*loof8&D4h_Lwl1Kh#S8E)*pHki<&J1L#I(3b5uN)9-SiyDmQtSi#uhCBFnB=+`7xmj^(m z*@i0VqH>zv%|3k`CDDf(?@*u*qxOn{9pOI*q?HE3_AtOLtUm)5Uu<+~45&8(d#%%7 z7EsRu=ACbN%K~Z%Fm$$|?i)~d6ZH%eR{mUShHe%V+P*8&_uR#MyZ1eJ@d8lKU9^XD zhx332e7C^op5*vz!1oyN4sKqwhyS*Z<+~6*cP4A4&~@v6;0K29VaIn|z;`c&?#Yk^ zz|r;+YEi)OU8ru@YJo>thG?MCT&S`%dd>h&unZeN$AgDaV~J|0ZWnt2u-r1d2!qr0 zBB)N+3ZQgF*yCcb&v2gxl^%+EEO3RrCU}3qPzu#WqeFnJEW@{hCW@iDCWZrD6W0X{ zBLWG7fLpAD3xXy-2i57YWpJMkUcm4XRHwsRK&Qi@Fu3*TZKzJdbHE&XMBOuBSQ{{` z0PbcPKFaSK{3im2M}R{u!)q`&OD=}$y7_aU>*gQDU@f^QknkO#EXjeQY43ru?R{!# zm>IK13SDPz1kR?VNa4r>j*|C|eB|?b{OdX@sn(6u3hixbT^7_j3wRT?cqPd3HE@EF zpYVJ($j;!ad39*aJhI->A5-L_$s-V$(k-HMy_clM#`(*DdIlTnC8F+bTD=(PqR9n7 z=d9-gUF10jsCdMl=uRNDe@bF?`3cDB@)dMZIZgjfY)gL@sPvc!tmh;yvi%t7Mwv*HnM#;pz8eG-#%Ga6;RIu7TU;mVn96-7`Krv7ElKR z3l!M~55EOSOW!21it3#1EIXOrnDV9fqK_M8*^=%(XzOV_JMAcIJcn7mHJ(j}7#nIl zon4 zj(Re17i(JS<*0=~&zg2VTUru5=@f<({ugja8!g?vImv4O%4UgzpM;*}-y@5oBaNv5N5z6}s0|uHsjs&dv zm0Em}Z++lf3v>%a#jh>oa>;N0F1APbHZofEJUyTOUc)u!`UeH=;rsZOh+!Yv-Heg{ zfRWF)KIO^rF9G3sjl_AuGr*cnM#*Dn++2Gt8b6|06-V-|78A9P59FP=FOp^N`RW+6 zfq9JZPVSx~O|ISM?zK6sU6lR8=Co#!yU*sHw7Cat?kRF8w3$xa?CkUX#P%dF4cHAwQ5D^2**jzzR@T#9_W;iK27Du zqmKkSeMSciB|xY9Awcy=`dkS{=u8r6+Y!DRWc6uw`g{!v`aEelpCQqQO22ZD>G3lI zIgtgVTMdNm8i0}55x!WosYc6F1L`rrL3TbL6i|l&tL%IZ2h#j{<}>b}e=WB{JHj{fExts<*DEpa4P?>ydP7CMG(Z!YXMWEv|H^>Ih#Oa9<3!%DL#&VYo-7E%!Sl@`sM_x`2Bs+$u-* z*(K`V&}Hm5$$ib{9<#YoX4(yHCx_|AKV_*$T56|qMI)cH$ty|*kKcnpgNlkb)^+v- znGV%1pT>jKu6&*=j}(q9GSWug^{%?Vh;L)xrPrV`AFjcV`3Xd14tdXBD`GJIvQf-y z`L=^`jZVyK$hL={<6GRv_t*}!hI;&_HZ%Zy1eisQm4>OROERqiLuSZ^^#keJ8tc%w31eO~xEWYaQWIzD=d2 zx6lxuT(99KF4vDAO@Tb+wL$WYQ4g#a_iy<&+{rNy0rAkO5;l0$0oFqgBC*O8IS=(} zpVAtp@<`#B6Abs5$;d{h^GK}spW|!6`U$)hJrH`e6{@))vvh>3eWAoLV4c_sNA
Y1k zt4Ott!qW~n;bfc(Cq$vk;6B2JlQE*^z;qigQ}KRx-_7s~o$+l(sbPj<$rEH@T1jG>If9s_ zW>_DF|B9M4@LLkw_uojAZQye1s+_tHh$PXw3Xw+qSr7(k!Y)JOFc1d zUFO=t1iNv0i|3m7cJgPyuX_o|H+Mw(!88r|?8f+Z9Z)YXB@5GZ5_$fpv#EqGy8dsi za&91WCj2Ugf3m3J{{m?qQ(f&nA-zmu>%IhXja@-ql~Z>uiJ6!l8&o?QMMKjssQ2&k?Hbb#bsbqM zyk)3JKI?Bmg^ghRhHuw`mZr^Qsj!K}c>J^%g9>`)0sHdpT98V5_Js=5Mb#kx1>mdn zyDnAuJ>RZ{X;f$-ONB>B%qYhgZofhKm-KeHOobplkY67~mUhCcv+td(hlJ z^{rI9>`H!MLHDPraHemiWdKzmAnm_N{6&15F4Qi&ftRTdAnPqz55=gN9C{`Mb~RrS zy(4@S$-&kdg}|yCJyC}O-C3v~@M24SkExwH#cX0;0J_^-D}g_PL7S>^FjM^)5LCi)`6q5r z$1C_YZOvJE3&p(TEIPKjhD1T~Qj?m?2j?3|!zVc!a4gWhyE_u-j^VoljpaD+5Fo2` zE-lO-cAx@ez9drfN)p?||2W_QmU<|#=4504eSq59!#fao9t_xj)U{wp(>Q7AgQ7nvGKyA0VP(8jNn!qh zqYUwD^lJ;>RN5Y%qXhD`j$CcYSK4H{O)j*_xi$EW@q9R?9FYV3;2;Tnl{CG8_*> z(+H#F^-x_mrvsm}45MHu_@ZIB45~&M9nJ#2WEqCQ;I5yZ4b|PGJ06&}3|o5o=A8%C z8EOo0gJpOHhJww;s7FF|QzZr*c)g)2J~)O00){;ThGrO?p&k&l1G_g2PTyUC4_RRg zB#b9x=*2*&?$Y{(f8>S!U>UB5!F8wys*~_KaD`>K5C&(nH=#P4{Tb+NmXHp)rio{v zx?x!kbXM1<)G<5`)w#xlz-Md|pAQ%wg6f+1DR7Nt*vkIhDfu&~&UYGtdb6Fry{-+u zy{`PNK*G&H=f6+F&^6L1IR~oK;Y#2;wu#>cO;ka3_n*%L_PfC}@q>V23RI_LIdFhw zm=iFZ4AosVIZDtnOozc)ay(S$;0FTtvka%eP+4e{JQ%7Qti6B-S%xEEaIWzMsLl>~ zz~d~#a5327-Zfy@xFs)if@R1J7;=Els9Rxh!qx%Zt$;K^$1%JE)v5D5@Ir(U&)WLA zKD5K>u4b&J*x4opyuvp7K)|ppVE8p~CJfvkkR-;jA!zcK6uQ~-J>c&R-|3F;ih%E1 z6gr=~8Mxf=9qjlf1$@_0=oGsIn1PQj^!K}PP{3IkNSx#(qMFtS4o#DI5@%^1+mfKrgO`)^R z`M^5Ecb4P(Gki|Jvng~wdOWbv@D)40hXTG*3f)%h5a16DpSjyc*B8L&VpS1^&Xjus z?}HD9nOp5^EbZaH_F_#aD|N}hj_A)FWR!nsARZl%ZZVJ=R{@-Bp9_pmHTFmZ)FXiT zm4>>1K#c-t+v{8(z0)V*Ent_u&h^)T`WSGwz0OraHTU|`i^Ka=T`PETTpj2Ms2>7T z7Z~aX0rfp#!9|8TXkYZT)$RbgexDz}lYsGQhIcHmajJnM1BQOUN=ud8PAlvMV7INd z5?E#7!@#CXjD(*7n}O$)o?Cie>G`Eo^mBW4MuEPchx6vV-K>Go?*l#*n`hvou^N+} z5gV%?&5L`<1+hj$nIBt7T3$ab&uh6Aq(gz1EQ?L|I?7_Rt;dzcsy=#6<6ai49I0}^ zFUwJH#AMcCQSwWY_@+QrFCvuyFO-iUFtQQ5#tWiOXbP;)9D`$K$YvGLtf;lRgkXK&RRkG4M zsw@_d+}S3MLR2sI_?^LGZ_Z<~S)W;#JFPmT)hk1H2~BG>zrS}nzmSQtSoQ{4vKmX) zUy0>vsq9;>K;|j7bC5PZaF!e9TP|uWH+Mtzv_$f$(&S%d9b={5Hd$z>*H9hGQ~O-d zGFDmjg8}?FBW65k0)|fAbck2qpVXKmm;N5jziRc_7~=+v!LL1@lvg(IXnqHALS9MA z8~3%m$buBV>rubDz53(xmN()?8cdi+x5B2`0Bxqj8MEY=L4(NK=nvK-^u`I%*3eqj=&%25yA zPBlilMycwo;m0ufear3gQ`5DC5sSo~@-EuiVz$p&Jt^9@C*zIot{u}kqjyPaU7`9| zvdZ={a>_G(ozxFye!P#J(s|8x`uK7G*~$LN)r`~814V>Sj718wtdQDvEIy{E833AE zk)@{@0cTsrqH`O&W_gF~Tl=;r_h^z1i?E_|z~)F1!>O-MeRb)pJ5rPz6Nu`oKwrg7 z(^zv$811b043|y2@Tj>fy-32uml~R%XY?=dl5NQ+Ha;&;-6W5SoZKl}*Qk^}%v0rg zGHs)bypXBtZKG}+>-h82_m6D*Xe`(JNhzUhm^PB^SNeJL+IlFVfHk`C_j=cVwrT z34@sDXAH~plJjFJO0>ji@XG544J%LHZ6=l1QD+2Kysscp7i*$?oOr>Czs-)W`Li$o zE{+uDj?_5I;uQprNZl;c7CA-0I{ieeqQ_)6csBM@(?*Zv#!rNevr5nO!$zh^wObB= z+mC9M8k8zEEim2c!(wNZq*ZBdv{IjqGw8=^3yc}k5|_-4nG9o0hM1>t=V7H73Rm-E zy+rEmD(f{|&N@h_EBvI+eJXn`U&_+9SV|UHV-k^lCCB<|$NOxkz!fQ~i*-{Q^#?hl z&X09LkaIIiu`FxX#cC*!>L+{kHY4>*y?VQ&Fg>74v>%1hSX&(^R0r}tr2|yFnD$0W zAp@FypkX!?S=N9q0k0!>q-<$gne&(&xo?#|FKddJdBgg}F98!hwVwIwS2c5$d0wcp zVVYe9<;jlppU_+CS0K;;Z%?;!<@q40qE_Y1kItrlz;4y6mm~(!$i&%Mxzck~PPnfsFVI-4zRW%Q(%w~ey*epFTW^PR))(fks-D{RR{p@wl9h8;MHaLT zY@4$(bOSA{SZ?c7?=@$cBs83yQ_>3w$&rcgN6I!QH`i_*al;|r;!yOSKc^9^iVr?R}8!R0w4JKZtxamH9lL<9?qRQxNBB zt|4U>)SQs)8A%62ZC&}y()9XBl=AhFvkk^F>Bu24&d8g?G7bC9bKaDJ+TM%~yuop& zv%HV>By%4>+Z_B{cjLdiJulhg4eXB8)nX#;{ZBVPk==7_c}aVDNk@56NBLguUgQt$ zUTycWq)-2z&W60m#OJ))^~Vy)rcuUFf1gqM8At9>qX z!zk7*ulD^Ty@C7=_v2zS`6I~BI>3wEy*0CN0v0TX-qZ^jh1d8^+n*|4E4?nTNr zX4?H4Z7aRxYOi)RzvI0*5qaQ)L~?y%^*Vku9L`CRiL3edA}eE!_-ogOCPgN^$iHV7 zKO#a=o7RJnw^wJPqk{qM^*WZDWc4~VlzcuBnfPoXQub1xgf*NlCcMbMXTAMC@b=qM z((4Ue9glpcqkQ0B%aboAduqFKy|#2eZ(xsCo67NOpQU5()1S6u_-Y?d*^#9Ur{*lm zp&Rd)MJ7I>nWSYhR63`N@0!xKmxq+jY2(j39XoL#i#@*wpDq}QvxUkAuE3%Gq1E~W z<5XtL&3@X9SM`;Q6vNT6*bT=D%*$}dU~a55EM;vaYnRl}kXN+K+iPuE!*LADW`<>r zSGy)OgJI#9`MVjGHU6+D&#lwQWAu?AL4G9#-B!yiK3ROO5t?L&%D|-pQpX(Im@RtX8s7r$J%Rw@h)jpl0+258K?agV+`3KX`PS_dydbJyK*x3%;s6*z)HJ*OrT%Q`R_W96q zZ;5Ru67u%z^cu>d%(qR4Uo+&v(S=VCW>%*O>fPSPH@%z>me;gBS+WYtBqH~uywzQ} zA?sO+Ftw~a^6QR(u{>wlHp4-@XT7(p#Y1LO<0T(8N2*|p?{-~P+6UF3ozg~^Ho3If zr72SRR#oV&;|!P$0bpxJKRn)Ud=0UoMw=NgS!b`cz$2+zi~a3x%HbyQ^U=PsSzjrA zb?U22U)|d|W{4h_Dp6mRVG*>#4U@lF}pri_|!CLi;v06eA@sY7V=t+C15FmpSVOCoOZ< zl}Meb=P5Nus~wzmYvh{9pOjAXX?oamzEX6J~YLJ4X|>X*usTsVW0*C)C> zxiS35v0OaQ_-NbB?Q`@$;+HfET$cHubA0mr-BT%A%|)P2js+6`T51l*@cbu{u55 zHi75e=a_BkGb@)_VVLX8r5#@-MT?)fDmL}2D3|$;tFn;PucFX!kE>!+zlw6}rp{d( zxm{h5Uej|OsQi_yVN+_Tq*b}4LhBA!&!wT?ObUFbt7KEZ8RhKJy-$CRg{?++qJ*)y%8x<7>CveDj&xuXpZ_ zn!H|3GDiuhy3CH^AkN4D6It^zw;>q|M6r&dQ-RVsTY5R^U2|x1OK$}>QJhm+} zsAgr?JkGtzwzkZGnwO8QSy@ANzu2*ZYH06^*{$?P_ELSVo7k4wy=G;%UvE%QZ(A{6 zbYk|;79+1TuIbgIzPf;i9& z&N44&mDiB_Ep28vW!_qsqbBFss-@<<6q$dv`dGtPdHs;sv_@adGkuaaA*rpr;ds1a z$1SkiVvAq9X<%vO;oRNlm5m-zo@~GQL2h?kJMg&nvfL4)61^) z4J!n*$r;eV>7oHWJP|h1&oU> zEZ}lxc`)mYhU!jgCN4U~UZ)N^%c2g0^hBIUOk26uoVXQl7jx#`WAc()0OCU8Z~Tq>tOBXa{yVi%M>zlyw!)>{qt&-xh8; zGX<*4yyOF4SnsQfVQ0iLa6mtV+sdrt5@3 zohtYgTZN~C|LE88!B~~HDwp{(?cA!Mm4f6(in|sj6exl)am`K=KQ7=Q)Eii?AdQu- z_Il?pKcLb2-MqG!`@8C6kW0bPuZ_N^D3nUUhp|MTSEI}$sP`TzNOWd|SXCI5C!d*&Df%A%E6 z6mK$kGPu*Xt`B%+3hOGjR46^~{r^l0T`?ltLiT#7GsnMTpM4Q0`&3{PGty{{|Ipc?SR%7b zlvd?3U*=C(c`aWc&u15J+=O9~xi1c}a*AQ|r+XpzE#Kfiu+v?+%t`y$ItB14mPwCc z;P?DGKCod$xy)d;h~kUF$N#2I9$>v+#|Ktl;n^BT9vaQ=7e|UAdebJnG-RiliV!H2w8)W{zeGLOktxWhO|TsX~MR0 zHf(Qr#|o5y%qE$n-ea>g-^4YqKF_OFZJG-Qc1WCE*l zW?!3bP(!tk+D%fV?j}ae1W9HIq803PaQEt66Ah*8jW7`UE7b$9#_**2c(seQ#_b-N zd)P45^0-ko-<-yM{Y{NP{~lF>MFNSaQRMKZ0TC7ub^TZb-d}tQ>pmz}X{N-sVlBft zEZZ{5$}*(>s-c}Ci#*p3wplgK5$R*AhPH}VzpX*Q=7EU+XDi3YckEf~Mj5sUX8pe& z54B$`&fX~&*uC|2>-u&?#h*0Rc{?yx8MQP8Wbe!nJ1*>87=2vZtFPd?&Vra6A523F zVm%t5`U*T`L9E+i#&JO`ZE)20@GfN`uOZ#gmQy`W?olB(H!eX02Oncx1vmGBUE!3o zE8NfD3i{+V=wX~B2jFeJK%|d(0sHFo*QlzFNs;uv!MTIZeO$zOI}lOmM5qs$9tFx^ z1}rlDX9Pd0o4z>?p(ltwD3W(CG+)|Y!uU%Z}giAo?YJ`{9SFvq=D7J=4>Cfp-gZmm?p)3QRB2Cn8 z&8fB*J?H`+C(D0)*M@6+a@Y2E9z*aW5kpikLRnFX3Pv1a$CfpB6X7(pt^i=9; z$O|x4W&JrWKo+_K;C@63@ck z_KH-izdt5bOV+L{;rb9AuF=HNBQ$0r_4#?<{+r ztv+|{O%E9d%~Ds_gZ=5Y!+E#%H73N@H6fg}J54iotFgjjW9^i|ePO9ZS*+cx6gv&W zn5R2y7l3ISI@Y#CtSw5ba(1h9Aq}hd5|AFsk-*)oLg~>6!15LCSP$(wLE03I4N@h!h`K ze^Ac)!*x!I)X3b(UwOzvAQ-Nr~z5Wbl!Gmwhl+rLD?kZsx5o>7eoV>-3<*A{FN3srMcW z6sv~(#<|=ui_PvfYO!&-JcIiNRCZU@9t5k6*|f3H=u#J}0o$_*Lt%*ws3@()IuS%erZe*Zs-=Zksb4y)}atJ(cx zC01f6twVr+;#uil=Ur_?UX_znpdYo3t{(U^1L6}e_4ck?)G*(g0TBVYfv^OvU^c3qnywsif*mK-qa&0{5 zjtnpPl(`=2u4#6dYnpmxqv7fTze@Eh8C`$z)$Nvl2jMWSEb4YSx359PWlr6BV9gK{ zur1M_J<8eH^P3l~x{~`Jq>2c2X#K}9!=kQ+l*A?mQ$o^4PWNrjjZR9%*~89`>xlz`w`m;_b&tMdadr)aJ|;u zk0>rR2XJ=^e^();z@EbYzLwFziiKDXgBpt#fIl-F{9YBAq#Ct%mx?{j;tQ>~=>v6Ri~hzr(pJdz6CtU9|a%SEvs^7 z%bGa_COuj`XQ4cxwx@sfIeZU|%)Qs-+X_5ATh8^;E<6Lw#*K@z78A2E7y`k(<82P0<#(e07__kNWERz^bd9-C+;og%yNosZQ^M zkj(W|*MUl6cRXkHY_EA%;3?gt{+I4nC6;dUxBvlXXC4>m3x+qGwT*)$HX`6-4+?k< z=9ZNy+Mev}Sm@uoy7{*}#C>gEd)YpRj`Di{$a!kJ7bahR*1E@{EPFTYjJ+4BBIcFB z|E=aV!SVl=QRn{!+i(d>o5N7`@tS@Mv+UalZuR}y2iBjJv;OQ!1`aJ5=`EkVb>80g zBXcT;l$uA)EdUdWn~1|v(=xZZ!TTdzp?KR{0JBQ;SWcovzum!SkHq3}79G~A%1c#i z$!mNq=H5;y{o>jIOf-7~LyKe&M6aF;(=;Ft$y3V2kDGLU%rof%b2CJ*Ax|d%88M&3 z;wNMN0e`mV0?9Myf=g*w=K?jvrAw~X^}WCPQo2R^Y;!)ivCKakys43C&I*i+z@NDp z_|?J{d|+2LT5p zSM-6^K{=yC=0lq0M7V;+a$02i#k2T|OkD9PW2q;`wl|dLtWtme)0Xdl>lM<>@3b># z@Vl|PW}0vsJk=k3AB_aOd+=NjwwR)&^zF*4+b|0XeJ-GGo?wnkvKpTlU zk8S(#O6CVISY^5p<-5-s@JwH<53KtrXU`WuMJ!&BN2Q$V)6|Dfs_Bd?yaIf^FTw}* z1gxAr0iSP043vmjdm(IBgT9ja4c<-G6jYnJnnIra-2v_}gX?_RJ{YUgR^^rorTbag zMj{X4AW&*GQ`PU~BCvmrXNMPie*d(L_y3!VJx@OMnWx?DPU8hx^>%Py`1&2(>O9-8 z$~wW&=uT88{yk~#YmwW!7)f0KYJs2&=PO9LaDIi{xluz(%wMR~EE49{(5{HnNH;RN z{x)(R*uNvR!&^ho{E4UY>W_XYJ?}Xr_!r(^y>W_HKaqy)MR(g6($y%BW#2ZV*EZLb z)!ahxXRaj|(p+XVwf&&^$(zGBZr@^=St#h9-_v_zbUQ5rbm|YWk*P^KJ(3Qe4Mt>XEvE^sOb1zU>*$x0`ZUS1*@TDPCxe_g?HccA0pJ~XdNP?YG1 zD^i5`wS^6t+p(8v`FL4X9On6vZ)zLgaB8nN_lZc|rRUdKji^>kb*uP?F5 zS)``Qk}EenXQk6=4Abtd=E*SL*XJh&DD+md)vV?nlgI;|dSZKFW{}j;OLlWRBXx(N zjZ$=cFX-CV; zy^X8A?-K$4Bnvq*$wMF@+(%zMkx!2$c zno4vZJk~kq&QJ?k@pECDBC54(wVtbiPSzOBJz#fmM)2tomlil znSLrlyz}&gBLmis>Z{*KB)2edyf>@dnVQ%c@58m7KIODyo~9^jB2Xi?WV_!!5pW*Z&7CriHcs&w=;cyGrq z#p8~?CW~J^i#ocl8`;0zXRjUQIC@JKe>1qt>8~pp{BQcw1bD{L7lM8L8^O(vJ`c=< zGyFB+pE~;NEdDBR4Rm8toz@Jf0hBj9WRBP6JV~NQGAEY2rk_YD0A?l;NzDBkosRV! zrB27glyVyGV&&77eSV$Sq4IIC!pWg-LnCMH6MVp5{>x)w(^4cbK2kc|KizF>g37H(QT7^LU`w;GRE3 zktS7Xp$qy9kZOydIOa-VU)MRqD=(Jm0ZWzQXhXS_;P$&Rl+Tt)^kSL4mEkoka1Uu6 zH%!fV9mlCpN->L4)4uFy)Ima{B$1aglDN?2jRy2k8hFVQ^Sop~v6+S;t6|7oq&zOF zR*e`;Rm{lB>&KGvzrj^_ai#P6+2CU6ts*QHS}ZnMeZaJSp_1OZwfgY@Z}HtwjR4(U zqmqPnl1807tpW3jwV|iMcen<+!Ro6bQUkXE$x3+9qyf0Wd#e(?k0omVu}h>u*BZ)s z_p_}l%s}Q&r!5(Fn7T{8(&eKrU!i<`UG8K<=YVF+GT%6YabEdZqJBW4{$xy57prmQ z^GLJEDMwyGYO2YN4UmT$Ag?zd?t=;+R03p&DpGyqfudRV%&!_$CPZ~eSF@xI(JM6@#@lHcaAP5Ay;7= ziPvn6MsCsXBW1=T1OAc?!Dc5iB2N8i*%*Euxy}fPMCTg`k+W7r2G6%rYTKhy@mV%v zz0(>?-r2T(Jo501k%u2TSnb9S`)&MJC-9c9&2kAVUh`40Z9g8`8sFLxuj$=Aa!U*P z+L=D=iX^n>sit?Lh5NeA2_chKbR{xQ>}ed*j}T)G7d#q#8fdJlsFA=CSWTeB3^`_fDDTuQHG3 z$Ny{lL~h}5%oQ8wn#5Ikf?lzzEtb(5JdE;mq;`MVVjxII# zpWD$jI{q|m?aYp@(($i=e`j`d#g2aw{QPhF)dbkljxOZ*=fOiHGW<2*9qs5kv5)Mj z4V@Vu(us=4<^1Z&|H3*enIYUHdp%Y3WYtsj%p#ka3|TYTjIf-G+669^b1H9~j#QCM z`6{J_;V1tzz+@}Q%IQsvX4j`y6j{x(m%P&~dt9%&>1JI;6OrBOx?QI=YLhYUg&U_+ zRrd^zBR-5&z*O^&)|*0(3Tu1fv-m}x`?m@Dar8DPRGt(sPrjQzr@cQHnXP^y+QA`J zSD$s?;(6EX^+anr<=SD`Am;Ri<}cGuhX#+Ihv^yHUS|}miPZ8FIicE3W4#78xQLI` zeis5SL>J~PIReDX)4j_|Hl!QQVk%z`!Jof6=D9jEzrZ!0hDQgft4nl@@heTH(r0zE z`tkn$ZZ@v=84-V^B+tx4Qhi((+PeCC{oPWBK{bB7g*lnz*1Fi$Hg`5jz{t`d>nLMdg{)S$ zca$+&Xr>|750}LN|0ts)PBBey=O}a3+1W=K{j!=7Kt$S^qs+@L?(X0yb3Ste115Sq z61Ba%MCSi^^MBk*+3k9;vnyrvoB!NO+4T*}zq2c4v*X{{m9ob1@9auh;rMrUr7VD7 zbKzqvr5{iKudSDNw*QB%mtSC@|8v&M^D6#@^|FvkpS50&?)XnzFYjWbqKDl6Z?2a^ zM*L6K%dazH|6MQtrS)>R)3Vn~-M;x}*2@yNdhB4mJY?Js*Gugxvv--StR`RKQtk3o zu6?D_8kaV@w8^E-E={?#)1_T5?RKf2l8~IJON*gvS6fJ0s9g-W033Hc8U|mLqpMC; z(yfzVpIJ)6P) zNpMjXe-k+F_!olxlWZfnz|rSr@z;R6U4LhT`Mn4uzY5&x=+m?KE5S{UJ{fF01-n&% z{gbSh#UBS(!7saiY`xW;1s&|O*4wdgXI}>{c6t9gaDnn%2QD=9ZLb5Hkwu&aQCjg4 zsfkMjkeYR+fKS#jHKh%!JH3jtn>?JROWSfbk`azxek1DGpN-JGj<J}QlzF%VfZy3WilFyr7--u%QlmBjL)`R_=KXl(ezVJz&B=}fb+7>ziPGb{98c= zVWOGyufR^7fA4ea`9dm$tdUe#AOHL-i|7!LQi}E~NV&6UXvMNKG@XA%b2Z;W zs{iVwQqH-zlW@-czRlf6qI2#KNT;=>@^sdn?`U^s(Qb9LA7|0DaozDL_+a#1JPd8J z7WPB@%_`UPIOaAXpzl0A1(7j_>DmOvmNjkwW{R zt8r6i5Pi}_A}OG%s8OZ%LSc=@p3B!F>6WrRA{#H*=7=nc&d0IO|4-KYZ!psTUGM*; z_5KSdX0P{M3?+2QC+uZ6qrX*{<&x_38_kZtvTq(z5c1|Ys*ICWj zZl@7ps&Bnc2|IdA7QbA+`BuCBYHIj$n!x^gt@-WK8^KkMU(-}TAuZiHTyKa5nje42=f@$0L znrqNQqP6-Y@wz(NPjEln+jD)-kyU<)LD`j*8q?lJO2k!LDsMN|dTYq)@U zPGDaJcYPD*QGBY5Np#zC@v|f1BK(w@yRJR7&E;W! zYbmruUygUs=mA`6a1*gZ#~?&&!Slj4>}^#x`(v*V{J4w#S?Uu|f& z?k2Z0`4;5qW3E5Wqr2v3NcB(}4@q!wRNd*K++A+;H&G%e7A0q)$(PY6Pj1cjlA0hB4M&%$$wMhhlarWKOs1@-B~qf}Eh|W| zv%yVB^)E3l0vAL7*d<2Uc1>A!2>rkpz`*UyCB}>kC<>u^usiE%2?^hFkPQ;+A2Mlp zEvb2O;_(8Wp2&^Ne}0Q@-TR@K0j_d%RmzU8KEI@PJN`vrKZ>f^?C9$AORpx!KMyQ6wOa$oj;=m`74!=D zOUgg?tBp$^r^cj%Z2nxdMv_|AB6kPJgz{^_p`cv0Ai|>1`cEpnT z)5AYx7k>M1S-u9>#V~n@IrEqjZg457i#o1&osUb`EYgV5HMe zd`XVer+-rPvT1lr&+|GupRxNj?w{rG>L_^@`!4w2o`8*^K~V&&{}IXPk9 z%Ad7Wu!m<;N&V_$`NZbH_jQD7fwavqs|+aiLEHxwKB)9Tl@Drs(CC9EA2j(tQ5jCBsoobnv>!8$z+ADQ!Ux^HvxIy~6p*Ojg&of) zp7=8|0(bVS767tpq{wRit?w7pnherJyE%r}RKY}>HR_||mxT@aI54UZd)`R3OTpzwyP zDRM8|ROzHIo{vA*E9Lsu7-h7^jN>%~4R^|DzP(3!8&yK+U1&J`M|yvXrL$I-CNmVl z0%7utQ9>WKq4p-TQNI$_avnKWs)FgHrl898!fVi$5uHR3$81wTU@BGw?{-eBl?e~2bCz`-n zn^RSh@bmZ6W|Tj+rgdg3o6&s!c1qtAuAn7re;+867)p%~8hy~@gJvJ3d{7CHqS}ns zxZX>4=(f+^jQaeN+I;(G2T7k_dKEbSPYaShe--?V=tJ-Ng5<}7V*#s8=Bw}p5t8SH zTJlytx?bB)xt|FHE!XaM(;nK35E+-=M=>4Ml~ z#Sz3z-%dO!Prg~6%%qQIci{27RCXMRhlnHkg2zj~D7MFoJ|mP|#dAqG0o}dRys8cO zl;C0?R)nW7%Jc;nPTF>^-D!S;#>lC#l)i9dcMi_4G*fpFZq$dqaHEWT^of4|TDUok zcNae^+-!5|)qF>NJJJ0GG6*~N4Fbaugq`iYLtr?Hag%>ybNkPPo~*}iOtf=>XM2y` z7%l#_u=CiM?66b#Pllb6Mmtk?5O&_&$KT=xp{JpgHvakDhC;mcHg=;vaQ??g`jqW& zIm}SWeY18FHBy7d{Ec)e7OzcvR6Qwu;}PNV(U(1#@XdIn&4cG+A4S#$<>L*IJ?B8H?JGsoFoX# zi_(#|9zsY%Lf8bz{=dIdb)J5@r+cPncN0O=pWUhR)N`up)TydpojO&|^Q7V>SN&aq z|1fk8Hpw8t)7!J2f1UVBsbHP`YLSjFl_1P?|iI@r5nlEc85YDzum*-A}&)T1gb%;HehMeue8-$=?;;SY#O z2t}*FUhr<^qtSiHf#yxSC1|%QcS6f(?{ax+yY34-_r3Y(xl>2O6Jjs)9B4~nm5mZY zH!BZAyIH9x#LkMNum!Cbf24e#%KellIKJOFzWX~PxGxZI+f36>u8+}C)onIVEETjz zSafa8!F5je`j9TDvF1+()<5<-bcAjhv$7>z!xn@ zb5V2YCrOiFs|JWQV%`a1e`r=GN=}rWs5nt|qUOZB6LlvRooG1Ga$@D#y+9SMp<$nh zII+^~?)=KNa>?qmyYow~eB?h2or~p4@bv8N{Hj^w_e1^*&>EqVQ&msT?#^E$z8d-G zp!?14&R>D25cwye`_1moUxKF<^|KwCMmKpTpwqLv^B0J(!EdeHJ-aXc3|&e7y3~A* z|44{r{53ieM3})XCQEr1lQSZ2IMg*H`b^q63D_}dD@J(#U%zoYllIIr9+|X<2AQ<; zqaBm>1+Hc9684+455~dLf~Uu%{fbP-q^$+8a5}U1WC}Ualecxj(DPUx z#oig_>(oqZ^8~fi{9q|GK^viprx<%q$;OzB0D-E-l$uCK8_Kpo4gxw&XPT6A106*h4 z@erT8nQb!;evx$PLSa)_PYZ?Z2tXqc$^K1PjM~T-WI-%Kb@K9XDi1UsYisnWRvD zzN|JO+U`+bR$H+|tJq%4>awIjuaktZ7+u0$mn^HHrQ#mT>UZYSUejMf9?Jk!8)UO) z%UtMg&=oFaWnFQKPtZ59S;MOO$z;BbmsG{)!N=&J0?>VuIkl>;#p|5zr&iTr z)rDx>H}&Vev0}etMe8xKx6*$-CJWI%#Ax0PPHb5|8rnu=oybA7nQ^6%Sfa`oWSn8d z^z@WYP)p+}IZ<|^;zZSnniKO*)SXy#qTxi#2~CkfU?(&|st@D|^%Jd$TkUR~6P~u@ zMA?ao6ICZ_PRu(|cVf|rh7&C(B$dj|reu&@J0%Y;B+khFto%qkOpkii@#_j12yxx~ z_OrLKW>zGx9Mdd=5rB(+*a#UR);VZa)WVa7O# zqPVVEd)FzfnD1P_Beh-*O9`BC>UNHzl3sOeFP)!>D5<6MWpV1ZTJe69zU$?;ey_~e z6*VW?)bN~$2(Z$8?fjar3zw}vUps$;{OA8D@E?ZG#d5pnYv-?vC-N^q)37FI_k8XA zHF&Cj81kQk?l)gMe+8bQ$Uh0)Z@zZ^5FTm44pA6UZe7&TJ zE9G+Gp$PTs%xG9dWk$nfof!=qq&n29s%JI@_oS``hPoCOW;TVL(99;^2*sZs(316c zKugYV2raP)oQF-QSf2zT2bt{;#MP&Xk&GxZxdPinj4jmaH zbYzGey|q214>14Rw3$aq?Nnl@?@!wU6K-RboG3d{aiZ!(%?U9} z{W`~#qfVlg(_$RS`=Fm0NSD^DTelo=`xrT_hF4p1o-SUrF zZrKVnd`4sGl?+K4P+4X^?Hg`Th*{YACL9K{#q-8ZLd&<#sFc??+~8>xWkls zEHkZEfU#Y}bSTYKvnmhxicdo~UuXWi@7->Ce0th>Clyg2kzwADflj;0py}rYzB+cY z7CiQ*v(A@$Zo5A{?VOa^`%mmcvQ(6B-In6DT11OZjR!32Ek zeJpimrW!@pVl)*k3rfk7Jy!K;OP_Nh??k}~S%St>a-!@+#fhpDH7Dkss5`OfM8k;| zgcK{ATR+i9h|^GbIHgj#5=uYOl53x6M!jirh0Ro*jIqtsaZBKST;2(MwXHptqCeN( zx0VkNnzNspQ?jt1s?xNddbIiOU-S9EQ`;!ye&tF_@f1lUeim|L+5d@X4tv*gfE z13n9_0bj5kSZP!FXhA5>u?Rn#>r-`&?##tMq=Qk^Q5>7^!lV3yyou5ZoIdrLl2TvM zxhu2xKFtd30Gq_0QR$z@o1;8P^Wg+3)LBD^aYArwF~Vabs!r6Lur7~y>f!~746U3N z6&Lr9*XEm!A|foWjrCs9iJJkLY1|CgN3RG~VZ z`K(V4G6`HBpq)7>;6XSN{^jO7AG4N8K<*)m?LPs)P=`V7+kXOp>3bCXP2Z=c!T&N~ zlAd8uISBY)5xZOu@K@$9yQd5MzmLpMB=~2^&$@8ViJIHj^AM>CAU!WwiWa@w2vs=6 zxNN2<_)Ih5gdoh4=A9@wG2ukXiLw(FC#p`=oS1i_?!=-K4JTR&>+-LbPIY~^x#v*+h43zL%>|e`!0WCKJh2! zRA%>lvE!|4pD&(E8VQ`9FVwc}`68!kbj=rv(|lpijb<*s%a#Z231jIQ+;4k-p(qhwzu(gE)x2m=REcHLFNa1ZBfMZ{P3yfFRy!Keuy2Vgo2VCDCj)# zJ$9f@Jvlu;Tn;16Wo=qgyD^?72z_xN6UNVV%CbL;9w(kMbjH%%v~A{VTI`*9mro5k z()p;&-U2MCQz3fTNIl2b1vUn_&W3hfr+%(=f%<;Wb%Av&iq4U*evs;Z`i0S@E=#1k ztbUN{w)&-JgPzldl9?Ldg&c|5rjqrXL`+$TuOG=Yi1agQgmOmYohUdl;Y7)avJ(|2 zs!r6Ln0KP?#G(@oCt46zm#$TaMjwwbYNiP<$H;k#yb}c{CY&faQFfx@MAeC!6Z1~g zomhmBEDb{aM7N-=0S2F1GVgqe636MqzEBcZBXPefzW-{K^~lL@>Nmg04h*x#0Ove& zRDg4yrpR6EwPSTsINzxo%U3kjHwIUfR)U=B{4JYn!tzD$mah=Y`}Qxf7dW@ibBeqB zJm+yvCIt#o189&<#38K7#N#!Y)K;BL9**@xrza_g+ya*`efW4LiSY*?Y(MC=swatA zu|cu_X%`Wu@1w)1&%<23#!2FizLP}eOI?%1V}aTeJxK)oCF5jTFycSc`r*3;?AN%C z$h`BVjJ#f8pFYn&i2v!oynb-Jo-5v^YYlJY7kjva|L;(cvL2j1VhCcN)BKX{yY zUs9DK-VfD+$tJw_c;S7Scm_sl>zhZw!m>fwS0jt1ccY5*@?on675mp(W<12_*AT%P z1SftSQB)iG=VjG)&Jl_cW?g?%m?LVS)!I+8{qT_oc`)pTWHBRaS`NryFUF%}IvJp! zy#s3}90n|9VqIg}bI`Rc*hxZT$Qu^@M?c#3clT?~ICtvv;fXP3Y%{4fvPvjG4Y<wrz|ww;_PGv*Q}#H{zV4?Ctwh56k+Y zB27|34W(9UKJj?XCzU_zo=@&GAKTJLg@f%!*uE#uQ}vmB3g{u(;n0Pg;xDEx)GKOg z@xDi>FOU0gokys@+`Rm2EKY8GWZnrKj7_*OYtY$BbgIOm1+9_Q<z zVcz)+t-$sb&{U<|f9_L0`RJ4tZmn^fe3CQO?$&xJCZCcU5b{3R zWH970StoK3iJxkK=_t%8s*VBI$R9-AvT zft@~YHO79)sn1%zy`I_g>GbsUoLAfQbTe`Oy~|bRC#gzvR(gI?+_BD2m;ZFf{Pg63 z=cjw_Z%?xagq^(QRh=vFh`*)5}Notw0@$;Qgi`&KJph+{1edr=9~1d2&=WC!I>ldw_Cs-V(8=LC=tktH-Gy4neVjimEz3dhvWH~k^}mxSnsa|UmMtas$)cZO^1f|no^C>I?afR6ICZ_ zPRu(|cVf|rh7&CagUfBR7j2x>`dJpU>?tAC_`xrowD~r9gp}9rFPyUQ6uQLLnfsIP zna+Il(I4NnkuMIfn}8#8)&0Yt82)Bq`f9s8c=yP`CBBP#Xy$=m`#3L3eY72vXXhaE z+xMz##aA+Jxkep%eA8F8F|4oCF6bt2a+zBP>lCj_)28Z@3=p1Yy-|kx0)=gz`P!D- zKfiVQJ?qM<#BdODeD}>qC~740JD0%EGGpCy&dXf&y5|gEF|y_MuWWhr4ejLrHnVj5 zmq#uM$&ZFibys!WHr$dDL>B*tfGBhEZ$;!+MVmLg4BSP2i75S;$T%!4!OaC#h@qyx zLrZ)-f$3q&E~p4+fzH49=&q-$C@C57&Kzw^_4S#h+gz&gz3YC2?^d4js~ffrUmfI{ zeci?}J&hyp%$>hcEk?ONU|6u}PM5zpeAwk5-}Ko~g>C7yZ`-Jaj@9MJOQ}n5*8w33)(R{m8@h6GCKG5q#Ul-{0q7Mf8WYIzd_)iJnEFQUNF7v&xF4U8& zbu??8iLk)`@!1PD@{a9o8#i2|OTHp|{!F9!yuUr3Md2TOPToj=O;zwd>djImL1V`& zPAjI*Z9eK2_M&c_fYUor~Az3Z(h^E%Y?I^Kp_7N*gW z*Ss2RG@s2APO0}+-G@LFVwE(%Ah}ksqWpY=P8<071})_-i^f3>I(7J2Nz|$@`*2td z>WFEbX{31c`r__yJub87g|XbM;v@eCXqP7kJ;WEf zr7JxZtc9NFJai-SkEQqv(D};)e-Szt`6r-DF@AfBzXUxW<99+o7yiVBq!TqZn5AaD z)vv(l(*{MJUd;QgE{o<(V%P4Zrb2-td~%qV;h6ZBM&hQ49FL#{aY>wF?XYhPUZ)8s7QKXq6D=o(sArJNiJTKs zf!!)V&>#~8`W+ZjotWZtU>k4SW(<7)XBYzuT7i%+abZ$uo$g{DAaf+ECxV{hpISCWHBl$9J6A~S&UMINB^hnONqq= zrLuJu@=O|!Wbx7~7Q>$*$)s9n{aRd*ECJv^Z^i6aP0fa*apo*Wd4$sU*os!E_gQL{ z=USP!809WW#8bBz$?o+#WHI~+D>`@vKcw2T z@vz0HoS=EOC@e;$drKa&808UU#ua2SDm`c(gVACnVbCG(jIbDKEc6b`?vr?hwiQ}KePeMqd z&2`oTvzP3V)VF?cN9LEO_LOLw9hq{SKNq$#MD5w5UQX04iu&3Uh`Nod+qnAW%l0%# z$(xnB@;1MpI);h7vB5W9ho~D_hf$aJ=w+A zk1PE*zMq&SVlK}vzQJPddm=GkC+5oR;+rkzn8q6^R(&9P8CE`6zBRX_vbEbI4H|AP=`&5*9K~ij1(t- ziQ@DinBolGr5_{m5b4#-j_Q`#)BpF(C40ni($pT!BAf3UUMysO@1~h>8CN7Tt&2V; zi%PSKzHeBtCy+u1im$_=)HzC2oH-Eohr6F@F8tKGq2Ho^sFNbrTTfw)d^#6f_HNyn z+d9_F>^@mivuc+bwy}zr(xjj}AMZS-uHFAe4qIpLz#05uPA3%iZhah;{(5oK2h|TN z%7hK4X$v`C8Ly>^UTU!ZGkfOr%$1?~mxSsc9sWAizZs=S8(#efGJ9@~w&Ag;;O}46 zp#r}5NoG+EOB*2FK2|;H18@CRnY~g6)xGc5twXFmL3yj0x#tbFmTk7RcLU$y8hzJ}5H{aen>T=jW+*XgR=(AcM6{1E>!!)xroTDkEb;)R*FvexB!iymxE@nXR z#^Scc6?`O_sryJ7z67=Df#Sutz5R@B!$)^zp>{nMJLCPgKWOjm?A5_DS6ya#AN<@& z1NLmO?A(+3g`Im!%+MNq zjJ5Ejgb_KWCmVgiD!#jJ7j-EPI8mfNqEd^!XkY9_$=f<|FzPtdy?+)Q2qiI6&7Bs~ z{ge^chZM#q9p&Q*M!A1V=`U z8W(kvX$+L9wWSWV$2g@S2k;k|KY;XAN>!_E&YzpPb@v^OEkhqp57?o-&w61YbJb`0e;4!lx>5dY z8_hB$PdzD5wh()sRDjrhbMCDB-*)R+A55T5^XtWr;{n*E=cZruKS718g-cG9ov1ib zb)x2kn5EL~goUV5<s6Or3rxbG2`pzT%@D7+6tx zVAzmCGPUaka?~&Rswq{HQJZ|$)LN|pM}WZaGCXx2#VMPn-J?b8in#fE>dU5$=7ax~ zhQAGHgZ8CfgS{#u``2O6Yd$^A(j^~k^0U_nLXQ&|07Z* zP&w>~mqe+vR4m8&n2VvU-eL|8*4 z+wEF9o11NP;{EdJQN78iwTfWPi0r6El$;*jb@k);EjczF znooa?tR(!>8YC2=!BRks1Ns94AAV~7&1>VpR%X2paDNwn^{Hc*McwN*;M357`Xv?- zxLhvIT)>hP+sGgXyJ5~a+&22}AMC(|TEqooWoAQF0 zA4a?5v*+1tzK^n?Z8onN9j9Y&qUX3%5F)4w@XMc)4 z`Il|DMi=_Z`g?!xcudJtZs?dYDyq~&Y)XztQ<5-C9avqT%PQ7F1t`}cslA*QG-*Z* z%W2Jo?7B^k&z#T7;9N`5u#{oEAc3t=BKZgj>cj!yx>MQAe(0Ss! zR?^b&-`$v=7|tX^%YX(H#wk;Qp0A`2L;J>i6Z+Z+4uZk3dyq0Ek2F7i`Fc#q8^U); zzl{mG{=}M)g;-aaa*I)vebD{z&iRFRK9KY_ehuF_~Os^AK^LlV#`7? zp7uq}&OH8Cpck0+sL@ST9_D4?CwZlv8Gf}k%LXJvy!Vh! zed4o03khho4(;`_`nuweWkffccN|QQ=(E>2qOXX@oE=(x28o zp);9iuCOtcb3)U%#b|y>=HF!#wy_AQ5|%zwv@yp19)_UBX!!~)&M)N4!;iAI z`bXw_*?6mw*N|EVQ$zNDmZ0Nny>C| z7{rpa(o@sUzF1VSBw2Opnps9gr|rqIv_||SVJ~|!&!|^t8zbbO(PdiI?MdzE^t2~i z&0qLHdiI&10LuV-Ms|}jmDj-S$?k)k!+#f`sRmEVo>USw;_v)_vpX#-++M8 z$9>U)GyaLdeUGv$wRfxU(aWODoOX$wjZ%-?-V+0&I~2?DOaBT6^z%(}`dq%r>l>>K z|9@BCq;@+Su~B7e6+~;hKiRld3|6xC{l=z_4I*lPe_Rj|XU*e)iZvLjYe9^Zxta!y zUgqjC0*18y+B(u}pJ#e7`87`%q3&RWPdYmP>l@i(_l;~#Kox;PoS5pdKkZA!E3=8ekE{O*9n^BR zA%PF307eVD?Z7C&tz(OJwzzn(agwUDK=yKn3U-p`-?q&(xWArBc%46sUL+%3o5;+U z%2?N`6mFyB6^ojbi}rk?iHt8~o+BPtyTRHNfJzu>RKu_`Nh!fRM^LKCOm zsyI=FP~+7I^}{Y!vci5l{z=A*GMwXf-#x|mTIwp&C7&xf@Jf=&s@4Y7gw6|=FmK3o z>&ETZE@@KVy0I7zO|TBlzdd$@lA48r%Y^z#cO~fq-6f`8MG-Jn37x3{Atud7CQUsd zqzkwg3H8%)1-8X-1{N=_XQn0<#X>85jjgIHRh&@2Z8LA&h*MCnLnOsW@#b|K6}`X0 zpDhb2UussW&9|Mq`Ie)LzZ=q;?XKt`3q?-{36_3~q)vLC!+Z^YF?Vkv3%1wz%OPaMu@qt;h1CUn)IwCF`>LDl*@}3`-O_AAAxa>< zE}fw}@%hMDz#h9}RT7Iyt%jmXYA3r^*vXWd%N zyzGNKhj@TehM;fNVM87zj0b0t)IDW$CdZW_ecH=JeDl@sw~=#;y>(_qx%0@qC^>YD zT5^u8EH@9Cz9RpS$^GYl)s{OqVl`w77!7Bp{(vj%F9j)z{xCtPpGB&>8KM5CS}XN% z=Hj=&;G2!QmAHsvgHUlLr6V6Eu=6?%iqpVW8BJ(EA|-`8t-dLqrQd?6?zs7!M-2}z z{Rl;7p0br*dbQgZc>cbrWa}}tuaic#OZUu`Ji4?T}xR|>7j_878yql!%-Qv z6}uA=T(P>9Qmpml*t1bATl_(>1@z;JEke68dn#7==HnTCDiafKEtxFS=NrkSzdkQL zEv3&eEW@!d>C-E9L`ve?)S+R6ve4((h@L*@B)cO(XamDK2H3aNGIgqKKtO1!&5~65 z&b9UJm{?J5+sghKE?wEWl_*=Yf#wC&JWagy-x34Z)w~mWMKx=DRMD?en=orhy-dGv zB9r}3<4@22`n+tSUqqHlOarr9!@~y~qz*J&A-!%&EnJ>%(LCWI_35mPLh#b?54_TF znC3iSq+XMdGuIvba(4RV^zm@(U~|LtmR>D1LJJ+S7GkQm79zA3swsjNnkUrHA{$P$ zAX1IAgG+BD-AWqC9sA*#U7G3$cde;%DX1A;4QhUcRAK#3dnt?1dDf7{vi8y-+y8X_ z^lYz-zb|R8_T$E;5}Ku{@@b`gQW4jt46darU59v@&8}%Sg@ZI(apt;WXTyb<4bv~D z@j_FEnB4Ts*LB8>PQP4MbTl25Pk#F4JgyvL4mQW8x17>}c{*aO7OoNMXDwWJVi6+M z!ms1fTUfVJEqq9vRKHHB$%MdKIG-AfW2+6uU8It~T=NH{3AUCDmbLG%k;(qk`O~v~ z-+OARed{WZ3YbD@Kd+F^U8_A!72KDirq9WCD6u6TO&s(^{leG*v5lCANR;@tUvLE~ zI;FsU;!^&EC{Q-4DR7>=9nG|oS`p3OO5r>ofc}DwtD(Dw^vm@3>*Uv8f4}(Hl>V%i z$S)m8U#f@dW4h6Jh}TDuhxuX{w&`c7_6(8 zAfC0>gz`ggB|`lyvgCKmszrNV`UM!gJ#{P9o;$^foJvZ2P7+vqmdV%Ka}s*M_EdV4 zYc1(B7we(wE}LqasQnuycrTmkU5`GQ=c{QitEuFdKDbsrR3Fn1*IvKv+{b_MT7uzS zBh>VRG^DK;v~=K&@i+5V2My`r3yzEf-D&curC0LG#ryP~qx&=EsmW$#ow-Dbv^G|s^8qq2Mlf;-NRPG0? zh?&n8XTI9Ze{{Xt?~v7s^D-k4%D5KO>?0&k;`rRHGAEy%gdq;`B}lBI^O-P;i+p-z z&)fdTTE&+!ut3SpH~opK!4do@(x{7+61N)f&G|j}mx~s)ed0vB?T_u`pJ{K`M(KJn z3UZiGYEJ9=23}23TzD0+uDu$xv^P(PB8}ch7+evd8GQs*iPy*qYj}DYLzk2)Z}tK? zxf8EWUR{wcHRepx#5O=D^qzz--Sy7D_?BI-v4MeXcp!FNpbbN{pmwjUDA#92lJe8Z zr7`&*@I?5WoN`9U1EC}bG_*J0a_;8((M9E1k#w}Jyhb{d_SYXmD>UUIyuk^A4`#BU z0_cYojY~8%O&H?v%M|6M(G?@pbf1~3aK+L7NdkrC819T=DTdo)I1$5Q3=1(Fi(x*7 zqcP0Ia6=5UF+@LBo`Rt;bf3v2p+R&Opn{+4t-RX`Cz0Hon?j7LQ|4MvTT%f7lwGIV zAd0baVO5lZCqSxJKS^1a71nc^7X!JNCD;V}Cn4_BSh7 zqt)b~kgC|ZmJ}*r%gz|` z{kcC5YOh+>tm6nbAD#Mic=hWWkjpXzo)+WKt`qtm@gZnGb9fl~R$TFF?FRIz5+r=- zR7v#e*Vj(1N7oMsqV$oO-QRvxX3smDN9|$V0FUknlw;juYEGEzovc^dEhxmgD|I7^ zqTK?IS7!OEqLa8l#jFVHB($M`Qo99$13hxA7Z@z41=$UFlv-&4dh=b?;!Lx9e_&c* znA#suR=SoTv~#jQ5bS_}>{hmx+(zV_sFBoS<}Hr|{ae;Re4dri?#n-9gj%S}(;s=K zowq;(81DqcfieE1{Q4KY`^5P5bLQ9IHuKGHm;O9T?B&wGBss_0qOSZ4NCDv!>S1V~ zPz85kLS-JUlBGIY%|;k>;*O`9amtw>LvAqYR9||qdaG%n?y76)4%rM5;oOGcaL*~V zeES!PU?x;VPujm@B z_#`e~#fewi$>8cQEa`n5=3kBeeP%AI!X1-W4MaWEK6b4>AjDIMXJ2D1c=lsNRuRFo zzX1~2FXgYNkaQY~c=maH#=(|abJ|m<9Tofd@_$rj zu9T;elu|j5*!3<_&SJQDO!Jc8Z+pW>SCnxBGB%a29A(tfO4n9WTgFjj%%4yhTff(q zaY8a`%9M(OKCSs%QlvUPLg^PGsk0I4QR+cTJ^Z$}j-vuw_$WU0E~%hruM<5}n}xwe zK(@Z5)auH|ue9p4dYX8aDk?wt>p%Or*q`thC^M5$%d|l=lfPi&;QspOeap@t1b=;K zn6`hwyTTFaimqW=p#h~chMiOx{q<6=DQ<#WQfrA&KO${N@OL6nXy)Rd=T=ne){PS> zjq>EPb%mSQ+cZUL9q4t}TF{l(Q<1+)w()({m5VlRH%Zo#LFVG;kwcdP-$+z{2mQU_ zyXCiNlrYGAF&>A^cBz9q6S^avpthG2M7O-umKxQGTfSyyA8$t@G_{t+h*~Rz`dOq< z$cP$5qTILrV$xd`pVDpTvuyO%ecU%Cm&n$YtcCK5O1_X(JLI2N^3d38NWQFpzKKlw z`{yq`lIovfQi=;=`lC%wC{`;z_0O8*;aXbaa+gK3Su1U_c#}3|R2#B^KN^3*OK(*0 z(u+)c>2>X1`T!!Pa$CaEAa(N8&m!ya8nFn`Zjjd{4Wjst200`~BvwiqCXNRDj1 zK}MlhY!KfsQEF?CwWMCw9&aX-{n}aY>5E$b%~X3xYDpi~^BD5+T5sf1dzczjJFe;Y zik?0PCsIm}c?}TsSRm9d=n>!xdW1;yn7Mc-3~gOxms4# z<=ZI2=5zVG$-#tMOAgEQStgVI`uzKEr1cqVU`j!MzO62wi0L!lm$K03Sp?JPJi0@l zRk5Pa8lirs#tQ9XL{$ys(^{84b+1F8)3G&`8hy?Ym_8R%`jp3LV0|hF6K*XzEYqiY zdw+fY;=L(-N^g16HWz-ECpBwwaKW!GPSKODZqE_+~W*bg-gaKWbT zR5(C_<|>keYpDgzy@X);oX2)(ZYXLl+tyroyM^_{mNM|3__o(3%2RwwdHuI3vnd^H zSVe_*UTE{x5%M z=hO}@HmI7KyhW&=DX;FtB1EFauJNpU9hy8OW=g9Q3Lgn+ zQ<6)crWEw&H7ZI;T$?($FJ(=i^L-tPtc!<^xk#v=>90hFMwFGaD^mNbas8zD4khl4 zA}A$FoFoWJWGo~~gkDjJWy)v1R^p()H6&i9KOJf4ufO$QP3g~SiGHL5=}VQc5f-n# za)-F4Ki*0(eNG0-7XDKk@0UYWdN%&BxL;|1wXS}S;TjyKoiCc2&Hw0`m)7#dp_wZ$ z$thpkT>Un_0#+5;T>U`YT(t#pX6mKL8rlqHsUgdR`i1tx(lDYTlfxS_bMX!slE&1% zj>eo6Gx{hK(wNf()|hhWdSl9|yJBOu_sf;uL|aRG-(T%m15cCD{*98o*Z%6}udEOI zt5#XbFO|?Ps)y=Riq~Ghom{gCav?$3Uwr_D+x}|SJRAI3vr_h#1tcFx+E>=mNbtRBjo$gDCoZ5?V za-WB|&T2ZJNkm#nq`3B8>ssoN?6nT7F4}87HHb7yXho&O&Bl8h{2u)27I1M-uxL9f zw%2Of+qEgJaP168ed=O3XoJM%ZW_3xY7*OdueFFkxy*n!(RcIQ&(uGH3^>(r^)LljQIzM4jpzI@Li~3CQSqO)l4bVN{M(WR8lzv2Zk7qy=`+lS}m`Ar)=A_Rq|y+a;$& z@dlcH*nA-zpZzg*C(+=Q8yhAWM{)?QlZKfD>niVai%bE#HQ_|bi82HaivHN0>um#B zE3|DhUuvHG=3w6V3{+Pkw80@l>+p=0y5vzDVHgCL*#}uNKULRW^dhaVuo1&n42Mu3 zhP!T8W)AOeyom3zJzsA|u>|iBjvo+=EosTJqk3SHpt$Keod>K-lZ=`}gh;6)mp}K* zU_9eo187Gv^UK%kYZF^{WZv33X>)zY*36sNzk#Y@S)B2c3W<2!F9l-sjJJq5H*@!= z+b6nqRAK#;zCLl%jxCutH=yq28xe2*3Rk~$Cx2f1Ij-)}mHxc;(_9_dk-7a_6#Jo< za&ef8Pkud<{VX)^P`~}7+_+CS#PuLI_>!aD_%Js$&IgY zV~K(;__F?deMjc?-w^SD{vhV-DdzR}@c+IYnU7z&P8y^_4<6+9gSWE89@%|lBy;g5 zt*}vFB{tYJAzf?efc`{1p7Ey8nXQ}1E-!QvpN}Xb6&y-@r%k$S=#PK1YL+%``;U#4%|yYD}3!HCTH-6wQ2@BB&ovaUWvF^d%~90_)1 zJjDla%&BL@_~s>V4d-N*o=Ca`!6q1k0lA&f3}P{wVvMLdQFCJ6iMkVuPBffoIiaaG zXw8Y76D4>wLbel*N?7O#=tcyVm1cP7&yv~D{?%uA=a*cI3xU50-EW3>e$}iN`42(& zo8g^*9-eaK-v`Y_uu3$KzBv?&Ruv+pw7;nTXHiX7Q1z!EIC%(u_ur$;( zb#O=t#Sw;)b(!UQEG9+f9jB3VFePME#Pc_+ z*c0a?-OBdF6F;X8@a8j4QYd@k2LmyB##2Q+Vo#V|wjR4|N9Lz^cL4xepgC#P2?G5v zEfR>Xw(SdX1^Z%surDkku`fb@7}UNn?%nsFv0y|m`{Hx=V-?K~Y+s!D2H6)sb<5KG zN!Nx+hE*7mPH6tJn2Hmc0WGHH#Jm%ACl;M(IMH%q$fhC8d07IMPtJ)FJQ^;tFA6AD z^n~b$UMtxb&aYf^A6VVKaDK_Pcwlw=!ueIRO5|V3zHt6|`16r}CHunptME5seOIzC zoWBfz6@JsCJlIAILB!9k2(renzA{c2OTP}$?yh`aOXqos)3Y5z zju6AGU|!IQf^&+zB&@vqSQWV;8dI;mN#3@l7)?JP89N@U;zxez5vziiAXh*DrGnrQGiHW4?KU-%YGQ? zWj}=OFsS`t+`I38>Vgry?1y{SWV?4}b0IAkRwngY#G6FGT*8><8yB!{0zZ z23(7wV}?$pVZR7Ab=VPdRjLL{^APe!$bJ|ind}FdAF?0vx+goCP#*Cd@j|nScx@pY z$|WT>W)h1zvx&zS?13LS$x2F-B^r3yswaI$xoZaakVOK^tspQj-%}A-ABvDqqotx~ zemU7k)fGCd55;J%dRabLA6cp-N32}$D%5i0x~SZM+`4j;4^UyUopHr$I;;;_Lc()n zCKJ2v*w)x*wo=^Zl?!22pGFXbol}@4*b&0EvA#B+hRH)7RjUjqN+d7WbMgA&_h}S< zq0{=PsiA1JDxq5+a*FyU#y;rNt_fpd9y+y&p(JY2H@(h z&$1A6nus~266H+{_R|Qh_@U78DOO#S;&X)h+1){n6jL_lgnn2kL$`GpEL(1G8!W|z z*Pr|J;mi*``^Rm3kVYp`Oe{{3NGzE&pWPKq8c8R-f_p@UVr6#-`(Q7=Wr~*c|hYzYZwCr z`=Zx@pXL}G0x2dR(MT|nQ^v%Xp!G9Vrsy(sDe_OI_$$!9bC8~~tHf6$|6Gc{2JJf& zX^UW<_O zEY@9?)I{V@pYg~M?`J>K7FnM7O5`7d&c%ER&_h$9+#zsCp-v?YlV6(_V(90bqR)3ho?biw%l`A8ea<(XDC{xT`f`fZz8YToxF>loRc zpODRx`hflz&wXP1(_dUihDk|enS`d z%ypRQW6ubtmnKx-1J|IdngFYP8}`SxcbHxk6^Q924JZ@4ULa@vmVF!cBB2ZDV5)7v zq23`EMkqTxJ)>*{6~)DY8>4KtQF|>Cy4`gc+U>3; z^sRBEwV+cUWKa?n^Nj*CKQ$0$+Bes4%oS%2$?`>4jYBE#!4A-Bkox)y z+K}4tA&qpSv92Xa8tI)Wx(uDI2WXf~@mHYxL24oL&!zZl(ET8_9QhYg{B`JlkXnoU zhg19w=zfs882OK+_=nJHKS&)q80srXb^YX^`$1|x@(WU(zo7j4Kx!%S3sRlG1U)#U z7U+%1`^}FTKeOnAKA9uX&&FX5If$E=`23c^t1-3c*)R>ogeyU=B!zW?KtD@kAHfZA20D2~l+dcq& z!3)w~%mIymp)VSL@}+Gwt~nYYie?x|QIc4Z?ndKAA17%W-xkNEUX9Hu{`CXRr2C92Nf1>p~{c3pS*EHTx zFN0-Sn)OJ@(pbecK#~y zg&04b;;%qE_)J1Oe;GOpzjgnPRd&kc*Mi$tjP3I>$BakHXPE)GBC^<0l{M=zqX`J8 z_4QfTtcoV@W)3hkq0DYH$&yQZoxRlj@2@(BMRq4vD9Z#ZbP=)Q%}+QUthlxK2v!V+ z6~Fr8-dOQ?1_l2H#)`}0fD=}vHa8Zz6!cd&r?G;sXkU9`vBH;o!ixDQ%1T(_{KAUt zjR8Ye!V2dXRx}2|iZG3Swr#%bIClFbOQGF%MGeIgx3cx385<^RNE>JUU3iigR=0Bu z3y&9VKD0lLHhkz*kkbA>tK4*>Pa0@FdF#vnJ=c?;d;IZW(Yae6!J@&i=+1Kk76mt7 zj$Y5dff4AeIE?!s(DywXH{Z3sO~Pw+!?(Zrn4+yG6N6R=V!glQgvNXr4^C8_s5v2K z*(BQueX*mQCZbR)VUhDI*Tn&_$oVB#75-j!%VlOYoxAxynJ_uV9s7&L*>h6sCq9OO zEuW=jinDy7M5GVJiWL_K4ax9{Kok^O_d{LpLUkTG7o%_8ofdJG_p^ zg*G28Ox?9@<_p?ekqu*zbj@=Zar{H8Y|0X=5wE-bb{>Xr3YJ9*lGK*FIj@k0qMM4l zug{I|eh?_yo;Hg#Zf$T6x|dUD!vSzjqy8E@g?YblxI7%DIPf|pxwt-Oz{_> z%kY~L3XH3uIt?(Mo*E(q4z*t@T-K|hYvM_kb8Y)zG-~j z(B5_bLIP`@x>^cpb=;|7ai1(6TzcMg7{A3CT|JwtTh$tN^}}4DTZU0EPPATvzJ7Z{a0j*YQQb&d1zwC0?My z?A7525;NBq&eoPY-*>w1h;px+tUOsxNbWMImgUY1V%L`YspNjIa<9dHq-|$%|Jh!- z^LoX#<<6_tuWKpyQp|m4$Xx?#ne5rM=6*W4e?_^M)x!Y;9X>+#*Y(Q%^tI;BE7-4V zD)+o)7Y@Xc`_5ju^Yz!YY351f{&|z##tO0%lKUHb<^H4iI$O1vL|j)|)BY?=gBIxmkuRZn9E6g$xn8#U>ls&x&YY>1)vt z$w903@kJv_qQY+Zq2xVA<413jvArOs-8ag7Tc6pp|C`7CL}E$Z4k-nEV^I|os=}cF z`&vm(#Q2)xr=kg#;;%wiBEP&^NN;&opnW@YGR0qpF2ElK0^CL@+4(bH-F%lFD$@i0 z1)8~SG3hOjwxBE$oxJi?=M6$ z@tj9%gqGF(X2}Eq*2L{>M6Lok6i#TQXlq2V1=%>XT zbY96{+Sh{SpI*^&mI}#SHMQ}n5SSigL5$`mTbDBJ7H9c(hm5%ApBGlORxw~*1*t$4 zqVJ>}&>tAjpShQ|J%8pqscKF`Nn?U2=|oO}A+DDn-_RYkPSRYYR1?{C zz|K9^yu_<%lcujL+Z4XmW1GovlW@syfG)ILdfidUF%^!+F~X-!E)L#Wh^3$qXjKQ3 z+@ZrcwBAHJ&G0T7>v%fAhJ|aKoTDojQ=pnYRwp!VP`rw55?ZC|MuhWrp==J-6DOua zc8?vJ8p4dCx>FFWH5f0Ri&%6`}HLDo@-4AS(5NR= z6*>)(&M%0}!5_Le+(sx_YLl>yjrP6McwRy9=<7+Lqpc_7Ix_Ut9^h!%=P1;OV7Jh{ zG~yB@>jQv6GLj~Y%OKBKG`s_oPEccArR0Rb!D1>-RGp|fA!cEz?7EUfg;q}WD9S$Qes-PnE7#fwR|hTUmt1-H zO|}|^8c~IC(2{FxkuJ)i=J9LYQ0aPp;IO)I^oNNzjbAqR(# z8*j2jWW3p`iiyo9K{wf^iF=yVNIFe|ZnCLAQKFk{l^)3UE9VH=t_;AS*BGl#z}DM; zJm8z^pcQi^7OSE(aUakhF`iL~_!eplzJ=Pp`I3#QE%m>|9;q`BOH?;xI^2XcN7YP6 zu_<_YoX3QAgQpN;SPL5wF|Z*4Fxg8)6JLkuY$dRW+J8 zT+6buXH>0O{XKPVxION_rZAABn_|LttH(_2dOxD*$Ac0)mdG8eSy=+Yx)@pQ8iq-$ z4YO#TaiQKSrUuC+q~esznB9Y^j51fX=s=sVyXQ-qiJZ|Novag*PlJrSqN)i-sBg|xUJaz9}=c) zwO1}9Jg@G>&7-V7nZbIC5Ye$^+BmURTqV|U0!gzb43;ePM2xSg2C0Rv^H+(_e|U93 zbpA5@HS)J^QX@|zst^u{0HK>h_~FwA9jzPApPooOEP0oVqY>|f$7G$zsprg|GCun< z_5=n%NUKwxZkQyRie|{FP-#hr=vo0YXFiKPc=1!)SSjJuE9->aSlPMIO)nkRh?>3Z z!NLoBqh|5>{ZX?(vmVeNq2_1*`zomU=F2v!;%I=CWI&SsI0`(31_Lam6H+BO%2x(L z44)71TN6gWTnI5;27g0B_CZ!vAVF4LXk5O$rCJ>;vi=<{nkSvFjbs($e zL<2R-?}4cP4BDQEs5mPabk?!HXA$)kPY;Od$Pf;w{0jBr9}UqTS+6i~>Vd4k`Is&f z^G{AJqNZJk^@xxwA*%BWQ41eg9Z{WMh&lwnHE=eJo8V&Id>2@%W3%e>ZR0XNp}JMZ zRl~mztw~CgZ&)fH!wZ_T$^c->NgRHVqmeYpYH>Q9Cye*ytkN&_t^%6~5Mz#LOV&bk zWozwBB;-iUHc7T@ajgUsXhJ_odDZj_pOZF7eeRP2q-s08!7Zf_o;ai)fp+s##+~jj z5|)1>G>n{i&x+}Kc?`v0swQs)7JY4HA+Ow zOiyf9=sfW~Y}VG3dm-!;xmZSw$+SV?yEj@JrG1f=2wXMdRqHNa|@$_?YY zb@1=kPb}sZVx1?DxfVrP33Hv_F!!UYW3KZHb6b5dSKBn&k`VT4qq1$mR!=nE8baof zB|%st1hEM?uI{2dd3^SzX4e+%H3OD~z{3c^sNp8>^1u{*;J>tSbBJ5&V7+j&(-eK^ z5p>(k19rahc<_@N3O~PjR)74=(Z9^i32*bOFZgb7a~}GFM%l6A4T4V9#xmp`!6Fte(=QNV=2~E_&6U$SqUGVU-(%4r`7S% z`Gt=;_yaCcs1Y*m*vn>?b$kRW7eSF|k@m7j!&1L(kBXfw#&xOz&YpF0=BoQ2Qap`N zC$z#e+Z!R{*N6!x1Xva`Z+yOmfofmY6h7~Hv9xOH{d_5209^W<;fR-;fOsu0l; zAl!|oiEMv-rrEvze<<*_7s{r!%l;8IMeCl{W z`&*BF1hjbv;UK+J8L&XfGQ6^#JW_?+u_GK4*z9;W=s0&LN`>^sEy@PP8c1 zZZ(`(bfWIWyc3#NjJfJW#fh>LB_}4FP>djClrjhTY-RTL0P-X7k1_6)R`U9rV~&tt zF2=W@8@C1iCbYj|u>tLGra7GAUxc2I{D+|37_37N?+*Dar12qApUsl@4zg=|XpMY-B*g@OmVnhW(PX7vA@~nu9mrBb7 z$#W!GrvHL&&A!KuLi^&PD9=lEeD){oc8 zPYfmxXkw|8UJH#wgqAEzvIA!#CSZwme|SAJiS#*CG0tFt`+QQ1Cr)MKo8N4K^URuy ztR_D5Xr63DPI;n7b)POVLMlJ#pe2iXhzy!!AGx6X=ZB~2nW<;rZs+`E{_ib*XY*~l zkF3vJa^3FxAGJV+Lz%M|r*2c04KA{+*qflA!vEsJQxc)J#x3h04n+l7*s>0SFffA@ zVF_l*$+k`*$~H4~-EDd@VEtSEKc0L#jS+#ixV$i4>KH9eDP_`sq2p*wSJJk;+ES6^mwIH**-J4Z@1-wU(@Qa0Xi|HB*8bSjSsG7SZy+>FarTuw zGIIWgYjmMA=&$^kWT1yob30XGA&xL*#HorS3TJ;7uQLy8O!@<$pKAUiU4v7trqC3&TLK<+N)=2=DY}GgJ>3gaZ}4@Z03z)Lk4P+wGnX zR9G$px~H-A#ZDnrs}Bb%;`Lm-HX%4cAt6#WzZFZgitTChiyi$=5^9`?)yNzcl}nQ}n38O`DINJ9QuD!N+GlW*dPEb@H*S)G9H{Dxtfn=b+t9y$^bG#M^mj z!$W$MV5G=n8cL_K{^wVHQNY>Rn|Zu|&zkP}E9Mwsk1$g>Mqp$^C6+8kffsWkXOJZ?bN8Yqo%es9$M7g{85$86O~AT@>WC75&}7TYK#7O z&=Uj{mT@&L5t30!8g6sH*-)JLV_o=~#R zTZc#n4bZP^$#TdUN)+y}8U*4Km?jwK%zAbmu-msm<@DY4i}Fy22DH>H zX;kP)yfz_FyM#!=sufGLidAVjvCo9p0CQ=%G5MG<==%^t86-mIP^qKqD0ChHd!XxG z!^0ro4Ti4cGyfW(^%gR*e2{R_Di~+?-wsBD9IpX7~2R;?9oY5 zyFIF$5}*u6DAgHCM28a93;g{cbROb0=86j2(Iuo+^iD!c)`hQUf9pHoD>sKK(gy`N zz6!7%Uj^C^ExtbXmVt0pD@@1LN$BIiRbimxs&FyjYVDBW>Zi+{xT@bX=E0kjopwgGU}b zBwVx#f~$mXvL-7;;TZ7=u0p49)qqpDO0;nGeVD2d@XJk|mMYZL+$^CPf zW>)fyIDZR$wmufuve5lJBhJ4FPd)Ol{W)T5fuozJ9PKl&9*ABxu5=Ioq|WBWdm&68(u$UA8$KYebXuGNrS`ZxMW;C z1fG}7?k5}^Xnt!TsLyXr=;N5*WPkbmR)-Gr+vRne-@f&~+VdM;mv6_*LA)+^^NN<{ z8{*+^DZkt6qIbR9OXs)E81GX!-wo=jf#_pu)YLP8K)za=8|oTKS205Uh#Trh$!wR` zJdwSBPs%u(uj!*>`XMYl(%u6<0ql@vG!_9-&iLq{|_r@-t%$J*+ z=seqI?%I-iG1m}CUfdgfGIr51$&GN^L6WPoK;vg{z;5y%Yu7 z2kr4S=xU4~%qOEpDxp<1lH;;05J9&}0lHU!=tapBAbP9dG~n}LscSaivpAB&egQ94 zRGnz6Z;3Lf5QeS&EUrvvQ6&lV>p*Fl-U42k-Nw8UO6P5O25*ls_ebgaSB27KI#lDo z4FNnnX_T&k9FEeOBOa=iNM`r@KQItVmk`2HTGsLLpfsvZP#QX*bOAYl_2*mp}BGZC1RfM;|b(a1x09-G| z^h07t?~+D^j>Kydf{IEAUv$7`#S*PzRa#E$?KO$zhPq4`^gWGG2DQ*NXh-dR(0Qu6 z%-3_cIowi?%TfC-^0BO>OsgZxC3Mu5x#6fScaNiX1G*cvl}>Z>8N8=WeP;Zqqc&@j zd>3j5jJ!N95#s}|iwOuhF=YLZd9y)`koqv;sJaQX*y|CUkEG&T(5)ChLI%iX{K~Ai zk4L_px|C029Exo=M=nBbmC_rv4d1c1%M@U!-F2SM@jLi`0)C4(h2O#%b&wLF^-7I* zs#Z{=@C$&x>YCz8A#y3WPxQH21wx^K5r>C4Tln{q0BC2ee1G`Miq zTLLn&>ka^)hQnmf8fzR~$ZOXm+29P?z*VheZwG;RHZ<;CjMzQl1{xQn7MS4%0C1Cs zLh@n<3?z*zJQlA_2#{JrI6}i_#S*PzRoaBu+W>C4p*|Ca5!Xa04RC>20~I=eH=+9g zc;U;zsdU%*Ghe`IA8hXX$i(tN!bPhf=uMcQH*|vD&Gg;u|SS9UG~ z@E=J#l@epR2BcbRRh_6fp%_)Lm))#*+1aYBXk}CScyQ%Rr{a}aj`&c7V`K#)WlyV} z!Xlt;a(B2w3Y5~v6_Q45+1P9FhqTa^WVaTe1e38QRT4QLvAV<7u4$B{Jt74~!0ia! z!CfcM4wp!lrWSWjP0lZc*RS}T`$X#8P=}3pt)_jLeIh5#4}{kZ1a-V_LLUcS%Sds& zu0scFd+u)xr@yql1E-tua$ujxPdy`g{H6V_lPDXI+dlRbG5xWdg2!Jiq()G?npZ?k zXZ^!koIC0tNry4Qx)XQQof53h8wSQt)OYzsRCwYS(S?TY`>qHj7X-{8PSL{E{UWE) zfx2w%Atl}Wh+m|H9vq-|LiYjaKmEKkzTCn-iI%2Gtv}QhGJ>mwj?r__j?w#|-xXny zQMAm$Rywuv-+ibDK)G>DOKhY3|j(PFPffsUl&ThNUd z-`B!!kVz;@xdGDs{30qPZDAMS@5Jjx%K_JQPrN?N-9h~$<%rtu3^4&^CaJmwHI!wx zZsYjuwv9X{iPR`aIK0ypwIXVlsf)NL2`%pxQ2VlfaUV&YLVKZh4FGW~dmr>eXJx?9K{>(^z)P4bz=_{AMHZ%fSFx>k_qpJWhW|5lprLWHWVGj#h&{_5OgvXuhgX& z-)qCt`bUi#7%{JE%UP$s1)6vJNmNR26kkAb>SATf!8RZ(L?!n2TKpq6)~R2G2GP$% zGl(Wq-b(#C?C5#sY$0;uA}L4=xMiI!UZ8_`2CjiJMjC$ccVexLk#XF z@xdiOcUHp_<^Jb%ll;IZqnpIGCT|RGk~7la9qqrB+$0Hj!yCZ+tD2SP$R_P3c{UdI zGB=6vJLyRC-rs6Y$SGnSui}Ja)VWr2lZ**o;88XW2W)7MS7tThE$1q*7K(sai<_iG zDV=6_MdfNca)&)1zBd0zH*g~VXv9zxuO@X8IZvpcbP&l7{MG~{{FeP|32mhe_fX6Y zawL)+3F~C4gog+%VK?xTa66gmmqPWEZ*yNtgBvMSSNlKAzLbCXlYvlOf;y@mTv6ph||~fPR+e-!9EBx6q%)=oAWQz|uIDrTissq0d35 z{VYFlI2gq9#CKchN~czS$$=gSf8PV0&jc|GQ0TGwSscI@$s->HIs)zSE$DKLKkaY`hOWO-Ik||rfqpH&6X#ONPb3U zaMZu$v|~ekb*H3%A&&Z#T?Ze`9&^wTufCX=XDj(>dZPYI{xEcnWAoGezYi_Le)G$u zo?Wu*NBlJL#nby(Z{-<{J|U0akQ5QWj><4{4^e4hHl09X=voKidCR{pJ!Q%pQc1^VHQ|`@}=a7 zI?rNoOe46zM)Lt}q@RsX!+9dLG}jMuGLjv}{4y`j!1IBe3u%W=0rja{xcdjP$0}gx zCim?$kSaAFNJ$T~Z|8@9f1vqb;-U8K{MGN-d~oRtI_86S|Nrd04Sd~2mH(ggF%|Ge z7c?ruMWd$RLxQNOz;c5r{RVF&N|Cx2H!5OKc8QW|&;l2eEV+b07E$Zd8b#N#iyD=M zv|@Y1LrFm}z)!8RYDCa`jYxo{l*jzvpEEP}ev_tYK-}N%|L1+RnWr;n&YU^t%$fPl zcfLLu<^%X0pAW?T>3chim(71Z*tE|xn-3&TMfrjp$&{N9G(RB@l1I%41f}_4j(wk5 z=Yu0JbE5Ig_I&l|qIhxwo= zNJBx|217)1iEy=QYW z2N?FWXOpB4{(fA0CupA~(u`;MOJH;D&4_^F-i#9R*S>MF8~&%eH?toCG-DtBuX{7F z5)GQ?-pm(A#QEL#X1IC2Xov?jWT4a@OYq7!5RdQ8jCfl&ME*>#T=g`{-`O~e6+V8( z)6*OcKhwRL6b*^cF>s7|g0wdi@+XNWf8mVsGuxXv}Yq=)K$0y4B5BG-5%y3c_gwpNa>oo1Zh>XX5hhPw>Q?8jVwuNO8qKe=!|#@S&1 zvFzy>=O80RVR3S_{GwT23CeOb-ajI(Crl!G(~Pn|Ouk>1eERduc2CYklA5!>Z^+(I zbhDo3?uouQWjY1D?fxlgC!q=OkVXC5RyXS;bD=I z;w)E)WJ08sh=|iEmy`%5F7S45kF|Re^0j-C^Z9$+J!yqn*A@{8N(S|{gXLaO^zcvi zTBlz0P*ttf-4$Ntobh~=y5T&c@WkHtkx`Kj$k14OwcxQxDnw*kEhj@HZggke0x?Jp znjo99e+;&Kw{tA1(8C#S^9%nYY;=^V>(CaiikW0Ef`#5i{4Z;vd%D#6yszSFVH|>` z{tFyrkqBsL65WSD7nXYP&}o+Xt3DYlHSCF7YLf9y4^84S*Zb_6m$^1ydh25g5rcX9 z(h?Pugre{`xx!pKxe6x}Wu`HI1KwQgL`zco6W*`4gnRerJvJctKUQbY@BT=X_3n=o z?eOwu?y4uJW_$6+pkbBmbWGdn)~hzwhf1kf_TIl9W=Zp=8Maw>$?zEkcdrL#+u7<9 z8FB>FGGkD?s_S!3kIVd|Bp< z{ghK{Ij=eQ@t=M6v=8*sGh^`wv4TRD;C-1gh2 z*8Jmf+iwv}i{-rO_VT`m%NG2*a@JVR`>H?vg|i=i_|wX1wVa`QuGr_-pDOzo<+NGO zLz{ki*^NIq%%WQ?seb)FXePv&g1t!_n)r44@7dpc>Gps4fpUf|XTzVq_TmTE{&b6Sa+Y(` z2akO1&@B&+DQDDjdjIzF-+tzUCtBafENAq#wYOfhaNmuB*&`x)&|FgA6)zSnWf#al19;5mZHSyB z<9W&%vz*UYfBmSDx|6Gwv%_+J*wz2$?`-YAMmgh_v(JkUJ^TYddGQ~Vlee6|X*v7y zmmm1MR^?1u&ZiHnIqsgHEjdj&yDaB7|NQrBzx&6ppP`&GO_{?Fz2dWLzxogF`-*ZZ zEa&9EfAHeg`j_0RoJ!02=*lG%>BBGljB={TDf)|*2qiP-;saj37;BiD3A58ob11#ECb;xbk>0NU)x^I&DFf0iDW zx#m}{9L=%@stG<#hQeqQ4(*t4753(h7p@TIqQk9EM_0l{o6?@a%Gj;9(bvX@^I@i0X zoNrI2SL|AU-|>CjPe^0bI}=LUmpEDb2&!~WWv#vg+R0H5txe&wHpa;jR8AonMhP9% z{dWK`LqRO3-OTdL30R3j1fw^T%3e2X-@nk%*V=1!-5 zJ5b3~)R(f|L#?@O*xk^bIg0Vz?~0eo_@2k*JsPFl_C2{pphevn* zzG>OxKt)s6F+>d0V-+90H(mFuy6sW<_0dRfzo>3UG;)11Dt|Z{*;X0V{V6Jch}Z#9 z-LInZ8-aLURL6&bZcIi~Bk2{}*N>*_?rL7KZGA?sJKMa5s2G(j&yDJ=qc(K9a5|*% zyina#d0o!Uw++y@088>iSW-3%{gfZLAiDFn(XwCbTenj;I{Kf4{;2M$rn*PdD{|{M z2P)F2bKuzq;~myY;nZlfVwCTJ7+eEU3z7tt>$?(e zU^J4#*)%d<-?S{RVX<+;CenA~frjoZYr+{@9kFpkca;rY-CYAw`TejFem@zF+yuY3 z!CUw}8I|8e41Vv5%Kroe{MJyw@9U!#x2zx4irn$nqYiDte@R8U&ifmXrSzsL(NRY| zmsT%&#fhHnX*mzDJ8|&|kLZ|c5VLEGw5l^=Pb2WOuU%oqDy>4t~N>L8$-~S40)D*#aq7UX3EYTwa19?#Xp5jk-FcvUL?6mi;q_Ke615 z>v~z(4lFEY(#WUtB41i4BPu&0@@0$bqwJ#U{5!5dq)*Oi8f~`%79MIBK#i|)O(Osw zMhW#4EvHcTehD60I|&1=wFv2XekAIN18Oii07AaFul#iO)EOh7+G<%f)pC3U)S|ke z7Q+Zwujd>9^~=00YCQ}5*Zy=0@}IqNz~hdxuddGD{7rRz@xm!qSoGZa6N{gC$|WUF zsM>Zn;X{B$LV~p`=mce&)W_&o{!$CrQ@jNFY>GCLHQgN*u;J0*WP=r&qk#Jut^V@y`Y#3Hn zI=i!p@AO=8@Pe|;wbfUEG<4C#pC=_Qyvo#|Y3oSpc1M$|%Y*AN!jDLcL^(y%fTo^Vh5AM&Sv`N^s5jb4~+UC(Tm zGZ54f4n)(Y(+%WENG4UHiC4&J#L}8He7T;c*aAUt5SKF|FkwEeQ&XxpW+7MCD+Hgx zk#F_sxSqsNWK3wM?zo?%JBc4f{#IpdQOwBH^T7{(#Wm@kZgKYkj~nWyQr-92Hut7? z0BabbRuQpR<8RYEamhrO{wpXCZb2n+a~BY6!Lx6!*3SMXeJg75_nzmB(IikLzweV} zj2p?Te6mu*Io$I0cbvHTq<5Yyz9b#MC_^8{r?}%z7ITA}%&a z!R)vbtyYA`LNL#m0Q1MyIAwXlDh9>QeKia#iegA1zWkCIwqV+1|K}*aW>V|0hO7Hc zZ6(Ejx(YuaO!Pt+9m{4ayti~Jxj$T-O_%;e2wJ#p( z^_igHHN^Lz;Q#bRz-hA93!#pP*yj-U1!;MQ?ZDgU7;)&UMn$9J(~_Yyk{4SE zK*%@^h4n<9IJ8(T<;Oi^lXlN_=PxK6F%kZTh|-2jy@kwGCi1=`FjEa{WucCg zRu;RyR2nT22B7n5;g`|~uG1O6vcSL3`3{T{hRzHU2`h(<#2GN_qa^iB>CCLS@=$NqQV+Ajp$|IviS|Ym&3t z)H0P21T|EvxS^tTly!L^L^2`L9wMzFB8^u~wLe5$KdW2`3$-3weguzHdkCqhZ*_I#GY`C#Ot@|6;7v|_rmayz^~--Wlu4aO)`k2zKh}J{ z)>~Bp7(-!#D#?sko-Bg$&`;4PCd%Y#5|O#n(}j+ubyJ09N&xKakn=i=e3C|M)g`MM zG~Bvg=20mWKm}oQ&(3oX7OG&vRM^n?TzXiIb-K+Ej+vVHr!!w;-XRs4#*=k$sP*Z(P%xcaH7ACKIBusA5L zrTnBR&b?S19{xIiNf;OAGv9}4Hwh2o^Zgc~-YlHyzV+4h&DmY~FMYy2vU7};Od$+q z3K?Z5&^Dr|L(+1m3wD=qv2&ENp}@`)2JuN6#b0tGLfFbnSm_?T z$+fK#i99j_!D^le^<7y#PR)|*5uDnqF4m$|qH1igl`mspz@W4Auw;TCUM*{SC^b;6 zXjL!jPpcK2EHVV4g{eW7Qe1& z;PlY2iz^fhr#PgwZmSn-t#|9l->Qr)irKnW%(`U2QQB^p@%ss5>)L+<)-ckkl!ybf zEJtvAHIBi{jEDy{XdxcdK=8P|YVE5ZpCS6joIg+C5Mx`ELzx!kNhl5*VqOSM0^fLj zQI?#=vZlww5Ke}O{8KBc^ixoh5cROGOGd2$8k3x+e7?|_o{^s?4igPtSovr1T}0r7 z#nni_SrLn?&5&Q^<8}A(pep{p8~f3J6d^@Pbqj8uQT1PC=SH+f9$?5N{2P4e)^8{v zX|G+EZA0<&H0#NIqU?_K8%t*BOKvGnXS5Wzj`?TzHa9UbNvH48Dd2 z9F)nElecj1I+^T4C$BH|GzDX2VaDO3rXi)LuQas=vEj?9sNY&ZuawBTb*PoPg(#09 z;5PTIQ>;+KWBO-!AvdF9^e?QAdwtsQp^t7|TGU4ahv|kL?zO?aFyuK#Y|!hYmZxu_ zsjbS`qF7NMr!JyJTGpyn<5xpiH`RTYTZL`{)DWVMibx%0!-G1?jt6zDpggE!CGnt+ zX7imoKA%$|LeU95Rq8tNcH)zwQ_FPXGH0!bqS)sidu=Hafi2JkMXeN}rd!49iC6y8 ztwQzaB@m>^EUZGu1q;SJVR3YG%8bo=mWKNqj11?F+UO0^O|!QY8W0S#AtOC1B&6M9 z^vY?Q#8fj1TZx1vX&Z66XTz*~%?rvCj+})IGvSPdEiKK2c8vAUi0IpZAD|6{Adpx# zR;P*!QVef#K`PhLgSZu-_*khNe#TReLvh(tzakZgJ>sfR#KS5w%OfsBr$<~Wf5wlv z&b*k)^MAx;yRW8vepeUzJL7#>SXy{$J6ejUKIWh?EJ($D%ePY<@rR7H)X;dTrp7Bi z0#crtBQU>5T;k9FF#enGn9d$moxfl9p>J``J&WnFtXtpWY9H@}Z^Z{x#O=J7_-T8? zxsmIx7mt+d0dKf*+f9BfTTCX|2Df z)?utCXk2;RDqxR)!c~>KNb;>d+3u2QpKNu>W}lQ70Px#Wuc7_A374KN#~o6YX(J0!=NXOy)%l~p70O=^>=GRhuNt#y2rffA`u zWQ%CsB%&HNCHaeY&!Hxr97(~g{0jz)&$Z<0$`LUi7K-GBl59s*K*urD>)($0%{2H4m7bCV#45vXg&(_eiiZH4xFj=2D6Dd^cGD@Y?2=l&j{}6_j`>?sBQcY-aAQH!K| zecC)eh!ncmM|ljKz8H4+q304|D2M20#t-E%@nbZU%Gjb1*zP%mA z_HZqI-Ugq?Xy$B%0L>YAl=DK-OZ;`}_wZx?*I$QlT#XidZqA2#;FJB;r zBEy&6q(&-fB=sw|gp^lc>>HjcGP<$4MGiyCvAD51a{O(qUgMbCSl#M4o32i65u(ik zki;JR0pqTEY}^$O)S_Gt(^&k7jAuhH;Y`*}`m$YwNwE)>w)(s_LeLm1$9-Pj=V`G! z=JR$C##o5uNM{2JOOMUz-~4R|%;XLEB0tam+H`)VXffmY84-85 zVNr02JI3M!5-$oa@uJ`o-y+mS4*&4|rAOP(rBqm3Y3T=Q9~-NY53(PcFX(r#|mI7%RmyD~TBCCSH z+cd9v+UUfGlKsJ+xat2gH;+T5=5PK%B|fg(RcLgV14ezp>veA|Fg-*vAL6n47gqgo zxS(+Efv})82MSsb^wo~J8qieSNRV0n-|%GHCUXq9IwEtCe>vwF{5Xw^C1O5(k&)LB z+IWfS4DG0Ae$LYV*fdPZQ%_70gK~t$Jp#av-G19gi&S6i?qzN4|z3oVzeslw#_T zPvS|%2VJ~MahUoJ3`nF4Kyey#uB5 zzj+IpHPEfX8vIWR6U%vl#8*lwbn7Cm)Kx#J`g-cDCiT==O_D$8yF8@%8vIJ<&-eJ1 z;29}jjM^woGy4ZhYgugu5&e=OOu{ES#R_3^PBMgMoCsZ+Lz%X{ zDJ){A<)ZCd6tRVTd^w*#4<{>b1JoXX!Z}KqS`YHrK_t9hb`pC^QSe4y6)mj z8rs8FdYl>>5?KblSfUY>UTajt0k&V{M?V_#N^LWPNy0!uVQD(2oelA5l2DUK#!&b) z<-2@&i`+uWZAhqZY0B4-ulntR)7mjm=d$DyXsbdXLvoy%Tv|1{Hyv98@d}eZtn#6} z5#>`$Ap=5y*>n`svZ|977i*Fncq{! z;0Uz90CN!7iNdp}B`M@bzPq>t9RjoXJLtn&no&AMsIwZ%*IASSaRBl+5GJ8SvYpbH zkQWiUyl~zmK*T3<R4Ap~L@ps~AQHd!M zMaY5Mv4DEduzJt18MVFQe#>g#E(Aj+SpGwDEF%pew#^}g94luN#zIG?8f;TT+3WHP z&WvgCn5aR;)E6PQG{d-qeD$&2mj^AjH07PXd`O|wQr9l@sR|&&9wZ~wD8L|sh8FHk zE61!l+9`06tqwpPhjtEe4w&#{$i)zHv;qk=)|g&NZu;)BE| z(J~F*M&gGvcw3dRMKOCJT_g9^_PE-;8u2s)s9l+L3EM_q@c(D-2?VvP1U9C2sv_h! zoUF|NH<$8`CRei5a_WdHS-!Z-y=Rw$l-l2T)gb&HgwwQg&E z_zmPMSG;SLhR{jbpg^arTv(^*y}`HmHrk0Nte!jeDvTRQ2jK^;1V*TYI;S-JFRl$p zOK@!dBj3t_lhO$;_^47mjgRFsJ_ZkonlC|N2>EB!*FwcJS}N?o1_+4|%8&X>9)h)whz;;XFSV%Qa0oWt z#{tZAme;x-`iLL9MmCazcZ6j*@PRRHC;1wa`y*&^A#h<8L0H1|fADkNEI2(y+P`sqvnruibj zSk#wzZ(3BX5_#Z)wgVdt!=j|_j+J%Wr^YUH)l2W1Iy!nC855O(FwX88UBD|8yy$fg z?z`|r$~xZW*)5t?P5O|iX{=5aX+=3ehY-qDo{}fCKh^ZVxI~vq);q} zI&s`+qqy#_!VAHXI5;CzdO!U9#|^x{##hcL3>?$UF3z!9=~eBW`KAv%IhFYKq~uSK zp+u6QQMAXm4)WjS3EJ8TdyV8tCVP%XSTYD_O(d;TLvsM)He*5wfdqGE3!xLvX zg8hURL7o33r3+yf&Q- zxI|o3O4?K^9tK^}Vms)H7Q;bTQp8PHuHGfNRFy5lxLHj!b71@67AEQ8V?giho0Be~ zAEfg(TZ$;+0i|qmXi5wc2_}u;FsXyil088B?9L69NF-#%6_y~JxCI^Ku8EGn6UR*P zP`Kuz!nswcDvP{ILj8(5=Z1fV&I#J?p{U!wvMx6@rkb@Fot$?G>WS|U7R~$0w>g*4 zTmwR{11ULrS$aUIq6(#{qO|g@9MlnM(WPeOpT8jEyc_xGmQTk5u0b-?QPmNSjY?Cm zl`zz6BhEjA3-vOBi`A1P*Rp0PVe}Uf6Ni0+zh;f#dO!dKJMUC{?^qtn_EWxSr#@mg!Hh=_d zvP>w7l$IVSY$X(>?S%S?Io2yg%@(}qjBp6OHjq>vT!dl4_v8{6_dt;@O3hj5jY=O+ z)(jz=5J+{p@9Q?JaotHlcWMNCN882@vWQlI0o6y#UA&G<(%j(-+IJ4k*WCtD-#TbH zsiHVHaNP}UG*;K=H~j$(;ck?!8!OXCUS+#ciT)cY)*1VoU-= zTC=*PMG;KXt29khtH7i)0uxzcLwBtao{B8-a!Xw6W;3QeSL?BKwqR7EO<8w@h#t#S ztLIU<8we4lnS$(k0x?5jVN&+bZzAbgiM#~o(Rn9jx6W~#O9(u^sBhNJK(8v=%-7A4 zG#YGMgQ@OF%Gz7EeFrw9ZuGe@^^>05x(`mAVs}1tyhqb3%{+%tNS-sZTGY2HQXkFA zFv{W>aAlkH2SX}mcn(0RihAx?R}oD)ZWL!>M~UA}Mq>`LYlw&(Ftb6n0j9>9t`&NI z4bczIcCj!mrznxsD{Q~pnVE?A^8izRCTIh3ZNKUl^ttx8$68!^K7Ox@OPezHxVUDJ zJbG*RiKl#B37vk*mqvy7npj-g81ma<@uGH8w>OqQ5Q}dJaUS(6Upq3Qr3p=GifIbN zmwzX7P~8;cZqEoATw@3>g_sZx-^^de)8uA8&gG{(3n$SGdrIZKIL(odN9-SAwbX(P zj%>3jfxPOa_~u5rrMO|eZHX=(IA>j`U% zP_o}H&1J^1kaUjxrvAq2BUC7RF5p46n)PQ~QL>Gm;8x{RS^O2er73Uoy^}Veg z@L|S>?LL%Icc%f7FJIT}J5FZ15C}k=8utWQMbbH+7D92(5sJ$Bvd2C5Se+%}wG&@Qs{+-r1BbF7e!6X}PPw_(uN193n2zG|f<`Mqz&|5E5kJ!k#Ae!H zW<;Rs&oa{*Ix$P-VwUKTHE|(_Ff7f9Aq!n6w5V1mvJmka6gT_N zIYMX(vf8lx z8XqQoSmnb?A6B?f$9b&>2q9Pr66I|qQIjZ3YnN%Tkmbu!{NzhfU@psEh=4#c$i8ZGLC)RZZCj~eywo>Un4hz{V z{p8a&k`#^Ooh@ijp5_y6V3v)ZDBV(dEveHuaJuDnloIwQD%>USR!-wDL2$Zf={?=_pNF(KSitv;=s)=rv zW&9y~ySNceob|Upd1TnRXVp6d$AO!4}QOy=d_)lY3zv8FnGK7aRG= z^R%r)?_ppHGUB>7OY&kh>zCF>9&T8K@UweIdZ}T^%z!cHFfRUrlWCp?^S_n&?T_8e zmTOCG=0N>d55t+GjT#SzZa|)k-}jKY_Kry#(Z6~av#xfYy`9NrZ-d|761B%H(Myn1 z%a=M$l?`7(uIphjB-3d>g~5a$GS@we2)Q(C^rCVXmFY z-Bh)-hmkYdclR(_p-&!$h4f7#`&SR+uO7z#eGlWP<4ejs5L4y@CCO59DRbHEdy=gO z&8f^wV#++9J;|WVNt7cfGcDV4VexB(}gxA}L`z0+tzOTQ_G$)8=Jc(xSRE z*XdyvmP&^0$7g-X{cLOk#g|Z;J-I1v{&V~OD$~MT^=yHS{Rz)JEWNq( z%p+VW?3Um&Cs>2dmJ5-ss6iC=EZhp)-6un9;w}&LbL*fY}vyFr`zL%M!LTF&lJlg2zp{lv68;qb#jG6RkTjm1PQ`W3FDOSD?v+?!qs0Sph56fA!^`(o;_18( zMO%Z=QFf2pjF1bLA}RcXa;FK0G=Q|D^cDeb7DWE4-u4oOIK z2V_E8DG-OHjY%lb+uQ9h%|w*Y<$c{L6L3-*m-p&f-o&~;oqbRz_#f- zpOtoq6p=IrX<^7?UDZ>1>$0vZ&A<1^+4|}}h~)a}k7ym{&&+QA{$)RXWqzO6J}=6S zMvw4e#<6H5e@ry;*o&j`>!Q=Ivr5ZHX!yY>ap-mIRVv*6VB$UdefjD|We+CSj6Rrn z*M6V3_e!1^^x8lGbuUgi0CB-y zpwhvk3UP&fdxh{ba;=c1{h2fla`a*ic6(bwPl0bv zd0lPfNq-GXS%}oma!#Xx^jbLmHZ{614pevnB2OG(>)HU#hJ4MDmjB=PV#Kq^?dS&@ zB7P0=S0ii~Wub!!f5v=&hm^T*@h$yJ%A&&-|A@d_%%OcKK>SA)Vu>sy?eh7WJoz$N zt^PI&g+m`~GJR_!Zu5o@Q-YDgdYrXBEgWj2UTO3+Qpm6h-f+>b!2;9b%hnJwq6XJV z{jh`IPJHrwnJvzL2rm=2%JtOBo@ikDq!MaR;-PjV8is3@I?@Q4OKFMfWaM&DM-r?$ z>Yvo7sCycM@SIj+uW=KQtePsy%IT;08tIsiYY4sS3B*)S)-RN+{w&XF4PAVaRt2e^ z3*CL!VuE#q4yq$kJ#|E9s!SE7dM6xB#jc}&+($!+OZ2{Lbp8z+Iezi(hP4f+G`y$b z?@zhD>(N)P`=r~jgM2kHmUoUz1@YzT%CPoa!EM}%oAfgOAtH53-=7l$WYTMVzDzm; zWooX@ZWZb+hO;ltN#lbr;Zx|^lJJsg9qcEqVX?%pc*T!XQSQ8&_-=zve+`2Clq?Bp z5iGcwcHQ71E!a(wDM3kjG9@gUBeyDJi()n-Mty7b(cB&RU2hWJM!ih1noBb_u?+O= znEpP*{MixSgmJfj-5l{Hn7`q|XLVv2&BPFI7ol@u~mi#H@zYTrt% zoH%@sC25s}CWP3wuhq0a7QS`xekAMlhFyaHPoH<{674!rb zQI&hWi%`gA0=BjTJJB>-v4(G}zGu7Tgd(cv%!NuHc8w|MuOLv(n5LN+{75!B=d|^%3!j|I z-^uL2{rS=Pe;l<2Mx!jRZFlJE#`V=n+4GIQ;UPj9l$!m1ypdfL7SAm@2T>W7?~FG0 zQ^>$TA^x&LC>$h27A-Chv++~T0QM5MF#{$;T%Vp6rdE67g$%IxH;kpQq*Yq0(i8~> ziqnMs>#J+^h3O0#_A*dYHkW_n#f!==1WHHqYYkj+?l61vMg=UK#bR zu1?nNwC|7F=W9pqUzE7I@u-&GMIT9Az3A|+@dU|5ExnB&;Um=B(tL+@M+6$HScSr5j2HqW%-c zqUzaCV z;!7h9-8Uz?8ATS6Cyy20K!ow^nrd|rp9~Nh2_UX0=;ZGJvF%+`?`}>skMTwE=EU2^ zK)k-L++n^xV7?{M^FCe}aoEUp*luy{LGu-bRTN8p`cDwPrbP27_?i-L8!f!X-ZV*9 zk4M?4N(|pY1m2~qN5y%%%ZHq^71ta8PDB95AS}v0EFux>u1$ke@cy6kSpPIcN&kvn#xP>Jr_)X=7X zEaFPTPdXe0?zK4Xq3aGyV|AOM=sST!Kqu3&p!cj_gsP7t#F7%Oc2Sb93=yUc+!w(` z1g1jo7&fK*_OEX4xuXMqbyQb)*{LkCyz7q@>Hf6{7S^N6SiT8#d`41#TN+OMP+7y& z9Z}Z}Nw|Cd4Pqc%)w|`{A8Tx0^=a&$dmr|shLaoK*>Fm_s1iB=H!O4>RgfTJ5`2m zZFSYky8BMUKG_Q{zte?&+27#3slqkaP+`S=9s4#--KdJh&;4mr->Ryn?5g^v#CKLD ziKL8|Vo}UH9+<|zDhi|QElt^{#J^6F-aZ@uwsTYS`@bgsxh;$m7t%URd1h5J@A38; zHZ#+(9wFh*;V8SPy6!%`k|Snm(@jh)nP2tK{7^p$wN(lX3(+Emtx1y7I68i+Ojr?1 zR5|KnG9pqV-z1|VtWhsvlK&=wtl|`njo_G1kNa@ahvp7Yy%K)tXXBI3{yr_n{5-#= zm7O~Tn>JUgz27VI`=`20^mw(dP_WF`esDoqnt`e0(+|yk|5!ylaq)|=$6Rg2;2fvH zIgY_O&JB(@78@LWk9^wrNIfJzd}$sD=LK&|Usat^7?bm)fNI#kW1N1#X6wvx5;Mg; ziF=hoIS~xp#~HYtiC!5mi5>l0TU~?LMg6>b@8?(4FeT||7m`k4N%uP`&^1&j5~d_c zuD*)sMonVwO#pY4{IMc-&9t%US5w@_cw)n9f;Ia8p?y!ve`6)w?7AVSocl z;^A{MvrDxY6JuOSpa#r5m~oI5fp3||7AG$FB#g#TXvLi*nz;J9sp=aC`&V&Xe3j{c z(@jeOFKgJgs&Y}G3YU)#VA&GgpBDIX$tWFd5lmt^f=9v_+SIjc=?{dVDRIJ%=KfO; zVx-UB)zsf{(9-+^uV4k#AMr}+>V-?ANA8Laxs$EnX!*@i`7hEd?oM2+b(}G3QT0%H z;mMG47DeJbp!WDpYo)3Gh=cGVxo!GyZ24o2@xC!$F?{6eMmfF!-wF+hW+Z0!&zyP#Q4oj2KQC+EM7 zKhLA(7=I>TzLx?13bc7mXk~=INwU~un*f^^scI$pvJTjSXr&gGftf%PB{kY&HPZOoZibfrvE#x^%Xf3RZoUiu34gT3 ziOvDEYW}74QB$?LQktrvQL|*vl;4flV8$HHw?e&>WM{*}qGrf%t#72<){^LmOu?AX z&k=WvA-s?%dsKCz`@3ql>%0o>q8k@9w_wZHM8j#ILn{(2X-H>iB11-KLTVVAkfO|J z;yr4jZz*rj>J4P|%gqQ}KK6int((Py+(n$v1+qvN9*x-)&{}Se8Hc5Iy2q zR4rO7qtj(%>>-v-rRI)KN8d1YGX1<>1_06MHg8vxV&tU`M>d8%3HH;3-Zeb~|6x>% zdU(Gc8rS`UP}bl@w1G)ag-AV^sNApTOL{K!o>ApCB@SIxufHd!$U5Lt6rGmX|2qEj z_4jv;p4O0f-U;p4?@Dpz#e3q+x&?Zte+NP(5qY;0seb1=!@&GuSuNS|PLw!^M9J7| zz6|m;2K$<`H_6B&S~YGF-80p}V6SQw0jnfnNm0QJ{;0;qZb{2gPgCoth0gS%KPC^} z;AoEQxe($C7xAa-vGdM*hqwbS`_O{a5T3z*jTs79wTTH|FH@ZPy2#(Hfe z*eYu^at<*xo$Fwy$8I6$SYB$M`8UzbA+Xrg0j&-Qf-o647jC720~^H-ezWDdX>(|B|CHl(5<`=jig zk_);iD@mU!Xtr!+_dSX3>(vWbh}xR*+?qFech$uwWVLla* z*9|6FE-W0ubN2qXJleHu|HK84VMuUp#&B+AHs#Bhk&}B%{IeMrk+I&&CYqSQlXfd4 z(rGoOK~I?;lj zFVVZO6ykJejOcda-e_#EuZ3ZR<+bL_etRnT=q|}6A^I&Tz^E6NK^;_dDlbOt4#dJmsdcHK@ z>lwWxM&KCnFU`ehD=d<_Co>(ON{rTLl!}c0t|f|$7W90HzF1XhKgrA||DY!L2W*Zq zmsDw*(qj`%s3b0`t{|bs^yNG=Ely+^O=Nglej-y?_%N&Ryh$jhfyIH!^X|y&m&t%zS&yDTg`om=zXI znFr=%9CMAwd}JK6+-hjH^#>lU!otFNU>=NP-smy^#zfuI+~P2=A<*JnVc`m!Smu_E z);Q)ikNJW)=30lj-eXo+IAI=`b8*b09y3ReOH$YBFt>Tk3JVVlfQJDU`p(B>{)&fm ztJd^S*YPZ=+jKR!VL3!UEF0*%mJfw*3C~_6p)5{eg;5xD?#di>6`neU1up)z4>w&* z6Mj3vyWsuTRx4BcHJ2-;vxvWW{^mc) z0|@QBOKHc2g(PB@Mz>@5;JkBT)7Id;?Z`pqHb{6-qX!J-2`#3Xr~S6x zDgOETwC54Mls9L$xwUky9H<(NeWh@AJ+_wJaw3VVM^;>)=E}}t6*47T45*W27Zx7iiL$`Jnbuy1ZK7(wJgc2Cx*k^diSCs`qJ z%f*WG9FzfLio1VuMUk$=)jUfHdoJx0A5=pd!3@7;ZS<3nD_*!C`E)&8)w`Ch?X}wE z@~nEM{WHPqI8e=M-lKmuchaQ7!g@7Hnan68jS&Qr6fdk*xe6Ff8&KkMSHeceta1{z zFy@q#092BbH<~l(H)obxBFM?^+Z=nAlcnZPbT_*X(;A3pZ(az)J$ih`=iqac*cD84GIgKqqKn>ig9Hl@vs*$ z>p+HGhB>(sfJ$8XA$W@esRoM{dGqc&5qloUuoF=w>ni^?>_l*oNOQZ{XTxp@UgIPo zzjg}`z|DpWVgn`_zjly7lZL{AZZ_7$I~V5RIOd$kd};YtDQh2~vW!SlJyV}55G zbB)7X>oF@Vykj1iJL5EGJmx1VVl=lo%xy|a+d6<1)qWhhu zTAt9v)nl=N%2HG~N985CTc@6_dp3JE3Oni9nDN+!g$oh(ALt4G%DQ{foY{;Tv-#}L z@7%?l-H>?84P83YKK~wf{A1K-z3q5Wk??p=*S&3GWz=;xdm}43siV_6Q4vlU=}TWN%~#l;(HaY)T-sYY06 zG@~*vasRlvNYOEXt1U?YSKk*W{#cQsKl)y}!m5I%}^CS^8-NG78VX zL3?$vBeLQ9N;->|MDEi1+Q?Nl$>{lk=AP0qDDDp+ZD+{3-GSNVEc_)&w3Q;%uci0NY{Kymyp%uWF%I|^2MP6)4Xkw&4o9R;(LP`O zw6ncByPW1En#k2Le1DKxeJsQKjrRo^3-5Ht12M_-IqgV@&jYv2hhy$7=&yK>@iVG?Eq%F!4 zo*{*>qs8M@eWlmlv%5-6q@6}zrA8p_r^UvyO(T|_D@0$5ViWJpDQ!m5P>egFcmv*yHX)z>Lp ztsvlp;M-bpZeAgBuL%OzY_3P8W#k{w!Pel7g(!dLe`eryt;0& zifOv|f)$fCUDc~r<`BV>dc6iM)zNFvB1kfMVt$pyZh+ga!&3Vi-{C|4w~2N*zsem&Y!`i5Kd#KjXyouFHyF zrnC1Y`tyerTUUS7dYKO^eOT+m6roygA=K|Q;;K_tPUK~=%vV}mpfx^M+%*osd*cYU zKxO_L&lfr!Lw}8i8c##bMYegDsJYDDOJ4J(;@ABgr`+M}#B%3%B$o3zE67n}qESjQ zP8#e&3-%$GI>e>EOA1g?4&?VpC9dhN7V)Q%zM8Z!IWqmr%`1MH=)czr(9NdoeWk(Y zy!Nq)tM{$RJo<``=Vu=MWXFD)N6+b~aGYL$4_^j~mKPEi|GO$LJVT0orClf{S&xvF zCNx*yA!eV2M-$gq)9o{))_NaGPcTj~qWm^*izTqKGQ?PcKS=b) zX@n0qWqGe$P9ZpIqjJX}<@m=K7@xwSRM&Z6`iGRPe?#F0PH#)=YADdwkUqx63+Y4< zHi=pV2$E?UOHv`xf0^KAy^g(b-x@doCs-jf-TFs!{Kyeg|w)ch|+u=U5Vxq)zeytwhg(Ko`czE)9{<_D1xO;Yswo zhKR@@s+E1L)x8n2<%t*}7fvVSle-Zz0Cb^CRkQ*~bSsLrYCDHNYtAY4AuJPZ?Cq>n z60-b)qd0zU+%$qZFYqRz^*UWRwA99dzKu_+jZgl0ZH%#NQn;Q!dO2(oitHV8LL@!W za|sdS>petl%qQ#%GjYI)k7e9TYh{Vcx~uhE)15DNx{>I=f*hwiBjcGzD-#!NAR}@0 z_NnSylb5X0M1Lt6CxS8-`lI$zW*LT5(~8>?{cqH5C?Mjsx(A|>-z;LiBAuzg zib#8yA}jN6;Y7Y{Kvl189+*GkAMjQd9>x8fef$E0mSZu^^!ed?k)<_!8{@+_Rvf-< z#o@blx8eJ@FcpdubaRkUKVwE31IgTJ=Fe=ymA2uWUh$Ljn)PZrJwwt|GyA9026!8M zQC-xv>&=NvM+jb*_}q2Ln=_AI-8yd>*|$Xgi6*Cu)@l$^TJ zs+7P5c=X~DAVdCIOYT9~GF}J{2x8dvq^zqGm;inieyj$E_Yqd%!Zc zDE+L`5jdA9?YdwNQTl=**h80ce!$1Vfcq|4{`4+&9pbuVMRaMDD$*WRHJ%S@2uj)` zQ{lUu^j)rZ+$E1_$e=_BgXd%pH|5Ddx zR7Sei;?f)e_G~0Ml6lnZ*>zF>qN{mne$`mC;t#TC?hL8ynwr*9z({~0YCko?Q}}L$PntcCynYfKK$gow-&X@ zYG(iRH0KTBkseuXET{`FvdIeCp;yt~>uXdeFA)cEq@9qESPxwB#ZQ zs8LW=mzy{`%KkJO`O~7rHCMf{227{ne$;1w+V#7o(TWF{0ny88bv1&+`lBvXNk>Hc zu+-SpgTxRCCTRuH!Yi$;>(N)Ndw)z6_vX)E#<8|^UuunR*6IG4P1i+Pe1$dc78VUt zV_I2!0Pw<6o{ixZ*<_#S-VRjy$ZOqF{-T4P2Q3KT@M8ZBZ{kD5Tjx+Cm6;mt52_gL z)6^&cB?V+_qF)%bUX5;@PP(8s3G!*E(bt3ma(6&(umEGkQ*)56vb|b>093L7cY(He zY~eOb6uB-7ESmhT)XZ%#CFdjqi&q7^x$K-G9)Wvwq#3od$Oy(kNgWz0j0WC>&-(3WUsw<%j2A##7zB|$g zZ)|(y&3mrZRa<(q#);n&+iEum zx5%_LUFc@Mp1oiRbSGq)AtByQ{7vWYc}i263A8HgNf!f9(y+1<+2n;;7xxqeSx|Oi zU?9l7CtS0q?H5edgvsJ;Ot&TLG|snrW*g_*NE8lzfUB(Bh1Zo5G`edP(i1l-yRV?C zfYS=9G!I(Mr#%k}kLE$EtvN(#1l{u8JSb8mB!iGM|9LPc+fGNu{E$akx3aeU>GR;} z2S~)P^2M@#$&NdHDnhJ9e-@@JIL02pz%slvdn{;-Y2UqN29xS{HGc#>E zqt`|RQ(@ty6wWytUZlM&6Q!a-yNw)Y&~6|WGiZ9RWp0CZg^;-osBf?%pbe;3XmjWl zC1HIg8&L1k?!uJcMbz@9tHAQ+3gynna^&LjJF0|m93vbbm@kgOIF5}0$K!c$90HD6 ztay^KmKCod?B(%>4gCx&{vk;!GPeeV!HTyKmm!^I682=irvc4rw?|AW{2YFjC5rar znb_^DP|Sz>NfR({w`(lnxFFNqlk2QliJaEo&zj(o9nxA&b2ImA1ag2t=F?y*K2(t< zc5m<+EZANeybO@kg&$v#>fV{i-tsVs%u~5U*N9??t9ND|TbSs138TuR@saU;nd3)( zvt-#w*YA#5b{h_-o9ihq8`ht~Ak}7(l2!^OC2fRANjpI>T_nwe@5!CLzl3BEH2T3D z>heV4-;ODDd|stk;PVr}%#Y7{urdpu$H^9-^Mo*VlHeKf`G=1>KG!2x zfzP$X{{npO)-XCxt0T6%zWEvOc;du)X--*ORpsavwnH0m3-NzCa?J#JqS57W}^J=YEwvki6 zTI-c-iKQ~XW5IF6bzg{CJ^N^>`dM$1ntPd0 z<$Zl+R!$(mpf)bsRCf+?Srf1?P z^Z?WlJn%~pyqE{|69;ITl}!szaBV?}r((OmiJnDF4n;BT-zfxex|5Ktd5gCb9~L(m zzhUKJi*pL6?_(GUV$yE)W`T|Q!vQvFuzOlZ3u==ff@J(T>u7zTNYvY23i8>io+7NA zl<2N*BN6uOZPIm5RdrY2$oL|C11TdimOm=sF`HKS%7TS@pIrxXcF3Cb@hL6~;h;jG zrGR=e(dzTteEyK-U+J)U%@F(=${9CKK^Oj(HV4FYqO8bjdfJA#CosCvowgXu#Gxbe}wnw-7%$jK~r|yUU~2$qjk58dIkIZg|wEV6%T)O2XjjvkG1EN~-cBX(L? z9NPufFk4L$A7qfH&EheZscf&aRREfMwi47|X0{rS^DIxI@E?BpwF}v0+r@-qlKA0s zbX8^6RaKbAkC=D_prm1y30Wk03?}3ewN+9dL2nXdNqy$j9X&hzkteq*MtbF6hV*Wu z*7ka)tsI{L+4EdEj?ydwMw+((^e99Yoq? zQ*L8*M&d94GzKTF&nv9wiwj*-3)jDlzYEqM==ahatH<;_JabgVDIIOm)JU}A(e)2- z`1-MTTPGC{(B97qM8zD*o23Ry1kS>)JmF6 z?)^2hq3>K0vao4tN!0h26!TKl_es#4Rm(0Q@EU$d)#+cmL6`HoWziv{b=#w(FHVhk)0FGVS=`L`+GHRz;ex z<6=~Fu4b_EX^2s99bihM-Yziq;QUQ|z`fyTqk6PP_2@ruRL|lKk`q%=_Sfd!ODvDV zoXm3wW*5Wd@Md-~TrPs`M&k;1X53#c{4~U{bd$ONdfbffW1!z$ADq24%HG+OeYh$6 zgcgrl&d9}VQ7DF{QLk1u&a!_>XRpiu-9bFPMH1z1>N&4o9cb9uSiQJ>U4_CW=Pc_|sTT|ClOA{A7!~$L`q`W-QcwK)B--Y^xk_$-g&@9;!_4}u_>KWTI35^Oxwsde;p}d;G4tSvNJvZsE;>-BY)}!iAiVZR+BKHD!rz zy`9y-jJ(i|f#j`4+oo&uMGG$z`4%4JHuM67LtO=nV-EGo3(u%t(6I9-4Vin(8*=w9 zYRKH0Z0_&S*EXh@Qg5W~0}FZr(8QI`E$kjOt++qYe=t*BQ{R%NzPDi)?Xq#Ehhj$D zg5TPPqmZRsXMXa8z;Ux;1vE}8hg*EUZOvXOYp&rGZ?xZ3JVp{>(WsG z$-TRwx?a4h)nWd3V5AEXf1Jqu9D*CJdEc>9)eqMWtSW1`=FEwThHE}Cv9RHq&Zhn| zxKSRd=8r$NRUeZpQ%AByqup*7I%Q{@*1dD$1lOr%)MJURiCbJ-s_^tX zwQjMEL1_aaFus%%qmpYOwIX$|cyzq1)G(v^vp}eOyW?5_CrM_8!KvK7cg(|^(P6(bR{sI7`Qj8!mRVI z{wk)T6Q&#W3pq5QVsmdgP@TzW+1NV1jB{RP*}CNyu99hwwyj#ooN}hK>pzEYnxrc( zUQ_=GPer$HkGdYkwEvLhx|#MUartPX>)Rx~X`iI7nRFkH`7r0hAs-I< zaKMKdAGZ6j)rT!UO!=_Zhe;n+`ml^}=PC^QGJ0e-eS!GL_G04dQM2khSIMT2^henA z?K@Y=qK{JEA!;)kk$&b(u$WQS$S_)?gtF&mnYM}IkuzY=ZxwqChw#s_U7!9O(Rbp({ODch|??h5??<3qWniscNr4rR%j3tqUP-HaIbh( zgvSuPpO;S`^yE}i_J(PBZRF{zAlaWZX2-Rbj5uUper#{|5#ma7|7lZvM4@w^Vnb*B zo9*yg6EV~ey!6Sbh6@)hp`x)9iR{=|E^EA&P2;Y|mwx=kQ`Nt0$Ic(iAp*Tr^}fPN zAyIi|ef3ff5}ZIfl)k2Lij^YRjTd$@8~&^z^Lu8)-!mKjIGOHmXEMBp=YRJX+~#No zj3AS-ok}q$-q5t-kBR=@@|sw23M?&a{3Pipl_1E_$d$e+%#55Gat~^BKwYJc**{2v zIx!kHJ$`xOQl4Mfl^2)FD!1ql>yzoV!i2)yr3bReq{&C|z?`8QQ(>D1tW~pQO0(qQ z{0Xc$b>iR&68g`-GyyCidI7sAJ!dOakfc zKnhkLk49<4|3CKL2EOj1%KuMjfbjSYi(-5vK*V$rHbq!d9^{6$@QvO;kf$ud8ilPz zMJpsySsqeyv*Z$PsajWdWtXlGYhAl*ckPy@2qXnc3km_2QelM(g7-@V1850P&Hw#5 zGv9l^HxF&f!|HGUn^${h=KGzQ@64HV&YU@O=1ku;{G_M*kC?e0`JUDbp=6aIJ7Ju~iSzaR`wz7L*w`9YfRkoh@*sm`*rK%`O9tu*pm z*SyNynDMo1iOr`vX^ooFqfo-^mO1c^y|&Cj;NocXWz}Wv$6S5Rv~_dD5?8wH=qfFH z_P6nn|IM^9#-HMo zaR}r*nZ}~X!DG>(AdqO>oj~%5q0=1}eH>Y&MFL430?8Z2qK=AibWTgyJ1y+}SY@*1 z{=ozdzY%PSv7Zi?wgCBLV+>27f6(1S_MvmUeDc>MX7?cF>StWx*Fyx;)f&1G)hGgA z-2}?TLdqag6aXj!g)DSz~EsGjS)a^z-3@w8B$;_&UP)!%Ku91B&{xkf@4uiH$Iq0Pc`a)iAudUaLW;nmsH-R0LHeU>8 zLG(8?I6U|FeKl0YN@T|UxXOhfRI>;|7ota(kVg`?$=-(ZHL3xkMhE36n^@>k%8n~A z&#i`Aafi`{_RodAe}UhnN80x*%C?0&Zyw;DGUtW}EZ6RWj-j$k2wNxR@jH(rdz6fq|1KB&cQ`=^@c>7E0aMd)}rCkd6J9ysWub#-h!(I=Z#CFK4yX1ef zEINw}h_*!Mm=07yQ0$W)%+R<2EBXT*X$rt<+7%;PeuPmlsDh^ zZ`7!v89ew~|DaM2YIx9{C_5DJpxr;P87uo3mBHB>&m2ASTwdh2J`IOkc)NJ4hw*Ld zzN*vKM3r$*+FhkJ4wA1U6rp1*^KqB=UNuy;rr28ZlH|X#7q5n{D{kK;?rWU@KeTDu zl-<~r6@K)8&G6&L=?dxj2Ko#^KD})OSv2y8Ly+G9v%-$=W0pXdxWfo?vr0~aAfvxB z1X=Mh50WCxx%o3%MM*~E%J{8e$q_u6A3rfPIglrR89z}CLsdLU$4`ogLY+dCqj;0= ze)i2klovl*QD!%k&_OU!A6QKTU>c)GKEb=8Z;Nl49V&B3X!w*;mf!ZHe)p6#3|-Dvw4Bx-YCfZN;vaw zS{2~;g*U5?I7$Ylj|Zz($;vidxb-;-wBMioebdj7>N4|1M=PS3~q=sC4@J$kZyIz~t z{vN%Y#*3!l#C+xvE{e^E*`cAGEnisv3XP2Z0&-+;1;Gw=66A;w)vk>QTY8!Yp5igHU1 z*;rM}oEckK{oM(~XPc^}$d2bOZeoSjG`g;N=2JoL5v#bc;B;tESb-)bPqrUy<20$N zXBcOj;A%U_Ka9Q&w#NFEe~@Zro_<=3s25A1ps}!&UN_K(c>iGxT1u^Q8Z|~A<41WX zf=~%QYJL%z3?COOvG8`GNkVfl=jsk%wXw1DDb!L=p_aObO`6N7) z$(7FjcE*SJ8HL#+q=< zq4-ofBRgwkx~!h46dL+0RtYZM^eDBwsE?$L6)`)l`rjCrbXaZ{{PI0O~}6Oyq$t; zzOUYBkgraaA9E4|-xPGq2ozr-@+eLFSiK z!b7y87ZU7T-u^jST^SzDlI3!cR-K|BC)1BJX;!>iEk2P}fXCGmdNPMYp5CW)klARk zkDC`emX;2153)r&Szd_}@bGz2uX4j-YiN(=pyYLr>PJ;P<8RW?(Jte#n@L2UplCWf zntc?}PU{NzO_AM3sfS_R`h;9tjoziLxMeo_{^FiLq4e{?S^eB3e)%0kJI`$*5aw2q z2~099t|Wc~%dPPPs+^tV(p$wfiYk@N34pvGg?g8b##_xuN2ypk`mk7VmByudjdJ;w z-FC**Nl7()a4gL1lhDuzuLLeI$ytkZy)tjL)F_R8HTBQMgX@08pBQWLlCW)0!ZemZ_0U%O9L%_R$W* zQXoT5f{fNn6H`sAqnef-pqfe}6jP`KndM+c5fzeD^Gn`Do9uOL7c$g3C6Z}nUsZ1YoUhO=Sj_;>hHLlIinrm&=q&wMWyc$S{!s3LMKzW&LJ+wEfUxx;=958gtF|wS+c2TA^1=fX!^KnJAO)!yGn|-% zFs-OcDK}+U`7cA?bvoI9l14Iku3%G#WAy!KNWkczgg(II}4#D}|M{rtrE;7qi> z?eO7-Hw_=mM61bGNyyyvF+RUpO}tZ+%=lJScZ=!=zw`TyygFLC-k8T1xj)kMHZezlJ>(jfb&b>nSA84~s$)N` z+5!7I8@E@_*$GPgFf$j+5SV-?HB0%r=n@tu5-R7Xd(T7fLmtd)oXR1{xEr_NJ?Y$n zx~`WNq_f|(-UQwMgkUq{5nV{IOS<>S^End~_8$6Kf=CxSqLq;T=qt3s42F+(Du`gw zKLH-EvdHt{q;jCm76)R836+H-aWT84G&rfDfegGBhDl$#WoeTCk~#}2f>SIJs|X5Q zFC{M1FkTlE&9wYtwAe^+zCdT7Y{8Xv=LH3}ep-PFtJ)-o#?_T1)9ky?XQk#Pi03em zY&|_c`d?mz7`-h#`g#-YgWTQ-ZS4PD{=LG=79Eh96BZsMmbyXa5>O2<%&|s*9rL(1 zYijti=8abIK6&!)Zq^e17$K*2rt~Ot6e(>`)o6pNrdV3jS2}whtW~lov1ma#h(-NaNWv0E4Ey}7tGW+rvJvfITe zHk1_O)@MwG~P~y^`M4#hpjs_XC zN(Nc9r&U6d_847sDjHQcx>KUgw-kaSNeGtF+(?Ulv~zH!Ux7X8-uFLf0gxM-Cs-Sm zm%vXh*#$Q-Iiq_|@A#%ZqJBa+{?gI?16rnXZ)me?nv^p`~GkBZWJkNj8G zxggv>S}-2r<}Mb0bntT5Q%sI;FP++WM*bOCM5sj--h~SIhS}bS8++#L6x~n>s@ayh zuBhJiKyj>u32-cMPt=n!R2W~LTW6Q&A|JqW#A7R2z_av(uZZ_Y@6!hvVZ&flLG4=&|)Sbv3)4~?R4zQ(%feFih9!}pRoH5xK)}2x{r0p$f%Pk@6S2lk+qzYD5 zb-jGW~xK!WbV$&gsov^8U54fYA(x^I^bFX&950|Nv7Vx= zJQc{vgQ$4n%d!2G18)aLiyY!SS+-K4rb=Wyi7UinnP!xmLal}qTSd8vt%;(+l#^$& zWQ#82XK|k-9hhDI#|uG5ni3kiEpZ0i(>$Bg#SocOK-XwL$w{)MY7a%@6PZ!z@{Vyd zUcB5cWukHkLk+rr__9br%6w2|o&+@~!Wxe)k=xqa;~C9XX-;M;SW(&imK~=Ig^ul8 z8z-`)dOdC2)!G=-TbazN5_bmDa%oCICR%RxU$Iq^mpC`*{G6$(lE*k>HI>GNW1J^A z1oxzC00L2)he%e8;KrG1)g&91z~tweL|72Zr{tC>*7VuS3vM^n)CA zP35P98}2xqIQnM2U3h!xswZ*xll+g!K1+APb&{8@Knx#p$FmwgFu3Zc_T)v@;v-AU z@}_AzW<6$gqYFg4UjB0X?ptP6uqpO7ku=R|MbxlJ%eSQdWIup@gr(MTZsIf!)n|vjeX*HErLzx(*>x!X1*Fws?gaM3 zT)FngeC+M*Z;wu3+*oY5S8orxb?;mmbGE~n>MIHe#KEL(^?`Bu| z>MI-Nej%OhzfBS9EU8=1=a%Zfw4I>C!u3swvTHgQDC~Oa9qpI$3ub%>WDRpT{DyiA+y-m^6*#r~YQ}G= zqgo z@rO=&v4zz+R(7=Xif(SUEQf~!PfY`d1PGx|JBQL8K6HF2>>2=vmV1rXJ?INO{`}VZ zQ3(9D!aK#Md^+}1CBcp5b3xb|&e0sOQ?O)UXr~#_)o|0m$Z?K-=dG^MAj}+I zO;DD8Xa9xob1&LB%UbofCmMv7@`^bw`UgUtN+SGMZ37OuO0P&+G@V&ma zU-@$vL87iq`(r@v5xEWt{XrwQ;p5JZ3+9__P=8_?x->GU;WAxrkROngI^3eZwF(S1 zdR8Y?SfTIurMdFJYGCh8GoNptg}2_OTqC)#+ilK$sfFWqO}$@X*ZWKOjgSj4=3g!F z>hq}&IAetcLSB%#lQ8O~JfMz-X!X(CTt?}| z#AdD!x^w+71)jfSRR2kgZ%v}=bsff>2?tNYEoyd(9(ppr}6+F3m z*Q4f?1>IYu(t}LoKtZW;VSEVo2T$K!EuKZ&DX>cIvHf} zXY_>q227_;HP(;n0SyN0JR3kbfOq#^MP5yX)wI&4LY83hSi0FT<9xO;I5x8UtK zD4xC`?1e@@3TbHZsOk$3VsyC1nj^hKW|6hauDfWj8{6PDf6ZIX#q}J(vJb%OKgo=5 zs+lu5oY+YQ-7D9E=iAcG#yT26D(KK1A#Bm;tlrnC*A5!qg^5T1HgfA+>3j`@EDltf zKRuHYMPbT^Ez08v>FpgH6oBx0XE7off0}g`AMgvL-dRw9Uz^8!jm0IqDyCPh1m#z| z5MekFJJ2f`Pul7p1ktxemZ3swRC|Ts^DJ~nrGy|0ET3-)`P2`QuQ&zd6J%<47Nxl> z;mljTFR^VB+YEFlG%(@gMY1eI>PI-`%v=5|pl9m(F?_=>iqd)ue zHGCZlt?v!G$ODgWxh)k2bJpIXCJ@;eE_|hvsII>3`Z-T#ZRG#D@E`=%@E~n_@3yx6 z1~ag%RmT|d`Cv8wEH0te+y|B*xUoETJq$m{=^P9~9K@|;ObKHUACT0zykMne6e(Py zZ#hvo$Xq}|keJ_;-8vSv*Ql%s$41fV?1RnO$3W-oi@No4eslJfCf%|LJ=z7EF@6h+ z7OUEFShl?X+F1n#C3>g6OrypSJ|n`xEh+HDMHmtY)Kk2Wg59|QUZ%4iLQIEfa4OO> zw%{*xW03o`DrOGF-eKl@2DmxU7>Y+yd9ZZgJUr~Z1b*RF6RlzI+i=d6F6Yr$#ux8_ zxjh9(+K%xdNB`Vfa)Ov&kol=4N_m31&F0vX2Dawxe;L>SS9A99rtELzfRuelTY_^h z=~%FZ(-ywaSLRwsA;Yz>35`%oD(+AS@dMgL(Q8+HY%{}d!2yAvY6A9SLtG4?8 zEQ7(;-)}8pbF}4L>!zXy&6%W^9+)O#{Hzz|w=e>r0;|txgNjdxpEH;?CqU0CdIaZ) z?xvvdx8Hi`c$o%6yiGiBsfC`WsUn|G<&|%>-os=U1MMB3+q$fjv!7=7pcEJVEwRjP zW-oG9e75)$Kdb3R)|Si0mYTw>R>WLCp^X#kIr@Wm$zZ-+4J3XY@j zXt;TsB8&|NLgMfBrCNzUrBdW+BQ8gWEEX*Pt*Y)8t6$T1{?UhCP55@xdaT61hlpY} zbbNLipm(Ys5)1Hi5N2P%ggMMP!%Eg@C&Ghd-Kph@<4Exnlmk4)(MEs!8YaD_31g1)c8wu4C`L+(SxJXFL;0d@ArKx=>A8^Rf3tM}!GGovp0}k||jZq&#O@N{M0=+Yr8Y_j?2&r}Dwn|N6ml$g8<58@$!x?=0MAX7(?0tD6=-|!SBo)&a3WiXdKE=JWn@#o=V1t8GmBC6_*aCUN3jdK)H^+c`nViE5sOT?(E%wDF8 zQB|y`MqCa&l`6O#TPWl&ho_8CRAn`Y>A^NNxI&uE3K<3op-ovZOWVc|kkHodd9`6A z-@oj)dS(UPHXZ#%#$Qk>^mIGp-^xA_N{4NXzisc18~^sNPBQi)z_DCb_CMo6Arm0^ zC5w*cXG-m55_NMhYLyt;=g`@ho7((aIvJcJ>_mIxv+p=|7AFJEzEEIMsdk&YAGc)w z+r%-&W;y%8L(mduKMvjs7fnI@k5nMH;3GUJa}z@&Dt+4@0t#j8W*um~(fja#36zSl zGLeHYT`#>Wxavbdp(Hpdzvl;SzDnzG|dH7&z z=###dzr*d(i?w>hlvjAv{hkl-h(WZT^fE!VfU1c9+Rmn<^A+}ntcY1YxHxM-lr$Dk zf%~kbEbpUX?i0-XC-DCyKk=Ig099LM;JZ}@ZKOn^q09Sa%iH4hQcG%=(lmWwnL@1+ z&N)Oa@N-9tC8UKxVrb=@Qc_nUY!R5k@M6gPE^G8*K^HrlpJ z5{-2h2vyWQUcrOB8G{D6SJDFwoq>vUmC_4u7p5j~IV>uF<%nGaCMWE+4&ocLv%_8M zcj_9sDCqvi-g>;;z1Er_qX%6#Uq?3hTGa7@FxOEN=4gdiRmNKhZ4+)KaC7GIR>OeP z0eiJ<*Jav6spE~G1UfZsyLGs8GYJdzP=*5%%hb9oEHn(?EdNUX5MLmqqvM&|z^Hm< z5WhF1m(hl(e4szQ1PT(L_+hCwnA(qEdTDl?gm@uiaQ$4jF0UNF~TzS*;Fu{O_*s2bumW)h<6!Kej|+pr%ay(buft35J(#Mv#TQn^q+OeTzNzEIa%2uouzve3mmz z_siZUl>Jgmc#xl?@Kx=O0H`S-R4d}=!k7JamM#JBbX!_QpU#`}?OdY6XvJ)$#(yqO zi*f~4T~ct05S_T-%b@eEIsA85e|WGm{>mxltXz_qQbK+Bzw)}{39fCzp{1%NW^&^H znSE8*gY{xd#9$r6N=;Xu#P&~FZV#y3$AAjUQ|IIJufbfC*+`UVnQ8oq|m87G; zF;j-ZKRkR z+uxXMHgQ?}Y;v6kf_sR{jdb)oxZ2gb^uQ%yS&{YBHsir`n{*w0jzDb*fD9|CVJD0( z!u?4+@AMeXoM2

EcG;3oKp$=zJw9KhGX>3fc(D%XW}Ntn#WhHVSE^=(V`DUcjwq zD0#qOiPQFhU+zqftoEs~GFX2kIdYk-+rAEKL}>l?m5|2yJs&Uat+3|^P})L`g$!r* z+L$}x`mT{b39ec|eSPoO$8}D<|A@jMEL9VQc?v1*(%xuRO#Bz0=7ryD4!ZBN)PR#M zuvyr)coBVD+2c8V7mFKgTV32>+hXwoY(ph!NQw~h`*M&uT>^uUo$GEMACK(&-(cfs zb#2;7-zd~Is3di*CrluGPTUPD(qkMn2ANCsplgjLDyHH4IuM^ObY0wb|Ke@*p!+DR zVW1S@k3xDnfES(-EH(U%1$ge3;`5UszRT+of0;*o_Yi)s^yJk4Z+D|4xN#S4p-Sf( zeMm#gN+e{(w+Q;uzn z>}7F7$6<>X&@rzh-`s4EOKXoO3vmV};2J`$*kz*5hnus%9FO?x{u{*4WxPSjNzCGG zaT|+2sYdY{7dL)U?c%fw?qqT7lg@x&EV298^|(xryBc6m8?cQ5LH?8nAjreQHh5R1 zCA;tTSZvu@hKfhrXj#0J_@~Yu#nuDc;SZjE_7DRS4-L9IRFm*z<7Gs6>^?)ZrP_n2 z%|PU#$I9N)^kW{+qccs5Bl80E`;`<;*kiXi5WWJ03iR6X18cXiSgm+JyLn#Y z5oB&Rk-UJd$I#$(_LojO_bTtA7c7HY!Bh$@%uk}sKWXpEHb}=7vy{XW8-E3`) zJ35vaB_1ln*cFTH9VIV?y@$6S9QJ;k2`OH{vfV|?Y~|;3z!)7@kG`RhZ6S@n`r=r) zsAWxD3+B?fDo`4!>XutxiDF@ zEE@X-W})Ok@;OVyAelf%U{J1$O)3*!E1FaiW(i9jrzhYhiaKim7_iuwLM-YiF*>W- zFJ1v&LOW*&TS%AS>jei>&S~g^%+8i5w3&7k@pU%uq9ZJWXOY~0D8}H4tP=oAXss7L z(mD$nPsc}`(AuDP8e^YFWt6t(l)OZR*I}QOr~H-Mqh%tsK3Y(C z)cx@WSD`fqi?V-JTEyz8wxs9#zgv0zIl>!JtRyr#+O8^4>K5KbPbq^$-QU?n0tonU z2sfMNggFm|GI}N`42yt4D+_yF??;TN<99GB4-I=x?<+0+6aRdrOBdEM`5(M&uu^ zK#M%!v{{%7RQANslsvAiYMb-xGy}urU); zy!K_ip$1wP%d^D0gFqhj=}pvOjjgoLyiV=Q-KVKv3GK@o9wf9c_nxV*Fg6cftc)Ln z_iqTU{f0{EmNC+WA>Q^RdGFU%-jm+Gmn%^iTR4m(z32y)3pxR0Li5GeNls9$dA~|v z)+)S)eJoW-h6ZKqU0&PcpD*^$>nJGODmTOWsgwLhKa|&$nx@>auo}qQjLZ8@l@ETj zUW8mpo*9n}&6L^aJT(MoWfV!ND7TMWR?c=?8>w==RYendALKHSiF7!Np3-CJrWFbm zA}HQM{MOPf*#rscjV6Oo*~hbR$}i=G%jGD@>P1yudUYnEEE=LU%9zwDV$zzlv?){1 z${~p(yoR0WZ9=6ryJDEQo1KW~J9K)PdK8ZXa+W%;eQd$2xtl#*2d`j}e1oL3Lu{@_ zS5rp&ljG+*eZn?hTd2~iPJBW`>gi{A7xxtl$>K)U*;|k39V2hUk$qG<1`U$s5B&zf z)Ry`6Hn7bzU*nK2jcR7ke3=F%Obk$p_?SKO!~n%R;@ch|m#bueg3PY$9u-zLFPj`% zAcMl*xo2^AOf*n54oEVid8o0(-FE$O;Vb^aeSr*L6KG%3!eye;MaY>gZ zwtvMcYy#-p$v=|=LH>APtBeg72fEtQ1@Nw!&tOK2T7bDg$V=Fh#Z$yrb!wiFUa&-m zsCmL(3CS&gB2Vc&;j+2UTTbz!$EBz5_4CAomM8#G1^Se8>^uRH8%m7ZOE#XXRD^;Dmx{_pSYZd1S7JVCZW0BmD%B&biwy#( z8VL1#h1eNY_7mzaL`S1%nCj>MR63kGmnW`+CAqSex1Uw)uAiBU4-)+kG6&fg{mgu` z#<$R~HHY!Vf>8W2@1mzIgKJ;9{P|*?ZXKn0GfyE6-gG{rpEhfo%7GtH2xy}OooXYj zA@{^~mW`*$%JLh}PviG0e)I485ygsDmWJA_>4nw8(<%$Gx>U#_aWgdwq-u{KpVH(N zDrddr^eez|IpbXmL`W;ivP_E!>^kmmpA+_;g$(paJLgIKc=H99Z>@%zn_5k_tU$J8 zU8)MkT9FLBW75-aZfduW(afbP4NaSJrqC998$VqtLL%#RgwX-&Ru|r1+I3$_>M&vH zVa3s$5|$=Ww8L~R)`!sqIZ>nbGS=jWjUa~-+t~;b{EP>-f2i2N30QUk zfC5rHD;c$vmap-eoJ9 zs@gfM?|M0_*vmD_Xj4==`^0$8P=YqeUcY-Xrb;yohq3Af)?v@LJ1w!&_QRWkA8iSz zIR%Qyv5aw(rIv-T&Xh3$e_~DVVhM^7ZD`8=cT;v#eyEq{fNnnZlHKC-h(B)@TSeaL zu){#7R|Y!epB!{9n**KItXY1w9f$T4Blkd$eQ0&Rlk62ObP{Ml-oznHv= zZP_++oNh4m%yFPffGIShL|0Nq#%Nd>z!ZXUYMd~4DuBVXH6E+=R+}HIK}-1ch;$CO zA52xuur1>ILFPY68c$`3g5p&}INyhDK5X$}%7^tntRXavC)A%1OtsqL@z(e1Gj8!1 zbpO~=15;HGWR!if?n7(Ub6Av{2qtx z6TZl5V-WWM$Atqgzbh;sOqVC7t?;HBKbpO8mpO;64PSghmi+@!Rk-GvPmiqs$u6Ip z8D`gqFFqa)JROARKfhQ_JAduJ<02-UJ`k?iaMs>sFE3pFq|apE2*|rnIDIhu+{k%h z`HSKC{mU0o%CgTp{;S{Yy5Prg_Ko4dv%81qulvuPeTEO;@TL9QUU=tc;tcCm&wY7X z9A?*2ZzX-$J)FLlHe8^lP-*Un8^iLA;p)b(KKuMl5)N~x)lUn{S^Z(@FaAAGKW$vZ zxH0T{{8gPE>FxDO1hjw=4Xc>x2qj>uSQTk#_`{(!TWE1PHM>cg?p1aSv&NI+XE!pO!-llaIZhb`^-ZBg^v zcyDrqE`m)RBRPWkI{toaoC!Pgq7p>5j23`-PUIcaLQM6!a&10=5*7*Gt;Cj=z3+h%b3CK>A=&R z6MuYbn0wpTbhs_g)S3#uap#tS^2T7!OWBuFoulO)H&@hiH+((UF5WZr@0ktldkKUs z>v(b)kJPvZH4grfB5dl*_P9U$#xI$ncMdgH8sm{&)Uv?1rUN|`RH5i192e5NexCD}=F#AB6;P*CXm zN2E3K3g@v~A9Z7huU^FGv`1A$W9?BT@wY^K#MwPFMD|iarzK)OU(_N^U4;~#t}2Ry ztrL}XoT!ZJeB*P6De519@i?!hb#OYE`=B_HwDfp>{T$l){~%pNjBP1k+V75insS^w zZl;}kl)M3-iRICbZx4OLdKN#hgKv{4>Q~k-Rg1>1TJUH#ZsC&9(oe0$K_>iZQRL+S zT%pzH@XdmhbP$=i*un|F`;pLGu0wEj9D<9BypHh*x;L;X5Cc8B?FflP9CfV`$6qWi ztl5E3e_rvkPshh()#5FKuTv%#iOS3}TY1Y>XcLRW_)z+0;^=;;4B0D=wCL^77dlak ztNy8%={TyXuU_rpTw7Du2Al%@rm{%}E&AK{R#kh8KCKrWYf`{QL*;Nk_Dco#(FMBk*QQApHX&dA zS(dbPnq`T&U3Rd&fQVP{F1k<|-U7a0>vaepJ!YA3B3Q&Wj*ZbWQ#Hh^Y__m`x{m1x z8v)x%97;{Lmce&OOy{vhhI-ESej3-(`c#n9-BzL7Is7@FM*njNLGnB|s1i4D?Ec~R z$y%_yC;)nwCUd)%0Cf8u@#5C}ZTiJ+VfT=ca7VHiYk6(}e*OE0MY&R&hq{I$n#m8| zRRoJlA$vFe#A1VsubSvpYWX6Im|>nbXJ2g&e)MEI_z_239mJy>N}w~jeFjRqYn*Zf zkjH8jk=-&Xka(dXjMXdY@~6CdMTV(b9$83kn-j3tHREEvOR86zvibaF7cm4}6jT0c z)68E4xwX_TQ;qM5uk<7q<(o5^g%K@`pqL>QyIfS+_puDI7u+}-M&3Z;k!fMER__# zuDSPhZRrLjr0g{|bdxK2P?HV1Y8kF89e?F7gf4Ueg>PN-6RfyE1!?DLi6@jQE6wC5gSls%)U*PM#h zT%is(G!RDb{>{+#I8{7-YLI2Q z=4SC?=H_o21iT!@AQ?q70wzb1Hqz8uiMd)c$snQZ`7#2@c;uNt_x=-`B>X^D*^IEf z)jA|ljrlfJd&uiQbyy!jz-gxvU;V6-OD;MSa)E+|YOl^w~+k80Rhn+rL z?8Bu#TtVp90{h}kG53>N)nt2L&iOIxfYm&)b->b{W7!``o48vOOt=nE85@LRJ_e*v zer%aB>wsX=b--#=R(&bzZpokdEw>JkRzZyp>e$@25T%oa*Vo3~*G70S9nNCml3KS> zetoTNoKwD2`2k;>-jj~OG~cI}`uClr#W@XZ(8XfCm%S5v@?N~vr|`3(gHO1P@cZi> zhfV#^lf3H2%eEB~?Lg&z;WU4~zN(UC+iGQEI#y-F@#Q6+^D@R|OY;@dU zOCX5nnt1?BX*bt^96l{+5=UBW^=ji<6INt1@g&oZTnM^PI7?-w@m9H8YZcw9dEvBq z)#>slJ)W)bQ;~(_FsoC)I9YA)p6&ZG-_*A6lXEo%-I<>DUEgTeob=I`q1n0zvSaHv zX4}D{=hRQpZdGwgT20(m9GJ{C6kPS1pfTaHC6T36@}FSY(te_!liEL0)I=0_fF)1~ zE+u|;Y#WgkOl&VTdm9G;Z1rb@v(44t1*VuWK=;nakJhuc5d2jz{kygOMpNId9rWR5 z9}fGlOso@#RT1h>yJJAf?NQ?FFi*ZP`%y$QoC3IPLYU6|98Rmaablmg&((pms$Mv2 zAvkNFyS}zf`M}v03$Lk7S%`_Kg*4ZOf29lgUJBCEIa94$*Xtd#rSckn#Nf^MpT`?I zv4Wunb1lA%_v=J`%zL_YnWqA_4H{F# zL^c49MnbzxJAnkzI;+bQBQQ4N1O_5T!Q2t&^|ja0GbtXHD(sDk+ift&F0_c`egQWg zqt%b##wjd_o?ew$5dDJ0o3eT=sL+(!3%67O**KeT_?_i6Xum4Edw6XkTNQw{fT-o!u-ii!G8W#%>pLjp0dar@@nsJ(=K^ z8tSs8xbxkM9yew0X!)$&-;=-ba`pK38t=$i+*q8x#kaMn{&kA zgs|6~IO|@4362=#NAb~nTI`S@d8moO;YGa`%k|qmV<63jZrZ8#+ry^S1CPzFg&N=( z3M?LU}A7M4$m&NiTjP<*?9b#6r&nX_xSXgOaBj_YFoC0PyHUB zR!UF5^C?d?7=?=G|^)K>X3@pg}J6XlVrVF{I7xPXDxuSdHirP<6 zC2z*gIXkYi5sgN5NIhN>&F)!gM`we~$>KO{0QwcmQYImZwVSQbKLM ztYGq2{{BiA4*GDj4~Kmy2|@FBl_UlJVg+W$d(1Q%;Z`*m)5IYViUnmX*W%G?u7eq< zCJELSB3S#H)e>o2T+2AeZt3f5t>u*0m*XBGhgiMsRjS#QB(w<`eGGjOyQu^uS2L}W zJces#?uDR_!71eyBWzZ+YCc?Qp0dN6l^y1G-$*!mS9BYhJSZ0x6!H za);RHsBJ+qsZ4&7ajaInW{eSO9cjNGsfGl(d4}AX+E$vUJ28@XY-x(A_AA{Qg`;-> zl0iCzX!Zm_6FN}0mw6ABaoxw;W8^6qRs1I}rm{CIZ_;j~kGd$6zGpOyVB~cGkkz!s7ZZ0%+`?WrTKRbC z&ll@-s@OtviiosfKFu~TnCS8Oha3g=rF(5Hwb7bwAC zRf4qf`L`<;EnDDJSuD>Xg8{1>Jor0?bv$ zdm>9Ig1cO9*w}-Gv8kDmZL0!31m`XSNFS{sVL5 z(Aw`ga!a!D1$&9Y3{zN>1(|N+2G0Iq|Ke2PuYkkzB=2o;_R09BoHI1_>+-icE`N*J z$oA#uiD)3cy+!h`6jG9r*dDl4*jy07qBD3{yzgm>EMn;x7O{+Ui6r(8eFW^EOcHB_ zdx{d;6ecCHmuXH>5_?hv^-QE~mcaR=aN>MHBGYX#1w7iuP!uJy4;I0?4T&uJ8sZZ7 zNhHk!7)~C(xuV&JB$^$pZ(0Aw3TP=XEoQO}#Q#_Df;yw6qVBFfNlqZXlR6R53`r1V z3`urOkU_!Y6>~Geo#K#BL?;uo7WSemJ}u6VXkqXaXfM2J{WYau?Vpr(wP z?3HN;1+}-he+hxDGTFr{OC$uguKpT~k+oc821BnGF96%k!y@T$48whtV zhF&M^p<9(iyjE`3zw-!eo3{bL#47j{@z@Ny)E+w8NX?FZ{PHuU`uOS|LHAjZk3Y7q zr_?SN6IOd&qW1d9Yww|k_`WIns>azcPpxqs$7s(!VPIXw1ZVrkMf2;TX?9Eg>94rG zWY-_DPy->XvXe!>u~c=AbdOIPEJ-i6^b((MC-bL_^K$@E@Tbi2a5WyE%BA;jZ&#ka z-S@eS@dr}Y{}FipTOv>Yg*q6MZ`u;^M7U}}^YKX@#7Ogod=cO>bZ4T3+k4~$I zV%>$w)4)?<@5gNy@;c(tV*s;g+id(Ad=NSrJf?rFeWdQD;29gKyRN>N3;9`2MRU-pKfN zQA2WkHJnnL( z%qxh$CCi@+wn+8rC$ct66dL4D@+I7hw2M8`oiePsx=kR!ZH?deo5H#u?oFt>J6HD&qRTAn)82J zNMp*chtB=!-+Xg)RPIkXigZ3to{4P-+F3ltEj1UY&pE%=XON%GRUL%kJ{J-g8N8nJ zFk^LtTmM$@by9Wo9Emk}oX7h1J9k~QpRIX&4-_KcgcPTwi>}mcstY*Q&CWj0`Ihm% z(9gP*`k;>$sA6OKSVsK!QUdhOVrO%lr$2iIHiecyk*8Ea;IfTT5PVz>iYa7{C1U8U zQGw#AVSyfA4)TuoVqdF*TzWrxuRvi(&g=cDa&t+uGxz%JFX7>sfSebQPp8rAq;1BC zwBACFl_$=i-xE&93(Td3Gw45H3FFV8e-ZPl;nFkc>r$QT>Qg=KN4rz#zYVh+J2pn$ zDlS&+D zxyGARVbo3>YfSH#cbQEJ93fPgjZdlHn$OGJKHQh|{LR4MF>7V#^w2*2jXnYG{Hq8*;3Nca_)vK5K++eGa2|udDK{|%#M(* zy-`nhtQ*fAt@7SGM2{sV>PBJXuDhQ+(T)6cyd$XF`BPU+D+~6~c+j~vfqv*bt$f3;e@7k{mWwgt=o5H$)E4t+@HT)&Z zGa52pwCTmD4Yq20aZ{L^?OgJ;1$9uAhQH0$0~HQZVx6}BC#}2FTP$2z+p70K)P!!Q z^BmOP6UeujP=5w!g>o#lvET`5E54=Hr8y)pUEh=6q$lw5P=#-#&QrKyLgYA%2d9d# zZ{ZjJviX=p-nCl@!Db%{2Yx%vU2Sy!o#u#@oC((w)Dx9BT*67yTF1uaY(mwx(_`2` z%DRM2x!Q|-ruj?ZCQEZF%hD^YACg1WMT2;$f2_4>bLdod*WVv)ek`22G0wQev^Y&& zFYm6Kp0A_IOFwB86!v{)uKP=8?+-`s7F=k#dBxH|?xbdSy}a8MPe_JbFZkt-2TtPr z-H(L5$HSRFS|2PLmm zTQ~G>jknZJ7;$>D`lgwW1-Y;3v)PIX{KmIG7*Fy^^92dYo;o{L4*iQw?Cn3)q+YK{ zy}meAYEn1zIDNr$DtZum2Yq^iL&t4Wy`0LArd~l(c&Kg*!8WTNq?tUS$&4VCFw2nG zEL3tLz6snXguOd|6z+a8_){VrBw| z3KI@3#e{8dla9lM;*sEH4tjRoR@c8rW> zSKeSJxc0|y7@fuM4>aYlJ-!g+4J@SF;<(1a1$DS1md`$Xgmmxj#$sjk~ zjuB19$K1~UdlR2@d@PbPg>?3nj(;EezOgdm?cbZ6n<4+GspGjBE)>R?Vxi{}H*4m{ zG0E3S8XB9yqNH51g8<^$tj*jr8DYFKWx`k`kiQ{5I}u^1ePak?4X0s7k6g}g{y4Te z{;<6E4^J2$H&pjRr0qBs38N-S7}LoZy@wx=)YIJ5Xyf4jH)x|q(?(5^Mz^mO*bZ%& z`1eOl8*1Me+W5!66>Ti$H-8ZJ0{=%Fz#yJ9#?Z!5|9_&59k&hM4sF;{$Y|pwVc|G| zYU=aG2Fkzr^M=~zXrnp%tP`lN{JLnPo!|VfEq~m!q2oq7Dx3GZ8(QRbeBd{%4_|p# zEUr&k#@g0YB68vO1Sey??x|$o|2L+R9VZumKrB{BCdI6D`4e&pTPZw8;xeUyQO;`< zQqI=xOI*8zc+?55{Tb!c=dW~DAW|;8>C%_l8dK4492Fh2SX6WvzxjdmA3GIoemzt) zC`_OJ!VXi9*`CLf&6pL+VMaav?z6%QC7pe#R1kY4ooh$gf?pG-Y|-6Wg*@q*PXxI= zCnuo$Ct794>y!t%k0oBDv@d&;Rw(Cah0;>GLU}V>AyyXp-}TDwq8$xMaLpG`uQmRp zl6Z0H9%dg-XQxgwN1KN3jVOaATBN9Xj!YblROdt^yYrj>ho(Pv8Yw*)wF66cEn^$d zgt94XOWJzkudvlnSkEJl7Yu*&QtCz(&}uX_b<1pSlC%BN_Jne9%yM}`d!MP>m*@9Y zaxHP_o%z4gu^bcyxEo|%(UyO_d-$v+;w_aiO2Y9t!|rbM zfQn3UuV@4prb)CZ!#z{f`4x@-b7;|Ra|{niYf+poe0hneBshs{CpPOc`c8it{om_x zF4I}Oj6PjEA0H?b)?E{J4ZZeXVo#H1n5J##-eYh%-dJ zN^~XX%@C)~lF!2f#LRmy`!o5&#`*rtisw5ROjS1UR7KdkC!{sIo(=9a`+8JU%>+?X zKD3wDlUFH8J=$pnJ%-ueQ-U^frkcbSh%Oy3_BiDN7ixI#i3M=Z3aX7;GhXWT1a@Cl=*(^%bkDa5QwF@ zNrLKZcn%OZEZigWc1sP^u+yfEi0xeP9X++P8NcbajtlIzj>em)01C?#T)*4tDfT?( zL&(nUyPDkG{mA8)q`{Gv8C#leE%<$x5l`8SQ4UGT!~3rbe&6p*&wT8%2LCYW_MIyt z*V(R;q0TGuatM(YF^)WgBNTV`f)0=rQr6xQf}Wjh{LoRXTc8CLfYh7 z*ZoZU(ZcGM@TRy~VeTu?Q{L_U#U9@8NOj)9?)vBVcDw5@(bkTQLm=n9#SQ;TcpYn^ z^>nJad&^h$@LT)GBoMVrOjXmkrKByMy_{4Hwq-|KS@o$zgKiFitz;Ii~dkSqGU zH5v{M)W#Zm#e8g&;gwA>FkL0+WerSa7w;USjyQBfa|*}R{m8JeRYr+;%9NxRvR=g0 zVmxhPatSgIS*0GE?y^MO$FalV_pHa?+w(&e8$WfkB%jegCo>u>8GwjeHD|3(_OqXa z?P#AtBM||@tnR$TYpBxJXq6K7yc2}!|K-k|8$MCcDXu6Pj$qY&1tx-iGbdYp(_?JdUi$*jH3}ZPfW})*x(|11I21fZVSpzX%Ddrz>a>W~nf0%=r zh4GqrZnZ3A*W7AFi^CfeRYk4K#MEjzm|DY_#~qg-edRLGIfY?^cWP=a88*n+Bo^kN za2r#szz=RR4w>3IKgU|4og+-CM^=280$dCs}EUn96p5lYCtT&Ao{^*F0F;E(tr%?Qgpj zP{Z*mbY)ms&O)TcUlhn?)+~h4;~Y6pN}%P@SAIYB5vv{p@EQU9@e8QH+J16R8rS1# zVP*`2*VFP!$$hemxf)YZ`RfH$=cyC!w%;CS>%*-$L8hF?lX#@`j7HO!7>(nG&Sc`t z#rBoDApZ}BA^KiC7MxjyCZyMS-Q!`>J=`)nOQdE%dMms(u&8#vu4eZ*3#%Y=n%plG zy*9K}GVar%ioIM|#nbjYgS9-wZXM)Nv&(?^|jXWIu<-C=X=DtTdUW3ZEz*Y zL7#P^Zxekf3oM^z9d$}a zP#s1=9Lf83>HL?OO|~JINC%<`@vU|a&}04Za@XQyCkp2u3nS$xWU+~E;jp)?+CRZ2 z{@R`w4e2}H>Z7QBxw`^>t>Net|9}rlQV>5|^nFvRco!j~Q}+&1Ic9vT1R9)3a%Z6G z4ss`%f(M5Rd=XvUIPV};CW@laQkXoG`UD_q%04qS?;sxb+Zc=DS=2u^?;y{Vcn9eO zfH4U9N7nnB&OXdqpB*33!)a_Xt3lzf!?)$DD;>7J%Y zTU< z&!Y0e)@9Ub^=f8Xp%26hjqg|@7P4Q*dC#Fsh21@xRf-4y3Wq#j^0QBipav8z^alW2 z?b&1F4gj9X@~`Os(ma@@N7$YIquR+G^s@+s0S{hMp-2 z%z7gnwX;$QzEuilm&<|K>J^w*j_|P<%-^>}0n93}V{%t?88s9du#MR+>~&&Mkhzrg zSh_cbM!CN|IrCj+L+&Jy#?e9A+IXu>5*yc(7|(A0wHsw$_xG|7*_j$vWP zL_&#S0qo7N;Ezfu*<@XawZTd-NP{42ER<{_u32=#ekr5awle+E2_@^3T^qDSERU%C`i-JWzBNAWd#dYto z?bjW4GDWgffx@;iE4SYhd#D_Lm6x4UiFZRgzBlwOn}p*B?XUB8y>Ta2>~=l5rbNC@ zF+1rbeN*q=ZY$-q`0Tt-C(h2dUz$8O-;Q(T80dCh-Z?vN9Xja^T^c#2wZ#)+5*My^ zy0)HK716C{dKskvo;P33Jt(Q373n60+4wZ{S5Gt9C5(m_@yZbJz|MkkEQ-b3OiVZ0EkBkmSLYzPsLJ>92>TRFa@{I{yQTU5Wk z`CqlKjt2Xu%)fWzX{WOKX=uvc)0lmzDf{a4!9Ey@@XKycWA4N?T_g3uRXaK&Ti#)+r-0Y@2y)$lMZ7% zd`=gH7XGHwDqYuz8AA4z0$}deAddmejXa~tCsgyZw}Dd-I*A_#*{YKSUi^%wbDy4u zK~*|vdc0}i)tx|=boMC^u77`D0bKBf0=)ig%PgQZJG|sPf|5GVq0V&fbH$PZ6pnWV=Y1%wVr?omkM_de`D(@cE3Y}R?83wBvwSY`Nndc& zKl`s%sW=N8+lNi`3Z2P<{o`u=D;3fHh7slVOBnS(+1#Y~jNTC1WjD-B!dB#Z@;1;p24^HB7;U~pzfRyo&G zm%SxENZd;G&SH3-u|=D7>+>|j*SKs@p5fR z+t?srH*8zLZsVJ*oHMoatba!A?52>2Ru_nj#vUHdTpx5lORNZlkm2NRC1o?~Iur^n z4o+TE+i7t&^HLB7OEx8WJfE=ZwJ!(V-=;2i2j_Lf(z$a1L=hN_mcRx>R{;&9tH7Vi zm!itrq7u%k2=D)OXT4y$CZJG~E1`e}#dVjt1!`zo(n|%UHdHdr-VVJAPnvG*_ zvEA{Q;6mad?>$eA$<(%L1fhvGg$r*Np%h5$94`JV7*JN?-GRFKtI()k+e<7wHp_2t z?f2E^W7Xi`+K(vSHL_cf`J}4s8o^WCgW3`6rRQqIK~*t_k#C4L8-P;F%v?ohqUCDs z7tiG;2QdLH)Aa#lGfNDUh-O2Hq5Kl-&u*z%beuBv8I6vP-V&A%gk3Ln1Xmrz6g^t| zv#RS)bnWS_kN#P5^CSYYkrtnnN=TmsQP69VXrePsT8Ij1;AUVz;*oJ?QKj(bSS#y~ zh04!af)?v&Z{aM@+sGL0q1?wxqZnjbmHF6i#k;?bTwoBCA*v+)-g-wPxDik`aWxCC zsWl3uohy{ix%X?31j-^i7}1A&6#Z>=K>0#&)f4awfHM5eB2acg9tq8Sgs<;n<9#K$ z!oDj>^JgfKX_I25Ps3h#ByA5qJ`#_*H>ob*)mx^)<4thmNd6=5eRcGO;4CDJeGsSY z;ZJIxCd}8mH|v?!+#AbM30#Qad7Frt{zqw3>wr`OMGGUb(){HJ6g7fk_A#3+$02p( zJRhr|=QHd?80-+&2!pfOr?L?L6208QZY` zDB5tbZrwSPg4@LWBQ|YFIhF(7)$xhgQpXr_;^>ky$KaNkPBN7s7;`s93Z_>B+vGlD zzLfUE)TP^#+tRqtXrYj%5aCe`FL0kR`Uzbpb7bA^+zYp;PMarXMC=jB3-xF z_`76MstwqN7P?Oq3W=51Djn++6V10Clyp35;Ckq^utaYFMj zrwp903`X@*xH7epW33pkoy2q07Bk+l=1cW_TUK=qLUFS!m$wWiNBf9<1F}UD!M(I0 z38FY*0=C2IgO0Ow)9Jf`x67{mz)uI;3Jm;aGI?Lq z?7WchJU~~rr0mL;*MR^*_gsBj7rULKNZ*yh?9tH?$G)cpSA8195c~etiDlV**ZQ5h zMv#+kQ9oh2Gwz?;)le37DcRTKioWWKRs~n#{8B~dQB;}d245(P&XrAL-^HS%va;jF z`ZMNgrB4$+e#hT;Gm zs|+>(oxp#ZPldrP^?j9;8ba?~QOo^$a|ik>>HKhCm7X4;r@dvt`taOg1JF?5I#M47 z_w=R6LM!cjKy*P|Wp7p3JD)o42?M-~J!Z3Zw9vn0cqZ-ECFNp~e9w=?e!fg_V}10b zKE*pfxkexK?_LNlFN>VxUp2oWIycd4-RLWn1LKC?7K4HfTYDJtH2B8a)pxVhxn)r6 zonX#z*!BF*Mf6bXFXF?|CxouF`&m}~`GcO_IvRaS8&<{kXnGk@lbC?Yd}b|;$B$k2 zyIsLxl?Oa)p#tE88$H~iX~6*)*YN#`fIj2?#%#WMBJ4P5=eTL512JR6WF_|5l@iBZ z&6k4iHT=4c(HVEbM)J}7-Zp`J^f-C*70EYMz#zEsC$+!Qo2U0pl&SP@p3ZV{bKj?)M4H9A`0JIu{(5;*3SpqSI4 zT<}ihwLM-S_x>4bEGsL~7s$Xnb@lSv72;Rm+A{m7yUxy6?~L?R()4^Fp~abbC88Fk z(Mxq`rMaOEn+#JYvk{+ZGFEwn>- zTe@dm|41cGy(d;R&0LqxzIgc_O-G+t-4vwJZ`_%={}$w8^38sc9MxfN0TSuxtHCuN zQCDWZ803y5Lcz-`ntLy&^d63K_+7w=bme7|3=NoWn4&^l*%BEhJ^gXe$zdZ+`3qK zSzzJx4r^eIS-pHEPG4`+Mws;~GNeQ_gpzh^l(7!J8wMv2%y@*A7LiT3+q>K>prJ%l zC9-KICy6!Ab0PT9!a3#qmsY+q8kV13n`-L1qKbu9hkUS?U#5eT@WjZTE(j%iU#+8* z7QmIh&Hyi&7nlQh9kD9k7*4-WI1AnA{30;`Z&EX$OlQxlt)u3q;N+hQ@EZX9&nE)B zDr1;zp>CU(59dezBW~@{pW(XcJ!xt>x4c%IkgF)(Lr~P|x&a!!z1gzJMv?OUxeplJ|2?uJ*6P91k=CdaGuOeTv#e z4tiE>_Wu+)eEQ!Rm1&TJ-~o_OW~hNnfuYX)FC&b;%pyMKIKj!oO{4d4@^9-{mXQip z-I0ZD$1H>SGXGs|8)l7b^jnQ6<5XiUHLj@lV_MIXo=mND9bwLgG(nFAqXt6$8I1Jo ze;!63SrKC{((a;W2F$m-hUS2c8CrLkny!eTr{`*V9U=d$>3a4*-}J5@`KH_W<-Wi* z&w0=~-*~gy6?VP0Q*g~vVlWLImdG_TTzML1{1 zuOb=#%?<4S8e{0AcUZRNJoW=rMF$ul6#%W5*D9@nsV3x~4UC=@2j&g1i>BbD|2B5< zg(G(~FO$gY)P#+}o%ah(I*ejZNW|Hb1-XdlMQ{G}1KObm<|5+Z_3!4;CSv^_2aE6uF$M9a;Ro=mgDk6rgkF;w zpk1{SNnwOAN-NQ~$3x$lf9&oLeJ4ir`_kpld6qB`?NUC_IZz+2DZ2fI8lEn7s2!|Y zdw&1VXyQPA_pZ%b*%Hb=P9#ea^ai|3ntr48&=*Rky0}EvhR2yK-mWa(d$#GToSO zUA|j;x62e||MWTwmwN}|+B?nSb0zzEi53#pyIv^|770|duXgtucxvjWdJX9cA1?Lb zVjp%|Xgeo<52XceBmP+iQ4Zt4KApWQzrzaTI3*I_wo)hn8+#kO9LOAnLja|*v z6;)8K3ioyL6I?li-&++8dub{BAUo^|9PLwhRt;?T|t7BJ^3#G%lJ#?F!Qj$M^H zbf}uTc51i8AwzqRsA#X$n;P;NfVAn7o4setEeqAi>Gy~-s;ql#q*-X&GVO?Qz5gF| zZv!7?b>)v|03ngsXRN5HQl03u8pX_BsY~0m%XZUUyJfd*OIwx(YGEco67VMmPza(DUpo)67@$hTO8(#Px%ZiQ0wD=) z)&1x5$=tVd&pr3tbI(2Z^}%5wkph@eKKh)X6Rwc#Fh@ zz_<}6pqlZksU>2tf1_eD`yYky11<26Lwjli2TZ1c1DU5Nd_Ht5cA?Q%%MiGfgu-76 zeTI465ZcC5FnvSSXUHtc;0-PvYzs+zmvxp4c*X48XR*{`#Qx zAa!^ae1WL*WqPl6n~4MKLoIM4_5I+@GFdx`(&nxGTSWP4Ka5|m(QvC5Al4I^>3NX% z-*ksIq*l(vf-j;DVJU2`v1nsxLl2`qfG8}4F`V~5GxKIOUIFVWKawmQkF^VP=YG5( zRR31cG_Kt(2euBHI}fO5KgFI$58jD~){!^`W` zZ!jS7_)U7h^VSTY|FpA=^m} zsl_h>Y(XLMF%SPDW9NIRql$Q$m|&>T9KY9yFQXTP7DX=oxZDX8Hq^iKNnshM0Z zoNQV@L-OEo*8WVF?8dBRGmXU%z1)JWV6P~BW{e+=bHE7h<*O$hOivzkPTp2n3T;_s%tS6V%&%;@gL^#5e}K|p zFQ{alAoJC59hu+zZ*LFWfW7x&1>ceP+_Os7TYCOVdFOXkPAcz4LpQq$8l?y1^N(9^ z2|qmSFQA_Bj=YmJ$~)sk-W>qZm5iihGqWlm^34M~knitEPLXfPJV?Ifx*js&GnVF& zrzzY*j1gBy-7pKo`GeEI6Vp9PV@LdrH1F4=KmJunr>i9h;D2 z#^M(o?&48NCT>Hb*$6Z?-^a_gl&70=lQ=V5>V(85{85u^Y3Ly0I!ErTh#Sk1yr>LzHrtQ%d!qQW$z@ z>0}D6#(y30)0C18n*d7S7B5l_Rz$&w+>GPdxSlvIoK`$_~`n z)7dKZ?`$-_{Wl~|D>i4p#nEq>|L_uQGd|||&ZdR7dE_}qqd>o9{t1cp1#fe5qD7gi zYcbw-wC}->k@zrp$RR5a1D(0EC$L2ib?Hd?Cgb}lWnWySdMsWZ%1_JKhtKZ}#J51h zz;>zVk61Y6t+?ZK<_|1qXO3R&8EzEQo%z)JZwrX#-|_vI@lOAhwnG19T()5G9F#bL>Z698;Rdh(LnMj6ee}Th3I0T`j5*2=9lXe_Zkf^vMyNNEbkZ67XH}&9;zKpRtyAEppXUl4fl&6ekZQ-&lC^DSCW5IbuUw<6>mG%`tPdbnqe?uz2MYWblEce)iC7?1{ z2+)U?$!La0_CWa&qhUTO96Jh4H5Z=TaCSRF^0mMp!1K^DF=}FMU9lHE_O(o6#mRcY zBvv!#Dm88z$^VqBsk(Ck@uNLse;H6SrlUK> zVIWRIQZ$S9dq|IB=o;uW60$6=TM5|j+kY&bHM~-exn$pg9I>~6Egi?hnBO7iu2Nb< z^tOCyaG3(r5cvaSb)t!o=|xd~b=XcUDqN-RZ0 z&KmqjCJ%J>KAYpo1Bi-3TeF2>!GJx+!*Ru@T)wX$0{I-a0Q2G(ZH}0O3cup`!VQVo z6MIbL1*7$wthO!;*ZA=e;}%Ty7e5baw_ijWhEwczE%f^qPaZVnW-f&-gYk9-05&ar zIdWv5Ysk%f0Eu=Z4;(>(FTT*!Y9On$56~t%UTL$JQfY5TqWuz@X@6&2MW@)}WP94QVly%0Euv zgjB?FB#a45l`%&g9L*%o!4HL7Ly8fWDFMQDIxO)B$A}l{5|3~~hox-Hm1~$N!z}`J zETst${KNGDDB&v7W_&kIU8x3tHK`1$9W~z5i6(&tgYc*KfwA0B3)2jc%M_S83+wT? zy|`R4;*{03V&r0$(eMJ-G(ZDu!#}$V5wWA_lWp-Gc&b(R?)w)|-V-mNCEcCqbm>I) zRzwfgEpemB$^QvgBQHAFY2XDoA-1I#>RoS1cHGWlCLEhsg%qZQ#Hf5_(4Ax|KT^QTagH_DOtTfi0V=r7C+Y&?YcmAsjV<>dJE~ks-@HvpY zb;2h^cWq4DAB=73b21m^G7rYJUgO%Jaixf>6THt`#~;$1+BnyJA4yhjdEA2Mg7jM4 zDjrcu@u!PFJurhVb66|;n~jD4WJTkvpw_XRbnn4%<1OJZzRcKoUo>o`!o^)Co?U{P zFAZC}kL)f!QqXbOm>&vaT`7$vwpGv*O(0}7wZ;n1cF$Ys^jPc3aPe;Ii6c*ki#Hd% z<7xLCNViV_P%D9otRuxwT5mA%>4JAco>a(_38hmLSxKgsgsqO^BVlXvk*ABFAV6El zvpJB!st`clvlF760hPXpi$pig^jl!??$%-(Xc!Z9F*{mmyY9A5_v`+X-X{J26f z_H=pnVBKYz6h64jaN`~Rr^23Bd7!0V>OQE{FxF_gD^O`w@4+Ra8qbmtZ?4|Q6&=Ru zm!7ca;E)B+@xL7QJRh|t`-dubp+8gM>CcwiR(uF8e59+mv!Dwz;Mds7`616y77cz^ zSlcU#(_yQtxG!9=wV-Wm)ZdhhpZC?j2wqks6dP}%?d%>ZCtszhMb;?glB6F0wg!fZbsP!D*p+U zMk5bf>7&C{n)XeJr~72}jzY+M6`mKa(Nzb_L)Mm1aaw8~X4Rv#kSc`nuKKqZZ$m2j z7y9M_z7d{Z;n{kP<~}&xlx{o2dO94~Y#j(}ORgUO-%3QA5%O#fbOkz-@iK`>;jQ3WY`km>qyyWL zZ;HwXOuGYH18vD=m#cge3AV!1&b-%TGvmziLUgGonHjRC@(RWlP$K!SRQU_c#uM;!+bmkE@L3DkEsysWP3XGK~#+Ht7P3RF;CM^`t5ev=*yu6LHFPtE(^sx8uJ% z-DbdfajtRuPW=DBxyIdF=NiX4sisR08;i{#x4K-0lcR)j6)xKNAnn4yn^4Y8(en2D zziF(QbcKn%Ni!L~ri%;H*j?MXAIq?{J!a$g6ErMwG6su`mITxVo5;?d2n_$LenVtN z@^cs@Dgrw&%`Ch^<&PGpVr`|@Bqp63K~|v0nng&^t2_&L_FhZNEdH;^nxjt_y`aJL zq=cw}_Ffy9Wkb4&-$B17F1Y$=MI!EI6E@1HEMmIq|a*DvDn5>?HL=RjZVyh!)C{WtT_L$b0ZuR|8e6P zZ?acnSB+j>3SW*R|Ei9tM=o9M&fG-&%)u& z#&455Q4g*rzs0KntqfvQ7u&niAW_e^ML4+xOmmL)SvUdB`w^Lv3JhnY5arZ@iLMq! z=cxSrMpJbJCLZX;QZ4uJtd6La&ivECF=#}d$8znT)xS266P0RG>fBj#nL4z0`c7i+ zq#S#vaek27DU~pL8gIfCswf67aC{*)4r%Xn6dVEjQY@hr`V=HcH%{>Egh}xfYmu<_ftKerEg8^qN&AB{NlQ1a4v_JDmJFN{y4zn0TF$zzbcN88 zC1Iab8iokWNY5eA;`#1%?+7h!62O-pf;4*$CzoH?-5k41XtAEh@VpNdc~Y>vOpsNc zzGQsDFOGy8g%&p*z>@JCjNsf7;Jo4FGUJz@9~giEawhDMu(h4zF&koE!IK!QUgL-E zw}q3-&t1QJjulF8Jg365Gi>dFnGv?0IkE%x#8!X-88%-$kB5`1&%5Z%rmuuxfL3_$ z3dNyt@iSrT@R6P2;++LM0r^KlHhDV3$w$Zj^Vgc+38gm`R(SpxwtB+FeHGU4Lq~Sw zF$Ux+Xye!e^9Y062Oqxn8~+Ik!=4vI){cr|{B92&0R@kTiw}o^H|+mY$b;1pSd`Z# zSDs&-zd901Z$2mFc{*(MhKpYc74Hre>3=(1@VE!3Bi|t7O2Cq{{_b-y_S*$JqiB_21u0v3{)1;c{YNwiIQ2@{+CPX>9Iu;0 zo_17V+8-u;t^ySRvwDT04zqg6EQn3W^CYCGZ;~SJ3Cr z^*l2(S$H0?1@;2lwDA7*j{@5`V5>+@pB%Mb5rn`t@xPvY{sxo-Y^;*EB3U@e!FGA| z4ZnRe-R7meJ^e#jY!ho9+pr$k&ILA7&oR`Hpt)cYwr+^bvC~5Om70DS2Cm1~Ov=1l7fx+iO{!Qyha`HLh zz#&waB39n@)EQ$H)?=|&$a0Q<@N@I_PpnBF*ExCJX5 zf^lRA1U~Rga^;xs4_tC>dh_X?=eW(3pkN)@87k;S6I`2&PyFe{%YK$l8J>)1-;tdK z8w0(`WoMPQ{PUmEZD)I65kBteJ@RzH(}B&&rJvmR+0TC|ogVMm4%7BXS3zf>D;Y0( zyRD;SfK2hJx?ClUa&oohMB(o3-N|@`fN<_ z+Z{AzH!WH*Kb;!y>4aKSC}6(#ygKz*y6tp@p~=BOOMlX}p8rUv4G)ZnyKx6#v&OT! z?8j&3-EgUO}kpEz_SM#j@U z>8RD=IdWuI0cIR%gWvAheFD`p(XO>cw2866lHCv}OhyXNEmpo<0lC zEvDzDC=8EzE~|Xdddia5s$kwk@JTIL8D8qyd=ne-MS;ERf=Ix5l&fRhxWsEaIU}^O zu-VvRMVI5u^2YkNz4yKzPJaHKaPo%!u+>?gy4rXo6;6H{dTD!o8iBUt*ZZu4;>AF> zufF5z5Ox+G;FU@2i8OqG?hd12Jl!ou!!g)Y*C)gAqU)27#fuPGVeP#!xo|nc%a${Y zF({g3;mPGXygizny%gc4OPOxHiB~XJBe;4sgLq6PWIVDtQa%6&pAG9a9@!Wve=CSM zo=bQHyHZDyk~YixKzOA5Pe^I6h`+O-F6irB@b$27>wBAmrZyHmlaSxdFsc|@ZwBXmhH_b|#eUW74AzjQn*C*%1@%@(^|4{;tG&M$-7EP1# z#?V1Y9=hApR$)C%ziX0(dG&8q-n%2zxTrGJc+c!my(@E zzZ?E8OlP+r4jJ>W!*Q!)ZSXC=uCl^&b2T;usvt+M9^|smm%LVoRZpI4>4DtxJR8S2T*h?z!J0l=jub8EzE@tn-tyTOk|47xm_+*cOlNlc*M2P zMcfLwKKfB&r?~pjAJ~tWh2Wqk^#IN;3u*k&2jVIj7i65tTFd4QaK7P1Z?<1T2ymHrY9T$%-*nj<6J81XvLlL%d;p?yO`e-;lSD%_ast@P(>Xz$R_ zU&EnJ1wEP2{g}~`dEA9i%o{|>UAXPLRIwX%fWm`bb8kjiGj8DytP zH{iQ(kiv!jy2h^-V!AdJ3I5tI`Mv_zclpO|{|4Nmd+zW}gFE?4bv6Hh`F0p4!{m?$ zR?YTw8b;8Ta9~@yz0iq)p@D_hsJ~XCCxkI9!m8XI23Jce0&l@a#hT&cFhkO9$g^8T zVU18lO#ryhv#-MH2?hGGY!BG>aNuxyW1(lCiUFvK0qQ&ae%Kut?x%(WucSAFm_LLA zoEjrmVnB?FnGo{q2nU`Pm;*4$r0^YK47-yhI-iw?(JDy*-WLu)6$9ZD;Xp4+XAIZ` zI}g#os-h=&Izp;SprJPGc|r>JbO6$)67tE45~PGIn~6aE$BICYs@cYH;CbO3rh}-8 ziqEgGHenVaNfT&P)S2}iFc9d$Ih1eT&n-~&tZEZ|dxdV?Rl0G_L4A9Ue{w?3C@1Q0 zx?-H)dM3T!o2VQ^f4a9QQH7;VB1)oTLx(nNWGz`_lX8-RMFM1i0>Ih&k+4BKER&ap z*cqBmg3Xtph8P7lsE=i8dm7kcC&A`VR6&J|0vq(pGPR!#Y&An+OYos8V4A0Rw$;Tm zyC`8gJTswtpfG`fwXDu!a(DUJ{*pu`)DN)XARioSd)oFUOw|JWixQPtY|u?h)pK3I zRyh0$b-a{A#c^)9e6bzgk8I6+DE`EIs-lBp`6C059dlc{Tvh=wJ zraWsV+JT^YY|3cxKDZ}p*Wfs7COEC&Wq9h=@I6Dr=UX$uOa(6^RHugT8XCUPnh95tS7h|Ei(kCs{MGlB)2FFf?oUmZ9N`teGVa{A3yrm<4xBKbr(k zIL{195gjv4?N(~HimvhVKD!ZamV`QuGnU1990}70kuXn#*JQzuCm~C+NJW)~uO1p6 zQUQ`5jDeyc{xLOL_8_gQ_6K?W(8CK&umoJzC_8^C1o#pp(_aFAwav2&7a<0)V&wUB zsb08EOa){S{Fgbo;NPI*OW_y!PA-#cEgOh#J@H4aEty46U_yx8K9uuuox2GBE-CXP zh;hp7*Qpt}PMLl1J7wm%%FK6_N%##!x1RV}=IJOiH~(=zPfA+xCi01LuRvt(|1cAzBePMckJung zE{a&2XW=tw4=(}AS(uLpja&BGUqz|1KM?Ua1~x`^uAlf!tVT@14u$iS%u;2*gCi(T zfUsChNN)~ul~e*+L|mEu11K^@l{^6@M{v3-hSZ?Z&v1#v(s)@>Vi_O__2ObAE^SWt;}PP_4-1{ZCG7dti+7oMtA#&#q*$ygsmqTK#krmhobXMeo( z3qdU7PUFKjin+vw2X9KrB`@ZEKBJypCBXeKW6k7GT|W8B#N=}Muz82EbU)_E_SrlO zCHM1_GdyN;@|b9H9G=kHqgE@pXweoePh&a5EI)=ti;jx;_65}6S%v(Ze#xI!6x@49Q(825hFlGjXt^4hxUkR{}U&)p53+3aJ3 zXSJ>0213Z3G^~gwnxh3_r$4gaIsK6$Yv}%%q96Y(2ptTst{d_5frx?wmg9(l^h9ni z;gLiX5GIs(siZS9d=yCM| zhccxspof{x4j`0a?$3@Ood_JHW(k5S8c@)Dc$0=5p>F7o@J9mPl5%$ho4Oovzax^! zrJ7IW&*8daFL72!Kz592$-)WJwah74pk1oowuC-Xy&4^m>UkdP0Xp@KLu;jay8z(b zK*8B=kGNtBhz^aiC*94S^as=0k2fNo=0&ZCua`ary-0+jYOC0>(7VFCB?(oV>G%pR zTwg@EC7URdS@FfCNXTys3ZndapE^!{6#YhF>vs+wG3Rr!FKaelZ+H%s6m-JBY-f~6s=W_pD+ zudKqVo}n5AsWjg4pH5K%RL62wn55YVfdZlKXO?0G)50%UYt0mUs}eCh%wtA*n+yjX zATLN)5DGP%fgL!&IoPb z`a){~y{Ls32ZbCFJqQCL|}QJnu* z1hAd93Dub6$M)Py*fUbA04g4!Dhi<6DgxN++XRF?;Xqo-)KP#^QGnVX4sVKU6{V4O|{X+}>w8ao?2>-NOAn51-({7@GPYO+&k4}J&FzvR<(ix`R z=3|E-_q-L;Zu2AH7gi!rf`IB8({4i7K=+t76Ws%3O}lTpbdzcG(M>?!v^%A%h+R}F zT?O4lDMof*={LF6;ZnPWPbM$fM1|#6ZqP0?kUoWf#}uj&J=BgEM-OqN;cU6i8D3+E zaE8|=_#GwG48KxB_{_ovB3e((nYwiD{4(Ais1jAVT1GHh#4*6IspB2u!Lg|I^ytBY z%2g;}Kc!wOGFxG2@DHB_=){HiPc9?4ag&_k;)~{MYi*u3f6WH#RD zHgAuB( z`ZnKy|BWDCCoq09W-ee$1&D@$xjy&I_%39@GvkNAU4VB2oXXVOh$ke0C6aq<7EM_~ zdPMkVm3J;c#}GiE=0n<3vG{{qp6P{22|i;KQah&cA`+ z>zTIh7bshvV$JM$VoaX-MHFFw4JOw^V{k6qXSQY^%f-edE^+stW<2;&BoFvEH#;>r zY#LMZ>>1ilD?08e^p8=R20fVG@Cu_?1(Pq@V$eU#Z+Arb`qM2t4jXMBr#X7cfFS65sGh4rRW25neVnV0-{Kyxc~)3?E_mGT@Ad?!d3a z&ydK^NF<+y7eaz0aj<>x3~FP_fTf zU!G^nr!v;7F2P6m@dcNoc!d89V8RemVrSRgU+!p-r zI3!HM>j;WV{Qd~8aDu=ZT;yysjqBU&pASOChv7MMm3cKE&qt^lj1t-Aw^NX)j^SO_ zxxoD9brMrWybG@UW|fM(u+g00%;PUTN6}KG zA5CQ`sovERjaP+x|62ikF|W5p`HT&Dz29|m_2S&E4b8R8K>+LCz2V=X1fUCoNXraK?>#+T<)OphM!s- z1_Mp-;UWfoee~fP1ew)iuEVua{)KQ;fAN*(x-Y6AE=z7-^l5Y5a^S}wzG<)>k7Jx+ zJV^b@N3nmZWUSlxO};G)6zd*Wpb*Ec5Xazsbr8ks6&eh0;pE#?8K&IbfQKa*@h2qe z1Ng-sqiWAL*A?Z03j!p$yD{JX86w4xuM60sN=nFb21bEUwUvW zt??ldUAzNV|JHfNgO_~^(aCFld}aK7l7zK3;;kH4PwOm1VDmwD+MQ z&3ty+YIfLpOsZk2&xQUtFg?)e@0_vpP1*k}r)>&XK3c^nhH-RPG}; zb}2Jpz-WSt;XwQe_}9cR zi?)(4%G9F$91_55da%1;qZ^?^xI8HXSYT^nV>gb3+;c60zxmq)9??#+%nhBbw~NJ-kJS& z2xJ?BPdlSfK(&j{Rq(GHj?a=fBA*>7htEd*=U1=>`s+PEmOz%@gdQco?M2KAqEqyQ+BqKmMaq2C^Ju)8gx415exA znZQN_52(55uY$j8IDSYX`5`$@#t#R|6e#lJayLIdGMFEPUQ5VP@M8?Kg3urcl^Fp1 zW$y3iwpCao+-o!GsG@mX1%{Gq_ zKMSJ{E97&vLJ|DW(heT1s3a=Od!)G}&`Ha2{HuN!@zoN@5>M#Sa{QCb+Iqgy2>3Dr zR7O?|jfOX%{7HTfRw+dI;qQijKidPMS;;ymJu6Y!u9Ov9(XLLK?m&>?e4#j`273i>W04+{?~^S7)d0lk|Wz-tc#214pdH6<()}7b+13{9Yi#t zN2{v3m=%P!fKVDr^f$wQcsQaZkwi<5lM(GenF2*A|B2A4iEbWDG@;iLauia&K(eCM z4y@XpzD=~dP&DUS-lh>>UAQNt1mcExe;)T zyIya=)OK}XLXWls?~tsjUVSn(*AvRPI#`B!_2~AhgPuL7SG89Revy%r)k^_7QZ@+6 zRWAoBCvS0~M|YR|2G@(wqm{SWs$QjRm=ugNeDe&$IzGXm{66|uDL>}6SkO^^v@aIk z#SfcWeO0lUK}0vfeKUNo2Phc4&8?asy54 z1teZGY@NqmlL5}jq5;} z0!3xwIm1<#KMI$#bs_XxLXJY2Y?rLry42{p%+qzL1O1h{E;0Bazb9`O1&F$w2<57a z17!*n>+)@(LAT2TgX=T;W8t%49Pms4w)$w3IAP1x(4PwruY!XTpS=<*5I z_)Tn3w44v>M!F*WMet8z7d=_aNn%#{4}x;l)`7}(%cYpnW~Fek1hOqh=+Sn|In0{G zqb(S()EcO3KG-MKL_?m&46G*nRczov6{yU0 zHc4bPCC4BrS2Z0dQ=r(WZ(o7}oX&PY0@-R3T0Vz7ibj20vYOC1Se2HBG=21UDL)z; zyUfZjjhzyIR-juM1js77sBa0}W-ZV>_H&{MqU(;CC}Fd2#pG556c1!ELaZ#FhjFb9 zpzcL5%(Hc$C;_MLqp0yAbX|z9)G~;X9Db>#oWRy1&4bl0kuG5nwe-T2{h;;<%ryC1GV#`c!L4^_^|Y!&Hk|^L`X<`HW;xHKPh}R8mm<*_xFxh??=B z2y504_t&~+d7v0rkkzqKUG^NLl(4KB;ZCXjVnUm4zptNa%|54UChfFBn47Ili%DG0rbJZpGZq=p4U6=F!{JQi*9vrPG7e=&J_okH z>$dBHAH)pZcIZ`vWv?RKDfOyHgihUd4H7s7t#~&xKy)xem4~gkeSsYkZ1DzCBK(-M z&f^3X$^fGdCa?%_xV`!gMqaCV)R^ho4~+tIi5qjN#{8ft1C6;zVfJav zbnVhnU|xXa5Fj^p-|pf@0{t3%Zjuomvl_VeE&`0ejf5L>lg50%8*`n)9MhQT z+6za4xyX&#r!oJpn;U$&gR-G9)3q-e1!lEQtYxDQ#xc3^Yd2VX!7Yfl;l z=6P<+H5zlj8*`PyT&*$FwbxaT%#9VY8sYRo1W5CnZp<7RL354hmSy7F)uX^%;>KL6 zG2bSwrTN?mI}w<>;IMbowa1SFv+3qWrRK&L+?dN0H-efQbnTV5jm(W!S$ojjNFhLO zeBOBiiJ0BL?i zw2#KjwI^V%)R^hoKN)=0nA`2zzBrJ5&axAQtk~IrIErD#s z2t8UBmP*#M%=C+L)y>D+U^0$<3N|>5jZV1wNJWivDw}Q>({cF%9DhumW9C!<=9CW! z>-i&QY-nu|-cTzN@l_5p^=hyCI@r^?lb zR49}w#^b&kNzz7}oIH-}&&w=TS44(@404~}q-=O8B{=GilLhyQq4j0#>|l5D%My?? z(*oJX+27O50pa3XxE{UBUx^UT5n!>>zESeLm%M9vhP-&J4x->?uY+jhv%{gyuJ|lPKgB;hu<)2x@Lx>i=X#BYHIe$R$nxbQRZi2!~xo0{HFZE(J9;%ja20STO%HaJ9?1M~XOG&K5r zgB#@^cPkM}(K1G(w9+U>qx}3Ff@^KS@8?j=;1CsE`{}<|fu5o9UZC+-YrIt&??ks~ z_QSdc-aL($u6@78s}{UYUG>kQ)Gj~45{ou|;)^@R;N<&9?tpW=U1nPQa;8~mcIf8J zwuj%(R&Qb#amIjp37lH1-^n~9Sn~O2vk*P$^di6s-1C);)a{<3VF7zo8y0l!=Lj$Y z=1y8G4(2YJEWjLhWA0R#yEJCHcKs+Y7r7Tve6omATb!epst)vORY%wUm|%rz3}A?= zj4k=_%RvH{X)$OT=bSR2g(Efbu?)-yL?=4qi34Q{)X9#Zp28V~k&mGEQ`0+~&6D~Y z@$u4sbenZ69`tA)(6y)B#Ci|E+?p>|gCh+HpguXyHe+Q5oNbW>8Y~jPwRheKtmtYf zRDYKBnoN#xE=M}}O4*sl-Pwx3o4xmrRCX&WlC4!r)vDoo9C33gEPR?#8O1%BwjD}m ztztG%wE}LWzTF!c*bLRx@CU31N6P|l3=0S2#`TSbrPnuxOJ(7>4iqzEjFj^R z{YzRf@=$L8i;(mK>vS%opG-(3kw%B)7zE`qIvgldpiU+vgwp%}Jp)~Of;RM_>XC&c zL%ujd(uV-LU&GoDF)}X40j_VHoZ;kv_0KaN{+`^E6;-RZdn-9l#Ow|a+K^S4B@ooL zL7+Oq@ms>RS7>9Z_Ojgi!Yu1AuTi(VMm@Sl`K%GF!!CrKM(c#Xh-(Uingi8w4%JBF zh>hkzIgMt-%W(%VYbj2ZK+aO+Is+*fxvF*nvyRXeGj8?Sr`2c04QvRflPmSvqtz!} zJ1hV&`$g(c80eEvs!r3VZN-eX701!?bMSUjd0<6UD-XK%Yu76_`(P0`26++u8;4`F zB$Ca;8srXC&LAHzHPXvDZ;7_avYF7MHOO}{D`X=GLZKbSUk3mB;fR(*5-m9fNsy~U zJ5afkbw3k2HPJsBOf;cKd$R6Z$cl-O4_(dEdKai(yMX<(qLWVn_$bmc0%3uVPekAc zR6$|uRX!MPcly|tUsmVLPm_SdJ!1`CQ0FQ0GDd?lDQ{jLY%=k;!vCe=RGlP}Gm_(E zoN=H`f#R6oD}tms^SlHcg4PjwEg?s7zTmga3ZnZ!sIz>Sf&bRwh?YbWEjdm`v;&n} zQfzV)T|by;LXUPyv04+|1VWvTlYsy0!x1fsBX%4ID%Wv7;U=0>zMKMHN9fUZoYR=K z{u^dqZ6z**R?o#x<=h-DT)H>S?fE5SThWy z1{)Mubf-ZfYws{9;MxydN3!3`b;PQ6PV=tEZ{|5%x_tlEU{A+PC~NS)gRz7x4|1x8 z)!Nal!M-4QuuZ1(`UX$)zP&|h{~(7J@V$(q3N*&+VHTxF6%)!A+P_kCuyXAK1VA%G zZcn~b?;fve^mz4MH|BZ7jAcNLnXbJ|V=mR0%bYU+Wq}m+T2QPYS)~Snkfx>nAf<)W z!-XlsAhpaT?xIQ%36N5P!hWG^PdW9Xyvz?g`EXGbgDh&pwM47=)vs!mM^F?+*IrKm z@aq(6Rmu?qMU}usQ4F%E?@1@tMHL|uAU=YkD7yBiPraz7ajK{UTolD1i&B#XT~r++ zQB;heD2lF~xdwq#t5u2;4Lq%IQ51tLs>5BY6^I1LDuSXYy7v92UQ`ns0C*B`St~d! z>P%slQ!7NWRs?0O;MyN#Q80s39B{Gn7(x((ObcvC#E8Ec{ws#l*OCa%3_nwJpq!ba z5kHIt`K&$pssyqlBcZiM9m#aIH%eAr$tp?-cHFd-(6v7%wHm$yo3MhIjAwy zwSV&|as$`UTodYU_zQ>YOOnXGG$v2+$w&D+e$~Z+%FWHbCqkyJOiKdUzC`HJ9;~0s ztRUJ8`4kf1&xe22a70Vuh(tS3Iijy}6MflWq6s}(q9;n$(cMFxK@|&yqTG!c`|MDD@{fri_UZNW`!=;r{UQAMT7vb4^S}Aadm9A~#g%`Hm zD$FOGmRkY;Q^U2KB#zi}4pgq?_KNz_;e&)sxM{9H`tN`4Km#xoPH-S37hKFXeri%dzsq`!c;{sxB>O=Q>X_{JZuKvyLW-Bi6-%%GKrJ3tV+sB7tmO z2tC@m+{&!EdFt()r{10ukH6YHwN=^pDbZTkorP;Za|P@0Ud~fj{f6_@f5&g;6SeQ> zJXIY%*V~bAL)D(@Jar%P#2!-zOW1)%cOYcJ-{ND2`4MhT^6#w3+H&Q)d;`ymtiKqc zb-#jkSqr(%tISl_eiCUMvx%#g%n za}04#9$<)TNvCV~O(zeaTFGs=Ma~@EbxuDadRcEAH6bu)ou>+mZ@^j&hod!J`-i}a zbxs_$;k2vfQkH?K8M1;N@z=rMG@L4xM5-UjF{m}LDC%s`IZ(M}vIk{qq{r@WN+7F# z2tC?mvRjxH<(F#4jAHR(6&VXwtbhx#WRPv})oF-!Y@238QX~lqZqc>xb^|0-BQ*)- zILHmxzQGMprvPFafUbRs8-O=(QACXfplcTp08P*XTT;Xu{%-i+l|lV1DOoqccnM^i z;8X_nm-LJ=$bRaQ0Q6Ey(TGPj=bZGQz?Hv}g92Bcb*8$EG4+{L`p7&25*IudD z3~TW`)+wzQDur?%#@#>hW@l1cqrRta`eR)qYS5 zc%HD%nK9{I@J!~hU#lhE7AR+#EWyRgXH+Fd{C8B!=mJ&Hk6aNFMXy}@{Ew?9ISJl7 zG+uf01kKs$#@nFrCKTQ#jhC*y@iI~C8LXHhT+&RRqMr=4P36HtIjWMfaZFMNEz#yDwH-QHYlmrF2(U3X zQF5FSF<*^{UOghxwLdqNEEpbhzf6;KbL4@M#M~{KNo%VWN?Wbc+KR57Hww(nFha95 zw;({w_ew|5m`l_OdZ}JPr)&SGSUJPfT;|3c)R@&$pvIh03+8=#!JMug9R+3+GxRLY zl?agLd)zeVV<4vPmhl+68?Jrml2Py(YoA%n+)yUwyWN&v=tRv8ZrOt7N^M)xwLc}8VQ`}Tovu;^|6{|c9Z96xksK#eI}TKCGW!$ZmhLJ% zB9)tft|RnlC$kHfbp(O#lyyEW&|L_S(Tk)^&5l;^2JA=)i!fD%YkzzSFxP(*+qpL; z@GdLn)Te?9X+9!lYI+BJ&VMIXBy+8_fL_8Ef|kT={tu^Rz^^hg}OMG4pb zz~7vDQD|)`3NDL+!=luS0$LWkl|=Lq6xJVI`#(OaiW+V}NVpYMlU7vMGov#gm=JkX zqEaLu%fE2#2mti)L$4T1%jMII9L7tbZZLcYN9R1Rc@xH;m-1 zAl+=lV)hMav88@5)CC!lPuG2nu+OD@GVs3(E8*~@sCz0`>Kg!D%vQ)p$S_F$1Y|QYAG$^K#l!7Jy6rN-w^;@wi_DnbsBG}##^HC z{-+ynH-rv&d*F!l!?k}R0EncpvV9rnzeiPZ=<7l$}1Kk}USm$$v2>NSONKC51TErC;0uiuwEpT^@S zr_8QD=c4D~A9GxK1;3fPTi;K{{nX94AO0DPTf{t=hs0o^i>U;E9sGN+2J2>~C2o5b!pK?R-vsOr)wT5ibON}~;3S{?&*RL~05rB}hBs-SCslXx+{aM={d#x7`&0)I)K9F?6E5v<9We zouglJ69yFKVao5wLqFuk%r zmug8b(USfh$)k9Ds#BjH=rekt z|D9Y*(RHdKUM#C=ymaly+yLDeqG<`}5u2|4F9bL>>%NJDI~pYc7bZ7@RFOWBE=@}v zA^{R3D4L3{T`EN(15}#RK@;%5E3@Gx&^_60>RJh8W&KoU!+*!Dr^cTk8G*`|!3BR9 zB!418gyv5PA^}oLQ1FMY?d9pY5yplD6k2v{XhMLPe6JQwUbuEOuwv)TR!gi?IT&$(Kvt9~eiQ!qaBCfsh$@q4 zsh3Y1jDwa~9VkCj^jboW!fr2T))81f&&~20&GNAOqDmD?19Ph3 zurcY{*9yQgIg#$RM&37 z3KR$%@;e}e8s#;dktfDwZgvEP9Y*})qIb1MXjLppX_nBn9~Gh202u|)rvd2N^%?*j zGI!JGBwv*Ho(TS3>ZZ@-63F((`@vv!*XK)20NeX8Y&)h-2L5+tU-xcdfL0KnJ3Ew=28LcMR7l>=W^G_Ti^PX#f=a>%~#X^WCoLOn~^%P@DkTI_yJ z=?dV0akWaLqHBLjtou`2I;9ds85y`-&xFGPZ>*as-G~H84?!{B(6x8c+8u%2MQ%a$ ziJ%(sTivQ6UkR&M3oBjw8!`{mwQN@H(W2Xfu3a^XqPxXb*Dc+H04v4HWtYF^feuuv zM#zD257$0Mg3&X2po|=gu^aw(Wr{yZ>ZE(d1PNqC=!J0&}c;fm{Sr5p1`#)X5igwUnBk~j%H+ewt`(9ha7cRr)&QQ0Z_A2DAQ5yYSK89 z_Qqr#Lo_k)Xgb>LFDu_Qs1+&RsC6Q2bdficHE}3! zglR_YKWaO!_M9AT>%Ij>%JiZ)>SE!yScPxp!2W7g$X8YH!eR5#wLgosLw!sONBrcN zRx8}m9Mdx0r%HI41@hGJl|hDs={lx$%TlFyg3N|iETgNAX`PKsa!hMI7&7RXRyBY? zj@SxS@V^V&zxYnwU-Ot2W)&lg13v8~eMko2+Rx|OdYzhazJS*y9u^3vXHxR<@|c!< zy7rHx9W_8d0nn{=+tRh~XCT)#POWRop|oKhAi(~w5TncQR^|6d9ISe{_B$G2WPS|Y zJ$&H6iQVH}>*3vC7g*S%SxDEu@-M8yd)&i2RTa8)73kXcLBs149X^-@Jjt;NQ}@8$ zXz~ucCGm%7`C%ieE~DT?Jy(|+3rnETO5|Wh8Ap3?B}lhnZ|;33FYE@VXXeBIF7(Wy zE%(3b!Hj+?A;)shqbUR(*2uc5>BR|;I0-*+Fhlr(OLEo29n3h%BTj$$d6JBq>^=lY zwtQZl^G$@Emg$E7U3kQ4=$2tYf3-PPr@M+>x{6(*6LFhW#B@?O6(_U{S}AJ1fEDx1 zp$0X`q?j9G+e){7Gmal^q%rE1*QT_}O0ctFy+?Nzy7u)le2q?pKP$v26~6EU70w5O zejyOLxD_l829z$2uD#a{(5wJjGyq+Dog1K40i-klUHbk9a1SRwup^&#!ZTJ~Suvh0v{`+rF@I zu6$oTbn~apC9iR5AY$Qj@k`}STNFs|4O3a_Z1oqV+hxp zhD~raW6Lo!F_Jeia>*u=`1#PS8@Y7hh5r+TfIlC8A79nw!Gt_=fx?&4sjJ{tGZm1n z@PA6jcfxJa@sw=rqT}t3hh;BXcXBK_(ZJhqb*p5P`5Cr~yxG5Hx1M{yZ!pzTRs4Dd!;FQn}zwb5j@M8EdXn}`#6Nx31IVA+05-L>* z`2MbgzH9?CEA&yI&wV0(ZquOe!>^!VT8~Gqjg%-a3ZkUt%RC57mhfZ#en3SVANBW% zyVRc%7s?f`K7q$62J}Y^&B6&%Lfqv_b|H6l2uC3W)#BnCWa2(5vKxiWiYy~NDDis9 z4OcTwYd78shUFZ!_JnQ@{e5NVmeB0Xo@ zD9vy%^R4qGqiH>7?WupkX!W8Db4sUK-|sczZDbq@Z$kdmoe|Uy0~B$=WzS+-3@+1f zUsvd6g;Iz!8}Vk2xcVCetuqkUQ}|8aAE-JoC%lZ&>~Ih0n0e5`0IcN$PYW@j zijU7HN>v=CSBkgB`J)z0JtmZpE*J|Bp9{}gRgHAC{Dr9Xl4;zy$4th@6=~8*1?5^D zMV;iQtoKRUa`go{5a^}#gZHGMc};3wvwV+f-1K;02foz~&vv|dvFM{58gYFXI+=9} zs%0YtOC^~3_H#!mL<9hdg%IpL=9F%h+@mSUh|6RP$xbaifYB9VGc3J|P|4Mz?;}&5 zHKFpm7zOTk!+zuNtMD3}}&D ztMz?qJORhH#y85xfeSM7%BlnRHOsew-3Q6{H{sbe8orP|<~UbsNy0qM6)a7d<0WXO_m?FqC(r;9l3;m}RkXCaqz*8Z4rY$ZX8meqYyu=9 zBZDN(KO4|XHqoqgO{~o1Y?65})AA|2-vR#nkUoP5;pYX1N-?!BM+^coMy=9ZXo0H? zZmb8v@5~-r;ZHIbFr?t;P5`GXgx^4P>xrLb{=d>;?C&y+5jp$2MeJ=nwG5Zd(j;Mg zY)9Nj<;}z>hJrc?V~3q^7>|WVj(EW`DFqQ6GRwqWF5f1OV!SRvm{zz~Tzt+++(+fx zw_=|PJZ3VS71r@-l%ehK&mKI^{w4uN!~NLhnrpnCnrke^<`Wu4JSoS+ZY(hz$;H#; zcw&yH#_?1;o=SKq4?fa{#%3Kj97-L)Bi4cPA#j#h;?LYXFp#CA1*ECM*d7>+n&^UA zWoT-)UJ$MiamN|sKfzVMERs@(8lU6wI-Weo(+3<tbC4-sN%JP?nBt~midQ+Nc(r4Sm(dh2HR3mOUo1PMu5_8= zcPmr83>1hdekMFQQ{0YPy^bkPiAN;UqpXxlB<_$FIM~fwVnbNqBeDCtT}KC^o|XC# zNY?Px6{8{@D<|eN^*u&p$|lZBuyI66Tyh?@9+l6U(|teWTwQ%1#&i_ca>_Ya&fQba z_gc;;KlxXebD3|BLe96#p*pvmW3mZ3A2itaORw8Z2AeFMo5QoQp^xfkP$Id~9BSSgE zk)fR7$WYF3WauP@V~WLT!?9m?M%qw922_EIsI1`_)P`dawyn!>)IrB^)IrB^)IrB^ z)IrB^)WNcZDYm0f1zUkEqixVbm&n5E#+S~Rl{%9y#tkg%KrzlW=3|WxIbjg+F6dPlRg8x5M2WQuCL>nTf}Gz6HANUy ziNhog#33t|g=VX@p)w4Qi$28clBE>OZN9I218)Wf?1w-eobO64+s*n{dx$SU^JUB2 zro+bkN!Zn#Kd0P_U;mYeeQ~bQy9t5WSAvw+cOtaatncud<;RSMC$QF!h|al2P5MT7 z((rV?qGIMFaBmm#Fm^sbzP3GIr7U{VEblYo=#6>Cn#q@6J~g263}!H zvv8!$CuiX(XFfR#N7XRvAxyRW;0e-y{QL=0 zQxk$Zt|AZMH{oxQ zsa-W<5CB)fC3aP$rrsa-ex&+4gN5B$#5j_@0ZZawj{%!3!bJS zxo4M=0{Hn_v|XiHe-xW(PomUFEBX``>DVw>xh4%VV#l&yzx zezn4C^-u!@b0Zi+r3{q`KN6F%#*3Ilovb)ODL#Xh0&k*HRvdJ&C;{FON~QV|m9pZX zgC&VdS#i+8(nO`KIFy>{-m*m11T#q+Vo<5UM6EwRoS5w|2;+I1(<9bl)9Q;@Z$g`a z9S4e-J~5K+^@S62{Dm}H(!C|{o)NX)hPM>n4`ARdON9M~v1ShDB_GocCYBAMVlQKPB_-0777`)G1itr7|$%{vo6{ZR z{7nbcl6w9XjD=hjb?O)&CIx^KU5U2;l_!pq4Q-4AzM!eT92_a`j9N2GO=D$xYP5Kd zY28$YI-F}-Ga+&_O8^a|Gkw}E(ry*q_LLwm;LT8gp2Xd&eI9EnwwCq z0r(s(6O&Y|r8v{%IyFsJ6YvePYk(CVK#8`;3RTSpVp&hLneShKJz?ub)9T2)cIlWr z_x^28-;_akBG$Hu1yC$-kqg1t;%c?4NA5Q+&bllG#MPTGAWq=YgglXfqIu)7e<+|)MYWQI*7s$Ulc+6xu!p6-Z+ zD#&D=bFxVCK2vX)wGvqCXo{&=fKh8eZF8Ls4n;a$S9WUt z>}h1d2~(D40moZ>;%2AjGG$rxP4YRCj7~7!^YMg$t`;F8@4&!X@TC#G7Xv=(m|X}t z*?fE$PM(%NIxx#~XI1u~hZcSaYBk5c&rBJUr_QTn$G<8^9{)snRHI;49+j-q@T1Jr zLXjG`-i?sz>sTsh3OL>aSBa;R9H-~>Bi@qjUbQ0*PNG?%rcG;x--sVY-{ZlRDzDLS z4E_kXOzB+oxmii9sfXIb<4li=Oqw3E{w-tiq)2jMp}7u2Gq$kX0&ixvZNT&lQ-UJY zg{1i4x*DIG=lXT{zRU;Fa}S4%`H((3*m|66Jk`kpf|0S1P(&`qj&KBx0r7;c-aj=m zb~c-d1IVSOr#)vGM2m6ssE?Y}OwNdzo+nM~EliH4n#y+Iz);*~dbUQ3J4|c43F!3x zOHJrz&#nlJ#G(k>Kf?CU+Mhm|L3krj07a2x<)6$cyG-jKkwT}xxd($9_{QByB`jFw zH`Z*4G|mBmQyz~&EUnn(7S#am6!p-6ETnUt6fw8d$jT&m&p2xZ6~ z=rV=E1JFGj#Oh4XL7oob2xVVtTGRbfClpb`id9qfNfqZ2dLCFsY}IBl_zd=2hoSnGCe~xLP?XX=E^sx-bbM9oOl!>vR%F88uhCR#ME4YbC|(K=;*oFp$wtgr<%}Pxe=HpNASJJ1k@O zr3V01POW}587M{iM-j(5mB8O5!}NT_5I-BfQ>V7VbyQ9Yen;hW!SAS?Zumvzpd`X? zAiDL$&oW;==j{RG!eHK@^Hp^mHeqOUipIrXYA~^U*+{674`C!s$5{xSEy2=mNf{T$;Q<*GkZ2>^dHE6R zz%1j@_DNccLCr>rQ#q9uVbA@;x#mQ@BhYwLiRrPUo|#2a&wW0aX&B6Add=jxn0e#{ z7DcX;ohd12X1?i3snk15nB1(BSE*!gE*YwEV+3c(8Yh@X6l{}*UExA?9l52ll0Jp40(W7MA|oNIFyKVSCy zGlcV(p7<7{A%-K(95%dB=zr)__7)f{P<$O+6pew(%yJ)IVLuLL$tHGG*Rn#+;2wNl zvJ*o-hXNp@Dqxp3k<*055EK_lN*D?X4UWN7MPz=zM$SFN9u?a9ABy|uqm06!e=!ai z&`YwLKpx!|lAFY*yXjghWyh7Ia(PCPzj8?O$vKiQoO6@UEkO=idogJ34xhA2&*Mp2XRzVDsG5Yv8Jj8 z76JrP@f5y5GFsAQuQ>D7{}s+hR4*Qw04pl&zp1`wF)V_cppr3DkNR&ku|!}Nq?tAg zk(14WPR2(OKS|2?z$% z5Kzhe{ho8)nMp_lTw3W}qs%$)`Fx&pp7WgNdCr%FHwLRA9~okFaDo=nOtdE*VVWC| zW*Vig*+_7ewn~H%_$h6b2qF9v65bTN-cG&xF?-T6X8c{GxyYV$0(K57c%8APDL4zU zR~u^<2d}kLuS~Hgz01HaBk&4)((4SLiSSD$d;#XU)XS6YNe7wcOGq=pp7bKqd=Y72 z6k8Cy1_{a~!Q$X_1P1I$FEG3c;V_6GV`Fd{V1q$Kj3Xw(3t2*?J?Sl^wcUeG*%O$x zsvz^eWrH8P$DA^VyN4MtcvGVI9>r~)GKhl*szgQvf8FMkZO(jmQtc(Rk#7`=i_O>K zs!bW3Sx9|Z%7gesk|mANO~NJp^}yvH!}_#40GDxjpiTZUE~?!&xQuIu%Rg37%b$8O z-3AqeXk?Y@;4*nKw@+C-*S0iv;D$RZX;Prc`>*ekoHUc+l z5;+d;K5-wCQv)`3dYjZ(BIXg>1o6D?m|b>RR|L7u*SYsTDXBelo^Z?^P`e`LZrhZ@ zAZ$rH{*VZgSS+#4Ez}FmZMJ!U!EAKCF2G)>aSuk!gORfJj`>23d607uLF1g&$7EC_dkq{Sim*2R-{Q9MzNBAlqk7%#d8)JM#=Pdnz*g4J;w9`^;u z+-R3=jF@TLe1S-|NqXvH7#IM)EENGF@OWkc6tjqST=S@)x6?LvJJ^lhF7++u2Bm|J zxkp-Nj{_thm7W7PB$iR6qFP!@6a_R00(Hbs>cu38dbRxla`qx_jcS)X3xW+oZhiO? za$`d*G~Na^;q%h(z~%uJzZ3r52t_#z{ZkdXg|ntKjIR%SwuLy`(N6H7;o;%Dk(7Yj z)ku*VlBxzZL{T_S0llp@{NY2&>_H00*XQUmIqsy)s4kNO5Jh<?AEuR zfPeDe!H>qqd4~7EkW0z3RN41Y-Snzc(DdvSl%-fG3%^bku1J72%t8RWg5AcNKIc&d zRyD`$+nffAxF^%4SY+*(y~melAN#2kV!O{q++-#wCe02dAe9MHlmbIhXC`Qgq}pY> z>oY;D94bWTWTz}``*z#SyZE^ap9dV@F1vXrKTqQGbtolv^EQ4S!RKMem$I9m<>yoQ z?6(sO4x!~2{~;)CqwS_)uBdX#4&|Cos%+m0)`D>f^8~GQ7>D&V+F;bvd;=QkQ#6vE zic@4GNdSaN+CpRMfkncU?oz?tcmtg$iIXBowX2S#cGYA>UtlN{`)y5yvV9Zj(-$G$ z9)7}beJ6&8BgbAmm8omR7|flV({_(KCM0o5vj!bm%d4 z&-mdn_0^-8x<~rDHVjr(TdUgVhe<$+KZU7tB@=c&^w8;$6ea-1jea}@!xe&|+}eH$ zdhLQ9Snn9PMVSw@k;BTdoRMYai&>jeyGci&9zF2E{y`FY2SJ}ui{6w<*v0!@_iMgT>l4ro41r^lm=zs!_(kyoD9;$R)q zcoL~cc`XPQM-_^Mp z;q=qkvaH%^G=Be%7~IH#_L}yd_`Oh=i{IVjmiJ#W<=r+Oeh)}ds{b?Pc=%1pBvi^Fz`g0`*w$EGv&LE?58A*tA;yk-Yi+PouFN+s6$-~c4CWbEf=h5uL z>+i|@c0PAaj|68h zvg0h8>pWv&v{8V|UrdY+P<^S&hP?*8cP|v23kh*Y+K(WNT6pR&_Fc0w`LO4mQ65t1p)O zQ(UhZ?p|mcf5y#WNehU!3K=dm_DFCKg10jm$2LGC2!^sW5NhC;1X3;%^e`5GUV;JmB|#rNEFo_M?n>8|1W}!!9WMV=3DA%c z3!$5>(~u2^LgBS)J3K5oIjZESm!Lr>Xv-$xOkJ6;^6~UV03}lr4iQfX9?Fucdkhn~ zGC`JR4Q5!iD(jG3xvN%ZX#kx14=1t*JE+A=L)63LHD9|I$R0u<7Mf`H%`p!X^B6Gr z6fuB53V%}8mg*6L4|FU{sPHhByLAWjvb7)nt8}ga{GXJ4ELfd_A4CAcST5-wXK|0Q z{B-;s>}fzTOOT{YXKjGLl36=$MF>8m!U4d`lzni$3e)g=6%N7gRmesS=0oqq`-h$4Le|F|$M3kVJTVl);su|(;` z1^89YFIrz43yt}Q`rpErA}g3Muv`YFn5h&q3zqk(lxTk87K4k@6pmdl^AG*-GMYX7 zcDy(^=6>AASks6Nx#!bc=3_=SFn^se= zI{lI!`QiUM(#+b9f7lB1b)+eUf9f|?IQ^yHRP|#Ul_&y^n^Xaw(MMT=9IV|4ob%MG zb-9B@_G1gNnzudTb~)IAAsVtJ}A&5a)A6Uf_sjD(;r5VtBu0_qr0k0b&6*k`y(hR>)f6`xjc z1q0eup%Tz-V*sck<-3vzLQ>*q97tv5&LxY3GwAE1FHK($eZ3K1Dsu6&SPp$^vfk|o zxvZw_IVb-%w9X|9ftqwlEz@YnWVpxYqt4dMm4^43t)?4E{8M*ibzK-H+Z^U=N zzW9h^{B#?>cFQ{L4j4+Fn2aH_2mfwxAZIG!)$u__6WPx34Pu+3QwB4@Zd#CKsJRo> zHp{#GjyoS6IX8fLiQ_S6UOHv}K@^Nuggz(!y}(xz1%r`9!HpPE7`Z>>NP{Rmbv_I> zSHo5_?8JXq=*0ibU*kJe9o$#rgS|_}13y8`7HOXJ4@eY898wAVSbdh! z!?7Tw+Quv^?D&nKZ;X+7=qO}gsgf6R8~}eAU)V1I)?x*tjueeJE4T{gE#$?pL0*)+ zK?W&kZ(cAK;rcuVrhK)7d?lZJB_WX0V$V1$*v;fUcKkw=;y_1eBW zIr6w?K&~k}K@%cq4KO-L*1<)1!8i&!bn+Kqmr=ZtG}?&90cH1@gAw0JMR1EraJQjt zK#Bt0~ zZCE=_!j48R-Vrf=dT=s2a}PQb^wTp2{cMGO2{t6yq-eZBLuQBvgo7@-oy0@p7(qOw z^1QF(+;625zc6QzCcb{SrlLpdULbMVJQm|3dVtekjMF1_L&1EHeyZrvd&jVOEQh#} zYj+HN#_qs;DL$xDTpx@7k>9S^A^Xg@uNzv+9xv?z(3+Qai0gwxNL_MjYEJu6Rr~@l zVlPXYS<*IWADiE3wRDfF3ib}}rnOOJL2C4GBMGFD0HR;H3 zz7cmK%~lZ0NdQKtA4IOHvi(-EgwrAgalFaUGA%Nx5nmP61%rEt75= zGaxX@pC117@n=Bx%ERO5SAaj2c4AIoZ3yYj?dm=_4ww+T(dJJbKWptcHnXGC8=tAS zhdZ%3X9!zyxP7e9Xnm5lz4*Oq&agmN@q61*9P@$X?p5L$`EUGQg2iwU*1eqe=m(>| zH>&+0oH-44eC`s~EL0J-yOP)wnscF8o8fQiT7?XTzjZ@9-TB?d#YGzc&;@tC9PaQT zD6*D$@OLHTN#K>SwQ;@z#XS>6yU(x_ci)js(nJ3jrX zo@mxSlEk{;?Gd5A8io+I!R4wf9EB>9p;= zL6V)ez1K^!)3$e~Bs*<;rzF{F+dGM5s=cckL6NzQ-i=0=rbIiVu^~7b<=84~RA7E$ zJ7Y9sCTH6xBg4r^^Uz0()?!|-IeN5!{tbV@hRj&;FIQt{evdJKn{l!FlA*)1ZXCnw zMgQ`ygw$Lo$*QD2)U0~g&!7N*D)|%QPc47y`Ll{Y19r!cqbL#^I62a>5i>7}|MX`! zhpI&M+H03)A~4I@>n1Uk#9}(-7t$36*Fl|!2OC${#U+TRb=JitsfsAE*SS&omUIDo zU4G7IxxMa!oX<*oo%&LFv1OIz=jl3x`_? z2NCr207CH${8&c~3CBZJ=psZJ<&*zy5>7N!w2CzipR4s}AJXIV-}UE!`dp(w^H39F zAJ(6K_1U361L||F{!FU8>-48^&GN~=)SvAt_7VL_=8Tdb)t^!I`IvlSiIg4M#via` zaB#$856kB8V^2N#Wb@F3 zrd~4%(=_NcQCAR#fPU*9``dfIwQ%7=E)t~wx|3L6zza%$i7bvdp(PF@23n<+E=cgy`{R)ZVt~rmDv0qvoDA+noL!9>t!}{PyKd zZ(u4bY#u5w?)wpD3nzX{p*iTdz0R%kRyW)nFWqI|+Pb<&09|kIz%2p&p@?zAbDSo2 zq+uN7R|+TBZgLBD;qYmot~U1o9|+D5Kp^T0a8jd4)dhK&QW1Q9 z`Y`LEapG1N7_JCI5UAuPUzy9yJ=vx;uC%ZTXiLQS8Pv7|pGp)z;67FHEVc>f1njNY ziDS^W^5_AW%CYVCt#8?%p7&-nVivzRoWfPSXzsTsG_4Jz2_nOtk>;-QFq*<>#S3u5 zHMb^jid!32+2+LXa5CIHRARJF1up_`m;us)tw!#R9WkGdu-C{T02nPurrh%~gvQf6 zq&>qIlJxcP2UOJ(j519|Xu(=Lz9|$#YNh<$d?IADejDpJM)`zVJZ1zM{RSMGghJ^Kz5pbWSClXX10F z!|7Gd^OQ;l%+1o?@#2`V#husMV59k(k7L990ko6_fwmo~eu^$zZo#w4!a=p91=+bL zzBstrf*Q2Jg3SI5;#MNj3dD54-wpqRi0p;`A^6*n<`ES3WO&_-33i@^%+KeFENy6s z*LWTSttzCrjw6nL_OX}j=9h-Bfe`{n@dHed1YTUM?iLps)J`74iT^%i^Bdc&c=592 zBver~Z+SztZ&S5zXT10?8B#T`rJ>qpEB>kXr6Lj7kcm+SyfBOGDT^0&PU8OX^TV zIF&+;Pg~}@sg1?Hbl6NeXsIY_h!Ued!Q??X5P+lrLM6T2T}%*~2!cZpWaN+?!-t%h zhicqik@)PDk@(kE#iuGf7YkG?e0zO|Ei42)kHR%{Ro3zb3u^+uLXdgPH^Ba_Pj&g> zJm@=VzL8pA?CUkV2o|8fE!9<`LN7-Hw4jS(03{1WT?Pu6%w~5);(wlump&>@y+A-{ z^KJF*MOQBZ8f_U69svmRf{VlETLj>?U~M?Hkr2FQ`3{>$QmJBJci7x0Ff0hpLu84L zxEyUDP*^B03x=Hm0~WJ6I4L%_Cq6wPU^JpHd^^IvH&A?C27uNEz~orw3zn}JG`axQ zqvoTj&SGDWt{D4nQLhTU9HgO;&#iSvrq)W-3ZvxwzW8+2{!;7Sux}8x+L>CHHvsDp zh^^W@VyULDBw1L#t-9es6@oSP(2@vrM5gUWl0bQ;{s8JvN8)!4#7qC(Yy7b9$*}Kv zkk}0L+=CeyR-@?`2WM5AFIm1mKo>xtE)Sse7n%~ez5mRKeE_@q25N*^>Ua*S1AW2@(gUrhj@>9^^Y7Wm0 z>>KjH6$o946y$*q!rzTZ^1wFuA3~Z(P}q|s-{&C+zy?X)Zu1@i{#~D)1KaEbZu(OS zj9rF?@3bqn#GRJ*D(5GGDyJoB7TpVxg8EC-GsF$-#^E%Q3}LcQa>XFcqOsmLATCp& zexx{ly>b7)9+%mU^H`3lDqH=i`>abitDv=^u{L5h!>ObS>rAxn@#Z~-6LY#r?UL*B zyHC3UHV|tdVxlT{kl(GcmmZHYN$d4ksKP9H38p-w{L)f!u9zaul+VMVffkEfdi~4r ze}PLfNyC3T=Fi2LnEkg0=;?!}lAZy0LdN`lqhe|h-dbb+0R|&A&TbkNw{ZRPteQw{5_xviwPcpP6NUg?@KHY@h~M z%sDCafn~^ISR0LDC>Hj9_OQrJQ63a8r=_%q#wPSS?S5z%2wG5`c&BtP!-g0ZqpyU% zb~WwNzBPk7YY44_xfZ*0?Xf3X2y@6*&l?ME$K8%oyzH9+(2MjDTr5(-TKBa!nAUEJ z7eAYK5ftaDZYpY z@311<_qy%d6*1q5q&5I3%y8T$iXGIcjh{u@cNI{}1t{#Jw0#F6<}*kOc=`xiRHX$x z5I}T&?b=-h*N%r_Km7ixo8q&iEW7HF4XiifqaE8ZA-Jzcy-hR}Vzc2%JGCjdF$6|h z#PL72D5lm|G8ssCg-R>!;MLcr>y5HrjA~Zg;l#fKv3Ay53Xw-tfoS|#jqllr@7)?R z9Z4kxf_CiEiI^uMsZL;Cq%m)Olh8UmD7Yh1ib?f2 zdJfk?H?80|Fa$VvcRTUBdLr(-qaosGuH(ia-*MD(vu>=Ls~(Z+Bfh62@tWS6_?>-T zMzo_EF*M}LUeNfgr!4h;B(ECZ&KmPgJ&IHq;9f1;h{#)D9A7R+ zh*<$xNsH_!;yr^ibisb@=D}4Xh(nPa0~fliM+Mjvdr%D*9fk_jNeyz0LS~cEi?Uf3 zcgvK}MOQ4s4C-p2r}%jo6}K<0D!GUAA)MthoG1ONFc@WyN&w~!gvgYms5ML2;j|^BlO)R zGXKjq@+OQ6^jWuzBW=~8JTP+NrhI@&RU6DOg^CfaMO*A!g6+u8zy@ZF;=@iL13@ll zRoHn_3Ad0DXnLAr3grV>))UJ`OiFo`>?ldM`S`?NN)lt#+W=GTIJN^KV<9`B&J%Pq zqNxO?Ub-OtUw?oNK>)+gvPI$n7=f|DXi*ISO{zzLI2D*v4pW{n94|GUfK3IPHFT4f zPiQ#i!*;6MCoh59KL-`U-U5V5&=92{U%%NY##4-^06vS&Ek*@GtAGlSD@Sm!3bHi1 zerlvSbwQ;0c%hN_M{Im$F4$cu-pm&x_j1)i^B2(2sZQ@0Yjofmb+iW;8Sz@G<FT`CP{A-ERnf@m~n8`qK|65{IE-IwV^?3H6nNsS4nC6s?|nd5aBiUM&Veqepc7|xa6<;V50Laaa==@qz!PV6aCH{E z503O!=786(z!PV6@TXbu-bd%2Bhp)u174c~Pn^{-;*wc%;Jy#&&JpRwa-fSU=)_qa zY{@|P0g~R59PkVaaITC zWx*>wd!}4+ZrGlk171jhC(i1il?AW(?7{P&8}Mf2fLE!&6K8dBdKSE*vj?y6+<;e} z171LZC(i0%Fbkf@MrS3joTI)i$$`#K=pg;kX$=;`af@gXFMxiKmA?vea^$HT;@?19oz3AJPv6praQSOBeprWBh7y$~v){^=mk z1;(;#-{3vT$QQz?fNj)5DvkNQG`3bs#!&y|NWlXv-H`Y!NLVonfIiFYK|z%kPVTlc zAY5RXy$G2OMH;IcO~FR@1SDzbsIu-AhT4Z)g&^x9-w9lAYdrkA`E1yD_?Y=twL27s zSZkRZxem6Z+I=gWdIg_{Ec4lFcUw5M4;))Y(xvSdjsy1J*HjjnPr?E57 zGT%nxC<-Gay_VUHcB)dvqkSy1&m2M{g}nAer*P$RiQ9wpRpDZH8+H~heM!*VVm#~w z8_jK42s#X?(Vb217BneV$ol=}HuMDRad#5etw6>+icV@_)j*Qb?5I)E>?(IF?%QQM z?#wL?YhJwMM)xx&U@ns_sS1}6itn*nta}8T%q^#>+}%oeb~4ow4THID3@8LhsT77i zMO?Zun%tf#gs&=GifUCOY?0)~!}EfF4hUEQ@xEO%#s+%^JR%C z@nS*}Q^Y*KD>0>Bj3qHZ%L>kxn1C093x-fnF=K9&7??|NRRvnbK|54^ReItkG$wDN z)G?LrPSu%J-(h1R)N!AN!e{P6w&_dvNk1QVcPV;hFCNFx#MMEd5c9Zs1Z7P{O21c( zyNglBK$691qDd#*V<=3M%Sq%ck!aP&Csj?yjE6Uy$Bl;@gTI3w$66-4=ZNULW(vdF z>}D5UWp-oWUkCvGsISEBRc|%)1+=h77L97U?kYdnsv@2QV_LSDf@`eoDny{I z%pP+9p$H3lVdZQ;rkZLFkYus8#LWRIKbxorgmELtYF_YTtP(LLZc3U+;AGk8)Sc2! ztc@rHSTcJisCfy(%9$$LQ7l@pWzuaJl{b@=6jo$8s?pp{%z@5AmHqxnM`V<)mJ3#@;3K?!2Wtsz6UMPy1(!|k9VILid|zwCY2oL(dDGq?nW)_(GC z8hG2pm788cX0ko$p7~^EdObDL{8$u{K;E4_W8ZCAkIXIqRp z&+FqOizr((ur?{Pj^_nnqK4s<5wIzv0~v;QICkrc?IOm_yLh~{g2s2SG;MlrXAM9` zm}!8PCx)cI_AOk%>iata!7HrUX{t7?_f+(0>@D7ko>>nVVUJ&d7Lxu_W+(Pr8sN#oJeH60 z;jO@Ol6IroZG($l=t!7KPl&Yy{}|stmhWU=KE9dHZho8zt~c(T$^ubJ6wqi>J?1O= zYH_lO=;Bxd4f7!+(49n7(QwlC`kDwB8Yz7;5o6IGSoXlSh3jQEKCI;3BVO{I#!V5F zO)2|`*otmgB;U-8#-G8CVMu!Ie^Gb#DFVSY)U`fVA$Nn6utIiwh%nl!`qi0J>mEo< zp-!?gh1?wYr89>>`Z7IDgORu~M9}I8EZh|sb2PKI!)4)-#E+tI7`2j7aC?~)N&4V2 z30KB=wwGbOa2dvSkfM-2$#2AwKtl8*PRf8x!ZKKAst z?A|uylWx{-gLdn+8`5s2b_3dFA32GKq(!;lHiP8@wh-L0VbendD=@7JBS>lO0u_%3 zW30|_+^JcT;tBs+RAMJ;Lw4djp~%c<<jp}esj-}&mnPjCYSjPRuwPb>9@V+$_DW(;ik zIT32YWo{3RSb!oTT)@kcl-~PN%W)usA+v(jaXk`e_k4tL)?fl^ag$hijyVOjxZ7b_ z^80Bg0lRwkVJX&-VJYBKG%16PFhPKnTP_KjkB2+NGx~u3r$#Jp%^>#*usHBOjFj|G z{)E@AKQv-Bi{+dhPO?ALSQATr#LgpHlSkkKNJE)1_Ul9C$v;-8# zTt1Q?loosJ;5GA5_)+3e4f?noZZ3UN zR<=ZAO))M+eL%RyydrRm&C51_|G@iT6cMB5DV#l82QYAV+}v#xbWX!28vcmSd%RB+ zj4Pw8%2@LkUq0RGS^7^e2&z$I-W=qUTNJfa_$g5^*E_=AIU8Pbc7 zkH;UnJpOPr%O738hgm!V& zn^qAVGfC~o@xc3%yv_)tei27MMtcL?kffB+Eq8-+G-C#vp~5+_;YgF6Sc2L7uk!9d z{+T^8c8_B|w`UIBadlw#ofUfaUf4Eb{>Jp}SHm^k{~1(+`8)UU0QDI?pT|o5-taxd z4sRz=7?msOp6RGm<$ZADvG1FzFWx8cQQ-Q4j>o{6z%S!*1co1u#~jh^`MO-5wmdVf z)N&Y!46R1$YCTeA?xdnABBYG828^_?hP+{RM26XbanCeRM_{+H>?*jPu*~z5Ir4Ju zc)J8!#m{WK^{4r+4R*r?GLkF5vcfaJY8h7-V%->?NpY1GmctYCze7D>#QbkV_J7iN zAjNAXDG4}u6Z3)2nwf7J_smBAz&2yqmsw6%ih@7yYo-X`DJOb<3Io9+Dg=d|LQn*b zlJeiV|6ql=d2}Z5AI!($X~jk1SaFfstS$P%Z8^g3spzcI=qTaHLx=n)DKXx@xgw7l zeg|Dt8**kIp-2+}Mr4KCge?we)y7yh6?sLy`7{er>P;K*DJDM9a(FZxijLNAGV+W+ zJgu}iR(i3=5MSe^s7m*IaKvK=A(ora1_1E<5Dfv~>NZ@7!=A}X9mX5RR2XdlnZ87> zdNew7Q8)K;QA=c4i4HS2d*||Rcomom!#%4ytS}P>MJoruhsFRih54?9*O5j=q0>>-ioV5dB^zdD!`=->dnNc0OYnOy+9%QxC`tf5`v2 z@(aiRnd$eBg-}ejd1ws%eq*@#-Sbnw-+Gq%ecR2svgBEsD1Ht4{n^6bQ*#FJi#{>J z2=o86K5@2f*y^Y@d~f~!tq=A490C7~EV8h*oNZs^eMR*}J6YJ-8z-X3c24#CvxPr& z(;2`o4@7TFK?L+;3EdBnDFH*Osz^`@ttWJ-GsQ1$6y@Vs}>*t9+ zKMM$n22&-Ni3Y=CX{)HzVfmX1<9q1$6<9DIm0GQ5j-l^o71SkEz@TYH;f7c*RO=2_ zh_EDF6$T)5x(+WLG*Zbsjz%hF(7?g6#?VNmJjAoS-=Ic160BT}RFHv2%7!>M8tIt! znN#G^^JV?{H>8i2TK{k9qs|Q<>Z9*hAN9}vP#^tJAI)w{$qVJmKEHkXXz2PgfM4X_ z5A{*m>d9SuqqZi!bDe6#5A{*#anR-bE_rTU_sa^Y{GKDz4KGk{;l;|L5t z)JJpl(ZyfRnn3*!4Fa*Zb&;o~f!Yr0pRht&~1E!y_h{ z`T2u8pW#0f_+>nf!0^1&&p*iV_~cc&JZ&ufypL1?%|wmV-_HHu${L8%s+z*zb3Zus zbLtp4Jfie-y|*1}#%gc7><2&n{_o3iSNFNz?>*A2IcmT6Z%QBMes8}>Qn>S0bLN1@ znXye?sg=t_=mKjm)Jgna5^Vb(Vs?mpd6}@$+rB94p{GmkjB2a&RjRmzke4No1s(do zaWXd5WH+SGo6Jkvu_L|dSG++18hegbzp#z>C-C_wZcmqIZilJRuaqj(F$H}ZUuui{ zoH%YGT6Zhr<m_kaLlFh|h@CE^2D6E>bk(D{Vr|m?+qP2F0`K z{G<{zT>visj5TlA?u+k1AAGfJG<`5^bi18!e4Bx|OD-vu0Pzx52Ez287Y z(XT?Mzh6SQ1{ejn@-lFpKXl878ia1Ww^r0Se_}*%*`)%$qG2y`JTeYs$hb%2+y|F` z=P4NrnCML1E|DVh06d{W@*xVl#!#z7|-UNYcj57yMtWnGvxAXAY-Wnh}W?) zkTEM8pNuO>#;b@v;7Y>f-}%ITbI4f0L~nHfL}HYri!N2+!iv4f95Uu}H6Aw(gW(|^ zajw*T5z6$%fbDj@2TQ@L6sNEhhK*z?5l%U8s*=W=a+qrrD|S=hl%u&ZU$hV~;m#nq z-Z})B5irt$h>Wr!ym2faz!@yr;3Tvp;$kv(=io~H<$BR%9z`4oJCU{jr2p)=J;T9) z(+XUWB~nnKZQ7n69-pmpARQiO--f&SF0rc+R$-Uu4DgtC!21Xwhg@NWYzSqJ{>zY~ z962hzM3u-f!~2+F`!e;-$W(zB#&f|ivtam9L#A##Ht*Gd_ri0*FtcEkBZsOxvhMY# z{@MLj^{0J+uF}C}XchJhJkaKk#J>cwrI0d+2=Dc1SiDD&Z8zj^!g1g#ym}~N$_XVb zOjh$)JgTIWf_IgaLb>A#Eq7GitE3c$U7ZaRDJ5mB*))!nq9;pAB;I7%p(e`_LJD3> z0keOX;Mx^KL|q2^RtdL0<^vXK?O<_hejJq0Xt}CarirDv#pX+IB$

$sr;R zUZEwG4%Lfn{HrrT=tSv37LpNney+rw>0|WZsu4Yi6e8~6>PEJ{Uo)nFW=s%bZQoue zQTi79B2s}VLnY!vGD=oiu4NUJz}I1F^+e;nzZvB9_bQQJEAUtdB;1oI=hAFB zqFQ)e&P?8*)m_dY(6X+{w-ty>x7rn$eemQHKqTTyXwjE3* zbt18VoYyPCdpvUP%|TC-GlM+zI*8t>()%cKW{y#~F(`{0`a{TB#E~4C$F6|PjhDxZ zG~S@Y<+8j-vK}e3kVBzwLCy=5eh6~@{ofLSCCiGnc=aA~i;%MtYJ{ADH(%WIII|L3 zgfsuzgcc0rb0f5PoSDNoS9akf%5URhS#^P?NRb35VlT^`Ui~Cxzf%QarO2C=5^f7}IREVE5 zD8?$hB4R0#;eDzAa=uwgfTU*;8Q)R@Xw9)i zhjS*lX*0=Y@@hX}2d`G5hi4{Xf1=+ji6!v%i1fF`OoIMAy_p0AoE1C9reQIY2n~;x zJkCEeiO{f;IL0@V2n~A@$5=EhLdQ9z;aZYcj=b<|p<$_H40&U08kYWCMbQj!CCQcX zcmCN(goXvo_mDM&hCNxsqhXIBK^up$y3$y)(RQf-j3?Mqd>mQ$15R#wHQ(y z_q>G&14>=RQW4exmti&W%eW>(@bA_uF-X;*Q!Rm;hum0^p;;pmzlE!5G?bx;DB}3X zy~L7%+5|tCi>gH(Z5_3C6<+`3%9yd{ZCfn#;}|=r){i!JFl-EC2lS>fjR0e;3}|DA z)-BYEj8YgM&y_P4jJG25U@$5;;_(iWBoKr>i7PVFU~P;;TeQRFpRooHK64f26ynsT z0Ft?<8fx8%K_hf0XgD&0#$1ijDCUkJjiMew9*Wv{?_GKC2@u^2N3#{4*iIDTiSL$igp6GLAZMUQ=aE2Xmq>{NECnUz=@N}KJ>yt(HK*wu zgVQinmXyb<7w+q@8 z6ugB+C2Dvb4J{*i$48m7N{j zK!F(@E1Y(IrIfe|MYB(naQSDfIe*N|nKeZL62z%wi8Eb{VQ+e5{0)o_tQ-rhKApa5o;6)kC<&V36GdX780J()?3@2$=Kk9|@$5?tfPsNd} z!7pq5$dyWJN%|$6uvIj(N+hY3kQ)0bMPiPjzPdGTo{t~Xb2B_j;7{_7(^5` zpDLn=QF;uWO7BrTvn5o~7T?Db>JuXoA5F~yEfA(qGHUGwSi|};&f3d=Vj*NAS75kn zRfLc;S%SGxQo=HFz6}AG0!0eJt9_*D0GYF&Vc=E{!yFjt5fLKmp1}bTrSPhEtEz$C z#-TDo5INuI9ax@T2myAU?Iddjgj_E8svRJ(USkIcw-je~1U#k`W^If)^Bo{8WIU^B z?jD}8cYpxE@#PTg6(|yWr${N7sY{3gS|A{9201LP0cURk=Em`CBj+K>o?iF>`DTTW zu_;)sz(_O7j6OpCI4>z!z|069cr#DtsH|N?DA*G`LV6TuC|G2V^NxbYlsz&OEU_7* zNLJ|3$c>`l-xj$8?8p-=#uqq*f|boA%Y!rQSHumhzdSq6`inLR1rU$ueXBAS^fcl~BCFhFi}aW9|{0%=w|o zXU+iwzFldJC<^N+JV1aqX^*DcjvODZaqp_bIW8X8`UCZ{>d5nG+4pdHelp^2jkxb{ z^8{XW#myt}Tk7@I9@uIHy9s}=5r9fb^WBSl9RNRXZ4^I-)g8m+@AfwLU5~>*U%Knc zbu$o*himNwg?o3kKE1nKB;$iutXncFn(e~LrX8;1zUsI~(rug3wyBr%af~jze&z1A zcN~b#E2zY?B=f@!Tsc3ePTvh7SU-fj zO6v5Qw~-w;4~6;WFS6rv>Pea{dzd=mTo_mvVq)|OV9jlBvU~tTn*zYXh{#%)@Z7UK za|<8TGxy+77(Bb}WqW@385)$!nHudx$pFn*!q0&Eba$se1`Hzc8|!UfZ^VUzCCWRm zjwHT^6#BVk-9-dSAmcmAMIfn2*NycEgSaTv%;$wOZw{lKwapVS16N7000=j~9cr3m zH@}=DD2QkbE}|K%0fpLtX7xDb)v<_rRgRR1eQ|zb`29%YMnT4=v9LD8{772PuS)qE ztErlgU$5_RxjDrKOQOMg&#=Mv9YTY-e^ifdXa8cju3y+T;{D?#?y#_V?y`= zuI%u{BXUvGIzJlF98AwcVYx%Mfk!B#D3&e<2Hke;l7{4nrFMI?+o#W21hf^;L}a4nKfe*cNYXnU1LV@)iqD)$*2d zeywg<04KG{z}x9ZQ=Nu;EY)>cDm4*rtsk#i-9q^Ay8P-ERVw(%kY%*~oDVQ{CG+6q z+*jsrDd0&;!{1uK=9fpOS_|q?0wxK+v1|`v2>=#zJJ6c$9=6aYr4~ppV1b~57PvsU zg)W+EfqY7;-3^GUbYJw&XS+j|`)alOOtpKW+I_m(eXiPl!*bt9tuK1?^6DqQ?{3@i zN?7?);T?yXhXQL+SDt0u&>x<3Xm+CL(_!CJ)$Yk^b8oe|wc58coZ2|iG7pA*do4F* znfuJ+z9UwC_Z!FFFRqmJCE%w+d65d z<=X@dTIzj!^HrBA1db{Mj;1yNfun)|domPuyN%X)03QRi)G`Oc?j|xO%j^xi>){Jp zW_Q?4!B=jXLt(cIzNwbk6LveTs@w4FJ^IIdJC4pYpUUBf&B+iMfc#+ANhQfOZT^7y z9KXKW?KAHG-FJtF59XtfnQw;WR$6Xdf#uqTmb;|La%<7F^~G*oiMwdb=jp9c_oa2C zvxLpd=C?-dEJHJ8d^+H1a%Mb!`XR!_@fYgwL%Yv9#4o2G*NVm+s@%O}VbM*fr+SvssR zVW-q2{uhyOKw2~K^v)FsYO|ZyhnVSCIA|YP+Qp)fhaLI7|IT})Rv?jQBniQfW8PN) zV_Z0;Bii6Hg0J$GaB>RpOCg6ZKfgjPhwl8V_wEsC)bt;{dVIM5+ZZ}E%Z3$UMG`+E z%p{-2&#}}xSvzB?mU|rJ(!B3_JD*!J!JNU_WI)s&tYFe51U!nAA^aPa8c7#%>@+Z8 zF5C;)DSAw0r&7=sr_vstOFtcL{q=r|y+8D09_0YaxxRpuG6Y!Iew@o9@$Z3R4x{6a zkU&B0-Zdhgr65b~GSL#QQ_uJt_kR@QzJDry+ITkti{=3kjFocE(18y2r~T+RFtO;T*sc=(1wD|% zQb-*o1W>34f+YlxJ->qB8vjb6+YL;i4GeCJ?wj}v-}aXZm*+Dnwh5(=(LI;=(7hv`Qsamn6xj!s}t~&0gMAXKi^Izuf?=7$+(w- z#&B?B=%43c?qA;|;w4AJl2SGWm|K866J0KBPWVizy1h{nG#|gBgP#5lCU0K9L@m>z zfJK4R6(9+ky_-P)9Jw)ixIl#5b(N>fEeV>Bn;rBVoQ2$V%pGEGJ9N6-l3?7cLh;5n z)f`|i^8##1)EkAhVhT(by)1eRhr}PO$9=IF9x>Ite6&>FJDykv;c6mPZ1tk&L|h+{ z^xyf4ow#=elCBMX9$SiLc7OM31dxK(=1D;6yQOBb4e#~wGuAqhX+QHHhdMypgKA)dv&GL$FKXYde=1UJD_@a<#lfY%s)eg*hb z$)6B^YWY*op9V_*QVm?rO#E)w?kepjwcDfJKJ5-@m#8qGU%LVAR%$n-T}tsxSFha$ zxFes(Mt{h;%L|M(Ee7es-NydNXB)>_ile9yLhsTOtnrR#`2s51tfff8Q+)--n&pOS z#}Y&eJDDU3x$*+9{GYP?g(<7(9*Ua2tWD=vb7a7)GjzHjt@{D0TM;=BsDbDn|SX_(K^fFu1>!o&P#dn)_qj1g57;ma2 zjWtne65U#&nL(A~`|bccqcR}+YPISjwv{}c`xD(F=%YGPR>Oy8Wel7vt|I(Rjb+>|8#UIb!5k|p$c*Qvy>{2V>?8ic8&f`dqZ#j< zCG^@|a~ia}NW1mgtg!{1QzQaaEDd%r|~80k5JrJ()?Q3;e;f zRlb&_v1|fifygeHvO*0EtNL*fs%e#K`l*649RcNEB!Nq>;Sw*U9z^jKhFzT?tm6l) zujxN7BGmJ!2SP-^Mv;o$%wbbbuB~y8MJirIGUy5EFCk?_XLoQ~`mgO{$8FaRdU(!;^2=9E(ph3 zikQ*MWjAkF;#pno1a!spzt8r8dxD-u*y9$l!CYA-UP+LkKC}yH_s7J!myqEx`iU^% z+eQSdBC>RPKN}c9jkUk<{hM$5%jRITzYu$uj2li4J{LOqbZGml(c^fpea+Lx4O?di zT4&sk(jsvw?dKE2S4sZuFCmSwW($*4sw4;f;Y}?Qi3o%ONnMk8SnyJLBk}v$ApmFy zbYR@~Z2~#7+eq;0HIM#v30{3dKvGuZ+IyM1=>=XEmSk3tKsVed{)JW1y03A&_F(#s zivV<&WJLn6JPkv}zK59&z;yrM(;n!f5@zc^_zaL@U1$jc5^<$$s8B4xxNjDs7PjFN zM%4S+@VIJRu8s%YPLvi*{fyaR@>lri)=&W4y@_b8LOjvxfXlRFp!GMCPz?^$$g)iz z(uilk^NM@@InZ*goHd#Ej)mRDQKv_uaZ?hhOay<_zakbFutK-P3=QKBr*L9 zT+?}Q7v$;T^>*_{n!F2}uw7d1&8JS=gM8VilTOu<{u z>WuqN;u5r2x9v+hSlMSDC$5YSH1GMSkf-`CZ0?IXiIt%**mycPxzI9hzxuiwUmiWz z%=?-TgB)jic*l4xjS;p3duXVCI?BqC2OOvd^_VstFwnZ1Ywuy4 z&S~bDbK3@Stv%LoHlg)~CpI179ruu3W*%sQ*$O$Ykepc8X-+m+Zs*{3RmD9h+Z^nF zf^(63z;1qN0K_%0(D<`W3yu2ZQKKQ*hgN7vA{G}6KFt=HJZ+9@noBFbsytWtwP(sP zbUYUAu6|Lu*K{fOx}Pa`@=xIE@rY!pg~oRW3b0st`>)`8Q+!y*{O%j#!yaltum_RvCfl{ zmhY(6E&sE*y5;{$d#3z=9<=;_QSLQ0%DwIy*a|oG5I1%7NTeABq3H8tK!6QnqHX zw5crHW8627WBd^M!**Y{Q?C{{zGIQNa|nYnw>r$vcA~(fyny>A3NDLT(*siF-lkW% z4jtf1;5WCEgKosYE^PXF1|3~3g|z_cLOn3c067xW)$?sdN7wur*qw3TjJL7a49TGe zt2XALTmV9OzXaoCao5!^-N<(oGFsNtknqTpl3n(pbJ9P9*0NyAD3BuL;lyn_PrPbuJ?Yyn=y zN3!T_5=e3bP*^bvdl!WjoKo1ky0B_vP1A(D8xjTA3nVZxYfy5EgB=A5tF;M*okU?1 zPALr6;|OXf%#p$->B3S`oRqp@72Ov8E$Sy>E zEF0CyA_ooYSZLbf;1a9yUAiS!ofW31CCr zWZjW#f5H*nbm-s{p5TdVnQ*2V(q5RGZrV{Y0%oz| zFUL?~5=eMLXgAb0O5ZugeKp=j$mg_@)8U{5S768~4?C(=?q^PmpNlUOc$ULpFEcJh!0LSmb_ zCrdo)y}yFzrWO27tl$%1jL*diuB0$K^I+4fkO_sbXi1`U*6D|3rLgI7%C}Kgh_)DD zeUNX5;1<%4Fv_Y7%av~*BZNx6eT)Joc=nrF`Szz;zI{mYc=Bzrl5g!ql=3ave=XqW zToj@pJEOk>~e^nrnZ=8aU!Yvan|)TqV60vl9pivqO3f2Jie7D4n~M z0>*ufB4|#9pgH9K?th2)x*jPxzhzQ1pr#B_=@)!Fn~|6NFEyPK3S z`^0#{Y`--7!7uA(e+e607;?pC?U}NQ9yI$3j>r)%Lp@h?Jw)NwHtzd9 zFb{K&$geLdap6@ilGQ?s?ah^8F&`@V_1zKj>)|GBh{Un`1L+65wEhp>|KARNq78a@ zj=B;8-e9BPn-GsR^U+X^kZgIayv!m$xK0t(HOpz>y6<-&+1hcazkqsC#O*Q%A64>f z6EA)oiah4Yq!IU+ns3R1W8|=Flsx)eRxDhPLLlWO7 zPEdj^Y=euGbXzcSgmC+uVeLji5N>O-!tD_y+)mCBZi^>UwrvGi1a>Uvq6jm@os_la?xestas;$XNwO-a7sdf}T?;+IQ2_ftdgs``qG8_SUJtKfo zs4cyIv`l*%fp*%0U@87VmOW@yJ^^iVy;b=#*q~Lp$D(c-s(b^{4Y37NFQ?=~@}VuB z+X0tAl6@#h8Zlb`CnZ_;BrQcGJ}!BM(59p1S)(5nbCkK@Kp}cTD%L`6#C|6)OoxHI4 z@pCFK)Lf&e>zdmjmKyhcex$sxAtNu`MwZETqw#{ zV(QlP3kx=E6Uur`ndM}mk+}CTcI`Hc)d7RzIfx^f^F(NiFHb9-Sy_q=vR#pDB~8Z@cS_W^R!q+AHC*DOSM^;2#cyC16&TWo>-HqIiS`b8V-a>$1h&{QoIQ--Lr=pDHz6*mBvHh{IyT}(S2*&Sa zU@Cn<%nCxQ#JNABJOcv?qt*&uKniW=2U>=GiqhZ*If@67>^(+$RzqnIbyope!LM6^ zt53*Pu5z(;@KwiJXzPx`g+5aH7qL=o!&&ebzSx2`A3YbqgDr;({vscqd|B%{aY56w z;rK+^5`A~V{_(Nr)(s+eMQ8KS_l()w!tPHvq`i(zHgf-v(u`QkV+_ddtvHh2iFr5N zCEFmd%L1LgpAFbR@Rl%O9e*4b>eG?*|6y9yV9m*BD*4Igp?u@suLBG0Wp2Y>X7K(w zLHx}9bZTG8q!d4YC)MYl)XlKVQ~L@hrBbPquy1Z5qo$<#=*|tOlvk$uN>s{Er1trl z(vOryO!*lU!jxrF1Vc(y%1=r?*l3QFOfl!PD1<3LB}Fjg3e=(!6C&T-;{Ja?`-J0j zgYMSm{nv-%b4tVU`2ly=(pQ1$$w|lDO-uLlb+}0}3*9YCU+ROJ#!9c8v{N8LP~JNX zTDqT6NPBpKK*NZ)zQwJu&D49&93*dAwH2wtt{;U)Ku-V{G zdKMas;qJNgJ0MwkudjHaak3M>yXO=~5_7@m`CJA_aS_LjCOw>cn7{}>Bh)a&tRZXz zgCAS0NWkTq1!0hhk~{u3uoh{oF?n#@o+1-hP4c_H&Fk zS!3RbBP@**BVACYQOME_NjRsTfF8M@D~-ev_gNQjti5f;Z^606`8c;Y2j>>=Dz@U^ zDzV~oOVO+G+wrvIUFCdUvTkhv<-YMx7WjEx^N9(KH#MIqXq?h~BLB_>mb=d~k62|X zcav3y(|Au?WxLE{awM;x6O83Cy|w&^2z~lk+uIg0ZfWPs__egeXpy{ ziG}4lVTr?p$PvKgD4vj4#tfEWv`lLS$J?ArU7p$qYI;5Fdm2;i0zkm$zxt4g6QSK$ zOWdy_?zdU)pk)HBot8Unl|AkDTkb1X*$d{omN{r1cAx5Bja-Z~Uj)_`tmI`cGf&x0 zbFXEdG*9;bf0E#7NwCXu_giIy7J8*@z4^9fZZ-EFywe;61R>)mn^5E9;0`!jcrw(2 z?VqPK!eiM+_`mGE4SbbnegB^$v<-?qQR@s^ZK6>@JI%43g6(Whds6N*4=uB;MXfeY ztynvYN(DD;QxlYXC#h^>{@CQNIJ>P*Hra-bc2pA{LZA){p#AXGL#8#Xp$|yVzElsb&xBUIc`gt5Hu_km~d*-k0Lqb`vd%JeaBON)2QnxYMb4 zpIHbSMBzl2RkAbnAbU1b1N~nuB3LW25pQSnh7qLuvd}v@jOktb`b^@f#QF@5XQt?# zD*4t(tv@CTQr*?PY-z1-x9&co?slgJY`YehMK0t>^}}9CcOW$gv08tafjz1AYD~d2 zMtsV?<$0+NACK|MKpzkM;%GDG+fEFdo`F`cUsYF9eZmLY1+7NM7m(6@=uYo)-*s#BZ8>GV$5T~WHsh-o)kFy`Z# zuoLM^rfr^7@d3r(0JEeP9Zr7{`zVvzGCwAD4WvGrPOQ$Lz;i`veX&eCQ-jjI%@Q3J zi3VbfPNo)oVFASKt==1UJMERq|um&~kNj*TIEkvHv?}&fegu(4i?P*^(p}hmNaY)Aj_`26Utz%T#YAS}Fozdk>~Mpy{A@P^d2KfT9Pb&0B#V2Q#UIknFs1x7=G7 ztgC*&#U~0MOC2nUv>sdyj0~<`mdNvqZz5!o%gGH08FaNTlfSbD(Hp%b(ROPlh3FnL zr-}*hcS2f+m>rqYD{9CDnS=Edo>wl#ol{_6mvNR75gKK zP+`N5I4+GDY|J6gZl0hkJO=N?khWCsC{z5@ZQggauR+Ay!5A54cGX8&afwztt?ltZ zgDxWJ#h0 z%o*ml7mY--^j1#Gp=0`NVj7HT1}XwMAPSX!OmT=?1>7uFDNvguK)d&3s-Fs)!1 zVU%ee|BYDA1^lt3W=XL%+js&01q5*s*)$mEjhp}>k!q6xa3JIfxFK9+VipW>B*PMP zzfTH)ec;3_Z1d14lRRNwOtOXy2Mme0-EPCgEWx6R9*fZFA}q4pJd}_KJduM#zl))W zqZuHAfZHM<0{L?J@NJZ7e*0fSvkS~ZUnBFK$`oJl7cs>e1V0JEODumb8J7ep4@8uv5DxJ&0&Tb; z1--%{=H6l;V$jQpnEM`wzzP-r9pR8mzwQYJha`?B`iW2)28rB~QU9(?YFnoIu%T-& z9<0gx9#=8OZx_kj$w0NI853_4 z$t3s4brHz+i{|yCPV=A5iD?$Leg>>56r$wgFoH$zVI|&hJ?Jf6w(-y5m|y~Sr$`bj zL>G55si!=_Vv~kfCVeW|?FdE>Mp?*T{#s11haktGcV)3o+t}%2;Vx3m)tfAFL$?Jf zaXAHY3A~25vCZuypdGpUVsha|H>NMiqazHJC0}%4l*#?(Eit*Paadau$1-eiSmntr zfXq)pf-=odDNBP8`$TOz>{gd86|H0!w>o9qV3Vh~CzZxb*Y^p(iBGcf9&Uu#g>aks zcsSPowNV`)-!Yp>6}s+B*#nU0G(>LmbYBst20mj0BwQ_7jLqQzrW(lXbSM$mNgm|C zjj+v1S?lJ#9!_`H&}54~9pTOc~|uz+Zor{v7a$ zX(5rrX=Q4c)U5Ti7i8XGGV2lPAPus$E{&sX`as`*8R>510A(cnIz%_Oz~!JXH~X+T z6R!6uTZdf9|5+My^mDe0zk;SKA8*5{9Ugymda7;aWulTnH+W6Phska&4?wSxmqrf* zeRmt-O5{nRPue5QJ$0cXqFq_d??$}A3Bm!fh2)A6PKDB(QP%h+UzP!G@=}*y>qv7X zBm?OCJ^hAFBFN3a&&CHRE%?%9WQ}$QKbfA854Y?+^jkJpqs<6%!yCMz<#SP;LzwLTQyCz5bXP^)>v4u{By##|$=ZP9HJpJMWYyDszB=@A(UWBI^oXfQ8;nZfstJ0gEtuZfNM)V*S=EV+TR#G zUE)C-@l=KuYmEqmi`7rc51E-sYouqmT9p_Oqs`2iVw2YNcyngDVvCux@l1MVC8WyM zM3H8OnnW&YLQ5lFf**T1tnzsd67qgbx!(TETbI1$rty6j!m(%;#inO}XVi3~ zXXpq{?MW$Go6{Q6C%?|JksYiEiInD%sE8T!lVX{I9w-d|=4}}!?{LQ45vv)Em{?pZ zMXLE^v^d4JA})_M)7H<7nWky3y_dJHc>jM-TGj^BB2;$*(*{HjI)Yg}A{IEMX%ib$ zPg(>&pcNx)Olus|C?c(a17^@Y&O6Cmr8e-H5*Re0GqO#UKr*fkBok}qBa#d#!L;x{No+>o|phJmyXxgL<@v z8`dc%RCekp0LNn0l6qKZ7XH&iks<*o9WS$7C0$JOH9`KmW0t6_Vzj3v;t3Bl8j`GF*tQhlhHC~S(=Jd2k7j$sTyMzwXu_Y zjM6tGlF>rVmZ%NGX8X870ZjEJt&c14?4;}CPKnJ9eWu7Z>l5vlwk|t+`_@1B8$tLL zUfI4RWt(haK+7ydj?r1YN#p$TAU zZwe5bC-bm%TAKGtHz1jfmm~;O}U=|IR;)xwRJcT6=kG%RAn5^y{Ix zB?FOZ4nwm9eFJBEm4qyyUBhNtsirZWgJ!PCVe+z4 zFo!bKM7Od;G*LWaV0cvA1RNf1j(zvjF~>C1xEfsc2mkyk7Ma1ZD1&YKmFu7 zu$G@iz|82=h?nutHpek3%%(zt0Tf0-fkj~k%Q~G6!>?^pFv9EczNOLQ3a_sESRq-z zf{sSji@T%EtS>ag%uSr=&t@eC%K zzQANkV8P@fj{AX_E(WhF!vn+B^$%Q0MX~?*W3b2;e>su!+maeX@$fB=aGP8W|9Lqdxcjf zTaMculJ$pu3d4$YM(tQa)O6F@!ATNoj#~&(Go!6*o34Xv%H6ZBI+JK`ZAtF=>F$-} zeQfz+(a3TUJo9MG`s?ACsSL!Cp=0oJ)T5*nDL+FM79(I6;mz#WfiX)I-IpQ(ct8bo zC$)tV8jZU)z{v2#+9;?cZ7>Xt+Q_6xJ&iWImVN?u?PyK4%1D`ui>_aWV0xU*qb6dWMB-IF(O~DTU4fC z`Ok$yps`H#kjiWkhe#07CJh-Lqs)-X0AWTQkbUmsk$sXZTi3emJ@pIc-Ggy{b_8tU zfF(q(ars4NLq%)#EhXru?~ZKj=!VMt0^DzywY|DQtiO8v;Y3K^Y`bM#0vsWNR>UPw^Ipo zYS)g2eYT*~r^>(zux5P($DA*V;8-D5Hdu_u2)mR4k13NKMF1-^=;rN85E&+n=PNYx zJAhhR!GURWQg*ix8k|(n!Oe`*gTZ+ky!=vrX9{y;|F6GH~2$UVZ>979_C0pWs*$F5E z)KmaXmM4?SKz}JNa~k7N21U%@$H=UZC&QBQaUPm=#5!gr+9L3$Jek)^EEBmD(BJO> zoBiOLm}$zB?Ih*%{$D?vU~ir~fNvO>)dY`&n(%062{bbT4Vn=WVr2G^FHoE%D?~t- zCDZemvf(l*nHngDWd*Htu*}!56xpa_*_*G9`K48Bhsj%f=ntO1W4`zmO_vsFnNS9} z(vX?Dt?{!IppE6JzzEziLmnGIT9yn~XYSt@fu$w5jG+~|xQZ{;L z#NhPO1?WN}zY9?I!K+|e49fOrTJKDDSAF3#WEE|rP|-l#`LSru!w(agaTdU|VIt(= zm7cP3qHw%|rA>IS;*onLpbQ3M#u_TH=`T)oIBr=JpfcY?q>|L3O`%Z}np7Ee6&wGN zSjE~f$8IlNh`iAYszz$4{S-bYKs`ZOoc zZ2fWF!nJQm?f1ZpGPa0;2*5k*Z;izRbhqgseXRW(3sC~@{8CDFPI__9vMW4_jUzl-F1<@<`q+M~8W6hLjqLo8#aEUTjSW^i!$zpJ8 zk@Z*mZT^&!;{Iqe@!~6DCJM%pS!;RCcV_?HtMl;=m1J|HadYhKOO26k_~W2yH1ms- zb9x1KutX0@MwAB3%4%?SU4d!$_U$%SQqVDR(AZ+h5b$%43KCM}0kqqja(kF^NhxEl zoTw#0Z2}DG*ig0if((jGDXU0xU~zLwiR>M1g!gPN_KZS!_g&iB@|GDtzvC-x+G~(5 zT1vz%>rhI>4ZRsLXuUj?Y7o(@wJANeq#Ol#Kr23M!hKKbvA*qb86pRBQEYRv9IZAD z2){@jsYzvQ?(`UCr1P#Fcoen6G?=wR)9{xWghD${q#i5b+Pw)XNM6>0oHi&mmZmwx|sRV{JTOu(GHPm^|7n`$#rs znPy#n#R#nG&39h?m&}K*J&|K>5$H}0^O;HF<@rHq?oLRfH@9NmNe2a`Y!FfAa-e54l|_j z#LqtV@zwcd5!jnOO%Zkyfq~VhBrrB<1dw7TlIa(7OHSEr^z?JM%-F$}r5XHVtiXW7 zW&wLyc0AaBE;9wDB;pT?s_g0Rl;fvednrou-)BUppPbY^ef(65&fYvV=0LnsW6IXr zC7l0ZSq|HYZHsR|N7p59#OEl~0(${?B`a8c=&0u&hQyi#0=L)oBH!EkEs{f?`09$nXhYj_FX_o%kmcqA9+Ir)Z79E zc^w`jnx?hI*YB44f3dK-mT7EJX`8|fcf$jMj$ePxT}XOD=-qZ=gAMm83TZEI|67b5 zlm~|uOEea8X7`9zWWy+6AD5X->p#z^w&LyqFf_MV^yIWkiTI9} zuqONEa0RcuEMmhN_KUTycuVEi(;MMJl)kf_7w-}mzThlZNnteF$kgBs0LDgN+X<)L z7t(fM8Jl^v$5C7Yi#?&MtVfq3#4NJ=`*nvCR%}~13z$I1qs)NUTnYo+o=6Q9o?|-Z z_4_98i07{gws50qF(9EAXkb)|cI~g(&4v^98nyfVC*155dSi%Sqe{l~45PTp?%)15 z7dWIXWE!@yu}mB|qQP*Ai=)heWEu`=@Se7v7)L=}6PEw#>vy09(JF*1WeesIV1g`H z@jy%TMW@Dm5OPFJ*c>yVOLhVz5TbWn+F;RBJAF|D;}IJdc8dpahq}l)x}9})b(ER# z%DR{d>rjJZBxNU^UHQQVm=NU{Eh-u)_?-1qBWt#-Gth;?V-6ZH2+@X<6|#hG8~Tyc zIZ}|bkP;i7g$ay7>@l;u8+3zX5u_Y2_oZ!zemVTWD=&e52fYOeji3$P4rECd#Sp@x*+(x#<@_={ux=W5#_ zzbuc%W;|WjVQQvH%9iyJ5DJMGe;V46k!Zg?Q>qgt&r0zIvfv_@Q4x>q$`*tCb&y0w4rb_`7}#7x$p?>`-AYXO^&%$@tpUf ztf^+G``;o~@fr@}R)-&p>|*)IVKI%0+Tld8Qj7v84qOx~g`Y)THSV1sPTdO|R(i82 zxP==W@CD#ly2ls*btKMZE6g)Ev#@Wfa)p9pz%fdqWM4V=0&rl;Fk}jC8^rs52Gf+X zme^UKT@bQe+z$)zjE+I>F6fD;Ng>KEn7|)>1`JGz8KB`p8vx;~hU*%xfdPxX3KSUd zdG&TbiBk`LfQV4APfBdN#XUlBF%Kypa#Dsxj4e4y&*^~YkGl;35q8HV0vpiU^Xqwx9Fy)O~&bW4f^021^fWK#4LS zY!+#;?uN^<2*yn@qwE3niCY`Q2=)lF?B;0dzR^~P?SBL(w2Vs|_gIVc?z(e&Kf_ui z+q6+KYC@4w1i@pC2%(Se+orPvtZ}=qPu3u>0X!yrnl(5cZP8Vojr$fO*UGy49lEny zamg$1CUE(R+tjn&4m_dT9S)6QQ&~fv$00XowICL zU(zbG0#ZEb7Ku}W<}L4wd7xp_I?%y;FTC#l74X2el$59eN`If$U#9xChZ%9B@?gKG z1dsNmc6l{GwNY%0`o0v7Vhe0SzE0t{8$gmvbY9fh!}A;>ZScT`8YPx63gd>ZRLp`H zA3WHbehn^hsdtHm;CQ1EqOc%s|og`wCZa1&Xtk$+hP4ID@9;M6zPS8ga#w5w3>3>fs$_&UZg+)Do{*t zsoH3VS2!3Ru@K5FU^DDd0i1?#<0y|KfA$`2I_oPQJ}|0&=WEW{`(HSSSwag}iywa| ze%x$Y4OC!=*srAr;056GPFoNOezucs1Q)pN2813s8G3|gb`+KH0`>v%R@@CD_R3xi zH%Z5SC&1}n|FBdw$S)<|wd&^2pc>1(Y7_>N45J)q*zT8LFuG=I7bJQ%Xc*-(35+2O zGB`F3>7pRRxuO_LAm-TZ4ze?_#_5&~#Y!B+D2$|ke16OTj~rKg;FIfq{B9V~=ow(c zC>ulE;A~k7fao*{lfBA}-~$am3o^KYBwj?B6GH^Xpludc(0i9)QbBk3xLgjV;>I5sVyd;s5hHWAZ&lTJoCfHc9Yf zli$3Qo7jPdLSn^-b#ZB=_)j=FNLN&%FZLb+&rPSSR@lu47X5Bx1 zilqqO`kQwMB6OQqa3kp@lWxE2eSd*U*krtpNV?@VNcL+*4~YV0%ITp{G$}(d0SfT& zhH{`lBMO6wGL<8J--ic|1!#wHQ4SH~fP;>W8&ttw0Y|Vi6#zlS0h&PJ`agX->3@5y z6Vd1)G3Q%^it332%~`DLBXQb;@~?MVF=NzlU{#t z%dJj)bkw$7nFbTW;DJDm(kiyH1PwL<&|uMzfU)wv9~k|cML!H=TO5uB`r#fA0G7;( z;3^8lDjyt#V*roSguLWwmH*pf4*2x?it3-<{oyaN7}{LopO_zLG!ojhr-5ZCY}2B* zAOp^_==O`Tm~7=Dmr!B(IBg+vV#PT|d%FkxKAJ~V0ZX~;)Gb!Gbg?vxdJlQDt+@(e zO)B7$A`mO`Pr`(i1t)OQ^+>050BIvdqxZb2_m^u~WNPU&GXk6d%kb3C zp~Ksxq;!u-XjYaD>WGCNhY)lM$}z3~)Dkw^N+qnf&nrQ+%i*wUU?;OqTwtXnZ?v(w zTJ|_-g$oOLsDOnm4l!v&y6^PTUk&|kjz#0f{bW&+e_K8A1|0|(Ek}uXU@~lD$=zYC z-=m967qc#fWj3}x=Lsg;O^-P>BjOP}(=imD2W(mq6Q2?bv@=g@^LT)BbZmu}Mj5Qe za6Hfo26tSd8aS;y2&>?Mn}F6XpG^!DC*MD=`_tk<1drJ~F!q+OL$cr8BN9waS&^al z*VqOhK|BV4GJTDO7zXOtSMGQAX;F*Y83Y6Sj--{kIsS%Z3jmQSU$nNL;4RQ zVnE=sq_S}cK*U-z{12jk&@s=**BTr%BGxTHevbuBKl`XK!--5R`qH+h(@K5oTRio) z?|w(?lFEi<^8&pA$8rR$&>wrtY)3a{Zl0WFGFszI=eo4a*UcG5qX1SWifYV)g@%2L zMYUhT3XA~zNhi!CM0Br(N}pUYnt64O?w($n|NhOf#B~}^H`9t`?`wSKlahEev6>d) zw>XLQ0^7aD0+&qT={yHnD|~~KE$zdaL@m!@J+GHG)-7@OD1O=-bfhdYl};_@Q<6dB zXYiDZCvDDBPA}y@I5(zT$DU}9ZN(=)+06Sx3P-aW<#VE4iMtKENNjB4lPW`b7v1N5 zMo=y^=;Q{Ww$592ZqdSAB6h;Csl-fBBAE$eYa1C^D2=S-v}*c~-W1cWb2)ahF{SoD zZkgXF+LzL6L4Q;Cxh6R+rNdC2$`;%d>!gHEq_gTjb}BD!Zfd}s9Lwz7eonI$oM5r7 z0R1dA1TY@O1k$W_2(HcYT#9^I<28OL^xsiL?oZ0lVWUB}OHR)Yj*I;$6$^I_a8*G>nt6`^aD5lc~Z1TslMW{j#ZnhLT9D$ z7MaK@srenc*k(cX-@0Q(6ST7%2)qJPkS81mp4U6e`DHqd$Vjj<6 z{QG@OSLdUcZceH+rW*|OF&(ipu#wBRn9i21*gsA&2U!%;k()-ET$`??V}>buGqlK5l=JWyOR;&is{=jt&1lA!%cmM z*gR&7exiJ>fte_vOJh-IXd|FAbP*l_%|sF1bQY=MsOY_yI=L=!&W7oRX9^)5WdJ2u zOt(>=S(69Br`Ov5_w0yx+bz^w`ROI&KOcmdn(0ORBwWh!c1*wx+3BviEYn@aunVB!!SaX(c$AeUQ58{hg1-N5vRMcyT&|`*MyNg#K2$h2J=CSEKBL*yp8;^pVR92 zw!b;W>t)EY>eQoO8$VCAo~@gjBv={IGZ}H+_-Oi z%#G;0$=ZjO{^^Z6Z*mc&Yg~H`L%ZaB{ffn^B!p3ch6kvS7-j<=S%UnV#%sc^<|5GZ zushHT3!sSnjDH!30fND}INrkQkH-A+g)%w=2VyP2qIxIQ7(7r_av5J3d5-60NpJuA ztHhiD1StCAH_&q=+nwbz-+Ohpn52}2n3U1@cb;R4G=X5LkRI-LCs8nI!R)6^b22|F z<&dptcOeTwSq8htCc7*{D&AsuZV)-l>=;c^xuFH8WO|{2meC$Kty=O=uY?iq=tF;o z>#{dZ{Fmf+i%%uhf}n_1$@vPTMut0G^4=u$cm44()9%CK|0(XBOyjJ4#Zoc%T|wHQW1GZ+4Oq z^2;&{+AvP?PpyGHBkto_Z6k;DZ9maU`qnQU(ODeSwZUfC zNVK0;)_l3#v&LqJIg)kKO|RPbB^cA<8KV_-0Xx^HNBvID4~;t}a`w_h6MhmSe4*PG zd#m>b;mYFBj{hjHs zBQ2dpM2N}mjfQQJ$4ntA-t$2Q)e!tROD244Z;MvZXT~hCy{58RE!LuB)ZVHID}HcuJ%;zftsdT~Ia-_3 zRcLEZ8BVGXkJM{5%s!^`fCyR$LDyTCOjz?z&EMcenlYK08NyC|Jh4qPyilKMZ9elC zpUPj$%!dZ4I>PG!)I$zivxr=Qv;%G*~CBl*DY5>(r;A1VH0MsAA@1u(3Eo3C1=jL zl&a41uu(Wk5-+k% z2BjjA)oknfK&1Pcg^HziC~mK1T=3dgc18BRR1eXo!ANT06|*ll7}b_{hy#4#Ow9J5 zGHB;zvaEK?)5#r913p_b%gt4q)G$bM04v_{y|(>XC$&!Bp|;^tvw7@DXuaw1P+A6L zj$U))j5eIuHhkr(vm&vrRAo+VY&-R01H@nQmv8#}Mklrg>rW^3)tmZzv6V!Hm|);XZ`dr^U_I;+^9z z%6di2 zeQ(cA{|7feW_HbW#wps;oBALw7apZG_Q<8~IkRo7lb&XH%tSKP&!!$dOs_VkHimBg zLdFKkNDQFC`=FeT$k+(@6Muf?kK1$MR=h3FR^tbowdqm7?n|vsZERo7V@p1`w&4eL z0l=V#C;DFI zIs2-N(ll~YO+~PNY)x%rP^M*f(I?k>82kYK*!??z^O0tKn);-4%rG!Qt&eVoQ*?FF4#ymmUq~?@5LN zv6jXUrff}q=Mmql)I(xZX5-7>oeStru6odQCzm+tx|2;_wu|n}eJ#z-es#cWgc(Xa z-TOq%k)dq($;u$?%}p8%65ZLbzJgKQ{5?T3yDkXNtx?{iJnR0PTa)f!{ZmJ~_qN}CB*;h;BCR=4= zYouWnR=Vk#@}PBIP5C|cE9_%gX8LY@N4>ATv23U-Xj)tKS3I4ZIJPEge}QYh|8>4^ z>QjgB(qFmH%C>&8Hrw=# z+Op*QXW-`v#NG3!lr#H;XUk!MSh1AP>HB3jymW@|?A^BSEBW5#ueb62T(0{bSMgI_ ztM#9Cd`djs_DMJGx+oUu{HfC2HdTy}6q8hXq5oW}>omTcPyLe&8YF|6;{5ey>#C$y ze6O=7jPJ{=yW;=kyUS=Xy%LiyGf_lBxTZ)3b;*g;p@x_87(!5c{dCV=KmyhQB%n_? zJ`TQ4?0dUtLQ7OgBDhPRP_xiJTWqjtY_ZDepn5r-o6ray`ZG(^HR=-oRF^B;TvOre zRvc5EmHxL~7Z;Kf&zQww!^ziVU^yt~|1^^5KWE^D)6nPH!$7qmIMK1*!z5FXmHvtM3c>9_e!<-y=Pr%XjI&Y_5lA zBh?J@RGg>5q4r=(XR=j|$3*F^j}Z%>^`VOmAM`gcgqWE2F-c-?;9$#FOY~DsC z#&1ZGe=`HguQ21{v2q?er#u+CtUQ~)d}20#1unX|W`_EX;xzEd^~t(6)4pF(r|YwH zziIHC+pdz%*wgrv%OwjHkxq2-IpBR<7vI^QT&B#LEBZ|NFPNY$yGKvlty|N=Bk7Nt zQ#Up2;gVc}^TwD!7F+0h$C05SP){!0-`o5x9%x-uBNfx{+5AqPS63$ZBj{7BZp=TF zY`zdx$m&qxvx5AUmBEz#$>!JErH6tk19M)T9dkJ_q$Byw@myT~ifq%ZlgpCL34VAT zYg6Z7L3aK6A^xQvy5T*^^R#HdwU-@QKW)nTWa}o{%jR!|{o~(2!uJiZb&2P3i}5_C z8%?V#vQzfovN2dWm-1)wzudrd>12Zi55CN(^~xDIGs3UPh7dy);+Ysbg=zCQ%npJ) zE&|qHBC)%OOk7ZXRaB0Q6h*JYpP-19_t3{O7eiO-Zu%ovMNT|e`E@Qt9h$2OW~xy-)9q$%ymRzWRb zOt$^0vD3!fTAO2XVmX(jW$IWq|1~sjW6=KVvDq;ntqmrDU>DUawI`gB=TL2N4lZAf z${Y5aG7u!M7!Y1N6eO>FB$)rut?vl(Jcse{99$u%PKfLK8f*vh3+g&1mEZqwi{4|71*U`r@BajMu;5ZuOIy z4ztuoeM(r7)aFJ~Tfm)#CQ26_B{lCcoZ|7@8mTO5yvjE&FIUEQxuGJpVm#ow18c1~ zDtN6^K_0ACN9yc4`j=~E)qy#}yUWTj(3KV3DTWePr9Tp>A%QN!60`?MsOo>EH4U7t zD&wxXO#>F{mHeeX%Vu9@6cvD=+-KBpM4pq9w8Ri~P<^8>1uQtWrhiPtlt?}_-ym(7 zuJSXo;WV63eOY#Wz3B&^A_Om0iXC`vBF|NgaD6)0gLLEZvB_`0j%bjhi`?;gM#<^THB zp+1fCvO^s~)0&ED7u_;B*}8!T8B4(6@fg?Dm1d6o8DE39tIUOW)-+P&l_UAiWs$`~LC-}Fkg4Si$1p}*+>vVCUX>C>C zh4^x-$-_^$y__EC-?WQ9SD9=c;#+c(1KP7Bj7Bc#pPHIgB8de9CW%IFDyq*?vF5hq z{BP=ML{deg8mm1NB!ez-MV2O)R>h|qzCd9v{H##n)ipDuZ$zri__NJc>WVITv$v^o zbl)JOkM!s!5ku~5a&O`dM~0lx)u=p7@7_VE^y8zY^k#vF=C@3n|G&xRJGheW7+Z5* zpW+!xF_{l~?3AScD-0hsKy4aKB(ZRfgq&S^Fr-NA5l zjYwRon(*g$@i`3tOIz(Wz0~a>q{?tw*@Ak6-mCNnY$+PB7Tjy{ys|j9e+Hkr!oywc zh$2DwM`!=}EBH7g$%j{y2Js7tIQi*wAx-L2UC^h*E){KvJlaeyIHj#PczM}pgZ$XH z+m+VFr6`SfO?-6qb=_EJhPr?U+WdFbuYZy9n8d0~Z2D8DKhxE4n?2+P$@<;ne-HT2 z3TV=G^K>-W#`P0|0N1;?te%S9vi`_(M4jv9TGTn!t$)4~bVq(lS49_w+*~v0e@xbo z9{YrURF*y-O zot)$VlMJNMT3lf(nAGwtd4;*^d_(VBQFmdR29hMbxBNRl`26E99vLb`?lm_o1PVIc zh;(g*2|gG)8*w^g2_eR;q%PXV5zT-e)wc?+f`Aw0e&Lx9#`c z7@Gc_sR*-}FM6_(PmR{7igbYgF;PEO>IY@p?9-1osnZ_fdZVr*RjHI}mTFd(`!5x< zk_JUvb%#mSw(p6vx26%LD?;5=n+!|q-=qe_oPVjxV)?B z8(p0%y=chsZDuYUTayjjdN;iB`60Z5#JFZ*gzuNCam3fGo@7IkWJiOG<}i3vpR?hn zZ1_;n%J4CN6+_5}G=zLZHa`bH^JV^j4VS#E>jdohGaHP2Pd9ZL&tTF_Q8Htp$Knmq z&~a8YbetOv9V?aftVlL%#weHn1d>Svd9@O$t&^$TfgdYYsp?uD_xOBX&BXLd@$4Q@ zfkrbB`H}QhF2yCosZwFah_z+6oEtPNs6cBHZ4S1aJsQflyswUtl;R_Og0 zfc1uG%u<3+XBh98N8O?k5-1v5f^yHA+8{q}T7GJIu(FlsDydj{s|F-`4J9wS=T9<2ePQXHX5bo^F+*~I7 zH{JUY>LZplQbZNhGO{SYw~k-Iq;B%JYfAY*or;n=wY|6 z!1o?L8~OiU{kcbf?xtoq$04nIH6r;}IHfKjzN=M~>$`RRZ@Av{_$8{VlLD%%i_b>> z&$j=s^`%&r?gq^BGOg;JBE{KvT`JN>He0*xt1JlKRyD zHXZpuI{AOrria$%lZp2B-D42vIV>P(f8xws>unXN)mas3CF?6XpbdT)HS6DKM4Gb|;8nIuEUp&Z{HL>Y5l$QpZVi_xAp| zBq;SlIjYi!z9lS$(cc=a+nUp$OrJwI1$l-&R$c1M}LO- zpI4s5|2+F8`JdZ{`ybVS|FPb@82_W^rKD9-(uu+CM>J4-$u4N?xFQ$SJXWF`(F+yl zb6&vz+-Cmg=9BoJvx@wWG0bRqvHs`j^3&&k)Dig~eHQ#rFx>x4=XN65{4a26B!A)j zQ8vHi5sR&nKO$@g?RzJCj|4go+V|B)KFR%@$WQZ4?q?N0$H-N=pE$Ey$yrA~<%A1}$GuiSb257eLGWC#;9|eE*JMUk)>)$Y+SUkGTl*GH+pQ(iJ z*^q&aPuoY3GI8w;jk*>f4-KZHD1b>=(3m=1lLB{qYOHP(L4H}M2Pdr$rW_%qa73{A z4#TsGF(hUy5Nd=E0m;*Y#DmG7pIfou-1mvUQ=Xg0oIQ0W2D2d_O@npG`Q0E@h0lrE z)~R5oW(Qn=6azG6&2dezP%vX@d`&}4;@)IE5dm-;3FuFQ{xCpMx|WA3^iX|jLp@XP z^FKj*$@Ab(I-gAEuN_-Y;IGfm8807Jo;p-uV*cXg;k*@ffznjRE9MQPcBI1xLYAql zt`858Kd29XRUd9ihpSm@S$?1a>+&(z#*@PQA_`t#xrpMuA=;XdQ>N5tcWEVgs}t&jDA zR#+d$YQKRKIQ*+sZ~D%#9*@l7Xxl&$d&gv2oK|^NI0awpSfQB?pHH@YoPO3Py6eYG z9m|_A>c`9}uMg+&bzS|Ko5$COH?x%Jq4bzHq{D0ZWnr{jR$qZrtOM+|$vQPC6OahxR3p3@R2&C$n zrFPGoJ-2HE8gUCd7~_p-=IR9|&gh}(NFDAGD=(O`>A$f4#F35O?*HE2OZ?Qx+Q=Tn z-`o4|?Oh20M(nF`3o`s4V)(_jzB!oGB|En40Jh#`_Uw^1Su`L;BbTCxZ|MP|dmGp4 z_+K8O5Z#Mig93WwZ&uo)$t&8KP@>9Q^2&i}^ABmJ)@C$paO-m_xG|-dsW!-k&-T9c z_~6jA5Oi|;TH&IiVP(N(44Z#d%242GsddkcT7~J<|3XIq3d*ryeCdVCJGuX$qh5lNUu9Jr?aw&y@qH?@$O7{9gdn1e$7 zTOKb)ReL~HOb`R}F6$fjSSGQDwfe6#Xa%lfV@skv$X~p*Z3vt)Z&fYl6?9{A zcUVb2?!ioAZ$uWTskU`l%44sXy1iSTOzjv>U-Gj4aR)hb#F4h&HtVqUrMg2kvP1<& zi9Xf1B;|2fOyABePZrnLU*OmFaRNS z`-UN7NnRt^m-LbK=?F~kIFr1v z3{fV_SeCrv*i}C+wzPd)o*GVB`hUb@h93Rnj>WddPQwGKHK&%#I%QGPZxWtjnm@A>;%JOvLvCNp8D>C8DsPMrt z?+tIR2tVL_zk$#q9BVO$5Y;9*nSaA`SGsWazN3V*^;2hvFwJ2%+NaG{YBukrDfTK= zQ~`ixh|Lcg6>w`iO_5}&UT@~k9u+vKfCbv{*`#~|5g8ba(g}9{&l#$ zdQUV;-t`0KU8S}!6c1mze?4VH91Rcqu9Ap2B7Qm1zm~+q;r^9ae-e3l5OYe$`XXXQ z0ldV{wGK*7zjI}kjx?b#ZkQxT3-HBfnq!T|4c&Sw&Jp-&q$(RX{Iza*m}|oe;H!og zb-u`ONb7L5kawwH|L z-I{`;fdu)hlKJtI=U->OVE(nii2gqQ-&l02{A*Pa-X{ObbnpoISFS4m+Tg|ym8#q4 zUkPBpP5$+UcfY%X_Kv~dhu8XTZj|v z{Ra^%Av@brXIrC$?19pu!(Nw=-9L`))$AG!_t{~><2Gdy`>cj2Rk&nIG-hb?IXK1) zE32e0lRAa@`kMxo+hnj14-SklJoFZ;El{*sHWCMRpzLhG+(QddOz*tpvR zTY8H9#9k04t?eJDgTa)aA<60Uv0LMO?2;%SyEW=__m-aGd~AP{zKTM+;P|8(tK=`hD8nF@1ro9{k$n1x0UJ|#^5E12*O7lhBd!%;S$G6+g z(jPbeCh_qS^0zm-{A~kjjJtW+^S7sV6H4tAC2@aTlEf|KZ%^qoTt4^r{^IxkqQoix z-e0_I{-QMh`|000|7(cD#^T_(HvCSVd=Hr6wB~<%E&to_67#=){(PzRFiru_dchR1 zcE{?(G#l>UQOy!Y%L0#tyv796_JOlh@8ZIO}Z&+w}?l$n;mCUDKKR%tGQvtR+C!N0; zJoou?nQO1A&)>$%)vIeNQakkg*nbE!OGpUYe08#=Uw{rE>G#CdhtH)$-i-C@boh*p zs?hW`Tc0@3N5|~&vOA9L$&X)W3E_E`U0N3y!f1M>3Z(2sy>(w6Ht&8%(5Y-p<>GU5vLR1;SLlI@AIpLT<#)-ulTxGm{MtGeg zj`Of!lpP18`Zz}mPDL5URZ&Jbrto;_xKj+Xv|jSEqvH;{jPSmgL^2i~_2JXWmf_>y zm8{%GQMXwcVV`=x&_q_65PlJaiN)?vy>YwsiXa1vjwYppS4Cj) zrO;%W;N(U=xC_Ksk`LzW7gDK?o`W24!5ZcrRc*+43HN%~%;VUxR%aeX=R+E8OhlC3BNyC><<3UMwx2 zu6Pl&9W>f_Z;=c&lUN_=-1knZnS4x%xj<8V=IYVpV|}Uk!$6$BmXKqJvVmRtOdboa-I?=Rke*M}SuwVicSX%2%5(Fwh*^d&|sv;JPLF?pM7C z-%V9}G%r}pTW|TL+#AlPRDE8NQGVibJ!vVjZu|DMJI%MMf+s4RWlQ`)u z_-hU9i#>oJ*uMx5Q0lLl3v|vTn!Y==zaD|6Qh&{;-ur8bjF7|}WK0jITWuu>^;rT| zM`&BHZ$8L;(DnLdy`K29nXnz=Cw(1I@E9~uRWY39aWzw_1gpW;kIPU5qRzZRixL;N-- za2Pw9g*-`q`h4Z5t&V8bE+J#2{Pc%**cfN#NU7;&`au5GPPZ83n{9;gn+sVOd>5A# z99S@;vp@1v=UNhahn{3B)Z}~W^Z*-Nn8sXe&qnKFEX%HA6qLJlsVBNe(p<4^%0}(# zN$p@a3|}}YYlmB_V*#&L)YmD`UgtkJKJOjK9Vh%=K9_4YrXqQ-tu4%NPwG~0<|^zq>Lx$R9p^ccn{|vw>*h@j znjUXcSGb`Q%s}bv(mu?7`QF9UtNsnIZ-%O9h$RT^stgLho^8FHu4)~UcInhvlM3?u zsz49#$G2`*`MW=$D{N$-FmndYej9d+J6#AN1!7_y zr|68yPU2)4q=U9_ypg2+zGFi}aYyD$PuYr|2spBgiVS4Y3xO=!FYDW``wX*hS6fwj zWU}vQ9iR4y-oSi!9e;{@q$wP!e3gB^aF3QMAwuJpa6k>WpBT{ zHqh4h5|XZ`f`~UUY0YoPebV&`X27I_)GZN<$Lcr#(Lr%Zb?aBQ>GIma(u&Vi&)Od! zbN6KKGun<3-9q#`*z)v(tH;i=p+oy1qALGNUo4Ss-&7Bu<@z2srC(~wjHV!#?=idQ zwQG6~Ywc7a`r73y$f17I)z=xSAfj^iTV-I=MchhXpp8$CxT7%7+83VC;=1G=@6=^% zd%BdNp?LW|>mmLlxhcH(Ked2=O2@nb3_{8;gDA2GG4K@r@7uj3?`hPf zQF4J_-6|LOE$fAj>vP}!SY5cK7FUQJm%2jTu^!4ewq7AuXl1wzvrhD0C-sK6A5~T6 z5F1B!h;yiYq$*G95a;0#>2Tx_Rlj~YhiJb>c8IsFw3|%WzEp>J;lpx>-#7LZ`NV}T z{w+o&{6^3sf9Q-=u29yl&szUk=Rf7tbiKiU&hnp)eBv?}@&T_+b@*AqPdIozQ?GKI zH=E-$kCbd)#*?Lvvy7)@C~_RCr*Eb%G!1?!`R#vHwcc^==X>IA_Q*LmJ^F^!J3DJHP_yc0a= za$mQcjR+{XHT}Y^H4O8hYqe-W9&|4EdGX0Z@&2%#!Ir(Y{ot~Jx&hseW^r|KkefEln>MNt6)fPhoc~YorUP6|%(i)Sys5$} z?sKj-(VHK&FW8#%qi@yaB0tLd1(pKt50Y%@zxY}2LigZ8WiN&);`0;4HJ=(659N%O z+vn8+P;9x&f4hg@|I^5yVA7gk%A?6UB*3YvPrKQkJGDP2Lb zzMIh)l-OYi*Xa}r_TN3)yO!e~PUwju7~RHgigx;ubzCFboYhc>Hf+`wG7rQA*r7%E z`LS>~2C-b{yq}XG?US=d{TjasKbiPJkLbF6t)%Kse~9u$(RmrCmiN?I|5K-0ys+2t z9bpryGH2C}im=lU{x-r^pYPEh1SMhj^OYRlEIz!Xo1RNYVs1msZ7(F|f3s4<6mA4D zPn{(h*IL7dC{Cx0Cq5tizJ|qFA=sC)Z`+nfyC5`Rm7K@@yQ- z-!`80J52XTc?a@SEA`o%zy4e)DL=G+s_8j4X3cr6_x_=YN)?n)=t@KS~L zc6>~(rn~jWpMP@Pjj3bp>(0T*CUR-H!pwjSc(C=H+Qi0mibTiyiu%_7p8xNk|DSZ~ z5GTl=!`)gcTVZ2InP+dNb?mFsi8gtlkOnwvoCcV+%e4OFD+j)GaXR$?XP2Kt)sx}X zsvHf?R2w~Mb}NMZXJ7YoWo$@thNJi^GOhpe!Gl-+Q#y4&=gh0c3wdZIZPX_?a=cBa zr&qSNRH}ArTj*MtKwtE;EuGjyu`!ci7sf;N zspnXaUwK(;%Lhd#w_4Jv2ccC@*6{QGbmG2rLPzt9LEU;4LM4Zsr^G*AUEjWL0+;I` zZgDzspgzG{d3a$?1=kiPc5;>eInK>CkJ*`cHj{W-XS?f>MTrM_gsvU*Oq$Nmwduq_ zeWIs6wVIAq@QS|r)bqv(4guo!UA%8TonRXRXXLAnmPAMDV0hRu`Dz|mT3o&|F0XE0 z$L(cBX;E-A=U`9mj9bq}>3CP`lcW%nAu zx%b<|Ls!a(x-%-}=xs?Igj!l(?pude-}(f4k3JoZI_-t!m=qJcBqCNcb(>ChtIl&0 z&&7N)RfA7noyGQ*5!)q{h0I_?1m`3XFRz&G#)#!n5vO@bN<1>6ViA{03XXb>ff2){ zv^eVca4B_01dk}CJ4cpMf#(&aQhGSzw=qHX=B0!(6iKN_LMx&Y!z8roLT~U!z>D(Xp;v{wi>s;3> zi);ujIGLM-vXvuCXGP5GVbZ~&jch|*aS7Q_k#tZSS7MlSI!BfcKE!o*Wa-2tRurTI z4KFO6*btn87E1@+9Z@BQz%DxJ2t7blSppx{L5AnF&8&XSR(1COGJ74sT3 zB+y2@9&S5};}XN9L;M<1I%`LkPVA6Jmd^5s#3Jcng)b}}H0NZtL$^ni4mNc%>D(C= zDU}Y|7J0T4EZAZYj{8LEpam}=9VG6+MH~Ul7oZ;_O9yZ>vhAP*BYU>k7Y?(X$ZDZ6 ziaqjdc%c`votVTT=@fj5sZ5F2H)`nH$)p2!MwCwM3{SM3*xV!?fssW8n6T_rB3c=X zNN@zS6XOI_=mq2y#Q{+W2n4W%%mF*F@NmrfiWt0^DJ?#kuy7`ku;LOHQwi)Nno<-1 zampgtM`5Bkk>(Uw0qgX!NaPBbIB@sEP$7;iCqjkTIt&pmD#Z&JcVtx_UKm}l$cb4p zD~Ri^g1Abw#;hp@Ir0;L90N^KQDBUhRALwOfJqFC5{VGMvnJk^R?I2W!h-)I9s!Gf z!#kxMAZ08S@x9pT!QNE{aEoMR4Dr6d1VKdZNCU3>qc~Mx$%PrRJe5;*90R zg8*4cEJEW2en~7X=D3Y^p}W|j6_7YPQX|HXBrGHu2}|)z^u*p$f`X$D7fVR67R;>{ zO+o~6sg`7dzC^FKyt}NJ_DISvjNei$VH&`j*109ATVl4GLJDd`U5R`qA0blddYs)cM8FdT zTh7oj@jyCd9V%R2W@9cJO0=k!bD~-vW~`M?toNgpLbvWL8Ei4qD)eP3Jv3W^7!6G) zhyry6DkReav(~}`Du)44mmpm15lLOH%?TzX=()?NLzswE(p^Fi;DHf+j=y}tlA1(|9>C`haxmaqj(XOTXHNMtJaZ@xXk^Nk7bq%k2t3VbliFGlD)E$XRS5i-BE+C^U z353TIkHJLt8(l!oLKIkCsU!TH>xk}v@O2ZUy(|Hx@_}^fS&Cx>y%&%K%A_7w%Ai79 zPAY?@j=G>}J?S66!kWd?OQFQ2kl-3m3|+$6TOqFmn_a`grgbd*;fM(Ldw`dPak-ZR zbHdjy;^?E+sAEv7ip45S^ty?&tn^TCY;K4@+-%OSF(in+H=CG zl_A-y+t(@+R(#dPu#wGMArI zmCIjA26rl1QRS`kQz!fEu4cDyf3A_HlP!9Qgbujno+j2;e(~P)QKij-3#Lxjr5U_& zqx#m@DSO7H8M-umr2JWM`_wws_|>t&(9|Fs?#bn^tqWFe{^pbaraW3UwVKzO1i{Ml zZu-!>l}!s$?V8|Hx>uhA>I|Pf{>t(3~9u#0ku&178JT5~~=FKoRW$R^fKOZ__AzM50C%Qvh#pmfr-)(c;uQVX)F zN3!i5FfLkvg2z&uldotUTb@mH<#_vcdpjjB`j?H(N?Y;%IMxN+RI@ObdLU?DXC>8f zvAx$P>ySjQ_2Mzv#5Se(XXH}P1!`Sy-jI-1zI$-daV6Dqt>@AUH-*4k6tbx!+4gp7 zT;Zmx=wFwPbDb$2tj+S$I+T~sgVOcsxzygEy@Q_ZfB&1WSL!WD38b6W^s^O6Kv)HhUn}8 z5)s)%TQE%nE3R5-gz|(V&*udR9S?)Zd&4CF7>p@2u?%MwruLSQwzU7f(HkSYjo6j z(y2D$ljd7hYejLb@N=7*U#MCg-MyYg%Zq8UN=s;xklg9%@JIE+8qXx;XiVC?E;r`0 zHRUm%tE4RO*;+)sjgB0_uQ!&PJpz@+6XbSGoQAqsM`*=#1ZB+eDq|@3nqegu2Z_U; zk-0G(J{=b;sFq4~#igL%3T$4Zejw@>&>s=g6BARcG;mHgJ7W$Msfp?xDCmZ#ez7+w z^%6!Gl%Z1s!${Q4?vn~%#jp!s3?fX=y|7huWn6Tagw>sbs*Wtyi_y^MV_Hh3xjbe7 z49`fKrshbqLt2?-^G?J=djMHN5^r8yFG;H3Q047?m@F$|saQ#5IS@00K}lSU4tY0G zssT`1>>G^nac8($&?%>wcg3WPAj_VZ{$a9&vjsb!Cp$NFE*5A(G90H;EYPZ0DyFUQ zCbDKR2K70)Kzrk&P-3N|bIj<(-5E)iW`8jyrIM_S$sbXYs(fY4J_y+)YYYb?F%HJ^ z7$(N$#bSg(#U^=iO_d!C}Awc zaB!HfmN0r_VVI~E82uK$q;xozf?Kvgqu3z>P}zaFY@~Hq=260xilTMCC^yY^@Vy=8 zL5L%9w@xO_u9%|QT)4}4b&S|n%8ru?v^!=e;OsiQe&RkK&D8ILi6L%u%tF5U+!IU3 zY93~psAd$veX-5$#-z9uln%E{Y$Ot_I>B@)sO2$F3H~w?th%{inhbuY_p+!;6pTea z!E33H6H;0HQ!H4bjm$G9gfVg~8T0|tcSNoht9}82-W3b zL|7Sf&S_gQ?~D!tdn^#=m}0~1j3pAWrr0o1oq~rgz%D0DIDIl$DOtHwl!pD;d z@3W%0AiZIs-nrL-m~c9HKx(=)b|=N5iSdOj04OYY?PW-j81@KBl!nT?VrfL4%3Of= zux)W!=&=avWQYbwGK7BfDv{$LniXVN9JG-kKBjV7;#V;>BUmJyjV#jZV+47ov1&Eq zVx)A1VTT!IQP``>VvQxjELaz%3-MBsRxl7;a1x=yz=ByCR1yMt zNY+8}f?YyQv0V-mYDLV%DksrwxF(Y5U9nV#Stai51-xrlTnu3jx5}QlC^yZP9q#Fk z`%&vXA;jRT_pLB4@~x#pq{Y}G zi-hPUh~|xGmN2X!!6LInvatkDKs`vHAiNRGvIg}20s=&lqX1cK1>Pt-V_7(#Rce$4 zVVJ6-S;hFZH!h2)h7U-(i{)sD8Q7yCr#C+C7aZ)c;j{Cy*t{oe1oNb41)&aOijSHw zI~MBj_b38@!Q!%gzik#N=9#imXM9W(?&eG9`=D7TX8G6T4{V689XEEG<~ z@*Un4hvl%C7Zmbm6#^qEj{t+JVs=*L!tN0wC|)P>zM^SCDI7vcPHM0k9Y#?!MnkeB zY~Wa2PSz?gj+7&CTORl6WZ-srOp`sa)JA|x-7p@F83Ji1AR=@llC7v&X#KJ*jbZs> z!Ing!;#7bs{4i*XRz`;F1S_dl7NklC<#AzVBu}+m3TAQN5~chSDtHo^iGStrPrZjg zABr>#C(n|?!>%@^SMo#+_Qb4|7Z#rxe_EbNckxoPC4KE>)PbGl#uQ1-oO4Oa3E)5; z&WRN}z$#-o8dorMbG@=8I*12)%srsQpSq?#5ZKkp6KvP9kZQ?x+5ITelfG;3h#j_9)ACLKu#?+!>|SqU@1mqk0CEMl1Mj*D)!`a?4h#>!xv* zfGPB+Tiq-j!5Aq-Xz!dI=TuXr*g+G;0*iVtixPb+U7#umsm4e?R2(zj6 zxeIQpnQ4SYXfCU~>KfEVT8iUh_G9j})U&|_e(8CtFW}O|Txw%*fnKzh+A0003z&Ne zf~MZaplMyBmP}8y)Z{Y19ZpY>TIPvkw@nKlx7mSQcr+L8nWk4mZ*VKa$v~S)Fac85 z%LK?90wzaDX-~|B8>WTNG6RqecTEd_l?&gQWAY;x-d2$dnU@H!1&uN<5njuBwefoo7tnnFc&lk_jqRi3J%AO_`wyoFO}s<0YA{b!9qNlCLVvMd>_`lKH60 zS16TzAMXg4E--b3E_k}MEkzSGnyS)gt^cg^pVR$kga4f6KO6n$LjSqce=hf*ZT_>% zfA;v#0smP>myC=0Q=vbo0PCHzc{V%Ll?V6m+SIb7SO60{^~vrQ&AvtNhHT^eJN)%7 zKF@+ddZwH2uj2n`_DRe@Ud8vX?~aO`+$p zrBpA8ydilr1vn7NO>FU|NY(5PxYT}?h5VYoBYDS%#cz}si}4$a`C&75ys&(}o-$46 zg|gu?(-6IXuh}MB+I!9nKGUVCf<`??pg_y!29q}HfdMPo;`Vulw#OK&(VinCsmI^$ zwa=UsknZMdlMjX~7FCGu;@9+XXy$tMKiO;3Z&;XbX%R*@t=>e)M)ZvtLo4FCH0jpw1begrbEubVEO$U zIdQ+er(b8p>Gr@Moa)h$sXos7^~B~x7n!%A^-V*( zCa0Z~#yO{eGjnJ+*>WSy!p)wa5g9tHsV2kEi6SI}Rh`2X=D$B%bMF7k-kZSH__gn& zn&&~KK}o47(L|I`A?;F$LK&knMuW;ssVI#yMP!PQS%uIniAd&5A(SyP7CP%*Yu)er zefRl&&pV#q`TRfU-9A~Z=ULCa?q}N9zOL)uJ>;||^3(d)@6)y_1&@eTCjTeV^H2Ud zV^yotD%PQoP5dq$@cs`pNK5{oTkWqLS!lj0H;dk;o-i2_N;ayllmcv~L*AcwnE(8Q~BUiKqY1z$B?!pjQ zi;rscgGaSCkOlNEY})>V-hv_Y7WAXHUGevwX|OKgF#SFY|NdUWz0w9LekamR;ZEd#;eg$Y%+ycfCOzsw~dPbCxiMBZB~SQ6x(^;AmQ0+W-s9ylIuiHmL614R=( z$@>^!TcVFKxZ*Z$i9UMpp`Cmd6_DGTd=thkaW=V|gW&ci3;oEahXC@?j$DJv^lm2a zPwolzE(wnbw-S_=Shxg`K8)DT!+As^Y@MA}^v2+{pQA1m7gr2zW%F#cOD zJS^U_Rv@PH%i*{)c~2}Ch;9E#^G+ZiQA@~IL_U#YqDu~lmca6kz_QXUfqaB*5a^RA zuif;Y2`tOp$pcwTgZtalJ)zkpp~fZQEiF2@$)1NrcbM%O042P2IndpJ z4_IV}$ej;wTE^@aKR^x>ejg6*?+SW=Q|T7HziEe@Tv77vdAPsXiR~!2+fFZ2 zrKFAQ{)RjFZ|-kF%v)pf+0BJ~i!kA%AfXMi&;#8?(%v&G#gllf3uzl?n6Np@kjJNW{%l;wkFZ8FY{+@gLkKJKzx!gHlqDOi^9(v7^kUlv6F-UzuUjs7S| z9$X+OeI-%UK++M2{0<)=h$+e-D@7tqNXe0&TQUKrv+&u{(au^>5APY`pK z4hw(wMhwnN;tA-ICjzR4tCRm_VA8mBvdAUTSGqZYt}7)sMJTy(;8IE?A;>Q_g2W}{ zYNAgj3RQ+Bq{u@{kmy2ikz8VMlacx)dy;d@YlUuXA)N4@{Nk4QUPh? z9HArOsB~K1QqXakJSSNx{tNu+2s?U}K3|~#Z{;M8Jo$UqzMAk33~x>Fg5TjDhZp<~ zI{`1)Pg0>mk1TxZAaABoWHJ93OWx7o@7cgdq{U4-^!&!sk7nIqDG5_TT0c0V2T?SD83#3q6e#rp;rXIHRY1+-t=@!Xdv$f zc+0M=Od4yGS1qtI$F0~RDcB#22c~p}0qW+j(wg~z3Zc8rBEi@lijzd4^ zk^{JlEQ_HzlLLsq=)u}z=oP_lO?$qOJ1p+OKYak_lI`9Yy6Lx*H?Qb+e)!6T^Ajie zvD>lj8@nB2$)w~Y*?tR`6(mXt>?D;omXseCDgRr(Avj}X&?B~S`=={}|0)%bH}x{X z*;C~9qo22xj@?iya2A1gaiwFWN(B={VLe+a_SdE2e_bl^*QEsEa4bPF8lgO`RY|wa zae`a&keeUi&CMm@j^j8N@{!P+{C&1@g5xJvn5hzr@13TR!0L zFZ5lXe6V}v*rE1B5K}H9uzeKqnmj{QdeRif$&OPTr#en6pZV8)g!#(J-ard6VI=hb z`}%+92#5ed{KHF{|BfvMEwT*z06y@-K79Cu7hHkx!u~GW`|EP-^TmJJ9^>G0oKKT4 zP~|PWb-)Yf!M+At{Fmjp9$Uabc;Wac+WTw%YC?TH8lHSP#=$;c+zIo<7MEk*#(V*` zxStpgm*f1n9nO#Au*Ky#4=%?Rm*erm<-+sg@em%5ec|meo^Tw@7nkF4!1%ZxJ{}N{TNB>m z@xtZsT& zp4i9n@CRDprAPno)Cv2z9^+tK9Ea;ME}nND<}Zzifzzyn+?o%+9~NdrdRr;CJgqB- zXAi=k_=G=Vd@oC)ROh?7vz!b>;Q0M<87{|V!Rk>9&z@9sxjW2Iqm$&i`tugS2M^g;s=L2We(s^z zems7zz2Qyiy>Vviv{Xkd3=!*LBa>Zgxzi-0%}hEW$m4A%5m7O52}vnw8Cf}b1w|!g zp;tuU!jQoE!3*aH2P~K#7921=EO0^KtR+DU1H+fh2nY;U?yRD!)&}CPB-1| z>b7?bUyd1@o9ZQRy;FMny&u|v7sopH%T4til3O$5)P&}hOW$@I?pG$;>)6#_JCDjO zFtgrfH2X)CW1*DsBZWE9Qq>B@o(glPkKdajy{<>W)UoHsxT|0NE*YKF-1YR5fdeM~ zkSh+~JLzSfT*|voi>D5Yie4QP8@Fa{e8RfKq~w&;wDsv5Hg4LyC1dNh%8HB>nJyOkI@(AYwQ>rbIWd14f&2v#U$bWliX<(aFfP?P^h7S|5GepmPg#R%y$* z?jIr7dcfSHex>cvfXa|0?=tl(n@^jmsOF7*zdy%FM>lN!{LW=p^xX#=8QH3IOEK^W z>>JoUyXyM)sL;AHrOfoyXT21H&-mZguqk;`x;*1y(=zv*mdr*-3(K65Gu1qt#QtKzV-onzVUw`WX18r=l&+rcj zocZ`j(T6|&;QJGBK=!g2-l>y?6ZZbP41Tk43S1mAeL;X;KdZhomV^iD&8w%hU#Sxz zxa9SJZ{c2r`xNe9Anrhw0E2YMk0JT#OMc)FEJ7ZN;=>2lXL8+Ni-di9h=Y#5-2eJa@1jSZ%P*fc zIb5P4T3Gfli$QYib;!jfyp+ZKwEh2k4XQfc4?mr8_-U zN8GfBUpsYbvF{z}K!2OU+ce&m^Y$xm4HmI+<9WO0f2qB|=gC{i<~Lf!+TFap&D)MB zw!Hgl*4oFgb~$e=c>A5VePY@AHN3sc+mCTVUXq;-iL-W!1Z$NgSzFHANGaAgk!J0~|E1PmhRwHD zm$hBG|82YePnHXh`?G$g(DwU;`na7dUp`Wg%|EWk-?pBAvRruFpY9u4aXaDh!uvm($5lySdAn`+*IM8Be{DOQ@7=$-J;wQ0+k8I%>`b;F z&vIC6bda^zv;Ve_%XRpA?8ok4<2LPK?ZpGE&DqIXm))$rv7fckS*&f`%i7I+`$v4f zPdtxmK2PU;Y}|aly*FR}_z+t@l*jqa=bx0zmdp8!pr0oLeg8A9_2~ah9L%TZg#Tv}AoSGd1{ z-;am>L-*x0J`c7fJZ{8zmd9sr*3RSOqIj$4@z33VTls$dz2o!W_5a*){j=ls&z_$@ zi}T;*|MU4+&+m^z{JK8cx!W*_2={U8gFxtvgO`KSR2awi+Dek_cM7r zm2VgGC;e)^{4sCMkFmHo&%fL5<9YqNad7+X{P z<#_$!a%}(Jeh=pNl_zi2c&p3Xe>4ux)4}t^{(swl?>_i@$M2s#KYuUYf7k!*`I^e_ z1DSvEeh@yM7zghYJb%~U&Gt@ ze=&}5-2e9f=ktZfrJf&W3*O@Lf3?Lp$N$Ci_kwRHeuCwV*TE*<7o1|to$^@Q#@liE ztS?)@+G5@=Kh64fXIR_9+kIzQKcJAchUZxOlef3dv;K<0`djGuJ z>T2E034?##YEYjwELd}$#tW4qkBU3>S&vSaCj>Z{^!Tf{oFEKUjb<=?nFHNE%Y@rNo$pRuXioV}tT^5?u~+rz~_ zI_(JY4G3MUw`S7yz?Xdwh-&*89XWdZ>{p$U)93VeSgAD5d9T5vF~8YL*g_@?Iz#cusb1q}k=N=(s*%>ARbX_l%m^ z^*~7CsIt9df-Y$_rQa}=+!Eud zqpP=1Y7I7<{eE?7c(DJz#cGSIVx>hdCAD=FrM(IA%>K6bN71Lnp_M(38sCLuP!ssU z0FHyXo%>rj7Uv%%M8om0$rrT3G101(D1hUVIa=!&92?E(`SoyohKY*pg=16{9O4AW zDd}XR2OO(sc^$Xmcm*dc`vk}A#AbCnIBwP|myF=pZR|PcIvl?`*N<6n44)f~wt?fA ze>*7=j%DEX!;9c}Mu?jF!ZD3$+`j;h>#cUj3vg`ny*kIh@y&fQ^F176WvjftaGdS+ z+cV%;H!6N8g5zD5dSD0~bE6#D4RG9pSBo{ku@70GC=18`r+M8-I0rp1_nZvp;a%^F ziEu8SoZ7Sl&c|c_V~KE14xC&x7|zSfqwk#I+}K&KR)g~sAokG>&XI`4u=8-9)^GV< z3+KwB$XgQ5m*&_Hci@~U9}FA^=dHJ1=ma=-XKtLcg7a5ZTXzP|p;xZs7&wnx-=sW& zb9q3J`4rBl|HR7|;hbJs=lC4X>%!;$i{RYuJ#+F7oZp`(KTLsh>}Req9L{rCZp&^s z*KchDy2AN3*7Y}lbKZPm^NdP!*w8CQw=TN%UK#jvyU8lww{3R@ zZyWQ6I zT)VdO{22$&)So#cBPt;+A}%7LkhNggX#LTnGlSkA8E|jFfQ~WZzWev=-!Fgm!sEK& zx;n*glI>qwzkJ#JDeA+LA4`^4Jiaz9cz1B{eESbS*RNc^{(H96p|Rt}j&&~i)yr>( zpPzMLWWxFC^XCVe)*Q|ppP9K%BuP9)G$o~OQkT%Z1$*}fX%6<2w~&{Q{kpDW*~ewe zqUJu$x4va<{bkUcrf%Wgx}AFD?A4Id(4c?n@YlP`?%v(L_1)Am^RlwxlQ+*dJ7Z>M zvU%x@QI?}dO?j%n_xF?Ezi%H^Up>Kb!h{RG9S?Nz?$V{{eZkH}rHdA&FL<+W;KP9f zv+j;x_Ttow7peyLlXi~Wxzpg6#?6*jEiHN*SIu>`c6A+ba8p+O==%CS$Bo*2R`~c_ zPpy``EOz^;|Xj>51PbPF$YSb%;Mq(&srFL;o5}@sfGRPrp%c#B~8yWO4&hKS?Y^e>*sHuKR-$=QNJR0<;ub1RBuZ639tQ@r*9dqP% z^hs1tO#JF4GA3t#PR_};jn`K+uUO$Su>Ikt1)DaFKe99Bp7XtXA#W@a+pn~@*OZ1D zyx;l${kiY!FD-w!e0k{A=NdEPX3kueld}Jj*P}x(Oki|rM)ZKQOhqz*e9h#W~da^!fP`Rj=h z6DNMq&JT(i5ED}{vm>tG)qedZSAMehU+?d)A}*^eDlICy!Ntb*Q2L=mkDnbl7J5H4 zv@-d+VwF@?)eWl^RayaBT6XCnVJ@~VF4K-}TXTQ-{ri?bx|M(W@afZm2ZB-0bDuvy zThRO2q|ix|&MTz%kM9~EKh&fud)wG;+vMDe`u5D|*|RvHE!nEd%F1_zYxD88NS1&)}peaqBmy?eb>j83v* za&pzu%U_0k9x`N7zmHe9%-jMWDe3D+%&h^}wXa`aFn+C*>0wjTr*BVfiM$vY`BLk6 zz-p`2tBp?_{C#KDojc_N7Twbh($)@NG^sTIeSUt?aFfo*)*L(5?bee;bMxoUeZ5Pe z&~u8X=Y(}`Do!#^PB!hDS6bh+wjS|o*YZu%kf!-x8n(tk;=T^T}3QPzL6q_^qY++qtq3hHQf#&DU%~N)~@+j$5 zQsTEey6Ew=$B%#71U2Y{=;(}mWp?h@&0oK|ZwnafZsP79Y1`149+sZo_WFEk#N~*H z0rI*QlA4l|M`bb$*Qu;qH)@H)kCUHHo{YQU>;JO&<;#^i140yS6ct|$_5a>|dH3$) zD!vVzv1!JPLHT>%-&%C*R3ul5A3vM)AqY8~!(LG)|Cn+;?=}zTNlT zhd(>^?3qW|ck}66r%xZY%<1E)ucuD+AGWWHeyqN}w9%c7+g-PBe?NF;i|%4w-RWz_ z_88uI`0x`OenwuhyL4&v3)53S@BaL0D6OU^t}HJ8e2?_WF}`EQ7@1!>zjf-?tv%{1 zM$bPue|}(B+t~{J6%>{;3)^2N%PT7tYGhG~X|za#Hn zw0mo3w{6rA%iPVmxh>H*hFr4RjcAh57a-Hb@1RU@73Ytz}a;WgpmT|UY@|Jw2Ot6S1=*^v?>NA7d#DRX$; z;lue#TLvfSCM4t;kJzQ=sis!=WZ0yqd!Iht-^b&)x{td0xA3}}K}~}ON!HZ{&pA71 zj-yInfsCPy%-x0~IU$ciLV`oR?-x8PDA2ud`daO*+S)spR@%MW@b2BSxCdreHLhNr z9Xp}-ur9-f_32xdmoYITCuM>HGJx z&e`{Ga0Rug~FsJBR<_9R5u> z{7>QVf1AVq1rGmB9RAZe{AY3aSLN_;z~Nty!~X~l|9d$6U+3_@oWuV_4*#AU{x5U* zSL5)1pTqxP4*#hf{?j=8OL6#r#Nq!YhyT7D{uguj-@@Tvl*9i*4*xkE{=ahgKgr?W zg~R`N4*ww>{%bh=pX2Z!%He+*hyP<7{+&4dcjfSZi^IPUhkr8;|MndI4|DiG&f)(9 zhyMZ&|C2fVt8n<=z~TQfhyO|r|2H`N+j01x#^Im*#cvA#2RQtn?kX;_yF?!~Y--|Ir-&$8z|e!Qp=|hks=b|G6CgYdQR1YQW=kR}m!~bXw|Arj? zpL6&(;_%;t!+#)$|0Nv$=WzHx$l+g$!~bs%|JykHw{ZC1%HcnT!@oF(|Ct>A8#w%z za`^wn;opJ7zYd3gO%DHw9R9~}_?O`DpTyzcmc#!c4*%L5{vUGqpUUBX7l;3N4*#<_ z{L6CqU(4bDBZvPm4*y;p{zW+an{xQi=J4Oj;lB%qe>V>Q`#AjPbNJ8W@L$N`e?N!+ zZyf$5Is7|v_`l2HKbXV6E{Fd+9R8ni_@B+;zYmB1cO3pBIQ*~S@IQ~ke;H%{_beFu z?>UmO|1;|u`){vd?Ei`?WB;A!Gxjed%Gkd`7GwXJL5%%(jA86w{w!nvir*Of-~5TO ze~ZVA{m-{&?EiZglO=9dnNRzSu*sqNJN6lsI|H~l8 z{!cw(>|g&BWB=Q?GWI`wGGqTHn;H9`@|3av+eaDuztEep|EBkh{iiQr>_6)+WB;lK zjQtz@V(edUBV+#~4l?$?=Qv~k*Han$Up|(x|A}gh{d=xr?Emr<#{SjrF!q06gR%d? zvl#nNEoAIJO^>mEsV|KEKT2fm|K@VW{`<-@_P_WVWB*%jGxjg)!Px)8)r|e;$T9Z+ z)r+zJlWmOsy9{LPfBX@~{zKj{_Fq%V*#EijjQxjRW$b@h4rBkv%ozK3N@483t3G4@ zw-Olp_nFApznMQ{|MrTE{U3H_?EiQkWB(tt8T&7o$=LtoO2+RtYhrork%0>BYuqiSCljM zU%!&E|4WA$`+wle*njh7#{TD4Gxjewhp~Uxsf_)n>|pHQZ#QHAKW!NMANh*0|L)ru z`;W9`?7!_bWB&u>8T&sf!`T0*C5-*Y-C*p0r4D2NuZA-AKdyqY|3UeT{YSeq_CMB= zvHuw#82jJ5g|UBSSH}KxPcrsj+l8_Ji;ax^zYSyTUp<4d|BdGv``_8Z*#C_aDaCzqAo!|L+Gg_CI|MWB(^MF!n$C1!Mn) z(v1B--^19ykvU`kJ?a_z5A4d=|B`0L{^#sv?Em0T#{RVgjQ#(PWbA+2D8~L^#Q)*Y0HO z|Konf{=@b$_V1<6*uO|G#{Nz3G4`K5gR%eCCdU4|d}Qq3Es3%JeNK%1=PNPxpJ&Y2 zf8i6x{`dD`?EhOhWB-zMjQu;RF!q19fwBMKP{#gsFEI9h=MrQ8&*B*SpB>BCf1kdL z{l6Q>*nfm4WB+T;F!n$19b^AxovHXwOaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U z!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW z6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)Lf zPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$? zKQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n z|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R z{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ z_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K z;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#4*vow{u2{`ivPp}pyEF<0jT&-OaLnW z6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)Lf zPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$? zKQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n z|HK5K;y*C~5dW$8PfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz z04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF< z0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb z1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y z6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&- zOaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$S zF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U z!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW z6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)Lf zPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$? zKQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n z|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_0K9*w0RZnGY5>6dhZ+Fz z{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ zynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ zynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm6dhZ+Fz{-Fi{ynm{L6CqKf&RD7l;3O9RA}t z{9oYkKZV1;GKc@q9R9Cx_#evQUxLH`EDryT9R7Q8_;=*+pUB}qhr|C04*#1t{NLm7 z-_GIxJ%|709R6o=_U%o5O!s4*y3v{O57_ z_vY}wfx~|f4*vlh{y%c~U&!HKg~PuChkt1f|K%M1-*WhWz~O&4hyP>_|3f(Z|E2zq z!~b;-|E3)NBRTx9=J0=q!@o9%|9lSr$2k1YIs6xL_&4Y9U&7)4F^7L04*$P6{JV4bPv`I-!Qo$$!~Z%C|0g;8zvS?* z$l<>`hyNKI{%>*kKfvLCGl%~l9R4qI_&4J4@5|vomcxG-hksiR|85-qr*imT%;DdL z!+#Qo{~H|s_i^}t#^HZDhyPO?{`EQhZ|Cr@%i(`GhyP0){(o}#7w7OlhQt3>4*&Bx z{3~$yZ{zU)gv0+z4*!N6{_QyY=W_VJ#^Jv+hyPR#{~jFvPjmQx!{L80hyQ2}{~I~{ zf8+3fmczd)hyOkt{%>;lf5qW{0f+wz4*y~t{>O9pAHm^&6^H+W9R7QA_&>+tzm&tj z7l;3c9RB4v{O{oKAH?C`lEZ&EhySk}{zr27Kg{7jfy2KVhySM>{?$4B5907Yhr_=N zhyM@`{{F>Cvx2ez%VLcEn`ATgFKf)$|B2s>{qHJd?0?<~#{T2X82i6)jj{hJa~S(q zc3|xP^Ebx+ugEd>KlD3e{}O79{m+VK?7#6eWB_27zWB>iGGWPGkp0R&XX~zB!r8D*)dY`fXDk;YPwE`IX zcd=#c|Nd~s{y%+S?EiT#WB-#v8T*g#%Gm$5v5fuq%wX)_s*17y<86%nH^(scuQZsk z|Jw^0`;QvL*nd$OWB)a(jQ#hoW$a%tgt7mQ2aNqM{leIP+ET{;r%h+x6J$t|EKK#x;A6~riU5(kG#m(|7t77 z{_m_}>|Z;GvH$${jQt;5!`T1ae8&Dgr!e;KB*WN$>l?=YElL>s|B%Vpzx_|f{>Qm6 z_P^&OWB;#H8T$`RVC=uJjolW|5F1Q`(ONvv45Ke#{QFJ8T-HC&)EOI zqm2DOJI2`m^sS8jpZdz!zkV!Z|Jz*|``2B}*#Gd(jQwA-W9>!l^OdVjQvLsW$b_BT*m&twKMjA_Az7ss&0(^_c_kk|IK-f{l7ZL z*#ClkjQv*(Wb9u|p0WS&PK^DJP+;tT)lOk$Wd&pZ;Wdo?f9+uGf20Is|A*Hx_Mf23*uR=5WB*V0GWM_T z!`T0zCdU5foMr4^#*nf9kVlOD7d&I^zjhX5|L-<1_J37_vHxLR82itd$k>1OA;$iV zcQN)qc|K$R-!C!tzorKj|A`4e#eZS~Q1PFb095=ZCIA)xi3vc(e_{eq@t>FgRQx9< z02Tj<2|&evVggX{pO^qt{3j*=75|9|K*fJz0#Navm;hA#Cnf+D|A`4e#eZS~Q1PFb z095=ZCIA)xi3vc(e_{eq@t>FgRQx9<02Tj<2|&evVggX{pO^qt{3j*=75|9|K*fJz z0#Navm;hA#Cnf+D|A`4e#eZS~Q1PFb095=ZCIA)xi3vc(e_{eq@t>FgRQx9<02Tj< z2|&evVggX{pO^qt{3j*=75|9|K*fJz0#Navm;hA#Cnf+D|A`4e#eZS~Q1PFb095=Z zCIA)xi3vc(e_{eq@t>FgRQx9<02Tj<2|&evVggX{pO^qt{3j*=75|9|K*fJz0#Nav zm;hA#Cnf+D|A`4e#eZS~Q1PFb095=ZCIA)xi3vc(e_{eq@t>FgRQx9<02Tj<2|&ev zVggX{pO^qt{3j*=75|9|K*fJz0#Navm;hA#Cnf+D|A`4e#eZS~Q1PFb095=ZCIA)x zi3vc(e_{eq@t>FgRQx9<02Tj<2|&evVggX{pO^qt{3j*=75|9|K*fJz0#Navm;hA# zCnf+D|A`4e#eZS~Q1PFb095=ZCIA)xi3vc(e_{eq@t>FgRQx9<02Tj<2|&evVggX{ zpO^qt{3j*=75|9|K*fJz0#Navm;hA#Cnf+D|A`4e#eZS~Q1PFb095=ZCIA)xi3vc( ze_{eq@t>FgRQx9<02Tj<2|&evVggX{pO^qt{3j*=75|9|K*fJz0#Navm;hA#Cnf+D z|A`6k7yRd60HoqSF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~ zsQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp} zpyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_ zfQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz z04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF< z0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb z1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y z6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&- zOaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRHQ_)km#D*h7_fQtXb1fb$S zF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U z!~~$?KQRHQ_)km#D*h7_fQtXb1fb$SF#)LfPfP$R{u2{`ivPp}pyEF<0jT&-OaLnW z6BB@n|HK5K;y*C~sQ6Dz04n|y6M%~U!~~$?KQRIDzQ;csBgz+u@m8F-`1fHXc^{vz zgMSwWpT8sgd>-NF_Xt1V2jk#8_?#ci2jk(q_*@{&599N+{_-3k%oq0u=M{c#5XQlI za2)1?`-Su3{$hR@ANK?EzM$@9QJWN&WC;6 z9`nQN4&w`7FT&R!#>YHyUcA2XddBM%=f~~vIN*BWJn*<U5W1hGlm=Ep` zZijJky>K2l59W*UFmK#noEPI`o_IVlAKV|@4&&l_;XH62%opQf-oo=@e9RM%C+36u zgY)A!Y;it}gY#mG^I}|VF&=J@^I(g4;{M`%!t-D}9FK8vJjTay*y4EX<2;x*&V$=y zJRFbXa6Qh8aj+HMAB>B~1=r(pY;hhOhx1_{=fn9i4z|McV;}be_g}b=@o_$!2d^W% z-tfA`>mRR2+#ct{{lGXlA6{RWKjwq`kNbgnU>uwW$6-Dg59h`0Fh7is`+<32zPLX) zFXn}LV;r0Z$6-Dg59h`0Fh7is`+<32zPLX)FXn}LV;r0Z$6-Dg59h`0Fh7is`+<32 zzPLX)FXn}LV;r0Z$6-Dg59h`0Fh7is`+<32zPLX)FXn}L<9dvP>v2BJ2jgKrm>+JB z@r2{xyu#ZF$HQ^B9OGepoDbt*p4i8HaXF61?QtB&#qqcvmt!6{9`^_1;W(TJ*9+&3 zaq#%zd>9v(9Y+1Lwp00`C{RKQLe14&&l_;XH62%opQf z-oo=@e9RN~1M|WC!R;_Et{2V&=fQk29_Eevi}PZ9%oC3%=7al#+hJT>FPsO?gZW}S z%v*R~jE{NZ@x**^e{egDi|d8+z;&7 z59Wa_#>4F~4{ULNF>jntcpi+0<1sFd$M`r7TO5yloCov9d2oA-hvRV^uE%*X4z|Mk zgK_b=;Cft+EzX1Ea6atgd^kVG!B%*F?Bjmm{tNdpKF){pV2kVj-uA+I;P$wGm=DIo z`EWh%7q)nP;{Ar#F3y;TnFfWWN z90&8lc$hct$Diei`;GJBc-#-+?Jz#hC!8P7i~EcFiSyuoV*a>47#I5(2ahY}hj|Id z#k}!2VcwW0&WCwn9+*Ea$L(-l%p3Em-1 zdwO&Hr7xdvo%K>?u3b)bY~0aV=S;tE{2kW1VDQHQ-KGutGJ4;Q)h~~%8ml;_d(cqR zq}dXg^Da2H=iZO$zC?ees#Z-xpPJF-rmu!_(c(qX-B<$UkTsPYR6 z6P|oAJUH~g@XL3X-1)k^$62ukrMHilZajYeVUw|^M?YEDoGpF}bvw-%(e;eY>VTa+ z9gjGTOz$;yoO#mTeJkeN-ef1`bIM`O;cnk72F`1YzyB)XsdkKuoBj9S$zF%js_(^3 z*9)DM-PcrR(v?i3+M*XhV|~eAT6+08ujIzeV`a9Z{0llsD{JZ*TiA%mbk@>0v9uMH zRq5KJx78pqIaO@~(|&g1@@hJUefkfUQ0UUlsIT=9Nkw(to@N7vN-1e{?`1yFJ|u6K zX-=D7ip@mN%ttGfopt&emp2@jKBAbR_94Va{GODX><^nhqCv?$B|hn>iwvkzO@%n64s91tWuBEw$;LU!QjN*ASg9x8@7#TGA9_=bkZ~ zvsfTC%zCm);b6mL{f%ZaQ*>3TvRpOR?NX8n7;O~ifrXPhsUVRoHnJ!eaC*; ze!F)qK2YK%vE{MnU~j*iq>I7Ey1gwPjeL7nO{t4!gF$4SY(lJj$WFUC64k>bZAv#3 zCI#w?9XQmqy=6+THQwXGJr?iUF}!#7pk9MLOOACJ+ii!gvEThzlc*9UHH&A%wmJAE z$ZCe_yX#q0OUM^w9Z=Q`Op=^*R>Ed!eE%S)x+I+;Bf1VaJZGe0S`P*7@r4Fbg3j?V zrc-t%8?G5~J#$xSmCEoQ&E=l&17wbMZu?-o$ZFmFH7kB>w~{;Ht=HD*p_S;}TX{uT zuhmz2cac7ByTkEKmsoM1^pd0PvBO0BxcE(I9i}g$e#m0qH~p*>xpA5gzhsSePRvg6 zbue78Z-0pM9zB(T54~)Tj8T@^v>-?4-hSzI6$2kB26>4)&Dhi+H6Tayuw_L^vi2j9 z@tbGZRK+x;n2xg4379J1{B8M(L!xgF41XpzYS`hMKW{5MpHvezXw{Fe8!|=aZ&=^G zu4D1mnr9|aA(wYAj3|%koj%Vh;6#Yedhz!|<43-HD;6s8{P63^UVEj_%yGQ9yy9{4 zdhb_m@}CtRKKZ;ywynrLM>F`e^4#1T6AcQkR(3oypP)ZIOjS31hgNWsplh{Mr~1!7 zE|0q8IJW8Q%P&0(oPA$ESdtc(o|JX@Vw~paQEP$^>PDvAT~V4pHfh*^lv00-fxTv5 zpR?d%UgnU?QU$N`BNZbRSFafMa8*m?_Q?Sa!}=L6-eprPzQSzB;QsTbRVvE)y;)cG z>F{~)uxa-cgI#om#FhObH(xtD9G-sxr^{mzi6|;677QRLH)Z9!% zqvxXL&7YrE>qtsHuw5k4JNxbSyw-aQ&27fm7mdGQeD3&gpLcCeG2M$hPaYDjGiUd- zy9JFc>$Yw^vNl`ueLv+9mruNI>N)sFj{_y9%F6k6Dlg?NKj^A?pLpck>1^Onsh15G z9oBSdxW2c%XNHtV{4eW^2AdQVHgq!G<`I$XZ+&~mNQdh`;~d-uJxi=xdZNN??$EhE zTTWKj*l(QIb&H?zNb%zocsReu;NzPGt(b?p5M)%b9T~&G= zO=+Aioe^hwz`xbb6ZY^c);jUH|yj#kt1-=kztayOG(AJ*#&`PaT`} zYo^Q6*{iOl$(voY+frC`zNu_lxXg?5$WK4I?)3PZ$_E-YE3JKH-rZ)~ zM2m4A&F^L$x!p@Gc|g+(qdLox$1a5|+Y&hXuI=NK3E#I4zwy+&*uvgm%i#U@Z$@n1 zcHl?<*3siayyM4@b`8HWSN+J*#*>HKE`_MLn*;}}uWh+u=`cH?_n8Uv?1DQACvSCdQz1i1Ih?yzv{}k$rm0!4$H&Wz9DAw^IN7dy$D%K6(^{Of?QF@|<|_Lt-JP4xM!POqB*Hyj!5Wxx5_(y_v${w z2TwjV^ZBe#15K5uKQcJmtyk>5CB1UTA2aIGar|ja(LtA$`nLj?x8HgtnE$Hb!MrSu z`%Y_DKauW#!RyhsxvzW3>h&0}qqgArd(YEJ+Eb!d4Q%q+x$n}8V}r|1jGnu7)w9}` z2&wiJYi@Q;h+pt{;mca1pfks^-V9RNbjGRl_U(@rujYik@9R4JoK2hMkGHd~EZ$yh zXB8%9*BZXPSNj0}J7W)dw96juH_dbH)2n;7*6eFKXVF(TD%`~@ZT{NZohS57P7yo5 z-q^8gcfrgTtGm5=cIUL!B9}oyV&S=8ru*MtS&*K|W23)YVq($$ml?~y=k4pUJ3noXoLYk4;PJPobhkCTGSaR8#?zM{ z9I?9p^X;R=xM^@L*Yw$FE+BinOU+mwT5 zuykh6)%)I7ua6vmYgYb|2*Kno8@oNRkDiqAtJ8eRn()&<7Z{H@HX^6HbN~3MW=E&L zI=ZXRw`~ngM{61#iUPlCjyWf{r8z+BNxwIv7KF{%qGcl0$u1p9dzK@M_KSDP z&yPA2H0s{U@(mgRn^!b{UGz?W*}{20%q%7S7kzFGZW1JnJ^KCo-Zh`@KJfBa{^|DW zVYT|B%CT)1v?h1DIrmn;l+-n|=W6O+?=xn{prd}{ZOUe>9B}ugp3~^ z9N{v1;`Cv+j(l0V>1@>2hP58!o*(smvio}P@wd%?4eFV3?@p@xJ@@p_Rf9BKBZgFO zy*{{j{jtN#oPYN%O}q0o)a%{Gkl9m>CwGm>-X%Ry_VUe(QGvA@1JhP1t@`xqjOw`` zTEmS!-L-=+oKSJ-NZqR)sbkmu*|Q3ZE(+`V49uBxZFs`WYx%!BduYDUpSkct)Puz7 za_$on?-ZJ>nDqOl(a`DVqV3m9ombwjBekXPVVNawiY`qce}K?B`9*ot^wie$#UgLI zmg!_}Z~t&B_uIzLJy(Qn6&pHl(;okZy%yVdxo%5z-I1px)9Lot0m1E<>X|so2Qy%~I z(b-3>k}U%Aw{7aOQ-WP;%wPUIu4noFxR1el?LN|bzi6J(h&g$^ZvS>o-R%de9vqrG zL35t`^R}%j2VYMqc-2dJ)u<(=?QbU8jaX&bD89ee*4L_U+^C%+#4s{C&5=^Y=cp z6uO^2`*`X7&IOnEObA*QfBV?!r=v6G#U4$Y@oQh{;m2-IHg*gWT)Z)9oy5Swg~LjN z)cqZTznxq#_Dr(Je1%}KDCwu&EW2&FY#@=f{?78NhQ@E5F0VFt=^Ha?!lte96$%bn zZL_oxZd@?__GP{HR}oQh+nqBT zAG@|B=`ZiL^xBK(UY=c6veLL2E%*;)Z@X0>$*5LeAU59fbPkgow zQJZ#Pc2mf%EQ3!gEaE?oj_DlGH81eCny7ln*zkU;?`5VM+g~4|xXDYV>a4fu2H*Mh z76}epKiRESo#SP{aooY!wO0;SKc2dKSF@>gFMTzW_N5*j-3PWr8uu98%k#6XXyTfw z-C71ooh#j}SQ;u(Rcv6^V|JYMth(d*Q7O0fhHj2Nx8do!oB89;h$rr@eKu&$w0^gb zyv-9#uHLQgqGcEUt0JSQf3(OVqa)eggPYbad3E+_zj`(0r^c##=Jv?CDBsI(TG#mz z(_BIqeK_XV?$wl8JY>YToHdt@tloBV;dCc)nW-17%4RM-?{l(h(5$3!lC8ZLT`s7! z{pwh6UB9#W!+iZNFPG_Dk`L(IYux1V8wXTuuwA@pj7EuZ5?#&^`q6a_dWSLbzzhkI#{M9Er%ac#7 zJfo33HqJ(6SiuR0I>q`=2Y-yZ{jlxYh?gq|4_DMvQ59TTJZN;)&ze$gUpO|3F^f=B}Z!x(AihLStM`oNoE%z9e)@ zNv>J%JBpK&4{a%F>yg=7|Iz&F&d<^5pMooIuM*fFc=&Uc`ZMuYV>$11&)s)U1J$~d%di-srxbL2s zP41_CVgwN`({;Soe;sYT_kCqubmKWusf>5;R!A7OCx|w0j#G`WIQ%ZGmqwIz-);)! z^HR!E7ryB^T--nPgSStS-J^+CV<%@BjGSzBooH>dYIpP><6c*4xIb(E`|JM~d+!|| zMfJt~ZxTvq3nEooqzFix?Yn>)dhbQ5VRmLV1VR#0=x7u~P(V~vL{LOj5YV6?s3?f2 zAfhNLD2iARL{wDN7((`WpWU5wzWRGTzt{7ZtI5sI&fK|k?HDvmcyN94 zmX`-U@$;gI^AksGd;L!5_5GGMo7JS@mw*4b@R?Tvv43VRJ+i)we($j6^J2dq{loCZ z%bu&Xf7zkQ&s?+o{GRJ(R`5RCtIOf--kDD~JXzy>uN1g9>{C&;p_<|ajr}|E`cRtyw$M6@TUi9C3=I(Lo zsKDcorM_9E{n7h7jO%shotb_5Z94hRZ?8P|q~ne4A87uOyHnna&smUj-HVqGj9l4e z>9OElk4^bw^xN$&K2l@lz78Eys!Xl&)nBXj3_sqv>8Yn1R@?sZi9>5PbsziI551mW z^~h6;Y@by=`=H;Q@z)c1jT-cw+NA27y5HP5=N|TRwX0Z9hH#Oi%ZZC(l(ePFjCCd-T_)$=mOp{X>uW2VZ`&P4&!$$9`L%I{IO? z&qE96uC0{t()ZtvpHnOK^;thD+TV4jRGxFD#`ixTdGwxj{eK?NZt#*_@7(zG=qVQq zoUe?%x^{GajHgZRBYOrOP@b>unx5^OGr9hSC3BuRlH}_C*pHju`1O(7f9}v`#_Xl9 z&1v@KQ=a-0v-37p>Dpt&kk6i&_tl8%_vFnyl)QNN7oXh}*Qe2@dH2Qd{pyPk|Lz`j zWd4}B-XTr$XDo~{Y`?#CCbxwzBHcGuTKoJ z1fH9f)%*Lom7;E1P;uIrf-YNkIA6W+aJwfCIuojFto~`MUN6mQ`QgmWsNdf{@x`Ez z-aYwoosRu~Y+Cj8&%WRB+UBSpv;RuF_4>>46-byT&?wIev8{arTR17)_&jZs&fsJ zPqk??b;zpMmcH=Og0(31ZCaf5#&-{0 z<=Zgko85bxywJOT=k%k8kNq)n#2Si|t$HwO{#43w_^;8N0e?_h~umbp6M@ z>qpP%^ZKcE9X2Q4@@Shuw#%>HyQbZup2pR6)>b$$Z~Fu9+}FZ&>$PQAUM;H{qb)%1U07)Km6o>+73<9(NH7t3obsp}2Tt$+UVFZ&-_xqW=)1Al${ zapNX+-g#?{bJX%{z4cz3HKpay+{tx+eWC5{=m+z5=l#^EVvEmzJDogx-iQaj$Z7NS zv(L31@bkJG`gK0`;N))Yr+&4=b6bbntzO%lzit1-T4So+p0?up#eaFetoikXo9-UA z-vrJwT8Ff(Ki0j`K}XF$FIwL_r|Zg*Nv|A(w1+=cKUGk-!+H6 z_xE?LKle_1NuD|dpEgRlR%`{lSHiFb@O zvhHYMORe}puN$W?{%+jOSM3}5$m8msAI@!zpS1s#bBEv9``Ztx1A8@2s;&3?b4|Cj zn&YqgrOOvbAG`bJH~*Mqoi?hg{kl6RS;zk|wo%@uH+o-_ckjS?PxSg`)3H%)PmCS* zuCecV*ZVW7o~YRChO0K+`p&uAYgFCx(%reshX=o%J9fnS$JUKL+;_{1U)AW5`rU+! zbDn;2|1C$pxpe%4_Xl5aJ@R6$)IV-~yWyv6?)bEMwWPSOGOPB!TtEJ&T6ZpgFE{y_ zcT+m=X?ft&erdN~GvU!;sS6|w4PX+sXJ?HPc`^nEX*Sh%Z_~4hf4Y;Gi#&P|o zZC&~J(hftOdHU;b&z^MEzVok-A2=RwEWT~P<%Tteyy1aWpRByS`QF2g-@2fmSfU2^?{?hq>y+;YHaJxA)VW7r zZqnrNgka58-3y)>xhv=K0n4UOney@6rI(*-{@%u#AKG5~uHAzR>m2RlZFwl+;kFg7S+uYVIJzE8o9_a@id zF{DG>EA5Vb_VVnfpX$-!z8Z}ejySua_MX1a-rD7>CY^rkV{JMsqsoq|-&gDX7&{_Os6wcG3VpPjt)`TQSRjjb^_bMo=z>4{3C zjALhK=2X2;?X-W~iC5JriFNP1aOuWj4}9{&g2x7=ue`WSuQFlP*LR)0T-}rP_R($5 ziLGkvc6{gh;#8xno!xgmd*u0B@7X@|`U!eg2=% z&0DrgchY`Jlnq zySJWc`}#9q+7_Oi@N>`8H{SJYw?>U--F@c5N9$${Jor?b$}i1q)3KYc{nH1Z|NWNh zo_MQLt0~oI?%Q4a{jb0HWZFxeJ>wJmA9-Zt_w_#7bGvi+z4Mp+UiW;yo?7$3)#L9` zU;ibu$&Ib+?7ZWPE%nznj5)O@{>xnT)R~*_|H1R@xS17_{KND99(_aa&VRmokDju= zN8OvEF04B6*jnn`tp~o>*U{wN_MLh(x_VveB}E@bjHP+%hO^8pYQNS%nhGkdZA$T;vPSL^nSJHdJMVrV~Zt+ znosln)itVyJE{4pk3Wib-*V@`SHcPFlS z;r>?+Z_P`7=kc@EosT(Us|;S7@N$c>&D#F({I3bu^{@G7wlk&i!be}YzVn`+w{E}h z-i_Xd-@JMB?OwURe0B40&$j=w+Eh!YSwCl`{xbWbe^b3BjXxgu)Kw!sE?BtYqqe_& zZ^@}Qci*qwGxxSwl{uqXyGbK5_dR)j#(>xEtM{^Yan;f(-*5f3>%rZ19$wIE+Kt!V zx%jF+gIZshUw`?qwl@vkk@4vEsZ;-cbMo!=YCV_puGZzD8?1FsJTYqYfc#|>PS#0r z{kr6@H$ERW`1#2SH z46goy5j(EqKU z`@}mH8w@|TVQl)m=SKhd$3xyPvhLk>!@b(G%d>yjyv*f$d`o(@z4zsv+&fPrg0v)^o4#-+c2;uJ>1r{`}LVn==;H@pXT?e~YSXYvi`c9{Ts6b$@$t z&iaPm?izHBbJ$gDw%RI=`DN}?&AZNYEPAN&HKX6@<$ir_%f~*y`tQjDpPuz-2jlZ! zoNsoyZBy%k7wb>`KCZTZMz#5eS1;)?^PxKue>(N<_@95zpMAjM&U!rlrD^x?@U1>l zY4KZgY&p*@NWHe1cTxX$zmICAJpQ5I84O(Na{0@a^WxHf{O0^OM_>B0|H;^M@4Pm)85|N<@2_?&+i*K{gXG=w=DScjzL$yHD*X_|M+3wc5Zy#?T4Z|9;p1o zq1(Q_x?z={au4>l9QgZqKf88m@wY!c`a$+%zb0R`dc^GwZf^O>)W3d@8Mg7SKF|H} z{m!}{thx2$lW!k8am}l3qPtBv-Sd&bCvIu=ai5oz{AYKyTYS~T>#sf9_SJi;{PE&L z(LdBVx8vS%(O=$t?aH}{JGQKNa_^Zjm!kT=wqRi5(Is78{(Zn#8#+AJw(sVp_NM#u zhqoW|%0o+kk9lF@@!MW|?ZbB$Ja@;WH@a_sHD~qbPfb0W@bXQYrh5`AbbR6Xa9h8F zV@51&I&%BNi~3&wdLU`}(GFj%f3V%1UGLv=Rr|ejH~v=Rk!_1xyzUv&C@(g9Ud-u{ zgAN=?YxeQY@85cU>xz;5%a)(D?%K|>XT6fW@X6bZ+l%5iCCzX1%!0e; z{Gl95nDf@`Ge6G$uIJ<(KkWXZV$JOtPkv*)d2!0DYmTk^^XzMfUs-ckrziC{c7HhK z;d_n+9=he5Yd3d&^YrOwwOT7yEKBO!^Th_MUcI~NjnCbsf4lvQE=z2GzxI5?PhL&< zVqGuoU1Q~=*A=u`bbi>HnZ5`p&5UjPD|eNQ@c^W{MMj$w z(qb!DKh$&5sv%i*2A#3C*=X(Y+33T@(1a1k?rZhNL%&o_|FwnvK(nW`j8xycH!D@O zRIyg7RJmqMwd&QYSYoS1*Q^#5Q>l`*YL$wWYs6S%s@AYpkE&cTD!Ovzik2!>YE+G` zS+RpOIf@7O!ynDyN`FUgeT-f^Y`sdedNZ-5j@&nho zZ~E&!=ToPDoqpU_x57Iu-fZwt#nqK-XMgi!>ld=BENFjCqm*&$hIje&#kSveS~%iE z%TICn+s02h^t!MAz%d^j`Q_P5Jq9`M?Dco_Z9}_0zH!)-@%P@p*89iqmp;F?R`B+gT&)*JMR4KpU)KIDt$*RNRI`{!MCPTo@O#3_5{s{JapoUrfc7XN(@ zemDEf0nfB$pA6oVJo@4}W6pE2ugq%IvGLQ}-#+_gX0rjW-E()^jXMH;WB#hX)#j_EPb{gi=lkxHyFJpOX3of0>zQ>}W?h$A2WHl7 znRQ@hy_Z=BX4Zw7*O}*==b4|I{hR%o{h9rkpPT)d=b8PP=bQbS*O~QZ=5^-z=6UAl zX8&ftW`AZs=I2AAcHMRM?G_D&-qyXIDZa`~gXC*52ypyR${r<#1;|H9*^ zJu~axId$E(s%;OBNvwF|p^LR9zIOb<`OnNp_T&Z6)5g7#7mTC8FzrZQa29R+ zcX`46v_sG41!E~>tX20?a18CFhL?gHQ+)jI>+$Cmx3c{FZeG7KbAJ>QZSB!#|w4ygPB*+fBpR6 zUfQ^Z`N0OYc`k2$P`{e~X|ri3b;%FzqTM?(KNwqw`}p&N?P>Q;%MZ?@9XdTfxSzIG zW`3|vUEa^;dfG|Z`N5^MaryLH-(txw$Pf0VwN$+v+)jI>{^ej?1Nv)xIXH>-NYl%~ zb+o5iTn?V1&1ro(*uEk2wCi$k9&P;3mxDR9Lt_ep=V_0$C><a zl+S4`pB4m<&>p!l7;M~>=ZOynC(*|D3+KTW-3h%k_?y&E>G1lgv+Ahuq*TVpO_YYjw9a=x&Yc zZf(=es`Rm*ids-XQPHtcRZ#PsHb=;a)oz`<_C53VWiU{9-;i4S#OG)*$*I^6#_Hthrc z4$TjZjJZ9>#m4oQ<2|hks$hxd*qW}`D;YB*jEc#QmWh*oCUC6QO}WA5{4M8CmXz03H|vFlF)uVP@1tIPG?1=Wa-YQ+xxuY223?*UoN8PAJ{3+Y(U$W1Lu1;? z{Cr1$XE){rJBR1zNK}kHG(Ro*%)(p`+?*F2DxYz$kRC?I_@W|8BRZ$>Q5(+7+>#d@ z8}5U3t{r8~jT&#wjz;|WSrIL(kJ9jfoFj8DK5*UEyx>idz6gz&O@%fG3$AhA0(Wq4DL3>(PMfbF> zuI%F2MUD*@xh|$FInfbaX;D&FayU=c@dDR11{YK@sLQEi#@9HS)MzBmy zOh4mE5TCcgMpF^x)mwl}uCPWm#o>KNGgo|l3Th+imXQ`bdo zWAsnOOe1%Vik<~-#G)WKafP@9yT;`b4~^_|DQK4sS>?^|-V(YLeXzVi^|J1*6tkg< z^*|*|SEb(8N(-)6hM6mgC&N&d5u_Jl>ao|B~`@vQl{iAm%_`S|TF{ z#$5{LZ@xlbE8Hd4?Aa@fZG}7LrgCr7%gRS5%e^Y}QFOU775YfK;z#8hyU<0Ks##aL z`&!qz2U@+M15Z`pKz9!Gwr=Dn$K6jxRJV3{M|W1_XaeVk&N(Gr6~4PGs`$J9CEmqV ziS!0+;9ik?bc-(U=%aGyB=a8UOZ4-|6*Q3nUspNOSvPKh(u9ZD)x1TChl`GhoLk~( z#s3dSJC%DboM1Uq`F6u%4h3y@GJ_QIn{Mes@Q|@z`Pg{-*fRLak@f%8A*;Ohg~J;wPV8@skl(`hW#Mg?!ex6`YK$UwEEFao>ti+_xw? zrdlDE4F&Qmz|rCpcXQpk)~pX4QMv20qIwCt^rE%AA$GH_z`n)NMRoegiO&yyE;7kD zL=>ZAc0@%&p-FO2g>$M8&JWJOzLtB>oRXL|y=wXQ%mL5!q>F6&>pC_+D9=SofOMcLMCA?88 z-r82KRl@Bvo|cSnGW~t0f?0jsBg3nDFp`Cg5N~7nbO5iFuO}gFlHCFME@rxSg^+G%vS@eYl#k=l*FPEpfL` zYLq9SA)c&p9oFD)0=5p|!$UKJQz)<{;f}8RGqVLsw{R|#zG<+SZwv-so7!Odc)OU_3zKIOrvlJgPf zjxTWSgdZ*k8IK0CMRFDLdobbQXP;i7#IuW?&*7S-wF-i1%dT+$b+t;&f173H&;L4n=Nh^Y=e%Vt zd5PF7^p{;yHY%0-JZNvl=x42qD~_?QsEBIuv#w%q4#td*;;6yVZpDw*iQ(wD$WbP@ zVjnrzBIl0es9ec#M0VFPzUogG1cfs$E+3eo@Elbl`h@U41rv7`M(zS+@{wo>`Qi#A zGBHt^Tz;Ou;x`rqM_kFLtt-i)L=iVu@Iw)i7T{+u zLC{kq?;$zaYsRH-TMs}`9wBvcoS#!6DkG!B1niYdrLPP0^~JV=;HE3dFQBVfjv;1Q zx$7P7tE=R;wig5sOXp>Ep(lZHiN3a9VUA>6i|K3sj)LIx|8iUp{Eu;cOkZutwW;Oz zRc2g$uh3UKTDo98&oFJfAO?XDMlWi+mX$3AUZUxu-e=g9d+FdRuGV3sc@;c}y>B+_DP2tZkN7 zBqy|}QeUfgLFGQy_>_>L!YhVwYb5Cx=D+DDwqvj`=P2F%_xf)J{+ogSX5haW_-_XO zn}Ppk;J+F8ZwCIGf&XUUzZv-dcLr8m6(8zwQlynISYD;uapA)jQYqnAt@uzY^sKyA z-P$MALO+CGDH6?EEQFw;S8SvubPvCed`{>WejjQ7C!ols`$|gkC~}%4>1O z_)u#e9}{_RK9_Kv@}le_^fK>X5DY(0gUI>8$a`~sFGSuKM4m5l`Tw(~R%9JY-_RXd z-`ozn^w4#I ztjw%*qkUXPR!WAJZqVV(&}DujE-AC4Ig)Uz*z69c%kA;{RKKPhfmtO#wiJEdt$UB2 zy?T$i;^*P(6DKE4nVLK;B{gk&dPZi}jG41$&nbS1DIdj;75_VDowa}KMwKjU8{C`! z)F;S!_1D(i@=ImQV*|6Fe(=u9mL~ZX`r3DyQj47SdiuAqM)sF224%kI&YV%P?$Jpb zVz2MMJ}N2k{`*eN8<4;M&a7p-22Zbdq*uotGp2NEHqY35d#6J`{_y#`O+OzWyKU#A z+pbNkF#G$_hYuZVwEoLc?>)dbmG+Q$~;g(-3xfb3qrA@xC>N}m@Z@1-(%s)DQ`0c{ouUBvWtLN+k zPn;X!d_89P1CFbA9?$wT=BGQ_AKP@3>z2t|8>g?G-*tlH);pK?{qno%6W4v+_wSDa zb`xgK-% zueGRNv&MCA(^_mwuHNmY)sOV)vvteVa|2T5>%Hg1PtJ1aB9YxwpxJL# zx9?otc<0l3AH2Q%!s_j-Z)=deq5H7E_Xj%c^(k|@ytyIuv!k7xJons?=N|aDPUk_R z7cKt1f7kT`d)0SUsMx>Ff}}o`Jnir3@Yd%0s~mh_PD96yeU2WyYtQ%Zy#1JOWR;eC z3Kne{cK)qrf39bJ=VH?{(R)6waodK^HVzx>+PB5sY5!9nwp;dL(uzut-hZgwl8dYN zpBU7o=k_H{PrBDk&)qq=Tepbu*`-S++qC#vFd42Q!8daee(6qjXL~(`{51mPMvr>b#MQ%>rbvq=`+8{;a7fn_vOCl zewp6n?%9Ebb*{~hic>3Z{_)kRdB;~4jMEOk9j#nia^ROEj~$*HcdXH`{qNu1_mM^~ zeD+EGi+RJ_e7*SD4NcB0dhfmlYk$d}_~_%;Dj(O5%bnTetKIgl8xGIe)~`ZN_SGM~ zVypLS;+f?k%DlM#{J;J?Ju4+MX}JR%M3L=NlnQtIxC@f=%d1`LhlP7^FmhG zkC}e(Qsg})GbLW8zv+=WElo{V{mF)9MAEdhWFsMb#3**d!Rj# zOLD3f>Tg79R=Oq^=|;l9R87rHN@eg#^pmD$PPQZ`r5F}1H92cqiX|;QRWo!faq)o^ zJx0HjOe4`qXA%-qxSf%r^V}&$hPk^UeAUooH50o&EumNWpU2J&KfmdRuZp}kaYBR0 z`$E4T8H_m}rX@A+V;Pu~i5IeTPf9E{Bg31WqR-kbeB zQ|kJyrQW|->iqC1itw;0FQz=1{hH%3<<5K_a~!6A_Dh+8!s`|>5EdpS)0l<0A@n_Z z8d|btM5dk~Q)cO{W@Lu{8VtO#3|6P2BR40dxSf^}vol5)Tla41>FVszswRZ&2@nbM zVZMsiuUAUeG$S1u)Dyy&B&Fzx>$Iel1csDlSf;77B7Y%+87wlYU+g||eZuI_nP%s- zMg8}jjm1dPBApiml98$=OyxmCe~2+lkQ;~IB^xQ0 zUUE``NVX**{7|LupD=iwF?ds7}F-4w=GrRAx2(kvb; zJZF&^EjGuaLeCj-5uwRQ2+xnqOZd@JQWH{=l3C2z{^GMPtB0nt&Kbq}8>FULrW&)u zAB2XMXrx4h1S2H#&&LVjxs<;qs~MBAA$>zlc;a+5Q?+Cmj9Okr^VdBoGhu|0X~{y& z(vxS4ZA(s_$;DY|Y5b17iq6L!=?S9^Ei<+7!xH@sH*f_>GmJtLl@>8*p=A}@Cf=l| zzrypwlbI0`!(yKgQn9kLB8tPGx?xFAotY3;pRfyyyeaPB%lLQsu#@}>JNKShsF+y5 zk%9^mQZfw9l9--qWMn3Xp192QTKep?%+yYibIdl}S)cHQXk8c+&_k_T!}4a@ow}vo zUlVz6%41xq_mOG8qWleY+3c2K@@uF~u{$lpLcbII$rvCz7hh@okuy3)+VJ?hhptK( zNepHQs41ygnIR*i8)*U+3^fq8SSbP~B61x1JA6VCXdpc#apBX@bppc71Ubcgj4QW# z{FOf|=aao^$@Am1lJCp8By^}&sr%$4hOb)}Y10DX_ZK4Vk;wUzjPUVLC*}NF5&1km za$Py6{HsG{)+>xHGCKLQl9Ex(@IoaBR!dIGY{?>}bZ}VWES=*lX=(~iz0|8reS zfr}J1Iox64RUu=X0D_yTrt1luRQO5wkCLBfaY9;Vx@CfDnc%lfFf0=SmI*1A2^`6^ zOqgMrFiTPRWf2P}eaZQuUvd#65$qX8VHkE3ZAH+OAN*udflQfr06Z{$L$11oZ&I5W z!m5@wZOf5w^ZC+1XPM!LYaeH6Yl-V{W1OW$#7&OZ!_IG_W&A`$JZ(Imq^gnM6T@!` zPYD}VE)M%J{wQ=|{2iK*IIJc{gtuXH9%q>kK+c*LXNj9@@ncwViQ_FDJ6gJMN(P3L zTctYLuZAfn242< zBN)YWBO!bsJRg&dSqYIzws;*b#c-((!|v2pWWkelpc@6ZfJ_l z(44AUS2d4aQ&hjt9q>Dxn&NlqHj7&F3SITO9DYT21iW6|=kq%hyVs$*eTG{%bhqDc zfrcr5h3a<(oIbZd;J2$ThvK)}e1U+&p*U;-Lvi~R%QR*{O*G>4q(mOh;xxRv&KYi( zV)xlqze{!66tCt`Rj0@2RQ$#JmcRdr_0d&_16s+hI_-ME=J0u34wv2QbZZR3;nnog z{e@YkK7IT3A24vx;2}eY4IeRb)aaYXj2(C7I~8$M)FQcj9(Taw)4dMep(?uOW9Bu7 z=5_}hMnLzLzF#5zRn*D<)nBFi?=>q8mu~2t<632e2)d+{w5&`a^;%`LkMr|qVrr&* zmXwl_X{fp-Bx2Ka@ip>t*mSqXQt39gYWN&BzsI4ue7eU_G{x)FOxiVkGQa)0;j(Lf zE;Aes!|Ap=U54Tc_;tUIRN>G{y;P^utJplM8nD}RugmTVXf{PPyc}_R?7lMV!#`f& zP*ktY?Q}VP0mEzadOh^uHf)+lu{q1ghwkz5kwfvSs>?47qoH~cR20K$v+Js_)Nm|{ z6UlaY?E$;fru!W(n`XHA*BnqK!xK=9GUMkd{Z5@_)*N0Q!AEO&{0uLkX^P9?Hs{m4 zP^VkO&gTs%D1+iOkPpS@^BP*f>*Pjd#-nLAkITUHoiKA&NC`#c`I+ifd- zzE4qXF2(0{Xu91QKvCU3wh9bsy*Pau^=|L zO)s;)nj@g;4&CFn`Rs;MQ9OFUkA7tx$1zf7jZL?{1ERxga z<3Qm+B7e9%21}#b?S8|d`CKklbNY1EZrE*#$M5#2=6p&yv%Ju6AJ)!r8E(H*?2_H( z@&}B7&*fHZUZ0|(bBaePTxZqi^EnKM+v!o9JYJWg+1;$8uISz(xuYY8 zN3%P;K8J2cz{E1CdcX?<&dPfYKW2&{7p{X?2@x~lviU!e|0nZ*lJL@#lh7w8YJde& z?M}bb8*sTDnqP6-7>-{H=yr$4sUQaEVdOPss_@xDX$z|@#I|tTLT`sp@M3HXr^6FK zzEw{^LsE4c^62*&s{H5hc-(G}ztHYr;(eOe=W`o|qH-6YDl7L-lHQ)uGz`n$L+QDR#f#?)8!g(VRBa z&#%}5UKCb!+f~iwXFBbLdSZ7dXsexb6_@U{+r4flzRlzDqa;Ya!>+2xpW)=a;z#ij zbqxjbnDdSQ^LnvQtOk;yX)fKbx^&hDp%=^HS7aJp8gARgc|Poco&QaBvuHk#rutNu z%O?tB_&hSdKAeBR4IEH?hQfdNZJQH?^a4NJSae2GI1lzB*^)6CfC+EBKSZ|llha19I_`R;eahcEOS3Rh;9|cux_$|-_|0y^n zT{Y}Xn_p2JZW~6!ZS#0kAJ1u10s*%zU>Cz#q<3b2sD|!Vv4nQT?eL=TE=|GsIuz`@ zTM^siV76U83_j-H?FqOINLQ@9Pe-q{LOD14(*iDLU-fvrYQXEj_Om{Q%ZJZUoIcba zr@)iiYz7bDQC&7QfCY3Z4v!iz3?FtTuU~_tXUO#GNj@xXp zRtho{aDp*ihSv{3Qye%MpQ-`b6ptMUi4gh~dIdA!NW6Zx0*Z44cya?{>~(XNU$q$? z4ZDhvsfMQ77?>B=Qz)nA{TvP-PXHv;yt?Lb_?RJ&>Shl8m`opd4!`NQaVNVP;5Iyn zm$Au$W2yZb2oq@rv)Zw*h-APOFnB7!r$h5P5h3$FW=o&4wrCDh<}pBVIJ$u5@!Bwre5`dl|*iQh@J<3WdoA|o&s2o z0R7qUwq6fCYIfEcwXykir^gA(@-i@o7x_>FL<9KFGI&GR)qumL+I(n<2k)q1k~|L7 z(g3X3cz8RLsDjebb&sLi6;z&=+v#_?bkqR|WcLBwkt-A$yyC{gvd*dl`Smjnms3aG zalq(}S4;(x<8ua7S4g)D?VPzD+*QRixEU9qOi{5py2o#zh(J0gcFd#M+(y9Z_WCh~ zoa6C<91uH?;$Rt3%z$olX&@7uU-1NdxFX%*H&hoI=+ls0#NF%CJgNt;$u%ygp&_+6 zd`)#Yon`Ec7xD4=Jz`EAHV1>!aG)N$7i56-0y_pg9*-QF zWJ28@-48nVqt;yJ1g!dPs!X^~9$TK?YdFwBmx^8#>KQ9%_Yx~Iat+L@>IzoKX&4Mc z133gVEF5OY?bQ{QN!7Ul2u3elC!wb>JuaKqgEhl^D7FwXG+b_hIf_s5ViR=T8;T(m z-AQl?hA))6fR4N2Gmp*`0&P(_%!&)~3>er3A0Xf5GLSeOL#hTgxwmM^RI=Ki@R1qx$J@O!@hB_;0;XZP-FRoMP!1dkB|It^ z5N*LG25cw_=gL(c7x)Mt=62ih>evXU4rTY?JH|7uL1WZ6UFu??USWgE*Q{gCUyUQRp!b|!IH#y`tJQ#AN%=o+#A1QKg1)jkrhy+H%aN-tqyI}+1 z8k$$p;Vd+lh7rVyI_)->H=qhq_7&n{b9~rbuhSo}2mHV^CXOI0VEFBt>Sv<3&=6=N zeg%;hQbY6F&_oxOgWGb*?8j^|&|c7y3%Z0T40!LySP&`le5#Mzc+hd=hF}n`1K2h+*xz?(-0% z=?=~_`!QRe4Zn|U;5R*-WkbZBZlB+YCfanMgB{UU=|aQb&=uwp(y8bo=EcqTn?Wo4(sD(vh*U{Yu*nB;=`{4sW9>QWFeOjFW?0BTA-q? zJG@A^!=`|HfT&Ec;U*4c?mS%O!~g}*(m^SR8{hCE|@Bq#)sf_S_x$i0A}!M?#Lh-Y#!2LN)gkDoKa3k1*@N?qgmfdo!x zfC$?VVoOyKbvHKA#=TUh1~xVCW412DgH=&f-HB-U?U*kwW9Ep?Aed@_i7uh+@IgcZ zpah>A9rb8{aDb8@7{FSgkRWa%8l0yOE9t}kI$%r+{fv1(Vh2n+|1hA-@H?=3P?j(l zP^6d|bk6W<*h;%yj0F!vT;fLwK(v0JjzGFp33qHja~2g31x^CD3HH_%fg<)Y^C_ey zde5X0m9W}y55!mqEVKa*f-u?UAkZ;1;3%j-aR<<29-A=SZ5O-;twrSHMI-TM09KTk zIK$>)5eWA^#q=+PC|TA3@~){sE|8T=^ZKc-(>0I>YU##2!bsAA*mIYczytKCV?!}@ z*hvB%Y&=T``vX*FCW%Ba?M|X=u!#%13CKrjb&0Tbc^KF!_%b&LNQZJNV_%qB0X>K) zme=it{_&wI1a{240<=*O5W5Z7=0t8hP%mBrPaV^X`36oKHpQ@^K}Zk)A4UjZXJ{@D z{Ea~{fVT&nDt;#@Ou<6XJ(Gt7VfH!A5h%l7K@OmbtcsKP#RrECZH31KfI=hs9sKLo zjD#61+dFhI&n?tC$`;AoK7HOL#jZ)W#Ut~zyMYRmX1Kq z4-~@B5SPF?5QoC)It8bq3m77|7)l}kINyzg0(ZF`a2U-4O0qo21ry+hzQnd^%pp+= zAPfxeayVE8!X=*%>cZi0gF6Wt?PcsA!s{~};=a9v8JIrUVtkYWZ5)b}AvKPoF z2Hoys3?9D*?iDIeC|;;!7v56Coamrk+$YG)=EYKIFxqa!(BqXj(j7nxZBQTRzi_z@ zCw`*L{Gk4LD8mb^z)v$X7-)tNc51_)uw@&O~MOP-#Uq)mK9$#<-QS5C6XZK;ffLH4<>8VGqOl`9K1G@Epd)hUdm^ zvqn%aOgdTteGV7`*89CSKf#F5&X_Z|f&a&)n10G^iQoZ5PKOT7NsOR4Nj2!;7l;Tz zB^VaE0jPwE;{^RUWINc=X2bMgh}>EkePVpJki-CkNm=+M`X*lT8xq8NJOS{k-9d=! zb}Gc=ggV4d1SZ5NSS6=Y#6R)SLP5cKfRsqq@w}Kg{uX46o&)oRpJPddiia1$iK8e) zs5pCnA-_#(hT(b$*2v-bN!2h4p{@*EF@6&OC&4Wg1a=oc2t;xbpsNwwITgRDPAwh* zL4*(^5@^G1Gxq>O;xAw z*dI(7a;Bk?Hqz1XBxGc;h+KkOCY)D+O2h>M`C#kq#9i2E?)6tkV?!~gwrWLUx0jJpTVo#n|UCd zae{m_SR@j9NTE0p2LgawgWrOd!?**ioH*71tQHOv1R(BN!cK4kfhdR$RlvLw-jWXG zWEf~aIZ_*Oy>C@Dw>G0Gka5X_;3S|`JC;#rv*PyyhM^r{O~ zCcK#f2^~O&5ik~pc`$(T@DQ+5(iJ5Xh#CPHjsm_AluMXR1P$myl_6Ak1~+jSuwU>u zh>kopQJ9ND3H&S68Ze;5V0c3wNWi{AI7FTWk%iKQXg~@i{Yj#sOeisqin4-{F_VZ0lI?NwxtF*W?+w!gjR|@s!-su>7sq^Qu26wS zu|c^A>)Y%;Q1AL8VY%6Usyu4u}zupbNOYAV)%Nn-6;rawfo~*aq@h!Z4%}`-6SP z1~_DCAT^-`89fXE!i{axeF`ip6ulqJPsoSkh1Mr83y;jQBGA47c7aD{(U}(=1=dM| zh1ZKDs5u~+Vxk@g6cKCzaT%c@sQ`SZfOmodkUIvNFq2FgBF>tF<89=jU?QaU2%+(# zHGUQks6xOD`~*CLIuJw(JusInFs28F)(KTBrbS`!JQ7mri_A~rc4hg`nAFf-tK9j%A!CXj^mCliWMfrBCciSt4Z z;UqC;_(uelViEij`YIVYbO)t|y@SA%gp2_cK!TyXP;sCSI*B7D_|^TyB>@}DEHEEp zhM6KdHUdTCnGzb0L}~_pgmA+EuEQGu4Pn3ZP_{^v7t07KhTSLDCZdqg*9!;9lS9N% zf`I6feQ@Ds;JY=Z73|Dd06;hmvOJRb06hQ~sOXZwgQmiR>uASZV7R4rSS4F zv*-a~gkgj16L!a?LB>ez2lEKsO#ncVjuZ`%^unLP{J>Tb9+8mZY}}mGRf%GPIEhnq zxM)BDJ_v8`rAs(QH)8I_yF#P@A4}At$prmdd~Xmxgi5^OmiF_mvnnyTr zqB`O$>WE;QNf1JU68zc;{p@At3ug^LXM7akQ74FHhm7%}AlNWmgm@|<24O`dDWD(@ zpjZdERAe3wz0~k5EGL$bAetn+3q}@-fJBej9^znV8#jcw5W>QXlQ@DvptwQcfQxx% znM?O45FT=sJdwyfC>%yfqu>R1DDemRJOyE;at&`Hv=z1i7L3drSq%klvUGov8^Z$o zygUNg2_Gm0)(55&=!Ta2fes<2FY~j0QbMg@yZa3V=UWCL^O!Uuv$NOe$cME;zByd=0_up=iYQLC2`7b%-;AICO|#LUSz zIP7u$*$8au=Yda0QYB-AGK+peMnRI3?YDz*ph=hu2nUQFTpE%MoWq_XYM4gJ<(2Ml z1iJ@PGuZD-pq-kYl$b=xu{oGHb|*x}6L&+LONopqq(+IU6nF9>0~yK^vm_n}M>`BP zRelI1K^??gh{%SazyXtpC*Z=cVdU zD)0KU;} z01|VHbJnnEIvJBP`1Ie}8~BRQ&ggJ@H#RV#NQDY{N7FJyN6aqy;b|KUq=mEh&2-Tt8_;8XJgz;cgNtgpm zyaK`~ULawB*CdgsddoZ?S3pO?R5JPS+aT@`;pc{{2TO;RJe60b*|7&-^lC$i*H z*j@qsur{C^>>v;iAliVT*!by zyTU0`IY1l+>5an_$W2zG^!)xzN9kaf<4FLcW0y#iGGHnWso4UX{pKg6t$jDz#TEJVYrXhkQfX5onMhfcXQgpzM@65#jSxFd)bRh4Y#) zE~MmCH`s|PNx}l=-XI4_{)xrap+Jy*YTP3E#<2X0H3OlswkSKr(df3gLdkuh37}d6 zac)GGnz)df3#oObM2nn|l%f-aNtGmp5a3&smYG1ku>jndSN5c3OHzr7XVSqQhpCLet=XV9DfuF1Aq`|NK0X19TnkZ&f>Qen?!(2Qxr)#V4i5!$Ob^f&Y<^%!b^c?!>1=Mfe*WV|YH(lhO=!&lYBZih3am zgdw90477oZate)tbCK#yMk`57((t;Y&`;qG2>nqV>gUK9!LVRa$vBWu1d;;UxIGj@ z;d2op;H)sg7zKbIITBK%q+)OhOfxw$iQ&K{A!RSjLz&~jz{|cRNe594gzBTzlx7iQ z68usSNKaBXBspV9D5M`2g*XL{iTNQ?G5axFk~PROqfwnS@P&*285JrbEM+{g|y6XA9><{t}uGAVx?D3nCT>)I$6TW|4e}7&j;6 zDmI28B4`BLWNypmKS&fXQ%D%LhsB30z*NvVz5(aJ$S}u9F!%An8Uo%?849wAwkfwj zWz2DzEh{fpk!YQef*ct%ATEH(Bv7N2kg!E|0xD$nNM?~PqkI_KA)pa&hK)7*FXKk{*Q8q)5+0?Uqzn5HJfNgGUiKOfU(F4uXY}C2%FbAq;Kt zzU6N?esGoS9e`nh#Gn>IqDj^lk3cO3`T+4ouc0gfunJVl(3uW0`sCYCXKqG;JtPQ; zl``@QOF#u283ZbR!K^@ZOdA!)RO1>jW&k7jBUF^ydkQU4V3N|TGOz`$prV=(TeL+s zEg^qp^#NU^goFGpd>jln;8Ut#h@&7|37$M)Pt+ZMKmrA3n_QqkBXF>k*7#u;fR5O1 zH(MSUC;5_6FW6$890Fkg6hB%6 zl&<2k@ha>$VJBUw?ky-9ZWb?(ODC};oD^3;cfuI5@de{Uk`b<+O=lVey_0klAPCSy zt^w(nA^9Zc0`?M|sfBjVybo!6srALwxgmQY&;e3ZmQdt{7sI?#yaR&eV`|bcR1yjR zLZJ8|I|(yF#hNS=L&853%9M~-YVgeam@V~fk^z9z0f!JbOQp0QMIfw^9BrZ9HqRHF zf<(bwP_;xgEmf*WB19u;PbnZX&of)RDOihG444bNh4}JA(vhsd^dqNb>f3NSY*u3P zAjtu8cLE|L#YLciB_qvY_G`BADaN1bDt_>Vv?WRHYT4UI?k zOG(HE|X6Ez|9Qdd8k}M<0xKM8YX}#QN zu7q;t`2T6W!00%qqILME^&+uJAyZMF^`F)Yo`w`fQQgWvtrrx6?5`-oFaNM!Y?=rV zrx(i6Kdl#t2QOWel>Mjm0`yQUrAO*CBI{NJFD(Cd{cwxe+&~$5{I}~#K^5VDS^M>G z*B8>tk1Z&3|9`vQY*>OZ4V1AT|91UJTu59}D95IJ{#$uq^pFThYL#PcHCL*O)gy^=6 zJ*A|DO>FXY4aD)l|8SiN1f>**!hxI5Wwrow+)4Ob7$|k3CXuaMQZR(Cr#_=h|NoYc z*3A4@NG0rrq0K)%kJNk<#24D9e|jDp84plZATVbdq=`U0k;v&UXY-W;rE8MrF z7zv-qTe77#*S#P4MvC)+!nY;~jH9OUVgtUSRJnK=R%3LNpX z4q_cBR-!|Kf->?cp9L zjY^zOtz8)3WlS>-H8C65lL;d+DK!w#c)&%7M5<^BuqioW>keR--Be64!5M4~40ho< zkSoRPORXEEq8+jfvYiV+aiqtkno6S%o{f`)wd^dD?}GsQfrQQZ;Wm_HKa*|^5u zI3j0q{uE|WDuBgeHzm~`5bnSy5=~NwDcc>x&oO0k@!Cu2QX1DETU#IpH!s)_^1~J`oWJ$8k8brAh@GUK8|8pBt_DZ1f#_6#GG#GP5A+gVo%`} z6*77-!<3Y;H;^C*hR}_DWqU5dXg;Uel58LsNdB5?J-9;I;y@*a6quu8KyyTu%rwD~ z_PEI1*R^kOJFy2y)o7L`@0v2q8z}6&h2%gn$}f zN(YD!h*k(mAYDkb$bMZaK4BB^9|X9t!cx5LgJvPXW&2zi`$F(ZPLo0!n1Aws)RK^Y zz(A156^u*RPy8YoATJ>;aVyaoaUgrdsrQj`Vfj)OxIIb_i9=xwU?8cLBXA}@A&M^K zWz6}4Z6$X>O^tAg&Yy+iCf@CjBK@>`$NLG8y+>wIw zOQj6Vnhu37xoN@6aAdN>Q@)=C;gg-uu(*s%c6Wzj7j`8}DJt?->czcS3J5vmm8^#B z@r69*-pCUCpM0|lu|9#hls1!!q4vj&E*7`CC!kMuvw1F=h``B&DK4MUpE*Dacwg?QljMl`3v(L?L%&iyro*$bN;k z!-1#B*g~;mAws1om;#CTNXp4Tq_&>)D2xFN78*!AY))&qI3e;qeQfR_WR16PI5f98o+5MYjA0$Tzxj=z2q$^1Z zN%*m59wZT_i*K>Pg-iBEHhci?$aGM{!& z2$C2G$~knj5MoO3JSLfClWIF$ndIAu7g=2(t`sBUIpHy3ok{ml$^c7gK9|`7C85wl z>3hr~QcQh2X#>8l0tOCeM{O#P1^bH^W$z~a@@+OOHMW7A0k8y?o*XhMDR2zpE_j4o6?Jm`Z6usipsoy1GOSYE^VcAB7u`BxC z0&|XJ=V7QwNYX5PM+e2nOcKrqik#9kDTP&l9iiksxey2F51UQZBL8a}{oh@Gz0$0I~1irEd( zm;$N*$k0jUY}x(9Y$w6yLO}DI#1nZL0uIXXVHBzNDl1I= zanME?`$pM4j*5aZ!hLELVbEoBD?8xbl!}lRr_cy|?%29lvfz)#E`V$EIxDWv62QX&Q#A-@)RQQyttQfe&P0mkFY z9e5HO6=CEopklEzxV54>H^#s85%CBk2@e4^^jR^(QDYXUW`LcB6L#WdsBaG`8YlwFM ziZgXk>`aw>16a{`4$5<~KZd_^MTkS_$IFcW&6y%@xVd@&#uHn;=6RfgF%?_;){ zj3H*N@qJVR%BFMT4`Ic4KnmZG3Y64xY;&?F9&??%W7QgPVgq$S3d z=X1=LzxtWBzP6JgZu(I5Ktvg^C}V`>7Kt7!F7MIkk!TXpNh6Z+V@$_i8Br<^8}&PX zGPqyf4w47k5>4rk66mq<(q`pxsCUC=(HkoDaM8LcD-r=RHR z_f2$D7UwEMmGmnfQlZis^mTZHya+7;jT|JdGi^Ut8kWj4B?+r#jD)`8l5aK0097eA zxplq9?EllX@Bz7ONr#=Qc+$`jF;S3)q}a@qagAswOq`IQT(i6zTX?Z_F`bz2Wr9kv&8049iG*kUC6mi<} zwH3L(k#|bvUXu7P7@Fe%xBrcZ+S&c!zPJOx`)GxxwBM%A7#4+fXm*jF;H$|;Y2D3?DBX^>- znKC$7uE=C;sf21$L^7;2@GI0OcO&FRgnTbb-{_Hh57JNQ@$tIs<$RD&%1K-&B_d z(q4XkcXK)$H3RkMW_n`sMQfRULVvq?UeWTBZ}FDcn@RUe03{@%I0xvu%X%qB2trX}U&rcd>y@|FD=nRFmgnKXm{ z7s#iBJF|M;uzaj%vcm{8viw<2=1AnSfC6QOSUgPb_5yo4rHv%Ay8KwQ2{A*ywiHdBSF}Gckhy+lx=G75$UhnD zk=HWx6l@bHN@uhE89nnzsVSyR|5JMT*f^4oI}}#sIvoQc0NZTWgX;1mUY5aKGNvdj zw`=8UT5hq*P#cM2ZMaBwxm;%SaVHR7S2CW$3u>h~yS@QIlQMqo$-w z)DQRd2QqYcBX{BDcD&rvlS@!}5F&%GW|mDoV8tn_!h#l(8QCf?70az1xmc4M333NgVt4&XLkS)w zaF&e6`Ol#J;Pc}0bBMI)|J+_n<@F3AW;T&YlhOR3|IW&cg|;KL9=K#Xkku=JefhMn zWzxMe=a+eVsaqmhGw)$ux=Z~*bp1+GN54doS$|V1-<|67WAa8*UtGS=uXo4t`9yC< zX2L03*5qSZ<4`)J`|0kDW!L8xmI~;Z0{Sy%0u8aZf1JOI<`Xh8gM7(k5|J6l&)Il_ zFH;6&Wm=)Ql&h>7|KXeIy>hukT>4*4`*Jg9%$QRfs!l?-QcIid6{$s)IXlIGcs%*1 z!hT&1Ue7XyN7)~j+OF3FdHtcs30^S^_DhgfT{m8!6@E+ScXA?|F3WU+{ymU4`IV%A zVYHJ;i^pLF%8!OpNGw0&(mTgBZohL}`ua!TVfw%R7A>)BdPJCvFO^T={@;FGeYOJ* znRY~hsk(WUW@nJ+Ibk}}ats;_@DXP1a&WKJhcKsQd_ z%)cWO3MH*{a2j|rQ-~}&UXXTg<~os?V`PSqP1#gFVNTtW)tonH_S{8HOZ;P7mb5LG zc|f=Tx2|qp+_I)+)yjEVaOEohnC8`sv>5g`tzNcvMf1uwf92X0i<(y#70CV-Eo;`a ztX$?(rnqy`^ggrK`k8+5QLEN8`-@gLEp9eeG_Px0-Q;^;kjYRE7dbC45r9myBW^fI z?Rn8;Z(dKkvXEVi{!Ed~X%g~}O~v!wrUS}k6P>A?o^K?dmJ>u~zAG-{%3JhR%70th z)LxV)S?Krot?$!cNYb6_e1B7SI-SV{=9qhDYY+9jwSBsalW@^b>Phu{GliM9*=%~@ zZZEvKs68m}W+`X?n5LuFHh-~nuP5`SAXhy}itcIyg_t(Qn?KVF=e$Sm_WVQTo%^uA zwr#O@%4wdwF{)>Wk+tJzdSCSBW;v}`S#^1szfF$Ll$Qi;dO8_TTWn`h^CNz#MG{-< zY4H|HCn@_=aVcJF7=*@^FA`LmiMV7sHB%0@v;&k+$7DvhmEHoGMbbM|{|OeEBuPj0 zdiY;oqRUK}wa{OSLctzeCN{~W`9n5mv;Hjo!9KlGJl>uj$-l=`zn_U2MbOu>-1&w-I)HzDyTI6yrdVBY32fl&%E^S`26hE&q9BWiKU>9-FmSdET$ur z3!#z<8F&1Sf=X(#1)#gPQgdKWAXUt-3(a_l~mw?fDS|$Wbcdiej7Uysl`qa1X|C7S;^_5K|dlH@b zO8nYlkqHLn_0rOLG+9XF%9rW&X^h4`*OTd#%mjMAd;E0h#d3|C3wkr>o3F3oOn<}N zCYVpkDF7-AYK*`hh^Kp%l)l=PX_tC?(-NlXdF)KrX3BIDbw&Hio7aCno|3kqk782& z+K=dCjr+N5r!N-TTd$MKv;QkCuj199EjC<17fbIm@}Edw@tW4u0xm>L)$w>(%EfY; zpzd_SaqR^MNClN#vGrwdgOudxh!^t<>c!s7kU4baO9q}tbw$C_0vm56^xK%Kn8?Oo zZe#q6rKWcJGa>&N z6OCnJscg=VWfT6~s`=G&uWqiIUo+1{#dB-sH_T)E4eZ5~z4{X@`hHraKLc7agTyMG1-N;O8gVug|A!ddsBggX<@x_q7?m zq1pmp=5jWbs2i?)p>4g~G6;6!$n4J~`6sh7#iw3AW53qu;da7IyCO5fc1fhPF_?aE z{Q1Z7)4`d!kdwO|B?TsiC$cgrEM`}X#PS(!K4M;5vv$h@Zd292bac?83u&=;^z{{#(O#}`E{zV57KHb*IL zPwvuo=4BpYb0s13Zk8=UdgJ%`bsK$~wO3|j73pP*7ccbZuI-RXpZopBP<1H0psK## zY*wAF!lAG*4ZKCs#HA=%c;%kp2#hcT~sL_=BLlmD8JAzxoZS*FT?YhFOU6&8ED zfR7>HS>OkN`&(?jt>6kggM5APMTYO?6;SU!W}IyUA8u;k@&~|0Z15`@mv*o*pDst(O^7 zEgwF{@{dqJ`;i}E`5Tg6FV)~fO_o0gz8swMOP>h74xIB$KX27|-PF?+F=PkuE#RDA zTFy+fTnO&PBW7EA9J5>r&iScz`_s!!;GBp0Jd3^i!8tGW0`SMdIUn`S;Ln3|ern3U z1^ZDfamGe6C zgUWeCxX#z#U-t-}cQfi`1$gV5)}Dv)WcYaK8QBVYwzl?kk|k*@G*xU3SRYftDpJSfJeY%$oGrj!wz2x?q6i} zP<|Eo=TI-QX_jNb2Oar#@b|!JPYT?-*y=wMda~5x@KeD3OUmWX0UvhwMc`F~<>hcW zcm$mFdky%2!*2i|arhnJ-lbMQ_1sVW4u6#T9sX(xqKXa(BZw{-nYx;H-cvzeg^n~s2AxL%yJ%h z!I2*XZ@R+j=kb0AycPUR=((199DXx+<~vpo<$nzBU0Ke520rNUUxNGJEtmf-_^`vD z1&>@+F8>nv!{9uwx4=iiXXCj33hsT+>LLFaJPbY`@>_3f+ikleza#jdBfls3T&G_4 z2Y&$ajML_VkAgQL-zsqbYHKI?Lhy{k7lYpcPW?xLkASm3Sqtu6WA&4t2;K-z|JViI z3Ql`6;6o1I0{)Vt=PYn<$mScv@qP_F^m{JoS%&`{2~`EAU~5KMfxFL3zIa1O6~L!Xoca;G>TGU%=b1E7$WO_)Fl@ z&6?#?@G(bz`gGfFH~i4*k>+idoxumdd0d|ZpYkIsFKW&5dGHEw%FhSC6kImVQVTxh z$R7?q`}*ZZZU*F+fj6UG7)PxF4?~{$t^>aVoboa75l8+c@TMDfDbzS8SsL`{|LSc^}_b{I(Yb&3lJ2>+`pr|{BHrzIQ(w#JHV;`LGTgq7|Qv-z{7W1{p6$ILk@oqe9B!`p88(~uK;Jg z{F!S1 z{9$nV->-ugz~{mKZ-H0bYwaPw8a(3g>%lV{tvt`i+sPgId%=es{xJBc!ygCt?kl(F zci{8Dd0a1mN5EN+uYwOc{2lOu!~YH*zTf6cJ)Sr?-985#J_CHz;k$tQKP}g@H+T%3 z_8&<7;76lg7JwHVUI!j|!0M;`5#VQ`Uf7Q<10QnaTfx1bmFqbUyxrj);3E!S55Dt* zRu7L$-%rxz76xZKKaKhwelGZ+!!H3JarhPBV-Ej5xc`u~hxy(F-s$h`@C(3M4q@;i@G2Z{BY45#i@^OytUZ)J61?5vZPf4Z6R6+e zN$P*JTz{H+P%pc|&Q0L$j{E@S9ex4$Q{XIz%fJiZY=_?kulTvOhx|J5h{JCM&w$T| zo%euW1$g`;KL4Y27eEn zcCG~X9<%xxmmUiqadVJ_#NQXe>wOF zcntYo1HLorh5qGw@bKd{U&;@I4>|lk@F`DNdFJ~Fcm?>G$oC2Aarp1S!@stADF46U zcYss>Yv3c`te1Dez28_p>D_tO6f&_&RWJ)XLMI81;ak342Zg zA9i>SJo1#)L-|v|N5QH8tKehcv!VZDaQ|tmhy2^%tqvaoA8`1M;KL5T6TIN?pMqEX zt~}qLgI9sG|Njkm#F2jnd>_;c^1ceAMCp1owV#?PUKyRWdU1n8UXN zZ+G}^;DZj|7ktFw2Z4_{yb|31?{a$@z+1p&(=1Kk?T-AHzy}?^27JWfUjZL;cmmvi z#@bVbeEYx;MZM4;Z3J(3r3?2dB8~V=%ZwFW4Uk4uo zUjqIu@Gl{{F!(a?d%*|5Bj68%kAR249|s=;KMMSJ z;E@+?zAWb#zy}=uD)>*q+1}m(e;l0g!{5OR;B3z_#L)Juf3*3M&j25A_%7h14&NKx zFO=&!5Ip1X1>hs#^HC0U-~*@^*)+@H;A4>IedA@|;g@W_yF$Jdd@;BjzFCd~ZwFrk z-T^)W&i1e#yZ|nnX32wlFWY>1zMKZ`gR_3m1e(K=7hJ+%v+NE&0Db`Ye&E-F^SBNM9|rd! z9|j)w~0Z0D3;6o0-4*XtlmfNl1kAU-e#694TfwMdx z0)GOW&!HXzA9eIR1zrH>dnC_;`>)yZ+z;jR3i#pRye@tlycK+Z$bSHy24{Qw1pH3a z3+rne>7aDGJr(jiuARUKz*)|-z`q5~a+?i)jicuf@M|4j4L%Gmn`Zd}_$WC2T{HM= z;A|%=!QXfE9}E70!`s3C;qVmrzrfl4v*6pjZtI2Ra|-wja9$6d1HJ<|+s{SdyE=L< z2On|Hm#e||fINmDde?)`0%ti4gNMP{@7)K!44n1#2>8+9wEqe4c5wE$zXu-xpO5AxFrnP@A^n4k7E;#M!1do8z zzx05&gC7b#{osS(mEfm?KLpP5KM#BqJPi3kaPKW^C*{8bzBM@8)wSR|fiupz8T@^e zC-vL~?nC}?;KSetf&T&g8E~Gz1@Pw_{wDYf;M1Y!eef~x z1Hu0VzT2N|`S3j5N;*v4ZufBb4&bxEsecb}ADn(+fADs29`9W6A#k>bD)13-wzq}g zW8iH6i^09k)_(fgBf z`+u?ausvT0z6zZ8QNID+4o*E+fuH5b{}B8FaQ54`fe(VSpZN*+2>9nw4kO@W;5;9H z1-|z?)_%6GwYYFM!j|ZN=g0 zc3bhTwQ~;iRDegoS^j&0XTVtw2Y?TO*Fevq;018rPpbj17_<5MkpCih7@TqYQt+d| zS?{aB*EoC~_?I0X1CKfUB=8!PKlNw9Gmz)`bqe?p_yX8}4)`c|EBHm={(JU#spoR= zR`7+8zXp5|oaJx>_%Jx*z&pT4!P!6D4?YIYdU+H){Jyn^`hN}H3hu+6{|3*1GcJ7* zdB>>8{}0{?#5A{pmj7 zKDdO(W|;%7z^Ok39s#F4_2BK`jN2pNr-ReqwSb=uPXD+Xd^UAhvccNV^RWYb zG0K7Ee-ijn;Ou9z;O*cNZkgp|@XQvgpT~O^_-1h0ee5L|AXn56~$``~PEM}yx8&i?i|@L_PahZy+X;4HTk zcq{6K{wM?f5afBCvKjo>4j%x24xGn(KKLKO*`5c%-vFndy#oA0a31dv_$S~zPj3L9 zaf)pZj3 zmfOJJ1gHJ?fRBN*ULFLWa+m0pr#-dczQex=eh@hAYz7a5)6Ny(CxElQ)`F+N**}~Bo&je)Ccsa2crW-l zj{bh|L2#Zgr-6SLoaOda@bjH|`8xQ`kZ1e(CV1ftTh0feom>UJ&4A_9e;xQ9;Ozfz z0iOlV`xrk4-y59u@&I@kobm9_!P~*vZ~Pj30G#Lb@4+tzXTC3hf5+i}0>8@PZ-ZZq za-*KVf?wmv{|o$DhfkA^MYsPSI($3u8yvnX_{|RA8~iqKw*SwA-{r_33Vshb{Y5qS z{SH42{6R@7d0rd|{)8jH27J_!KOX#9aJJh{@K?ZjzN`m-%h8_$zZCUCdrk&_ z7xFybv%vrA=)VyBBZprGKIKf?&e@)?1fK>@{nvtT3(k7E34D8Swx2t}E5HxL`E@^d zjU)dEcs)4nc^teEocTTtemFSG=Xvm@;Ou{125$wYoo|7!arD0rz7Cw{??>R@LA|hl zm?9VEy8WLBdDia?@B}#HoSngQ;Iw})@KeC)r)Gnn1I~VU9{8Z6rwaTEaN5%devPBQ z3H%0dmVXQQP2entqrr#4S)Rv%-{t6!fj{8Lr@$X__y+Jtz-j*$@Lz%R{5li-M$`-A z&-1~5@8}-{{{uM7{|fLwg0mckz{kKP3^2V@U76ZjzHdH;M*@KHz4{@~s@*3P4m?ZM#f;8oz2;Fp5)JgNsD0_SlZ0Y2*R zW#HadZN8LW1s-M4ay!ohZ*}-3;Qw;Y zm&?Hi9QmukhaLVS@Pfl{1Ftx*+@5>DtH60&4}wR)=b;{d37&EIli))Re+GOMocCQ{ z1RrzcUjz5gw|25UzXKitr#&BnXB_?s_z*bT$u@H1QJ)v1j{J_`-UT+_MjY=R;DflY zIG62Nxc+|5;D%;HZb65;0zA@hc_TWAK5#E%`PoyfqKm-?Hd*dN&&|U1cayHTWtkDA zUwaVz28TZdJ^qr#M*f%3{}OoQOP1ffwaxb(@Uc~v-#Fd!Pr*lHmN!Fwx>TG#Uhhjw zjNn`tv>W(Xvz1?k4sH(k;JKD71p2k$qf4zG{rxh%G=uwHR$jj+qn9<*bAsi&qdcSF z!%@rk2Ty~C&$j#<(0>N_*fN{%PLRJ0d}y7Oe*^Yk13s9u{4#XJw}FpdY5B)DTRR^h z|Ayrs!7-1LpJVxhuxAY1-`(?GUSfy06=Vdq@8m^7_Ph`y%(8~OvYf|+Ydx)XOO4!>a4>1` zu_nv!#|71y;Ncp}_eQ-83fJf9NZ#rn@a%H6aIN3}ij~h?Wcf|tgU4EaHp<~1@ZmPg zUxfZg!M*nv83lTrw_cv}VgD3c{*U1Sz`NjM?^^kp(DQHb!39>o{tk;?rp>nJuZMDr z80vX@fscgkarxl0h3n(W9AfqCJI(Gm1bp})%k_7`^il&ok=tzlz!d)^0+++q3sr&zxI0k-@{-beXB|7`LP z%XuC7-^%%sJ}}kh+fV*!IlmA*^6zqf4f#~GbLjc8aC08bu<|uCtp3Nq z2Y0dji|8j`03Y4Y@*hKfjPi3We-`pvectvbL(ccyb``Gk^|n~~FWGFpL%>_XZv<}x zA3Z5z$Zx?<0UrTpyZScx;G4ERe~fncF!}qI=ciglZ-G~QVEG!fhaC^}ylp(*mGQiF z$hT3rwtqNn?LQ0cqz!x|8!?jSLw^E%Xuah;-W>QqzvV}oRGxP(^_*h)Pod{J@KMO$ zyOmAw5cuH9Rz3`So&s-$yi}7}UIQOE-OBHEu;u>*&wOIbp&oknor89=i-EZayoeXRIBGV$oCS;Z)153XV`L{UvEKv_)}XBHzMDU!NXfw`P;#FJjj;M$N^UV z&&YQc_^5CBJ2A97b+zHssz)yW>mX1J7ChB>eA} z!7FaC{Ce1VlF`4HH;n!Y-G+BA_`MGQzTvaHOvc*7@_YjN3$HFRh8zL?W8foiSY8Xh z?_6uY|GMQ@fiD6dd&%;{z+>RyS1fM@KO21DPnI7CegpW>$4iYpzXcxwA1+w=h2SrM zdpAdn{H?W9&F}l*gYe_4E%v6&v-Q}HcFX%AyMWI{d*gk%Ip7g+wugG*x*jv9+4i#^ z?9p>IJ+7yWytFH{f8S#7Pmmv6XXU&0v^#V$P4s=~4~?Fky>GTI zhlb+MMDkmi>wsOyeGhzh;ZwZv-vi$d^6vM>s|>Fg_ucX(MvoYc^M%%YS@5Z8R_ z`0vL54f12_t^D(lpCaX;%d_1%t{uT!d#(H$$nRq~HcEcNkT3L<%O3$gw5#Q_R@y|X zC(*NE68=@;x_sRFx(xbMXC@srUP#X8`2@GrdO*FH>PQ zp3!>rcck$hew>cptI*@4eI}5!Ldw5FUoUTJDO2`=mY=$VSEz^>&UW=R=;6Eol}NS2 zeA}*C@m!MaYFFWG8>Jb{6|VDj+f|K`-@%KZ+?elTa@5xeQ1+L(ww+`?vVI|i^Jv8+ z`F23hSSDgLDCkL3KgwBdiolAqOtzXo=m=#=}E{eH=%}bU3g+4nWCsKWhWqs%4F2p zEnYGk>y@cV`g?n~NRpB*GoMSDsGe~tnvt1TVqFREz(ikvZ?sPm=N44e)R%3m>hjIT zvQ0<0z7~7U+=Qjd00M2?raEi~`mikuqtOHPTqbe|$#m4r`&CAa)f4b^GAR=y=#g1aRA|vrO-DAXMbVaHJehB<1g$AWb|$(7swUh}9mo}7 zqZ}I&+c~)wsOsvPs`0R2G^d`2%AzVcG&|5oOzwsC;{zfGeS#6k=eRh8kyE zY%SYg=WN$I+YQdP9D&SvQyp3_(@V$JCp}Dr)h2e?DY4qbBCLrmSQ9Jknw_l-8<@e& zlwD{|%d!=nG7ZA&Q4RGjstz|c z29xZDO6DI7=1nwHDFs{ZgonY7;+%*?oOUb}ZEac-&P7#mN^XNrwTvZl&Nhk4+nb`Ni|n$xKhiNIj4K^n>EueBD|%){ zZB;ml6yBNttBQ72(XJ}mRYkk1XcseA zv`f)073`v2igqd5rD&I;U5a)o+NEfhqFsu1DcYrIm!e(Fvzm5Q)2?dTRUOFCu4>v< zO}naTS2gXbrd`#vtD1II)2?dTRZY99X&1Aqp zk#k#=ccWV*^m+SN$A8fjM}?P{c5jkJr2VzetpyJEB}M!RCPD@MCw zv@1rtVzetpyJA5Wv@1rtVzetpyJED9vK_RmgLZY$t`6GOLAyF=R|oCtpj{obtAloR z(5{XkFWS{XyUYx~+7ETmE{b&0u1?z3NxM2}S10Z2q+Ok~tCMzh(ymV0)k(WLX;){E zDedZHd3Dk*?upZ`IPHqlt~l+A)2=w}iqoz*?TXW`IPHqlt~l+A)2?`sJMD_oE`kK@ zO3_Og)CKSUk#V|~T0}+^~!Z1&TVV;sG z)*P-1!#ov+c`6L^6vHqThIuLs^Hdn-sW8k_48s`QD28E*VVIKG+vdqIOfd{o48s(| zFvT!TF$_}-!&DWDO)(5p48s(|FvT!TF$`m@rGkPBEG_P0c`*!A48s(|FvT!Tt_^TB z48s(|FvT!TF$_}-!xY0X#V|~+eQlvI3{wol6vHsN0Hh4-kztr(7^WD8DTZN+VVGhV zrWl4PhGB|fm|_^F7={H!z%WcP3{wol6vHsZFih33eK8DE48v3n%Zp){Vi=|vhAD<& zieZ>y7^WD81vSDjOfd{o48s(|FvT!TF$~iee73k5hAD<&ieZ>y7^WD8DTZN+VVGhV zrWl3=4TNEsVi=|vhAD<&ieZ>y7^WD8sXCsI48s(|FjdEP&oE3e3{wol6vHsZFf3@V z48s(|FvT!TF$_}-!xY0X#V}0O)2@2fBf~JoFibHFQw+lt!!X4#Ofd`#P9KJ0ieZ>y z7^WD8DTZN+VVGhVCKunRP=;Zuf&CZ5FvT!TF$_}-!xY0X#V{;5n;C{FhGB|fm|_^F z7=|f^VTxgxVi=|vhAD<&ieZ>y7^WD8DTZN+VVGhV7IZEQx)g&h#h^7;7oUT8gojVyvYY zYpD)88^&6Sv6f=274)x+wG?A5#aK%*)>4eM6k{#LSW7Y1QjE0}V=cv4OEK0`jI~rJ zogiZ^#aJuo?ip(-##)N8mSU`>7;7oUT8gojVyvYYYbnNBim{ertfd%hDaKkVPUjr_ zB9u`Ku@plr#Slv|#8M2g6hkb<5KA${QVg*aLoCG*OEJV!46zhLEX5Ej@PSF%#Slv| z#8M2g6hkb<5KA${QVg*aLoE19x>R~pI#l}8YPeH+Q#w=nQo2%lQaV!lQMyrjQ94oj zP^hN|r30n^r2C}zr1PZjr0b;Tq~oODq}!y|q|>C&q|1a)ro*Jaq`RcIq_d>2q^qQ- zq@$#tq?@Fdq?4qNq>H47gy*GyqjbYb*hbYS#fbYJvdbYApbbY1jZ zbX@dXbX#z2bXxRTbXoLRbXfFPbXW9NbXN3LbXD|JbX4?HbW`+Fa9{LMbW!wBbWrq9 zbWik7bWZe5bWQY3bWHS1bW8L~ya52`#LIuWCVD11Ci*41C3+<~CHf?~Bzhz|B>E$| zBYGn`BV1n7710yX5z!CP4bcnH3DF191@R)E*Z91|=M_FL@OgbNm-oq3q9-2h?9XmY z$OTJPV`$CMtJ|V0s>bg~CZe6OY<5eux4-8z_U1P9$FhkD1roBWC)%+kFAtl?XP*uyRMHvo5u9^G}XnSe{G(!f((1(D%9E% zZEIR|RI}F`uL%{8rZ-+&vX#z-5}Q+bPky@-u}n19)06IuN$r?t)n4&YseR~P1UAQD zzj;I(Y{80bBH5GZ%!gvRXi6d#Ze|lbv3zP{f=x`t$1!L~lH_x}~*w#S-0IqbtJ`!Kw-1>WL&*kCUtmPoPu7i6qDC6v?7aTMqJQyh`Fi z*d8!_1Hon05>vRWR&F**Tgaz+6CpYGbJ1vVGnY$bF`z+i7*eVu-QO3_MLW9_o$I5C zY&M+@b;tVRJqf!ZV;?9PPb6dgJ<_KbMRIOOld)7!e^%;721|?+>q&QY$k&!y7PTP&jD5Gi#G?~n5i6%A##GE$8dNqwfmA3vR{*#P~gwl2E9xD~Zs&H~jKmP^Y(sEDiN%92o5dTfJs?d2;lf>AsDjXtJu#jB+X=)ygGxHRU9h$t3#X z(T-F;7o-ET?vm=`sjgBP?HpqHs6$iI*@@%S=Sg3p%XDY|V%d0lQ{QI^B{pZo`;AX5xiZ!nmvwI})#sV6J~(K*8INtrNkK@POL+bH zWJ4&{*_p`X#b5SyNmyEnwA~=KC$izjrtVa>CzDS1gcgUrl8vg;4OO~PUAj?Ix=~xY zQCGTAU$U`!amhw80@-W>_UNLfHOFTBx&C%wSOT^(t z<(!hpR>Jt$7Ks|;UUbQEE1OodEH2+8?K-QIE?c=a+PoYZmM>ZDMVB45YEjcs(N#;A zu4!(wago;Alj`Vk$YrQ?hyI2O}fU}%j8 znl%~GC*5R!UuQ1aEtgc$D7t5xQ(|*oN}xNLlU==uUTLdEt=8tQzW!*pN=8!&xo#7s zrdY}j!5p{2QQhLo6=>&{?ks0=u(5nhnyoG1;AlmCSFeN(R+lc)crG2a(S~f8;;GhV zc4oE|HOiyRXv-=|q=(S<=j1B0q$*4(8IAWuB~H|_XhJK`i{Hzn5~fVWZ6zi&u_KoY zEYxL?RNX-tn1VG0)|=i~QV+JolBvy7ZSiD2C6@HVYALzySgt#f)%8J%xR#I&BdbH_ z;!#;uZ7UWBjaJv2Z7QZZjP;N_aUhcw#r2nr;YPM5*3I(`Bw6rz*0$=9j@q1I<6y1k-XEQQT~KXHdducDc5AZGTNHM zyZ`_G>hDJAR}(O7-YZOv$d)I+=EsxIrj#vsjUiy4m$hx>Khu9aH6mM{_c6eMW~=yz z?<0`Z$x3N@e_F)s^6|c$Z?=km-1JLi*N2~enr8kHq>msy?dN+097j)$`h5x+O&{3b zj`ZzFKOG0WjmYR#rsw;M#|YD+%)fi9h-`UYHw^uj*(&~lx&WLgYoC_b{|VB6g7o}u z8trF3{9P~UKPgE+YwL*7Jqro!mVO7g+SFIxFg1hxF@^J`6$T?;ig-NWTbj z=Og|3NH9{8Ucc()roUL2E)#8^S@>Q9UPR<~O}HDy!cFf2Su0KNBfXFGgMp-70hV`9 z?D9?dDNR3&^urK%wO6;!;=*(!SISCh`YZ5$%@wEHbbK#_@~-_uNYC=;dpq8MOzj>EvyvApLZtpN{+~NA=w1?~AfSw>{=xf%FwfU(l5+ z3)?5t@i<d(Atqc zb~baizpg$160CL6{!zS#^zbXl;hfJ-uZ`FChs(u0rkB^t$`&oFm(t&$?b}`E?-=v% zv`{z0cg08^H~U}xo)c}ilJ@V|Qu_wfsJs_dx-efd{aX1%=|^%l{R}68v+4amm%q&K literal 0 HcmV?d00001 diff --git a/tests/core/encoding/test_core_json.odin b/tests/core/encoding/json/test_core_json.odin similarity index 64% rename from tests/core/encoding/test_core_json.odin rename to tests/core/encoding/json/test_core_json.odin index 702086ea2..60e71bf72 100644 --- a/tests/core/encoding/test_core_json.odin +++ b/tests/core/encoding/json/test_core_json.odin @@ -9,32 +9,30 @@ TEST_count := 0 TEST_fail := 0 when ODIN_TEST { - expect :: testing.expect - log :: testing.log + expect :: testing.expect + log :: testing.log } else { - expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) - TEST_count += 1 - if !condition { - TEST_fail += 1 - fmt.println(message) - return - } - fmt.println(" PASS") - } - log :: proc(t: ^testing.T, v: any, loc := #caller_location) { - fmt.printf("[%v] ", loc) - fmt.printf("log: %v\n", v) - } + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } } main :: proc() { - t := testing.T{} - + t := testing.T{} + parse_json(&t) marshal_json(&t) - fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) if TEST_fail > 0 { os.exit(1) } diff --git a/tests/core/encoding/varint/test_core_varint.odin b/tests/core/encoding/varint/test_core_varint.odin new file mode 100644 index 000000000..5b8ccdc2a --- /dev/null +++ b/tests/core/encoding/varint/test_core_varint.odin @@ -0,0 +1,81 @@ +package test_core_varint + +import "core:encoding/varint" +import "core:testing" +import "core:fmt" +import "core:os" + +TEST_count := 0 +TEST_fail := 0 + +when ODIN_TEST { + expect :: testing.expect + log :: testing.log +} else { + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } +} + +main :: proc() { + t := testing.T{} + + test_dwarf(&t) + + fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } +} + +@(test) +test_dwarf :: proc(t: ^testing.T) { + for vector in ULEB_Vectors { + val, size := varint.decode_uleb128(vector.encoded) + + msg := fmt.tprintf("Expected %02x to decode to %v consuming %v bytes, got %v and %v", vector.encoded, vector.value, vector.size, val, size) + expect(t, size == vector.size && val == vector.value, msg) + } + + for vector in ILEB_Vectors { + val, size := varint.decode_ileb128(vector.encoded) + + msg := fmt.tprintf("Expected %02x to decode to %v consuming %v bytes, got %v and %v", vector.encoded, vector.value, vector.size, val, size) + expect(t, size == vector.size && val == vector.value, msg) + } +} + +ULEB_Test_Vector :: struct { + encoded: []u8, + value: u128, + size: int, +} + +ULEB_Vectors :: []ULEB_Test_Vector{ + { []u8{0x00}, 0, 1 }, + { []u8{0x7f}, 127, 1 }, + { []u8{0xE5, 0x8E, 0x26}, 624485, 3 }, + { []u8{0x80}, 0, 0 }, + { []u8{}, 0, 0 }, +} + +ILEB_Test_Vector :: struct { + encoded: []u8, + value: i128, + size: int, +} + +ILEB_Vectors :: []ILEB_Test_Vector{ + { []u8{0x00}, 0, 1 }, + { []u8{0xC0, 0xBB, 0x78}, -123456, 3 }, + { []u8{}, 0, 0 }, +} \ No newline at end of file diff --git a/tests/core/hash/test_core_hash.odin b/tests/core/hash/test_core_hash.odin index f68767612..607642339 100644 --- a/tests/core/hash/test_core_hash.odin +++ b/tests/core/hash/test_core_hash.odin @@ -15,14 +15,12 @@ when ODIN_TEST { log :: testing.log } else { expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) TEST_count += 1 if !condition { TEST_fail += 1 - fmt.println(" FAIL:", message) + fmt.printf("[%v] %v\n", loc, message) return } - fmt.println(" PASS") } log :: proc(t: ^testing.T, v: any, loc := #caller_location) { fmt.printf("[%v] ", loc) diff --git a/tests/core/image/test_core_image.odin b/tests/core/image/test_core_image.odin index 2171a0d92..52005d915 100644 --- a/tests/core/image/test_core_image.odin +++ b/tests/core/image/test_core_image.odin @@ -32,23 +32,21 @@ TEST_count := 0 TEST_fail := 0 when ODIN_TEST { - expect :: testing.expect - log :: testing.log + expect :: testing.expect + log :: testing.log } else { - expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) - TEST_count += 1 - if !condition { - TEST_fail += 1 - fmt.println(message) - return - } - fmt.println(" PASS") - } - log :: proc(t: ^testing.T, v: any, loc := #caller_location) { - fmt.printf("[%v] ", loc) - fmt.printf("log: %v\n", v) - } + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } } I_Error :: image.Error diff --git a/tests/core/math/noise/test_core_math_noise.odin b/tests/core/math/noise/test_core_math_noise.odin index be89d076a..a0360e695 100644 --- a/tests/core/math/noise/test_core_math_noise.odin +++ b/tests/core/math/noise/test_core_math_noise.odin @@ -13,23 +13,21 @@ V3 :: noise.Vec3 V4 :: noise.Vec4 when ODIN_TEST { - expect :: testing.expect - log :: testing.log + expect :: testing.expect + log :: testing.log } else { - expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) - TEST_count += 1 - if !condition { - TEST_fail += 1 - fmt.println(message) - return - } - fmt.println(" PASS") - } - log :: proc(t: ^testing.T, v: any, loc := #caller_location) { - fmt.printf("[%v] ", loc) - fmt.printf("log: %v\n", v) - } + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } } main :: proc() { diff --git a/tests/core/odin/test_parser.odin b/tests/core/odin/test_parser.odin index ef31f91db..3837436bc 100644 --- a/tests/core/odin/test_parser.odin +++ b/tests/core/odin/test_parser.odin @@ -10,34 +10,31 @@ TEST_count := 0 TEST_fail := 0 when ODIN_TEST { - expect :: testing.expect - log :: testing.log + expect :: testing.expect + log :: testing.log } else { - expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) - TEST_count += 1 - if !condition { - TEST_fail += 1 - fmt.println(message) - return - } - fmt.println(" PASS") - } - log :: proc(t: ^testing.T, v: any, loc := #caller_location) { - fmt.printf("[%v] ", loc) - fmt.printf("log: %v\n", v) - } + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } } - main :: proc() { - t := testing.T{} - test_parse_demo(&t) + t := testing.T{} + test_parse_demo(&t) - fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) - if TEST_fail > 0 { - os.exit(1) - } + fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } @@ -50,4 +47,4 @@ test_parse_demo :: proc(t: ^testing.T) { for key, value in pkg.files { expect(t, value.syntax_error_count == 0, fmt.tprintf("%v should contain zero errors", key)) } -} +} \ No newline at end of file diff --git a/tests/core/strings/test_core_strings.odin b/tests/core/strings/test_core_strings.odin index c1f9603fd..70da1a73b 100644 --- a/tests/core/strings/test_core_strings.odin +++ b/tests/core/strings/test_core_strings.odin @@ -9,59 +9,57 @@ TEST_count := 0 TEST_fail := 0 when ODIN_TEST { - expect :: testing.expect - log :: testing.log + expect :: testing.expect + log :: testing.log } else { - expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { - fmt.printf("[%v] ", loc) - TEST_count += 1 - if !condition { - TEST_fail += 1 - fmt.println(message) - return - } - fmt.println(" PASS") - } - log :: proc(t: ^testing.T, v: any, loc := #caller_location) { - fmt.printf("[%v] ", loc) - fmt.printf("log: %v\n", v) - } + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } } main :: proc() { - t := testing.T{} - test_index_any_small_string_not_found(&t) - test_index_any_larger_string_not_found(&t) - test_index_any_small_string_found(&t) - test_index_any_larger_string_found(&t) + t := testing.T{} + test_index_any_small_string_not_found(&t) + test_index_any_larger_string_not_found(&t) + test_index_any_small_string_found(&t) + test_index_any_larger_string_found(&t) - fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) - if TEST_fail > 0 { - os.exit(1) - } + fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } } @test test_index_any_small_string_not_found :: proc(t: ^testing.T) { - index := strings.index_any(".", "/:\"") - log(t, index) - expect(t, index == -1, "index_any should be negative") + index := strings.index_any(".", "/:\"") + log(t, index) + expect(t, index == -1, "index_any should be negative") } @test test_index_any_larger_string_not_found :: proc(t: ^testing.T) { - index := strings.index_any("aaaaaaaa.aaaaaaaa", "/:\"") - expect(t, index == -1, "index_any should be negative") + index := strings.index_any("aaaaaaaa.aaaaaaaa", "/:\"") + expect(t, index == -1, "index_any should be negative") } @test test_index_any_small_string_found :: proc(t: ^testing.T) { - index := strings.index_any(".", "/:.\"") - expect(t, index == 0, "index_any should be 0") + index := strings.index_any(".", "/:.\"") + expect(t, index == 0, "index_any should be 0") } @test test_index_any_larger_string_found :: proc(t: ^testing.T) { - index := strings.index_any("aaaaaaaa:aaaaaaaa", "/:\"") - expect(t, index == 8, "index_any should be 8") + index := strings.index_any("aaaaaaaa:aaaaaaaa", "/:\"") + expect(t, index == 8, "index_any should be 8") } From e76a5d8e12ae3d6e8e75e8df53a30bfbcc66b829 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 18:07:16 +0100 Subject: [PATCH 57/74] [varint] Add signed LEB128 encoding. --- core/encoding/varint/leb128.odin | 96 ++++++++++++++++--- .../encoding/varint/test_core_varint.odin | 47 +++++++-- 2 files changed, 119 insertions(+), 24 deletions(-) diff --git a/core/encoding/varint/leb128.odin b/core/encoding/varint/leb128.odin index 0c314b3f8..7640ba1fb 100644 --- a/core/encoding/varint/leb128.odin +++ b/core/encoding/varint/leb128.odin @@ -6,21 +6,31 @@ Jeroen van Rijn: Initial implementation. */ -// package varint implements variable length integer encoding and decoding -// using the LEB128 format as used by DWARF debug and other file formats +// package varint implements variable length integer encoding and decoding using +// the LEB128 format as used by DWARF debug info, Android .dex and other file formats. package varint -// Decode a slice of bytes encoding an unsigned LEB128 integer into value and number of bytes used. -// Returns `size` == 0 for an invalid value, empty slice, or a varint > 16 bytes. // In theory we should use the bigint package. In practice, varints bigger than this indicate a corrupted file. -decode_uleb128 :: proc(buf: []u8) -> (val: u128, size: int) { +// Instead we'll set limits on the values we'll encode/decode +// 18 * 7 bits = 126, which means that a possible 19th byte may at most be `0b0000_0011`. +LEB128_MAX_BYTES :: 19 + +Error :: enum { + None = 0, + Buffer_Too_Small = 1, + Value_Too_Large = 2, +} + +// Decode a slice of bytes encoding an unsigned LEB128 integer into value and number of bytes used. +// Returns `size` == 0 for an invalid value, empty slice, or a varint > 18 bytes. +decode_uleb128 :: proc(buf: []u8) -> (val: u128, size: int, err: Error) { more := true for v, i in buf { size = i + 1 - if size > size_of(u128) { - return + if size == LEB128_MAX_BYTES && v > 0b0000_0011 { + return 0, 0, .Value_Too_Large } val |= u128(v & 0x7f) << uint(i * 7) @@ -33,25 +43,26 @@ decode_uleb128 :: proc(buf: []u8) -> (val: u128, size: int) { // If the buffer runs out before the number ends, return an error. if more { - return 0, 0 + return 0, 0, .Buffer_Too_Small } return } // Decode a slice of bytes encoding a signed LEB128 integer into value and number of bytes used. -// Returns `size` == 0 for an invalid value, empty slice, or a varint > 16 bytes. -// In theory we should use the bigint package. In practice, varints bigger than this indicate a corrupted file. -decode_ileb128 :: proc(buf: []u8) -> (val: i128, size: int) { +// Returns `size` == 0 for an invalid value, empty slice, or a varint > 18 bytes. +decode_ileb128 :: proc(buf: []u8) -> (val: i128, size: int, err: Error) { shift: uint if len(buf) == 0 { - return + return 0, 0, .Buffer_Too_Small } for v in buf { size += 1 - if size > size_of(i128) { - return + + // 18 * 7 bits = 126, which means that a possible 19th byte may at most be 0b0000_0011. + if size == LEB128_MAX_BYTES && v > 0b0000_0011 { + return 0, 0, .Value_Too_Large } val |= i128(v & 0x7f) << shift @@ -64,4 +75,61 @@ decode_ileb128 :: proc(buf: []u8) -> (val: i128, size: int) { val |= max(i128) << shift } return +} + +// Encode `val` into `buf` as an unsigned LEB128 encoded series of bytes. +// `buf` must be appropriately sized. +encode_uleb128 :: proc(buf: []u8, val: u128) -> (size: int, err: Error) { + val := val + + for { + size += 1 + + if size > len(buf) { + return 0, .Buffer_Too_Small + } + + low := val & 0x7f + val >>= 7 + + if val > 0 { + low |= 0x80 // more bytes to follow + } + buf[size - 1] = u8(low) + + if val == 0 { break } + } + return +} + +@(private) +SIGN_MASK :: (i128(1) << 121) // sign extend mask + +// Encode `val` into `buf` as a signed LEB128 encoded series of bytes. +// `buf` must be appropriately sized. +encode_ileb128 :: proc(buf: []u8, val: i128) -> (size: int, err: Error) { + val := val + more := true + + for more { + size += 1 + + if size > len(buf) { + return 0, .Buffer_Too_Small + } + + low := val & 0x7f + val >>= 7 + + low = (low ~ SIGN_MASK) - SIGN_MASK + + if (val == 0 && low & 0x40 != 0x40) || (val == -1 && low & 0x40 == 0x40) { + more = false + } else { + low |= 0x80 + } + + buf[size - 1] = u8(low) + } + return } \ No newline at end of file diff --git a/tests/core/encoding/varint/test_core_varint.odin b/tests/core/encoding/varint/test_core_varint.odin index 5b8ccdc2a..63a9d1d72 100644 --- a/tests/core/encoding/varint/test_core_varint.odin +++ b/tests/core/encoding/varint/test_core_varint.odin @@ -4,6 +4,7 @@ import "core:encoding/varint" import "core:testing" import "core:fmt" import "core:os" +import "core:slice" TEST_count := 0 TEST_fail := 0 @@ -39,18 +40,40 @@ main :: proc() { @(test) test_dwarf :: proc(t: ^testing.T) { + buf: [varint.LEB128_MAX_BYTES]u8 + for vector in ULEB_Vectors { - val, size := varint.decode_uleb128(vector.encoded) + val, size, err := varint.decode_uleb128(vector.encoded) msg := fmt.tprintf("Expected %02x to decode to %v consuming %v bytes, got %v and %v", vector.encoded, vector.value, vector.size, val, size) expect(t, size == vector.size && val == vector.value, msg) + + msg = fmt.tprintf("Expected decoder to return error %v, got %v", vector.error, err) + expect(t, err == vector.error, msg) + + if err == .None { // Try to roundtrip + size, err = varint.encode_uleb128(buf[:], vector.value) + + msg = fmt.tprintf("Expected %v to encode to %02x, got %02x", vector.value, vector.encoded, buf[:size]) + expect(t, size == vector.size && slice.simple_equal(vector.encoded, buf[:size]), msg) + } } for vector in ILEB_Vectors { - val, size := varint.decode_ileb128(vector.encoded) + val, size, err := varint.decode_ileb128(vector.encoded) msg := fmt.tprintf("Expected %02x to decode to %v consuming %v bytes, got %v and %v", vector.encoded, vector.value, vector.size, val, size) expect(t, size == vector.size && val == vector.value, msg) + + msg = fmt.tprintf("Expected decoder to return error %v, got %v", vector.error, err) + expect(t, err == vector.error, msg) + + if err == .None { // Try to roundtrip + size, err = varint.encode_ileb128(buf[:], vector.value) + + msg = fmt.tprintf("Expected %v to encode to %02x, got %02x", vector.value, vector.encoded, buf[:size]) + expect(t, size == vector.size && slice.simple_equal(vector.encoded, buf[:size]), msg) + } } } @@ -58,24 +81,28 @@ ULEB_Test_Vector :: struct { encoded: []u8, value: u128, size: int, + error: varint.Error, } ULEB_Vectors :: []ULEB_Test_Vector{ - { []u8{0x00}, 0, 1 }, - { []u8{0x7f}, 127, 1 }, - { []u8{0xE5, 0x8E, 0x26}, 624485, 3 }, - { []u8{0x80}, 0, 0 }, - { []u8{}, 0, 0 }, + { []u8{0x00}, 0, 1, .None }, + { []u8{0x7f}, 127, 1, .None }, + { []u8{0xE5, 0x8E, 0x26}, 624485, 3, .None }, + { []u8{0x80}, 0, 0, .Buffer_Too_Small }, + { []u8{}, 0, 0, .Buffer_Too_Small }, } ILEB_Test_Vector :: struct { encoded: []u8, value: i128, size: int, + error: varint.Error, } ILEB_Vectors :: []ILEB_Test_Vector{ - { []u8{0x00}, 0, 1 }, - { []u8{0xC0, 0xBB, 0x78}, -123456, 3 }, - { []u8{}, 0, 0 }, + { []u8{0x00}, 0, 1, .None }, + { []u8{0x3f}, 63, 1, .None }, + { []u8{0x40}, -64, 1, .None }, + { []u8{0xC0, 0xBB, 0x78}, -123456, 3, .None }, + { []u8{}, 0, 0, .Buffer_Too_Small }, } \ No newline at end of file From 76b10b5f5dd17b2c4e80f391883ec42500a85875 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 19:28:55 +0100 Subject: [PATCH 58/74] [varint] Add additional LEB128 tests. --- core/encoding/varint/leb128.odin | 8 ++- .../encoding/varint/test_core_varint.odin | 62 ++++++++++++++++--- 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/core/encoding/varint/leb128.odin b/core/encoding/varint/leb128.odin index 7640ba1fb..898c6af67 100644 --- a/core/encoding/varint/leb128.odin +++ b/core/encoding/varint/leb128.odin @@ -10,6 +10,8 @@ // the LEB128 format as used by DWARF debug info, Android .dex and other file formats. package varint +import "core:fmt" + // In theory we should use the bigint package. In practice, varints bigger than this indicate a corrupted file. // Instead we'll set limits on the values we'll encode/decode // 18 * 7 bits = 126, which means that a possible 19th byte may at most be `0b0000_0011`. @@ -29,6 +31,7 @@ decode_uleb128 :: proc(buf: []u8) -> (val: u128, size: int, err: Error) { for v, i in buf { size = i + 1 + // 18 * 7 bits = 126, which means that a possible 19th byte may at most be 0b0000_0011. if size == LEB128_MAX_BYTES && v > 0b0000_0011 { return 0, 0, .Value_Too_Large } @@ -60,8 +63,8 @@ decode_ileb128 :: proc(buf: []u8) -> (val: i128, size: int, err: Error) { for v in buf { size += 1 - // 18 * 7 bits = 126, which means that a possible 19th byte may at most be 0b0000_0011. - if size == LEB128_MAX_BYTES && v > 0b0000_0011 { + // 18 * 7 bits = 126, which including sign means we can have a 19th byte. + if size == LEB128_MAX_BYTES && v > 0x7f { return 0, 0, .Value_Too_Large } @@ -86,6 +89,7 @@ encode_uleb128 :: proc(buf: []u8, val: u128) -> (size: int, err: Error) { size += 1 if size > len(buf) { + fmt.println(val, buf[:size - 1]) return 0, .Buffer_Too_Small } diff --git a/tests/core/encoding/varint/test_core_varint.odin b/tests/core/encoding/varint/test_core_varint.odin index 63a9d1d72..813c52018 100644 --- a/tests/core/encoding/varint/test_core_varint.odin +++ b/tests/core/encoding/varint/test_core_varint.odin @@ -5,10 +5,13 @@ import "core:testing" import "core:fmt" import "core:os" import "core:slice" +import "core:math/rand" TEST_count := 0 TEST_fail := 0 +RANDOM_TESTS :: 100 + when ODIN_TEST { expect :: testing.expect log :: testing.log @@ -30,7 +33,7 @@ when ODIN_TEST { main :: proc() { t := testing.T{} - test_dwarf(&t) + test_leb128(&t) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) if TEST_fail > 0 { @@ -39,7 +42,7 @@ main :: proc() { } @(test) -test_dwarf :: proc(t: ^testing.T) { +test_leb128 :: proc(t: ^testing.T) { buf: [varint.LEB128_MAX_BYTES]u8 for vector in ULEB_Vectors { @@ -75,6 +78,46 @@ test_dwarf :: proc(t: ^testing.T) { expect(t, size == vector.size && slice.simple_equal(vector.encoded, buf[:size]), msg) } } + + for num_bytes in 1..uint(16) { + for _ in 0..RANDOM_TESTS { + unsigned, signed := get_random(num_bytes) + + { + encode_size, encode_err := varint.encode_uleb128(buf[:], unsigned) + msg := fmt.tprintf("%v failed to encode as an unsigned LEB128 value, got %v", unsigned, encode_err) + expect(t, encode_err == .None, msg) + + decoded, decode_size, decode_err := varint.decode_uleb128(buf[:]) + msg = fmt.tprintf("Expected %02x to decode as %v, got %v", buf[:encode_size], unsigned, decoded) + expect(t, decode_err == .None && decode_size == encode_size && decoded == unsigned, msg) + } + + { + encode_size, encode_err := varint.encode_ileb128(buf[:], signed) + msg := fmt.tprintf("%v failed to encode as a signed LEB128 value, got %v", signed, encode_err) + expect(t, encode_err == .None, msg) + + decoded, decode_size, decode_err := varint.decode_ileb128(buf[:]) + msg = fmt.tprintf("Expected %02x to decode as %v, got %v, err: %v", buf[:encode_size], signed, decoded, decode_err) + expect(t, decode_err == .None && decode_size == encode_size && decoded == signed, msg) + } + } + } +} + +get_random :: proc(byte_count: uint) -> (u: u128, i: i128) { + assert(byte_count >= 0 && byte_count <= size_of(u128)) + + for _ in 1..byte_count { + u <<= 8 + u |= u128(rand.uint32() & 0xff) + } + + bias := i128(1 << (byte_count * 7)) - 1 + i = i128(u) - bias + + return } ULEB_Test_Vector :: struct { @@ -85,11 +128,13 @@ ULEB_Test_Vector :: struct { } ULEB_Vectors :: []ULEB_Test_Vector{ - { []u8{0x00}, 0, 1, .None }, - { []u8{0x7f}, 127, 1, .None }, - { []u8{0xE5, 0x8E, 0x26}, 624485, 3, .None }, - { []u8{0x80}, 0, 0, .Buffer_Too_Small }, - { []u8{}, 0, 0, .Buffer_Too_Small }, + { []u8{0x00}, 0, 1, .None }, + { []u8{0x7f}, 127, 1, .None }, + { []u8{0xE5, 0x8E, 0x26}, 624485, 3, .None }, + { []u8{0x80}, 0, 0, .Buffer_Too_Small }, + { []u8{}, 0, 0, .Buffer_Too_Small }, + + { []u8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03}, max(u128), 19, .None }, } ILEB_Test_Vector :: struct { @@ -105,4 +150,7 @@ ILEB_Vectors :: []ILEB_Test_Vector{ { []u8{0x40}, -64, 1, .None }, { []u8{0xC0, 0xBB, 0x78}, -123456, 3, .None }, { []u8{}, 0, 0, .Buffer_Too_Small }, + + { []u8{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7e}, min(i128), 19, .None }, + { []u8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01}, max(i128), 19, .None }, } \ No newline at end of file From 52e60526effe7c8265f4a60e87abd9fc69ce9332 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 19:32:30 +0100 Subject: [PATCH 59/74] tabs. --- tests/core/encoding/varint/test_core_varint.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/core/encoding/varint/test_core_varint.odin b/tests/core/encoding/varint/test_core_varint.odin index 813c52018..093b043d7 100644 --- a/tests/core/encoding/varint/test_core_varint.odin +++ b/tests/core/encoding/varint/test_core_varint.odin @@ -129,12 +129,12 @@ ULEB_Test_Vector :: struct { ULEB_Vectors :: []ULEB_Test_Vector{ { []u8{0x00}, 0, 1, .None }, - { []u8{0x7f}, 127, 1, .None }, + { []u8{0x7f}, 127, 1, .None }, { []u8{0xE5, 0x8E, 0x26}, 624485, 3, .None }, - { []u8{0x80}, 0, 0, .Buffer_Too_Small }, - { []u8{}, 0, 0, .Buffer_Too_Small }, + { []u8{0x80}, 0, 0, .Buffer_Too_Small }, + { []u8{}, 0, 0, .Buffer_Too_Small }, - { []u8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03}, max(u128), 19, .None }, + { []u8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03}, max(u128), 19, .None }, } ILEB_Test_Vector :: struct { @@ -149,7 +149,7 @@ ILEB_Vectors :: []ILEB_Test_Vector{ { []u8{0x3f}, 63, 1, .None }, { []u8{0x40}, -64, 1, .None }, { []u8{0xC0, 0xBB, 0x78}, -123456, 3, .None }, - { []u8{}, 0, 0, .Buffer_Too_Small }, + { []u8{}, 0, 0, .Buffer_Too_Small }, { []u8{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7e}, min(i128), 19, .None }, { []u8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01}, max(i128), 19, .None }, From 26ffec845ba0212e838657320ac70ab464b2bd3e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 19:38:36 +0100 Subject: [PATCH 60/74] [crypto] Remove unused `mem` import for siphash. --- core/crypto/siphash/siphash.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/crypto/siphash/siphash.odin b/core/crypto/siphash/siphash.odin index 63576551c..a6c75f315 100644 --- a/core/crypto/siphash/siphash.odin +++ b/core/crypto/siphash/siphash.odin @@ -14,7 +14,6 @@ package siphash import "core:crypto" import "core:crypto/util" -import "core:mem" /* High level API From 2a41814985f99d76ca07b48896eb79a1e2b4dea9 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 19:56:42 +0100 Subject: [PATCH 61/74] [varint] Tighten max input bounds. --- core/encoding/varint/leb128.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/encoding/varint/leb128.odin b/core/encoding/varint/leb128.odin index 898c6af67..476b9c2c9 100644 --- a/core/encoding/varint/leb128.odin +++ b/core/encoding/varint/leb128.odin @@ -32,7 +32,7 @@ decode_uleb128 :: proc(buf: []u8) -> (val: u128, size: int, err: Error) { size = i + 1 // 18 * 7 bits = 126, which means that a possible 19th byte may at most be 0b0000_0011. - if size == LEB128_MAX_BYTES && v > 0b0000_0011 { + if size > LEB128_MAX_BYTES || size == LEB128_MAX_BYTES && v > 0b0000_0011 { return 0, 0, .Value_Too_Large } @@ -64,7 +64,7 @@ decode_ileb128 :: proc(buf: []u8) -> (val: i128, size: int, err: Error) { size += 1 // 18 * 7 bits = 126, which including sign means we can have a 19th byte. - if size == LEB128_MAX_BYTES && v > 0x7f { + if size > LEB128_MAX_BYTES || size == LEB128_MAX_BYTES && v > 0x7f { return 0, 0, .Value_Too_Large } From 64705ddd1df8c6c63a971b01d6a832d1eb75ae56 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 8 Mar 2022 20:08:56 +0100 Subject: [PATCH 62/74] [varint] Add doc.odin --- core/encoding/varint/doc.odin | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 core/encoding/varint/doc.odin diff --git a/core/encoding/varint/doc.odin b/core/encoding/varint/doc.odin new file mode 100644 index 000000000..dd068b261 --- /dev/null +++ b/core/encoding/varint/doc.odin @@ -0,0 +1,27 @@ +/* + Implementation of the LEB128 variable integer encoding as used by DWARF encoding and DEX files, among others. + + Author of this Odin package: Jeroen van Rijn + + Example: + ```odin + import "core:encoding/varint" + import "core:fmt" + + main :: proc() { + buf: [varint.LEB128_MAX_BYTES]u8 + + value := u128(42) + + encode_size, encode_err := varint.encode_uleb128(buf[:], value) + assert(encode_size == 1 && encode_err == .None) + + fmt.println(buf[:encode_size]) + + decoded_val, decode_size, decode_err := varint.decode_uleb128(buf[:encode_size]) + assert(decoded_val == value && decode_size == encode_size && decode_err == .None) + } + ``` + +*/ +package varint \ No newline at end of file From ff60b752bd11e654b5bfe210043cd63379e2ca34 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 8 Mar 2022 22:35:10 +0000 Subject: [PATCH 63/74] Replace `#if` with `if` where possible --- src/main.cpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 1e1e957cb..e01ea0308 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -384,7 +384,7 @@ i32 linker_stage(lbGenerator *gen) { // NOTE(zangent): Sometimes, you have to use -framework on MacOS. // This allows you to specify '-f' in a #foreign_system_library, // without having to implement any new syntax specifically for MacOS. - #if defined(GB_SYSTEM_OSX) + if (build_context.metrics.os == TargetOs_darwin) { if (string_ends_with(lib, str_lit(".framework"))) { // framework thingie String lib_name = lib; @@ -400,7 +400,7 @@ i32 linker_stage(lbGenerator *gen) { // dynamic or static system lib, just link regularly searching system library paths lib_str = gb_string_append_fmt(lib_str, " -l%.*s ", LIT(lib)); } - #else + } else { // NOTE(vassvik): static libraries (.a files) in linux can be linked to directly using the full path, // since those are statically linked to at link time. shared libraries (.so) has to be // available at runtime wherever the executable is run, so we make require those to be @@ -418,7 +418,7 @@ i32 linker_stage(lbGenerator *gen) { // dynamic or static system lib, just link regularly searching system library paths lib_str = gb_string_append_fmt(lib_str, " -l%.*s ", LIT(lib)); } - #endif + } } gbString object_files = gb_string_make(heap_allocator(), ""); @@ -456,11 +456,11 @@ i32 linker_stage(lbGenerator *gen) { // line arguments prepared previously are incompatible with ld. // // Shared libraries are .dylib on MacOS and .so on Linux. - #if defined(GB_SYSTEM_OSX) + if (build_context.metrics.os == TargetOs_darwin) { output_ext = STR_LIT(".dylib"); - #else + } else { output_ext = STR_LIT(".so"); - #endif + } link_settings = gb_string_appendc(link_settings, "-Wl,-init,'_odin_entry_point' "); link_settings = gb_string_appendc(link_settings, "-Wl,-fini,'_odin_exit_point' "); } else if (build_context.metrics.os != TargetOs_openbsd) { @@ -477,24 +477,24 @@ i32 linker_stage(lbGenerator *gen) { gbString platform_lib_str = gb_string_make(heap_allocator(), ""); defer (gb_string_free(platform_lib_str)); - #if defined(GB_SYSTEM_OSX) + if (build_context.metrics.os == TargetOs_darwin) { platform_lib_str = gb_string_appendc(platform_lib_str, "-lSystem -lm -Wl,-syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -L/usr/local/lib"); - #else + } else { platform_lib_str = gb_string_appendc(platform_lib_str, "-lc -lm"); - #endif + } - #if defined(GB_SYSTEM_OSX) + if (build_context.metrics.arch == TargetOs_darwin) { // This sets a requirement of Mountain Lion and up, but the compiler doesn't work without this limit. // NOTE: If you change this (although this minimum is as low as you can go with Odin working) // make sure to also change the 'mtriple' param passed to 'opt' - #if defined(GB_CPU_ARM) - link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=12.0.0 "); - #else - link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=10.8.0 "); - #endif + if (build_context.metrics.arch == TargetArch_amd64) { + link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=12.0.0 "); + } else { + link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=10.8.0 "); + } // This points the linker to where the entry point is link_settings = gb_string_appendc(link_settings, " -e _main "); - #endif + } gbString link_command_line = gb_string_make(heap_allocator(), "clang -Wno-unused-command-line-argument "); defer (gb_string_free(link_command_line)); From 0278ac85a04309c8777663afe733e984a44bbcc8 Mon Sep 17 00:00:00 2001 From: Al Hoang <3811822-hoanga@users.noreply.gitlab.com> Date: Tue, 8 Mar 2022 23:48:25 -0600 Subject: [PATCH 64/74] update to build for FreeBSD --- Makefile | 6 ++++++ core/os/os_freebsd.odin | 4 ++-- core/os/stat_unix.odin | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index ceff3c207..b8bf26a88 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,12 @@ ifeq ($(OS), OpenBSD) CFLAGS:=$(CFLAGS) $(shell $(LLVM_CONFIG) --cxxflags --ldflags) LDFLAGS:=$(LDFLAGS) $(shell $(LLVM_CONFIG) --libs core native --system-libs) endif +ifeq ($(OS), FreeBSD) + LLVM_CONFIG=/usr/local/bin/llvm-config11 + + CFLAGS:=$(CFLAGS) $(shell $(LLVM_CONFIG) --cxxflags --ldflags) + LDFLAGS:=$(LDFLAGS) $(shell $(LLVM_CONFIG) --libs core native --system-libs) +endif all: debug demo diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin index e31eb31bb..4f31b1492 100644 --- a/core/os/os_freebsd.odin +++ b/core/os/os_freebsd.odin @@ -232,10 +232,10 @@ foreign libc { @(link_name="close") _unix_close :: proc(fd: Handle) -> c.int --- @(link_name="read") _unix_read :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t --- @(link_name="write") _unix_write :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t --- - @(link_name="lseek64") _unix_seek :: proc(fd: Handle, offset: i64, whence: c.int) -> i64 --- + @(link_name="lseek") _unix_seek :: proc(fd: Handle, offset: i64, whence: c.int) -> i64 --- @(link_name="gettid") _unix_gettid :: proc() -> u64 --- @(link_name="getpagesize") _unix_getpagesize :: proc() -> c.int --- - @(link_name="stat64") _unix_stat :: proc(path: cstring, stat: ^OS_Stat) -> c.int --- + @(link_name="stat") _unix_stat :: proc(path: cstring, stat: ^OS_Stat) -> c.int --- @(link_name="fstat") _unix_fstat :: proc(fd: Handle, stat: ^OS_Stat) -> c.int --- @(link_name="access") _unix_access :: proc(path: cstring, mask: c.int) -> c.int --- diff --git a/core/os/stat_unix.odin b/core/os/stat_unix.odin index 2aa9fc283..c82466b08 100644 --- a/core/os/stat_unix.odin +++ b/core/os/stat_unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, freebsd, openbsd +//+build linux, darwin, openbsd package os import "core:time" From ba412fd87bc1a24ca8ce9ee9ae665aa15b4cde2b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 9 Mar 2022 09:36:21 +0000 Subject: [PATCH 65/74] Fix typo --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index e01ea0308..4d25aea48 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -483,7 +483,7 @@ i32 linker_stage(lbGenerator *gen) { platform_lib_str = gb_string_appendc(platform_lib_str, "-lc -lm"); } - if (build_context.metrics.arch == TargetOs_darwin) { + if (build_context.metrics.os == TargetOs_darwin) { // This sets a requirement of Mountain Lion and up, but the compiler doesn't work without this limit. // NOTE: If you change this (although this minimum is as low as you can go with Odin working) // make sure to also change the 'mtriple' param passed to 'opt' From ea9c2fed57a885b74f3ed96461b7aba485b78e36 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 9 Mar 2022 10:52:37 +0000 Subject: [PATCH 66/74] Update .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index abbdccecd..e8b3d3050 100644 --- a/.gitignore +++ b/.gitignore @@ -279,3 +279,5 @@ shared/ *.ll *.sublime-workspace +examples/bug/ +build.sh From 8e4d6b3e5dde51fdd71a49b2bf703ae3428c1c21 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 9 Mar 2022 11:24:36 +0000 Subject: [PATCH 67/74] Fix typo --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 4d25aea48..aab695de2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -487,7 +487,7 @@ i32 linker_stage(lbGenerator *gen) { // This sets a requirement of Mountain Lion and up, but the compiler doesn't work without this limit. // NOTE: If you change this (although this minimum is as low as you can go with Odin working) // make sure to also change the 'mtriple' param passed to 'opt' - if (build_context.metrics.arch == TargetArch_amd64) { + if (build_context.metrics.arch == TargetArch_arm64) { link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=12.0.0 "); } else { link_settings = gb_string_appendc(link_settings, " -mmacosx-version-min=10.8.0 "); From 17eebf338c7c2428db99470f8e1dd6c8d2f7ac0f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 9 Mar 2022 15:05:51 +0000 Subject: [PATCH 68/74] Fix #1606 (Call `runtime._cleanup_runtime_contextless()` for `os.exit`) --- core/os/os_darwin.odin | 1 + core/os/os_freebsd.odin | 1 + core/os/os_linux.odin | 1 + core/os/os_openbsd.odin | 2 ++ core/os/os_wasi.odin | 2 ++ core/os/os_windows.odin | 2 ++ core/runtime/core.odin | 5 +++++ 7 files changed, 14 insertions(+) diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index 4365842b0..ace622582 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -680,6 +680,7 @@ make_directory :: proc(path: string, mode: u32 = 0o775) -> Errno { } exit :: proc "contextless" (code: int) -> ! { + runtime._cleanup_runtime_contextless() _unix_exit(i32(code)) } diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin index e31eb31bb..7fb9dd26f 100644 --- a/core/os/os_freebsd.odin +++ b/core/os/os_freebsd.odin @@ -419,6 +419,7 @@ set_current_directory :: proc(path: string) -> (err: Errno) { } exit :: proc "contextless" (code: int) -> ! { + runtime._cleanup_runtime_contextless() _unix_exit(c.int(code)) } diff --git a/core/os/os_linux.odin b/core/os/os_linux.odin index 200d6d68d..9716e2925 100644 --- a/core/os/os_linux.odin +++ b/core/os/os_linux.odin @@ -802,6 +802,7 @@ set_current_directory :: proc(path: string) -> (err: Errno) { } exit :: proc "contextless" (code: int) -> ! { + runtime._cleanup_runtime_contextless() _unix_exit(c.int(code)) } diff --git a/core/os/os_openbsd.odin b/core/os/os_openbsd.odin index 3862851a1..bca93880a 100644 --- a/core/os/os_openbsd.odin +++ b/core/os/os_openbsd.odin @@ -5,6 +5,7 @@ foreign import libc "system:c" import "core:runtime" import "core:strings" import "core:c" +import "core:runtime" Handle :: distinct i32 Pid :: distinct i32 @@ -658,6 +659,7 @@ set_current_directory :: proc(path: string) -> (err: Errno) { } exit :: proc "contextless" (code: int) -> ! { + runtime._cleanup_runtime_contextless() _unix_exit(c.int(code)) } diff --git a/core/os/os_wasi.odin b/core/os/os_wasi.odin index d2ba166bd..7bab1b949 100644 --- a/core/os/os_wasi.odin +++ b/core/os/os_wasi.odin @@ -1,6 +1,7 @@ package os import "core:sys/wasm/wasi" +import "core:runtime" Handle :: distinct i32 Errno :: distinct i32 @@ -93,5 +94,6 @@ heap_free :: proc(ptr: rawptr) { exit :: proc "contextless" (code: int) -> ! { + runtime._cleanup_runtime_contextless() wasi.proc_exit(wasi.exitcode_t(code)) } \ No newline at end of file diff --git a/core/os/os_windows.odin b/core/os/os_windows.odin index e6efb89df..fe9496e4c 100644 --- a/core/os/os_windows.odin +++ b/core/os/os_windows.odin @@ -2,6 +2,7 @@ package os import win32 "core:sys/windows" +import "core:runtime" Handle :: distinct uintptr File_Time :: distinct u64 @@ -128,6 +129,7 @@ get_page_size :: proc() -> int { exit :: proc "contextless" (code: int) -> ! { + runtime._cleanup_runtime_contextless() win32.ExitProcess(win32.DWORD(code)) } diff --git a/core/runtime/core.odin b/core/runtime/core.odin index 8d315a238..08ca4c049 100644 --- a/core/runtime/core.odin +++ b/core/runtime/core.odin @@ -459,6 +459,11 @@ _cleanup_runtime :: proc() { default_temp_allocator_destroy(&global_default_temp_allocator_data) } +_cleanup_runtime_contextless :: proc "contextless" () { + context = default_context() + _cleanup_runtime() +} + ///////////////////////////// ///////////////////////////// From 6d1a91f5b309e7d7dde69a91293b3f8908a1748d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 9 Mar 2022 15:11:38 +0000 Subject: [PATCH 69/74] Fix typo --- core/os/os_openbsd.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/os/os_openbsd.odin b/core/os/os_openbsd.odin index bca93880a..a99c8fef0 100644 --- a/core/os/os_openbsd.odin +++ b/core/os/os_openbsd.odin @@ -2,7 +2,6 @@ package os foreign import libc "system:c" -import "core:runtime" import "core:strings" import "core:c" import "core:runtime" From dc8d28c383a404d01dcbcb65ba84ff814da9424e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 9 Mar 2022 15:15:30 +0000 Subject: [PATCH 70/74] Fix #1607 --- src/llvm_backend_expr.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 844deb43c..026350440 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2202,6 +2202,21 @@ lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue ri } } + if (is_type_matrix(a) && (op_kind == Token_CmpEq || op_kind == Token_NotEq)) { + Type *tl = base_type(a); + lbValue lhs = lb_address_from_load_or_generate_local(p, left); + lbValue rhs = lb_address_from_load_or_generate_local(p, right); + + + // TODO(bill): Test to see if this is actually faster!!!! + auto args = array_make(permanent_allocator(), 3); + args[0] = lb_emit_conv(p, lhs, t_rawptr); + args[1] = lb_emit_conv(p, rhs, t_rawptr); + args[2] = lb_const_int(p->module, t_int, type_size_of(tl)); + lbValue val = lb_emit_runtime_call(p, "memory_compare", args); + lbValue res = lb_emit_comp(p, op_kind, val, lb_const_nil(p->module, val.type)); + return lb_emit_conv(p, res, t_bool); + } if (is_type_array(a) || is_type_enumerated_array(a)) { Type *tl = base_type(a); lbValue lhs = lb_address_from_load_or_generate_local(p, left); From c6dc5170042057da9bd4708f81017a3a994b2293 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 11 Mar 2022 08:52:16 +0000 Subject: [PATCH 71/74] Correct: murmur32 --- core/hash/hash.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/hash/hash.odin b/core/hash/hash.odin index 5044d567a..f2152f1b6 100644 --- a/core/hash/hash.odin +++ b/core/hash/hash.odin @@ -151,7 +151,7 @@ murmur32 :: proc(data: []byte, seed := u32(0)) -> u32 { k1 ~= u32(tail[2]) << 16 fallthrough case 2: - k1 ~= u32(tail[2]) << 8 + k1 ~= u32(tail[1]) << 8 fallthrough case 1: k1 ~= u32(tail[0]) From 7a7b87181dda2f5b3ac3f3286861f033fdd60aa9 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 11 Mar 2022 11:09:58 +0100 Subject: [PATCH 72/74] [examples] Add `core:encoding/varint` to `examples/all`. --- examples/all/all_main.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index e694060d2..7d2082250 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -54,6 +54,7 @@ import base64 "core:encoding/base64" import csv "core:encoding/csv" import hxa "core:encoding/hxa" import json "core:encoding/json" +import varint "core:encoding/varint" import fmt "core:fmt" import hash "core:hash" @@ -153,6 +154,7 @@ _ :: base64 _ :: csv _ :: hxa _ :: json +_ :: varint _ :: fmt _ :: hash _ :: image From c12c7d53701e1ba9d110a9c4bd61fc2cb19a8fd1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 12 Mar 2022 10:47:52 +0000 Subject: [PATCH 73/74] Remove tag --- core/sync/sync2/primitives.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sync/sync2/primitives.odin b/core/sync/sync2/primitives.odin index 046ecbc35..6d056d439 100644 --- a/core/sync/sync2/primitives.odin +++ b/core/sync/sync2/primitives.odin @@ -11,7 +11,7 @@ current_thread_id :: proc "contextless" () -> int { // // A Mutex must not be copied after first use Mutex :: struct { - impl: _Mutex `This is a tag`, + impl: _Mutex, } // mutex_lock locks m From f907516cbd0078b69996929d02742d0c1a48c226 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 12 Mar 2022 10:48:31 +0000 Subject: [PATCH 74/74] #Fix 1615 Replace `llvm.readcyclecounter` with `cntvct_el0` on arm64 --- src/llvm_backend_proc.cpp | 21 +++++++++++++++------ src/llvm_backend_utility.cpp | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index eb6c89b85..1698c211b 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1402,14 +1402,23 @@ lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValue const &tv, case BuiltinProc_read_cycle_counter: { - char const *name = "llvm.readcyclecounter"; - unsigned id = LLVMLookupIntrinsicID(name, gb_strlen(name)); - GB_ASSERT_MSG(id != 0, "Unable to find %s", name); - LLVMValueRef ip = LLVMGetIntrinsicDeclaration(p->module->mod, id, nullptr, 0); - lbValue res = {}; - res.value = LLVMBuildCall(p->builder, ip, nullptr, 0, ""); res.type = tv.type; + + if (build_context.metrics.arch == TargetArch_arm64) { + LLVMTypeRef func_type = LLVMFunctionType(LLVMInt64TypeInContext(p->module->ctx), nullptr, 0, false); + bool has_side_effects = false; + LLVMValueRef the_asm = llvm_get_inline_asm(func_type, str_lit("mrs x9, cntvct_el0"), str_lit("=r"), has_side_effects); + GB_ASSERT(the_asm != nullptr); + res.value = LLVMBuildCall2(p->builder, func_type, the_asm, nullptr, 0, ""); + } else { + char const *name = "llvm.readcyclecounter"; + unsigned id = LLVMLookupIntrinsicID(name, gb_strlen(name)); + GB_ASSERT_MSG(id != 0, "Unable to find %s", name); + LLVMValueRef ip = LLVMGetIntrinsicDeclaration(p->module->mod, id, nullptr, 0); + + res.value = LLVMBuildCall(p->builder, ip, nullptr, 0, ""); + } return res; } diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 431cfea9b..15075380a 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1779,7 +1779,7 @@ LLVMValueRef llvm_get_inline_asm(LLVMTypeRef func_type, String const &str, Strin return LLVMGetInlineAsm(func_type, cast(char *)str.text, cast(size_t)str.len, cast(char *)clobbers.text, cast(size_t)clobbers.len, - /*HasSideEffects*/true, /*IsAlignStack*/false, + has_side_effects, is_align_stack, dialect #if LLVM_VERSION_MAJOR >= 13 , /*CanThrow*/false