git » swiftpm » commit 9b4e911

Update to latest borogove

author Stephen Paul Weber
2026-05-27 01:35:42 UTC
committer Stephen Paul Weber
2026-05-27 01:35:42 UTC
parent 26c63d68fd675bf56f56513234bee5dcbaaea4cf

Update to latest borogove

Sources/Borogove/Borogove.swift +1714 -684
Sources/c_borogove/iinclude/Lambda.h +0 -3
Sources/c_borogove/iinclude/Reflect.h +0 -3
Sources/c_borogove/iinclude/Sys.h +3 -0
Sources/c_borogove/iinclude/Xml.h +0 -3
Sources/c_borogove/iinclude/_FractionalIndexing/FractionalIndexing_Fields_.h +81 -0
Sources/c_borogove/iinclude/_HaxeCBridge/HaxeArray_Impl_.h +58 -0
Sources/c_borogove/iinclude/_HaxeCBridge/HaxeOpaqueArray_Impl_.h +58 -0
Sources/c_borogove/iinclude/_HaxeCBridge/HaxeStringArray_Impl_.h +58 -0
Sources/c_borogove/iinclude/_UUIDv7/UUIDv7_Fields_.h +63 -0
Sources/c_borogove/iinclude/borogove/AsyncLock.h +55 -0
Sources/c_borogove/iinclude/borogove/Autolink.h +2 -1
Sources/c_borogove/iinclude/borogove/AvailableChat.h +6 -0
Sources/c_borogove/iinclude/borogove/AvailableChatIterator.h +81 -0
Sources/c_borogove/iinclude/borogove/Caps.h +5 -2
Sources/c_borogove/iinclude/borogove/CapsRepo.h +71 -0
Sources/c_borogove/iinclude/borogove/Channel.h +38 -17
Sources/c_borogove/iinclude/borogove/Chat.h +69 -42
Sources/c_borogove/iinclude/borogove/ChatMessage.h +25 -6
Sources/c_borogove/iinclude/borogove/ChatMessageBuilder.h +13 -12
Sources/c_borogove/iinclude/borogove/Client.h +25 -3
Sources/c_borogove/iinclude/borogove/DirectChat.h +30 -13
Sources/c_borogove/iinclude/borogove/Emoji.h +3 -3
Sources/c_borogove/iinclude/borogove/EmojiUtil.h +4 -0
Sources/c_borogove/iinclude/borogove/EventEmitter.h +4 -1
Sources/c_borogove/iinclude/borogove/FormOption.h +12 -12
Sources/c_borogove/iinclude/borogove/GenericStream.h +0 -2
Sources/c_borogove/iinclude/borogove/Html.h +95 -0
Sources/c_borogove/iinclude/borogove/JsonPrinter.h +9 -0
Sources/c_borogove/iinclude/borogove/LinkMetadata.h +74 -0
Sources/c_borogove/iinclude/borogove/Member.h +103 -0
Sources/c_borogove/iinclude/borogove/MemberUpdate.h +71 -0
Sources/c_borogove/iinclude/borogove/Message.h +1 -1
Sources/c_borogove/iinclude/borogove/MessageStanza.h +2 -0
Sources/c_borogove/iinclude/borogove/MessageSync.h +5 -7
Sources/c_borogove/iinclude/borogove/Other.h +3 -3
Sources/c_borogove/iinclude/borogove/Participant.h +17 -3
Sources/c_borogove/iinclude/borogove/Persistence.h +50 -27
Sources/c_borogove/iinclude/borogove/Persistence__Companion.h +7 -10
Sources/c_borogove/iinclude/borogove/Role.h +67 -0
Sources/c_borogove/iinclude/borogove/SerializedChat.h +10 -4
Sources/c_borogove/iinclude/borogove/Stanza.h +3 -0
Sources/c_borogove/iinclude/borogove/Status.h +67 -0
Sources/c_borogove/iinclude/borogove/XEP0393.h +5 -2
Sources/c_borogove/iinclude/borogove/_Chat/Chat_Fields_.h +62 -0
Sources/c_borogove/iinclude/borogove/_Presence/Presence_Impl_.h +90 -0
Sources/c_borogove/iinclude/borogove/calls/_Session/Session_Fields_.h +3 -1
Sources/c_borogove/iinclude/borogove/persistence/Dummy.h +27 -9
Sources/c_borogove/iinclude/borogove/persistence/MediaStore.h +3 -3
Sources/c_borogove/iinclude/borogove/persistence/MediaStoreFS.h +1 -1
Sources/c_borogove/iinclude/borogove/persistence/MediaStore__Companion.h +1 -3
Sources/c_borogove/iinclude/borogove/persistence/Sqlite.h +49 -12
Sources/c_borogove/iinclude/borogove/streams/XmppStropheStream.h +0 -2
Sources/c_borogove/iinclude/haxe/Int64Helper.h +60 -0
Sources/c_borogove/iinclude/haxe/_Int64/Int64_Impl_.h +62 -0
Sources/c_borogove/iinclude/haxe/crypto/Sha1.h +2 -2
Sources/c_borogove/iinclude/haxe/crypto/Sha256.h +24 -20
Sources/c_borogove/iinclude/haxe/crypto/random/SecureRandom.h +76 -0
Sources/c_borogove/iinclude/haxe/io/Bytes.h +0 -3
Sources/c_borogove/iinclude/sha/Hash.h +0 -60
Sources/c_borogove/iinclude/sha/SHA256.h +0 -86
Sources/c_borogove/iinclude/sha/_SHA256/SHA256_Fields_.h +0 -62
Sources/c_borogove/iinclude/sys/db/Connection.h +1 -7
Sources/c_borogove/iinclude/sys/io/Process.h +3 -0
Sources/c_borogove/iinclude/uuidv7/V7Generator.h +72 -0
Sources/c_borogove/include/borogove.h +811 -359
Sources/c_borogove/src/CrashHandler.mm +0 -20
Sources/c_borogove/src/HaxeCBridge.cpp +166 -166
Sources/c_borogove/src/Lambda.cpp +0 -21
Sources/c_borogove/src/Reflect.cpp +0 -14
Sources/c_borogove/src/Sys.cpp +15 -0
Sources/c_borogove/src/Xml.cpp +0 -32
Sources/c_borogove/src/_FractionalIndexing/FractionalIndexing_Fields_.cpp +479 -0
Sources/c_borogove/src/_HaxeCBridge/HaxeArray_Impl_.cpp +120 -0
Sources/c_borogove/src/_HaxeCBridge/HaxeOpaqueArray_Impl_.cpp +107 -0
Sources/c_borogove/src/_HaxeCBridge/HaxeStringArray_Impl_.cpp +124 -0
Sources/c_borogove/src/_HaxeCBridge/Internal.cpp +9 -9
Sources/c_borogove/src/_UUIDv7/UUIDv7_Fields_.cpp +124 -0
Sources/c_borogove/src/__HaxeCBridgeBindings__.cpp +3082 -1541
Sources/c_borogove/src/__boot__.cpp +126 -72
Sources/c_borogove/src/__files__.cpp +0 -706
Sources/c_borogove/src/borogove/AsyncLock.cpp +166 -0
Sources/c_borogove/src/borogove/AttachmentSource.cpp +31 -31
Sources/c_borogove/src/borogove/Autolink.cpp +108 -50
Sources/c_borogove/src/borogove/AvailableChat.cpp +81 -21
Sources/c_borogove/src/borogove/AvailableChatIterator.cpp +887 -0
Sources/c_borogove/src/borogove/Builder.cpp +85 -85
Sources/c_borogove/src/borogove/Caps.cpp +360 -288
Sources/c_borogove/src/borogove/CapsRepo.cpp +317 -0
Sources/c_borogove/src/borogove/Channel.cpp +2356 -1187
Sources/c_borogove/src/borogove/Chat.cpp +1478 -1339
Sources/c_borogove/src/borogove/ChatAttachment.cpp +92 -92
Sources/c_borogove/src/borogove/ChatMessage.cpp +1004 -910
Sources/c_borogove/src/borogove/ChatMessageBuilder.cpp +487 -546
Sources/c_borogove/src/borogove/Client.cpp +3561 -3250
Sources/c_borogove/src/borogove/Command.cpp +36 -36
Sources/c_borogove/src/borogove/CommandSession.cpp +109 -182
Sources/c_borogove/src/borogove/Config.cpp +6 -6
Sources/c_borogove/src/borogove/CustomEmojiReaction.cpp +26 -26
Sources/c_borogove/src/borogove/DirectChat.cpp +817 -527
Sources/c_borogove/src/borogove/Emoji.cpp +6 -6
Sources/c_borogove/src/borogove/EmojiUtil.cpp +130 -67
Sources/c_borogove/src/borogove/EncryptionInfo.cpp +81 -81
Sources/c_borogove/src/borogove/EventEmitter.cpp +104 -64
Sources/c_borogove/src/borogove/Form.cpp +202 -246
Sources/c_borogove/src/borogove/FormField.cpp +129 -212
Sources/c_borogove/src/borogove/FormItem.cpp +32 -76
Sources/c_borogove/src/borogove/FormLayoutSection.cpp +125 -125
Sources/c_borogove/src/borogove/FormOption.cpp +25 -25
Sources/c_borogove/src/borogove/FormSection__Companion.cpp +12 -56
Sources/c_borogove/src/borogove/FormSubmitBuilder.cpp +87 -87
Sources/c_borogove/src/borogove/GenericStream.cpp +34 -37
Sources/c_borogove/src/borogove/Hash.cpp +3 -3
Sources/c_borogove/src/borogove/Html.cpp +1061 -0
Sources/c_borogove/src/borogove/Identicon.cpp +52 -52
Sources/c_borogove/src/borogove/Identity.cpp +52 -52
Sources/c_borogove/src/borogove/JID.cpp +77 -77
Sources/c_borogove/src/borogove/JsonPrinter.cpp +393 -335
Sources/c_borogove/src/borogove/LinkMetadata.cpp +368 -0
Sources/c_borogove/src/borogove/Member.cpp +771 -0
Sources/c_borogove/src/borogove/MemberUpdate.cpp +649 -0
Sources/c_borogove/src/borogove/Message.cpp +794 -659
Sources/c_borogove/src/borogove/MessageStanza.cpp +20 -8
Sources/c_borogove/src/borogove/MessageSync.cpp +168 -201
Sources/c_borogove/src/borogove/Notification.cpp +51 -45
Sources/c_borogove/src/borogove/Other.cpp +6 -6
Sources/c_borogove/src/borogove/Participant.cpp +296 -77
Sources/c_borogove/src/borogove/Persistence.cpp +51 -27
Sources/c_borogove/src/borogove/Persistence__Companion.cpp +304 -434
Sources/c_borogove/src/borogove/Profile.cpp +34 -34
Sources/c_borogove/src/borogove/ProfileBuilder.cpp +98 -98
Sources/c_borogove/src/borogove/ProfileItem.cpp +202 -495
Sources/c_borogove/src/borogove/Push.cpp +80 -13
Sources/c_borogove/src/borogove/Reaction.cpp +26 -20
Sources/c_borogove/src/borogove/ReactionUpdate.cpp +109 -109
Sources/c_borogove/src/borogove/Role.cpp +233 -0
Sources/c_borogove/src/borogove/SerializedChat.cpp +197 -98
Sources/c_borogove/src/borogove/Stanza.cpp +399 -361
Sources/c_borogove/src/borogove/Status.cpp +227 -0
Sources/c_borogove/src/borogove/Symbol.cpp +20 -20
Sources/c_borogove/src/borogove/UnicodeBlocks.cpp +14 -14
Sources/c_borogove/src/borogove/UnicodeList.cpp +6 -6
Sources/c_borogove/src/borogove/UnicodeRange.cpp +10 -10
Sources/c_borogove/src/borogove/Util.cpp +43 -43
Sources/c_borogove/src/borogove/XEP0393.cpp +619 -403
Sources/c_borogove/src/borogove/_Chat/Chat_Fields_.cpp +116 -0
Sources/c_borogove/src/borogove/_DataForm/DataForm_Impl_.cpp +19 -19
Sources/c_borogove/src/borogove/_DataForm/Field_Impl_.cpp +48 -48
Sources/c_borogove/src/borogove/_Presence/Presence_Impl_.cpp +343 -0
Sources/c_borogove/src/borogove/_Profile/Profile_Fields_.cpp +38 -38
Sources/c_borogove/src/borogove/_Util/Util_Fields_.cpp +57 -57
Sources/c_borogove/src/borogove/calls/AudioFormat.cpp +6 -6
Sources/c_borogove/src/borogove/calls/IncomingProposedSession.cpp +116 -116
Sources/c_borogove/src/borogove/calls/InitiatedSession.cpp +607 -607
Sources/c_borogove/src/borogove/calls/MediaStream.cpp +12 -56
Sources/c_borogove/src/borogove/calls/MediaStreamTrack.cpp +72 -94
Sources/c_borogove/src/borogove/calls/OutgoingProposedSession.cpp +127 -127
Sources/c_borogove/src/borogove/calls/OutgoingSession.cpp +27 -27
Sources/c_borogove/src/borogove/calls/PeerConnection.cpp +6 -1
Sources/c_borogove/src/borogove/calls/Session__Companion.cpp +45 -127
Sources/c_borogove/src/borogove/calls/_Session/Session_Fields_.cpp +17 -7
Sources/c_borogove/src/borogove/persistence/Dummy.cpp +196 -111
Sources/c_borogove/src/borogove/persistence/KeyValueStore.cpp +3 -3
Sources/c_borogove/src/borogove/persistence/KeyValueStore__Companion.cpp +30 -30
Sources/c_borogove/src/borogove/persistence/MediaStoreFS.cpp +89 -89
Sources/c_borogove/src/borogove/persistence/MediaStore__Companion.cpp +94 -80
Sources/c_borogove/src/borogove/persistence/Sqlite.cpp +2912 -1788
Sources/c_borogove/src/borogove/persistence/SqliteDriver.cpp +76 -85
Sources/c_borogove/src/borogove/queries/BlocklistGet.cpp +3 -3
Sources/c_borogove/src/borogove/queries/BoB.cpp +4 -4
Sources/c_borogove/src/borogove/queries/CommandExecute.cpp +4 -4
Sources/c_borogove/src/borogove/queries/DiscoInfoGet.cpp +4 -4
Sources/c_borogove/src/borogove/queries/DiscoItemsGet.cpp +3 -3
Sources/c_borogove/src/borogove/queries/ExtDiscoGet.cpp +3 -3
Sources/c_borogove/src/borogove/queries/HttpUploadSlot.cpp +4 -4
Sources/c_borogove/src/borogove/queries/JabberIqGatewayGet.cpp +3 -3
Sources/c_borogove/src/borogove/queries/MAMQuery.cpp +3 -3
Sources/c_borogove/src/borogove/queries/PubsubGet.cpp +3 -3
Sources/c_borogove/src/borogove/queries/Push2Disable.cpp +3 -3
Sources/c_borogove/src/borogove/queries/Push2Enable.cpp +3 -3
Sources/c_borogove/src/borogove/queries/RosterGet.cpp +22 -7
Sources/c_borogove/src/borogove/queries/VcardTempGet.cpp +3 -3
Sources/c_borogove/src/borogove/streams/XmppStropheStream.cpp +253 -253
Sources/c_borogove/src/haxe/Int64Helper.cpp +131 -0
Sources/c_borogove/src/haxe/_Int64/Int64_Impl_.cpp +90 -0
Sources/c_borogove/src/haxe/crypto/Sha1.cpp +111 -111
Sources/c_borogove/src/haxe/crypto/Sha256.cpp +541 -153
Sources/c_borogove/src/haxe/crypto/random/SecureRandom.cpp +246 -0
Sources/c_borogove/src/haxe/io/Bytes.cpp +0 -11
Sources/c_borogove/src/haxe/xml/Printer.cpp +132 -134
Sources/c_borogove/src/hx/NoFiles.cpp +14 -0
Sources/c_borogove/src/sha/Hash.cpp +0 -222
Sources/c_borogove/src/sha/SHA256.cpp +0 -406
Sources/c_borogove/src/sha/_SHA256/SHA256_Fields_.cpp +0 -119
Sources/c_borogove/src/sys/io/Process.cpp +11 -0
Sources/c_borogove/src/uuidv7/V7Generator.cpp +407 -0
Sources/strophe/libstrophe +1 -1

diff --git a/Sources/Borogove/Borogove.swift b/Sources/Borogove/Borogove.swift
index f09acb2..5a0f6bf 100644
--- a/Sources/Borogove/Borogove.swift
+++ b/Sources/Borogove/Borogove.swift
@@ -26,6 +26,15 @@ internal func useString(_ mptr: UnsafeMutableRawPointer?) -> String? {
 	return useString(UnsafePointer(mptr?.assumingMemoryBound(to: CChar.self)))
 }
 
+internal var contextLifetime: [UnsafeMutableRawPointer: [UnsafeMutableRawPointer]] = [:]
+
+internal func releaseContexts(o: UnsafeMutableRawPointer?) {
+	if let o {
+		contextLifetime[o]?.map { Unmanaged<AnyObject>.fromOpaque($0).release() }
+		contextLifetime[o] = nil
+	}
+}
+
 // From https://github.com/swiftlang/swift/blob/dfc3933a05264c0c19f7cd43ea0dca351f53ed48/stdlib/private/SwiftPrivate/SwiftPrivate.swift
 public func scan<
 	S : Sequence, U
@@ -74,10 +83,106 @@ internal func withOptionalArrayOfCStrings<R>(
 	}
 }
 
+public class Html: SDKObject, @unchecked Sendable {
+	public let o: UnsafeMutableRawPointer
+
+	internal init(_ ptr: UnsafeMutableRawPointer) {
+		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
+	}
+
+	/**
+	 HTML builder, make an element
+	 */
+	public static func element(tag: String, attr: Array<String>, attrValues: Array<String>, children: Array<Html>) -> Html {
+		withArrayOfCStrings(attr) { __attr in withArrayOfCStrings(attrValues) { __attrValues in Html(c_borogove.borogove_html_element(
+			tag,
+			__attr, attr.count,
+			__attrValues, attrValues.count,
+			children.map { $0.o }, children.count
+		)!)}}
+	}
+
+	/**
+	 HTML builder, make some text
+	 */
+	public static func text(text: String) -> Html {
+		Html(c_borogove.borogove_html_text(
+			text
+		)!)
+	}
+
+	/**
+	 HTML builder, make a fragment
+	 */
+	public static func fragment(nodes: Array<Html>) -> Html {
+		Html(c_borogove.borogove_html_fragment(
+			nodes.map { $0.o }, nodes.count
+		)!)
+	}
+
+	/**
+	 Build HTML payload from source
+	 */
+	public static func fromString(html: String) -> Html {
+		Html(c_borogove.borogove_html_from_string(
+			html
+		)!)
+	}
+
+	/**
+	 Walk the HTML tree to produce a new value
+	 */
+	public func reduce<T>(f: @Sendable @escaping (String, Array<String>?, Array<String>?, Array<T>?)->T) -> Array<T> {
+		let __erased_f: @Sendable (String, Array<String>?, Array<String>?, Array<AnyObject>?)->AnyObject = { (a0, a1, a2, a3) in
+			let c0 = a0
+			let c1 = a1
+			let c2 = a2
+			let c3 = a3?.map { $0 as! T }
+			return f(c0, c1, c2, c3) as! AnyObject
+		}
+		let __f_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(__erased_f as AnyObject).toOpaque())
+		let __result = {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_html_reduce(
+			self.o,
+			{ (a0, a1, a1_length, a2, a2_length, a3, a3_length, ctx) in
+				let f = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (String, Array<String>?, Array<String>?, Array<AnyObject>?)->AnyObject
+				return Unmanaged.passRetained(f(useString(a0)!, { if(a1_length < 0) { return nil; }; let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: a1, count: a1_length).map({useString($0)!});c_borogove.borogove_release(a1);return __r;}(), { if(a2_length < 0) { return nil; }; let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: a2, count: a2_length).map({useString($0)!});c_borogove.borogove_release(a2);return __r;}(), { if(a3_length < 0) { return nil; }; let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a3, count: a3_length).map({Unmanaged<AnyObject>.fromOpaque($0!).takeRetainedValue()});c_borogove.borogove_release(a3);return __r;}())).toOpaque()
+			},
+			__f_ptr
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({Unmanaged<AnyObject>.fromOpaque($0!).takeRetainedValue() as! T});c_borogove.borogove_release(__ret);return __r;}();}()
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__f_ptr]
+		return __result
+	}
+
+	/**
+	 Get HTML source as a string
+	 */
+	public func toString() -> String {
+		let __result = useString(c_borogove.borogove_html_to_string(
+			self.o
+		))!
+		return __result
+	}
+
+	/**
+	 Get plain text suitable for showing to a user
+	 */
+	public func toPlainText() -> String {
+		let __result = useString(c_borogove.borogove_html_to_plain_text(
+			self.o
+		))!
+		return __result
+	}
+
+	deinit {
+		c_borogove.borogove_release(o)
+	}
+}
+
 public protocol MediaStore: SDKObject {
 	func hasMedia(hashAlgorithm: String, hash: Array<UInt8>) async -> Bool
 
-	func removeMedia(hashAlgorithm: String, hash: Array<UInt8>) -> Void
+	func removeMedia(hashAlgorithm: String, hash: Array<UInt8>) async -> Bool
 
 	func storeMedia(mime: String, bytes: Array<UInt8>) async -> Bool
 
@@ -87,7 +192,7 @@ public extension MediaStore {
 	func hasMedia(hashAlgorithm: String, hash: Array<UInt8>) async -> Bool {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_media_store_has_media(
+		let __result = c_borogove.borogove_persistence_media_store_has_media(
 			self.o,
 			hashAlgorithm,
 			hash, hash.count,
@@ -97,21 +202,31 @@ public extension MediaStore {
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
-	func removeMedia(hashAlgorithm: String, hash: Array<UInt8>) -> Void {
-		return c_borogove.borogove_persistence_media_store_remove_media(
+	func removeMedia(hashAlgorithm: String, hash: Array<UInt8>) async -> Bool {
+		return await withUnsafeContinuation { cont in
+		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_persistence_media_store_remove_media(
 			self.o,
 			hashAlgorithm,
-			hash, hash.count
+			hash, hash.count,
+			{ (a, ctx) in
+				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Bool, Never>
+				cont.resume(returning: a)
+			},
+			__cont_ptr
 		)
+		return __result
+		}
 	}
 
 	func storeMedia(mime: String, bytes: Array<UInt8>) async -> Bool {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_media_store_store_media(
+		let __result = c_borogove.borogove_persistence_media_store_store_media(
 			self.o,
 			mime,
 			bytes, bytes.count,
@@ -121,6 +236,7 @@ public extension MediaStore {
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
@@ -144,6 +260,7 @@ public class MediaStoreFS: SDKObject, MediaStore, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	/**
@@ -164,7 +281,7 @@ public class MediaStoreFS: SDKObject, MediaStore, @unchecked Sendable {
 	public func getMediaPath(uri: String) async -> String? {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_media_store_fs_get_media_path(
+		let __result = c_borogove.borogove_persistence_media_store_fs_get_media_path(
 			self.o,
 			uri,
 			{ (a, ctx) in
@@ -173,6 +290,7 @@ public class MediaStoreFS: SDKObject, MediaStore, @unchecked Sendable {
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
@@ -192,7 +310,7 @@ public extension KeyValueStore {
 	func get(k: String) async -> String? {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_key_value_store_get(
+		let __result = c_borogove.borogove_persistence_key_value_store_get(
 			self.o,
 			k,
 			{ (a, ctx) in
@@ -201,13 +319,14 @@ public extension KeyValueStore {
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
 	func set(k: String, v: String?) async -> Bool {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_key_value_store_set(
+		let __result = c_borogove.borogove_persistence_key_value_store_set(
 			self.o,
 			k,
 			v,
@@ -217,6 +336,7 @@ public extension KeyValueStore {
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
@@ -240,6 +360,7 @@ public class Hash: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	/**
@@ -283,9 +404,10 @@ public class Hash: SDKObject, @unchecked Sendable {
 	 @returns URI as a string
 	 */
 	public func toUri() -> String {
-		return useString(c_borogove.borogove_hash_to_uri(
+		let __result = useString(c_borogove.borogove_hash_to_uri(
 			self.o
 		))!
+		return __result
 	}
 
 	/**
@@ -294,9 +416,10 @@ public class Hash: SDKObject, @unchecked Sendable {
 	 @returns hex string
 	 */
 	public func toHex() -> String {
-		return useString(c_borogove.borogove_hash_to_hex(
+		let __result = useString(c_borogove.borogove_hash_to_hex(
 			self.o
 		))!
+		return __result
 	}
 
 	/**
@@ -305,9 +428,10 @@ public class Hash: SDKObject, @unchecked Sendable {
 	 @returns Base64-encoded string
 	 */
 	public func toBase64() -> String {
-		return useString(c_borogove.borogove_hash_to_base_64(
+		let __result = useString(c_borogove.borogove_hash_to_base_64(
 			self.o
 		))!
+		return __result
 	}
 
 	/**
@@ -316,9 +440,10 @@ public class Hash: SDKObject, @unchecked Sendable {
 	 @returns Base64url-encoded string
 	 */
 	public func toBase64Url() -> String {
-		return useString(c_borogove.borogove_hash_to_base_64_url(
+		let __result = useString(c_borogove.borogove_hash_to_base_64_url(
 			self.o
 		))!
+		return __result
 	}
 
 	deinit {
@@ -331,6 +456,7 @@ public class ChatAttachment: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	/**
@@ -382,7 +508,7 @@ public class ChatAttachment: SDKObject, @unchecked Sendable {
 	 */
 	public var uris: Array<String> {
 		get {
-			{var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_chat_attachment_uris(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
+			{var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_chat_attachment_uris(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
 		}
 	}
 
@@ -391,7 +517,7 @@ public class ChatAttachment: SDKObject, @unchecked Sendable {
 	 */
 	public var hashes: Array<Hash> {
 		get {
-			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_attachment_hashes(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({Hash($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_attachment_hashes(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({Hash($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
 		}
 	}
 
@@ -405,6 +531,7 @@ public class Reaction: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	/**
@@ -457,6 +584,7 @@ public class EncryptionInfo: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	public var status: EncryptionStatus {
@@ -494,11 +622,61 @@ public class EncryptionInfo: SDKObject, @unchecked Sendable {
 	}
 }
 
+public class LinkMetadata: SDKObject, @unchecked Sendable {
+	public let o: UnsafeMutableRawPointer
+
+	internal init(_ ptr: UnsafeMutableRawPointer) {
+		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
+	}
+
+	public var about: String {
+		get {
+			useString(c_borogove.borogove_link_metadata_about(o))!
+		}
+	}
+
+	public var url: String {
+		get {
+			useString(c_borogove.borogove_link_metadata_url(o))!
+		}
+	}
+
+	public var title: String? {
+		get {
+			useString(c_borogove.borogove_link_metadata_title(o))
+		}
+	}
+
+	public var description: String? {
+		get {
+			useString(c_borogove.borogove_link_metadata_description(o))
+		}
+	}
+
+	public var image: Array<String> {
+		get {
+			{var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_link_metadata_image(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
+		}
+	}
+
+	public var video: Array<String> {
+		get {
+			{var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_link_metadata_video(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
+		}
+	}
+
+	deinit {
+		c_borogove.borogove_release(o)
+	}
+}
+
 public class ChatMessage: SDKObject, @unchecked Sendable {
 	public let o: UnsafeMutableRawPointer
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	/**
@@ -578,7 +756,7 @@ public class ChatMessage: SDKObject, @unchecked Sendable {
 	 */
 	public var attachments: Array<ChatAttachment> {
 		get {
-			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_message_attachments(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({ChatAttachment($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_message_attachments(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({ChatAttachment($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
 		}
 	}
 
@@ -587,7 +765,7 @@ public class ChatMessage: SDKObject, @unchecked Sendable {
 	 */
 	public var reactionKeys: Array<String> {
 		get {
-			{var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_chat_message_reaction_keys(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
+			{var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_chat_message_reaction_keys(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
 		}
 	}
 
@@ -595,23 +773,15 @@ public class ChatMessage: SDKObject, @unchecked Sendable {
 	 Details of a set of reaction to this message
 	 */
 	public func reactionDetails(reactionKey: String) -> Array<Reaction> {
-		return {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_message_reaction_details(
+		let __result = {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_message_reaction_details(
 			self.o,
 			reactionKey
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({Reaction($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
-	}
-
-	/**
-	 Body text of this message or NULL
-	 */
-	public var text: String? {
-		get {
-			useString(c_borogove.borogove_chat_message_text(o))
-		}
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({Reaction($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
 	}
 
 	/**
-	 Language code for the body text
+	 Language code for the body
 	 */
 	public var lang: String? {
 		get {
@@ -651,7 +821,7 @@ public class ChatMessage: SDKObject, @unchecked Sendable {
 	 */
 	public var versions: Array<ChatMessage> {
 		get {
-			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_message_versions(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({ChatMessage($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_message_versions(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({ChatMessage($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
 		}
 	}
 
@@ -665,90 +835,149 @@ public class ChatMessage: SDKObject, @unchecked Sendable {
 		}
 	}
 
+	/**
+	 Metadata about links associated with this message
+	 */
+	public var linkMetadata: Array<LinkMetadata> {
+		get {
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_message_link_metadata(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({LinkMetadata($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		}
+	}
+
 	/**
 	 Create a new ChatMessage in reply to this one
 	 */
 	public func reply() -> ChatMessageBuilder {
-		return ChatMessageBuilder(c_borogove.borogove_chat_message_reply(
+		let __result = ChatMessageBuilder(c_borogove.borogove_chat_message_reply(
 			self.o
 		)!)
+		return __result
 	}
 
 	/**
-	 Get HTML version of the message body
+	 HTML representation of the message body
 	 
 	 WARNING: this is possibly untrusted HTML. You must parse or sanitize appropriately!
 	 
 	 @param sender optionally specify the full details of the sender
 	 */
-	public func html(sender: Participant? = nil) -> String {
-		return useString(c_borogove.borogove_chat_message_html(
+	public func body(sender: Member? = nil) -> Html {
+		let __result = Html(c_borogove.borogove_chat_message_body(
 			self.o,
 			sender?.o
-		))!
+		)!)
+		return __result
+	}
+
+	/**
+	 Subject if present
+	 */
+	public func subject() -> String? {
+		let __result = useString(c_borogove.borogove_chat_message_subject(
+			self.o
+		))
+		return __result
 	}
 
 	/**
 	 The ID of the Chat this message is associated with
 	 */
 	public func chatId() -> String {
-		return useString(c_borogove.borogove_chat_message_chat_id(
+		let __result = useString(c_borogove.borogove_chat_message_chat_id(
 			self.o
 		))!
+		return __result
 	}
 
 	/**
 	 The ID of the account associated with this message
 	 */
 	public func account() -> String {
-		return useString(c_borogove.borogove_chat_message_account(
+		let __result = useString(c_borogove.borogove_chat_message_account(
 			self.o
 		))!
+		return __result
+	}
+
+	/**
+	 A basic Member for the sender, in case the full one can't be loaded
+	 */
+	public func senderMemberStub() -> Member {
+		let __result = Member(c_borogove.borogove_chat_message_sender_member_stub(
+			self.o
+		)!)
+		return __result
+	}
+
+	/**
+	 Is this message the same as or a replacement for some other one?
+	 */
+	public func canReplace(other: ChatMessage) -> Bool {
+		let __result = c_borogove.borogove_chat_message_can_replace(
+			self.o,
+			other.o
+		)
+		return __result
 	}
 
 	/**
 	 Is this an incoming message?
 	 */
 	public func isIncoming() -> Bool {
-		return c_borogove.borogove_chat_message_is_incoming(
+		let __result = c_borogove.borogove_chat_message_is_incoming(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 The URI of an icon for the thread associated with this message, or NULL
 	 */
 	public func threadIcon() -> String?? {
-		return useString(c_borogove.borogove_chat_message_thread_icon(
+		let __result = useString(c_borogove.borogove_chat_message_thread_icon(
+			self.o
+		))
+		return __result
+	}
+
+	/**
+	 If message is moderated, the reason
+	 */
+	public func moderationReason() -> String? {
+		let __result = useString(c_borogove.borogove_chat_message_moderation_reason(
 			self.o
 		))
+		return __result
 	}
 
 	/**
 	 The last status of the call if this message is related to a call
 	 */
 	public func callStatus() -> String? {
-		return useString(c_borogove.borogove_chat_message_call_status(
+		let __result = useString(c_borogove.borogove_chat_message_call_status(
 			self.o
 		))
+		return __result
 	}
 
 	/**
 	 The session id of the call if this message is related to a call
 	 */
 	public func callSid() -> String? {
-		return useString(c_borogove.borogove_chat_message_call_sid(
+		let __result = useString(c_borogove.borogove_chat_message_call_sid(
 			self.o
 		))
+		return __result
 	}
 
 	/**
 	 The duration of the call if this message is related to a call
 	 */
 	public func callDuration() -> String? {
-		return useString(c_borogove.borogove_chat_message_call_duration(
+		let __result = useString(c_borogove.borogove_chat_message_call_duration(
 			self.o
 		))
+		return __result
 	}
 
 	deinit {
@@ -756,27 +985,31 @@ public class ChatMessage: SDKObject, @unchecked Sendable {
 	}
 }
 
-public class AudioFormat: SDKObject, @unchecked Sendable {
+public class EventEmitter: SDKObject, @unchecked Sendable {
 	public let o: UnsafeMutableRawPointer
+	internal static var __contextLifetime: [Int32: UnsafeMutableRawPointer] = [:]
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
-	public init(format: String, payloadType: UInt8, clockRate: Int32, channels: Int32) {
-		o = (c_borogove.borogove_calls_audio_format_new(format, payloadType, clockRate, channels))
-	}
-
-	public var clockRate: Int32 {
-		get {
-			c_borogove.borogove_calls_audio_format_clock_rate(o)
-		}
-	}
-
-	public var channels: Int32 {
-		get {
-			c_borogove.borogove_calls_audio_format_channels(o)
+	/**
+	 Remove an event listener of any type, no matter how it was added
+	 or what event it is for.
+	 
+	 @param token the token that was returned when the listener was added
+	 */
+	public func removeEventListener(token: Int32) -> Void {
+		let __result = c_borogove.borogove_event_emitter_remove_event_listener(
+			self.o,
+			token
+		)
+		Self.__contextLifetime[token].map { ending in
+			Unmanaged<AnyObject>.fromOpaque(ending).release()
+			contextLifetime[o] = contextLifetime[o]?.filter { $0 != ending }
 		}
+		return __result
 	}
 
 	deinit {
@@ -784,91 +1017,69 @@ public class AudioFormat: SDKObject, @unchecked Sendable {
 	}
 }
 
-public class MediaStreamTrack: SDKObject, @unchecked Sendable {
+public class AvailableChat: SDKObject, @unchecked Sendable {
 	public let o: UnsafeMutableRawPointer
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
-	public var id: String {
-		get {
-			useString(c_borogove.borogove_calls_media_stream_track_id(o))!
-		}
-	}
-
-	public var muted: Bool {
+	/**
+	 The ID of the Chat this search result represents
+	 */
+	public var chatId: String {
 		get {
-			c_borogove.borogove_calls_media_stream_track_muted(o)
+			useString(c_borogove.borogove_available_chat_chat_id(o))!
 		}
 	}
 
-	public var kind: String {
+	/**
+	 The display name of this search result
+	 */
+	public var displayName: String? {
 		get {
-			useString(c_borogove.borogove_calls_media_stream_track_kind(o))!
+			useString(c_borogove.borogove_available_chat_display_name(o))
 		}
 	}
 
-	public var supportedAudioFormats: Array<AudioFormat> {
+	/**
+	 A human-readable note associated with this search result
+	 */
+	public var note: String {
 		get {
-			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_calls_media_stream_track_supported_audio_formats(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({AudioFormat($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+			useString(c_borogove.borogove_available_chat_note(o))!
 		}
 	}
 
 	/**
-	 Event fired for new inbound audio frame
-	 
-	 @param callback takes three arguments, the Signed 16-bit PCM data, the clock rate, and the number of channels
+	 Is this search result a channel?
 	 */
-	public func addPCMListener(callback: @Sendable @escaping (Array<Int16>, Int32, Int32)->Void) -> Void {
-		let __callback_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(callback as AnyObject).toOpaque())
-		return c_borogove.borogove_calls_media_stream_track_add_pcm_listener(
-			self.o,
-			{ (a0, a0_length, a1, a2, ctx) in
-				let callback = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (Array<Int16>, Int32, Int32)->Void
-				return callback({let __r = UnsafeMutableBufferPointer<Int16>(start: a0, count: a0_length).map({$0});c_borogove.borogove_release(a0);return __r;}(), a1, a2)
-			},
-			__callback_ptr
+	public func isChannel() -> Bool {
+		let __result = c_borogove.borogove_available_chat_is_channel(
+			self.o
 		)
+		return __result
 	}
 
 	/**
-	 Event fired when ready for next outbound audio frame
-	 
-	 @param callback
+	 Can audio calls be started after starting this Chat?
 	 */
-	public func addReadyForPCMListener(callback: @Sendable @escaping ()->Void) -> Void {
-		let __callback_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(callback as AnyObject).toOpaque())
-		return c_borogove.borogove_calls_media_stream_track_add_ready_for_pcm_listener(
-			self.o,
-			{ (ctx) in
-				let callback = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable ()->Void
-				return callback()
-			},
-			__callback_ptr
+	public func canAudioCall() -> Bool {
+		let __result = c_borogove.borogove_available_chat_can_audio_call(
+			self.o
 		)
+		return __result
 	}
 
 	/**
-	 Send new audio to this track
-	 
-	 @param pcm 16-bit signed linear PCM data (interleaved)
-	 @param clockRate the sampling rate of the data
-	 @param channels the number of audio channels
+	 Can video calls be started after starting Chat?
 	 */
-	public func writePCM(pcm: Array<Int16>, clockRate: Int32, channels: Int32) -> Void {
-		return c_borogove.borogove_calls_media_stream_track_write_pcm(
-			self.o,
-			pcm, pcm.count,
-			clockRate,
-			channels
-		)
-	}
-
-	public func stop() -> Void {
-		return c_borogove.borogove_calls_media_stream_track_stop(
+	public func canVideoCall() -> Bool {
+		let __result = c_borogove.borogove_available_chat_can_video_call(
 			self.o
 		)
+		return __result
 	}
 
 	deinit {
@@ -876,44 +1087,500 @@ public class MediaStreamTrack: SDKObject, @unchecked Sendable {
 	}
 }
 
-public class FormOption: SDKObject, @unchecked Sendable {
+public class Role: SDKObject, @unchecked Sendable {
 	public let o: UnsafeMutableRawPointer
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
-	public var label: String {
+	/**
+	 Unique id for the role
+	 */
+	public var id: String {
 		get {
-			useString(c_borogove.borogove_form_option_label(o))!
+			useString(c_borogove.borogove_role_id(o))!
 		}
 	}
 
-	public var value: String {
+	/**
+	 Human readable name for the role
+	 */
+	public var title: String {
 		get {
-			useString(c_borogove.borogove_form_option_value(o))!
+			useString(c_borogove.borogove_role_title(o))!
 		}
 	}
 
+	/**
+	 Suggested color to use when displaying this Role
+	 */
+	public func color() -> String {
+		let __result = useString(c_borogove.borogove_role_color(
+			self.o
+		))!
+		return __result
+	}
+
 	deinit {
 		c_borogove.borogove_release(o)
 	}
 }
 
-public class FormField: SDKObject, @unchecked Sendable {
+public class ProfileItem: SDKObject, @unchecked Sendable {
 	public let o: UnsafeMutableRawPointer
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
-	public var name: String {
+	public var id: String {
 		get {
-			useString(c_borogove.borogove_form_field_name(o))!
+			useString(c_borogove.borogove_profile_item_id(o))!
 		}
 	}
 
-	public var label: String? {
+	public var key: String {
+		get {
+			useString(c_borogove.borogove_profile_item_key(o))!
+		}
+	}
+
+	/**
+	 Get parameter items attached to this profile item.
+	 */
+	public func parameters() -> Array<ProfileItem> {
+		let __result = {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_profile_item_parameters(
+			self.o
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({ProfileItem($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
+	}
+
+	/**
+	 Get text values for this profile item.
+	 */
+	public func text() -> Array<String> {
+		let __result = {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_profile_item_text(
+			self.o
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
+	}
+
+	/**
+	 Get URI values for this profile item.
+	 */
+	public func uri() -> Array<String> {
+		let __result = {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_profile_item_uri(
+			self.o
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
+	}
+
+	/**
+	 Get date values for this profile item.
+	 */
+	public func date() -> Array<String> {
+		let __result = {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_profile_item_date(
+			self.o
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
+	}
+
+	/**
+	 Get time values for this profile item.
+	 */
+	public func time() -> Array<String> {
+		let __result = {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_profile_item_time(
+			self.o
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
+	}
+
+	/**
+	 Get datetime values for this profile item.
+	 */
+	public func datetime() -> Array<String> {
+		let __result = {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_profile_item_datetime(
+			self.o
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
+	}
+
+	/**
+	 Get language-tag values for this profile item.
+	 */
+	public func languageTag() -> Array<String> {
+		let __result = {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_profile_item_language_tag(
+			self.o
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
+	}
+
+	deinit {
+		c_borogove.borogove_release(o)
+	}
+}
+
+public class Profile: SDKObject, @unchecked Sendable {
+	public let o: UnsafeMutableRawPointer
+
+	internal init(_ ptr: UnsafeMutableRawPointer) {
+		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
+	}
+
+	/**
+	 All items in the profile
+	 */
+	public var items: Array<ProfileItem> {
+		get {
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_profile_items(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({ProfileItem($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		}
+	}
+
+	deinit {
+		c_borogove.borogove_release(o)
+	}
+}
+
+public class Status: SDKObject, @unchecked Sendable {
+	public let o: UnsafeMutableRawPointer
+
+	internal init(_ ptr: UnsafeMutableRawPointer) {
+		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
+	}
+
+	/**
+	 Create a status value with emoji and text.
+	 */
+	public init(emoji: String, text: String) {
+		o = (c_borogove.borogove_status_new(emoji, text))
+	}
+
+	public var emoji: String {
+		get {
+			useString(c_borogove.borogove_status_emoji(o))!
+		}
+	}
+
+	public var text: String {
+		get {
+			useString(c_borogove.borogove_status_text(o))!
+		}
+	}
+
+	/**
+	 Render this status as plain text.
+	 */
+	public func toString() -> String {
+		let __result = useString(c_borogove.borogove_status_to_string(
+			self.o
+		))!
+		return __result
+	}
+
+	deinit {
+		c_borogove.borogove_release(o)
+	}
+}
+
+public class Member: Identifiable, SDKObject, @unchecked Sendable {
+	public let o: UnsafeMutableRawPointer
+
+	internal init(_ ptr: UnsafeMutableRawPointer) {
+		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
+	}
+
+	/**
+	 A unique id for this member
+	 */
+	public var id: String {
+		get {
+			useString(c_borogove.borogove_member_id(o))!
+		}
+	}
+
+	/**
+	 Display name to show for this member
+	 */
+	public var displayName: String {
+		get {
+			useString(c_borogove.borogove_member_display_name(o))!
+		}
+	}
+
+	/**
+	 Avatar URI for this member, or null when none is known
+	 */
+	public var photoUri: String? {
+		get {
+			useString(c_borogove.borogove_member_photo_uri(o))
+		}
+	}
+
+	/**
+	 Fallback avatar URI to use when no photo is available
+	 */
+	public var placeholderUri: String {
+		get {
+			useString(c_borogove.borogove_member_placeholder_uri(o))!
+		}
+	}
+
+	/**
+	 True when this member is the connected account
+	 */
+	public var isSelf: Bool {
+		get {
+			c_borogove.borogove_member_is_self(o)
+		}
+	}
+
+	/**
+	 Chat metadata for this member when it is available as a direct Chat
+	 */
+	public var chat: AvailableChat? {
+		get {
+			(c_borogove.borogove_member_chat(o)).map({ AvailableChat($0) })
+		}
+	}
+
+	/**
+	 Roles this member has in the Chat
+	 */
+	public var roles: Array<Role> {
+		get {
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_member_roles(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({Role($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		}
+	}
+
+	public var showPresence: ShowPresence {
+		get {
+			c_borogove.borogove_member_show_presence(o)
+		}
+	}
+
+	/**
+	 Load the member's profile
+	 
+	 @param client connected client used to send the profile query
+	 @returns Promise resolving to the member Profile
+	 */
+	public func profile(client: Client) async -> Profile {
+		return await withUnsafeContinuation { cont in
+		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_member_profile(
+			self.o,
+			client.o,
+			{ (a, ctx) in
+				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Profile, Never>
+				cont.resume(returning: Profile(a!))
+			},
+			__cont_ptr
+		)
+		return __result
+		}
+	}
+
+	/**
+	 Load the member's status
+	 
+	 @param client connected client used to send the profile query
+	 @returns Promise resolving to the member Status
+	 */
+	public func status(client: Client) async -> Status {
+		return await withUnsafeContinuation { cont in
+		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_member_status(
+			self.o,
+			client.o,
+			{ (a, ctx) in
+				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Status, Never>
+				cont.resume(returning: Status(a!))
+			},
+			__cont_ptr
+		)
+		return __result
+		}
+	}
+
+	deinit {
+		c_borogove.borogove_release(o)
+	}
+}
+
+public class AudioFormat: SDKObject, @unchecked Sendable {
+	public let o: UnsafeMutableRawPointer
+
+	internal init(_ ptr: UnsafeMutableRawPointer) {
+		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
+	}
+
+	public init(format: String, payloadType: UInt8, clockRate: Int32, channels: Int32) {
+		o = (c_borogove.borogove_calls_audio_format_new(format, payloadType, clockRate, channels))
+	}
+
+	public var clockRate: Int32 {
+		get {
+			c_borogove.borogove_calls_audio_format_clock_rate(o)
+		}
+	}
+
+	public var channels: Int32 {
+		get {
+			c_borogove.borogove_calls_audio_format_channels(o)
+		}
+	}
+
+	deinit {
+		c_borogove.borogove_release(o)
+	}
+}
+
+public class MediaStreamTrack: SDKObject, @unchecked Sendable {
+	public let o: UnsafeMutableRawPointer
+
+	internal init(_ ptr: UnsafeMutableRawPointer) {
+		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
+	}
+
+	public var id: String {
+		get {
+			useString(c_borogove.borogove_calls_media_stream_track_id(o))!
+		}
+	}
+
+	public var muted: Bool {
+		get {
+			c_borogove.borogove_calls_media_stream_track_muted(o)
+		}
+	}
+
+	public var kind: String {
+		get {
+			useString(c_borogove.borogove_calls_media_stream_track_kind(o))!
+		}
+	}
+
+	public var supportedAudioFormats: Array<AudioFormat> {
+		get {
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_calls_media_stream_track_supported_audio_formats(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({AudioFormat($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		}
+	}
+
+	/**
+	 Event fired for new inbound audio frame
+	 
+	 @param callback takes three arguments, the Signed 16-bit PCM data, the clock rate, and the number of channels
+	 */
+	public func addPCMListener(callback: @Sendable @escaping (Array<Int16>, Int32, Int32)->Void) -> Void {
+		let __callback_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(callback as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_calls_media_stream_track_add_pcm_listener(
+			self.o,
+			{ (a0, a0_length, a1, a2, ctx) in
+				let callback = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (Array<Int16>, Int32, Int32)->Void
+				return callback({ let __r = UnsafeMutableBufferPointer<Int16>(start: a0, count: a0_length).map({$0});c_borogove.borogove_release(a0);return __r;}(), a1, a2)
+			},
+			__callback_ptr
+		)
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__callback_ptr]
+		return __result
+	}
+
+	/**
+	 Event fired when ready for next outbound audio frame
+	 
+	 @param callback
+	 */
+	public func addReadyForPCMListener(callback: @Sendable @escaping ()->Void) -> Void {
+		let __callback_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(callback as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_calls_media_stream_track_add_ready_for_pcm_listener(
+			self.o,
+			{ (ctx) in
+				let callback = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable ()->Void
+				return callback()
+			},
+			__callback_ptr
+		)
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__callback_ptr]
+		return __result
+	}
+
+	/**
+	 Send new audio to this track
+	 
+	 @param pcm 16-bit signed linear PCM data (interleaved)
+	 @param clockRate the sampling rate of the data
+	 @param channels the number of audio channels
+	 */
+	public func writePCM(pcm: Array<Int16>, clockRate: Int32, channels: Int32) -> Void {
+		let __result = c_borogove.borogove_calls_media_stream_track_write_pcm(
+			self.o,
+			pcm, pcm.count,
+			clockRate,
+			channels
+		)
+		return __result
+	}
+
+	public func stop() -> Void {
+		let __result = c_borogove.borogove_calls_media_stream_track_stop(
+			self.o
+		)
+		return __result
+	}
+
+	deinit {
+		c_borogove.borogove_release(o)
+	}
+}
+
+public class FormOption: SDKObject, @unchecked Sendable {
+	public let o: UnsafeMutableRawPointer
+
+	internal init(_ ptr: UnsafeMutableRawPointer) {
+		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
+	}
+
+	public var label: String {
+		get {
+			useString(c_borogove.borogove_form_option_label(o))!
+		}
+	}
+
+	public var value: String {
+		get {
+			useString(c_borogove.borogove_form_option_value(o))!
+		}
+	}
+
+	deinit {
+		c_borogove.borogove_release(o)
+	}
+}
+
+public class FormField: SDKObject, @unchecked Sendable {
+	public let o: UnsafeMutableRawPointer
+
+	internal init(_ ptr: UnsafeMutableRawPointer) {
+		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
+	}
+
+	public var name: String {
+		get {
+			useString(c_borogove.borogove_form_field_name(o))!
+		}
+	}
+
+	public var label: String? {
 		get {
 			useString(c_borogove.borogove_form_field_label(o))
 		}
@@ -927,7 +1594,7 @@ public class FormField: SDKObject, @unchecked Sendable {
 
 	public var value: Array<String> {
 		get {
-			{var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_form_field_value(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
+			{var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_form_field_value(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
 		}
 	}
 
@@ -951,7 +1618,7 @@ public class FormField: SDKObject, @unchecked Sendable {
 
 	public var options: Array<FormOption> {
 		get {
-			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_form_field_options(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({FormOption($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_form_field_options(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({FormOption($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
 		}
 	}
 
@@ -989,35 +1656,51 @@ public class FormItem: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
+	/**
+	 Plain text content for this item, or null when the item is not text-only
+	 */
 	public var text: String? {
 		get {
 			useString(c_borogove.borogove_form_item_text(o))
 		}
 	}
 
+	/**
+	 Form field for this item, or null when the item is not a field
+	 */
 	public var field: FormField? {
 		get {
 			(c_borogove.borogove_form_item_field(o)).map({ FormField($0) })
 		}
 	}
 
+	/**
+	 Nested section for this item, or null when the item is not a section
+	 */
 	public var section: FormSection? {
 		get {
 			(c_borogove.borogove_form_item_section(o)).map({ AnyFormSection($0) })
 		}
 	}
 
+	/**
+	 Optional status type associated with instructional text
+	 */
 	public var status: String? {
 		get {
 			useString(c_borogove.borogove_form_item_status(o))
 		}
 	}
 
+	/**
+	 Column definitions when this item represents a result table
+	 */
 	public var tableHeader: Array<FormField>? {
 		get {
-			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_form_item_table_header(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({FormField($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_form_item_table_header(o, &__ret);return { if(__ret_length < 0) { return nil; }; let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({FormField($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
 		}
 	}
 
@@ -1027,23 +1710,31 @@ public class FormItem: SDKObject, @unchecked Sendable {
 }
 
 public protocol FormSection: SDKObject {
+	/**
+	 Title to show for this section, or null when it is untitled
+	 */
 	func title() -> String?
 
+	/**
+	 Renderable items contained in this section
+	 */
 	func items() -> Array<FormItem>
 
 }
 
 public extension FormSection {
 	func title() -> String? {
-		return useString(c_borogove.borogove_form_section_title(
+		let __result = useString(c_borogove.borogove_form_section_title(
 			self.o
 		))
+		return __result
 	}
 
 	func items() -> Array<FormItem> {
-		return {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_form_section_items(
+		let __result = {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_form_section_items(
 			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({FormItem($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({FormItem($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
 	}
 
 }
@@ -1066,42 +1757,47 @@ public class Form: SDKObject, FormSection, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	/**
 	 Is this form entirely results / read-only?
 	 */
 	public func isResult() -> Bool {
-		return c_borogove.borogove_form_is_result(
+		let __result = c_borogove.borogove_form_is_result(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 Title of this form
 	 */
 	public func title() -> String? {
-		return useString(c_borogove.borogove_form_title(
+		let __result = useString(c_borogove.borogove_form_title(
 			self.o
 		))
+		return __result
 	}
 
 	/**
 	 URL to use instead of this form
 	 */
 	public func url() -> String? {
-		return useString(c_borogove.borogove_form_url(
+		let __result = useString(c_borogove.borogove_form_url(
 			self.o
 		))
+		return __result
 	}
 
 	/**
 	 Items to render inside this form
 	 */
 	public func items() -> Array<FormItem> {
-		return {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_form_items(
+		let __result = {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_form_items(
 			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({FormItem($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({FormItem($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
 	}
 
 	deinit {
@@ -1114,36 +1810,57 @@ public class CommandSession: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
+	/**
+	 Human-readable title for the current command session
+	 */
 	public var name: String {
 		get {
 			useString(c_borogove.borogove_command_session_name(o))!
 		}
 	}
 
+	/**
+	 Current command execution status
+	 */
 	public var status: String {
 		get {
 			useString(c_borogove.borogove_command_session_status(o))!
 		}
 	}
 
+	/**
+	 Actions the server currently allows for this session
+	 */
 	public var actions: Array<FormOption> {
 		get {
-			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_command_session_actions(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({FormOption($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_command_session_actions(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({FormOption($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
 		}
 	}
 
+	/**
+	 Forms to display for the current session step
+	 */
 	public var forms: Array<Form> {
 		get {
-			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_command_session_forms(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({Form($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_command_session_forms(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({Form($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
 		}
 	}
 
+	/**
+	 Continue this command session, optionally submitting form data
+	 
+	 @param action requested action, or null for the default action
+	 @param data form values to submit for the selected form
+	 @param formIdx index of the form in `forms` to submit
+	 @returns Promise resolving to the next command session state
+	 */
 	public func execute(action: String? = nil, data: FormSubmitBuilder? = nil, formIdx: Int32 = 0) async -> CommandSession {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_command_session_execute(
+		let __result = c_borogove.borogove_command_session_execute(
 			self.o,
 			action,
 			data?.o,
@@ -1154,6 +1871,7 @@ public class CommandSession: SDKObject, @unchecked Sendable {
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
@@ -1167,8 +1885,12 @@ public class Command: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
+	/**
+	 Human-readable name for this command
+	 */
 	public var name: String {
 		get {
 			useString(c_borogove.borogove_command_name(o))!
@@ -1181,7 +1903,7 @@ public class Command: SDKObject, @unchecked Sendable {
 	public func execute() async -> CommandSession {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_command_execute(
+		let __result = c_borogove.borogove_command_execute(
 			self.o,
 			{ (a, ctx) in
 				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<CommandSession, Never>
@@ -1189,6 +1911,7 @@ public class Command: SDKObject, @unchecked Sendable {
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
@@ -1197,11 +1920,15 @@ public class Command: SDKObject, @unchecked Sendable {
 	}
 }
 
-public class Chat: SDKObject, @unchecked Sendable {
-	public let o: UnsafeMutableRawPointer
+public class Chat: EventEmitter, @unchecked Sendable {
+	internal override init(_ ptr: UnsafeMutableRawPointer) {
+		super.init(ptr)
+	}
 
-	internal init(_ ptr: UnsafeMutableRawPointer) {
-		o = ptr
+	public var status: Status {
+		get {
+			Status(c_borogove.borogove_chat_status(o)!)
+		}
 	}
 
 	/**
@@ -1252,72 +1979,66 @@ public class Chat: SDKObject, @unchecked Sendable {
 	/**
 	 Fetch a page of messages before some point
 	 
-	 @param beforeId id of the message to look before
-	 @param beforeTime timestamp of the message to look before,
-	        String in format YYYY-MM-DDThh:mm:ss[.sss]+00:00
+	 @param before ChatMessage to look before, or null to start at the end
 	 @returns Promise resolving to an array of ChatMessage that are found
 	 */
-	public func getMessagesBefore(beforeId: String?, beforeTime: String?) async -> Array<ChatMessage> {
+	public func getMessagesBefore(before: ChatMessage?) async -> Array<ChatMessage> {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_chat_get_messages_before(
+		let __result = c_borogove.borogove_chat_get_messages_before(
 			self.o,
-			beforeId,
-			beforeTime,
+			before?.o,
 			{ (a, a_length, ctx) in
 				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Array<ChatMessage>, Never>
-				cont.resume(returning: {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
+				cont.resume(returning: { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
 	/**
 	 Fetch a page of messages after some point
 	 
-	 @param afterId id of the message to look after
-	 @param afterTime timestamp of the message to look after,
-	        String in format YYYY-MM-DDThh:mm:ss[.sss]+00:00
+	 @param after ChatMessage to look after, or null to start at the beginning
 	 @returns Promise resolving to an array of ChatMessage that are found
 	 */
-	public func getMessagesAfter(afterId: String?, afterTime: String?) async -> Array<ChatMessage> {
+	public func getMessagesAfter(after: ChatMessage?) async -> Array<ChatMessage> {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_chat_get_messages_after(
+		let __result = c_borogove.borogove_chat_get_messages_after(
 			self.o,
-			afterId,
-			afterTime,
+			after?.o,
 			{ (a, a_length, ctx) in
 				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Array<ChatMessage>, Never>
-				cont.resume(returning: {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
+				cont.resume(returning: { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
 	/**
 	 Fetch a page of messages around (before, including, and after) some point
 	 
-	 @param aroundId id of the message to look around
-	 @param aroundTime timestamp of the message to look around,
-	        String in format YYYY-MM-DDThh:mm:ss[.sss]+00:00
+	 @param around ChatMessage to look around
 	 @returns Promise resolving to an array of ChatMessage that are found
 	 */
-	public func getMessagesAround(aroundId: String?, aroundTime: String?) async -> Array<ChatMessage> {
+	public func getMessagesAround(around: ChatMessage) async -> Array<ChatMessage> {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_chat_get_messages_around(
+		let __result = c_borogove.borogove_chat_get_messages_around(
 			self.o,
-			aroundId,
-			aroundTime,
+			around.o,
 			{ (a, a_length, ctx) in
 				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Array<ChatMessage>, Never>
-				cont.resume(returning: {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
+				cont.resume(returning: { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
@@ -1327,10 +2048,11 @@ public class Chat: SDKObject, @unchecked Sendable {
 	 @param message the ChatMessageBuilder to send
 	 */
 	public func sendMessage(message: ChatMessageBuilder) -> Void {
-		return c_borogove.borogove_chat_send_message(
+		let __result = c_borogove.borogove_chat_send_message(
 			self.o,
 			message.o
 		)
+		return __result
 	}
 
 	/**
@@ -1340,57 +2062,167 @@ public class Chat: SDKObject, @unchecked Sendable {
 	 @param message the ChatMessage most recently displayed
 	 */
 	public func markReadUpTo(message: ChatMessage) -> Void {
-		return c_borogove.borogove_chat_mark_read_up_to(
+		let __result = c_borogove.borogove_chat_mark_read_up_to(
 			self.o,
 			message.o
 		)
+		return __result
 	}
 
 	/**
 	 Save this Chat on the server
 	 */
 	public func bookmark() -> Void {
-		return c_borogove.borogove_chat_bookmark(
+		let __result = c_borogove.borogove_chat_bookmark(
 			self.o
 		)
+		return __result
 	}
 
 	/**
-	 Get the list of IDs of participants in this Chat
+	 Get a list of members in this Chat
 	 
-	 @returns array of IDs
+	 This list will often be a a complete list of everyone who has access to
+	 the chat, but for larger chats may be incomplete.
 	 */
-	public func getParticipants() -> Array<String> {
-		return {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_chat_get_participants(
-			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
+	public func members() async -> Array<Member> {
+		return await withUnsafeContinuation { cont in
+		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_chat_members(
+			self.o,
+			{ (a, a_length, ctx) in
+				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Array<Member>, Never>
+				cont.resume(returning: { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({Member($0!)});c_borogove.borogove_release(a);return __r;}())
+			},
+			__cont_ptr
+		)
+		return __result
+		}
 	}
 
 	/**
-	 Get the details for one participant in this Chat
+	 Get the details for some members in this Chat
 	 
-	 @param participantId the ID of the participant to look up
+	 @param memberIds the IDs of the member to look up
 	 */
-	public func getParticipantDetails(participantId: String) -> Participant {
-		return Participant(c_borogove.borogove_chat_get_participant_details(
+	public func getMemberDetails(memberIds: Array<String>) async -> Array<Member?> {
+		return await withUnsafeContinuation { cont in
+		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
+		withArrayOfCStrings(memberIds) { __memberIds in let __result = c_borogove.borogove_chat_get_member_details(
 			self.o,
-			participantId
-		)!)
+			__memberIds, memberIds.count,
+			{ (a, a_length, ctx) in
+				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Array<Member?>, Never>
+				cont.resume(returning: { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({($0).map({ Member($0) })});c_borogove.borogove_release(a);return __r;}())
+			},
+			__cont_ptr
+		)
+		return __result}
+		}
+	}
+
+	/**
+	 Event fired when a member is updated, or when a new member is added
+	 
+	 @param handler takes one argument, an array of Member that were updated
+	 @returns token for use with removeEventListener
+	 */
+	public func addMembersUpdatedListener(handler: @Sendable @escaping (Array<Member>)->Void) -> Int32 {
+		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_chat_add_members_updated_listener(
+			self.o,
+			{ (a0, a0_length, ctx) in
+				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (Array<Member>)->Void
+				return handler({ let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a0, count: a0_length).map({Member($0!)});c_borogove.borogove_release(a0);return __r;}())
+			},
+			__handler_ptr
+		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
+	}
+
+	/**
+	 Roles the current user can assign to the target member
+	 */
+	public func availableRoles(member: Member) -> Array<Role> {
+		let __result = {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_available_roles(
+			self.o,
+			member.o
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({Role($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
+	}
+
+	/**
+	 Can the current user remove this role from the member?
+	 */
+	public func canRemoveRole(member: Member, role: Role) -> Bool {
+		let __result = c_borogove.borogove_chat_can_remove_role(
+			self.o,
+			member.o,
+			role.o
+		)
+		return __result
+	}
+
+	/**
+	 Add a role to a member
+	 
+	 @param member the member to update
+	 @param role the role to add
+	 */
+	public func addRole(member: Member, role: Role) -> Void {
+		let __result = c_borogove.borogove_chat_add_role(
+			self.o,
+			member.o,
+			role.o
+		)
+		return __result
+	}
+
+	/**
+	 Remove a role from a member
+	 
+	 @param member the member to update
+	 @param role the role to remove
+	 */
+	public func removeRole(member: Member, role: Role) -> Void {
+		let __result = c_borogove.borogove_chat_remove_role(
+			self.o,
+			member.o,
+			role.o
+		)
+		return __result
 	}
 
 	/**
 	 Correct an already-send message by replacing it with a new one
 	 
-	 @param localId the localId of the message to correct
-	        must be the localId of the first version ever sent, not a subsequent correction
-	 @param message the new ChatMessage to replace it with
+	 @param correct the ChatMessage to correct
+	 @param message the new ChatMessageBuilder to replace it with
 	 */
-	public func correctMessage(localId: String, message: ChatMessageBuilder) -> Void {
-		return c_borogove.borogove_chat_correct_message(
+	public func correctMessage(correct: ChatMessage, message: ChatMessageBuilder) -> Void {
+		let __result = c_borogove.borogove_chat_correct_message(
 			self.o,
-			localId,
+			correct.o,
 			message.o
 		)
+		return __result
+	}
+
+	/**
+	 Moderate a message by replacing it with a tombstone (if permitted)
+	 
+	 @param message the message to moderate
+	 @param reason the reason for moderating this message
+	 */
+	public func moderate(message: ChatMessage, reason: String) -> Void {
+		let __result = c_borogove.borogove_chat_moderate(
+			self.o,
+			message.o,
+			reason
+		)
+		return __result
 	}
 
 	/**
@@ -1400,11 +2232,12 @@ public class Chat: SDKObject, @unchecked Sendable {
 	 @param reaction emoji of the reaction
 	 */
 	public func addReaction(m: ChatMessage, reaction: Reaction) -> Void {
-		return c_borogove.borogove_chat_add_reaction(
+		let __result = c_borogove.borogove_chat_add_reaction(
 			self.o,
 			m.o,
 			reaction.o
 		)
+		return __result
 	}
 
 	/**
@@ -1414,11 +2247,12 @@ public class Chat: SDKObject, @unchecked Sendable {
 	 @param reaction the emoji to remove
 	 */
 	public func removeReaction(m: ChatMessage, reaction: Reaction) -> Void {
-		return c_borogove.borogove_chat_remove_reaction(
+		let __result = c_borogove.borogove_chat_remove_reaction(
 			self.o,
 			m.o,
 			reaction.o
 		)
+		return __result
 	}
 
 	/**
@@ -1428,11 +2262,12 @@ public class Chat: SDKObject, @unchecked Sendable {
 	 @param content optional, what the user has typed so far
 	 */
 	public func typing(threadId: String?, content: String?) -> Void {
-		return c_borogove.borogove_chat_typing(
+		let __result = c_borogove.borogove_chat_typing(
 			self.o,
 			threadId,
 			content
 		)
+		return __result
 	}
 
 	/**
@@ -1443,144 +2278,157 @@ public class Chat: SDKObject, @unchecked Sendable {
 	 @param threadId optional, what thread the user has selected if any
 	 */
 	public func setActive(active: Bool, threadId: String?) -> Void {
-		return c_borogove.borogove_chat_set_active(
+		let __result = c_borogove.borogove_chat_set_active(
 			self.o,
 			active,
 			threadId
 		)
+		return __result
 	}
 
 	/**
 	 Archive this chat
 	 */
 	public func close() -> Void {
-		return c_borogove.borogove_chat_close(
+		let __result = c_borogove.borogove_chat_close(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 Pin or unpin this chat
 	 */
 	public func togglePinned() -> Void {
-		return c_borogove.borogove_chat_toggle_pinned(
+		let __result = c_borogove.borogove_chat_toggle_pinned(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 Block this chat so it will not re-open
 	 */
 	public func block(reportSpam: Bool = false, spamMessage: ChatMessage? = nil, onServer: Bool = true) -> Void {
-		return c_borogove.borogove_chat_block(
+		let __result = c_borogove.borogove_chat_block(
 			self.o,
 			reportSpam,
 			spamMessage?.o,
 			onServer
 		)
+		return __result
 	}
 
 	/**
 	 Unblock this chat so it will open again
 	 */
 	public func unblock(onServer: Bool = true) -> Void {
-		return c_borogove.borogove_chat_unblock(
+		let __result = c_borogove.borogove_chat_unblock(
 			self.o,
 			onServer
 		)
+		return __result
 	}
 
 	/**
 	 Update notification preferences
 	 */
 	public func setNotifications(filtered: Bool, mention: Bool, reply: Bool) -> Void {
-		return c_borogove.borogove_chat_set_notifications(
+		let __result = c_borogove.borogove_chat_set_notifications(
 			self.o,
 			filtered,
 			mention,
 			reply
 		)
+		return __result
 	}
 
 	/**
 	 Should notifications be filtered?
 	 */
 	public func notificationsFiltered() -> Bool {
-		return c_borogove.borogove_chat_notifications_filtered(
+		let __result = c_borogove.borogove_chat_notifications_filtered(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 Should a mention produce a notification?
 	 */
 	public func notifyMention() -> Bool {
-		return c_borogove.borogove_chat_notify_mention(
+		let __result = c_borogove.borogove_chat_notify_mention(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 Should a reply produce a notification?
 	 */
 	public func notifyReply() -> Bool {
-		return c_borogove.borogove_chat_notify_reply(
+		let __result = c_borogove.borogove_chat_notify_reply(
 			self.o
 		)
-	}
-
-	/**
-	 An ID of the most recent message in this chat
-	 */
-	public func lastMessageId() -> String? {
-		return useString(c_borogove.borogove_chat_last_message_id(
-			self.o
-		))
+		return __result
 	}
 
 	/**
 	 Get the URI image to represent this Chat, or null
 	 */
 	public func getPhoto() -> String? {
-		return useString(c_borogove.borogove_chat_get_photo(
+		let __result = useString(c_borogove.borogove_chat_get_photo(
 			self.o
 		))
+		return __result
 	}
 
 	/**
 	 Get the URI to a placeholder image to represent this Chat
 	 */
 	public func getPlaceholder() -> String {
-		return useString(c_borogove.borogove_chat_get_placeholder(
+		let __result = useString(c_borogove.borogove_chat_get_placeholder(
 			self.o
 		))!
+		return __result
 	}
 
 	/**
 	 An ID of the last message displayed to the user
 	 */
-	public func readUpTo() -> String? {
-		return useString(c_borogove.borogove_chat_read_up_to(
-			self.o
-		))
+	public func readUpTo() async -> ChatMessage? {
+		return await withUnsafeContinuation { cont in
+		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_chat_read_up_to(
+			self.o,
+			{ (a, ctx) in
+				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<ChatMessage?, Never>
+				cont.resume(returning: (a).map({ ChatMessage($0) }))
+			},
+			__cont_ptr
+		)
+		return __result
+		}
 	}
 
 	/**
 	 The number of message that have not yet been displayed to the user
 	 */
 	public func unreadCount() -> Int32 {
-		return c_borogove.borogove_chat_unread_count(
+		let __result = c_borogove.borogove_chat_unread_count(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 A preview of the chat, such as the most recent message body
 	 */
 	public func preview() -> String {
-		return useString(c_borogove.borogove_chat_preview(
+		let __result = useString(c_borogove.borogove_chat_preview(
 			self.o
 		))!
+		return __result
 	}
 
 	/**
@@ -1589,19 +2437,31 @@ public class Chat: SDKObject, @unchecked Sendable {
 	 @param displayName String to use as display name
 	 */
 	public func setDisplayName(displayName: String) -> Void {
-		return c_borogove.borogove_chat_set_display_name(
+		let __result = c_borogove.borogove_chat_set_display_name(
 			self.o,
 			displayName
 		)
+		return __result
 	}
 
 	/**
 	 The display name of this Chat
 	 */
 	public func getDisplayName() -> String {
-		return useString(c_borogove.borogove_chat_get_display_name(
+		let __result = useString(c_borogove.borogove_chat_get_display_name(
 			self.o
 		))!
+		return __result
+	}
+
+	/**
+	 Tags on this Chat
+	 */
+	public func getTags() -> Array<String> {
+		let __result = {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_chat_get_tags(
+			self.o
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
 	}
 
 	/**
@@ -1610,46 +2470,51 @@ public class Chat: SDKObject, @unchecked Sendable {
 	 @param trusted Bool if trusted or not
 	 */
 	public func setTrusted(trusted: Bool) -> Void {
-		return c_borogove.borogove_chat_set_trusted(
+		let __result = c_borogove.borogove_chat_set_trusted(
 			self.o,
 			trusted
 		)
+		return __result
 	}
 
 	/**
 	 Is this a chat with an entity we trust to see our online status?
 	 */
 	public func isTrusted() -> Bool {
-		return c_borogove.borogove_chat_is_trusted(
+		let __result = c_borogove.borogove_chat_is_trusted(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 @returns if this chat is currently syncing with the server
 	 */
 	public func syncing() -> Bool {
-		return c_borogove.borogove_chat_syncing(
+		let __result = c_borogove.borogove_chat_syncing(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 Can audio calls be started in this Chat?
 	 */
 	public func canAudioCall() -> Bool {
-		return c_borogove.borogove_chat_can_audio_call(
+		let __result = c_borogove.borogove_chat_can_audio_call(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 Can video calls be started in this Chat?
 	 */
 	public func canVideoCall() -> Bool {
-		return c_borogove.borogove_chat_can_video_call(
+		let __result = c_borogove.borogove_chat_can_video_call(
 			self.o
 		)
+		return __result
 	}
 
 	/**
@@ -1659,228 +2524,373 @@ public class Chat: SDKObject, @unchecked Sendable {
 	 @param video do we want video in this call
 	 */
 	public func startCall(audio: Bool, video: Bool) -> Session {
-		return AnySession(c_borogove.borogove_chat_start_call(
+		let __result = AnySession(c_borogove.borogove_chat_start_call(
 			self.o,
 			audio,
 			video
 		)!)
+		return __result
 	}
 
 	/**
 	 Accept any incoming calls in this Chat
 	 */
 	public func acceptCall() -> Void {
-		return c_borogove.borogove_chat_accept_call(
+		let __result = c_borogove.borogove_chat_accept_call(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 Hangup or reject any calls in this chat
 	 */
 	public func hangup() -> Void {
-		return c_borogove.borogove_chat_hangup(
+		let __result = c_borogove.borogove_chat_hangup(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 The current status of a call in this chat
 	 */
 	public func callStatus() -> CallStatus {
-		return c_borogove.borogove_chat_call_status(
+		let __result = c_borogove.borogove_chat_call_status(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 A DTMFSender for a call in this chat, or NULL
 	 */
 	public func dtmf() -> DTMFSender? {
-		return (c_borogove.borogove_chat_dtmf(
+		let __result = (c_borogove.borogove_chat_dtmf(
 			self.o
 		)).map({ DTMFSender($0) })
+		return __result
 	}
 
 	/**
 	 All video tracks in all active calls in this chat
 	 */
 	public func videoTracks() -> Array<MediaStreamTrack> {
-		return {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_video_tracks(
+		let __result = {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_video_tracks(
 			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({MediaStreamTrack($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({MediaStreamTrack($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
 	}
 
 	/**
 	 Get encryption mode for this chat
 	 */
 	public func encryptionMode() -> String {
-		return useString(c_borogove.borogove_chat_encryption_mode(
+		let __result = useString(c_borogove.borogove_chat_encryption_mode(
 			self.o
 		))!
+		return __result
 	}
 
 	/**
 	 Can the user send messages to this chat?
 	 */
 	public func canSend() -> Bool {
-		return c_borogove.borogove_chat_can_send(
+		let __result = c_borogove.borogove_chat_can_send(
+			self.o
+		)
+		return __result
+	}
+
+	/**
+	 Can the user send messages to this chat?
+	 */
+	public func canModerate() -> Bool {
+		let __result = c_borogove.borogove_chat_can_moderate(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 Invite another chat's participants to participate in this one
 	 */
 	public func invite(other: Chat, threadId: String? = nil) -> Void {
-		return c_borogove.borogove_chat_invite(
+		let __result = c_borogove.borogove_chat_invite(
 			self.o,
 			other.o,
 			threadId
 		)
+		return __result
 	}
 
 	/**
 	 Can the user invite others to this chat?
 	 */
 	public func canInvite() -> Bool {
-		return c_borogove.borogove_chat_can_invite(
+		let __result = c_borogove.borogove_chat_can_invite(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 This chat's primary mode of interaction is via commands
 	 */
 	public func isApp() -> Bool {
-		return c_borogove.borogove_chat_is_app(
+		let __result = c_borogove.borogove_chat_is_app(
 			self.o
 		)
+		return __result
 	}
 
 	/**
 	 Does this chat provide a menu of commands?
 	 */
 	public func hasCommands() -> Bool {
-		return c_borogove.borogove_chat_has_commands(
+		let __result = c_borogove.borogove_chat_has_commands(
 			self.o
 		)
+		return __result
 	}
 
+	/**
+	 List commands exposed by this chat
+	 */
 	public func commands() async -> Array<Command> {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_chat_commands(
+		let __result = c_borogove.borogove_chat_commands(
 			self.o,
 			{ (a, a_length, ctx) in
 				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Array<Command>, Never>
-				cont.resume(returning: {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({Command($0!)});c_borogove.borogove_release(a);return __r;}())
+				cont.resume(returning: { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({Command($0!)});c_borogove.borogove_release(a);return __r;}())
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
 	/**
-	 The Participant that originally invited us to this Chat, if we were invited
+	 The Member that originally invited us to this Chat, if we were invited
 	 */
-	public func invitedBy() -> Participant? {
-		return (c_borogove.borogove_chat_invited_by(
-			self.o
-		)).map({ Participant($0) })
+	public func invitedBy() async -> Member {
+		return await withUnsafeContinuation { cont in
+		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_chat_invited_by(
+			self.o,
+			{ (a, ctx) in
+				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Member, Never>
+				cont.resume(returning: Member(a!))
+			},
+			__cont_ptr
+		)
+		return __result
+		}
 	}
 
-	deinit {
-		c_borogove.borogove_release(o)
-	}
 }
 
 public protocol Persistence: SDKObject {
-	func lastId(accountId: String, chatId: String?) async -> String?
+	/**
+	 Get the last message in an account or chat that is is safe to sync forward from
+	 
+	 @param accountId the account whose state should be queried
+	 @param chatId chat to inspect, or null for the account-wide sync point
+	 @returns Promise resolving to the sync point or null
+	 */
+	func syncPoint(accountId: String, chatId: String?) async -> ChatMessage?
 
+	/**
+	 Persist the current metadata for a set of Chats
+	 
+	 @param accountId the account that owns the Chats
+	 @param chats chats to write to storage
+	 */
 	func storeChats(accountId: String, chats: Array<Chat>) -> Void
 
+	/**
+	 Persist one or more messages
+	 
+	 @param accountId the account that owns the messages
+	 @param message messages to store
+	 @returns Promise resolving to the stored message values
+	 */
 	func storeMessages(accountId: String, message: Array<ChatMessage>) async -> Array<ChatMessage>
 
+	/**
+	 Replace the stored record for a message
+	 
+	 @param accountId the account that owns the message
+	 @param message message to write
+	 */
 	func updateMessage(accountId: String, message: ChatMessage) -> Void
 
+	/**
+	 Update delivery state for a locally-created message
+	 
+	 @param accountId the account that owns the message
+	 @param localId local message ID to update
+	 @param status new delivery state
+	 @param statusText optional human-readable status detail
+	 @returns Promise resolving to the updated message
+	 */
 	func updateMessageStatus(accountId: String, localId: String, status: MessageStatus, statusText: String?) async -> ChatMessage
 
+	/**
+	 Find a message by Chat ID and known IDs
+	 
+	 @param accountId the account that owns the message
+	 @param chatId Chat containing the message
+	 @param serverId authoritative server-assigned ID, if known
+	 @param localId client-assigned ID, if known
+	 @returns Promise resolving to the matching message or null
+	 */
 	func getMessage(accountId: String, chatId: String, serverId: String?, localId: String?) async -> ChatMessage?
 
-	func getMessagesBefore(accountId: String, chatId: String, beforeId: String?, beforeTime: String?) async -> Array<ChatMessage>
+	/**
+	 Load messages older than a reference message
+	 
+	 @param accountId the account to load messages for
+	 @param chatId Chat to query
+	 @param before return messages older than this message, or start from the newest when null
+	 @returns Promise resolving to older messages
+	 */
+	func getMessagesBefore(accountId: String, chatId: String, before: ChatMessage?) async -> Array<ChatMessage>
 
-	func getMessagesAfter(accountId: String, chatId: String, afterId: String?, afterTime: String?) async -> Array<ChatMessage>
+	/**
+	 Load messages newer than a reference message
+	 
+	 @param accountId the account to load messages for
+	 @param chatId Chat to query
+	 @param afterId return messages newer than this message, or start from the oldest when null
+	 @returns Promise resolving to newer messages
+	 */
+	func getMessagesAfter(accountId: String, chatId: String, afterId: ChatMessage?) async -> Array<ChatMessage>
 
-	func getMessagesAround(accountId: String, chatId: String, aroundId: String?, aroundTime: String?) async -> Array<ChatMessage>
+	/**
+	 Load messages surrounding a reference message
+	 
+	 @param accountId the account to load messages for
+	 @param around message to center the result set around
+	 @returns Promise resolving to nearby messages
+	 */
+	func getMessagesAround(accountId: String, around: ChatMessage) async -> Array<ChatMessage>
 
+	/**
+	 Check whether a media blob is already stored
+	 
+	 @param hashAlgorithm hash algorithm for the content ID
+	 @param hash raw hash bytes
+	 @returns Promise resolving to true when the media exists
+	 */
 	func hasMedia(hashAlgorithm: String, hash: Array<UInt8>) async -> Bool
 
+	/**
+	 Store media bytes and any metadata needed to retrieve them later
+	 
+	 @param mime MIME type of the media
+	 @param bytes raw media bytes
+	 @returns Promise resolving to true when storage succeeded
+	 */
 	func storeMedia(mime: String, bytes: Array<UInt8>) async -> Bool
 
-	func removeMedia(hashAlgorithm: String, hash: Array<UInt8>) -> Void
+	/**
+	 Delete previously stored media
+	 
+	 @param hashAlgorithm hash algorithm for the content ID
+	 @param hash raw hash bytes
+	 @returns Promise resolving to true when removal succeeded
+	 */
+	func removeMedia(hashAlgorithm: String, hash: Array<UInt8>) async -> Bool
 
-	func storeLogin(login: String, clientId: String, displayName: String, token: String?) -> Void
+	/**
+	 Store login-related state for an account
+	 
+	 @param accountId the account to store login state for
+	 @param clientId negotiated client ID
+	 @param displayName last known display name
+	 @param token persisted token or null to clear it
+	 @returns Promise resolving to true when store succeeded
+	 */
+	func storeLogin(accountId: String, clientId: String, displayName: String, token: String?) async -> Bool
 
-	func removeAccount(accountId: String, completely: Bool) -> Void
+	/**
+	 Remove stored data for an account
+	 
+	 @param accountId the account to remove
+	 @param completely true to delete all account data, false to keep recoverable state
+	 @returns Promise resolving to true when removal succeeded
+	 */
+	func removeAccount(accountId: String, completely: Bool) async -> Bool
 
+	/**
+	 List all accounts present in storage
+	 
+	 @returns Promise resolving to stored account IDs
+	 */
 	func listAccounts() async -> Array<String>
 
 }
 
 public extension Persistence {
-	func lastId(accountId: String, chatId: String?) async -> String? {
+	func syncPoint(accountId: String, chatId: String?) async -> ChatMessage? {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_last_id(
+		let __result = c_borogove.borogove_persistence_sync_point(
 			self.o,
 			accountId,
 			chatId,
 			{ (a, ctx) in
-				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<String?, Never>
-				cont.resume(returning: useString(a))
+				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<ChatMessage?, Never>
+				cont.resume(returning: (a).map({ ChatMessage($0) }))
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
 	func storeChats(accountId: String, chats: Array<Chat>) -> Void {
-		return c_borogove.borogove_persistence_store_chats(
+		let __result = c_borogove.borogove_persistence_store_chats(
 			self.o,
 			accountId,
 			chats.map { $0.o }, chats.count
 		)
+		return __result
 	}
 
 	func storeMessages(accountId: String, message: Array<ChatMessage>) async -> Array<ChatMessage> {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_store_messages(
+		let __result = c_borogove.borogove_persistence_store_messages(
 			self.o,
 			accountId,
 			message.map { $0.o }, message.count,
 			{ (a, a_length, ctx) in
 				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Array<ChatMessage>, Never>
-				cont.resume(returning: {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
+				cont.resume(returning: { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
 	func updateMessage(accountId: String, message: ChatMessage) -> Void {
-		return c_borogove.borogove_persistence_update_message(
+		let __result = c_borogove.borogove_persistence_update_message(
 			self.o,
 			accountId,
 			message.o
 		)
+		return __result
 	}
 
 	func updateMessageStatus(accountId: String, localId: String, status: MessageStatus, statusText: String?) async -> ChatMessage {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_update_message_status(
+		let __result = c_borogove.borogove_persistence_update_message_status(
 			self.o,
 			accountId,
 			localId,
@@ -1892,13 +2902,14 @@ public extension Persistence {
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
 	func getMessage(accountId: String, chatId: String, serverId: String?, localId: String?) async -> ChatMessage? {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_get_message(
+		let __result = c_borogove.borogove_persistence_get_message(
 			self.o,
 			accountId,
 			chatId,
@@ -1910,67 +2921,67 @@ public extension Persistence {
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
-	func getMessagesBefore(accountId: String, chatId: String, beforeId: String?, beforeTime: String?) async -> Array<ChatMessage> {
+	func getMessagesBefore(accountId: String, chatId: String, before: ChatMessage?) async -> Array<ChatMessage> {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_get_messages_before(
+		let __result = c_borogove.borogove_persistence_get_messages_before(
 			self.o,
 			accountId,
 			chatId,
-			beforeId,
-			beforeTime,
+			before?.o,
 			{ (a, a_length, ctx) in
 				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Array<ChatMessage>, Never>
-				cont.resume(returning: {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
+				cont.resume(returning: { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
-	func getMessagesAfter(accountId: String, chatId: String, afterId: String?, afterTime: String?) async -> Array<ChatMessage> {
+	func getMessagesAfter(accountId: String, chatId: String, afterId: ChatMessage?) async -> Array<ChatMessage> {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_get_messages_after(
+		let __result = c_borogove.borogove_persistence_get_messages_after(
 			self.o,
 			accountId,
 			chatId,
-			afterId,
-			afterTime,
+			afterId?.o,
 			{ (a, a_length, ctx) in
 				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Array<ChatMessage>, Never>
-				cont.resume(returning: {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
+				cont.resume(returning: { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
-	func getMessagesAround(accountId: String, chatId: String, aroundId: String?, aroundTime: String?) async -> Array<ChatMessage> {
+	func getMessagesAround(accountId: String, around: ChatMessage) async -> Array<ChatMessage> {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_get_messages_around(
+		let __result = c_borogove.borogove_persistence_get_messages_around(
 			self.o,
 			accountId,
-			chatId,
-			aroundId,
-			aroundTime,
+			around.o,
 			{ (a, a_length, ctx) in
 				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Array<ChatMessage>, Never>
-				cont.resume(returning: {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
+				cont.resume(returning: { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a, count: a_length).map({ChatMessage($0!)});c_borogove.borogove_release(a);return __r;}())
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
 	func hasMedia(hashAlgorithm: String, hash: Array<UInt8>) async -> Bool {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_has_media(
+		let __result = c_borogove.borogove_persistence_has_media(
 			self.o,
 			hashAlgorithm,
 			hash, hash.count,
@@ -1980,13 +2991,14 @@ public extension Persistence {
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
 	func storeMedia(mime: String, bytes: Array<UInt8>) async -> Bool {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_store_media(
+		let __result = c_borogove.borogove_persistence_store_media(
 			self.o,
 			mime,
 			bytes, bytes.count,
@@ -1996,46 +3008,75 @@ public extension Persistence {
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
-	func removeMedia(hashAlgorithm: String, hash: Array<UInt8>) -> Void {
-		return c_borogove.borogove_persistence_remove_media(
+	func removeMedia(hashAlgorithm: String, hash: Array<UInt8>) async -> Bool {
+		return await withUnsafeContinuation { cont in
+		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_persistence_remove_media(
 			self.o,
 			hashAlgorithm,
-			hash, hash.count
+			hash, hash.count,
+			{ (a, ctx) in
+				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Bool, Never>
+				cont.resume(returning: a)
+			},
+			__cont_ptr
 		)
+		return __result
+		}
 	}
 
-	func storeLogin(login: String, clientId: String, displayName: String, token: String?) -> Void {
-		return c_borogove.borogove_persistence_store_login(
+	func storeLogin(accountId: String, clientId: String, displayName: String, token: String?) async -> Bool {
+		return await withUnsafeContinuation { cont in
+		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_persistence_store_login(
 			self.o,
-			login,
+			accountId,
 			clientId,
 			displayName,
-			token
+			token,
+			{ (a, ctx) in
+				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Bool, Never>
+				cont.resume(returning: a)
+			},
+			__cont_ptr
 		)
+		return __result
+		}
 	}
 
-	func removeAccount(accountId: String, completely: Bool) -> Void {
-		return c_borogove.borogove_persistence_remove_account(
+	func removeAccount(accountId: String, completely: Bool) async -> Bool {
+		return await withUnsafeContinuation { cont in
+		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_persistence_remove_account(
 			self.o,
 			accountId,
-			completely
+			completely,
+			{ (a, ctx) in
+				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Bool, Never>
+				cont.resume(returning: a)
+			},
+			__cont_ptr
 		)
+		return __result
+		}
 	}
 
 	func listAccounts() async -> Array<String> {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_list_accounts(
+		let __result = c_borogove.borogove_persistence_list_accounts(
 			self.o,
 			{ (a, a_length, ctx) in
 				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Array<String>, Never>
-				cont.resume(returning: {let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: a, count: a_length).map({useString($0)!});c_borogove.borogove_release(a);return __r;}())
+				cont.resume(returning: { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: a, count: a_length).map({useString($0)!});c_borogove.borogove_release(a);return __r;}())
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
@@ -2059,13 +3100,14 @@ public class Sqlite: SDKObject, KeyValueStore, Persistence, @unchecked Sendable
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	/**
 	 Create a basic persistence layer based on sqlite
 	 
 	 @param dbfile path to sqlite database
-	 @params media a MediaStore to use for media
+	 @param media a MediaStore to use for media
 	 @returns new persistence layer
 	 */
 	public init(dbfile: String, media: MediaStore) {
@@ -2084,7 +3126,7 @@ public class Sqlite: SDKObject, KeyValueStore, Persistence, @unchecked Sendable
 	public func getMessage(accountId: String, chatId: String, serverId: String?, localId: String?) async -> ChatMessage? {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_sqlite_get_message(
+		let __result = c_borogove.borogove_persistence_sqlite_get_message(
 			self.o,
 			accountId,
 			chatId,
@@ -2096,39 +3138,7 @@ public class Sqlite: SDKObject, KeyValueStore, Persistence, @unchecked Sendable
 			},
 			__cont_ptr
 		)
-		}
-	}
-
-	/**
-	 Remove an account from storage
-	 
-	 @param accountId the account to remove
-	 @param completely if message history, etc should be removed also
-	 */
-	public func removeAccount(accountId: String, completely: Bool) -> Void {
-		return c_borogove.borogove_persistence_sqlite_remove_account(
-			self.o,
-			accountId,
-			completely
-		)
-	}
-
-	/**
-	 List all known accounts
-	 
-	 @returns Promise resolving to array of account IDs
-	 */
-	public func listAccounts() async -> Array<String> {
-		return await withUnsafeContinuation { cont in
-		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_persistence_sqlite_list_accounts(
-			self.o,
-			{ (a, a_length, ctx) in
-				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Array<String>, Never>
-				cont.resume(returning: {let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: a, count: a_length).map({useString($0)!});c_borogove.borogove_release(a);return __r;}())
-			},
-			__cont_ptr
-		)
+		return __result
 		}
 	}
 
@@ -2142,18 +3152,29 @@ public class FormSubmitBuilder: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
+	/**
+	 Create a new empty form submission
+	 */
 	public init() {
 		o = (c_borogove.borogove_form_submit_builder_new())
 	}
 
+	/**
+	 Add a submitted value for a field.
+	 
+	 @param k field name
+	 @param v value to submit for that field
+	 */
 	public func add(k: String, v: String) -> Void {
-		return c_borogove.borogove_form_submit_builder_add(
+		let __result = c_borogove.borogove_form_submit_builder_add(
 			self.o,
 			k,
 			v
 		)
+		return __result
 	}
 
 	deinit {
@@ -2166,9 +3187,12 @@ public class ChatMessageBuilder: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	/**
+	 Create a new message builder
+	 
 	 @returns a new blank ChatMessageBuilder
 	 */
 	public init() {
@@ -2276,24 +3300,12 @@ public class ChatMessageBuilder: SDKObject, @unchecked Sendable {
 	 */
 	public var attachments: Array<ChatAttachment> {
 		get {
-			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_message_builder_attachments(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({ChatAttachment($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
-		}
-	}
-
-	/**
-	 Body text of this message or NULL
-	 */
-	public var text: String? {
-		get {
-			useString(c_borogove.borogove_chat_message_builder_text(o))
-		}
-		set {
-			c_borogove.borogove_chat_message_builder_set_text(o, newValue)
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_message_builder_attachments(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({ChatAttachment($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
 		}
 	}
 
 	/**
-	 Language code for the body text
+	 Language code for the body
 	 */
 	public var lang: String? {
 		get {
@@ -2320,239 +3332,134 @@ public class ChatMessageBuilder: SDKObject, @unchecked Sendable {
 	 Status of this message
 	 */
 	public var status: MessageStatus {
-		get {
-			c_borogove.borogove_chat_message_builder_status(o)
-		}
-		set {
-			c_borogove.borogove_chat_message_builder_set_status(o, newValue)
-		}
-	}
-
-	/**
-	 Human readable text to go with the status
-	 */
-	public var statusText: String? {
-		get {
-			useString(c_borogove.borogove_chat_message_builder_status_text(o))
-		}
-		set {
-			c_borogove.borogove_chat_message_builder_set_status_text(o, newValue)
-		}
-	}
-
-	/**
-	 Array of past versions of this message, if it has been edited
-	 */
-	public var versions: Array<ChatMessage> {
-		get {
-			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_message_builder_versions(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({ChatMessage($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
-		}
-		set {
-			c_borogove.borogove_chat_message_builder_set_versions(o, newValue.map { $0.o }, newValue.count)
-		}
-	}
-
-	/**
-	 Information about the encryption used by the sender of
-	 this message.
-	 */
-	public var encryption: EncryptionInfo? {
-		get {
-			(c_borogove.borogove_chat_message_builder_encryption(o)).map({ EncryptionInfo($0) })
-		}
-		set {
-			c_borogove.borogove_chat_message_builder_set_encryption(o, newValue?.o)
-		}
-	}
-
-	/**
-	 Add an attachment to this message
-	 
-	 @param attachment The ChatAttachment to add
-	 */
-	public func addAttachment(attachment: ChatAttachment) -> Void {
-		return c_borogove.borogove_chat_message_builder_add_attachment(
-			self.o,
-			attachment.o
-		)
-	}
-
-	/**
-	 Set rich text using an HTML string
-	 Also sets the plain text body appropriately
-	 */
-	public func setHtml(html: String) -> Void {
-		return c_borogove.borogove_chat_message_builder_set_html(
-			self.o,
-			html
-		)
-	}
-
-	/**
-	 The ID of the Chat this message is associated with
-	 */
-	public func chatId() -> String {
-		return useString(c_borogove.borogove_chat_message_builder_chat_id(
-			self.o
-		))!
-	}
-
-	/**
-	 The ID of the sender of this message
-	 */
-	public func get_senderId() -> String {
-		return useString(c_borogove.borogove_chat_message_builder_get_sender_id(
-			self.o
-		))!
-	}
-
-	/**
-	 Build this builder into an immutable ChatMessage
-	 
-	 @returns the ChatMessage
-	 */
-	public func build() -> ChatMessage {
-		return ChatMessage(c_borogove.borogove_chat_message_builder_build(
-			self.o
-		)!)
-	}
-
-	deinit {
-		c_borogove.borogove_release(o)
-	}
-}
-
-public class ProfileItem: SDKObject, @unchecked Sendable {
-	public let o: UnsafeMutableRawPointer
-
-	internal init(_ ptr: UnsafeMutableRawPointer) {
-		o = ptr
-	}
-
-	public var id: String {
-		get {
-			useString(c_borogove.borogove_profile_item_id(o))!
-		}
-	}
-
-	public var key: String {
-		get {
-			useString(c_borogove.borogove_profile_item_key(o))!
-		}
-	}
-
-	public func parameters() -> Array<ProfileItem> {
-		return {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_profile_item_parameters(
-			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({ProfileItem($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
-	}
-
-	public func text() -> Array<String> {
-		return {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_profile_item_text(
-			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
-	}
-
-	public func uri() -> Array<String> {
-		return {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_profile_item_uri(
-			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
-	}
-
-	public func date() -> Array<String> {
-		return {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_profile_item_date(
-			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
-	}
-
-	public func time() -> Array<String> {
-		return {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_profile_item_time(
-			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
-	}
-
-	public func datetime() -> Array<String> {
-		return {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_profile_item_datetime(
-			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
-	}
-
-	public func languageTag() -> Array<String> {
-		return {var __ret: UnsafeMutablePointer<UnsafePointer<CChar>?>? = nil;let __ret_length = c_borogove.borogove_profile_item_language_tag(
-			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: __ret, count: __ret_length).map({useString($0)!});c_borogove.borogove_release(__ret);return __r;}();}()
-	}
-
-	deinit {
-		c_borogove.borogove_release(o)
-	}
-}
-
-public class Profile: SDKObject, @unchecked Sendable {
-	public let o: UnsafeMutableRawPointer
-
-	internal init(_ ptr: UnsafeMutableRawPointer) {
-		o = ptr
+		get {
+			c_borogove.borogove_chat_message_builder_status(o)
+		}
+		set {
+			c_borogove.borogove_chat_message_builder_set_status(o, newValue)
+		}
 	}
 
 	/**
-	 All items in the profile
+	 Human readable text to go with the status
 	 */
-	public var items: Array<ProfileItem> {
+	public var statusText: String? {
 		get {
-			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_profile_items(o, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({ProfileItem($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+			useString(c_borogove.borogove_chat_message_builder_status_text(o))
+		}
+		set {
+			c_borogove.borogove_chat_message_builder_set_status_text(o, newValue)
 		}
 	}
 
-	deinit {
-		c_borogove.borogove_release(o)
-	}
-}
-
-public class Participant: SDKObject, @unchecked Sendable {
-	public let o: UnsafeMutableRawPointer
-
-	internal init(_ ptr: UnsafeMutableRawPointer) {
-		o = ptr
-	}
-
-	public var displayName: String {
+	/**
+	 Array of past versions of this message, if it has been edited
+	 */
+	public var versions: Array<ChatMessage> {
 		get {
-			useString(c_borogove.borogove_participant_display_name(o))!
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_message_builder_versions(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({ChatMessage($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		}
+		set {
+			c_borogove.borogove_chat_message_builder_set_versions(o, newValue.map { $0.o }, newValue.count)
 		}
 	}
 
-	public var photoUri: String? {
+	/**
+	 Information about the encryption used by the sender of
+	 this message.
+	 */
+	public var encryption: EncryptionInfo? {
 		get {
-			useString(c_borogove.borogove_participant_photo_uri(o))
+			(c_borogove.borogove_chat_message_builder_encryption(o)).map({ EncryptionInfo($0) })
+		}
+		set {
+			c_borogove.borogove_chat_message_builder_set_encryption(o, newValue?.o)
 		}
 	}
 
-	public var placeholderUri: String {
+	/**
+	 Metadata about links associated with this message
+	 */
+	public var linkMetadata: Array<LinkMetadata> {
 		get {
-			useString(c_borogove.borogove_participant_placeholder_uri(o))!
+			{var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_chat_message_builder_link_metadata(o, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({LinkMetadata($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		}
+		set {
+			c_borogove.borogove_chat_message_builder_set_link_metadata(o, newValue.map { $0.o }, newValue.count)
 		}
 	}
 
-	public var isSelf: Bool {
-		get {
-			c_borogove.borogove_participant_is_self(o)
-		}
+	/**
+	 Add an attachment to this message
+	 
+	 @param attachment The ChatAttachment to add
+	 */
+	public func addAttachment(attachment: ChatAttachment) -> Void {
+		let __result = c_borogove.borogove_chat_message_builder_add_attachment(
+			self.o,
+			attachment.o
+		)
+		return __result
 	}
 
-	public func profile(client: Client) async -> Profile {
-		return await withUnsafeContinuation { cont in
-		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_participant_profile(
+	/**
+	 Set body from Html
+	 
+	 @param html rich text body to attach to the message
+	 */
+	public func setBody(html: Html?) -> Void {
+		let __result = c_borogove.borogove_chat_message_builder_set_body(
 			self.o,
-			client.o,
-			{ (a, ctx) in
-				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Profile, Never>
-				cont.resume(returning: Profile(a!))
-			},
-			__cont_ptr
+			html?.o
 		)
-		}
+		return __result
+	}
+
+	/**
+	 Set subject of this message
+	 */
+	public func setSubject(subject: String?) -> Void {
+		let __result = c_borogove.borogove_chat_message_builder_set_subject(
+			self.o,
+			subject
+		)
+		return __result
+	}
+
+	/**
+	 The ID of the Chat this message is associated with
+	 
+	 @returns Chat ID for this message
+	 */
+	public func chatId() -> String {
+		let __result = useString(c_borogove.borogove_chat_message_builder_chat_id(
+			self.o
+		))!
+		return __result
+	}
+
+	/**
+	 The ID of the sender of this message
+	 
+	 @returns sender ID for this message
+	 */
+	public func get_senderId() -> String {
+		let __result = useString(c_borogove.borogove_chat_message_builder_get_sender_id(
+			self.o
+		))!
+		return __result
+	}
+
+	/**
+	 Build this builder into an immutable ChatMessage
+	 
+	 @returns the ChatMessage
+	 */
+	public func build() -> ChatMessage {
+		let __result = ChatMessage(c_borogove.borogove_chat_message_builder_build(
+			self.o
+		)!)
+		return __result
 	}
 
 	deinit {
@@ -2565,6 +3472,7 @@ public class Dummy: SDKObject, Persistence, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	/**
@@ -2586,6 +3494,7 @@ public class Push: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	/**
@@ -2612,6 +3521,7 @@ public class Notification: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	/**
@@ -2727,84 +3637,12 @@ public class Notification: SDKObject, @unchecked Sendable {
 	}
 }
 
-public class EventEmitter: SDKObject, @unchecked Sendable {
-	public let o: UnsafeMutableRawPointer
-
-	internal init(_ ptr: UnsafeMutableRawPointer) {
-		o = ptr
-	}
-
-	/**
-	 Remove an event listener of any type, no matter how it was added
-	 or what event it is for.
-	 
-	 @param token the token that was returned when the listener was added
-	 */
-	public func removeEventListener(token: Int32) -> Void {
-		return c_borogove.borogove_event_emitter_remove_event_listener(
-			self.o,
-			token
-		)
-	}
-
-	deinit {
-		c_borogove.borogove_release(o)
-	}
-}
-
-public class AvailableChat: SDKObject, @unchecked Sendable {
-	public let o: UnsafeMutableRawPointer
-
-	internal init(_ ptr: UnsafeMutableRawPointer) {
-		o = ptr
-	}
-
-	/**
-	 The ID of the Chat this search result represents
-	 */
-	public var chatId: String {
-		get {
-			useString(c_borogove.borogove_available_chat_chat_id(o))!
-		}
-	}
-
-	/**
-	 The display name of this search result
-	 */
-	public var displayName: String? {
-		get {
-			useString(c_borogove.borogove_available_chat_display_name(o))
-		}
-	}
-
-	/**
-	 A human-readable note associated with this search result
-	 */
-	public var note: String {
-		get {
-			useString(c_borogove.borogove_available_chat_note(o))!
-		}
-	}
-
-	/**
-	 Is this search result a channel?
-	 */
-	public func isChannel() -> Bool {
-		return c_borogove.borogove_available_chat_is_channel(
-			self.o
-		)
-	}
-
-	deinit {
-		c_borogove.borogove_release(o)
-	}
-}
-
 public class MediaStream: SDKObject, @unchecked Sendable {
 	public let o: UnsafeMutableRawPointer
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	public init() {
@@ -2820,16 +3658,18 @@ public class MediaStream: SDKObject, @unchecked Sendable {
 	}
 
 	public func addTrack(track: MediaStreamTrack) -> Void {
-		return c_borogove.borogove_calls_media_stream_add_track(
+		let __result = c_borogove.borogove_calls_media_stream_add_track(
 			self.o,
 			track.o
 		)
+		return __result
 	}
 
 	public func getTracks() -> Array<MediaStreamTrack> {
-		return {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_calls_media_stream_get_tracks(
+		let __result = {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_calls_media_stream_get_tracks(
 			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({MediaStreamTrack($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({MediaStreamTrack($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
 	}
 
 	deinit {
@@ -2876,46 +3716,53 @@ public extension Session {
 	}
 
 	func accept() -> Void {
-		return c_borogove.borogove_calls_session_accept(
+		let __result = c_borogove.borogove_calls_session_accept(
 			self.o
 		)
+		return __result
 	}
 
 	func hangup() -> Void {
-		return c_borogove.borogove_calls_session_hangup(
+		let __result = c_borogove.borogove_calls_session_hangup(
 			self.o
 		)
+		return __result
 	}
 
 	func addMedia(streams: Array<MediaStream>) -> Void {
-		return c_borogove.borogove_calls_session_add_media(
+		let __result = c_borogove.borogove_calls_session_add_media(
 			self.o,
 			streams.map { $0.o }, streams.count
 		)
+		return __result
 	}
 
 	func callStatus() -> CallStatus {
-		return c_borogove.borogove_calls_session_call_status(
+		let __result = c_borogove.borogove_calls_session_call_status(
 			self.o
 		)
+		return __result
 	}
 
 	func audioTracks() -> Array<MediaStreamTrack> {
-		return {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_calls_session_audio_tracks(
+		let __result = {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_calls_session_audio_tracks(
 			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({MediaStreamTrack($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({MediaStreamTrack($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
 	}
 
 	func videoTracks() -> Array<MediaStreamTrack> {
-		return {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_calls_session_video_tracks(
+		let __result = {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_calls_session_video_tracks(
 			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({MediaStreamTrack($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({MediaStreamTrack($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
 	}
 
 	func dtmf() -> DTMFSender? {
-		return (c_borogove.borogove_calls_session_dtmf(
+		let __result = (c_borogove.borogove_calls_session_dtmf(
 			self.o
 		)).map({ DTMFSender($0) })
+		return __result
 	}
 
 }
@@ -2938,13 +3785,15 @@ public class InitiatedSession: SDKObject, Session, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	public func supplyMedia(streams: Array<MediaStream>) -> Void {
-		return c_borogove.borogove_calls_initiated_session_supply_media(
+		let __result = c_borogove.borogove_calls_initiated_session_supply_media(
 			self.o,
 			streams.map { $0.o }, streams.count
 		)
+		return __result
 	}
 
 	deinit {
@@ -2971,9 +3820,10 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 Start this client running and trying to connect to the server
 	 */
 	public func start() -> Void {
-		return c_borogove.borogove_client_start(
+		let __result = c_borogove.borogove_client_start(
 			self.o
 		)
+		return __result
 	}
 
 	/**
@@ -2984,7 +3834,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	public func startOffline() async -> Bool {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_client_start_offline(
+		let __result = c_borogove.borogove_client_start_offline(
 			self.o,
 			{ (a, ctx) in
 				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Bool, Never>
@@ -2992,6 +3842,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
@@ -3001,10 +3852,11 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 @param completely if true chats, messages, etc will be deleted as well
 	 */
 	public func logout(completely: Bool) -> Void {
-		return c_borogove.borogove_client_logout(
+		let __result = c_borogove.borogove_client_logout(
 			self.o,
 			completely
 		)
+		return __result
 	}
 
 	/**
@@ -3013,10 +3865,11 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 @param password
 	 */
 	public func usePassword(password: String) -> Void {
-		return c_borogove.borogove_client_use_password(
+		let __result = c_borogove.borogove_client_use_password(
 			self.o,
 			password
 		)
+		return __result
 	}
 
 	/**
@@ -3025,9 +3878,10 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 @returns account id
 	 */
 	public func accountId() -> String {
-		return useString(c_borogove.borogove_client_account_id(
+		let __result = useString(c_borogove.borogove_client_account_id(
 			self.o
 		))!
+		return __result
 	}
 
 	/**
@@ -3036,9 +3890,10 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 @returns display name
 	 */
 	public func displayName() -> String {
-		return useString(c_borogove.borogove_client_display_name(
+		let __result = useString(c_borogove.borogove_client_display_name(
 			self.o
 		))!
+		return __result
 	}
 
 	/**
@@ -3048,11 +3903,29 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 @param publicAccess set the access for the profile to public
 	 */
 	public func setProfile(profile: ProfileBuilder, publicAccess: Bool) -> Void {
-		return c_borogove.borogove_client_set_profile(
+		let __result = c_borogove.borogove_client_set_profile(
 			self.o,
 			profile.o,
 			publicAccess
 		)
+		return __result
+	}
+
+	/**
+	 Publish an account status/activity item.
+	 
+	 @param status status payload to publish
+	 @param expires expiration in seconds for the published item
+	 @param publicAccess when true, make the item world-readable
+	 */
+	public func setStatus(status: Status, expires: Int32 = 86400, publicAccess: Bool = false) -> Void {
+		let __result = c_borogove.borogove_client_set_status(
+			self.o,
+			status.o,
+			expires,
+			publicAccess
+		)
+		return __result
 	}
 
 	/**
@@ -3064,7 +3937,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	public func prepareAttachment(source: AttachmentSource) async -> ChatAttachment? {
 		return await withUnsafeContinuation { cont in
 		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
-		return c_borogove.borogove_client_prepare_attachment(
+		let __result = c_borogove.borogove_client_prepare_attachment(
 			self.o,
 			source.o,
 			{ (a, ctx) in
@@ -3073,6 +3946,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 			},
 			__cont_ptr
 		)
+		return __result
 		}
 	}
 
@@ -3080,28 +3954,42 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 @returns array of open chats, sorted by last activity
 	 */
 	public func getChats() -> Array<Chat> {
-		return {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_client_get_chats(
+		let __result = {var __ret: UnsafeMutablePointer<UnsafeMutableRawPointer?>? = nil;let __ret_length = c_borogove.borogove_client_get_chats(
 			self.o
-		, &__ret);return {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({Chat($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		, &__ret);return { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: __ret, count: __ret_length).map({Chat($0!)});c_borogove.borogove_release(__ret);return __r;}();}()
+		return __result
 	}
 
 	/**
 	 Search for chats the user can start or join
 	 
 	 @param q the search query to use
-	 @param callback takes two arguments, the query that was used and the array of results, and returns true if we should stop searching
+	 @returns an async iterator of AvailableChat matching the query
 	 */
-	public func findAvailableChats(q: String, callback: @Sendable @escaping (String, Array<AvailableChat>)->Bool) -> Void {
-		let __callback_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(callback as AnyObject).toOpaque())
-		return c_borogove.borogove_client_find_available_chats(
+	public func findAvailableChats(q: String) -> AvailableChatIterator {
+		let __result = AvailableChatIterator(c_borogove.borogove_client_find_available_chats(
 			self.o,
-			q,
-			{ (a0, a1, a1_length, ctx) in
-				let callback = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (String, Array<AvailableChat>)->Bool
-				return callback(useString(a0)!, {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a1, count: a1_length).map({AvailableChat($0!)});c_borogove.borogove_release(a1);return __r;}())
+			q
+		)!)
+		return __result
+	}
+
+	/**
+	 List of human-readable strings of things supports by findAvailableChats
+	 */
+	public func availableChatSources() async -> Array<String> {
+		return await withUnsafeContinuation { cont in
+		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_client_available_chat_sources(
+			self.o,
+			{ (a, a_length, ctx) in
+				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<Array<String>, Never>
+				cont.resume(returning: { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: a, count: a_length).map({useString($0)!});c_borogove.borogove_release(a);return __r;}())
 			},
-			__callback_ptr
+			__cont_ptr
 		)
+		return __result
+		}
 	}
 
 	/**
@@ -3110,10 +3998,11 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 @returns the chat that was started
 	 */
 	public func startChat(availableChat: AvailableChat) -> Chat {
-		return Chat(c_borogove.borogove_client_start_chat(
+		let __result = Chat(c_borogove.borogove_client_start_chat(
 			self.o,
 			availableChat.o
 		)!)
+		return __result
 	}
 
 	/**
@@ -3122,10 +4011,11 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 @returns the chat if known, or NULL
 	 */
 	public func getChat(chatId: String) -> Chat? {
-		return (c_borogove.borogove_client_get_chat(
+		let __result = (c_borogove.borogove_client_get_chat(
 			self.o,
 			chatId
 		)).map({ Chat($0) })
+		return __result
 	}
 
 	/**
@@ -3140,7 +4030,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 @param claims Optional additional JWT claims as key then value
 	 */
 	public func enablePush(push_service: String, endpoint: String, p256dh: Array<UInt8>, auth: Array<UInt8>, grace: Int32, vapid_private_pkcs8: Array<UInt8>? = nil, claims: Array<String>? = nil) -> Void {
-		withOptionalArrayOfCStrings(claims) { __claims in return c_borogove.borogove_client_enable_push(
+		withOptionalArrayOfCStrings(claims) { __claims in let __result = c_borogove.borogove_client_enable_push(
 			self.o,
 			push_service,
 			endpoint,
@@ -3149,7 +4039,8 @@ public class Client: EventEmitter, @unchecked Sendable {
 			grace,
 			vapid_private_pkcs8, vapid_private_pkcs8?.count ?? 0,
 			__claims, claims?.count ?? 0
-		)}
+		)
+		return __result}
 	}
 
 	/**
@@ -3160,7 +4051,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addPasswordNeededListener(handler: @Sendable @escaping (Client)->Void) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_password_needed_listener(
+		let __result = c_borogove.borogove_client_add_password_needed_listener(
 			self.o,
 			{ (a0, ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (Client)->Void
@@ -3168,6 +4059,9 @@ public class Client: EventEmitter, @unchecked Sendable {
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
@@ -3178,7 +4072,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addStatusOnlineListener(handler: @Sendable @escaping ()->Void) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_status_online_listener(
+		let __result = c_borogove.borogove_client_add_status_online_listener(
 			self.o,
 			{ (ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable ()->Void
@@ -3186,6 +4080,9 @@ public class Client: EventEmitter, @unchecked Sendable {
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
@@ -3196,7 +4093,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addStatusOfflineListener(handler: @Sendable @escaping ()->Void) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_status_offline_listener(
+		let __result = c_borogove.borogove_client_add_status_offline_listener(
 			self.o,
 			{ (ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable ()->Void
@@ -3204,6 +4101,9 @@ public class Client: EventEmitter, @unchecked Sendable {
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
@@ -3214,7 +4114,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addConnectionFailedListener(handler: @Sendable @escaping ()->Void) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_connection_failed_listener(
+		let __result = c_borogove.borogove_client_add_connection_failed_listener(
 			self.o,
 			{ (ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable ()->Void
@@ -3222,6 +4122,9 @@ public class Client: EventEmitter, @unchecked Sendable {
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
@@ -3232,14 +4135,17 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addTlsCheckListener(handler: @Sendable @escaping (String, Array<String>)->Bool) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_tls_check_listener(
+		let __result = c_borogove.borogove_client_add_tls_check_listener(
 			self.o,
 			{ (a0, a1, a1_length, ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (String, Array<String>)->Bool
-				return handler(useString(a0)!, {let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: a1, count: a1_length).map({useString($0)!});c_borogove.borogove_release(a1);return __r;}())
+				return handler(useString(a0)!, { let __r = UnsafeMutableBufferPointer<UnsafePointer<CChar>?>(start: a1, count: a1_length).map({useString($0)!});c_borogove.borogove_release(a1);return __r;}())
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
@@ -3252,7 +4158,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addChatMessageListener(handler: @Sendable @escaping (ChatMessage, Int32)->Void) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_chat_message_listener(
+		let __result = c_borogove.borogove_client_add_chat_message_listener(
 			self.o,
 			{ (a0, a1, ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (ChatMessage, Int32)->Void
@@ -3260,6 +4166,9 @@ public class Client: EventEmitter, @unchecked Sendable {
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
@@ -3271,7 +4180,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addSyncMessageListener(handler: @Sendable @escaping (ChatMessage)->Void) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_sync_message_listener(
+		let __result = c_borogove.borogove_client_add_sync_message_listener(
 			self.o,
 			{ (a0, ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (ChatMessage)->Void
@@ -3279,6 +4188,9 @@ public class Client: EventEmitter, @unchecked Sendable {
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
@@ -3289,14 +4201,17 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addChatsUpdatedListener(handler: @Sendable @escaping (Array<Chat>)->Void) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_chats_updated_listener(
+		let __result = c_borogove.borogove_client_add_chats_updated_listener(
 			self.o,
 			{ (a0, a0_length, ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (Array<Chat>)->Void
-				return handler({let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a0, count: a0_length).map({Chat($0!)});c_borogove.borogove_release(a0);return __r;}())
+				return handler({ let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a0, count: a0_length).map({Chat($0!)});c_borogove.borogove_release(a0);return __r;}())
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
@@ -3307,7 +4222,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addCallRingListener(handler: @Sendable @escaping (Session)->Void) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_call_ring_listener(
+		let __result = c_borogove.borogove_client_add_call_ring_listener(
 			self.o,
 			{ (a0, ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (Session)->Void
@@ -3315,6 +4230,9 @@ public class Client: EventEmitter, @unchecked Sendable {
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
@@ -3325,7 +4243,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addCallRetractListener(handler: @Sendable @escaping (String, String)->Void) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_call_retract_listener(
+		let __result = c_borogove.borogove_client_add_call_retract_listener(
 			self.o,
 			{ (a0, a1, ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (String, String)->Void
@@ -3333,6 +4251,9 @@ public class Client: EventEmitter, @unchecked Sendable {
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
@@ -3343,7 +4264,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addCallRingingListener(handler: @Sendable @escaping (Session)->Void) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_call_ringing_listener(
+		let __result = c_borogove.borogove_client_add_call_ringing_listener(
 			self.o,
 			{ (a0, ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (Session)->Void
@@ -3351,6 +4272,9 @@ public class Client: EventEmitter, @unchecked Sendable {
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
@@ -3361,7 +4285,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addCallUpdateStatusListener(handler: @Sendable @escaping (InitiatedSession)->Void) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_call_update_status_listener(
+		let __result = c_borogove.borogove_client_add_call_update_status_listener(
 			self.o,
 			{ (a0, ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (InitiatedSession)->Void
@@ -3369,6 +4293,9 @@ public class Client: EventEmitter, @unchecked Sendable {
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
@@ -3381,7 +4308,7 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addCallMediaListener(handler: @Sendable @escaping (InitiatedSession, Bool, Bool)->Void) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_call_media_listener(
+		let __result = c_borogove.borogove_client_add_call_media_listener(
 			self.o,
 			{ (a0, a1, a2, ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (InitiatedSession, Bool, Bool)->Void
@@ -3389,6 +4316,9 @@ public class Client: EventEmitter, @unchecked Sendable {
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
@@ -3400,32 +4330,37 @@ public class Client: EventEmitter, @unchecked Sendable {
 	 */
 	public func addCallTrackListener(handler: @Sendable @escaping (InitiatedSession, MediaStreamTrack, Array<MediaStream>)->Void) -> Int32 {
 		let __handler_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(handler as AnyObject).toOpaque())
-		return c_borogove.borogove_client_add_call_track_listener(
+		let __result = c_borogove.borogove_client_add_call_track_listener(
 			self.o,
 			{ (a0, a1, a2, a2_length, ctx) in
 				let handler = Unmanaged<AnyObject>.fromOpaque(ctx!).takeUnretainedValue() as! @Sendable (InitiatedSession, MediaStreamTrack, Array<MediaStream>)->Void
-				return handler(InitiatedSession(a0!), MediaStreamTrack(a1!), {let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a2, count: a2_length).map({MediaStream($0!)});c_borogove.borogove_release(a2);return __r;}())
+				return handler(InitiatedSession(a0!), MediaStreamTrack(a1!), { let __r = UnsafeMutableBufferPointer<UnsafeMutableRawPointer?>(start: a2, count: a2_length).map({MediaStream($0!)});c_borogove.borogove_release(a2);return __r;}())
 			},
 			__handler_ptr
 		)
+		EventEmitter.__contextLifetime[__result] = __handler_ptr
+		contextLifetime[o] = (contextLifetime[o] ?? []) + [__handler_ptr]
+		return __result
 	}
 
 	/**
 	 Let the SDK know the UI is in the foreground
 	 */
 	public func setInForeground() -> Void {
-		return c_borogove.borogove_client_set_in_foreground(
+		let __result = c_borogove.borogove_client_set_in_foreground(
 			self.o
 		)
+		return __result
 	}
 
 	/**
-	 Let the SDK know the UI is in the foreground
+	 Let the SDK know the UI is not in the foreground
 	 */
 	public func setNotInForeground() -> Void {
-		return c_borogove.borogove_client_set_not_in_foreground(
+		let __result = c_borogove.borogove_client_set_not_in_foreground(
 			self.o
 		)
+		return __result
 	}
 
 }
@@ -3435,8 +4370,15 @@ public class AttachmentSource: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
+	/**
+	 Create an attachment source from a local file path and MIME type.
+	 
+	 @param path path to the local file
+	 @param mime MIME type to advertise for the upload
+	 */
 	public init(path: String, mime: String) {
 		o = (c_borogove.borogove_attachment_source_new(path, mime))
 	}
@@ -3475,8 +4417,12 @@ public class ProfileBuilder: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
+	/**
+	 Create a mutable builder from an existing profile.
+	 */
 	public init(profile: Profile) {
 		o = (c_borogove.borogove_profile_builder_new(profile.o))
 	}
@@ -3485,22 +4431,24 @@ public class ProfileBuilder: SDKObject, @unchecked Sendable {
 	 Add a new field to this profile
 	 */
 	public func add(k: String, v: String) -> Void {
-		return c_borogove.borogove_profile_builder_add(
+		let __result = c_borogove.borogove_profile_builder_add(
 			self.o,
 			k,
 			v
 		)
+		return __result
 	}
 
 	/**
 	 Set the value of an existing field on this profile
 	 */
 	public func set(id: String, v: String) -> Void {
-		return c_borogove.borogove_profile_builder_set(
+		let __result = c_borogove.borogove_profile_builder_set(
 			self.o,
 			id,
 			v
 		)
+		return __result
 	}
 
 	/**
@@ -3510,27 +4458,79 @@ public class ProfileBuilder: SDKObject, @unchecked Sendable {
 	 @param moveTo the item currently in the position where it should move to
 	 */
 	public func move(id: String, moveTo: String) -> Void {
-		return c_borogove.borogove_profile_builder_move(
+		let __result = c_borogove.borogove_profile_builder_move(
 			self.o,
 			id,
 			moveTo
 		)
+		return __result
 	}
 
 	/**
 	 Remove a field from this profile
 	 */
 	public func remove(id: String) -> Void {
-		return c_borogove.borogove_profile_builder_remove(
+		let __result = c_borogove.borogove_profile_builder_remove(
 			self.o,
 			id
 		)
+		return __result
 	}
 
+	/**
+	 Build an immutable Profile from the current builder state.
+	 */
 	public func build() -> Profile {
-		return Profile(c_borogove.borogove_profile_builder_build(
+		let __result = Profile(c_borogove.borogove_profile_builder_build(
 			self.o
 		)!)
+		return __result
+	}
+
+	deinit {
+		c_borogove.borogove_release(o)
+	}
+}
+
+public class AvailableChatIterator: SDKObject, AsyncIteratorProtocol, AsyncSequence, @unchecked Sendable {
+	public let o: UnsafeMutableRawPointer
+
+	internal init(_ ptr: UnsafeMutableRawPointer) {
+		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
+	}
+
+	public typealias Element = AvailableChat
+	public typealias AsyncIterator = AvailableChatIterator
+	public func makeAsyncIterator() -> AvailableChatIterator { return self }
+
+	/**
+	 The query that this iterator is returning results for
+	 */
+	public var q: String {
+		get {
+			useString(c_borogove.borogove_available_chat_iterator_q(o))!
+		}
+	}
+
+	/**
+	 Get the next AvailableChat from this iterator.
+	 
+	 @returns Promise resolving to the next result, or null when exhausted
+	 */
+	public func next() async -> AvailableChat? {
+		return await withUnsafeContinuation { cont in
+		let __cont_ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(cont as AnyObject).toOpaque())
+		let __result = c_borogove.borogove_available_chat_iterator_next(
+			self.o,
+			{ (a, ctx) in
+				let cont = Unmanaged<AnyObject>.fromOpaque(ctx!).takeRetainedValue() as! UnsafeContinuation<AvailableChat?, Never>
+				cont.resume(returning: (a).map({ AvailableChat($0) }))
+			},
+			__cont_ptr
+		)
+		return __result
+		}
 	}
 
 	deinit {
@@ -3543,16 +4543,34 @@ public class Channel: Chat, @unchecked Sendable {
 		super.init(ptr)
 	}
 
+	/**
+	 Subject of this Channel
+	 */
+	public func subject() -> String {
+		let __result = useString(c_borogove.borogove_channel_subject(
+			self.o
+		))!
+		return __result
+	}
+
+	/**
+	 Description of this Channel
+	 */
 	public func description() -> String {
-		return useString(c_borogove.borogove_channel_description(
+		let __result = useString(c_borogove.borogove_channel_description(
 			self.o
 		))!
+		return __result
 	}
 
+	/**
+	 Whether this channel is members-only/private.
+	 */
 	public func isPrivate() -> Bool {
-		return c_borogove.borogove_channel_is_private(
+		let __result = c_borogove.borogove_channel_is_private(
 			self.o
 		)
+		return __result
 	}
 
 }
@@ -3569,6 +4587,7 @@ public class DTMFSender: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	/**
@@ -3577,10 +4596,11 @@ public class DTMFSender: SDKObject, @unchecked Sendable {
 	 @param tones can be any number of 0123456789#*ABCD,
 	 */
 	public func insertDTMF(tones: String) -> Void {
-		return c_borogove.borogove_calls_dtmf_sender_insert_dtmf(
+		let __result = c_borogove.borogove_calls_dtmf_sender_insert_dtmf(
 			self.o,
 			tones
 		)
+		return __result
 	}
 
 	deinit {
@@ -3607,6 +4627,9 @@ public class CustomEmojiReaction: Reaction, @unchecked Sendable {
 		)!)
 	}
 
+	/**
+	 URI of the custom emoji image
+	 */
 	public var uri: String {
 		get {
 			useString(c_borogove.borogove_custom_emoji_reaction_uri(o))!
@@ -3620,8 +4643,12 @@ public class Identicon: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
+	/**
+	 Generate a deterministic SVG identicon as a data URI.
+	 */
 	public static func svg(source: String) -> String {
 		useString(c_borogove.borogove_identicon_svg(
 			source
@@ -3638,6 +4665,7 @@ public class Config: SDKObject, @unchecked Sendable {
 
 	internal init(_ ptr: UnsafeMutableRawPointer) {
 		o = ptr
+		c_borogove.borogove_set_finalizer(ptr, releaseContexts)
 	}
 
 	/**
@@ -3670,6 +4698,8 @@ public class Config: SDKObject, @unchecked Sendable {
 
 public typealias UiState = borogove_ui_state
 
+public typealias ShowPresence = borogove_show_presence
+
 public typealias MessageType = borogove_message_type
 
 public typealias MessageStatus = borogove_message_status
diff --git a/Sources/c_borogove/iinclude/Lambda.h b/Sources/c_borogove/iinclude/Lambda.h
index 43b4ef0..1ccb0b7 100644
--- a/Sources/c_borogove/iinclude/Lambda.h
+++ b/Sources/c_borogove/iinclude/Lambda.h
@@ -55,9 +55,6 @@ class HXCPP_CLASS_ATTRIBUTES Lambda_obj : public ::hx::Object
 		static bool exists( ::Dynamic it, ::Dynamic f);
 		static ::Dynamic exists_dyn();
 
-		static ::cpp::VirtualArray filter( ::Dynamic it, ::Dynamic f);
-		static ::Dynamic filter_dyn();
-
 		static  ::Dynamic fold( ::Dynamic it, ::Dynamic f, ::Dynamic first);
 		static ::Dynamic fold_dyn();
 
diff --git a/Sources/c_borogove/iinclude/Reflect.h b/Sources/c_borogove/iinclude/Reflect.h
index a86cb6a..87d8d52 100644
--- a/Sources/c_borogove/iinclude/Reflect.h
+++ b/Sources/c_borogove/iinclude/Reflect.h
@@ -82,9 +82,6 @@ class HXCPP_CLASS_ATTRIBUTES Reflect_obj : public ::hx::Object
 		static bool isEnumValue( ::Dynamic v);
 		static ::Dynamic isEnumValue_dyn();
 
-		static bool deleteField( ::Dynamic o,::String field);
-		static ::Dynamic deleteField_dyn();
-
 		static  ::Dynamic copy( ::Dynamic o);
 		static ::Dynamic copy_dyn();
 
diff --git a/Sources/c_borogove/iinclude/Sys.h b/Sources/c_borogove/iinclude/Sys.h
index 6a01b1c..4834a8a 100644
--- a/Sources/c_borogove/iinclude/Sys.h
+++ b/Sources/c_borogove/iinclude/Sys.h
@@ -49,6 +49,9 @@ class HXCPP_CLASS_ATTRIBUTES Sys_obj : public ::hx::Object
 		bool _hx_isInstanceOf(int inClassId);
 		::String __ToString() const { return HX_("Sys",ed,64,3f,00); }
 
+		static ::String getEnv(::String s);
+		static ::Dynamic getEnv_dyn();
+
 		static ::String getCwd();
 		static ::Dynamic getCwd_dyn();
 
diff --git a/Sources/c_borogove/iinclude/Xml.h b/Sources/c_borogove/iinclude/Xml.h
index 6019e13..d4c0dc7 100644
--- a/Sources/c_borogove/iinclude/Xml.h
+++ b/Sources/c_borogove/iinclude/Xml.h
@@ -66,9 +66,6 @@ class HXCPP_CLASS_ATTRIBUTES Xml_obj : public ::hx::Object
 		 ::Dynamic attributes();
 		::Dynamic attributes_dyn();
 
-		 ::Xml firstElement();
-		::Dynamic firstElement_dyn();
-
 		virtual ::String toString();
 		::Dynamic toString_dyn();
 
diff --git a/Sources/c_borogove/iinclude/_FractionalIndexing/FractionalIndexing_Fields_.h b/Sources/c_borogove/iinclude/_FractionalIndexing/FractionalIndexing_Fields_.h
new file mode 100644
index 0000000..c252a18
--- /dev/null
+++ b/Sources/c_borogove/iinclude/_FractionalIndexing/FractionalIndexing_Fields_.h
@@ -0,0 +1,81 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED__FractionalIndexing_FractionalIndexing_Fields_
+#define INCLUDED__FractionalIndexing_FractionalIndexing_Fields_
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(_FractionalIndexing,FractionalIndexing_Fields_)
+
+namespace _FractionalIndexing{
+
+
+class HXCPP_CLASS_ATTRIBUTES FractionalIndexing_Fields__obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef FractionalIndexing_Fields__obj OBJ_;
+		FractionalIndexing_Fields__obj();
+
+	public:
+		enum { _hx_ClassId = 0x73ff5bc0 };
+
+		void __construct();
+		inline void *operator new(size_t inSize, bool inContainer=false,const char *inName="_FractionalIndexing.FractionalIndexing_Fields_")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,false,"_FractionalIndexing.FractionalIndexing_Fields_"); }
+
+		inline static ::hx::ObjectPtr< FractionalIndexing_Fields__obj > __new() {
+			::hx::ObjectPtr< FractionalIndexing_Fields__obj > __this = new FractionalIndexing_Fields__obj();
+			__this->__construct();
+			return __this;
+		}
+
+		inline static ::hx::ObjectPtr< FractionalIndexing_Fields__obj > __alloc(::hx::Ctx *_hx_ctx) {
+			FractionalIndexing_Fields__obj *__this = (FractionalIndexing_Fields__obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(FractionalIndexing_Fields__obj), false, "_FractionalIndexing.FractionalIndexing_Fields_"));
+			*(void **)__this = FractionalIndexing_Fields__obj::_hx_vtable;
+			return __this;
+		}
+
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~FractionalIndexing_Fields__obj();
+
+		HX_DO_RTTI_ALL;
+		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
+		static void __register();
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("FractionalIndexing_Fields_",e4,cf,61,0a); }
+
+		static ::String midpoint(::String a,::String b,::String digits);
+		static ::Dynamic midpoint_dyn();
+
+		static void validateInteger(::String i);
+		static ::Dynamic validateInteger_dyn();
+
+		static int getIntegerLength(::String head);
+		static ::Dynamic getIntegerLength_dyn();
+
+		static ::String getIntegerPart(::String key);
+		static ::Dynamic getIntegerPart_dyn();
+
+		static void validateOrderKey(::String key,::String digits);
+		static ::Dynamic validateOrderKey_dyn();
+
+		static ::String incrementInteger(::String x,::String digits);
+		static ::Dynamic incrementInteger_dyn();
+
+		static ::String decrementInteger(::String x,::String digits);
+		static ::Dynamic decrementInteger_dyn();
+
+		static ::String between(::String a,::String b,::String digits);
+		static ::Dynamic between_dyn();
+
+};
+
+} // end namespace _FractionalIndexing
+
+#endif /* INCLUDED__FractionalIndexing_FractionalIndexing_Fields_ */ 
diff --git a/Sources/c_borogove/iinclude/_HaxeCBridge/HaxeArray_Impl_.h b/Sources/c_borogove/iinclude/_HaxeCBridge/HaxeArray_Impl_.h
new file mode 100644
index 0000000..86b4934
--- /dev/null
+++ b/Sources/c_borogove/iinclude/_HaxeCBridge/HaxeArray_Impl_.h
@@ -0,0 +1,58 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#define INCLUDED__HaxeCBridge_HaxeArray_Impl_
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(_HaxeCBridge,HaxeArray_Impl_)
+
+namespace _HaxeCBridge{
+
+
+class HXCPP_CLASS_ATTRIBUTES HaxeArray_Impl__obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef HaxeArray_Impl__obj OBJ_;
+		HaxeArray_Impl__obj();
+
+	public:
+		enum { _hx_ClassId = 0x7f087fd8 };
+
+		void __construct();
+		inline void *operator new(size_t inSize, bool inContainer=false,const char *inName="_HaxeCBridge.HaxeArray_Impl_")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,false,"_HaxeCBridge.HaxeArray_Impl_"); }
+
+		inline static ::hx::ObjectPtr< HaxeArray_Impl__obj > __new() {
+			::hx::ObjectPtr< HaxeArray_Impl__obj > __this = new HaxeArray_Impl__obj();
+			__this->__construct();
+			return __this;
+		}
+
+		inline static ::hx::ObjectPtr< HaxeArray_Impl__obj > __alloc(::hx::Ctx *_hx_ctx) {
+			HaxeArray_Impl__obj *__this = (HaxeArray_Impl__obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(HaxeArray_Impl__obj), false, "_HaxeCBridge.HaxeArray_Impl_"));
+			*(void **)__this = HaxeArray_Impl__obj::_hx_vtable;
+			return __this;
+		}
+
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~HaxeArray_Impl__obj();
+
+		HX_DO_RTTI_ALL;
+		static void __register();
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("HaxeArray_Impl_",53,94,a1,36); }
+
+		static void** fromNullableArrayT(::cpp::VirtualArray x);
+
+};
+
+} // end namespace _HaxeCBridge
+
+#endif /* INCLUDED__HaxeCBridge_HaxeArray_Impl_ */ 
diff --git a/Sources/c_borogove/iinclude/_HaxeCBridge/HaxeOpaqueArray_Impl_.h b/Sources/c_borogove/iinclude/_HaxeCBridge/HaxeOpaqueArray_Impl_.h
new file mode 100644
index 0000000..d6f6704
--- /dev/null
+++ b/Sources/c_borogove/iinclude/_HaxeCBridge/HaxeOpaqueArray_Impl_.h
@@ -0,0 +1,58 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED__HaxeCBridge_HaxeOpaqueArray_Impl_
+#define INCLUDED__HaxeCBridge_HaxeOpaqueArray_Impl_
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(_HaxeCBridge,HaxeOpaqueArray_Impl_)
+
+namespace _HaxeCBridge{
+
+
+class HXCPP_CLASS_ATTRIBUTES HaxeOpaqueArray_Impl__obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef HaxeOpaqueArray_Impl__obj OBJ_;
+		HaxeOpaqueArray_Impl__obj();
+
+	public:
+		enum { _hx_ClassId = 0x65fb6c2b };
+
+		void __construct();
+		inline void *operator new(size_t inSize, bool inContainer=false,const char *inName="_HaxeCBridge.HaxeOpaqueArray_Impl_")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,false,"_HaxeCBridge.HaxeOpaqueArray_Impl_"); }
+
+		inline static ::hx::ObjectPtr< HaxeOpaqueArray_Impl__obj > __new() {
+			::hx::ObjectPtr< HaxeOpaqueArray_Impl__obj > __this = new HaxeOpaqueArray_Impl__obj();
+			__this->__construct();
+			return __this;
+		}
+
+		inline static ::hx::ObjectPtr< HaxeOpaqueArray_Impl__obj > __alloc(::hx::Ctx *_hx_ctx) {
+			HaxeOpaqueArray_Impl__obj *__this = (HaxeOpaqueArray_Impl__obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(HaxeOpaqueArray_Impl__obj), false, "_HaxeCBridge.HaxeOpaqueArray_Impl_"));
+			*(void **)__this = HaxeOpaqueArray_Impl__obj::_hx_vtable;
+			return __this;
+		}
+
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~HaxeOpaqueArray_Impl__obj();
+
+		HX_DO_RTTI_ALL;
+		static void __register();
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("HaxeOpaqueArray_Impl_",72,a8,fd,0e); }
+
+		static void** fromNullableArrayT(::cpp::VirtualArray x);
+
+};
+
+} // end namespace _HaxeCBridge
+
+#endif /* INCLUDED__HaxeCBridge_HaxeOpaqueArray_Impl_ */ 
diff --git a/Sources/c_borogove/iinclude/_HaxeCBridge/HaxeStringArray_Impl_.h b/Sources/c_borogove/iinclude/_HaxeCBridge/HaxeStringArray_Impl_.h
new file mode 100644
index 0000000..929a1a5
--- /dev/null
+++ b/Sources/c_borogove/iinclude/_HaxeCBridge/HaxeStringArray_Impl_.h
@@ -0,0 +1,58 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED__HaxeCBridge_HaxeStringArray_Impl_
+#define INCLUDED__HaxeCBridge_HaxeStringArray_Impl_
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(_HaxeCBridge,HaxeStringArray_Impl_)
+
+namespace _HaxeCBridge{
+
+
+class HXCPP_CLASS_ATTRIBUTES HaxeStringArray_Impl__obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef HaxeStringArray_Impl__obj OBJ_;
+		HaxeStringArray_Impl__obj();
+
+	public:
+		enum { _hx_ClassId = 0x32e5d073 };
+
+		void __construct();
+		inline void *operator new(size_t inSize, bool inContainer=false,const char *inName="_HaxeCBridge.HaxeStringArray_Impl_")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,false,"_HaxeCBridge.HaxeStringArray_Impl_"); }
+
+		inline static ::hx::ObjectPtr< HaxeStringArray_Impl__obj > __new() {
+			::hx::ObjectPtr< HaxeStringArray_Impl__obj > __this = new HaxeStringArray_Impl__obj();
+			__this->__construct();
+			return __this;
+		}
+
+		inline static ::hx::ObjectPtr< HaxeStringArray_Impl__obj > __alloc(::hx::Ctx *_hx_ctx) {
+			HaxeStringArray_Impl__obj *__this = (HaxeStringArray_Impl__obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(HaxeStringArray_Impl__obj), false, "_HaxeCBridge.HaxeStringArray_Impl_"));
+			*(void **)__this = HaxeStringArray_Impl__obj::_hx_vtable;
+			return __this;
+		}
+
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~HaxeStringArray_Impl__obj();
+
+		HX_DO_RTTI_ALL;
+		static void __register();
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("HaxeStringArray_Impl_",82,02,14,a2); }
+
+		static const char** fromNullableArrayString(::Array< ::String > x);
+
+};
+
+} // end namespace _HaxeCBridge
+
+#endif /* INCLUDED__HaxeCBridge_HaxeStringArray_Impl_ */ 
diff --git a/Sources/c_borogove/iinclude/_UUIDv7/UUIDv7_Fields_.h b/Sources/c_borogove/iinclude/_UUIDv7/UUIDv7_Fields_.h
new file mode 100644
index 0000000..a351e8b
--- /dev/null
+++ b/Sources/c_borogove/iinclude/_UUIDv7/UUIDv7_Fields_.h
@@ -0,0 +1,63 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#define INCLUDED__UUIDv7_UUIDv7_Fields_
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(_UUIDv7,UUIDv7_Fields_)
+HX_DECLARE_CLASS1(uuidv7,V7Generator)
+
+namespace _UUIDv7{
+
+
+class HXCPP_CLASS_ATTRIBUTES UUIDv7_Fields__obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef UUIDv7_Fields__obj OBJ_;
+		UUIDv7_Fields__obj();
+
+	public:
+		enum { _hx_ClassId = 0x0919bfda };
+
+		void __construct();
+		inline void *operator new(size_t inSize, bool inContainer=false,const char *inName="_UUIDv7.UUIDv7_Fields_")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,false,"_UUIDv7.UUIDv7_Fields_"); }
+
+		inline static ::hx::ObjectPtr< UUIDv7_Fields__obj > __new() {
+			::hx::ObjectPtr< UUIDv7_Fields__obj > __this = new UUIDv7_Fields__obj();
+			__this->__construct();
+			return __this;
+		}
+
+		inline static ::hx::ObjectPtr< UUIDv7_Fields__obj > __alloc(::hx::Ctx *_hx_ctx) {
+			UUIDv7_Fields__obj *__this = (UUIDv7_Fields__obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(UUIDv7_Fields__obj), false, "_UUIDv7.UUIDv7_Fields_"));
+			*(void **)__this = UUIDv7_Fields__obj::_hx_vtable;
+			return __this;
+		}
+
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~UUIDv7_Fields__obj();
+
+		HX_DO_RTTI_ALL;
+		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
+		static bool __SetStatic(const ::String &inString, Dynamic &ioValue, ::hx::PropertyAccess inCallProp);
+		static void __register();
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("UUIDv7_Fields_",23,87,89,be); }
+
+		static  ::uuidv7::V7Generator defaultGenerator;
+		static ::String uuidv7();
+		static ::Dynamic uuidv7_dyn();
+
+};
+
+} // end namespace _UUIDv7
+
+#endif /* INCLUDED__UUIDv7_UUIDv7_Fields_ */ 
diff --git a/Sources/c_borogove/iinclude/borogove/AsyncLock.h b/Sources/c_borogove/iinclude/borogove/AsyncLock.h
new file mode 100644
index 0000000..77f133e
--- /dev/null
+++ b/Sources/c_borogove/iinclude/borogove/AsyncLock.h
@@ -0,0 +1,55 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_borogove_AsyncLock
+#define INCLUDED_borogove_AsyncLock
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(borogove,AsyncLock)
+HX_DECLARE_CLASS1(thenshim,Thenable)
+
+namespace borogove{
+
+
+class HXCPP_CLASS_ATTRIBUTES AsyncLock_obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef AsyncLock_obj OBJ_;
+		AsyncLock_obj();
+
+	public:
+		enum { _hx_ClassId = 0x566e2226 };
+
+		void __construct();
+		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.AsyncLock")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.AsyncLock"); }
+		static ::hx::ObjectPtr< AsyncLock_obj > __new();
+		static ::hx::ObjectPtr< AsyncLock_obj > __alloc(::hx::Ctx *_hx_ctx);
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~AsyncLock_obj();
+
+		HX_DO_RTTI_ALL;
+		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
+		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
+		void __GetFields(Array< ::String> &outFields);
+		static void __register();
+		void __Mark(HX_MARK_PARAMS);
+		void __Visit(HX_VISIT_PARAMS);
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("AsyncLock",27,f5,17,17); }
+
+		::Dynamic p;
+		::Dynamic run( ::Dynamic fn);
+		::Dynamic run_dyn();
+
+};
+
+} // end namespace borogove
+
+#endif /* INCLUDED_borogove_AsyncLock */ 
diff --git a/Sources/c_borogove/iinclude/borogove/Autolink.h b/Sources/c_borogove/iinclude/borogove/Autolink.h
index 550a81a..b331bc5 100644
--- a/Sources/c_borogove/iinclude/borogove/Autolink.h
+++ b/Sources/c_borogove/iinclude/borogove/Autolink.h
@@ -78,10 +78,11 @@ class HXCPP_CLASS_ATTRIBUTES Autolink_obj : public ::hx::Object
 		static  ::EReg TEL_URI;
 		static  ::EReg SMS_URI;
 		static  ::EReg XMPP_URI;
+		static  ::EReg AUTOLINK_EMAIL;
 		static  ::Dynamic one(::String s,int start);
 		static ::Dynamic one_dyn();
 
-		static  ::Dynamic match(::String s,int start, ::EReg pattern,bool addHttps);
+		static  ::Dynamic match(::String s,int start, ::EReg pattern,::String add);
 		static ::Dynamic match_dyn();
 
 };
diff --git a/Sources/c_borogove/iinclude/borogove/AvailableChat.h b/Sources/c_borogove/iinclude/borogove/AvailableChat.h
index 85b1a82..3b5f962 100644
--- a/Sources/c_borogove/iinclude/borogove/AvailableChat.h
+++ b/Sources/c_borogove/iinclude/borogove/AvailableChat.h
@@ -62,6 +62,12 @@ class HXCPP_CLASS_ATTRIBUTES AvailableChat_obj : public ::hx::Object
 		bool isChannel();
 		::Dynamic isChannel_dyn();
 
+		bool canAudioCall();
+		::Dynamic canAudioCall_dyn();
+
+		bool canVideoCall();
+		::Dynamic canVideoCall_dyn();
+
 };
 
 } // end namespace borogove
diff --git a/Sources/c_borogove/iinclude/borogove/AvailableChatIterator.h b/Sources/c_borogove/iinclude/borogove/AvailableChatIterator.h
new file mode 100644
index 0000000..9a75c05
--- /dev/null
+++ b/Sources/c_borogove/iinclude/borogove/AvailableChatIterator.h
@@ -0,0 +1,81 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_borogove_AvailableChatIterator
+#define INCLUDED_borogove_AvailableChatIterator
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(borogove,AvailableChat)
+HX_DECLARE_CLASS1(borogove,AvailableChatIterator)
+HX_DECLARE_CLASS1(borogove,Client)
+HX_DECLARE_CLASS1(borogove,EventEmitter)
+HX_DECLARE_CLASS1(borogove,JID)
+HX_DECLARE_CLASS1(borogove,Persistence)
+HX_DECLARE_CLASS1(haxe,IMap)
+HX_DECLARE_CLASS2(haxe,ds,StringMap)
+HX_DECLARE_CLASS1(thenshim,Thenable)
+
+namespace borogove{
+
+
+class HXCPP_CLASS_ATTRIBUTES AvailableChatIterator_obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef AvailableChatIterator_obj OBJ_;
+		AvailableChatIterator_obj();
+
+	public:
+		enum { _hx_ClassId = 0x1765281e };
+
+		void __construct(::String q, ::borogove::Client client,::Dynamic persistence);
+		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.AvailableChatIterator")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.AvailableChatIterator"); }
+		static ::hx::ObjectPtr< AvailableChatIterator_obj > __new(::String q, ::borogove::Client client,::Dynamic persistence);
+		static ::hx::ObjectPtr< AvailableChatIterator_obj > __alloc(::hx::Ctx *_hx_ctx,::String q, ::borogove::Client client,::Dynamic persistence);
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~AvailableChatIterator_obj();
+
+		HX_DO_RTTI_ALL;
+		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
+		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
+		void __GetFields(Array< ::String> &outFields);
+		static void __register();
+		void __Mark(HX_MARK_PARAMS);
+		void __Visit(HX_VISIT_PARAMS);
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("AvailableChatIterator",2f,dc,b6,18); }
+
+		static void __boot();
+		static  ::Dynamic __meta__;
+		::String q;
+		::String q__fromC();
+		::Dynamic q__fromC_dyn();
+
+		::String query;
+		 ::borogove::Client client;
+		::Dynamic persistence;
+		::Array< ::Dynamic> results;
+		::Array< ::Dynamic> head;
+		 ::haxe::ds::StringMap dedup;
+		::Dynamic check( ::borogove::JID jid);
+		::Dynamic check_dyn();
+
+		::Dynamic next();
+		::Dynamic next_dyn();
+
+		void next__fromC(::cpp::Function< void  (void*,void*) > handler,void* handler__context);
+
+		::Dynamic internalNext();
+		::Dynamic internalNext_dyn();
+
+};
+
+} // end namespace borogove
+
+#endif /* INCLUDED_borogove_AvailableChatIterator */ 
diff --git a/Sources/c_borogove/iinclude/borogove/Caps.h b/Sources/c_borogove/iinclude/borogove/Caps.h
index 6e247e6..5cca3b3 100644
--- a/Sources/c_borogove/iinclude/borogove/Caps.h
+++ b/Sources/c_borogove/iinclude/borogove/Caps.h
@@ -48,10 +48,13 @@ class HXCPP_CLASS_ATTRIBUTES Caps_obj : public ::hx::Object
 		bool _hx_isInstanceOf(int inClassId);
 		::String __ToString() const { return HX_("Caps",41,48,93,2c); }
 
-		static ::Array< ::String > withIdentity( ::Dynamic caps,::String category,::String type);
+		static  ::Dynamic filter( ::Dynamic caps, ::Dynamic predicate);
+		static ::Dynamic filter_dyn();
+
+		static  ::Dynamic withIdentity( ::Dynamic caps,::String category,::String type);
 		static ::Dynamic withIdentity_dyn();
 
-		static ::Array< ::String > withFeature( ::Dynamic caps,::String feature);
+		static  ::Dynamic withFeature( ::Dynamic caps,::String feature);
 		static ::Dynamic withFeature_dyn();
 
 		::String node;
diff --git a/Sources/c_borogove/iinclude/borogove/CapsRepo.h b/Sources/c_borogove/iinclude/borogove/CapsRepo.h
new file mode 100644
index 0000000..5a09e0c
--- /dev/null
+++ b/Sources/c_borogove/iinclude/borogove/CapsRepo.h
@@ -0,0 +1,71 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_borogove_CapsRepo
+#define INCLUDED_borogove_CapsRepo
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(borogove,Caps)
+HX_DECLARE_CLASS1(borogove,CapsRepo)
+HX_DECLARE_CLASS1(borogove,Persistence)
+HX_DECLARE_CLASS1(borogove,Stanza)
+HX_DECLARE_CLASS1(haxe,IMap)
+HX_DECLARE_CLASS2(haxe,ds,StringMap)
+HX_DECLARE_CLASS1(thenshim,Thenable)
+
+namespace borogove{
+
+
+class HXCPP_CLASS_ATTRIBUTES CapsRepo_obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef CapsRepo_obj OBJ_;
+		CapsRepo_obj();
+
+	public:
+		enum { _hx_ClassId = 0x796e3934 };
+
+		void __construct(::Dynamic persistence);
+		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.CapsRepo")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.CapsRepo"); }
+		static ::hx::ObjectPtr< CapsRepo_obj > __new(::Dynamic persistence);
+		static ::hx::ObjectPtr< CapsRepo_obj > __alloc(::hx::Ctx *_hx_ctx,::Dynamic persistence);
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~CapsRepo_obj();
+
+		HX_DO_RTTI_ALL;
+		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
+		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
+		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
+		static bool __SetStatic(const ::String &inString, Dynamic &ioValue, ::hx::PropertyAccess inCallProp);
+		void __GetFields(Array< ::String> &outFields);
+		static void __register();
+		void __Mark(HX_MARK_PARAMS);
+		void __Visit(HX_VISIT_PARAMS);
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("CapsRepo",53,81,63,ef); }
+
+		static void __boot();
+		static  ::borogove::Caps empty;
+		::Dynamic persistence;
+		 ::haxe::ds::StringMap cache;
+		 ::borogove::Caps add( ::borogove::Caps caps,::hx::Null< bool >  storeOnMiss);
+		::Dynamic add_dyn();
+
+		::Dynamic getAsync( ::borogove::Stanza presence);
+		::Dynamic getAsync_dyn();
+
+		 ::borogove::Caps get( ::borogove::Stanza presence);
+		::Dynamic get_dyn();
+
+};
+
+} // end namespace borogove
+
+#endif /* INCLUDED_borogove_CapsRepo */ 
diff --git a/Sources/c_borogove/iinclude/borogove/Channel.h b/Sources/c_borogove/iinclude/borogove/Channel.h
index 4daec49..41b45c8 100644
--- a/Sources/c_borogove/iinclude/borogove/Channel.h
+++ b/Sources/c_borogove/iinclude/borogove/Channel.h
@@ -18,12 +18,12 @@ HX_DECLARE_CLASS1(borogove,Client)
 HX_DECLARE_CLASS1(borogove,EventEmitter)
 HX_DECLARE_CLASS1(borogove,GenericStream)
 HX_DECLARE_CLASS1(borogove,JID)
+HX_DECLARE_CLASS1(borogove,Member)
 HX_DECLARE_CLASS1(borogove,MessageSync)
 HX_DECLARE_CLASS1(borogove,OutboxItem)
-HX_DECLARE_CLASS1(borogove,Participant)
 HX_DECLARE_CLASS1(borogove,Persistence)
-HX_DECLARE_CLASS1(borogove,Presence)
 HX_DECLARE_CLASS1(borogove,Reaction)
+HX_DECLARE_CLASS1(borogove,Role)
 HX_DECLARE_CLASS1(borogove,Stanza)
 HX_DECLARE_CLASS1(thenshim,Thenable)
 
@@ -40,13 +40,13 @@ class HXCPP_CLASS_ATTRIBUTES Channel_obj : public  ::borogove::Chat_obj
 	public:
 		enum { _hx_ClassId = 0x7f70c446 };
 
-		void __construct( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy, ::borogove::Caps disco);
+		void __construct( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy, ::borogove::Caps disco);
 		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.Channel")
 			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
 		inline void *operator new(size_t inSize, int extra)
 			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.Channel"); }
-		static ::hx::ObjectPtr< Channel_obj > __new( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy, ::borogove::Caps disco);
-		static ::hx::ObjectPtr< Channel_obj > __alloc(::hx::Ctx *_hx_ctx, ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy, ::borogove::Caps disco);
+		static ::hx::ObjectPtr< Channel_obj > __new( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy, ::borogove::Caps disco);
+		static ::hx::ObjectPtr< Channel_obj > __alloc(::hx::Ctx *_hx_ctx, ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy, ::borogove::Caps disco);
 		static void * _hx_vtable;
 		static Dynamic __CreateEmpty();
 		static Dynamic __Create(::hx::DynamicArray inArgs);
@@ -66,13 +66,18 @@ class HXCPP_CLASS_ATTRIBUTES Channel_obj : public  ::borogove::Chat_obj
 		static  ::Dynamic __meta__;
 		 ::borogove::Caps disco;
 		bool inSync;
+		 ::borogove::Stanza joinFailed;
 		 ::borogove::MessageSync sync;
 		bool forceLive;
-		::String _nickInUse;
+		 ::borogove::Member self;
+		::String mavUntil;
+		::Array< ::Dynamic> membersForName;
+		::String sortId;
+		::String lastMessageSenderName;
 		void selfPing(bool refresh);
 		::Dynamic selfPing_dyn();
 
-		void join();
+		::Dynamic join();
 		::Dynamic join_dyn();
 
 		void selfPingSuccess();
@@ -80,6 +85,9 @@ class HXCPP_CLASS_ATTRIBUTES Channel_obj : public  ::borogove::Chat_obj
 
 		::String getDisplayName();
 
+		::String subject();
+		::Dynamic subject_dyn();
+
 		::String description();
 		::Dynamic description_dyn();
 
@@ -92,11 +100,13 @@ class HXCPP_CLASS_ATTRIBUTES Channel_obj : public  ::borogove::Chat_obj
 
 		bool canSend();
 
+		bool canModerate();
+
 		 ::Dynamic getCaps();
 
-		void setPresence(::String resource, ::borogove::Presence presence);
+		void setPresence(::String resource, ::borogove::Stanza presence,bool noStore);
 
-		void doSync(::String lastId);
+		void doSync( ::borogove::ChatMessage syncPoint,::String sortA);
 		::Dynamic doSync_dyn();
 
 		void setTrusted(bool trusted);
@@ -118,6 +128,8 @@ class HXCPP_CLASS_ATTRIBUTES Channel_obj : public  ::borogove::Chat_obj
 
 		bool syncing();
 
+		::Dynamic setLastMessage( ::borogove::ChatMessage message);
+
 		bool canAudioCall();
 
 		bool canVideoCall();
@@ -128,22 +140,33 @@ class HXCPP_CLASS_ATTRIBUTES Channel_obj : public  ::borogove::Chat_obj
 		 ::borogove::JID getFullJid();
 		::Dynamic getFullJid_dyn();
 
-		::Array< ::String > getParticipants();
+		::Dynamic members();
+
+		::Dynamic getMemberDetails(::Array< ::String > memberIds);
+
+		 ::borogove::Member buildMember(::String resource, ::borogove::Stanza presence);
+		::Dynamic buildMember_dyn();
 
-		 ::borogove::Participant getParticipantDetails(::String participantId);
+		::Array< ::Dynamic> availableRoles( ::borogove::Member member);
 
-		::Dynamic getMessagesBefore(::String beforeId,::String beforeTime);
+		bool canRemoveRole( ::borogove::Member member, ::borogove::Role role);
 
-		::Dynamic getMessagesAfter(::String afterId,::String afterTime);
+		void addRole( ::borogove::Member member, ::borogove::Role role);
 
-		::Dynamic getMessagesAround(::String aroundId,::String aroundTime);
+		void removeRole( ::borogove::Member member, ::borogove::Role role);
+
+		::Dynamic getMessagesBefore( ::borogove::ChatMessage before);
+
+		::Dynamic getMessagesAfter( ::borogove::ChatMessage after);
+
+		::Dynamic getMessagesAround( ::borogove::ChatMessage around);
 
 		 ::borogove::ChatMessageBuilder prepareIncomingMessage( ::borogove::ChatMessageBuilder message, ::borogove::Stanza stanza);
 
 		 ::borogove::ChatMessageBuilder prepareOutgoingMessage( ::borogove::ChatMessageBuilder message);
 		::Dynamic prepareOutgoingMessage_dyn();
 
-		void correctMessage(::String localId, ::borogove::ChatMessageBuilder message);
+		void correctMessage( ::borogove::ChatMessage correct, ::borogove::ChatMessageBuilder message);
 
 		void sendMessage( ::borogove::ChatMessageBuilder message);
 
@@ -151,8 +174,6 @@ class HXCPP_CLASS_ATTRIBUTES Channel_obj : public  ::borogove::Chat_obj
 
 		void sendMessageStanza( ::borogove::Stanza stanza, ::borogove::OutboxItem outboxItem);
 
-		::String lastMessageId();
-
 		void markReadUpTo( ::borogove::ChatMessage message);
 
 		void bookmark();
diff --git a/Sources/c_borogove/iinclude/borogove/Chat.h b/Sources/c_borogove/iinclude/borogove/Chat.h
index 8b6b35d..95f8e61 100644
--- a/Sources/c_borogove/iinclude/borogove/Chat.h
+++ b/Sources/c_borogove/iinclude/borogove/Chat.h
@@ -6,7 +6,9 @@
 #include <hxcpp.h>
 #endif
 
-HX_DECLARE_CLASS1(borogove,Caps)
+#ifndef INCLUDED_borogove_EventEmitter
+#include <borogove/EventEmitter.h>
+#endif
 HX_DECLARE_CLASS1(borogove,Chat)
 HX_DECLARE_CLASS1(borogove,ChatMessage)
 HX_DECLARE_CLASS1(borogove,ChatMessageBuilder)
@@ -14,14 +16,15 @@ HX_DECLARE_CLASS1(borogove,Client)
 HX_DECLARE_CLASS1(borogove,EventEmitter)
 HX_DECLARE_CLASS1(borogove,GenericStream)
 HX_DECLARE_CLASS1(borogove,JID)
+HX_DECLARE_CLASS1(borogove,Member)
 HX_DECLARE_CLASS1(borogove,MessageSync)
 HX_DECLARE_CLASS1(borogove,Outbox)
 HX_DECLARE_CLASS1(borogove,OutboxItem)
-HX_DECLARE_CLASS1(borogove,Participant)
 HX_DECLARE_CLASS1(borogove,Persistence)
-HX_DECLARE_CLASS1(borogove,Presence)
 HX_DECLARE_CLASS1(borogove,Reaction)
+HX_DECLARE_CLASS1(borogove,Role)
 HX_DECLARE_CLASS1(borogove,Stanza)
+HX_DECLARE_CLASS1(borogove,Status)
 HX_DECLARE_CLASS2(borogove,calls,DTMFSender)
 HX_DECLARE_CLASS2(borogove,calls,MediaStream)
 HX_DECLARE_CLASS2(borogove,calls,MediaStreamTrack)
@@ -34,17 +37,17 @@ HX_DECLARE_CLASS1(thenshim,Thenable)
 namespace borogove{
 
 
-class HXCPP_CLASS_ATTRIBUTES Chat_obj : public ::hx::Object
+class HXCPP_CLASS_ATTRIBUTES Chat_obj : public  ::borogove::EventEmitter_obj
 {
 	public:
-		typedef ::hx::Object super;
+		typedef  ::borogove::EventEmitter_obj super;
 		typedef Chat_obj OBJ_;
 		Chat_obj();
 
 	public:
 		enum { _hx_ClassId = 0x2acf7e59 };
 
-		void __construct( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs);
+		void __construct( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs);
 		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.Chat")
 			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
 		inline void *operator new(size_t inSize, int extra)
@@ -68,8 +71,11 @@ class HXCPP_CLASS_ATTRIBUTES Chat_obj : public ::hx::Object
 		 ::borogove::GenericStream stream;
 		::Dynamic persistence;
 		::Array< unsigned char > avatarSha1;
-		 ::haxe::ds::StringMap presence;
 		bool trusted;
+		 ::borogove::Status status;
+		 ::borogove::Status status__fromC();
+		::Dynamic status__fromC_dyn();
+
 		::String chatId;
 		::String chatId__fromC();
 		::Dynamic chatId__fromC_dyn();
@@ -96,6 +102,7 @@ class HXCPP_CLASS_ATTRIBUTES Chat_obj : public ::hx::Object
 		int _unreadCount;
 		::String readUpToId;
 		::String readUpToBy;
+		 ::haxe::ds::StringMap threads;
 		bool isTyping;
 		::String typingThread;
 		 ::haxe::Timer typingTimer;
@@ -107,17 +114,17 @@ class HXCPP_CLASS_ATTRIBUTES Chat_obj : public ::hx::Object
 		::Array< int > omemoContactDeviceIDs;
 		virtual  ::borogove::ChatMessageBuilder prepareIncomingMessage( ::borogove::ChatMessageBuilder message, ::borogove::Stanza stanza) { return 0; }
 		::Dynamic prepareIncomingMessage_dyn();
-		virtual ::Dynamic getMessagesBefore(::String beforeId,::String beforeTime) { return 0; }
+		virtual ::Dynamic getMessagesBefore( ::borogove::ChatMessage before) { return 0; }
 		::Dynamic getMessagesBefore_dyn();
-		void getMessagesBefore__fromC(::String beforeId,::String beforeTime,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
+		void getMessagesBefore__fromC( ::borogove::ChatMessage before,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
 
-		virtual ::Dynamic getMessagesAfter(::String afterId,::String afterTime) { return 0; }
+		virtual ::Dynamic getMessagesAfter( ::borogove::ChatMessage after) { return 0; }
 		::Dynamic getMessagesAfter_dyn();
-		void getMessagesAfter__fromC(::String afterId,::String afterTime,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
+		void getMessagesAfter__fromC( ::borogove::ChatMessage after,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
 
-		virtual ::Dynamic getMessagesAround(::String aroundId,::String aroundTime) { return 0; }
+		virtual ::Dynamic getMessagesAround( ::borogove::ChatMessage around) { return 0; }
 		::Dynamic getMessagesAround_dyn();
-		void getMessagesAround__fromC(::String aroundId,::String aroundTime,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
+		void getMessagesAround__fromC( ::borogove::ChatMessage around,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
 
 		::Dynamic fetchFromSync( ::borogove::MessageSync sync);
 		::Dynamic fetchFromSync_dyn();
@@ -139,20 +146,41 @@ class HXCPP_CLASS_ATTRIBUTES Chat_obj : public ::hx::Object
 		void bookmark__fromC();
 		::Dynamic bookmark__fromC_dyn();
 
-		virtual ::Array< ::String > getParticipants() { return 0; }
-		::Dynamic getParticipants_dyn();
-		size_t getParticipants__fromC(const char*** outPtr);
+		virtual ::Dynamic members() { return 0; }
+		::Dynamic members_dyn();
+		void members__fromC(::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
+
+		virtual ::Dynamic getMemberDetails(::Array< ::String > memberIds) { return 0; }
+		::Dynamic getMemberDetails_dyn();
+		void getMemberDetails__fromC(::cpp::Pointer< const char* > memberIds,size_t memberIds__len,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
+
+		int addMembersUpdatedListener( ::Dynamic handler);
+		::Dynamic addMembersUpdatedListener_dyn();
+
+		int addMembersUpdatedListener__fromC(::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
+
+		virtual ::Array< ::Dynamic> availableRoles( ::borogove::Member member);
+		::Dynamic availableRoles_dyn();
+
+		size_t availableRoles__fromC( ::borogove::Member member,void*** outPtr);
+
+		virtual bool canRemoveRole( ::borogove::Member member, ::borogove::Role role);
+		::Dynamic canRemoveRole_dyn();
+
+		virtual void addRole( ::borogove::Member member, ::borogove::Role role);
+		::Dynamic addRole_dyn();
 
-		virtual  ::borogove::Participant getParticipantDetails(::String participantId) { return 0; }
-		::Dynamic getParticipantDetails_dyn();
-		 ::borogove::Participant getParticipantDetails__fromC(::String participantId);
-		::Dynamic getParticipantDetails__fromC_dyn();
+		virtual void removeRole( ::borogove::Member member, ::borogove::Role role);
+		::Dynamic removeRole_dyn();
 
-		virtual void correctMessage(::String localId, ::borogove::ChatMessageBuilder message) {}
+		virtual void correctMessage( ::borogove::ChatMessage correct, ::borogove::ChatMessageBuilder message) {}
 		::Dynamic correctMessage_dyn();
-		void correctMessage__fromC(::String localId, ::borogove::ChatMessageBuilder message);
+		void correctMessage__fromC( ::borogove::ChatMessage correct, ::borogove::ChatMessageBuilder message);
 		::Dynamic correctMessage__fromC_dyn();
 
+		void moderate( ::borogove::ChatMessage message,::String reason);
+		::Dynamic moderate_dyn();
+
 		void addReaction( ::borogove::ChatMessage m, ::borogove::Reaction reaction);
 		::Dynamic addReaction_dyn();
 
@@ -198,11 +226,6 @@ class HXCPP_CLASS_ATTRIBUTES Chat_obj : public ::hx::Object
 		bool notifyReply();
 		::Dynamic notifyReply_dyn();
 
-		virtual ::String lastMessageId() { return 0; }
-		::Dynamic lastMessageId_dyn();
-		::String lastMessageId__fromC();
-		::Dynamic lastMessageId__fromC_dyn();
-
 		void updateFromBookmark( ::borogove::Stanza item);
 		::Dynamic updateFromBookmark_dyn();
 
@@ -215,9 +238,11 @@ class HXCPP_CLASS_ATTRIBUTES Chat_obj : public ::hx::Object
 		::String getPlaceholder();
 		::Dynamic getPlaceholder_dyn();
 
-		::String readUpTo();
+		::Dynamic readUpTo();
 		::Dynamic readUpTo_dyn();
 
+		void readUpTo__fromC(::cpp::Function< void  (void*,void*) > handler,void* handler__context);
+
 		int unreadCount();
 		::Dynamic unreadCount_dyn();
 
@@ -227,7 +252,7 @@ class HXCPP_CLASS_ATTRIBUTES Chat_obj : public ::hx::Object
 		virtual ::String preview();
 		::Dynamic preview_dyn();
 
-		void setLastMessage( ::borogove::ChatMessage message);
+		virtual ::Dynamic setLastMessage( ::borogove::ChatMessage message);
 		::Dynamic setLastMessage_dyn();
 
 		void setDisplayName(::String displayName);
@@ -236,21 +261,18 @@ class HXCPP_CLASS_ATTRIBUTES Chat_obj : public ::hx::Object
 		virtual ::String getDisplayName();
 		::Dynamic getDisplayName_dyn();
 
-		virtual void setPresence(::String resource, ::borogove::Presence presence);
-		::Dynamic setPresence_dyn();
+		::Array< ::String > getTags();
+		::Dynamic getTags_dyn();
 
-		void setCaps(::String resource, ::borogove::Caps caps);
-		::Dynamic setCaps_dyn();
+		size_t getTags__fromC(const char*** outPtr);
 
-		void removePresence(::String resource);
-		::Dynamic removePresence_dyn();
+		void setThreadSubject(::String threadId,::String subject);
+		::Dynamic setThreadSubject_dyn();
 
-		virtual  ::Dynamic getCaps();
+		virtual void setPresence(::String resource, ::borogove::Stanza presence,bool noStore) {}
+		::Dynamic setPresence_dyn();
+		virtual  ::Dynamic getCaps() { return 0; }
 		::Dynamic getCaps_dyn();
-
-		 ::borogove::Caps getResourceCaps(::String resource);
-		::Dynamic getResourceCaps_dyn();
-
 		void setAvatarSha1(::Array< unsigned char > sha1);
 		::Dynamic setAvatarSha1_dyn();
 
@@ -301,6 +323,9 @@ class HXCPP_CLASS_ATTRIBUTES Chat_obj : public ::hx::Object
 		virtual bool canSend();
 		::Dynamic canSend_dyn();
 
+		virtual bool canModerate();
+		::Dynamic canModerate_dyn();
+
 		virtual void invite( ::borogove::Chat other,::String threadId);
 		::Dynamic invite_dyn();
 
@@ -321,16 +346,18 @@ class HXCPP_CLASS_ATTRIBUTES Chat_obj : public ::hx::Object
 		::Array< ::Dynamic> commandJids();
 		::Dynamic commandJids_dyn();
 
-		 ::borogove::Participant invitedBy();
+		::Dynamic invitedBy();
 		::Dynamic invitedBy_dyn();
 
+		void invitedBy__fromC(::cpp::Function< void  (void*,void*) > handler,void* handler__context);
+
 		::Array< ::Dynamic> invites();
 		::Dynamic invites_dyn();
 
 		::Dynamic recomputeUnread();
 		::Dynamic recomputeUnread_dyn();
 
-		::Dynamic markReadUpToId(::String upTo,::String upToBy);
+		::Dynamic markReadUpToId(::String upTo,::String upToBy,::hx::Null< bool >  recompute);
 		::Dynamic markReadUpToId_dyn();
 
 		::Dynamic markReadUpToMessage( ::borogove::ChatMessage message);
diff --git a/Sources/c_borogove/iinclude/borogove/ChatMessage.h b/Sources/c_borogove/iinclude/borogove/ChatMessage.h
index 40263f4..f05b910 100644
--- a/Sources/c_borogove/iinclude/borogove/ChatMessage.h
+++ b/Sources/c_borogove/iinclude/borogove/ChatMessage.h
@@ -11,8 +11,11 @@ HX_DECLARE_CLASS1(borogove,ChatMessage)
 HX_DECLARE_CLASS1(borogove,ChatMessageBuilder)
 HX_DECLARE_CLASS1(borogove,EncryptionInfo)
 HX_DECLARE_CLASS1(borogove,Hash)
+HX_DECLARE_CLASS1(borogove,Html)
 HX_DECLARE_CLASS1(borogove,JID)
-HX_DECLARE_CLASS1(borogove,Participant)
+HX_DECLARE_CLASS1(borogove,LinkMetadata)
+HX_DECLARE_CLASS1(borogove,Member)
+HX_DECLARE_CLASS1(borogove,Node)
 HX_DECLARE_CLASS1(borogove,Reaction)
 HX_DECLARE_CLASS1(borogove,Stanza)
 HX_DECLARE_CLASS1(haxe,IMap)
@@ -75,6 +78,7 @@ class HXCPP_CLASS_ATTRIBUTES ChatMessage_obj : public ::hx::Object
 		int type__fromC();
 		::Dynamic type__fromC_dyn();
 
+		::String sortId;
 		bool syncPoint;
 		::String replyId;
 		::String timestamp;
@@ -112,9 +116,6 @@ class HXCPP_CLASS_ATTRIBUTES ChatMessage_obj : public ::hx::Object
 		size_t reactionDetails__fromC(::String reactionKey,void*** outPtr);
 
 		::String text;
-		::String text__fromC();
-		::Dynamic text__fromC_dyn();
-
 		::String lang;
 		::String lang__fromC();
 		::Dynamic lang__fromC_dyn();
@@ -139,6 +140,9 @@ class HXCPP_CLASS_ATTRIBUTES ChatMessage_obj : public ::hx::Object
 		 ::borogove::EncryptionInfo encryption__fromC();
 		::Dynamic encryption__fromC_dyn();
 
+		::Array< ::Dynamic> linkMetadata;
+		size_t linkMetadata__fromC(void*** outPtr);
+
 		 ::borogove::Stanza stanza;
 		 ::borogove::ChatMessageBuilder reply();
 		::Dynamic reply_dyn();
@@ -155,8 +159,14 @@ class HXCPP_CLASS_ATTRIBUTES ChatMessage_obj : public ::hx::Object
 		::Array< ::Dynamic> inlineHashReferences();
 		::Dynamic inlineHashReferences_dyn();
 
-		::String html( ::borogove::Participant sender);
-		::Dynamic html_dyn();
+		::Array< ::Dynamic> htmlBody();
+		::Dynamic htmlBody_dyn();
+
+		 ::borogove::Html body( ::borogove::Member sender);
+		::Dynamic body_dyn();
+
+		::String subject();
+		::Dynamic subject_dyn();
 
 		::String chatId();
 		::Dynamic chatId_dyn();
@@ -164,12 +174,21 @@ class HXCPP_CLASS_ATTRIBUTES ChatMessage_obj : public ::hx::Object
 		::String account();
 		::Dynamic account_dyn();
 
+		 ::borogove::Member senderMemberStub();
+		::Dynamic senderMemberStub_dyn();
+
+		bool canReplace( ::borogove::ChatMessage other);
+		::Dynamic canReplace_dyn();
+
 		bool isIncoming();
 		::Dynamic isIncoming_dyn();
 
 		::String threadIcon();
 		::Dynamic threadIcon_dyn();
 
+		::String moderationReason();
+		::Dynamic moderationReason_dyn();
+
 		::String callStatus();
 		::Dynamic callStatus_dyn();
 
diff --git a/Sources/c_borogove/iinclude/borogove/ChatMessageBuilder.h b/Sources/c_borogove/iinclude/borogove/ChatMessageBuilder.h
index ca0169e..f253c42 100644
--- a/Sources/c_borogove/iinclude/borogove/ChatMessageBuilder.h
+++ b/Sources/c_borogove/iinclude/borogove/ChatMessageBuilder.h
@@ -10,12 +10,12 @@ HX_DECLARE_CLASS1(borogove,ChatAttachment)
 HX_DECLARE_CLASS1(borogove,ChatMessage)
 HX_DECLARE_CLASS1(borogove,ChatMessageBuilder)
 HX_DECLARE_CLASS1(borogove,EncryptionInfo)
+HX_DECLARE_CLASS1(borogove,Html)
 HX_DECLARE_CLASS1(borogove,JID)
-HX_DECLARE_CLASS1(borogove,Node)
+HX_DECLARE_CLASS1(borogove,LinkMetadata)
 HX_DECLARE_CLASS1(borogove,Stanza)
 HX_DECLARE_CLASS1(haxe,IMap)
 HX_DECLARE_CLASS2(haxe,ds,StringMap)
-HX_DECLARE_CLASS1(htmlparser,HtmlNode)
 
 namespace borogove{
 
@@ -79,6 +79,7 @@ class HXCPP_CLASS_ATTRIBUTES ChatMessageBuilder_obj : public ::hx::Object
 		void set_serverIdBy__fromC(::String value);
 		::Dynamic set_serverIdBy__fromC_dyn();
 
+		::String sortId;
 		int type;
 		int type__fromC();
 		::Dynamic type__fromC_dyn();
@@ -126,12 +127,6 @@ class HXCPP_CLASS_ATTRIBUTES ChatMessageBuilder_obj : public ::hx::Object
 
 		 ::haxe::ds::StringMap reactions;
 		::String text;
-		::String text__fromC();
-		::Dynamic text__fromC_dyn();
-
-		void set_text__fromC(::String value);
-		::Dynamic set_text__fromC_dyn();
-
 		::String lang;
 		::String lang__fromC();
 		::Dynamic lang__fromC_dyn();
@@ -174,6 +169,12 @@ class HXCPP_CLASS_ATTRIBUTES ChatMessageBuilder_obj : public ::hx::Object
 		::Dynamic set_encryption__fromC_dyn();
 
 		 ::borogove::EncryptionInfo encryption;
+		void set_linkMetadata__fromC(::cpp::Pointer< void* > inPtr,size_t count);
+		::Dynamic set_linkMetadata__fromC_dyn();
+
+		size_t linkMetadata__fromC(void*** outPtr);
+
+		::Array< ::Dynamic> linkMetadata;
 		 ::borogove::Stanza stanza;
 		void attachSims( ::borogove::Stanza sims);
 		::Dynamic attachSims_dyn();
@@ -181,11 +182,11 @@ class HXCPP_CLASS_ATTRIBUTES ChatMessageBuilder_obj : public ::hx::Object
 		void addAttachment( ::borogove::ChatAttachment attachment);
 		::Dynamic addAttachment_dyn();
 
-		void setHtml(::String html);
-		::Dynamic setHtml_dyn();
+		void setBody( ::borogove::Html html);
+		::Dynamic setBody_dyn();
 
-		 ::borogove::Node htmlToNode( ::htmlparser::HtmlNode node);
-		::Dynamic htmlToNode_dyn();
+		void setSubject(::String subject);
+		::Dynamic setSubject_dyn();
 
 		::String chatId();
 		::Dynamic chatId_dyn();
diff --git a/Sources/c_borogove/iinclude/borogove/Client.h b/Sources/c_borogove/iinclude/borogove/Client.h
index b5bda11..82538ef 100644
--- a/Sources/c_borogove/iinclude/borogove/Client.h
+++ b/Sources/c_borogove/iinclude/borogove/Client.h
@@ -11,10 +11,13 @@
 #endif
 HX_DECLARE_CLASS1(borogove,AttachmentSource)
 HX_DECLARE_CLASS1(borogove,AvailableChat)
+HX_DECLARE_CLASS1(borogove,AvailableChatIterator)
 HX_DECLARE_CLASS1(borogove,Caps)
+HX_DECLARE_CLASS1(borogove,CapsRepo)
 HX_DECLARE_CLASS1(borogove,Chat)
 HX_DECLARE_CLASS1(borogove,ChatAttachment)
 HX_DECLARE_CLASS1(borogove,ChatMessage)
+HX_DECLARE_CLASS1(borogove,ChatMessageBuilder)
 HX_DECLARE_CLASS1(borogove,Client)
 HX_DECLARE_CLASS1(borogove,DirectChat)
 HX_DECLARE_CLASS1(borogove,EncryptionInfo)
@@ -28,6 +31,7 @@ HX_DECLARE_CLASS1(borogove,ModerationAction)
 HX_DECLARE_CLASS1(borogove,Persistence)
 HX_DECLARE_CLASS1(borogove,ProfileBuilder)
 HX_DECLARE_CLASS1(borogove,Stanza)
+HX_DECLARE_CLASS1(borogove,Status)
 HX_DECLARE_CLASS2(borogove,calls,InitiatedSession)
 HX_DECLARE_CLASS2(borogove,calls,MediaStream)
 HX_DECLARE_CLASS2(borogove,calls,MediaStreamTrack)
@@ -83,15 +87,18 @@ class HXCPP_CLASS_ATTRIBUTES Client_obj : public  ::borogove::EventEmitter_obj
 		 ::borogove::JID jid;
 		::Array< ::Dynamic> chats;
 		::Dynamic persistence;
+		 ::borogove::CapsRepo capsRepo;
 		 ::borogove::Caps caps;
 		::String _displayName;
 		::String fastMechanism;
 		::String token;
 		 ::Dynamic fastCount;
+		::String sortId;
 		 ::haxe::ds::StringMap pendingCaps;
 		 ::haxe::ds::StringMap brokenAvatars;
 		 ::borogove::EncryptionPolicy encryptionPolicy;
 		bool inSync;
+		bool firstSync;
 		void processLiveMessage( ::borogove::Stanza stanza, ::borogove::Stanza fwd, ::borogove::EncryptionInfo encryptionInfo);
 		::Dynamic processLiveMessage_dyn();
 
@@ -118,6 +125,9 @@ class HXCPP_CLASS_ATTRIBUTES Client_obj : public  ::borogove::EventEmitter_obj
 		void setProfile( ::borogove::ProfileBuilder profile,bool publicAccess);
 		::Dynamic setProfile_dyn();
 
+		void setStatus( ::borogove::Status status,::hx::Null< int >  expires,::hx::Null< bool >  publicAccess);
+		::Dynamic setStatus_dyn();
+
 		bool updateDisplayName(::String fn);
 		::Dynamic updateDisplayName_dyn();
 
@@ -137,10 +147,13 @@ class HXCPP_CLASS_ATTRIBUTES Client_obj : public  ::borogove::EventEmitter_obj
 
 		size_t getChats__fromC(void*** outPtr);
 
-		void findAvailableChats(::String q, ::Dynamic callback);
+		 ::borogove::AvailableChatIterator findAvailableChats(::String q);
 		::Dynamic findAvailableChats_dyn();
 
-		void findAvailableChats__fromC(::String q,::cpp::Function< bool  (const char*,void**,size_t,void*) > callback,void* callback__context);
+		::Dynamic availableChatSources();
+		::Dynamic availableChatSources_dyn();
+
+		void availableChatSources__fromC(::cpp::Function< void  (const char**,size_t,void*) > handler,void* handler__context);
 
 		 ::borogove::Chat startChat( ::borogove::AvailableChat availableChat);
 		::Dynamic startChat_dyn();
@@ -252,6 +265,12 @@ class HXCPP_CLASS_ATTRIBUTES Client_obj : public  ::borogove::EventEmitter_obj
 		void sortChats();
 		::Dynamic sortChats_dyn();
 
+		::String nextSortId();
+		::Dynamic nextSortId_dyn();
+
+		::Dynamic storeMessageBuilder( ::borogove::ChatMessageBuilder builder);
+		::Dynamic storeMessageBuilder_dyn();
+
 		::Dynamic storeMessages(::Array< ::Dynamic> messages);
 		::Dynamic storeMessages_dyn();
 
@@ -302,13 +321,16 @@ class HXCPP_CLASS_ATTRIBUTES Client_obj : public  ::borogove::EventEmitter_obj
 		void bookmarksGet( ::Dynamic callback);
 		::Dynamic bookmarksGet_dyn();
 
+		void checkForReceipts( ::borogove::Stanza stanza);
+		::Dynamic checkForReceipts_dyn();
+
 		void sync( ::Dynamic callback);
 		::Dynamic sync_dyn();
 
 		void onMAMJMI(::String sid, ::borogove::Stanza stanza);
 		::Dynamic onMAMJMI_dyn();
 
-		void doSync( ::Dynamic callback,::String lastId);
+		void doSync( ::Dynamic callback, ::borogove::ChatMessage syncPoint,::String sortA);
 		::Dynamic doSync_dyn();
 
 		void pingAllChannels(bool refresh);
diff --git a/Sources/c_borogove/iinclude/borogove/DirectChat.h b/Sources/c_borogove/iinclude/borogove/DirectChat.h
index ebf6136..1dc78de 100644
--- a/Sources/c_borogove/iinclude/borogove/DirectChat.h
+++ b/Sources/c_borogove/iinclude/borogove/DirectChat.h
@@ -9,6 +9,7 @@
 #ifndef INCLUDED_borogove_Chat
 #include <borogove/Chat.h>
 #endif
+HX_DECLARE_CLASS1(borogove,Caps)
 HX_DECLARE_CLASS1(borogove,Chat)
 HX_DECLARE_CLASS1(borogove,ChatMessage)
 HX_DECLARE_CLASS1(borogove,ChatMessageBuilder)
@@ -17,10 +18,11 @@ HX_DECLARE_CLASS1(borogove,DirectChat)
 HX_DECLARE_CLASS1(borogove,EventEmitter)
 HX_DECLARE_CLASS1(borogove,GenericStream)
 HX_DECLARE_CLASS1(borogove,OutboxItem)
-HX_DECLARE_CLASS1(borogove,Participant)
 HX_DECLARE_CLASS1(borogove,Persistence)
 HX_DECLARE_CLASS1(borogove,Reaction)
 HX_DECLARE_CLASS1(borogove,Stanza)
+HX_DECLARE_CLASS1(haxe,IMap)
+HX_DECLARE_CLASS2(haxe,ds,StringMap)
 HX_DECLARE_CLASS1(thenshim,Thenable)
 
 namespace borogove{
@@ -36,13 +38,13 @@ class HXCPP_CLASS_ATTRIBUTES DirectChat_obj : public  ::borogove::Chat_obj
 	public:
 		enum { _hx_ClassId = 0x31b454e2 };
 
-		void __construct( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs);
+		void __construct( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs);
 		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.DirectChat")
 			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
 		inline void *operator new(size_t inSize, int extra)
 			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.DirectChat"); }
-		static ::hx::ObjectPtr< DirectChat_obj > __new( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs);
-		static ::hx::ObjectPtr< DirectChat_obj > __alloc(::hx::Ctx *_hx_ctx, ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs);
+		static ::hx::ObjectPtr< DirectChat_obj > __new( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs);
+		static ::hx::ObjectPtr< DirectChat_obj > __alloc(::hx::Ctx *_hx_ctx, ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs);
 		static void * _hx_vtable;
 		static Dynamic __CreateEmpty();
 		static Dynamic __Create(::hx::DynamicArray inArgs);
@@ -50,31 +52,48 @@ class HXCPP_CLASS_ATTRIBUTES DirectChat_obj : public  ::borogove::Chat_obj
 
 		HX_DO_RTTI_ALL;
 		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
+		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
+		void __GetFields(Array< ::String> &outFields);
 		static void __register();
+		void __Mark(HX_MARK_PARAMS);
+		void __Visit(HX_VISIT_PARAMS);
 		bool _hx_isInstanceOf(int inClassId);
 		::String __ToString() const { return HX_("DirectChat",c1,22,a3,05); }
 
 		static void __boot();
 		static  ::Dynamic __meta__;
-		::Array< ::String > getParticipants();
+		 ::haxe::ds::StringMap presence;
+		::Array< ::String > _fullCounterparts;
+		void setPresence(::String resource, ::borogove::Stanza presence,bool noStore);
+
+		 ::Dynamic getCaps();
+
+		 ::borogove::Caps getResourceCaps(::String resource);
+		::Dynamic getResourceCaps_dyn();
+
+		::String getDisplayName();
+
+		::Dynamic members();
+
+		::Dynamic getMemberDetails(::Array< ::String > memberIds);
+
+		::Dynamic setLastMessage( ::borogove::ChatMessage message);
 
 		::Array< ::String > counterparts();
 		::Dynamic counterparts_dyn();
 
-		 ::borogove::Participant getParticipantDetails(::String participantId);
+		::Dynamic getMessagesBefore( ::borogove::ChatMessage before);
 
-		::Dynamic getMessagesBefore(::String beforeId,::String beforeTime);
+		::Dynamic getMessagesAfter( ::borogove::ChatMessage after);
 
-		::Dynamic getMessagesAfter(::String afterId,::String afterTime);
-
-		::Dynamic getMessagesAround(::String aroundId,::String aroundTime);
+		::Dynamic getMessagesAround( ::borogove::ChatMessage around);
 
 		 ::borogove::ChatMessageBuilder prepareIncomingMessage( ::borogove::ChatMessageBuilder message, ::borogove::Stanza stanza);
 
 		 ::borogove::ChatMessageBuilder prepareOutgoingMessage( ::borogove::ChatMessageBuilder message);
 		::Dynamic prepareOutgoingMessage_dyn();
 
-		void correctMessage(::String localId, ::borogove::ChatMessageBuilder message);
+		void correctMessage( ::borogove::ChatMessage correct, ::borogove::ChatMessageBuilder message);
 
 		void sendMessage( ::borogove::ChatMessageBuilder message);
 
@@ -82,8 +101,6 @@ class HXCPP_CLASS_ATTRIBUTES DirectChat_obj : public  ::borogove::Chat_obj
 
 		void sendMessageStanza( ::borogove::Stanza stanza, ::borogove::OutboxItem outboxItem);
 
-		::String lastMessageId();
-
 		void markReadUpTo( ::borogove::ChatMessage message);
 
 		void bookmark();
diff --git a/Sources/c_borogove/iinclude/borogove/Emoji.h b/Sources/c_borogove/iinclude/borogove/Emoji.h
index 869ae78..12a1d2a 100644
--- a/Sources/c_borogove/iinclude/borogove/Emoji.h
+++ b/Sources/c_borogove/iinclude/borogove/Emoji.h
@@ -9,7 +9,7 @@
 #ifndef INCLUDED_borogove_Symbol
 #include <borogove/Symbol.h>
 #endif
-HX_DECLARE_STACK_FRAME(_hx_pos_22aff44d6d78c3e4_136_new)
+HX_DECLARE_STACK_FRAME(_hx_pos_22aff44d6d78c3e4_144_new)
 HX_DECLARE_CLASS1(borogove,Emoji)
 HX_DECLARE_CLASS1(borogove,Symbol)
 
@@ -42,8 +42,8 @@ class HXCPP_CLASS_ATTRIBUTES Emoji_obj : public  ::borogove::Symbol_obj
 			Emoji_obj *__this = (Emoji_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Emoji_obj), true, "borogove.Emoji"));
 			*(void **)__this = Emoji_obj::_hx_vtable;
 {
-            	HX_STACKFRAME(&_hx_pos_22aff44d6d78c3e4_136_new)
-HXDLIN( 136)		__this->super::__construct(codepoints);
+            	HX_STACKFRAME(&_hx_pos_22aff44d6d78c3e4_144_new)
+HXDLIN( 144)		__this->super::__construct(codepoints);
             	}
 		
 			return __this;
diff --git a/Sources/c_borogove/iinclude/borogove/EmojiUtil.h b/Sources/c_borogove/iinclude/borogove/EmojiUtil.h
index 784b8c9..23e12c7 100644
--- a/Sources/c_borogove/iinclude/borogove/EmojiUtil.h
+++ b/Sources/c_borogove/iinclude/borogove/EmojiUtil.h
@@ -71,6 +71,10 @@ class HXCPP_CLASS_ATTRIBUTES EmojiUtil_obj : public ::hx::Object
 		static  ::borogove::UnicodeRange TAGS;
 		static  ::borogove::UnicodeList CYK_SYMBOLS_AND_PUNCTUATION;
 		static  ::borogove::UnicodeList LETTERLIKE_SYMBOLS;
+		static  ::borogove::UnicodeList GENERAL_PUNCTUATION;
+		static  ::borogove::UnicodeRange ARROWS;
+		static  ::borogove::UnicodeRange ENCLOSED_ALPHANUMERICS;
+		static  ::borogove::UnicodeRange MISC_SYMBOLS_AND_ARROWS;
 		static  ::borogove::UnicodeBlocks KEYCAP_COMBINEABLE;
 		static  ::borogove::UnicodeBlocks SYMBOLIZE;
 		static  ::borogove::UnicodeBlocks EMOJIS;
diff --git a/Sources/c_borogove/iinclude/borogove/EventEmitter.h b/Sources/c_borogove/iinclude/borogove/EventEmitter.h
index 66ac808..d5abae7 100644
--- a/Sources/c_borogove/iinclude/borogove/EventEmitter.h
+++ b/Sources/c_borogove/iinclude/borogove/EventEmitter.h
@@ -38,7 +38,9 @@ class HXCPP_CLASS_ATTRIBUTES EventEmitter_obj : public ::hx::Object
 
 		HX_DO_RTTI_ALL;
 		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
+		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
 		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
+		static bool __SetStatic(const ::String &inString, Dynamic &ioValue, ::hx::PropertyAccess inCallProp);
 		void __GetFields(Array< ::String> &outFields);
 		static void __register();
 		void __Mark(HX_MARK_PARAMS);
@@ -46,7 +48,8 @@ class HXCPP_CLASS_ATTRIBUTES EventEmitter_obj : public ::hx::Object
 		bool _hx_isInstanceOf(int inClassId);
 		::String __ToString() const { return HX_("EventEmitter",94,78,5d,17); }
 
-		int nextEventHandlerToken;
+		static void __boot();
+		static int nextEventHandlerToken;
 		 ::haxe::ds::StringMap eventHandlers;
 		int on(::String eventName, ::Dynamic callback);
 		::Dynamic on_dyn();
diff --git a/Sources/c_borogove/iinclude/borogove/FormOption.h b/Sources/c_borogove/iinclude/borogove/FormOption.h
index 7d0436d..b279f0a 100644
--- a/Sources/c_borogove/iinclude/borogove/FormOption.h
+++ b/Sources/c_borogove/iinclude/borogove/FormOption.h
@@ -6,7 +6,7 @@
 #include <hxcpp.h>
 #endif
 
-HX_DECLARE_STACK_FRAME(_hx_pos_a7d595b8126d2317_218_new)
+HX_DECLARE_STACK_FRAME(_hx_pos_a7d595b8126d2317_221_new)
 HX_DECLARE_CLASS1(borogove,FormOption)
 HX_DECLARE_CLASS1(borogove,Stanza)
 
@@ -39,23 +39,23 @@ class HXCPP_CLASS_ATTRIBUTES FormOption_obj : public ::hx::Object
 			FormOption_obj *__this = (FormOption_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(FormOption_obj), true, "borogove.FormOption"));
 			*(void **)__this = FormOption_obj::_hx_vtable;
 {
-            	HX_STACKFRAME(&_hx_pos_a7d595b8126d2317_218_new)
-HXLINE( 219)		::String _hx_tmp;
-HXDLIN( 219)		if (::hx::IsNotNull( label )) {
-HXLINE( 219)			_hx_tmp = label;
+            	HX_STACKFRAME(&_hx_pos_a7d595b8126d2317_221_new)
+HXLINE( 222)		::String _hx_tmp;
+HXDLIN( 222)		if (::hx::IsNotNull( label )) {
+HXLINE( 222)			_hx_tmp = label;
             		}
             		else {
-HXLINE( 219)			_hx_tmp = value;
+HXLINE( 222)			_hx_tmp = value;
             		}
-HXDLIN( 219)		( ( ::borogove::FormOption)(__this) )->label = _hx_tmp;
-HXLINE( 220)		::String _hx_tmp1;
-HXDLIN( 220)		if (::hx::IsNotNull( value )) {
-HXLINE( 220)			_hx_tmp1 = value;
+HXDLIN( 222)		( ( ::borogove::FormOption)(__this) )->label = _hx_tmp;
+HXLINE( 223)		::String _hx_tmp1;
+HXDLIN( 223)		if (::hx::IsNotNull( value )) {
+HXLINE( 223)			_hx_tmp1 = value;
             		}
             		else {
-HXLINE( 220)			_hx_tmp1 = HX_("",00,00,00,00);
+HXLINE( 223)			_hx_tmp1 = HX_("",00,00,00,00);
             		}
-HXDLIN( 220)		( ( ::borogove::FormOption)(__this) )->value = _hx_tmp1;
+HXDLIN( 223)		( ( ::borogove::FormOption)(__this) )->value = _hx_tmp1;
             	}
 		
 			return __this;
diff --git a/Sources/c_borogove/iinclude/borogove/GenericStream.h b/Sources/c_borogove/iinclude/borogove/GenericStream.h
index 2682888..9501dcd 100644
--- a/Sources/c_borogove/iinclude/borogove/GenericStream.h
+++ b/Sources/c_borogove/iinclude/borogove/GenericStream.h
@@ -55,8 +55,6 @@ class HXCPP_CLASS_ATTRIBUTES GenericStream_obj : public  ::borogove::EventEmitte
 		::Dynamic disconnect_dyn();
 		virtual void sendStanza( ::borogove::Stanza stanza) {}
 		::Dynamic sendStanza_dyn();
-		virtual ::String newId() { return 0; }
-		::Dynamic newId_dyn();
 		virtual void onIq( ::borogove::IqRequestType type,::String tag,::String xmlns, ::Dynamic handler) {}
 		::Dynamic onIq_dyn();
 		void sendIq( ::borogove::Stanza stanza, ::Dynamic callback);
diff --git a/Sources/c_borogove/iinclude/borogove/Html.h b/Sources/c_borogove/iinclude/borogove/Html.h
new file mode 100644
index 0000000..aaf6232
--- /dev/null
+++ b/Sources/c_borogove/iinclude/borogove/Html.h
@@ -0,0 +1,95 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_borogove_Html
+#define INCLUDED_borogove_Html
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(borogove,Html)
+HX_DECLARE_CLASS1(borogove,Member)
+HX_DECLARE_CLASS1(borogove,Node)
+HX_DECLARE_CLASS1(htmlparser,HtmlNode)
+
+namespace borogove{
+
+
+class HXCPP_CLASS_ATTRIBUTES Html_obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef Html_obj OBJ_;
+		Html_obj();
+
+	public:
+		enum { _hx_ClassId = 0x2e26b4ec };
+
+		void __construct(::Array< ::Dynamic> xml, ::borogove::Member sender);
+		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.Html")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.Html"); }
+		static ::hx::ObjectPtr< Html_obj > __new(::Array< ::Dynamic> xml, ::borogove::Member sender);
+		static ::hx::ObjectPtr< Html_obj > __alloc(::hx::Ctx *_hx_ctx,::Array< ::Dynamic> xml, ::borogove::Member sender);
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~Html_obj();
+
+		HX_DO_RTTI_ALL;
+		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
+		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
+		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
+		static bool __SetStatic(const ::String &inString, Dynamic &ioValue, ::hx::PropertyAccess inCallProp);
+		void __GetFields(Array< ::String> &outFields);
+		static void __register();
+		void __Mark(HX_MARK_PARAMS);
+		void __Visit(HX_VISIT_PARAMS);
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("Html",8b,c1,ef,2f); }
+
+		static void __boot();
+		static  ::Dynamic __meta__;
+		static ::Array< ::String > HTML_EMPTY;
+		static  ::borogove::Html element(::String tag,::Array< ::String > attr,::Array< ::String > attrValues,::Array< ::Dynamic> children);
+		static ::Dynamic element_dyn();
+
+		static  ::borogove::Html element__fromC(::String tag,::cpp::Pointer< const char* > attr,size_t attr__len,::cpp::Pointer< const char* > attrValues,size_t attrValues__len,::cpp::Pointer< void* > children,size_t children__len);
+		static ::Dynamic element__fromC_dyn();
+
+		static  ::borogove::Html text(::String text);
+		static ::Dynamic text_dyn();
+
+		static  ::borogove::Html fragment(::Array< ::Dynamic> nodes);
+		static ::Dynamic fragment_dyn();
+
+		static  ::borogove::Html fragment__fromC(::cpp::Pointer< void* > nodes,size_t nodes__len);
+		static ::Dynamic fragment__fromC_dyn();
+
+		static  ::borogove::Html fromString(::String html);
+		static ::Dynamic fromString_dyn();
+
+		static  ::borogove::Node htmlToNode( ::htmlparser::HtmlNode node);
+		static ::Dynamic htmlToNode_dyn();
+
+		::Array< ::Dynamic> xml;
+		 ::borogove::Member sender;
+		bool isPlainText();
+		::Dynamic isPlainText_dyn();
+
+		::cpp::VirtualArray reduce( ::Dynamic f);
+		::Dynamic reduce_dyn();
+
+		size_t reduce__fromC(::cpp::Function< void*  (const char*,const char**,ptrdiff_t,const char**,ptrdiff_t,void**,ptrdiff_t,void*) > f,void* f__context,void*** outPtr);
+
+		virtual ::String toString();
+		::Dynamic toString_dyn();
+
+		::String toPlainText();
+		::Dynamic toPlainText_dyn();
+
+};
+
+} // end namespace borogove
+
+#endif /* INCLUDED_borogove_Html */ 
diff --git a/Sources/c_borogove/iinclude/borogove/JsonPrinter.h b/Sources/c_borogove/iinclude/borogove/JsonPrinter.h
index ae6a61a..3cb799e 100644
--- a/Sources/c_borogove/iinclude/borogove/JsonPrinter.h
+++ b/Sources/c_borogove/iinclude/borogove/JsonPrinter.h
@@ -54,12 +54,21 @@ class HXCPP_CLASS_ATTRIBUTES JsonPrinter_obj : public ::hx::Object
 		::String indent;
 		bool pretty;
 		int nind;
+		void ipad();
+		::Dynamic ipad_dyn();
+
+		void newl();
+		::Dynamic newl_dyn();
+
 		void write( ::Dynamic k, ::Dynamic v);
 		::Dynamic write_dyn();
 
 		void classString( ::Dynamic v);
 		::Dynamic classString_dyn();
 
+		void objString( ::Dynamic v);
+		::Dynamic objString_dyn();
+
 		void fieldsString( ::Dynamic v,::Array< ::String > fields);
 		::Dynamic fieldsString_dyn();
 
diff --git a/Sources/c_borogove/iinclude/borogove/LinkMetadata.h b/Sources/c_borogove/iinclude/borogove/LinkMetadata.h
new file mode 100644
index 0000000..503b0f3
--- /dev/null
+++ b/Sources/c_borogove/iinclude/borogove/LinkMetadata.h
@@ -0,0 +1,74 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_borogove_LinkMetadata
+#define INCLUDED_borogove_LinkMetadata
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(borogove,LinkMetadata)
+
+namespace borogove{
+
+
+class HXCPP_CLASS_ATTRIBUTES LinkMetadata_obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef LinkMetadata_obj OBJ_;
+		LinkMetadata_obj();
+
+	public:
+		enum { _hx_ClassId = 0x7d1b4e0a };
+
+		void __construct(::String about,::String url,::String title,::String description,::Array< ::String > image,::Array< ::String > video);
+		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.LinkMetadata")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.LinkMetadata"); }
+		static ::hx::ObjectPtr< LinkMetadata_obj > __new(::String about,::String url,::String title,::String description,::Array< ::String > image,::Array< ::String > video);
+		static ::hx::ObjectPtr< LinkMetadata_obj > __alloc(::hx::Ctx *_hx_ctx,::String about,::String url,::String title,::String description,::Array< ::String > image,::Array< ::String > video);
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~LinkMetadata_obj();
+
+		HX_DO_RTTI_ALL;
+		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
+		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
+		void __GetFields(Array< ::String> &outFields);
+		static void __register();
+		void __Mark(HX_MARK_PARAMS);
+		void __Visit(HX_VISIT_PARAMS);
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("LinkMetadata",a9,91,c0,44); }
+
+		static void __boot();
+		static  ::Dynamic __meta__;
+		::String about;
+		::String about__fromC();
+		::Dynamic about__fromC_dyn();
+
+		::String url;
+		::String url__fromC();
+		::Dynamic url__fromC_dyn();
+
+		::String title;
+		::String title__fromC();
+		::Dynamic title__fromC_dyn();
+
+		::String description;
+		::String description__fromC();
+		::Dynamic description__fromC_dyn();
+
+		::Array< ::String > image;
+		size_t image__fromC(const char*** outPtr);
+
+		::Array< ::String > video;
+		size_t video__fromC(const char*** outPtr);
+
+};
+
+} // end namespace borogove
+
+#endif /* INCLUDED_borogove_LinkMetadata */ 
diff --git a/Sources/c_borogove/iinclude/borogove/Member.h b/Sources/c_borogove/iinclude/borogove/Member.h
new file mode 100644
index 0000000..07418ec
--- /dev/null
+++ b/Sources/c_borogove/iinclude/borogove/Member.h
@@ -0,0 +1,103 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_borogove_Member
+#define INCLUDED_borogove_Member
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(borogove,AvailableChat)
+HX_DECLARE_CLASS1(borogove,Client)
+HX_DECLARE_CLASS1(borogove,EventEmitter)
+HX_DECLARE_CLASS1(borogove,JID)
+HX_DECLARE_CLASS1(borogove,Member)
+HX_DECLARE_CLASS1(borogove,Role)
+HX_DECLARE_CLASS1(haxe,IMap)
+HX_DECLARE_CLASS2(haxe,ds,StringMap)
+HX_DECLARE_CLASS1(thenshim,Thenable)
+
+namespace borogove{
+
+
+class HXCPP_CLASS_ATTRIBUTES Member_obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef Member_obj OBJ_;
+		Member_obj();
+
+	public:
+		enum { _hx_ClassId = 0x69ada41b };
+
+		void __construct(::String id,::String displayName,::String photoUri,bool isSelf,::Array< ::Dynamic> roles, ::borogove::JID jid, ::haxe::ds::StringMap presence, ::borogove::AvailableChat chat);
+		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.Member")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.Member"); }
+		static ::hx::ObjectPtr< Member_obj > __new(::String id,::String displayName,::String photoUri,bool isSelf,::Array< ::Dynamic> roles, ::borogove::JID jid, ::haxe::ds::StringMap presence, ::borogove::AvailableChat chat);
+		static ::hx::ObjectPtr< Member_obj > __alloc(::hx::Ctx *_hx_ctx,::String id,::String displayName,::String photoUri,bool isSelf,::Array< ::Dynamic> roles, ::borogove::JID jid, ::haxe::ds::StringMap presence, ::borogove::AvailableChat chat);
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~Member_obj();
+
+		HX_DO_RTTI_ALL;
+		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
+		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
+		void __GetFields(Array< ::String> &outFields);
+		static void __register();
+		void __Mark(HX_MARK_PARAMS);
+		void __Visit(HX_VISIT_PARAMS);
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("Member",7a,56,4a,39); }
+
+		static void __boot();
+		static  ::Dynamic __meta__;
+		::String id;
+		::String id__fromC();
+		::Dynamic id__fromC_dyn();
+
+		::String displayName;
+		::String displayName__fromC();
+		::Dynamic displayName__fromC_dyn();
+
+		::String photoUri;
+		::String photoUri__fromC();
+		::Dynamic photoUri__fromC_dyn();
+
+		::String placeholderUri;
+		::String placeholderUri__fromC();
+		::Dynamic placeholderUri__fromC_dyn();
+
+		bool isSelf;
+		bool isSelf__fromC();
+		::Dynamic isSelf__fromC_dyn();
+
+		 ::borogove::AvailableChat chat;
+		 ::borogove::AvailableChat chat__fromC();
+		::Dynamic chat__fromC_dyn();
+
+		::Array< ::Dynamic> roles;
+		size_t roles__fromC(void*** outPtr);
+
+		int showPresence;
+		int showPresence__fromC();
+		::Dynamic showPresence__fromC_dyn();
+
+		 ::haxe::ds::StringMap presence;
+		 ::borogove::JID jid;
+		::Dynamic profile( ::borogove::Client client);
+		::Dynamic profile_dyn();
+
+		void profile__fromC( ::borogove::Client client,::cpp::Function< void  (void*,void*) > handler,void* handler__context);
+
+		::Dynamic status( ::borogove::Client client);
+		::Dynamic status_dyn();
+
+		void status__fromC( ::borogove::Client client,::cpp::Function< void  (void*,void*) > handler,void* handler__context);
+
+};
+
+} // end namespace borogove
+
+#endif /* INCLUDED_borogove_Member */ 
diff --git a/Sources/c_borogove/iinclude/borogove/MemberUpdate.h b/Sources/c_borogove/iinclude/borogove/MemberUpdate.h
new file mode 100644
index 0000000..a3f2622
--- /dev/null
+++ b/Sources/c_borogove/iinclude/borogove/MemberUpdate.h
@@ -0,0 +1,71 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_borogove_MemberUpdate
+#define INCLUDED_borogove_MemberUpdate
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(borogove,Chat)
+HX_DECLARE_CLASS1(borogove,EventEmitter)
+HX_DECLARE_CLASS1(borogove,JID)
+HX_DECLARE_CLASS1(borogove,Member)
+HX_DECLARE_CLASS1(borogove,MemberUpdate)
+HX_DECLARE_CLASS1(borogove,Role)
+HX_DECLARE_CLASS1(borogove,Stanza)
+HX_DECLARE_CLASS1(haxe,IMap)
+HX_DECLARE_CLASS2(haxe,ds,StringMap)
+
+namespace borogove{
+
+
+class HXCPP_CLASS_ATTRIBUTES MemberUpdate_obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef MemberUpdate_obj OBJ_;
+		MemberUpdate_obj();
+
+	public:
+		enum { _hx_ClassId = 0x47de2484 };
+
+		void __construct(::String id, ::borogove::JID jid,::String displayName,bool isSelf, ::borogove::Role affiliation, ::haxe::ds::StringMap presence);
+		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.MemberUpdate")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.MemberUpdate"); }
+		static ::hx::ObjectPtr< MemberUpdate_obj > __new(::String id, ::borogove::JID jid,::String displayName,bool isSelf, ::borogove::Role affiliation, ::haxe::ds::StringMap presence);
+		static ::hx::ObjectPtr< MemberUpdate_obj > __alloc(::hx::Ctx *_hx_ctx,::String id, ::borogove::JID jid,::String displayName,bool isSelf, ::borogove::Role affiliation, ::haxe::ds::StringMap presence);
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~MemberUpdate_obj();
+
+		HX_DO_RTTI_ALL;
+		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
+		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
+		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
+		void __GetFields(Array< ::String> &outFields);
+		static void __register();
+		void __Mark(HX_MARK_PARAMS);
+		void __Visit(HX_VISIT_PARAMS);
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("MemberUpdate",23,68,83,0f); }
+
+		static ::Array< ::Dynamic> extractUpdates(::String accountId, ::borogove::Chat chat, ::borogove::Stanza stanza);
+		static ::Dynamic extractUpdates_dyn();
+
+		::String id;
+		 ::borogove::JID jid;
+		::String displayName;
+		bool isSelf;
+		 ::borogove::Role affiliation;
+		 ::haxe::ds::StringMap presence;
+		 ::Dynamic applyTo( ::borogove::Member member);
+		::Dynamic applyTo_dyn();
+
+};
+
+} // end namespace borogove
+
+#endif /* INCLUDED_borogove_MemberUpdate */ 
diff --git a/Sources/c_borogove/iinclude/borogove/Message.h b/Sources/c_borogove/iinclude/borogove/Message.h
index 8859eb9..3edce52 100644
--- a/Sources/c_borogove/iinclude/borogove/Message.h
+++ b/Sources/c_borogove/iinclude/borogove/Message.h
@@ -49,7 +49,7 @@ class HXCPP_CLASS_ATTRIBUTES Message_obj : public ::hx::Object
 		bool _hx_isInstanceOf(int inClassId);
 		::String __ToString() const { return HX_("Message",a7,5d,62,67); }
 
-		static  ::borogove::Message fromStanza( ::borogove::Stanza stanza, ::borogove::JID localJid, ::Dynamic addContext, ::borogove::EncryptionInfo encryptionInfo);
+		static  ::borogove::Message fromStanza( ::borogove::Stanza stanza, ::borogove::JID localJid, ::Dynamic addContext, ::borogove::EncryptionInfo encryptionInfo,::hx::Null< bool >  preferChatMessage);
 		static ::Dynamic fromStanza_dyn();
 
 		::String chatId;
diff --git a/Sources/c_borogove/iinclude/borogove/MessageStanza.h b/Sources/c_borogove/iinclude/borogove/MessageStanza.h
index 19e0983..532c90a 100644
--- a/Sources/c_borogove/iinclude/borogove/MessageStanza.h
+++ b/Sources/c_borogove/iinclude/borogove/MessageStanza.h
@@ -38,6 +38,8 @@ class MessageStanza_obj : public ::hx::EnumBase_obj
 		static ::Dynamic MucInviteStanza_dyn();
 		static ::borogove::MessageStanza ReactionUpdateStanza( ::borogove::ReactionUpdate update);
 		static ::Dynamic ReactionUpdateStanza_dyn();
+		static ::borogove::MessageStanza SubjectStanza(::String subject);
+		static ::Dynamic SubjectStanza_dyn();
 		static ::borogove::MessageStanza UnknownMessageStanza( ::borogove::Stanza stanza);
 		static ::Dynamic UnknownMessageStanza_dyn();
 };
diff --git a/Sources/c_borogove/iinclude/borogove/MessageSync.h b/Sources/c_borogove/iinclude/borogove/MessageSync.h
index dba3a6d..3999558 100644
--- a/Sources/c_borogove/iinclude/borogove/MessageSync.h
+++ b/Sources/c_borogove/iinclude/borogove/MessageSync.h
@@ -28,13 +28,13 @@ class HXCPP_CLASS_ATTRIBUTES MessageSync_obj : public ::hx::Object
 	public:
 		enum { _hx_ClassId = 0x0e3ada7d };
 
-		void __construct( ::borogove::Client client, ::borogove::GenericStream stream, ::Dynamic filter,::String serviceJID);
+		void __construct( ::borogove::Client client, ::borogove::GenericStream stream, ::Dynamic filter,::String sortA,::String sortB,::String serviceJID);
 		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.MessageSync")
 			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
 		inline void *operator new(size_t inSize, int extra)
 			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.MessageSync"); }
-		static ::hx::ObjectPtr< MessageSync_obj > __new( ::borogove::Client client, ::borogove::GenericStream stream, ::Dynamic filter,::String serviceJID);
-		static ::hx::ObjectPtr< MessageSync_obj > __alloc(::hx::Ctx *_hx_ctx, ::borogove::Client client, ::borogove::GenericStream stream, ::Dynamic filter,::String serviceJID);
+		static ::hx::ObjectPtr< MessageSync_obj > __new( ::borogove::Client client, ::borogove::GenericStream stream, ::Dynamic filter,::String sortA,::String sortB,::String serviceJID);
+		static ::hx::ObjectPtr< MessageSync_obj > __alloc(::hx::Ctx *_hx_ctx, ::borogove::Client client, ::borogove::GenericStream stream, ::Dynamic filter,::String sortA,::String sortB,::String serviceJID);
 		static void * _hx_vtable;
 		static Dynamic __CreateEmpty();
 		static Dynamic __Create(::hx::DynamicArray inArgs);
@@ -60,10 +60,11 @@ class HXCPP_CLASS_ATTRIBUTES MessageSync_obj : public ::hx::Object
 		Dynamic contextHandler_dyn() { return contextHandler;}
 		 ::Dynamic errorHandler;
 		Dynamic errorHandler_dyn() { return errorHandler;}
+		::String sortA;
+		::String sortB;
 		 ::Dynamic lastPage;
 		int progress;
 		bool complete;
-		bool newestPageFirst;
 		 ::haxe::ds::StringMap jmi;
 		void fetchNext();
 		::Dynamic fetchNext_dyn();
@@ -80,9 +81,6 @@ class HXCPP_CLASS_ATTRIBUTES MessageSync_obj : public ::hx::Object
 		void onError( ::Dynamic handler);
 		::Dynamic onError_dyn();
 
-		void setNewestPageFirst(bool newestPageFirst);
-		::Dynamic setNewestPageFirst_dyn();
-
 };
 
 } // end namespace borogove
diff --git a/Sources/c_borogove/iinclude/borogove/Other.h b/Sources/c_borogove/iinclude/borogove/Other.h
index d584a34..964c925 100644
--- a/Sources/c_borogove/iinclude/borogove/Other.h
+++ b/Sources/c_borogove/iinclude/borogove/Other.h
@@ -9,7 +9,7 @@
 #ifndef INCLUDED_borogove_Symbol
 #include <borogove/Symbol.h>
 #endif
-HX_DECLARE_STACK_FRAME(_hx_pos_c8cb9fdf9d715eea_146_new)
+HX_DECLARE_STACK_FRAME(_hx_pos_c8cb9fdf9d715eea_154_new)
 HX_DECLARE_CLASS1(borogove,Other)
 HX_DECLARE_CLASS1(borogove,Symbol)
 
@@ -42,8 +42,8 @@ class HXCPP_CLASS_ATTRIBUTES Other_obj : public  ::borogove::Symbol_obj
 			Other_obj *__this = (Other_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Other_obj), true, "borogove.Other"));
 			*(void **)__this = Other_obj::_hx_vtable;
 {
-            	HX_STACKFRAME(&_hx_pos_c8cb9fdf9d715eea_146_new)
-HXDLIN( 146)		__this->super::__construct(codepoints);
+            	HX_STACKFRAME(&_hx_pos_c8cb9fdf9d715eea_154_new)
+HXDLIN( 154)		__this->super::__construct(codepoints);
             	}
 		
 			return __this;
diff --git a/Sources/c_borogove/iinclude/borogove/Participant.h b/Sources/c_borogove/iinclude/borogove/Participant.h
index ea18b4b..534c86e 100644
--- a/Sources/c_borogove/iinclude/borogove/Participant.h
+++ b/Sources/c_borogove/iinclude/borogove/Participant.h
@@ -6,10 +6,12 @@
 #include <hxcpp.h>
 #endif
 
+HX_DECLARE_CLASS1(borogove,AvailableChat)
 HX_DECLARE_CLASS1(borogove,Client)
 HX_DECLARE_CLASS1(borogove,EventEmitter)
 HX_DECLARE_CLASS1(borogove,JID)
 HX_DECLARE_CLASS1(borogove,Participant)
+HX_DECLARE_CLASS1(borogove,Role)
 HX_DECLARE_CLASS1(thenshim,Thenable)
 
 namespace borogove{
@@ -25,13 +27,13 @@ class HXCPP_CLASS_ATTRIBUTES Participant_obj : public ::hx::Object
 	public:
 		enum { _hx_ClassId = 0x09ded66e };
 
-		void __construct(::String displayName,::String photoUri,::String placeholderUri,bool isSelf, ::borogove::JID jid);
+		void __construct(::String displayName,::String photoUri,::String placeholderUri,bool isSelf,::Array< ::Dynamic> roles, ::borogove::JID jid, ::borogove::AvailableChat chat);
 		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.Participant")
 			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
 		inline void *operator new(size_t inSize, int extra)
 			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.Participant"); }
-		static ::hx::ObjectPtr< Participant_obj > __new(::String displayName,::String photoUri,::String placeholderUri,bool isSelf, ::borogove::JID jid);
-		static ::hx::ObjectPtr< Participant_obj > __alloc(::hx::Ctx *_hx_ctx,::String displayName,::String photoUri,::String placeholderUri,bool isSelf, ::borogove::JID jid);
+		static ::hx::ObjectPtr< Participant_obj > __new(::String displayName,::String photoUri,::String placeholderUri,bool isSelf,::Array< ::Dynamic> roles, ::borogove::JID jid, ::borogove::AvailableChat chat);
+		static ::hx::ObjectPtr< Participant_obj > __alloc(::hx::Ctx *_hx_ctx,::String displayName,::String photoUri,::String placeholderUri,bool isSelf,::Array< ::Dynamic> roles, ::borogove::JID jid, ::borogove::AvailableChat chat);
 		static void * _hx_vtable;
 		static Dynamic __CreateEmpty();
 		static Dynamic __Create(::hx::DynamicArray inArgs);
@@ -65,12 +67,24 @@ class HXCPP_CLASS_ATTRIBUTES Participant_obj : public ::hx::Object
 		bool isSelf__fromC();
 		::Dynamic isSelf__fromC_dyn();
 
+		 ::borogove::AvailableChat chat;
+		 ::borogove::AvailableChat chat__fromC();
+		::Dynamic chat__fromC_dyn();
+
+		::Array< ::Dynamic> roles;
+		size_t roles__fromC(void*** outPtr);
+
 		 ::borogove::JID jid;
 		::Dynamic profile( ::borogove::Client client);
 		::Dynamic profile_dyn();
 
 		void profile__fromC( ::borogove::Client client,::cpp::Function< void  (void*,void*) > handler,void* handler__context);
 
+		::Dynamic status( ::borogove::Client client);
+		::Dynamic status_dyn();
+
+		void status__fromC( ::borogove::Client client,::cpp::Function< void  (void*,void*) > handler,void* handler__context);
+
 };
 
 } // end namespace borogove
diff --git a/Sources/c_borogove/iinclude/borogove/Persistence.h b/Sources/c_borogove/iinclude/borogove/Persistence.h
index 4431dcb..d781a2e 100644
--- a/Sources/c_borogove/iinclude/borogove/Persistence.h
+++ b/Sources/c_borogove/iinclude/borogove/Persistence.h
@@ -9,6 +9,9 @@
 HX_DECLARE_CLASS1(borogove,Caps)
 HX_DECLARE_CLASS1(borogove,Chat)
 HX_DECLARE_CLASS1(borogove,ChatMessage)
+HX_DECLARE_CLASS1(borogove,EventEmitter)
+HX_DECLARE_CLASS1(borogove,Member)
+HX_DECLARE_CLASS1(borogove,MemberUpdate)
 HX_DECLARE_CLASS1(borogove,Persistence)
 HX_DECLARE_CLASS1(borogove,ReactionUpdate)
 HX_DECLARE_CLASS1(thenshim,Thenable)
@@ -22,9 +25,9 @@ class HXCPP_CLASS_ATTRIBUTES Persistence_obj {
 		HX_DO_INTERFACE_RTTI;
 
 		static void __boot();
-		::Dynamic (::hx::Object :: *_hx_lastId)(::String accountId,::String chatId); 
-		static inline ::Dynamic lastId( ::Dynamic _hx_,::String accountId,::String chatId) {
-			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_lastId)(accountId,chatId);
+		::Dynamic (::hx::Object :: *_hx_syncPoint)(::String accountId,::String chatId); 
+		static inline ::Dynamic syncPoint( ::Dynamic _hx_,::String accountId,::String chatId) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_syncPoint)(accountId,chatId);
 		}
 		void (::hx::Object :: *_hx_storeChats)(::String accountId,::Array< ::Dynamic> chats); 
 		static inline void storeChats( ::Dynamic _hx_,::String accountId,::Array< ::Dynamic> chats) {
@@ -34,6 +37,26 @@ class HXCPP_CLASS_ATTRIBUTES Persistence_obj {
 		static inline ::Dynamic getChats( ::Dynamic _hx_,::String accountId) {
 			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getChats)(accountId);
 		}
+		::Dynamic (::hx::Object :: *_hx_storeMembers)(::String accountId,::String chatId,::Array< ::Dynamic> members); 
+		static inline ::Dynamic storeMembers( ::Dynamic _hx_,::String accountId,::String chatId,::Array< ::Dynamic> members) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_storeMembers)(accountId,chatId,members);
+		}
+		::Dynamic (::hx::Object :: *_hx_storeMemberUpdates)(::String accountId, ::borogove::Chat chat,::Array< ::Dynamic> updates,bool isFullList); 
+		static inline ::Dynamic storeMemberUpdates( ::Dynamic _hx_,::String accountId, ::borogove::Chat chat,::Array< ::Dynamic> updates,bool isFullList) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_storeMemberUpdates)(accountId,chat,updates,isFullList);
+		}
+		::Dynamic (::hx::Object :: *_hx_clearMemberPresence)(::String accountId,::String chatId); 
+		static inline ::Dynamic clearMemberPresence( ::Dynamic _hx_,::String accountId,::String chatId) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_clearMemberPresence)(accountId,chatId);
+		}
+		::Dynamic (::hx::Object :: *_hx_getMembers)(::String accountId, ::borogove::Chat chat,bool forModerator); 
+		static inline ::Dynamic getMembers( ::Dynamic _hx_,::String accountId, ::borogove::Chat chat,bool forModerator) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getMembers)(accountId,chat,forModerator);
+		}
+		::Dynamic (::hx::Object :: *_hx_getMemberDetails)(::String accountId, ::borogove::Chat chat,::Array< ::String > ids); 
+		static inline ::Dynamic getMemberDetails( ::Dynamic _hx_,::String accountId, ::borogove::Chat chat,::Array< ::String > ids) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getMemberDetails)(accountId,chat,ids);
+		}
 		::Dynamic (::hx::Object :: *_hx_getChatsUnreadDetails)(::String accountId,::Array< ::Dynamic> chats); 
 		static inline ::Dynamic getChatsUnreadDetails( ::Dynamic _hx_,::String accountId,::Array< ::Dynamic> chats) {
 			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getChatsUnreadDetails)(accountId,chats);
@@ -58,17 +81,17 @@ class HXCPP_CLASS_ATTRIBUTES Persistence_obj {
 		static inline ::Dynamic getMessage( ::Dynamic _hx_,::String accountId,::String chatId,::String serverId,::String localId) {
 			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getMessage)(accountId,chatId,serverId,localId);
 		}
-		::Dynamic (::hx::Object :: *_hx_getMessagesBefore)(::String accountId,::String chatId,::String beforeId,::String beforeTime); 
-		static inline ::Dynamic getMessagesBefore( ::Dynamic _hx_,::String accountId,::String chatId,::String beforeId,::String beforeTime) {
-			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getMessagesBefore)(accountId,chatId,beforeId,beforeTime);
+		::Dynamic (::hx::Object :: *_hx_getMessagesBefore)(::String accountId,::String chatId, ::borogove::ChatMessage before); 
+		static inline ::Dynamic getMessagesBefore( ::Dynamic _hx_,::String accountId,::String chatId, ::borogove::ChatMessage before) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getMessagesBefore)(accountId,chatId,before);
 		}
-		::Dynamic (::hx::Object :: *_hx_getMessagesAfter)(::String accountId,::String chatId,::String afterId,::String afterTime); 
-		static inline ::Dynamic getMessagesAfter( ::Dynamic _hx_,::String accountId,::String chatId,::String afterId,::String afterTime) {
-			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getMessagesAfter)(accountId,chatId,afterId,afterTime);
+		::Dynamic (::hx::Object :: *_hx_getMessagesAfter)(::String accountId,::String chatId, ::borogove::ChatMessage afterId); 
+		static inline ::Dynamic getMessagesAfter( ::Dynamic _hx_,::String accountId,::String chatId, ::borogove::ChatMessage afterId) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getMessagesAfter)(accountId,chatId,afterId);
 		}
-		::Dynamic (::hx::Object :: *_hx_getMessagesAround)(::String accountId,::String chatId,::String aroundId,::String aroundTime); 
-		static inline ::Dynamic getMessagesAround( ::Dynamic _hx_,::String accountId,::String chatId,::String aroundId,::String aroundTime) {
-			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getMessagesAround)(accountId,chatId,aroundId,aroundTime);
+		::Dynamic (::hx::Object :: *_hx_getMessagesAround)(::String accountId, ::borogove::ChatMessage around); 
+		static inline ::Dynamic getMessagesAround( ::Dynamic _hx_,::String accountId, ::borogove::ChatMessage around) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getMessagesAround)(accountId,around);
 		}
 		::Dynamic (::hx::Object :: *_hx_hasMedia)(::String hashAlgorithm,::Array< unsigned char > hash); 
 		static inline ::Dynamic hasMedia( ::Dynamic _hx_,::String hashAlgorithm,::Array< unsigned char > hash) {
@@ -78,9 +101,9 @@ class HXCPP_CLASS_ATTRIBUTES Persistence_obj {
 		static inline ::Dynamic storeMedia( ::Dynamic _hx_,::String mime,::Array< unsigned char > bytes) {
 			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_storeMedia)(mime,bytes);
 		}
-		void (::hx::Object :: *_hx_removeMedia)(::String hashAlgorithm,::Array< unsigned char > hash); 
-		static inline void removeMedia( ::Dynamic _hx_,::String hashAlgorithm,::Array< unsigned char > hash) {
-			(_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_removeMedia)(hashAlgorithm,hash);
+		::Dynamic (::hx::Object :: *_hx_removeMedia)(::String hashAlgorithm,::Array< unsigned char > hash); 
+		static inline ::Dynamic removeMedia( ::Dynamic _hx_,::String hashAlgorithm,::Array< unsigned char > hash) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_removeMedia)(hashAlgorithm,hash);
 		}
 		void (::hx::Object :: *_hx_storeCaps)( ::borogove::Caps caps); 
 		static inline void storeCaps( ::Dynamic _hx_, ::borogove::Caps caps) {
@@ -90,25 +113,25 @@ class HXCPP_CLASS_ATTRIBUTES Persistence_obj {
 		static inline ::Dynamic getCaps( ::Dynamic _hx_,::String ver) {
 			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getCaps)(ver);
 		}
-		void (::hx::Object :: *_hx_storeLogin)(::String login,::String clientId,::String displayName,::String token); 
-		static inline void storeLogin( ::Dynamic _hx_,::String login,::String clientId,::String displayName,::String token) {
-			(_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_storeLogin)(login,clientId,displayName,token);
+		::Dynamic (::hx::Object :: *_hx_storeLogin)(::String accountId,::String clientId,::String displayName,::String token); 
+		static inline ::Dynamic storeLogin( ::Dynamic _hx_,::String accountId,::String clientId,::String displayName,::String token) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_storeLogin)(accountId,clientId,displayName,token);
 		}
-		::Dynamic (::hx::Object :: *_hx_getLogin)(::String login); 
-		static inline ::Dynamic getLogin( ::Dynamic _hx_,::String login) {
-			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getLogin)(login);
+		::Dynamic (::hx::Object :: *_hx_getLogin)(::String accountId); 
+		static inline ::Dynamic getLogin( ::Dynamic _hx_,::String accountId) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_getLogin)(accountId);
 		}
-		void (::hx::Object :: *_hx_removeAccount)(::String accountId,bool completely); 
-		static inline void removeAccount( ::Dynamic _hx_,::String accountId,bool completely) {
-			(_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_removeAccount)(accountId,completely);
+		::Dynamic (::hx::Object :: *_hx_removeAccount)(::String accountId,bool completely); 
+		static inline ::Dynamic removeAccount( ::Dynamic _hx_,::String accountId,bool completely) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_removeAccount)(accountId,completely);
 		}
 		::Dynamic (::hx::Object :: *_hx_listAccounts)(); 
 		static inline ::Dynamic listAccounts( ::Dynamic _hx_) {
 			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_listAccounts)();
 		}
-		void (::hx::Object :: *_hx_storeStreamManagement)(::String accountId,::Array< unsigned char > data); 
-		static inline void storeStreamManagement( ::Dynamic _hx_,::String accountId,::Array< unsigned char > data) {
-			(_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_storeStreamManagement)(accountId,data);
+		::Dynamic (::hx::Object :: *_hx_storeStreamManagement)(::String accountId,::Array< unsigned char > data,::String sortId); 
+		static inline ::Dynamic storeStreamManagement( ::Dynamic _hx_,::String accountId,::Array< unsigned char > data,::String sortId) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::Persistence_obj *>(_hx_.mPtr->_hx_getInterface(0xb8b304be)))->_hx_storeStreamManagement)(accountId,data,sortId);
 		}
 		::Dynamic (::hx::Object :: *_hx_getStreamManagement)(::String accountId); 
 		static inline ::Dynamic getStreamManagement( ::Dynamic _hx_,::String accountId) {
diff --git a/Sources/c_borogove/iinclude/borogove/Persistence__Companion.h b/Sources/c_borogove/iinclude/borogove/Persistence__Companion.h
index cd3cd01..e695a86 100644
--- a/Sources/c_borogove/iinclude/borogove/Persistence__Companion.h
+++ b/Sources/c_borogove/iinclude/borogove/Persistence__Companion.h
@@ -54,7 +54,7 @@ class HXCPP_CLASS_ATTRIBUTES Persistence__Companion_obj : public ::hx::Object
 
 		static void __boot();
 		static  ::Dynamic __meta__;
-		static void lastId__fromC(::Dynamic self,::String accountId,::String chatId,::cpp::Function< void  (const char*,void*) > handler,void* handler__context);
+		static void syncPoint__fromC(::Dynamic self,::String accountId,::String chatId,::cpp::Function< void  (void*,void*) > handler,void* handler__context);
 
 		static void storeChats__fromC(::Dynamic self,::String accountId,::cpp::Pointer< void* > chats,size_t chats__len);
 		static ::Dynamic storeChats__fromC_dyn();
@@ -68,24 +68,21 @@ class HXCPP_CLASS_ATTRIBUTES Persistence__Companion_obj : public ::hx::Object
 
 		static void getMessage__fromC(::Dynamic self,::String accountId,::String chatId,::String serverId,::String localId,::cpp::Function< void  (void*,void*) > handler,void* handler__context);
 
-		static void getMessagesBefore__fromC(::Dynamic self,::String accountId,::String chatId,::String beforeId,::String beforeTime,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
+		static void getMessagesBefore__fromC(::Dynamic self,::String accountId,::String chatId, ::borogove::ChatMessage before,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
 
-		static void getMessagesAfter__fromC(::Dynamic self,::String accountId,::String chatId,::String afterId,::String afterTime,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
+		static void getMessagesAfter__fromC(::Dynamic self,::String accountId,::String chatId, ::borogove::ChatMessage afterId,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
 
-		static void getMessagesAround__fromC(::Dynamic self,::String accountId,::String chatId,::String aroundId,::String aroundTime,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
+		static void getMessagesAround__fromC(::Dynamic self,::String accountId, ::borogove::ChatMessage around,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context);
 
 		static void hasMedia__fromC(::Dynamic self,::String hashAlgorithm,::cpp::Pointer< unsigned char > hash,size_t hash__len,::cpp::Function< void  (bool,void*) > handler,void* handler__context);
 
 		static void storeMedia__fromC(::Dynamic self,::String mime,::cpp::Pointer< unsigned char > bytes,size_t bytes__len,::cpp::Function< void  (bool,void*) > handler,void* handler__context);
 
-		static void removeMedia__fromC(::Dynamic self,::String hashAlgorithm,::cpp::Pointer< unsigned char > hash,size_t hash__len);
-		static ::Dynamic removeMedia__fromC_dyn();
+		static void removeMedia__fromC(::Dynamic self,::String hashAlgorithm,::cpp::Pointer< unsigned char > hash,size_t hash__len,::cpp::Function< void  (bool,void*) > handler,void* handler__context);
 
-		static void storeLogin__fromC(::Dynamic self,::String login,::String clientId,::String displayName,::String token);
-		static ::Dynamic storeLogin__fromC_dyn();
+		static void storeLogin__fromC(::Dynamic self,::String accountId,::String clientId,::String displayName,::String token,::cpp::Function< void  (bool,void*) > handler,void* handler__context);
 
-		static void removeAccount__fromC(::Dynamic self,::String accountId,bool completely);
-		static ::Dynamic removeAccount__fromC_dyn();
+		static void removeAccount__fromC(::Dynamic self,::String accountId,bool completely,::cpp::Function< void  (bool,void*) > handler,void* handler__context);
 
 		static void listAccounts__fromC(::Dynamic self,::cpp::Function< void  (const char**,size_t,void*) > handler,void* handler__context);
 
diff --git a/Sources/c_borogove/iinclude/borogove/Role.h b/Sources/c_borogove/iinclude/borogove/Role.h
new file mode 100644
index 0000000..44a43ff
--- /dev/null
+++ b/Sources/c_borogove/iinclude/borogove/Role.h
@@ -0,0 +1,67 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_borogove_Role
+#define INCLUDED_borogove_Role
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(borogove,Role)
+
+namespace borogove{
+
+
+class HXCPP_CLASS_ATTRIBUTES Role_obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef Role_obj OBJ_;
+		Role_obj();
+
+	public:
+		enum { _hx_ClassId = 0x34bf0af7 };
+
+		void __construct(::String id,::String title);
+		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.Role")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.Role"); }
+		static ::hx::ObjectPtr< Role_obj > __new(::String id,::String title);
+		static ::hx::ObjectPtr< Role_obj > __alloc(::hx::Ctx *_hx_ctx,::String id,::String title);
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~Role_obj();
+
+		HX_DO_RTTI_ALL;
+		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
+		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
+		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
+		void __GetFields(Array< ::String> &outFields);
+		static void __register();
+		void __Mark(HX_MARK_PARAMS);
+		void __Visit(HX_VISIT_PARAMS);
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("Role",96,17,88,36); }
+
+		static void __boot();
+		static  ::Dynamic __meta__;
+		static  ::borogove::Role forAffiliation(::String aff);
+		static ::Dynamic forAffiliation_dyn();
+
+		::String id;
+		::String id__fromC();
+		::Dynamic id__fromC_dyn();
+
+		::String title;
+		::String title__fromC();
+		::Dynamic title__fromC_dyn();
+
+		::String color();
+		::Dynamic color_dyn();
+
+};
+
+} // end namespace borogove
+
+#endif /* INCLUDED_borogove_Role */ 
diff --git a/Sources/c_borogove/iinclude/borogove/SerializedChat.h b/Sources/c_borogove/iinclude/borogove/SerializedChat.h
index c90be2e..2a2c337 100644
--- a/Sources/c_borogove/iinclude/borogove/SerializedChat.h
+++ b/Sources/c_borogove/iinclude/borogove/SerializedChat.h
@@ -13,6 +13,7 @@ HX_DECLARE_CLASS1(borogove,EventEmitter)
 HX_DECLARE_CLASS1(borogove,GenericStream)
 HX_DECLARE_CLASS1(borogove,Persistence)
 HX_DECLARE_CLASS1(borogove,SerializedChat)
+HX_DECLARE_CLASS1(borogove,Status)
 HX_DECLARE_CLASS1(haxe,IMap)
 HX_DECLARE_CLASS2(haxe,ds,StringMap)
 
@@ -29,13 +30,13 @@ class HXCPP_CLASS_ATTRIBUTES SerializedChat_obj : public ::hx::Object
 	public:
 		enum { _hx_ClassId = 0x1b18ce3d };
 
-		void __construct(::String chatId,bool trusted,::Array< unsigned char > avatarSha1, ::haxe::ds::StringMap presence,::String displayName, ::Dynamic uiState, ::Dynamic isBlocked,::String extensions,::String readUpToId,::String readUpToBy, ::Dynamic notificationsFiltered,bool notifyMention,bool notifyReply, ::borogove::Caps disco,::Array< int > omemoContactDeviceIDs,::String klass);
+		void __construct(::String chatId,bool trusted,bool isBookmarked,::Array< unsigned char > avatarSha1, ::haxe::ds::StringMap presence,::Array< ::Dynamic> membersForName,::String displayName, ::Dynamic uiState, ::Dynamic isBlocked, ::borogove::Status status,::String extensions,::String readUpToId,::String readUpToBy, ::Dynamic notificationsFiltered,bool notifyMention,bool notifyReply, ::haxe::ds::StringMap threads, ::borogove::Caps disco,::String mavUntil,::Array< int > omemoContactDeviceIDs,::String klass);
 		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.SerializedChat")
 			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
 		inline void *operator new(size_t inSize, int extra)
 			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.SerializedChat"); }
-		static ::hx::ObjectPtr< SerializedChat_obj > __new(::String chatId,bool trusted,::Array< unsigned char > avatarSha1, ::haxe::ds::StringMap presence,::String displayName, ::Dynamic uiState, ::Dynamic isBlocked,::String extensions,::String readUpToId,::String readUpToBy, ::Dynamic notificationsFiltered,bool notifyMention,bool notifyReply, ::borogove::Caps disco,::Array< int > omemoContactDeviceIDs,::String klass);
-		static ::hx::ObjectPtr< SerializedChat_obj > __alloc(::hx::Ctx *_hx_ctx,::String chatId,bool trusted,::Array< unsigned char > avatarSha1, ::haxe::ds::StringMap presence,::String displayName, ::Dynamic uiState, ::Dynamic isBlocked,::String extensions,::String readUpToId,::String readUpToBy, ::Dynamic notificationsFiltered,bool notifyMention,bool notifyReply, ::borogove::Caps disco,::Array< int > omemoContactDeviceIDs,::String klass);
+		static ::hx::ObjectPtr< SerializedChat_obj > __new(::String chatId,bool trusted,bool isBookmarked,::Array< unsigned char > avatarSha1, ::haxe::ds::StringMap presence,::Array< ::Dynamic> membersForName,::String displayName, ::Dynamic uiState, ::Dynamic isBlocked, ::borogove::Status status,::String extensions,::String readUpToId,::String readUpToBy, ::Dynamic notificationsFiltered,bool notifyMention,bool notifyReply, ::haxe::ds::StringMap threads, ::borogove::Caps disco,::String mavUntil,::Array< int > omemoContactDeviceIDs,::String klass);
+		static ::hx::ObjectPtr< SerializedChat_obj > __alloc(::hx::Ctx *_hx_ctx,::String chatId,bool trusted,bool isBookmarked,::Array< unsigned char > avatarSha1, ::haxe::ds::StringMap presence,::Array< ::Dynamic> membersForName,::String displayName, ::Dynamic uiState, ::Dynamic isBlocked, ::borogove::Status status,::String extensions,::String readUpToId,::String readUpToBy, ::Dynamic notificationsFiltered,bool notifyMention,bool notifyReply, ::haxe::ds::StringMap threads, ::borogove::Caps disco,::String mavUntil,::Array< int > omemoContactDeviceIDs,::String klass);
 		static void * _hx_vtable;
 		static Dynamic __CreateEmpty();
 		static Dynamic __Create(::hx::DynamicArray inArgs);
@@ -53,20 +54,25 @@ class HXCPP_CLASS_ATTRIBUTES SerializedChat_obj : public ::hx::Object
 
 		::String chatId;
 		bool trusted;
+		bool isBookmarked;
 		::Array< unsigned char > avatarSha1;
 		 ::haxe::ds::StringMap presence;
+		::Array< ::Dynamic> membersForName;
 		::String displayName;
 		int uiState;
 		bool isBlocked;
+		 ::borogove::Status status;
 		::String extensions;
 		::String readUpToId;
 		::String readUpToBy;
+		 ::haxe::ds::StringMap threads;
 		 ::borogove::Caps disco;
+		::String mavUntil;
 		::Array< int > omemoContactDeviceIDs;
-		::String klass;
 		 ::Dynamic notificationsFiltered;
 		bool notifyMention;
 		bool notifyReply;
+		::String klass;
 		 ::borogove::Chat toChat( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence);
 		::Dynamic toChat_dyn();
 
diff --git a/Sources/c_borogove/iinclude/borogove/Stanza.h b/Sources/c_borogove/iinclude/borogove/Stanza.h
index 83f771e..b34faa6 100644
--- a/Sources/c_borogove/iinclude/borogove/Stanza.h
+++ b/Sources/c_borogove/iinclude/borogove/Stanza.h
@@ -133,6 +133,9 @@ class HXCPP_CLASS_ATTRIBUTES Stanza_obj : public ::hx::Object
 		 ::borogove::Stanza traverse( ::Dynamic f);
 		::Dynamic traverse_dyn();
 
+		 ::Dynamic reduce( ::Dynamic stanza, ::Dynamic text);
+		::Dynamic reduce_dyn();
+
 		 ::borogove::StanzaError getError();
 		::Dynamic getError_dyn();
 
diff --git a/Sources/c_borogove/iinclude/borogove/Status.h b/Sources/c_borogove/iinclude/borogove/Status.h
new file mode 100644
index 0000000..e5a54a9
--- /dev/null
+++ b/Sources/c_borogove/iinclude/borogove/Status.h
@@ -0,0 +1,67 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_borogove_Status
+#define INCLUDED_borogove_Status
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(borogove,Stanza)
+HX_DECLARE_CLASS1(borogove,Status)
+
+namespace borogove{
+
+
+class HXCPP_CLASS_ATTRIBUTES Status_obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef Status_obj OBJ_;
+		Status_obj();
+
+	public:
+		enum { _hx_ClassId = 0x6af3a8f3 };
+
+		void __construct(::String emoji,::String text);
+		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="borogove.Status")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,true,"borogove.Status"); }
+		static ::hx::ObjectPtr< Status_obj > __new(::String emoji,::String text);
+		static ::hx::ObjectPtr< Status_obj > __alloc(::hx::Ctx *_hx_ctx,::String emoji,::String text);
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~Status_obj();
+
+		HX_DO_RTTI_ALL;
+		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
+		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
+		void __GetFields(Array< ::String> &outFields);
+		static void __register();
+		void __Mark(HX_MARK_PARAMS);
+		void __Visit(HX_VISIT_PARAMS);
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("Status",52,5b,90,3a); }
+
+		static void __boot();
+		static  ::Dynamic __meta__;
+		::String emoji;
+		::String emoji__fromC();
+		::Dynamic emoji__fromC_dyn();
+
+		::String text;
+		::String text__fromC();
+		::Dynamic text__fromC_dyn();
+
+		virtual ::String toString();
+		::Dynamic toString_dyn();
+
+		 ::borogove::Stanza toStanza();
+		::Dynamic toStanza_dyn();
+
+};
+
+} // end namespace borogove
+
+#endif /* INCLUDED_borogove_Status */ 
diff --git a/Sources/c_borogove/iinclude/borogove/XEP0393.h b/Sources/c_borogove/iinclude/borogove/XEP0393.h
index b2ff1b7..c35f4f3 100644
--- a/Sources/c_borogove/iinclude/borogove/XEP0393.h
+++ b/Sources/c_borogove/iinclude/borogove/XEP0393.h
@@ -55,15 +55,18 @@ class HXCPP_CLASS_ATTRIBUTES XEP0393_obj : public ::hx::Object
 		static ::Array< ::Dynamic> parse(::String styled);
 		static ::Dynamic parse_dyn();
 
-		static ::String render( ::borogove::Stanza xhtml,::hx::Null< bool >  inPre);
+		static ::String render( ::borogove::Stanza xhtml,::hx::Null< bool >  inPre,::hx::Null< bool >  followNewline,::hx::Null< bool >  hasOpenBracket);
 		static ::Dynamic render_dyn();
 
-		static ::String renderNode( ::borogove::Node xhtml,::hx::Null< bool >  inPre);
+		static ::String renderNode( ::borogove::Node xhtml,::hx::Null< bool >  inPre,::hx::Null< bool >  followNewline,::hx::Null< bool >  hasOpenBracket);
 		static ::Dynamic renderNode_dyn();
 
 		static  ::Dynamic parseSpans(::String styled);
 		static ::Dynamic parseSpans_dyn();
 
+		static ::Array< ::Dynamic> mergeSpans(::Array< ::Dynamic> spans);
+		static ::Dynamic mergeSpans_dyn();
+
 		static  ::Dynamic parseSpan(::String tagName,::String marker,::String styled,int start);
 		static ::Dynamic parseSpan_dyn();
 
diff --git a/Sources/c_borogove/iinclude/borogove/_Chat/Chat_Fields_.h b/Sources/c_borogove/iinclude/borogove/_Chat/Chat_Fields_.h
new file mode 100644
index 0000000..3c20bb7
--- /dev/null
+++ b/Sources/c_borogove/iinclude/borogove/_Chat/Chat_Fields_.h
@@ -0,0 +1,62 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_borogove__Chat_Chat_Fields_
+#define INCLUDED_borogove__Chat_Chat_Fields_
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS2(borogove,_Chat,Chat_Fields_)
+
+namespace borogove{
+namespace _Chat{
+
+
+class HXCPP_CLASS_ATTRIBUTES Chat_Fields__obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef Chat_Fields__obj OBJ_;
+		Chat_Fields__obj();
+
+	public:
+		enum { _hx_ClassId = 0x6a4e85b5 };
+
+		void __construct();
+		inline void *operator new(size_t inSize, bool inContainer=false,const char *inName="borogove._Chat.Chat_Fields_")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,false,"borogove._Chat.Chat_Fields_"); }
+
+		inline static ::hx::ObjectPtr< Chat_Fields__obj > __new() {
+			::hx::ObjectPtr< Chat_Fields__obj > __this = new Chat_Fields__obj();
+			__this->__construct();
+			return __this;
+		}
+
+		inline static ::hx::ObjectPtr< Chat_Fields__obj > __alloc(::hx::Ctx *_hx_ctx) {
+			Chat_Fields__obj *__this = (Chat_Fields__obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Chat_Fields__obj), false, "borogove._Chat.Chat_Fields_"));
+			*(void **)__this = Chat_Fields__obj::_hx_vtable;
+			return __this;
+		}
+
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~Chat_Fields__obj();
+
+		HX_DO_RTTI_ALL;
+		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
+		static bool __SetStatic(const ::String &inString, Dynamic &ioValue, ::hx::PropertyAccess inCallProp);
+		static void __register();
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("Chat_Fields_",1f,e0,47,04); }
+
+		static void __boot();
+		static ::String nullSentinel;
+};
+
+} // end namespace borogove
+} // end namespace _Chat
+
+#endif /* INCLUDED_borogove__Chat_Chat_Fields_ */ 
diff --git a/Sources/c_borogove/iinclude/borogove/_Presence/Presence_Impl_.h b/Sources/c_borogove/iinclude/borogove/_Presence/Presence_Impl_.h
new file mode 100644
index 0000000..4878f8b
--- /dev/null
+++ b/Sources/c_borogove/iinclude/borogove/_Presence/Presence_Impl_.h
@@ -0,0 +1,90 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_borogove__Presence_Presence_Impl_
+#define INCLUDED_borogove__Presence_Presence_Impl_
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(borogove,Caps)
+HX_DECLARE_CLASS1(borogove,Hash)
+HX_DECLARE_CLASS1(borogove,Role)
+HX_DECLARE_CLASS1(borogove,Stanza)
+HX_DECLARE_CLASS2(borogove,_Presence,Presence_Impl_)
+
+namespace borogove{
+namespace _Presence{
+
+
+class HXCPP_CLASS_ATTRIBUTES Presence_Impl__obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef Presence_Impl__obj OBJ_;
+		Presence_Impl__obj();
+
+	public:
+		enum { _hx_ClassId = 0x2cdd82ec };
+
+		void __construct();
+		inline void *operator new(size_t inSize, bool inContainer=false,const char *inName="borogove._Presence.Presence_Impl_")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,false,"borogove._Presence.Presence_Impl_"); }
+
+		inline static ::hx::ObjectPtr< Presence_Impl__obj > __new() {
+			::hx::ObjectPtr< Presence_Impl__obj > __this = new Presence_Impl__obj();
+			__this->__construct();
+			return __this;
+		}
+
+		inline static ::hx::ObjectPtr< Presence_Impl__obj > __alloc(::hx::Ctx *_hx_ctx) {
+			Presence_Impl__obj *__this = (Presence_Impl__obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Presence_Impl__obj), false, "borogove._Presence.Presence_Impl_"));
+			*(void **)__this = Presence_Impl__obj::_hx_vtable;
+			return __this;
+		}
+
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~Presence_Impl__obj();
+
+		HX_DO_RTTI_ALL;
+		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
+		static void __register();
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("Presence_Impl_",3b,01,72,0e); }
+
+		static  ::borogove::Stanza _new( ::borogove::Caps caps, ::borogove::Stanza mucUser, ::borogove::Hash avatarHash);
+		static ::Dynamic _new_dyn();
+
+		static ::String get_capsNode( ::borogove::Stanza this1);
+		static ::Dynamic get_capsNode_dyn();
+
+		static ::String get_ver( ::borogove::Stanza this1);
+		static ::Dynamic get_ver_dyn();
+
+		static  ::borogove::Stanza get_mucUser( ::borogove::Stanza this1);
+		static ::Dynamic get_mucUser_dyn();
+
+		static ::Array< ::Dynamic> get_hats( ::borogove::Stanza this1);
+		static ::Dynamic get_hats_dyn();
+
+		static  ::borogove::Hash get_avatarHash( ::borogove::Stanza this1);
+		static ::Dynamic get_avatarHash_dyn();
+
+		static ::String get_type( ::borogove::Stanza this1);
+		static ::Dynamic get_type_dyn();
+
+		static int get_show( ::borogove::Stanza this1);
+		static ::Dynamic get_show_dyn();
+
+		static int get_priority( ::borogove::Stanza this1);
+		static ::Dynamic get_priority_dyn();
+
+};
+
+} // end namespace borogove
+} // end namespace _Presence
+
+#endif /* INCLUDED_borogove__Presence_Presence_Impl_ */ 
diff --git a/Sources/c_borogove/iinclude/borogove/calls/_Session/Session_Fields_.h b/Sources/c_borogove/iinclude/borogove/calls/_Session/Session_Fields_.h
index 4b1c50a..e71910d 100644
--- a/Sources/c_borogove/iinclude/borogove/calls/_Session/Session_Fields_.h
+++ b/Sources/c_borogove/iinclude/borogove/calls/_Session/Session_Fields_.h
@@ -7,6 +7,8 @@
 #endif
 
 HX_DECLARE_CLASS1(borogove,ChatMessage)
+HX_DECLARE_CLASS1(borogove,Client)
+HX_DECLARE_CLASS1(borogove,EventEmitter)
 HX_DECLARE_CLASS1(borogove,JID)
 HX_DECLARE_CLASS1(borogove,Stanza)
 HX_DECLARE_CLASS3(borogove,calls,_Session,Session_Fields_)
@@ -55,7 +57,7 @@ class HXCPP_CLASS_ATTRIBUTES Session_Fields__obj : public ::hx::Object
 		bool _hx_isInstanceOf(int inClassId);
 		::String __ToString() const { return HX_("Session_Fields_",5d,02,e4,dc); }
 
-		static  ::borogove::ChatMessage mkCallMessage( ::borogove::JID to, ::borogove::JID from, ::borogove::Stanza event);
+		static  ::borogove::ChatMessage mkCallMessage( ::borogove::JID to, ::borogove::Client client, ::borogove::Stanza event);
 		static ::Dynamic mkCallMessage_dyn();
 
 };
diff --git a/Sources/c_borogove/iinclude/borogove/persistence/Dummy.h b/Sources/c_borogove/iinclude/borogove/persistence/Dummy.h
index dcc2597..19920b9 100644
--- a/Sources/c_borogove/iinclude/borogove/persistence/Dummy.h
+++ b/Sources/c_borogove/iinclude/borogove/persistence/Dummy.h
@@ -12,6 +12,9 @@
 HX_DECLARE_CLASS1(borogove,Caps)
 HX_DECLARE_CLASS1(borogove,Chat)
 HX_DECLARE_CLASS1(borogove,ChatMessage)
+HX_DECLARE_CLASS1(borogove,EventEmitter)
+HX_DECLARE_CLASS1(borogove,Member)
+HX_DECLARE_CLASS1(borogove,MemberUpdate)
 HX_DECLARE_CLASS1(borogove,Persistence)
 HX_DECLARE_CLASS1(borogove,ReactionUpdate)
 HX_DECLARE_CLASS2(borogove,persistence,Dummy)
@@ -52,8 +55,8 @@ class HXCPP_CLASS_ATTRIBUTES Dummy_obj : public ::hx::Object
 
 		static void __boot();
 		static  ::Dynamic __meta__;
-		::Dynamic lastId(::String accountId,::String chatId);
-		::Dynamic lastId_dyn();
+		::Dynamic syncPoint(::String accountId,::String chatId);
+		::Dynamic syncPoint_dyn();
 
 		void storeChats(::String accountId,::Array< ::Dynamic> chat);
 		::Dynamic storeChats_dyn();
@@ -61,6 +64,21 @@ class HXCPP_CLASS_ATTRIBUTES Dummy_obj : public ::hx::Object
 		::Dynamic getChats(::String accountId);
 		::Dynamic getChats_dyn();
 
+		::Dynamic storeMembers(::String accountId,::String chatId,::Array< ::Dynamic> chat);
+		::Dynamic storeMembers_dyn();
+
+		::Dynamic storeMemberUpdates(::String accountId, ::borogove::Chat chat,::Array< ::Dynamic> updates,bool isFullList);
+		::Dynamic storeMemberUpdates_dyn();
+
+		::Dynamic clearMemberPresence(::String accountId,::String chatId);
+		::Dynamic clearMemberPresence_dyn();
+
+		::Dynamic getMembers(::String accountId, ::borogove::Chat chat,bool forModerator);
+		::Dynamic getMembers_dyn();
+
+		::Dynamic getMemberDetails(::String accountId, ::borogove::Chat chat,::Array< ::String > ids);
+		::Dynamic getMemberDetails_dyn();
+
 		::Dynamic storeMessages(::String accountId,::Array< ::Dynamic> messages);
 		::Dynamic storeMessages_dyn();
 
@@ -70,13 +88,13 @@ class HXCPP_CLASS_ATTRIBUTES Dummy_obj : public ::hx::Object
 		::Dynamic getMessage(::String accountId,::String chatId,::String serverId,::String localId);
 		::Dynamic getMessage_dyn();
 
-		::Dynamic getMessagesBefore(::String accountId,::String chatId,::String beforeId,::String beforeTime);
+		::Dynamic getMessagesBefore(::String accountId,::String chatId, ::borogove::ChatMessage before);
 		::Dynamic getMessagesBefore_dyn();
 
-		::Dynamic getMessagesAfter(::String accountId,::String chatId,::String afterId,::String afterTime);
+		::Dynamic getMessagesAfter(::String accountId,::String chatId, ::borogove::ChatMessage after);
 		::Dynamic getMessagesAfter_dyn();
 
-		::Dynamic getMessagesAround(::String accountId,::String chatId,::String aroundId,::String aroundTime);
+		::Dynamic getMessagesAround(::String accountId, ::borogove::ChatMessage around);
 		::Dynamic getMessagesAround_dyn();
 
 		::Dynamic getChatsUnreadDetails(::String accountId,::Array< ::Dynamic> chats);
@@ -94,7 +112,7 @@ class HXCPP_CLASS_ATTRIBUTES Dummy_obj : public ::hx::Object
 		::Dynamic storeMedia(::String mime,::Array< unsigned char > bd);
 		::Dynamic storeMedia_dyn();
 
-		void removeMedia(::String hashAlgorithm,::Array< unsigned char > hash);
+		::Dynamic removeMedia(::String hashAlgorithm,::Array< unsigned char > hash);
 		::Dynamic removeMedia_dyn();
 
 		void storeCaps( ::borogove::Caps caps);
@@ -103,19 +121,19 @@ class HXCPP_CLASS_ATTRIBUTES Dummy_obj : public ::hx::Object
 		::Dynamic getCaps(::String ver);
 		::Dynamic getCaps_dyn();
 
-		void storeLogin(::String login,::String clientId,::String displayName,::String token);
+		::Dynamic storeLogin(::String login,::String clientId,::String displayName,::String token);
 		::Dynamic storeLogin_dyn();
 
 		::Dynamic getLogin(::String login);
 		::Dynamic getLogin_dyn();
 
-		void removeAccount(::String accountId,bool completely);
+		::Dynamic removeAccount(::String accountId,bool completely);
 		::Dynamic removeAccount_dyn();
 
 		::Dynamic listAccounts();
 		::Dynamic listAccounts_dyn();
 
-		void storeStreamManagement(::String accountId,::Array< unsigned char > sm);
+		::Dynamic storeStreamManagement(::String accountId,::Array< unsigned char > sm,::String sortId);
 		::Dynamic storeStreamManagement_dyn();
 
 		::Dynamic getStreamManagement(::String accountId);
diff --git a/Sources/c_borogove/iinclude/borogove/persistence/MediaStore.h b/Sources/c_borogove/iinclude/borogove/persistence/MediaStore.h
index 562c2b6..6148605 100644
--- a/Sources/c_borogove/iinclude/borogove/persistence/MediaStore.h
+++ b/Sources/c_borogove/iinclude/borogove/persistence/MediaStore.h
@@ -24,9 +24,9 @@ class HXCPP_CLASS_ATTRIBUTES MediaStore_obj {
 		static inline ::Dynamic hasMedia( ::Dynamic _hx_,::String hashAlgorithm,::Array< unsigned char > hash) {
 			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::persistence::MediaStore_obj *>(_hx_.mPtr->_hx_getInterface(0xb3aaad1b)))->_hx_hasMedia)(hashAlgorithm,hash);
 		}
-		void (::hx::Object :: *_hx_removeMedia)(::String hashAlgorithm,::Array< unsigned char > hash); 
-		static inline void removeMedia( ::Dynamic _hx_,::String hashAlgorithm,::Array< unsigned char > hash) {
-			(_hx_.mPtr->*( ::hx::interface_cast< ::borogove::persistence::MediaStore_obj *>(_hx_.mPtr->_hx_getInterface(0xb3aaad1b)))->_hx_removeMedia)(hashAlgorithm,hash);
+		::Dynamic (::hx::Object :: *_hx_removeMedia)(::String hashAlgorithm,::Array< unsigned char > hash); 
+		static inline ::Dynamic removeMedia( ::Dynamic _hx_,::String hashAlgorithm,::Array< unsigned char > hash) {
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::borogove::persistence::MediaStore_obj *>(_hx_.mPtr->_hx_getInterface(0xb3aaad1b)))->_hx_removeMedia)(hashAlgorithm,hash);
 		}
 		::Dynamic (::hx::Object :: *_hx_storeMedia)(::String mime,::Array< unsigned char > bytes); 
 		static inline ::Dynamic storeMedia( ::Dynamic _hx_,::String mime,::Array< unsigned char > bytes) {
diff --git a/Sources/c_borogove/iinclude/borogove/persistence/MediaStoreFS.h b/Sources/c_borogove/iinclude/borogove/persistence/MediaStoreFS.h
index 7d2a400..25370f4 100644
--- a/Sources/c_borogove/iinclude/borogove/persistence/MediaStoreFS.h
+++ b/Sources/c_borogove/iinclude/borogove/persistence/MediaStoreFS.h
@@ -66,7 +66,7 @@ class HXCPP_CLASS_ATTRIBUTES MediaStoreFS_obj : public ::hx::Object
 		::Dynamic hasMedia(::String hashAlgorithm,::Array< unsigned char > hash);
 		::Dynamic hasMedia_dyn();
 
-		void removeMedia(::String hashAlgorithm,::Array< unsigned char > hash);
+		::Dynamic removeMedia(::String hashAlgorithm,::Array< unsigned char > hash);
 		::Dynamic removeMedia_dyn();
 
 		::Dynamic storeMedia(::String mime,::Array< unsigned char > bd);
diff --git a/Sources/c_borogove/iinclude/borogove/persistence/MediaStore__Companion.h b/Sources/c_borogove/iinclude/borogove/persistence/MediaStore__Companion.h
index e925cae..2bddcc4 100644
--- a/Sources/c_borogove/iinclude/borogove/persistence/MediaStore__Companion.h
+++ b/Sources/c_borogove/iinclude/borogove/persistence/MediaStore__Companion.h
@@ -47,7 +47,6 @@ class HXCPP_CLASS_ATTRIBUTES MediaStore__Companion_obj : public ::hx::Object
 		//~MediaStore__Companion_obj();
 
 		HX_DO_RTTI_ALL;
-		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
 		static void __register();
 		bool _hx_isInstanceOf(int inClassId);
 		::String __ToString() const { return HX_("MediaStore__Companion",ef,42,7f,c8); }
@@ -56,8 +55,7 @@ class HXCPP_CLASS_ATTRIBUTES MediaStore__Companion_obj : public ::hx::Object
 		static  ::Dynamic __meta__;
 		static void hasMedia__fromC(::Dynamic self,::String hashAlgorithm,::cpp::Pointer< unsigned char > hash,size_t hash__len,::cpp::Function< void  (bool,void*) > handler,void* handler__context);
 
-		static void removeMedia__fromC(::Dynamic self,::String hashAlgorithm,::cpp::Pointer< unsigned char > hash,size_t hash__len);
-		static ::Dynamic removeMedia__fromC_dyn();
+		static void removeMedia__fromC(::Dynamic self,::String hashAlgorithm,::cpp::Pointer< unsigned char > hash,size_t hash__len,::cpp::Function< void  (bool,void*) > handler,void* handler__context);
 
 		static void storeMedia__fromC(::Dynamic self,::String mime,::cpp::Pointer< unsigned char > bytes,size_t bytes__len,::cpp::Function< void  (bool,void*) > handler,void* handler__context);
 
diff --git a/Sources/c_borogove/iinclude/borogove/persistence/Sqlite.h b/Sources/c_borogove/iinclude/borogove/persistence/Sqlite.h
index 98d0b5e..aece3d6 100644
--- a/Sources/c_borogove/iinclude/borogove/persistence/Sqlite.h
+++ b/Sources/c_borogove/iinclude/borogove/persistence/Sqlite.h
@@ -12,9 +12,13 @@
 #ifndef INCLUDED_borogove_Persistence
 #include <borogove/Persistence.h>
 #endif
+HX_DECLARE_CLASS1(borogove,AsyncLock)
 HX_DECLARE_CLASS1(borogove,Caps)
 HX_DECLARE_CLASS1(borogove,Chat)
 HX_DECLARE_CLASS1(borogove,ChatMessage)
+HX_DECLARE_CLASS1(borogove,EventEmitter)
+HX_DECLARE_CLASS1(borogove,Member)
+HX_DECLARE_CLASS1(borogove,MemberUpdate)
 HX_DECLARE_CLASS1(borogove,Persistence)
 HX_DECLARE_CLASS1(borogove,ReactionUpdate)
 HX_DECLARE_CLASS2(borogove,persistence,KeyValueStore)
@@ -72,20 +76,51 @@ class HXCPP_CLASS_ATTRIBUTES Sqlite_obj : public ::hx::Object
 
 		 ::borogove::persistence::SqliteDriver db;
 		::Dynamic media;
+		 ::borogove::AsyncLock storeMessagesSerialized;
 		::Dynamic get(::String k);
 		::Dynamic get_dyn();
 
 		::Dynamic set(::String k,::String v);
 		::Dynamic set_dyn();
 
-		::Dynamic lastId(::String accountId,::String chatId);
-		::Dynamic lastId_dyn();
+		::Dynamic syncPoint(::String accountId,::String chatId);
+		::Dynamic syncPoint_dyn();
 
 		 ::haxe::ds::StringMap storeChatBuffer;
 		 ::haxe::Timer storeChatTimer;
 		void storeChats(::String accountId,::Array< ::Dynamic> chats);
 		::Dynamic storeChats_dyn();
 
+		::String serializePresenceMap( ::haxe::ds::StringMap presence);
+		::Dynamic serializePresenceMap_dyn();
+
+		 ::haxe::ds::StringMap hydratePresenceMap(::String raw);
+		::Dynamic hydratePresenceMap_dyn();
+
+		 ::borogove::Member hydrateStoredMember( ::borogove::Chat chat, ::Dynamic row);
+		::Dynamic hydrateStoredMember_dyn();
+
+		::Dynamic chatPresenceAndMembersForName(::String accountId,::cpp::VirtualArray rawChats);
+		::Dynamic chatPresenceAndMembersForName_dyn();
+
+		::Dynamic storeMembers(::String accountId,::String chatId,::Array< ::Dynamic> membersArg);
+		::Dynamic storeMembers_dyn();
+
+		::Dynamic storeMemberUpdates(::String accountId, ::borogove::Chat chat,::Array< ::Dynamic> updates,bool isFullList);
+		::Dynamic storeMemberUpdates_dyn();
+
+		::Dynamic clearMemberPresence(::String accountId,::String chatId);
+		::Dynamic clearMemberPresence_dyn();
+
+		::Dynamic getMembers(::String accountId, ::borogove::Chat chat,bool forModerator);
+		::Dynamic getMembers_dyn();
+
+		::Dynamic getMemberDetails(::String accountId, ::borogove::Chat chat,::Array< ::String > ids);
+		::Dynamic getMemberDetails_dyn();
+
+		::Dynamic searchMessages(::String accountId,::String chatId,::String q);
+		::Dynamic searchMessages_dyn();
+
 		::Dynamic getChats(::String accountId);
 		::Dynamic getChats_dyn();
 
@@ -95,21 +130,24 @@ class HXCPP_CLASS_ATTRIBUTES Sqlite_obj : public ::hx::Object
 		void updateMessage(::String accountId, ::borogove::ChatMessage message);
 		::Dynamic updateMessage_dyn();
 
+		::Dynamic fetchFromStub(::String accountId, ::borogove::ChatMessage stub);
+		::Dynamic fetchFromStub_dyn();
+
 		::Dynamic getMessage(::String accountId,::String chatId,::String serverId,::String localId);
 		::Dynamic getMessage_dyn();
 
 		void getMessage__fromC(::String accountId,::String chatId,::String serverId,::String localId,::cpp::Function< void  (void*,void*) > handler,void* handler__context);
 
-		::Dynamic getMessages(::String accountId,::String chatId,::String time,::String op);
+		::Dynamic getMessages(::String accountId,::String chatId,::String sortId,::String op,::hx::Null< bool >  useTimestamp,::String timestamp);
 		::Dynamic getMessages_dyn();
 
-		::Dynamic getMessagesBefore(::String accountId,::String chatId,::String beforeId,::String beforeTime);
+		::Dynamic getMessagesBefore(::String accountId,::String chatId, ::borogove::ChatMessage before);
 		::Dynamic getMessagesBefore_dyn();
 
-		::Dynamic getMessagesAfter(::String accountId,::String chatId,::String afterId,::String afterTime);
+		::Dynamic getMessagesAfter(::String accountId,::String chatId, ::borogove::ChatMessage after);
 		::Dynamic getMessagesAfter_dyn();
 
-		::Dynamic getMessagesAround(::String accountId,::String chatId,::String aroundId,::String aroundTime);
+		::Dynamic getMessagesAround(::String accountId, ::borogove::ChatMessage around);
 		::Dynamic getMessagesAround_dyn();
 
 		::Dynamic getChatUnreadDetails(::String accountId, ::borogove::Chat chat);
@@ -127,7 +165,7 @@ class HXCPP_CLASS_ATTRIBUTES Sqlite_obj : public ::hx::Object
 		::Dynamic hasMedia(::String hashAlgorithm,::Array< unsigned char > hash);
 		::Dynamic hasMedia_dyn();
 
-		void removeMedia(::String hashAlgorithm,::Array< unsigned char > hash);
+		::Dynamic removeMedia(::String hashAlgorithm,::Array< unsigned char > hash);
 		::Dynamic removeMedia_dyn();
 
 		::Dynamic storeMedia(::String mime,::Array< unsigned char > bd);
@@ -142,23 +180,22 @@ class HXCPP_CLASS_ATTRIBUTES Sqlite_obj : public ::hx::Object
 		::Dynamic getCaps(::String ver);
 		::Dynamic getCaps_dyn();
 
-		void storeLogin(::String accountId,::String clientId,::String displayName,::String token);
+		::Dynamic storeLogin(::String accountId,::String clientId,::String displayName,::String token);
 		::Dynamic storeLogin_dyn();
 
 		::Dynamic getLogin(::String accountId);
 		::Dynamic getLogin_dyn();
 
-		void removeAccount(::String accountId,bool completely);
+		::Dynamic removeAccount(::String accountId,bool completely);
 		::Dynamic removeAccount_dyn();
 
 		::Dynamic listAccounts();
 		::Dynamic listAccounts_dyn();
 
-		void listAccounts__fromC(::cpp::Function< void  (const char**,size_t,void*) > handler,void* handler__context);
-
 		bool smStoreInProgress;
 		::Array< unsigned char > smStoreNext;
-		void storeStreamManagement(::String accountId,::Array< unsigned char > sm);
+		::String smStoreIdNext;
+		::Dynamic storeStreamManagement(::String accountId,::Array< unsigned char > sm,::String sortId);
 		::Dynamic storeStreamManagement_dyn();
 
 		::Dynamic getStreamManagement(::String accountId);
diff --git a/Sources/c_borogove/iinclude/borogove/streams/XmppStropheStream.h b/Sources/c_borogove/iinclude/borogove/streams/XmppStropheStream.h
index d49e57a..2e7d4b5 100644
--- a/Sources/c_borogove/iinclude/borogove/streams/XmppStropheStream.h
+++ b/Sources/c_borogove/iinclude/borogove/streams/XmppStropheStream.h
@@ -92,8 +92,6 @@ class HXCPP_CLASS_ATTRIBUTES XmppStropheStream_obj : public  ::borogove::Generic
 		 ::haxe::Timer pollTimer;
 		bool ready;
 		bool stanzaThisPoll;
-		::String newId();
-
 		void onIq( ::borogove::IqRequestType type,::String tag,::String xmlns, ::Dynamic handler);
 
 		void connect(::String jid,::Array< unsigned char > sm);
diff --git a/Sources/c_borogove/iinclude/haxe/Int64Helper.h b/Sources/c_borogove/iinclude/haxe/Int64Helper.h
new file mode 100644
index 0000000..83d3b4b
--- /dev/null
+++ b/Sources/c_borogove/iinclude/haxe/Int64Helper.h
@@ -0,0 +1,60 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_haxe_Int64Helper
+#define INCLUDED_haxe_Int64Helper
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(haxe,Int64Helper)
+
+namespace haxe{
+
+
+class HXCPP_CLASS_ATTRIBUTES Int64Helper_obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef Int64Helper_obj OBJ_;
+		Int64Helper_obj();
+
+	public:
+		enum { _hx_ClassId = 0x03ea75b5 };
+
+		void __construct();
+		inline void *operator new(size_t inSize, bool inContainer=false,const char *inName="haxe.Int64Helper")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,false,"haxe.Int64Helper"); }
+
+		inline static ::hx::ObjectPtr< Int64Helper_obj > __new() {
+			::hx::ObjectPtr< Int64Helper_obj > __this = new Int64Helper_obj();
+			__this->__construct();
+			return __this;
+		}
+
+		inline static ::hx::ObjectPtr< Int64Helper_obj > __alloc(::hx::Ctx *_hx_ctx) {
+			Int64Helper_obj *__this = (Int64Helper_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Int64Helper_obj), false, "haxe.Int64Helper"));
+			*(void **)__this = Int64Helper_obj::_hx_vtable;
+			return __this;
+		}
+
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~Int64Helper_obj();
+
+		HX_DO_RTTI_ALL;
+		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
+		static void __register();
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("Int64Helper",1b,cf,b2,b0); }
+
+		static ::cpp::Int64 fromFloat(Float f);
+		static ::Dynamic fromFloat_dyn();
+
+};
+
+} // end namespace haxe
+
+#endif /* INCLUDED_haxe_Int64Helper */ 
diff --git a/Sources/c_borogove/iinclude/haxe/_Int64/Int64_Impl_.h b/Sources/c_borogove/iinclude/haxe/_Int64/Int64_Impl_.h
new file mode 100644
index 0000000..745f271
--- /dev/null
+++ b/Sources/c_borogove/iinclude/haxe/_Int64/Int64_Impl_.h
@@ -0,0 +1,62 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_haxe__Int64_Int64_Impl_
+#define INCLUDED_haxe__Int64_Int64_Impl_
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS2(haxe,_Int64,Int64_Impl_)
+
+namespace haxe{
+namespace _Int64{
+
+
+class HXCPP_CLASS_ATTRIBUTES Int64_Impl__obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef Int64_Impl__obj OBJ_;
+		Int64_Impl__obj();
+
+	public:
+		enum { _hx_ClassId = 0x66145239 };
+
+		void __construct();
+		inline void *operator new(size_t inSize, bool inContainer=false,const char *inName="haxe._Int64.Int64_Impl_")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,false,"haxe._Int64.Int64_Impl_"); }
+
+		inline static ::hx::ObjectPtr< Int64_Impl__obj > __new() {
+			::hx::ObjectPtr< Int64_Impl__obj > __this = new Int64_Impl__obj();
+			__this->__construct();
+			return __this;
+		}
+
+		inline static ::hx::ObjectPtr< Int64_Impl__obj > __alloc(::hx::Ctx *_hx_ctx) {
+			Int64_Impl__obj *__this = (Int64_Impl__obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Int64_Impl__obj), false, "haxe._Int64.Int64_Impl_"));
+			*(void **)__this = Int64_Impl__obj::_hx_vtable;
+			return __this;
+		}
+
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~Int64_Impl__obj();
+
+		HX_DO_RTTI_ALL;
+		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
+		static void __register();
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("Int64_Impl_",2d,1a,59,c4); }
+
+		static ::cpp::Int64 fromFloat(Float f);
+		static ::Dynamic fromFloat_dyn();
+
+};
+
+} // end namespace haxe
+} // end namespace _Int64
+
+#endif /* INCLUDED_haxe__Int64_Int64_Impl_ */ 
diff --git a/Sources/c_borogove/iinclude/haxe/crypto/Sha1.h b/Sources/c_borogove/iinclude/haxe/crypto/Sha1.h
index e2986e1..442d6dc 100644
--- a/Sources/c_borogove/iinclude/haxe/crypto/Sha1.h
+++ b/Sources/c_borogove/iinclude/haxe/crypto/Sha1.h
@@ -6,7 +6,7 @@
 #include <hxcpp.h>
 #endif
 
-HX_DECLARE_STACK_FRAME(_hx_pos_b388adc1457cbfc2_48_new)
+HX_DECLARE_STACK_FRAME(_hx_pos_6cacb1640f84e23c_87_new)
 HX_DECLARE_CLASS2(haxe,crypto,Sha1)
 HX_DECLARE_CLASS2(haxe,io,Bytes)
 
@@ -40,7 +40,7 @@ class HXCPP_CLASS_ATTRIBUTES Sha1_obj : public ::hx::Object
 			Sha1_obj *__this = (Sha1_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Sha1_obj), false, "haxe.crypto.Sha1"));
 			*(void **)__this = Sha1_obj::_hx_vtable;
 {
-            	HX_STACKFRAME(&_hx_pos_b388adc1457cbfc2_48_new)
+            	HX_STACKFRAME(&_hx_pos_6cacb1640f84e23c_87_new)
             	}
 		
 			return __this;
diff --git a/Sources/c_borogove/iinclude/haxe/crypto/Sha256.h b/Sources/c_borogove/iinclude/haxe/crypto/Sha256.h
index 6851954..7dece0c 100644
--- a/Sources/c_borogove/iinclude/haxe/crypto/Sha256.h
+++ b/Sources/c_borogove/iinclude/haxe/crypto/Sha256.h
@@ -6,7 +6,6 @@
 #include <hxcpp.h>
 #endif
 
-HX_DECLARE_STACK_FRAME(_hx_pos_0a4e95b4276e5057_48_new)
 HX_DECLARE_CLASS2(haxe,crypto,Sha256)
 HX_DECLARE_CLASS2(haxe,io,Bytes)
 
@@ -25,27 +24,12 @@ class HXCPP_CLASS_ATTRIBUTES Sha256_obj : public ::hx::Object
 		enum { _hx_ClassId = 0x0c0976ea };
 
 		void __construct();
-		inline void *operator new(size_t inSize, bool inContainer=false,const char *inName="haxe.crypto.Sha256")
+		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="haxe.crypto.Sha256")
 			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
 		inline void *operator new(size_t inSize, int extra)
-			{ return ::hx::Object::operator new(inSize+extra,false,"haxe.crypto.Sha256"); }
-
-		inline static ::hx::ObjectPtr< Sha256_obj > __new() {
-			::hx::ObjectPtr< Sha256_obj > __this = new Sha256_obj();
-			__this->__construct();
-			return __this;
-		}
-
-		inline static ::hx::ObjectPtr< Sha256_obj > __alloc(::hx::Ctx *_hx_ctx) {
-			Sha256_obj *__this = (Sha256_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Sha256_obj), false, "haxe.crypto.Sha256"));
-			*(void **)__this = Sha256_obj::_hx_vtable;
-{
-            	HX_STACKFRAME(&_hx_pos_0a4e95b4276e5057_48_new)
-            	}
-		
-			return __this;
-		}
-
+			{ return ::hx::Object::operator new(inSize+extra,true,"haxe.crypto.Sha256"); }
+		static ::hx::ObjectPtr< Sha256_obj > __new();
+		static ::hx::ObjectPtr< Sha256_obj > __alloc(::hx::Ctx *_hx_ctx);
 		static void * _hx_vtable;
 		static Dynamic __CreateEmpty();
 		static Dynamic __Create(::hx::DynamicArray inArgs);
@@ -54,16 +38,36 @@ class HXCPP_CLASS_ATTRIBUTES Sha256_obj : public ::hx::Object
 		HX_DO_RTTI_ALL;
 		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
 		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
+		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
+		void __GetFields(Array< ::String> &outFields);
 		static void __register();
+		void __Mark(HX_MARK_PARAMS);
+		void __Visit(HX_VISIT_PARAMS);
 		bool _hx_isInstanceOf(int inClassId);
 		::String __ToString() const { return HX_("Sha256",87,18,8f,51); }
 
 		static  ::haxe::io::Bytes make( ::haxe::io::Bytes b);
 		static ::Dynamic make_dyn();
 
+		static int bytesToInt( ::haxe::io::Bytes bs,int off);
+		static ::Dynamic bytesToInt_dyn();
+
 		static ::Array< int > bytes2blks( ::haxe::io::Bytes b);
 		static ::Dynamic bytes2blks_dyn();
 
+		::Array< int > HASH;
+		 ::haxe::io::Bytes buffer;
+		int bufferPos;
+		int totalLength;
+		 ::haxe::io::Bytes digest();
+		::Dynamic digest_dyn();
+
+		void update( ::haxe::io::Bytes data);
+		::Dynamic update_dyn();
+
+		void processBlock( ::haxe::io::Bytes block,int offset);
+		::Dynamic processBlock_dyn();
+
 		::Array< int > doEncode(::Array< int > m,int l);
 		::Dynamic doEncode_dyn();
 
diff --git a/Sources/c_borogove/iinclude/haxe/crypto/random/SecureRandom.h b/Sources/c_borogove/iinclude/haxe/crypto/random/SecureRandom.h
new file mode 100644
index 0000000..ee9a36a
--- /dev/null
+++ b/Sources/c_borogove/iinclude/haxe/crypto/random/SecureRandom.h
@@ -0,0 +1,76 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_haxe_crypto_random_SecureRandom
+#define INCLUDED_haxe_crypto_random_SecureRandom
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS3(haxe,crypto,random,SecureRandom)
+
+namespace haxe{
+namespace crypto{
+namespace random{
+
+
+class HXCPP_CLASS_ATTRIBUTES SecureRandom_obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef SecureRandom_obj OBJ_;
+		SecureRandom_obj();
+
+	public:
+		enum { _hx_ClassId = 0x315293ac };
+
+		void __construct();
+		inline void *operator new(size_t inSize, bool inContainer=false,const char *inName="haxe.crypto.random.SecureRandom")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,false,"haxe.crypto.random.SecureRandom"); }
+
+		inline static ::hx::ObjectPtr< SecureRandom_obj > __new() {
+			::hx::ObjectPtr< SecureRandom_obj > __this = new SecureRandom_obj();
+			__this->__construct();
+			return __this;
+		}
+
+		inline static ::hx::ObjectPtr< SecureRandom_obj > __alloc(::hx::Ctx *_hx_ctx) {
+			SecureRandom_obj *__this = (SecureRandom_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(SecureRandom_obj), false, "haxe.crypto.random.SecureRandom"));
+			*(void **)__this = SecureRandom_obj::_hx_vtable;
+			return __this;
+		}
+
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~SecureRandom_obj();
+
+		HX_DO_RTTI_ALL;
+		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
+		static bool __SetStatic(const ::String &inString, Dynamic &ioValue, ::hx::PropertyAccess inCallProp);
+		static void __register();
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("SecureRandom",fa,75,84,ba); }
+
+		static void __boot();
+		static bool initialized;
+		static void init();
+		static ::Dynamic init_dyn();
+
+		static int _hx_int();
+		static ::Dynamic _hx_int_dyn();
+
+		static int sysInt();
+		static ::Dynamic sysInt_dyn();
+
+		static int winInt();
+		static ::Dynamic winInt_dyn();
+
+};
+
+} // end namespace haxe
+} // end namespace crypto
+} // end namespace random
+
+#endif /* INCLUDED_haxe_crypto_random_SecureRandom */ 
diff --git a/Sources/c_borogove/iinclude/haxe/io/Bytes.h b/Sources/c_borogove/iinclude/haxe/io/Bytes.h
index 49850b2..c3ac508 100644
--- a/Sources/c_borogove/iinclude/haxe/io/Bytes.h
+++ b/Sources/c_borogove/iinclude/haxe/io/Bytes.h
@@ -63,9 +63,6 @@ class HXCPP_CLASS_ATTRIBUTES Bytes_obj : public ::hx::Object
 		void blit(int pos, ::haxe::io::Bytes src,int srcpos,int len);
 		::Dynamic blit_dyn();
 
-		void fill(int pos,int len,int value);
-		::Dynamic fill_dyn();
-
 		 ::haxe::io::Bytes sub(int pos,int len);
 		::Dynamic sub_dyn();
 
diff --git a/Sources/c_borogove/iinclude/sha/Hash.h b/Sources/c_borogove/iinclude/sha/Hash.h
deleted file mode 100644
index 105a34b..0000000
--- a/Sources/c_borogove/iinclude/sha/Hash.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Generated by Haxe 4.3.3
-#ifndef INCLUDED_sha_Hash
-#define INCLUDED_sha_Hash
-
-#ifndef HXCPP_H
-#include <hxcpp.h>
-#endif
-
-HX_DECLARE_CLASS2(haxe,io,Bytes)
-HX_DECLARE_CLASS1(sha,Hash)
-
-namespace sha{
-
-
-class HXCPP_CLASS_ATTRIBUTES Hash_obj : public ::hx::Object
-{
-	public:
-		typedef ::hx::Object super;
-		typedef Hash_obj OBJ_;
-		Hash_obj();
-
-	public:
-		enum { _hx_ClassId = 0x49a7eb1a };
-
-		void __construct(int blockSize,int finalSize);
-		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="sha.Hash")
-			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
-		inline void *operator new(size_t inSize, int extra)
-			{ return ::hx::Object::operator new(inSize+extra,true,"sha.Hash"); }
-
-		//~Hash_obj();
-
-		HX_DO_RTTI_ALL;
-		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
-		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
-		void __GetFields(Array< ::String> &outFields);
-		static void __register();
-		void __Mark(HX_MARK_PARAMS);
-		void __Visit(HX_VISIT_PARAMS);
-		bool _hx_isInstanceOf(int inClassId);
-		::String __ToString() const { return HX_("Hash",ee,5b,e1,2f); }
-
-		int finalSize;
-		int length;
-		 ::haxe::io::Bytes block;
-		 ::sha::Hash update( ::haxe::io::Bytes data);
-		::Dynamic update_dyn();
-
-		 ::haxe::io::Bytes digest();
-		::Dynamic digest_dyn();
-
-		virtual void _update( ::haxe::io::Bytes data) {}
-		::Dynamic _update_dyn();
-		virtual  ::haxe::io::Bytes _hash() { return 0; }
-		::Dynamic _hash_dyn();
-};
-
-} // end namespace sha
-
-#endif /* INCLUDED_sha_Hash */ 
diff --git a/Sources/c_borogove/iinclude/sha/SHA256.h b/Sources/c_borogove/iinclude/sha/SHA256.h
deleted file mode 100644
index 28722a8..0000000
--- a/Sources/c_borogove/iinclude/sha/SHA256.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// Generated by Haxe 4.3.3
-#ifndef INCLUDED_sha_SHA256
-#define INCLUDED_sha_SHA256
-
-#ifndef HXCPP_H
-#include <hxcpp.h>
-#endif
-
-#ifndef INCLUDED_sha_Hash
-#include <sha/Hash.h>
-#endif
-HX_DECLARE_CLASS2(haxe,io,Bytes)
-HX_DECLARE_CLASS1(sha,Hash)
-HX_DECLARE_CLASS1(sha,SHA256)
-
-namespace sha{
-
-
-class HXCPP_CLASS_ATTRIBUTES SHA256_obj : public  ::sha::Hash_obj
-{
-	public:
-		typedef  ::sha::Hash_obj super;
-		typedef SHA256_obj OBJ_;
-		SHA256_obj();
-
-	public:
-		enum { _hx_ClassId = 0x0251ab23 };
-
-		void __construct();
-		inline void *operator new(size_t inSize, bool inContainer=true,const char *inName="sha.SHA256")
-			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
-		inline void *operator new(size_t inSize, int extra)
-			{ return ::hx::Object::operator new(inSize+extra,true,"sha.SHA256"); }
-		static ::hx::ObjectPtr< SHA256_obj > __new();
-		static ::hx::ObjectPtr< SHA256_obj > __alloc(::hx::Ctx *_hx_ctx);
-		static void * _hx_vtable;
-		static Dynamic __CreateEmpty();
-		static Dynamic __Create(::hx::DynamicArray inArgs);
-		//~SHA256_obj();
-
-		HX_DO_RTTI_ALL;
-		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
-		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
-		void __GetFields(Array< ::String> &outFields);
-		static void __register();
-		void __Mark(HX_MARK_PARAMS);
-		void __Visit(HX_VISIT_PARAMS);
-		bool _hx_isInstanceOf(int inClassId);
-		::String __ToString() const { return HX_("SHA256",87,b4,95,cf); }
-
-		int _a;
-		int _b;
-		int _c;
-		int _d;
-		int _e;
-		int _f;
-		int _g;
-		int _h;
-		::Array< int > _w;
-		int sigma0(int x);
-		::Dynamic sigma0_dyn();
-
-		int sigma1(int x);
-		::Dynamic sigma1_dyn();
-
-		int gamma0(int x);
-		::Dynamic gamma0_dyn();
-
-		int gamma1(int x);
-		::Dynamic gamma1_dyn();
-
-		int ch(int x,int y,int z);
-		::Dynamic ch_dyn();
-
-		int maj(int x,int y,int z);
-		::Dynamic maj_dyn();
-
-		void _update( ::haxe::io::Bytes data);
-
-		 ::haxe::io::Bytes _hash();
-
-};
-
-} // end namespace sha
-
-#endif /* INCLUDED_sha_SHA256 */ 
diff --git a/Sources/c_borogove/iinclude/sha/_SHA256/SHA256_Fields_.h b/Sources/c_borogove/iinclude/sha/_SHA256/SHA256_Fields_.h
deleted file mode 100644
index 3d1d69a..0000000
--- a/Sources/c_borogove/iinclude/sha/_SHA256/SHA256_Fields_.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Generated by Haxe 4.3.3
-#ifndef INCLUDED_sha__SHA256_SHA256_Fields_
-#define INCLUDED_sha__SHA256_SHA256_Fields_
-
-#ifndef HXCPP_H
-#include <hxcpp.h>
-#endif
-
-HX_DECLARE_CLASS2(sha,_SHA256,SHA256_Fields_)
-
-namespace sha{
-namespace _SHA256{
-
-
-class HXCPP_CLASS_ATTRIBUTES SHA256_Fields__obj : public ::hx::Object
-{
-	public:
-		typedef ::hx::Object super;
-		typedef SHA256_Fields__obj OBJ_;
-		SHA256_Fields__obj();
-
-	public:
-		enum { _hx_ClassId = 0x07d39014 };
-
-		void __construct();
-		inline void *operator new(size_t inSize, bool inContainer=false,const char *inName="sha._SHA256.SHA256_Fields_")
-			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
-		inline void *operator new(size_t inSize, int extra)
-			{ return ::hx::Object::operator new(inSize+extra,false,"sha._SHA256.SHA256_Fields_"); }
-
-		inline static ::hx::ObjectPtr< SHA256_Fields__obj > __new() {
-			::hx::ObjectPtr< SHA256_Fields__obj > __this = new SHA256_Fields__obj();
-			__this->__construct();
-			return __this;
-		}
-
-		inline static ::hx::ObjectPtr< SHA256_Fields__obj > __alloc(::hx::Ctx *_hx_ctx) {
-			SHA256_Fields__obj *__this = (SHA256_Fields__obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(SHA256_Fields__obj), false, "sha._SHA256.SHA256_Fields_"));
-			*(void **)__this = SHA256_Fields__obj::_hx_vtable;
-			return __this;
-		}
-
-		static void * _hx_vtable;
-		static Dynamic __CreateEmpty();
-		static Dynamic __Create(::hx::DynamicArray inArgs);
-		//~SHA256_Fields__obj();
-
-		HX_DO_RTTI_ALL;
-		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
-		static bool __SetStatic(const ::String &inString, Dynamic &ioValue, ::hx::PropertyAccess inCallProp);
-		static void __register();
-		bool _hx_isInstanceOf(int inClassId);
-		::String __ToString() const { return HX_("SHA256_Fields_",ae,b0,ef,ea); }
-
-		static void __boot();
-		static ::Array< int > K;
-};
-
-} // end namespace sha
-} // end namespace _SHA256
-
-#endif /* INCLUDED_sha__SHA256_SHA256_Fields_ */ 
diff --git a/Sources/c_borogove/iinclude/sys/db/Connection.h b/Sources/c_borogove/iinclude/sys/db/Connection.h
index 35cf126..eb1d8c6 100644
--- a/Sources/c_borogove/iinclude/sys/db/Connection.h
+++ b/Sources/c_borogove/iinclude/sys/db/Connection.h
@@ -6,8 +6,6 @@
 #include <hxcpp.h>
 #endif
 
-#include <CrashHandler.h>
-
 HX_DECLARE_CLASS2(sys,db,Connection)
 HX_DECLARE_CLASS2(sys,db,ResultSet)
 
@@ -22,11 +20,7 @@ class HXCPP_CLASS_ATTRIBUTES Connection_obj {
 
 		::Dynamic (::hx::Object :: *_hx_request)(::String s); 
 		static inline ::Dynamic request( ::Dynamic _hx_,::String s) {
-			myassert(_hx_.mPtr);
-			myassert(s);
-			auto interf = ::hx::interface_cast< ::sys::db::Connection_obj *>(_hx_.mPtr->_hx_getInterface(0x6e7a3d49));
-			myassert(interf);
-			return (_hx_.mPtr->*(interf)->_hx_request)(s);
+			return (_hx_.mPtr->*( ::hx::interface_cast< ::sys::db::Connection_obj *>(_hx_.mPtr->_hx_getInterface(0x6e7a3d49)))->_hx_request)(s);
 		}
 };
 
diff --git a/Sources/c_borogove/iinclude/sys/io/Process.h b/Sources/c_borogove/iinclude/sys/io/Process.h
index d4386c5..47d53a8 100644
--- a/Sources/c_borogove/iinclude/sys/io/Process.h
+++ b/Sources/c_borogove/iinclude/sys/io/Process.h
@@ -53,6 +53,9 @@ class HXCPP_CLASS_ATTRIBUTES Process_obj : public ::hx::Object
 		 ::Dynamic exitCode(::hx::Null< bool >  block);
 		::Dynamic exitCode_dyn();
 
+		void close();
+		::Dynamic close_dyn();
+
 };
 
 } // end namespace sys
diff --git a/Sources/c_borogove/iinclude/uuidv7/V7Generator.h b/Sources/c_borogove/iinclude/uuidv7/V7Generator.h
new file mode 100644
index 0000000..c1f4679
--- /dev/null
+++ b/Sources/c_borogove/iinclude/uuidv7/V7Generator.h
@@ -0,0 +1,72 @@
+// Generated by Haxe 4.3.3
+#ifndef INCLUDED_uuidv7_V7Generator
+#define INCLUDED_uuidv7_V7Generator
+
+#ifndef HXCPP_H
+#include <hxcpp.h>
+#endif
+
+HX_DECLARE_CLASS1(uuidv7,V7Generator)
+
+namespace uuidv7{
+
+
+class HXCPP_CLASS_ATTRIBUTES V7Generator_obj : public ::hx::Object
+{
+	public:
+		typedef ::hx::Object super;
+		typedef V7Generator_obj OBJ_;
+		V7Generator_obj();
+
+	public:
+		enum { _hx_ClassId = 0x60dea512 };
+
+		void __construct();
+		inline void *operator new(size_t inSize, bool inContainer=false,const char *inName="uuidv7.V7Generator")
+			{ return ::hx::Object::operator new(inSize,inContainer,inName); }
+		inline void *operator new(size_t inSize, int extra)
+			{ return ::hx::Object::operator new(inSize+extra,false,"uuidv7.V7Generator"); }
+		static ::hx::ObjectPtr< V7Generator_obj > __new();
+		static ::hx::ObjectPtr< V7Generator_obj > __alloc(::hx::Ctx *_hx_ctx);
+		static void * _hx_vtable;
+		static Dynamic __CreateEmpty();
+		static Dynamic __Create(::hx::DynamicArray inArgs);
+		//~V7Generator_obj();
+
+		HX_DO_RTTI_ALL;
+		::hx::Val __Field(const ::String &inString, ::hx::PropertyAccess inCallProp);
+		static bool __GetStatic(const ::String &inString, Dynamic &outValue, ::hx::PropertyAccess inCallProp);
+		::hx::Val __SetField(const ::String &inString,const ::hx::Val &inValue, ::hx::PropertyAccess inCallProp);
+		static bool __SetStatic(const ::String &inString, Dynamic &ioValue, ::hx::PropertyAccess inCallProp);
+		void __GetFields(Array< ::String> &outFields);
+		static void __register();
+		bool _hx_isInstanceOf(int inClassId);
+		::String __ToString() const { return HX_("V7Generator",f2,a0,fb,d0); }
+
+		static void __boot();
+		static ::String DIGITS;
+		static Float int64ToFloat(::cpp::Int64 i);
+		static ::Dynamic int64ToFloat_dyn();
+
+		static ::String formatUuid(Float unixTsMs,int randA,int randBHi,int randBLo);
+		static ::Dynamic formatUuid_dyn();
+
+		::cpp::Int64 timestampBiased;
+		::cpp::Int64 counter;
+		::String generate();
+		::Dynamic generate_dyn();
+
+		::String generateOrResetCore(Float unixTsMs,Float rollbackAllowance);
+		::Dynamic generateOrResetCore_dyn();
+
+		::String generateOrAbortCore(Float unixTsMs,Float rollbackAllowance);
+		::Dynamic generateOrAbortCore_dyn();
+
+		void resetCounter();
+		::Dynamic resetCounter_dyn();
+
+};
+
+} // end namespace uuidv7
+
+#endif /* INCLUDED_uuidv7_V7Generator */ 
diff --git a/Sources/c_borogove/include/borogove.h b/Sources/c_borogove/include/borogove.h
index 18f3ef9..330ab22 100644
--- a/Sources/c_borogove/include/borogove.h
+++ b/Sources/c_borogove/include/borogove.h
@@ -28,30 +28,6 @@
 
 typedef void (*borogove_panic_callback) (const char *info);
 
-enum
-#ifdef __clang__
-__attribute__((enum_extensibility(closed)))
-#endif
-borogove_ui_state {
-	Pinned = 0,
-	Open = 1,
-	Closed = 2,
-	Invited = 3
-};
-
-enum
-#ifdef __clang__
-__attribute__((enum_extensibility(closed)))
-#endif
-borogove_calls_call_status {
-	NoCall = 0,
-	Incoming = 1,
-	Outgoing = 2,
-	Connecting = 3,
-	Ongoing = 4,
-	Failed = 5
-};
-
 enum
 #ifdef __clang__
 __attribute__((enum_extensibility(closed)))
@@ -94,66 +70,448 @@ borogove_encryption_status {
 
 typedef int borogove_event_handler_token;
 
+enum
+#ifdef __clang__
+__attribute__((enum_extensibility(closed)))
+#endif
+borogove_ui_state {
+	Pinned = 0,
+	Open = 1,
+	Closed = 2,
+	Invited = 3
+};
+
+enum
+#ifdef __clang__
+__attribute__((enum_extensibility(closed)))
+#endif
+borogove_calls_call_status {
+	NoCall = 0,
+	Incoming = 1,
+	Outgoing = 2,
+	Connecting = 3,
+	Ongoing = 4,
+	Failed = 5
+};
+
+enum
+#ifdef __clang__
+__attribute__((enum_extensibility(closed)))
+#endif
+borogove_show_presence {
+	Online = 0,
+	Idle = 1,
+	DoNotDisturb = 2,
+	Standby = 3,
+	Offline = 4
+};
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /**
- * Initializes the SDK
- *
- * This must be first before calling SDK functions (otherwise those calls will hang waiting for a response).
- *
- * @param panicCallback a callback to execute if the SDK panics. The SDK will continue processing events after a panic and you may want to stop it after receiving this callback. Use `NULL` for no callback
- * @returns `NULL` if the thread initializes successfully or a null-terminated C string if an error occurs during initialization
+ * Initializes the SDK
+ *
+ * This must be first before calling SDK functions (otherwise those calls will hang waiting for a response).
+ *
+ * @param panicCallback a callback to execute if the SDK panics. The SDK will continue processing events after a panic and you may want to stop it after receiving this callback. Use `NULL` for no callback
+ * @returns `NULL` if the thread initializes successfully or a null-terminated C string if an error occurs during initialization
+ */
+API_PREFIX const char *borogove_setup(borogove_panic_callback panic_callback);
+
+/**
+ * Stops the SDK, blocking until the main thread has completed. Once ended, it cannot be restarted (this is because static variable state will be retained from the last run).
+ *
+ * It can be safely called any number of times – if the SDK is not running this function will just return.
+ *
+ * After executing no more calls to SDK functions can be made (as these will hang waiting for a response).
+ *
+ * @param wait If `true`, this function will wait for all events scheduled to execute in the future on the SDK thread to complete. If `false`, immediate pending events will be finished and the SDK stopped without executing events scheduled in the future
+ */
+API_PREFIX void borogove_stop(bool wait);
+
+/**
+ * Informs the garbage collector that object is no longer needed by the C code.
+ * 
+ * If the object has no remaining reference the garbage collector can free the associated memory (which can happen at any time in the future). It does not free the memory immediately.
+ * 
+ * Thread-safety: can be called on any thread.
+ * 
+ * @param ptr a handle to an arbitrary SDK object returned from an SDK function
+ */
+API_PREFIX void borogove_release(const void *ptr);
+
+/**
+ * Register a finalizer to run when this object is garbage collected
+ * 
+ * Thread-safety: can be called on any thread.
+ * 
+ * @param ptr a handle to an arbitrary SDK object returned from an SDK function
+ * @param finalize a function pointer that will be called with ptr right before it is fully released
+ */
+API_PREFIX void borogove_set_finalizer(const void *ptr, void (*finalize) (void *ptr));
+
+/**
+ * HTML builder, make an element
+ */
+API_PREFIX void *borogove_html_element(const char *tag, const char *const *attr, size_t attr__len, const char *const *attrValues, size_t attrValues__len, void *const *children, size_t children__len);
+
+/**
+ * HTML builder, make some text
+ */
+API_PREFIX void *borogove_html_text(const char *text);
+
+/**
+ * HTML builder, make a fragment
+ */
+API_PREFIX void *borogove_html_fragment(void *const *nodes, size_t nodes__len);
+
+/**
+ * Build HTML payload from source
+ */
+API_PREFIX void *borogove_html_from_string(const char *html);
+
+/**
+ * Walk the HTML tree to produce a new value
+ */
+API_PREFIX size_t borogove_html_reduce(void *html, void *(*f) (const char*, const char**, ptrdiff_t, const char**, ptrdiff_t, void**, ptrdiff_t, void*), void *f__context, void ***outPtr);
+
+/**
+ * Get HTML source as a string
+ */
+API_PREFIX const char *borogove_html_to_string(void *html);
+
+/**
+ * Get plain text suitable for showing to a user
+ */
+API_PREFIX const char *borogove_html_to_plain_text(void *html);
+
+API_PREFIX void borogove_persistence_media_store_has_media(void *self, const char *hashAlgorithm, const unsigned char *hash, size_t hash__len, void (*handler) (bool, void *handler__context), void *handler__context);
+
+API_PREFIX void borogove_persistence_media_store_remove_media(void *self, const char *hashAlgorithm, const unsigned char *hash, size_t hash__len, void (*handler) (bool, void *handler__context), void *handler__context);
+
+API_PREFIX void borogove_persistence_media_store_store_media(void *self, const char *mime, const unsigned char *bytes, size_t bytes__len, void (*handler) (bool, void *handler__context), void *handler__context);
+
+/**
+ * Store media on the filesystem
+ * 
+ * @param path where on filesystem to store media
+ */
+API_PREFIX void *borogove_persistence_media_store_fs_new(const char *path);
+
+/**
+ * Get absolute path on filesystem to a particular piece of media
+ * 
+ * @param uri The URI to the media (ni:// or similar)
+ * @param handler which receives the path or null
+ */
+API_PREFIX void borogove_persistence_media_store_fs_get_media_path(void *media_store_fs, const char *uri, void (*handler) (const char*, void *handler__context), void *handler__context);
+
+API_PREFIX void borogove_persistence_key_value_store_get(void *self, const char *k, void (*handler) (const char*, void *handler__context), void *handler__context);
+
+API_PREFIX void borogove_persistence_key_value_store_set(void *self, const char *k, const char *v, void (*handler) (bool, void *handler__context), void *handler__context);
+
+/**
+ * The ID as set by the creator of this message
+ */
+API_PREFIX const char *borogove_chat_message_local_id(void *chat_message);
+
+/**
+ * The ID as set by the authoritative server
+ */
+API_PREFIX const char *borogove_chat_message_server_id(void *chat_message);
+
+/**
+ * The ID of the server which set the serverId
+ */
+API_PREFIX const char *borogove_chat_message_server_id_by(void *chat_message);
+
+/**
+ * The type of this message (Chat, Call, etc)
+ */
+API_PREFIX enum borogove_message_type borogove_chat_message_type(void *chat_message);
+
+/**
+ * The timestamp of this message, in format YYYY-MM-DDThh:mm:ss[.sss]Z
+ */
+API_PREFIX const char *borogove_chat_message_timestamp(void *chat_message);
+
+/**
+ * The ID of the sender of this message
+ */
+API_PREFIX const char *borogove_chat_message_sender_id(void *chat_message);
+
+/**
+ * Message this one is in reply to, or NULL
+ */
+API_PREFIX void *borogove_chat_message_reply_to_message(void *chat_message);
+
+/**
+ * ID of the thread this message is in, or NULL
+ */
+API_PREFIX const char *borogove_chat_message_thread_id(void *chat_message);
+
+/**
+ * Array of attachments to this message
+ */
+API_PREFIX size_t borogove_chat_message_attachments(void *chat_message, void ***outPtr);
+
+/**
+ * List of reactions to this message
+ */
+API_PREFIX size_t borogove_chat_message_reaction_keys(void *chat_message, const char ***outPtr);
+
+/**
+ * Details of a set of reaction to this message
+ */
+API_PREFIX size_t borogove_chat_message_reaction_details(void *chat_message, const char *reactionKey, void ***outPtr);
+
+/**
+ * Language code for the body
+ */
+API_PREFIX const char *borogove_chat_message_lang(void *chat_message);
+
+/**
+ * Direction of this message
+ */
+API_PREFIX enum borogove_message_direction borogove_chat_message_direction(void *chat_message);
+
+/**
+ * Status of this message
+ */
+API_PREFIX enum borogove_message_status borogove_chat_message_status(void *chat_message);
+
+/**
+ * Message to go along with the message status
+ */
+API_PREFIX const char *borogove_chat_message_status_text(void *chat_message);
+
+/**
+ * Array of past versions of this message, if it has been edited
+ */
+API_PREFIX size_t borogove_chat_message_versions(void *chat_message, void ***outPtr);
+
+/**
+ * Information about the encryption used by the sender of
+ * this message.
+ */
+API_PREFIX void *borogove_chat_message_encryption(void *chat_message);
+
+/**
+ * Metadata about links associated with this message
+ */
+API_PREFIX size_t borogove_chat_message_link_metadata(void *chat_message, void ***outPtr);
+
+/**
+ * Create a new ChatMessage in reply to this one
+ */
+API_PREFIX void *borogove_chat_message_reply(void *chat_message);
+
+/**
+ * HTML representation of the message body
+ * 
+ * WARNING: this is possibly untrusted HTML. You must parse or sanitize appropriately!
+ * 
+ * @param sender optionally specify the full details of the sender
+ */
+API_PREFIX void *borogove_chat_message_body(void *chat_message, void *sender);
+
+/**
+ * Subject if present
+ */
+API_PREFIX const char *borogove_chat_message_subject(void *chat_message);
+
+/**
+ * The ID of the Chat this message is associated with
+ */
+API_PREFIX const char *borogove_chat_message_chat_id(void *chat_message);
+
+/**
+ * The ID of the account associated with this message
+ */
+API_PREFIX const char *borogove_chat_message_account(void *chat_message);
+
+/**
+ * A basic Member for the sender, in case the full one can't be loaded
+ */
+API_PREFIX void *borogove_chat_message_sender_member_stub(void *chat_message);
+
+/**
+ * Is this message the same as or a replacement for some other one?
+ */
+API_PREFIX bool borogove_chat_message_can_replace(void *chat_message, void *other);
+
+/**
+ * Is this an incoming message?
+ */
+API_PREFIX bool borogove_chat_message_is_incoming(void *chat_message);
+
+/**
+ * The URI of an icon for the thread associated with this message, or NULL
+ */
+API_PREFIX const char *borogove_chat_message_thread_icon(void *chat_message);
+
+/**
+ * If message is moderated, the reason
+ */
+API_PREFIX const char *borogove_chat_message_moderation_reason(void *chat_message);
+
+/**
+ * The last status of the call if this message is related to a call
+ */
+API_PREFIX const char *borogove_chat_message_call_status(void *chat_message);
+
+/**
+ * The session id of the call if this message is related to a call
+ */
+API_PREFIX const char *borogove_chat_message_call_sid(void *chat_message);
+
+/**
+ * The duration of the call if this message is related to a call
+ */
+API_PREFIX const char *borogove_chat_message_call_duration(void *chat_message);
+
+/**
+ * Create a new attachment for adding to a ChatMessage
+ * 
+ * @param name Optional filename
+ * @param mime MIME type
+ * @param size Size in bytes
+ * @param uri URI to attachment
+ */
+API_PREFIX void *borogove_chat_attachment_create(const char *name, const char *mime, int size, const char *uri);
+
+/**
+ * Filename
+ */
+API_PREFIX const char *borogove_chat_attachment_name(void *chat_attachment);
+
+/**
+ * MIME Type
+ */
+API_PREFIX const char *borogove_chat_attachment_mime(void *chat_attachment);
+
+/**
+ * Size in bytes
+ */
+API_PREFIX int borogove_chat_attachment_size(void *chat_attachment);
+
+/**
+ * URIs to data
+ */
+API_PREFIX size_t borogove_chat_attachment_uris(void *chat_attachment, const char ***outPtr);
+
+/**
+ * Hashes of data
+ */
+API_PREFIX size_t borogove_chat_attachment_hashes(void *chat_attachment, void ***outPtr);
+
+/**
+ * Create a new Hash from a hex string
+ * 
+ * @param algorithm name per https://xmpp.org/extensions/xep-0300.html
+ * @param hash in hex format
+ * @returns Hash or null on error
+ */
+API_PREFIX void *borogove_hash_from_hex(const char *algorithm, const char *hash);
+
+/**
+ * Create a new Hash from a ni:, cid: or similar URI
+ * 
+ * @param uri The URI
+ * @returns Hash or null on error
  */
-API_PREFIX const char *borogove_setup(borogove_panic_callback panic_callback);
+API_PREFIX void *borogove_hash_from_uri(const char *uri);
 
 /**
- * Stops the SDK, blocking until the main thread has completed. Once ended, it cannot be restarted (this is because static variable state will be retained from the last run).
- *
- * It can be safely called any number of times – if the SDK is not running this function will just return.
- *
- * After executing no more calls to SDK functions can be made (as these will hang waiting for a response).
- *
- * @param wait If `true`, this function will wait for all events scheduled to execute in the future on the SDK thread to complete. If `false`, immediate pending events will be finished and the SDK stopped without executing events scheduled in the future
+ * Hash algorithm name
  */
-API_PREFIX void borogove_stop(bool wait);
+API_PREFIX const char *borogove_hash_algorithm(void *hash);
 
 /**
- * Informs the garbage collector that object is no longer needed by the C code.
+ * Represent this Hash as a URI
  * 
- * If the object has no remaining reference the garbage collector can free the associated memory (which can happen at any time in the future). It does not free the memory immediately.
+ * @returns URI as a string
+ */
+API_PREFIX const char *borogove_hash_to_uri(void *hash);
+
+/**
+ * Represent this Hash as a hex string
  * 
- * Thread-safety: can be called on any thread.
+ * @returns hex string
+ */
+API_PREFIX const char *borogove_hash_to_hex(void *hash);
+
+/**
+ * Represent this Hash as a Base64 string
  * 
- * @param ptr a handle to an arbitrary SDK object returned from an SDK function
+ * @returns Base64-encoded string
  */
-API_PREFIX void borogove_release(const void *ptr);
+API_PREFIX const char *borogove_hash_to_base_64(void *hash);
 
-API_PREFIX void borogove_persistence_media_store_has_media(void *self, const char *hashAlgorithm, const unsigned char *hash, size_t hash__len, void (*handler) (bool, void *handler__context), void *handler__context);
+/**
+ * Represent this Hash as a Base64url string
+ * 
+ * @returns Base64url-encoded string
+ */
+API_PREFIX const char *borogove_hash_to_base_64_url(void *hash);
 
-API_PREFIX void borogove_persistence_media_store_remove_media(void *self, const char *hashAlgorithm, const unsigned char *hash, size_t hash__len);
+/**
+ * Create a new Unicode reaction to send
+ * 
+ * @param unicode emoji of the reaction
+ * @returns Reaction
+ */
+API_PREFIX void *borogove_reaction_unicode(const char *unicode);
 
-API_PREFIX void borogove_persistence_media_store_store_media(void *self, const char *mime, const unsigned char *bytes, size_t bytes__len, void (*handler) (bool, void *handler__context), void *handler__context);
+/**
+ * ID of who sent this Reaction
+ */
+API_PREFIX const char *borogove_reaction_sender_id(void *reaction);
 
 /**
- * Store media on the filesystem
- * 
- * @param path where on filesystem to store media
+ * Date and time when this Reaction was sent,
+ * in format YYYY-MM-DDThh:mm:ss[.sss]+00:00
  */
-API_PREFIX void *borogove_persistence_media_store_fs_new(const char *path);
+API_PREFIX const char *borogove_reaction_timestamp(void *reaction);
 
 /**
- * Get absolute path on filesystem to a particular piece of media
- * 
- * @param uri The URI to the media (ni:// or similar)
- * @param handler which receives the path or null
+ * Key for grouping reactions
  */
-API_PREFIX void borogove_persistence_media_store_fs_get_media_path(void *media_store_fs, const char *uri, void (*handler) (const char*, void *handler__context), void *handler__context);
+API_PREFIX const char *borogove_reaction_key(void *reaction);
 
-API_PREFIX void borogove_persistence_key_value_store_get(void *self, const char *k, void (*handler) (const char*, void *handler__context), void *handler__context);
+API_PREFIX enum borogove_encryption_status borogove_encryption_info_status(void *encryption_info);
 
-API_PREFIX void borogove_persistence_key_value_store_set(void *self, const char *k, const char *v, void (*handler) (bool, void *handler__context), void *handler__context);
+API_PREFIX const char *borogove_encryption_info_method(void *encryption_info);
+
+API_PREFIX const char *borogove_encryption_info_method_name(void *encryption_info);
+
+API_PREFIX const char *borogove_encryption_info_reason(void *encryption_info);
+
+API_PREFIX const char *borogove_encryption_info_reason_text(void *encryption_info);
+
+API_PREFIX const char *borogove_link_metadata_about(void *link_metadata);
+
+API_PREFIX const char *borogove_link_metadata_url(void *link_metadata);
+
+API_PREFIX const char *borogove_link_metadata_title(void *link_metadata);
+
+API_PREFIX const char *borogove_link_metadata_description(void *link_metadata);
+
+API_PREFIX size_t borogove_link_metadata_image(void *link_metadata, const char ***outPtr);
+
+API_PREFIX size_t borogove_link_metadata_video(void *link_metadata, const char ***outPtr);
+
+/**
+ * Remove an event listener of any type, no matter how it was added
+ * or what event it is for.
+ * 
+ * @param token the token that was returned when the listener was added
+ */
+API_PREFIX void borogove_event_emitter_remove_event_listener(void *event_emitter, borogove_event_handler_token token);
+
+API_PREFIX void *borogove_chat_status(void *chat);
 
 /**
  * ID of this Chat
@@ -183,32 +541,26 @@ API_PREFIX bool borogove_chat_is_bookmarked(void *chat);
 /**
  * Fetch a page of messages before some point
  * 
- * @param beforeId id of the message to look before
- * @param beforeTime timestamp of the message to look before,
- *        String in format YYYY-MM-DDThh:mm:ss[.sss]+00:00
+ * @param before ChatMessage to look before, or null to start at the end
  * @param handler which receives an array of ChatMessage that are found
  */
-API_PREFIX void borogove_chat_get_messages_before(void *chat, const char *beforeId, const char *beforeTime, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
+API_PREFIX void borogove_chat_get_messages_before(void *chat, void *before, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
 
 /**
  * Fetch a page of messages after some point
  * 
- * @param afterId id of the message to look after
- * @param afterTime timestamp of the message to look after,
- *        String in format YYYY-MM-DDThh:mm:ss[.sss]+00:00
+ * @param after ChatMessage to look after, or null to start at the beginning
  * @param handler which receives an array of ChatMessage that are found
  */
-API_PREFIX void borogove_chat_get_messages_after(void *chat, const char *afterId, const char *afterTime, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
+API_PREFIX void borogove_chat_get_messages_after(void *chat, void *after, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
 
 /**
  * Fetch a page of messages around (before, including, and after) some point
  * 
- * @param aroundId id of the message to look around
- * @param aroundTime timestamp of the message to look around,
- *        String in format YYYY-MM-DDThh:mm:ss[.sss]+00:00
+ * @param around ChatMessage to look around
  * @param handler which receives an array of ChatMessage that are found
  */
-API_PREFIX void borogove_chat_get_messages_around(void *chat, const char *aroundId, const char *aroundTime, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
+API_PREFIX void borogove_chat_get_messages_around(void *chat, void *around, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
 
 /**
  * Send a message to this Chat
@@ -231,27 +583,69 @@ API_PREFIX void borogove_chat_mark_read_up_to(void *chat, void *message);
 API_PREFIX void borogove_chat_bookmark(void *chat);
 
 /**
- * Get the list of IDs of participants in this Chat
+ * Get a list of members in this Chat
+ * 
+ * This list will often be a a complete list of everyone who has access to
+ * the chat, but for larger chats may be incomplete.
+ */
+API_PREFIX void borogove_chat_members(void *chat, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
+
+/**
+ * Get the details for some members in this Chat
+ * 
+ * @param memberIds the IDs of the member to look up
+ */
+API_PREFIX void borogove_chat_get_member_details(void *chat, const char *const *memberIds, size_t memberIds__len, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
+
+/**
+ * Event fired when a member is updated, or when a new member is added
+ * 
+ * @param handler takes one argument, an array of Member that were updated
+ * @returns token for use with removeEventListener
+ */
+API_PREFIX borogove_event_handler_token borogove_chat_add_members_updated_listener(void *chat, void (*handler) (void**, size_t, void*), void *handler__context);
+
+/**
+ * Roles the current user can assign to the target member
+ */
+API_PREFIX size_t borogove_chat_available_roles(void *chat, void *member, void ***outPtr);
+
+/**
+ * Can the current user remove this role from the member?
+ */
+API_PREFIX bool borogove_chat_can_remove_role(void *chat, void *member, void *role);
+
+/**
+ * Add a role to a member
  * 
- * @returns array of IDs
+ * @param member the member to update
+ * @param role the role to add
  */
-API_PREFIX size_t borogove_chat_get_participants(void *chat, const char ***outPtr);
+API_PREFIX void borogove_chat_add_role(void *chat, void *member, void *role);
 
 /**
- * Get the details for one participant in this Chat
+ * Remove a role from a member
  * 
- * @param participantId the ID of the participant to look up
+ * @param member the member to update
+ * @param role the role to remove
  */
-API_PREFIX void *borogove_chat_get_participant_details(void *chat, const char *participantId);
+API_PREFIX void borogove_chat_remove_role(void *chat, void *member, void *role);
 
 /**
  * Correct an already-send message by replacing it with a new one
  * 
- * @param localId the localId of the message to correct
- *        must be the localId of the first version ever sent, not a subsequent correction
- * @param message the new ChatMessage to replace it with
+ * @param correct the ChatMessage to correct
+ * @param message the new ChatMessageBuilder to replace it with
+ */
+API_PREFIX void borogove_chat_correct_message(void *chat, void *correct, void *message);
+
+/**
+ * Moderate a message by replacing it with a tombstone (if permitted)
+ * 
+ * @param message the message to moderate
+ * @param reason the reason for moderating this message
  */
-API_PREFIX void borogove_chat_correct_message(void *chat, const char *localId, void *message);
+API_PREFIX void borogove_chat_moderate(void *chat, void *message, const char *reason);
 
 /**
  * Add new reaction to a message in this Chat
@@ -326,11 +720,6 @@ API_PREFIX bool borogove_chat_notify_mention(void *chat);
  */
 API_PREFIX bool borogove_chat_notify_reply(void *chat);
 
-/**
- * An ID of the most recent message in this chat
- */
-API_PREFIX const char *borogove_chat_last_message_id(void *chat);
-
 /**
  * Get the URI image to represent this Chat, or null
  */
@@ -344,7 +733,7 @@ API_PREFIX const char *borogove_chat_get_placeholder(void *chat);
 /**
  * An ID of the last message displayed to the user
  */
-API_PREFIX const char *borogove_chat_read_up_to(void *chat);
+API_PREFIX void borogove_chat_read_up_to(void *chat, void (*handler) (void*, void *handler__context), void *handler__context);
 
 /**
  * The number of message that have not yet been displayed to the user
@@ -368,6 +757,11 @@ API_PREFIX void borogove_chat_set_display_name(void *chat, const char *displayNa
  */
 API_PREFIX const char *borogove_chat_get_display_name(void *chat);
 
+/**
+ * Tags on this Chat
+ */
+API_PREFIX size_t borogove_chat_get_tags(void *chat, const char ***outPtr);
+
 /**
  * Set if this chat is to be trusted with our presence, etc
  * 
@@ -438,6 +832,11 @@ API_PREFIX const char *borogove_chat_encryption_mode(void *chat);
  */
 API_PREFIX bool borogove_chat_can_send(void *chat);
 
+/**
+ * Can the user send messages to this chat?
+ */
+API_PREFIX bool borogove_chat_can_moderate(void *chat);
+
 /**
  * Invite another chat's participants to participate in this one
  */
@@ -458,271 +857,171 @@ API_PREFIX bool borogove_chat_is_app(void *chat);
  */
 API_PREFIX bool borogove_chat_has_commands(void *chat);
 
-API_PREFIX void borogove_chat_commands(void *chat, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
-
-/**
- * The Participant that originally invited us to this Chat, if we were invited
- */
-API_PREFIX void *borogove_chat_invited_by(void *chat);
-
-/**
- * The ID as set by the creator of this message
- */
-API_PREFIX const char *borogove_chat_message_local_id(void *chat_message);
-
-/**
- * The ID as set by the authoritative server
- */
-API_PREFIX const char *borogove_chat_message_server_id(void *chat_message);
-
-/**
- * The ID of the server which set the serverId
- */
-API_PREFIX const char *borogove_chat_message_server_id_by(void *chat_message);
-
-/**
- * The type of this message (Chat, Call, etc)
- */
-API_PREFIX enum borogove_message_type borogove_chat_message_type(void *chat_message);
-
-/**
- * The timestamp of this message, in format YYYY-MM-DDThh:mm:ss[.sss]Z
- */
-API_PREFIX const char *borogove_chat_message_timestamp(void *chat_message);
-
-/**
- * The ID of the sender of this message
- */
-API_PREFIX const char *borogove_chat_message_sender_id(void *chat_message);
-
-/**
- * Message this one is in reply to, or NULL
- */
-API_PREFIX void *borogove_chat_message_reply_to_message(void *chat_message);
-
-/**
- * ID of the thread this message is in, or NULL
- */
-API_PREFIX const char *borogove_chat_message_thread_id(void *chat_message);
-
-/**
- * Array of attachments to this message
- */
-API_PREFIX size_t borogove_chat_message_attachments(void *chat_message, void ***outPtr);
-
 /**
- * List of reactions to this message
+ * List commands exposed by this chat
  */
-API_PREFIX size_t borogove_chat_message_reaction_keys(void *chat_message, const char ***outPtr);
+API_PREFIX void borogove_chat_commands(void *chat, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
 
 /**
- * Details of a set of reaction to this message
+ * The Member that originally invited us to this Chat, if we were invited
  */
-API_PREFIX size_t borogove_chat_message_reaction_details(void *chat_message, const char *reactionKey, void ***outPtr);
+API_PREFIX void borogove_chat_invited_by(void *chat, void (*handler) (void*, void *handler__context), void *handler__context);
 
 /**
- * Body text of this message or NULL
+ * A unique id for this member
  */
-API_PREFIX const char *borogove_chat_message_text(void *chat_message);
+API_PREFIX const char *borogove_member_id(void *member);
 
 /**
- * Language code for the body text
+ * Display name to show for this member
  */
-API_PREFIX const char *borogove_chat_message_lang(void *chat_message);
+API_PREFIX const char *borogove_member_display_name(void *member);
 
 /**
- * Direction of this message
+ * Avatar URI for this member, or null when none is known
  */
-API_PREFIX enum borogove_message_direction borogove_chat_message_direction(void *chat_message);
+API_PREFIX const char *borogove_member_photo_uri(void *member);
 
 /**
- * Status of this message
+ * Fallback avatar URI to use when no photo is available
  */
-API_PREFIX enum borogove_message_status borogove_chat_message_status(void *chat_message);
+API_PREFIX const char *borogove_member_placeholder_uri(void *member);
 
 /**
- * Message to go along with the message status
+ * True when this member is the connected account
  */
-API_PREFIX const char *borogove_chat_message_status_text(void *chat_message);
+API_PREFIX bool borogove_member_is_self(void *member);
 
 /**
- * Array of past versions of this message, if it has been edited
+ * Chat metadata for this member when it is available as a direct Chat
  */
-API_PREFIX size_t borogove_chat_message_versions(void *chat_message, void ***outPtr);
+API_PREFIX void *borogove_member_chat(void *member);
 
 /**
- * Information about the encryption used by the sender of
- * this message.
+ * Roles this member has in the Chat
  */
-API_PREFIX void *borogove_chat_message_encryption(void *chat_message);
+API_PREFIX size_t borogove_member_roles(void *member, void ***outPtr);
 
-/**
- * Create a new ChatMessage in reply to this one
- */
-API_PREFIX void *borogove_chat_message_reply(void *chat_message);
+API_PREFIX enum borogove_show_presence borogove_member_show_presence(void *member);
 
 /**
- * Get HTML version of the message body
+ * Load the member's profile
  * 
- * WARNING: this is possibly untrusted HTML. You must parse or sanitize appropriately!
- * 
- * @param sender optionally specify the full details of the sender
- */
-API_PREFIX const char *borogove_chat_message_html(void *chat_message, void *sender);
-
-/**
- * The ID of the Chat this message is associated with
- */
-API_PREFIX const char *borogove_chat_message_chat_id(void *chat_message);
-
-/**
- * The ID of the account associated with this message
- */
-API_PREFIX const char *borogove_chat_message_account(void *chat_message);
-
-/**
- * Is this an incoming message?
- */
-API_PREFIX bool borogove_chat_message_is_incoming(void *chat_message);
-
-/**
- * The URI of an icon for the thread associated with this message, or NULL
- */
-API_PREFIX const char *borogove_chat_message_thread_icon(void *chat_message);
-
-/**
- * The last status of the call if this message is related to a call
+ * @param client connected client used to send the profile query
+ * @param handler which receives the member Profile
  */
-API_PREFIX const char *borogove_chat_message_call_status(void *chat_message);
+API_PREFIX void borogove_member_profile(void *member, void *client, void (*handler) (void*, void *handler__context), void *handler__context);
 
 /**
- * The session id of the call if this message is related to a call
+ * Load the member's status
+ * 
+ * @param client connected client used to send the profile query
+ * @param handler which receives the member Status
  */
-API_PREFIX const char *borogove_chat_message_call_sid(void *chat_message);
+API_PREFIX void borogove_member_status(void *member, void *client, void (*handler) (void*, void *handler__context), void *handler__context);
 
 /**
- * The duration of the call if this message is related to a call
+ * The ID of the Chat this search result represents
  */
-API_PREFIX const char *borogove_chat_message_call_duration(void *chat_message);
+API_PREFIX const char *borogove_available_chat_chat_id(void *available_chat);
 
 /**
- * Create a new attachment for adding to a ChatMessage
- * 
- * @param name Optional filename
- * @param mime MIME type
- * @param size Size in bytes
- * @param uri URI to attachment
+ * The display name of this search result
  */
-API_PREFIX void *borogove_chat_attachment_create(const char *name, const char *mime, int size, const char *uri);
+API_PREFIX const char *borogove_available_chat_display_name(void *available_chat);
 
 /**
- * Filename
+ * A human-readable note associated with this search result
  */
-API_PREFIX const char *borogove_chat_attachment_name(void *chat_attachment);
+API_PREFIX const char *borogove_available_chat_note(void *available_chat);
 
 /**
- * MIME Type
+ * Is this search result a channel?
  */
-API_PREFIX const char *borogove_chat_attachment_mime(void *chat_attachment);
+API_PREFIX bool borogove_available_chat_is_channel(void *available_chat);
 
 /**
- * Size in bytes
+ * Can audio calls be started after starting this Chat?
  */
-API_PREFIX int borogove_chat_attachment_size(void *chat_attachment);
+API_PREFIX bool borogove_available_chat_can_audio_call(void *available_chat);
 
 /**
- * URIs to data
+ * Can video calls be started after starting Chat?
  */
-API_PREFIX size_t borogove_chat_attachment_uris(void *chat_attachment, const char ***outPtr);
+API_PREFIX bool borogove_available_chat_can_video_call(void *available_chat);
 
 /**
- * Hashes of data
+ * Unique id for the role
  */
-API_PREFIX size_t borogove_chat_attachment_hashes(void *chat_attachment, void ***outPtr);
+API_PREFIX const char *borogove_role_id(void *role);
 
 /**
- * Create a new Hash from a hex string
- * 
- * @param algorithm name per https://xmpp.org/extensions/xep-0300.html
- * @param hash in hex format
- * @returns Hash or null on error
+ * Human readable name for the role
  */
-API_PREFIX void *borogove_hash_from_hex(const char *algorithm, const char *hash);
+API_PREFIX const char *borogove_role_title(void *role);
 
 /**
- * Create a new Hash from a ni:, cid: or similar URI
- * 
- * @param uri The URI
- * @returns Hash or null on error
+ * Suggested color to use when displaying this Role
  */
-API_PREFIX void *borogove_hash_from_uri(const char *uri);
+API_PREFIX const char *borogove_role_color(void *role);
 
 /**
- * Hash algorithm name
+ * All items in the profile
  */
-API_PREFIX const char *borogove_hash_algorithm(void *hash);
+API_PREFIX size_t borogove_profile_items(void *profile, void ***outPtr);
+
+API_PREFIX const char *borogove_profile_item_id(void *profile_item);
+
+API_PREFIX const char *borogove_profile_item_key(void *profile_item);
 
 /**
- * Represent this Hash as a URI
- * 
- * @returns URI as a string
+ * Get parameter items attached to this profile item.
  */
-API_PREFIX const char *borogove_hash_to_uri(void *hash);
+API_PREFIX size_t borogove_profile_item_parameters(void *profile_item, void ***outPtr);
 
 /**
- * Represent this Hash as a hex string
- * 
- * @returns hex string
+ * Get text values for this profile item.
  */
-API_PREFIX const char *borogove_hash_to_hex(void *hash);
+API_PREFIX size_t borogove_profile_item_text(void *profile_item, const char ***outPtr);
 
 /**
- * Represent this Hash as a Base64 string
- * 
- * @returns Base64-encoded string
+ * Get URI values for this profile item.
  */
-API_PREFIX const char *borogove_hash_to_base_64(void *hash);
+API_PREFIX size_t borogove_profile_item_uri(void *profile_item, const char ***outPtr);
 
 /**
- * Represent this Hash as a Base64url string
- * 
- * @returns Base64url-encoded string
+ * Get date values for this profile item.
  */
-API_PREFIX const char *borogove_hash_to_base_64_url(void *hash);
+API_PREFIX size_t borogove_profile_item_date(void *profile_item, const char ***outPtr);
 
 /**
- * Create a new Unicode reaction to send
- * 
- * @param unicode emoji of the reaction
- * @returns Reaction
+ * Get time values for this profile item.
  */
-API_PREFIX void *borogove_reaction_unicode(const char *unicode);
+API_PREFIX size_t borogove_profile_item_time(void *profile_item, const char ***outPtr);
 
 /**
- * ID of who sent this Reaction
+ * Get datetime values for this profile item.
  */
-API_PREFIX const char *borogove_reaction_sender_id(void *reaction);
+API_PREFIX size_t borogove_profile_item_datetime(void *profile_item, const char ***outPtr);
 
 /**
- * Date and time when this Reaction was sent,
- * in format YYYY-MM-DDThh:mm:ss[.sss]+00:00
+ * Get language-tag values for this profile item.
  */
-API_PREFIX const char *borogove_reaction_timestamp(void *reaction);
+API_PREFIX size_t borogove_profile_item_language_tag(void *profile_item, const char ***outPtr);
 
 /**
- * Key for grouping reactions
+ * Create a status value with emoji and text.
  */
-API_PREFIX const char *borogove_reaction_key(void *reaction);
-
-API_PREFIX enum borogove_encryption_status borogove_encryption_info_status(void *encryption_info);
-
-API_PREFIX const char *borogove_encryption_info_method(void *encryption_info);
+API_PREFIX void *borogove_status_new(const char *emoji, const char *text);
 
-API_PREFIX const char *borogove_encryption_info_method_name(void *encryption_info);
+API_PREFIX const char *borogove_status_emoji(void *status);
 
-API_PREFIX const char *borogove_encryption_info_reason(void *encryption_info);
+API_PREFIX const char *borogove_status_text(void *status);
 
-API_PREFIX const char *borogove_encryption_info_reason_text(void *encryption_info);
+/**
+ * Render this status as plain text.
+ */
+API_PREFIX const char *borogove_status_to_string(void *status);
 
 API_PREFIX const char *borogove_calls_media_stream_track_id(void *media_stream_track);
 
@@ -763,6 +1062,9 @@ API_PREFIX int borogove_calls_audio_format_clock_rate(void *audio_format);
 
 API_PREFIX int borogove_calls_audio_format_channels(void *audio_format);
 
+/**
+ * Human-readable name for this command
+ */
 API_PREFIX const char *borogove_command_name(void *command);
 
 /**
@@ -770,28 +1072,63 @@ API_PREFIX const char *borogove_command_name(void *command);
  */
 API_PREFIX void borogove_command_execute(void *command, void (*handler) (void*, void *handler__context), void *handler__context);
 
+/**
+ * Human-readable title for the current command session
+ */
 API_PREFIX const char *borogove_command_session_name(void *command_session);
 
+/**
+ * Current command execution status
+ */
 API_PREFIX const char *borogove_command_session_status(void *command_session);
 
+/**
+ * Actions the server currently allows for this session
+ */
 API_PREFIX size_t borogove_command_session_actions(void *command_session, void ***outPtr);
 
+/**
+ * Forms to display for the current session step
+ */
 API_PREFIX size_t borogove_command_session_forms(void *command_session, void ***outPtr);
 
+/**
+ * Continue this command session, optionally submitting form data
+ * 
+ * @param action requested action, or null for the default action
+ * @param data form values to submit for the selected form
+ * @param formIdx index of the form in `forms` to submit
+ * @param handler which receives the next command session state
+ */
 API_PREFIX void borogove_command_session_execute(void *command_session, const char *action, void *data, int formIdx, void (*handler) (void*, void *handler__context), void *handler__context);
 
 API_PREFIX const char *borogove_form_option_label(void *form_option);
 
 API_PREFIX const char *borogove_form_option_value(void *form_option);
 
+/**
+ * Plain text content for this item, or null when the item is not text-only
+ */
 API_PREFIX const char *borogove_form_item_text(void *form_item);
 
+/**
+ * Form field for this item, or null when the item is not a field
+ */
 API_PREFIX void *borogove_form_item_field(void *form_item);
 
+/**
+ * Nested section for this item, or null when the item is not a section
+ */
 API_PREFIX void *borogove_form_item_section(void *form_item);
 
+/**
+ * Optional status type associated with instructional text
+ */
 API_PREFIX const char *borogove_form_item_status(void *form_item);
 
+/**
+ * Column definitions when this item represents a result table
+ */
 API_PREFIX size_t borogove_form_item_table_header(void *form_item, void ***outPtr);
 
 API_PREFIX const char *borogove_form_field_name(void *form_field);
@@ -818,8 +1155,14 @@ API_PREFIX const char *borogove_form_field_range_max(void *form_field);
 
 API_PREFIX const char *borogove_form_field_regex(void *form_field);
 
+/**
+ * Title to show for this section, or null when it is untitled
+ */
 API_PREFIX const char *borogove_form_section_title(void *self);
 
+/**
+ * Renderable items contained in this section
+ */
 API_PREFIX size_t borogove_form_section_items(void *self, void ***outPtr);
 
 /**
@@ -842,41 +1185,150 @@ API_PREFIX const char *borogove_form_url(void *form);
  */
 API_PREFIX size_t borogove_form_items(void *form, void ***outPtr);
 
-API_PREFIX void borogove_persistence_last_id(void *self, const char *accountId, const char *chatId, void (*handler) (const char*, void *handler__context), void *handler__context);
+/**
+ * Get the last message in an account or chat that is is safe to sync forward from
+ * 
+ * @param accountId the account whose state should be queried
+ * @param chatId chat to inspect, or null for the account-wide sync point
+ * @param handler which receives the sync point or null
+ */
+API_PREFIX void borogove_persistence_sync_point(void *self, const char *accountId, const char *chatId, void (*handler) (void*, void *handler__context), void *handler__context);
 
+/**
+ * Persist the current metadata for a set of Chats
+ * 
+ * @param accountId the account that owns the Chats
+ * @param chats chats to write to storage
+ */
 API_PREFIX void borogove_persistence_store_chats(void *self, const char *accountId, void *const *chats, size_t chats__len);
 
+/**
+ * Persist one or more messages
+ * 
+ * @param accountId the account that owns the messages
+ * @param message messages to store
+ * @param handler which receives the stored message values
+ */
 API_PREFIX void borogove_persistence_store_messages(void *self, const char *accountId, void *const *message, size_t message__len, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
 
+/**
+ * Replace the stored record for a message
+ * 
+ * @param accountId the account that owns the message
+ * @param message message to write
+ */
 API_PREFIX void borogove_persistence_update_message(void *self, const char *accountId, void *message);
 
+/**
+ * Update delivery state for a locally-created message
+ * 
+ * @param accountId the account that owns the message
+ * @param localId local message ID to update
+ * @param status new delivery state
+ * @param statusText optional human-readable status detail
+ * @param handler which receives the updated message
+ */
 API_PREFIX void borogove_persistence_update_message_status(void *self, const char *accountId, const char *localId, enum borogove_message_status status, const char *statusText, void (*handler) (void*, void *handler__context), void *handler__context);
 
+/**
+ * Find a message by Chat ID and known IDs
+ * 
+ * @param accountId the account that owns the message
+ * @param chatId Chat containing the message
+ * @param serverId authoritative server-assigned ID, if known
+ * @param localId client-assigned ID, if known
+ * @param handler which receives the matching message or null
+ */
 API_PREFIX void borogove_persistence_get_message(void *self, const char *accountId, const char *chatId, const char *serverId, const char *localId, void (*handler) (void*, void *handler__context), void *handler__context);
 
-API_PREFIX void borogove_persistence_get_messages_before(void *self, const char *accountId, const char *chatId, const char *beforeId, const char *beforeTime, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
+/**
+ * Load messages older than a reference message
+ * 
+ * @param accountId the account to load messages for
+ * @param chatId Chat to query
+ * @param before return messages older than this message, or start from the newest when null
+ * @param handler which receives older messages
+ */
+API_PREFIX void borogove_persistence_get_messages_before(void *self, const char *accountId, const char *chatId, void *before, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
 
-API_PREFIX void borogove_persistence_get_messages_after(void *self, const char *accountId, const char *chatId, const char *afterId, const char *afterTime, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
+/**
+ * Load messages newer than a reference message
+ * 
+ * @param accountId the account to load messages for
+ * @param chatId Chat to query
+ * @param afterId return messages newer than this message, or start from the oldest when null
+ * @param handler which receives newer messages
+ */
+API_PREFIX void borogove_persistence_get_messages_after(void *self, const char *accountId, const char *chatId, void *afterId, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
 
-API_PREFIX void borogove_persistence_get_messages_around(void *self, const char *accountId, const char *chatId, const char *aroundId, const char *aroundTime, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
+/**
+ * Load messages surrounding a reference message
+ * 
+ * @param accountId the account to load messages for
+ * @param around message to center the result set around
+ * @param handler which receives nearby messages
+ */
+API_PREFIX void borogove_persistence_get_messages_around(void *self, const char *accountId, void *around, void (*handler) (void**, size_t, void *handler__context), void *handler__context);
 
+/**
+ * Check whether a media blob is already stored
+ * 
+ * @param hashAlgorithm hash algorithm for the content ID
+ * @param hash raw hash bytes
+ * @param handler which receives true when the media exists
+ */
 API_PREFIX void borogove_persistence_has_media(void *self, const char *hashAlgorithm, const unsigned char *hash, size_t hash__len, void (*handler) (bool, void *handler__context), void *handler__context);
 
+/**
+ * Store media bytes and any metadata needed to retrieve them later
+ * 
+ * @param mime MIME type of the media
+ * @param bytes raw media bytes
+ * @param handler which receives true when storage succeeded
+ */
 API_PREFIX void borogove_persistence_store_media(void *self, const char *mime, const unsigned char *bytes, size_t bytes__len, void (*handler) (bool, void *handler__context), void *handler__context);
 
-API_PREFIX void borogove_persistence_remove_media(void *self, const char *hashAlgorithm, const unsigned char *hash, size_t hash__len);
+/**
+ * Delete previously stored media
+ * 
+ * @param hashAlgorithm hash algorithm for the content ID
+ * @param hash raw hash bytes
+ * @param handler which receives true when removal succeeded
+ */
+API_PREFIX void borogove_persistence_remove_media(void *self, const char *hashAlgorithm, const unsigned char *hash, size_t hash__len, void (*handler) (bool, void *handler__context), void *handler__context);
 
-API_PREFIX void borogove_persistence_store_login(void *self, const char *login, const char *clientId, const char *displayName, const char *token);
+/**
+ * Store login-related state for an account
+ * 
+ * @param accountId the account to store login state for
+ * @param clientId negotiated client ID
+ * @param displayName last known display name
+ * @param token persisted token or null to clear it
+ * @param handler which receives true when store succeeded
+ */
+API_PREFIX void borogove_persistence_store_login(void *self, const char *accountId, const char *clientId, const char *displayName, const char *token, void (*handler) (bool, void *handler__context), void *handler__context);
 
-API_PREFIX void borogove_persistence_remove_account(void *self, const char *accountId, bool completely);
+/**
+ * Remove stored data for an account
+ * 
+ * @param accountId the account to remove
+ * @param completely true to delete all account data, false to keep recoverable state
+ * @param handler which receives true when removal succeeded
+ */
+API_PREFIX void borogove_persistence_remove_account(void *self, const char *accountId, bool completely, void (*handler) (bool, void *handler__context), void *handler__context);
 
+/**
+ * List all accounts present in storage
+ * 
+ * @param handler which receives stored account IDs
+ */
 API_PREFIX void borogove_persistence_list_accounts(void *self, void (*handler) (const char**, size_t, void *handler__context), void *handler__context);
 
 /**
  * Create a basic persistence layer based on sqlite
  * 
  * @param dbfile path to sqlite database
- * @params media a MediaStore to use for media
+ * @param media a MediaStore to use for media
  * @returns new persistence layer
  */
 API_PREFIX void *borogove_persistence_sqlite_new(const char *dbfile, void *media);
@@ -893,25 +1345,21 @@ API_PREFIX void *borogove_persistence_sqlite_new(const char *dbfile, void *media
 API_PREFIX void borogove_persistence_sqlite_get_message(void *sqlite, const char *accountId, const char *chatId, const char *serverId, const char *localId, void (*handler) (void*, void *handler__context), void *handler__context);
 
 /**
- * Remove an account from storage
- * 
- * @param accountId the account to remove
- * @param completely if message history, etc should be removed also
+ * Create a new empty form submission
  */
-API_PREFIX void borogove_persistence_sqlite_remove_account(void *sqlite, const char *accountId, bool completely);
+API_PREFIX void *borogove_form_submit_builder_new();
 
 /**
- * List all known accounts
+ * Add a submitted value for a field.
  * 
- * @param handler which receives array of account IDs
+ * @param k field name
+ * @param v value to submit for that field
  */
-API_PREFIX void borogove_persistence_sqlite_list_accounts(void *sqlite, void (*handler) (const char**, size_t, void *handler__context), void *handler__context);
-
-API_PREFIX void *borogove_form_submit_builder_new();
-
 API_PREFIX void borogove_form_submit_builder_add(void *form_submit_builder, const char *k, const char *v);
 
 /**
+ * Create a new message builder
+ * 
  * @returns a new blank ChatMessageBuilder
  */
 API_PREFIX void *borogove_chat_message_builder_new();
@@ -1002,22 +1450,12 @@ API_PREFIX void borogove_chat_message_builder_set_thread_id(void *chat_message_b
 API_PREFIX size_t borogove_chat_message_builder_attachments(void *chat_message_builder, void ***outPtr);
 
 /**
- * Body text of this message or NULL
- */
-API_PREFIX const char *borogove_chat_message_builder_text(void *chat_message_builder);
-
-/**
- * Body text of this message or NULL
- */
-API_PREFIX void borogove_chat_message_builder_set_text(void *chat_message_builder, const char *value);
-
-/**
- * Language code for the body text
+ * Language code for the body
  */
 API_PREFIX const char *borogove_chat_message_builder_lang(void *chat_message_builder);
 
 /**
- * Language code for the body text
+ * Language code for the body
  */
 API_PREFIX void borogove_chat_message_builder_set_lang(void *chat_message_builder, const char *value);
 
@@ -1073,6 +1511,16 @@ API_PREFIX void *borogove_chat_message_builder_encryption(void *chat_message_bui
  */
 API_PREFIX void borogove_chat_message_builder_set_encryption(void *chat_message_builder, void *value);
 
+/**
+ * Metadata about links associated with this message
+ */
+API_PREFIX void borogove_chat_message_builder_set_link_metadata(void *chat_message_builder, void *const *inPtr, size_t count);
+
+/**
+ * Metadata about links associated with this message
+ */
+API_PREFIX size_t borogove_chat_message_builder_link_metadata(void *chat_message_builder, void ***outPtr);
+
 /**
  * Add an attachment to this message
  * 
@@ -1081,18 +1529,28 @@ API_PREFIX void borogove_chat_message_builder_set_encryption(void *chat_message_
 API_PREFIX void borogove_chat_message_builder_add_attachment(void *chat_message_builder, void *attachment);
 
 /**
- * Set rich text using an HTML string
- * Also sets the plain text body appropriately
+ * Set body from Html
+ * 
+ * @param html rich text body to attach to the message
+ */
+API_PREFIX void borogove_chat_message_builder_set_body(void *chat_message_builder, void *html);
+
+/**
+ * Set subject of this message
  */
-API_PREFIX void borogove_chat_message_builder_set_html(void *chat_message_builder, const char *html);
+API_PREFIX void borogove_chat_message_builder_set_subject(void *chat_message_builder, const char *subject);
 
 /**
  * The ID of the Chat this message is associated with
+ * 
+ * @returns Chat ID for this message
  */
 API_PREFIX const char *borogove_chat_message_builder_chat_id(void *chat_message_builder);
 
 /**
  * The ID of the sender of this message
+ * 
+ * @returns sender ID for this message
  */
 API_PREFIX const char *borogove_chat_message_builder_get_sender_id(void *chat_message_builder);
 
@@ -1103,39 +1561,6 @@ API_PREFIX const char *borogove_chat_message_builder_get_sender_id(void *chat_me
  */
 API_PREFIX void *borogove_chat_message_builder_build(void *chat_message_builder);
 
-API_PREFIX const char *borogove_participant_display_name(void *participant);
-
-API_PREFIX const char *borogove_participant_photo_uri(void *participant);
-
-API_PREFIX const char *borogove_participant_placeholder_uri(void *participant);
-
-API_PREFIX bool borogove_participant_is_self(void *participant);
-
-API_PREFIX void borogove_participant_profile(void *participant, void *client, void (*handler) (void*, void *handler__context), void *handler__context);
-
-/**
- * All items in the profile
- */
-API_PREFIX size_t borogove_profile_items(void *profile, void ***outPtr);
-
-API_PREFIX const char *borogove_profile_item_id(void *profile_item);
-
-API_PREFIX const char *borogove_profile_item_key(void *profile_item);
-
-API_PREFIX size_t borogove_profile_item_parameters(void *profile_item, void ***outPtr);
-
-API_PREFIX size_t borogove_profile_item_text(void *profile_item, const char ***outPtr);
-
-API_PREFIX size_t borogove_profile_item_uri(void *profile_item, const char ***outPtr);
-
-API_PREFIX size_t borogove_profile_item_date(void *profile_item, const char ***outPtr);
-
-API_PREFIX size_t borogove_profile_item_time(void *profile_item, const char ***outPtr);
-
-API_PREFIX size_t borogove_profile_item_datetime(void *profile_item, const char ***outPtr);
-
-API_PREFIX size_t borogove_profile_item_language_tag(void *profile_item, const char ***outPtr);
-
 /**
  * Create a basic persistence layer that persists nothing
  * 
@@ -1212,14 +1637,6 @@ API_PREFIX const char *borogove_notification_lang(void *notification);
  */
 API_PREFIX const char *borogove_notification_timestamp(void *notification);
 
-/**
- * Remove an event listener of any type, no matter how it was added
- * or what event it is for.
- * 
- * @param token the token that was returned when the listener was added
- */
-API_PREFIX void borogove_event_emitter_remove_event_listener(void *event_emitter, borogove_event_handler_token token);
-
 /**
  * Create a new Client to connect to a particular account
  * 
@@ -1229,7 +1646,7 @@ API_PREFIX void borogove_event_emitter_remove_event_listener(void *event_emitter
 API_PREFIX void *borogove_client_new(const char *accountId, void *persistence);
 
 /**
- * Set to false to suppress sending available presence
+ * Set to false to suppress sending available presence after connect
  */
 API_PREFIX void borogove_client_set_send_available(void *client, bool value);
 
@@ -1281,6 +1698,15 @@ API_PREFIX const char *borogove_client_display_name(void *client);
  */
 API_PREFIX void borogove_client_set_profile(void *client, void *profile, bool publicAccess);
 
+/**
+ * Publish an account status/activity item.
+ * 
+ * @param status status payload to publish
+ * @param expires expiration in seconds for the published item
+ * @param publicAccess when true, make the item world-readable
+ */
+API_PREFIX void borogove_client_set_status(void *client, void *status, int expires, bool publicAccess);
+
 /**
  * Turn a file into a ChatAttachment for attaching to a ChatMessage
  * 
@@ -1298,9 +1724,14 @@ API_PREFIX size_t borogove_client_get_chats(void *client, void ***outPtr);
  * Search for chats the user can start or join
  * 
  * @param q the search query to use
- * @param callback takes two arguments, the query that was used and the array of results, and returns true if we should stop searching
+ * @returns an async iterator of AvailableChat matching the query
+ */
+API_PREFIX void *borogove_client_find_available_chats(void *client, const char *q);
+
+/**
+ * List of human-readable strings of things supports by findAvailableChats
  */
-API_PREFIX void borogove_client_find_available_chats(void *client, const char *q, bool (*callback) (const char*, void**, size_t, void*), void *callback__context);
+API_PREFIX void borogove_client_available_chat_sources(void *client, void (*handler) (const char**, size_t, void *handler__context), void *handler__context);
 
 /**
  * Start or join a chat from the search results
@@ -1453,30 +1884,10 @@ API_PREFIX borogove_event_handler_token borogove_client_add_call_track_listener(
 API_PREFIX void borogove_client_set_in_foreground(void *client);
 
 /**
- * Let the SDK know the UI is in the foreground
+ * Let the SDK know the UI is not in the foreground
  */
 API_PREFIX void borogove_client_set_not_in_foreground(void *client);
 
-/**
- * The ID of the Chat this search result represents
- */
-API_PREFIX const char *borogove_available_chat_chat_id(void *available_chat);
-
-/**
- * The display name of this search result
- */
-API_PREFIX const char *borogove_available_chat_display_name(void *available_chat);
-
-/**
- * A human-readable note associated with this search result
- */
-API_PREFIX const char *borogove_available_chat_note(void *available_chat);
-
-/**
- * Is this search result a channel?
- */
-API_PREFIX bool borogove_available_chat_is_channel(void *available_chat);
-
 API_PREFIX void *borogove_calls_media_stream_new();
 
 /**
@@ -1508,6 +1919,12 @@ API_PREFIX void *borogove_calls_session_dtmf(void *self);
 
 API_PREFIX void borogove_calls_initiated_session_supply_media(void *initiated_session, void *const *streams, size_t streams__len);
 
+/**
+ * Create an attachment source from a local file path and MIME type.
+ * 
+ * @param path path to the local file
+ * @param mime MIME type to advertise for the upload
+ */
 API_PREFIX void *borogove_attachment_source_new(const char *path, const char *mime);
 
 API_PREFIX const char *borogove_attachment_source_path(void *attachment_source);
@@ -1518,6 +1935,9 @@ API_PREFIX const char *borogove_attachment_source_name(void *attachment_source);
 
 API_PREFIX int borogove_attachment_source_size(void *attachment_source);
 
+/**
+ * Create a mutable builder from an existing profile.
+ */
 API_PREFIX void *borogove_profile_builder_new(void *profile);
 
 /**
@@ -1543,10 +1963,36 @@ API_PREFIX void borogove_profile_builder_move(void *profile_builder, const char
  */
 API_PREFIX void borogove_profile_builder_remove(void *profile_builder, const char *id);
 
+/**
+ * Build an immutable Profile from the current builder state.
+ */
 API_PREFIX void *borogove_profile_builder_build(void *profile_builder);
 
+/**
+ * The query that this iterator is returning results for
+ */
+API_PREFIX const char *borogove_available_chat_iterator_q(void *available_chat_iterator);
+
+/**
+ * Get the next AvailableChat from this iterator.
+ * 
+ * @param handler which receives the next result, or null when exhausted
+ */
+API_PREFIX void borogove_available_chat_iterator_next(void *available_chat_iterator, void (*handler) (void*, void *handler__context), void *handler__context);
+
+/**
+ * Subject of this Channel
+ */
+API_PREFIX const char *borogove_channel_subject(void *channel);
+
+/**
+ * Description of this Channel
+ */
 API_PREFIX const char *borogove_channel_description(void *channel);
 
+/**
+ * Whether this channel is members-only/private.
+ */
 API_PREFIX bool borogove_channel_is_private(void *channel);
 
 /**
@@ -1565,8 +2011,14 @@ API_PREFIX void borogove_calls_dtmf_sender_insert_dtmf(void *dtmf_sender, const
  */
 API_PREFIX void *borogove_custom_emoji_reaction_custom(const char *text, const char *uri);
 
+/**
+ * URI of the custom emoji image
+ */
 API_PREFIX const char *borogove_custom_emoji_reaction_uri(void *custom_emoji_reaction);
 
+/**
+ * Generate a deterministic SVG identicon as a data URI.
+ */
 API_PREFIX const char *borogove_identicon_svg(const char *source);
 
 /**
diff --git a/Sources/c_borogove/src/CrashHandler.mm b/Sources/c_borogove/src/CrashHandler.mm
deleted file mode 100644
index f5c5855..0000000
--- a/Sources/c_borogove/src/CrashHandler.mm
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "CrashHandler.h"
-#import <Foundation/Foundation.h>
-
-namespace AppCore {
-
-    void TerminateWithMessage(const std::string& message) {
-        // Convert the C++ std::string to an Objective-C NSString
-        NSString *nsMessage = [NSString stringWithUTF8String:message.c_str()];
-        
-        // Create an NSException. 
-        // The 'name' categorizes it, and the 'reason' is what TestFlight will show.
-        NSException *exception = [NSException exceptionWithName:@"FatalCppError"
-                                                         reason:nsMessage
-                                                       userInfo:nil];
-        
-        // Throw the exception to terminate the app
-        [exception raise];
-    }
-
-}
diff --git a/Sources/c_borogove/src/HaxeCBridge.cpp b/Sources/c_borogove/src/HaxeCBridge.cpp
index 88a31a3..6f52787 100644
--- a/Sources/c_borogove/src/HaxeCBridge.cpp
+++ b/Sources/c_borogove/src/HaxeCBridge.cpp
@@ -58,187 +58,187 @@
 #include <sys/thread/_Thread/Thread_Impl_.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2107_mainThreadInit,"HaxeCBridge","mainThreadInit",0x6f09ae5b,"HaxeCBridge.mainThreadInit","HaxeCBridge.hx",2107,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2122_mainThreadRun,"HaxeCBridge","mainThreadRun",0xa4afa660,"HaxeCBridge.mainThreadRun","HaxeCBridge.hx",2122,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2212_retainHaxeArray,"HaxeCBridge","retainHaxeArray",0x7373bc46,"HaxeCBridge.retainHaxeArray","HaxeCBridge.hx",2212,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2221_retainHaxeObject,"HaxeCBridge","retainHaxeObject",0xef200772,"HaxeCBridge.retainHaxeObject","HaxeCBridge.hx",2221,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2231_retainHaxeString,"HaxeCBridge","retainHaxeString",0xeb10b184,"HaxeCBridge.retainHaxeString","HaxeCBridge.hx",2231,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2238_retainPtr,"HaxeCBridge","retainPtr",0x2c61e661,"HaxeCBridge.retainPtr","HaxeCBridge.hx",2238,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2251_releaseHaxePtr,"HaxeCBridge","releaseHaxePtr",0x5df2fc29,"HaxeCBridge.releaseHaxePtr","HaxeCBridge.hx",2251,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2264_isMainThread,"HaxeCBridge","isMainThread",0x6f71c035,"HaxeCBridge.isMainThread","HaxeCBridge.hx",2264,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2269_endMainThread,"HaxeCBridge","endMainThread",0x0d9deed6,"HaxeCBridge.endMainThread","HaxeCBridge.hx",2269,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2254_mainThreadInit,"HaxeCBridge","mainThreadInit",0x6f09ae5b,"HaxeCBridge.mainThreadInit","HaxeCBridge.hx",2254,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2269_mainThreadRun,"HaxeCBridge","mainThreadRun",0xa4afa660,"HaxeCBridge.mainThreadRun","HaxeCBridge.hx",2269,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2359_retainHaxeArray,"HaxeCBridge","retainHaxeArray",0x7373bc46,"HaxeCBridge.retainHaxeArray","HaxeCBridge.hx",2359,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2368_retainHaxeObject,"HaxeCBridge","retainHaxeObject",0xef200772,"HaxeCBridge.retainHaxeObject","HaxeCBridge.hx",2368,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2378_retainHaxeString,"HaxeCBridge","retainHaxeString",0xeb10b184,"HaxeCBridge.retainHaxeString","HaxeCBridge.hx",2378,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2385_retainPtr,"HaxeCBridge","retainPtr",0x2c61e661,"HaxeCBridge.retainPtr","HaxeCBridge.hx",2385,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2398_releaseHaxePtr,"HaxeCBridge","releaseHaxePtr",0x5df2fc29,"HaxeCBridge.releaseHaxePtr","HaxeCBridge.hx",2398,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2411_isMainThread,"HaxeCBridge","isMainThread",0x6f71c035,"HaxeCBridge.isMainThread","HaxeCBridge.hx",2411,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_74d844958d4dcf5a_2416_endMainThread,"HaxeCBridge","endMainThread",0x0d9deed6,"HaxeCBridge.endMainThread","HaxeCBridge.hx",2416,0xa18550d8)
 
 void HaxeCBridge::mainThreadInit(::cpp::Function< bool  () > isMainThreadCb){
-            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2107_mainThreadInit)
-HXLINE(2113)		::_HaxeCBridge::Internal_obj::isMainThreadCb = isMainThreadCb;
-HXLINE(2114)		::_HaxeCBridge::Internal_obj::mainThreadWaitLock = ::sys::thread::_Thread::Thread_Impl__obj::get_events(::sys::thread::_Thread::HaxeThread_obj::current())->waitLock;
+            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2254_mainThreadInit)
+HXLINE(2260)		::_HaxeCBridge::Internal_obj::isMainThreadCb = isMainThreadCb;
+HXLINE(2261)		::_HaxeCBridge::Internal_obj::mainThreadWaitLock = ::sys::thread::_Thread::Thread_Impl__obj::get_events(::sys::thread::_Thread::HaxeThread_obj::current())->waitLock;
             	}
 
 
 void HaxeCBridge::mainThreadRun(::cpp::Function< void  () > processNativeCalls,::cpp::Function< bool  () > hasPendingNativeCalls,::cpp::Function< void  (const char*) > onUnhandledException){
-            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2122_mainThreadRun)
-HXLINE(2123)		try {
+            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2269_mainThreadRun)
+HXLINE(2270)		try {
             			HX_STACK_CATCHABLE( ::Dynamic, 0);
             		} catch( ::Dynamic _hx_e) {
             			if (_hx_e.IsClass<  ::Dynamic >() ){
             				HX_STACK_BEGIN_CATCH
             				 ::Dynamic _g = _hx_e;
-HXLINE(2125)				{
-HXLINE(2125)					null();
+HXLINE(2272)				{
+HXLINE(2272)					null();
             				}
-HXDLIN(2125)				 ::haxe::Exception _g1 = ::haxe::Exception_obj::caught(_g);
-HXDLIN(2125)				{
-HXLINE(2126)					 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN(2126)					::Array< ::Dynamic> tmp = _g1->get_stack();
-HXDLIN(2126)					::String _hx_tmp1;
-HXDLIN(2126)					if (::hx::IsNull( tmp )) {
-HXLINE(2126)						_hx_tmp1 = HX_("null",87,9e,0e,49);
+HXDLIN(2272)				 ::haxe::Exception _g1 = ::haxe::Exception_obj::caught(_g);
+HXDLIN(2272)				{
+HXLINE(2273)					 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN(2273)					::Array< ::Dynamic> tmp = _g1->get_stack();
+HXDLIN(2273)					::String _hx_tmp1;
+HXDLIN(2273)					if (::hx::IsNull( tmp )) {
+HXLINE(2273)						_hx_tmp1 = HX_("null",87,9e,0e,49);
             					}
             					else {
-HXLINE(2126)						_hx_tmp1 = ::haxe::_CallStack::CallStack_Impl__obj::toString(tmp);
+HXLINE(2273)						_hx_tmp1 = ::haxe::_CallStack::CallStack_Impl__obj::toString(tmp);
             					}
-HXDLIN(2126)					_hx_tmp(_g1, ::Dynamic(::hx::Anon_obj::Create(5)
+HXDLIN(2273)					_hx_tmp(_g1, ::Dynamic(::hx::Anon_obj::Create(5)
             						->setFixed(0,HX_("className",a3,92,3d,dc),HX_("HaxeCBridge",a6,7d,e3,bb))
             						->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,_hx_tmp1))
             						->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("mainThreadRun",28,d7,3c,8e))
             						->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("HaxeCBridge.hx",d8,50,85,a1))
-            						->setFixed(4,HX_("lineNumber",dd,81,22,76),2126)));
-HXLINE(2127)					onUnhandledException(::Std_obj::string(_g1).utf8_str());
+            						->setFixed(4,HX_("lineNumber",dd,81,22,76),2273)));
+HXLINE(2274)					onUnhandledException(::Std_obj::string(_g1).utf8_str());
             				}
             			}
             			else {
             				HX_STACK_DO_THROW(_hx_e);
             			}
             		}
-HXLINE(2134)		 ::sys::thread::EventLoop eventLoop = ::sys::thread::_Thread::Thread_Impl__obj::get_events(::sys::thread::_Thread::HaxeThread_obj::current());
-HXLINE(2136)		::Array< ::Dynamic> recycleRegular = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(2137)		::Array< ::Dynamic> recycleOneTimers = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(2138)		while(::_HaxeCBridge::Internal_obj::mainThreadLoopActive){
-HXLINE(2139)			try {
+HXLINE(2281)		 ::sys::thread::EventLoop eventLoop = ::sys::thread::_Thread::Thread_Impl__obj::get_events(::sys::thread::_Thread::HaxeThread_obj::current());
+HXLINE(2283)		::Array< ::Dynamic> recycleRegular = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(2284)		::Array< ::Dynamic> recycleOneTimers = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(2285)		while(::_HaxeCBridge::Internal_obj::mainThreadLoopActive){
+HXLINE(2286)			try {
             				HX_STACK_CATCHABLE( ::Dynamic, 0);
-HXLINE(2141)				processNativeCalls();
-HXLINE(2144)				Float now = ::Sys_obj::time();
-HXDLIN(2144)				int eventsToRunIdx = 0;
-HXDLIN(2144)				Float nextEventAt = ( (Float)(-1) );
-HXDLIN(2144)				eventLoop->mutex->acquire();
-HXDLIN(2144)				while(eventLoop->waitLock->wait(((Float)0.0))){
+HXLINE(2288)				processNativeCalls();
+HXLINE(2291)				Float now = ::Sys_obj::time();
+HXDLIN(2291)				int eventsToRunIdx = 0;
+HXDLIN(2291)				Float nextEventAt = ( (Float)(-1) );
+HXDLIN(2291)				eventLoop->mutex->acquire();
+HXDLIN(2291)				while(eventLoop->waitLock->wait(((Float)0.0))){
             				}
-HXLINE(2144)				 ::sys::thread::_EventLoop::RegularEvent current = eventLoop->regularEvents;
-HXDLIN(2144)				while(::hx::IsNotNull( current )){
-HXLINE(2144)					if ((current->nextRunTime <= now)) {
-HXLINE(2144)						eventsToRunIdx = (eventsToRunIdx + 1);
-HXDLIN(2144)						recycleRegular[(eventsToRunIdx - 1)] = current;
-HXDLIN(2144)						 ::sys::thread::_EventLoop::RegularEvent current1 = current;
-HXDLIN(2144)						current1->nextRunTime = (current1->nextRunTime + current->interval);
+HXLINE(2291)				 ::sys::thread::_EventLoop::RegularEvent current = eventLoop->regularEvents;
+HXDLIN(2291)				while(::hx::IsNotNull( current )){
+HXLINE(2291)					if ((current->nextRunTime <= now)) {
+HXLINE(2291)						eventsToRunIdx = (eventsToRunIdx + 1);
+HXDLIN(2291)						recycleRegular[(eventsToRunIdx - 1)] = current;
+HXDLIN(2291)						 ::sys::thread::_EventLoop::RegularEvent current1 = current;
+HXDLIN(2291)						current1->nextRunTime = (current1->nextRunTime + current->interval);
 HXLINE( 220)						nextEventAt = ( (Float)(-2) );
             					}
             					else {
-HXLINE(2144)						bool _hx_tmp2;
-HXDLIN(2144)						if ((nextEventAt != -1)) {
-HXLINE(2144)							_hx_tmp2 = (current->nextRunTime < nextEventAt);
+HXLINE(2291)						bool _hx_tmp2;
+HXDLIN(2291)						if ((nextEventAt != -1)) {
+HXLINE(2291)							_hx_tmp2 = (current->nextRunTime < nextEventAt);
             						}
             						else {
-HXLINE(2144)							_hx_tmp2 = true;
+HXLINE(2291)							_hx_tmp2 = true;
             						}
-HXDLIN(2144)						if (_hx_tmp2) {
+HXDLIN(2291)						if (_hx_tmp2) {
 HXLINE( 222)							nextEventAt = current->nextRunTime;
             						}
             					}
 HXLINE( 224)					current = current->next;
             				}
-HXLINE(2144)				eventLoop->mutex->release();
-HXDLIN(2144)				int _g2 = 0;
-HXDLIN(2144)				int _g3 = eventsToRunIdx;
-HXDLIN(2144)				while((_g2 < _g3)){
-HXLINE(2144)					_g2 = (_g2 + 1);
-HXDLIN(2144)					int i = (_g2 - 1);
-HXDLIN(2144)					if (!(recycleRegular->__get(i).StaticCast<  ::sys::thread::_EventLoop::RegularEvent >()->cancelled)) {
-HXLINE(2144)						recycleRegular->__get(i).StaticCast<  ::sys::thread::_EventLoop::RegularEvent >()->run();
+HXLINE(2291)				eventLoop->mutex->release();
+HXDLIN(2291)				int _g2 = 0;
+HXDLIN(2291)				int _g3 = eventsToRunIdx;
+HXDLIN(2291)				while((_g2 < _g3)){
+HXLINE(2291)					_g2 = (_g2 + 1);
+HXDLIN(2291)					int i = (_g2 - 1);
+HXDLIN(2291)					if (!(recycleRegular->__get(i).StaticCast<  ::sys::thread::_EventLoop::RegularEvent >()->cancelled)) {
+HXLINE(2291)						recycleRegular->__get(i).StaticCast<  ::sys::thread::_EventLoop::RegularEvent >()->run();
             					}
-HXDLIN(2144)					recycleRegular[i] = null();
+HXDLIN(2291)					recycleRegular[i] = null();
             				}
 HXLINE( 234)				eventsToRunIdx = 0;
-HXLINE(2144)				eventLoop->mutex->acquire();
-HXDLIN(2144)				::Array< ::Dynamic> _this = eventLoop->oneTimeEvents;
-HXDLIN(2144)				int _g_current = 0;
-HXDLIN(2144)				while((_g_current < _this->length)){
-HXLINE(2144)					 ::Dynamic _g_value = _this->__get(_g_current);
-HXDLIN(2144)					_g_current = (_g_current + 1);
-HXDLIN(2144)					if (::hx::IsNull( _g_value )) {
-HXLINE(2144)						goto _hx_goto_5;
+HXLINE(2291)				eventLoop->mutex->acquire();
+HXDLIN(2291)				::Array< ::Dynamic> _this = eventLoop->oneTimeEvents;
+HXDLIN(2291)				int _g_current = 0;
+HXDLIN(2291)				while((_g_current < _this->length)){
+HXLINE(2291)					 ::Dynamic _g_value = _this->__get(_g_current);
+HXDLIN(2291)					_g_current = (_g_current + 1);
+HXDLIN(2291)					if (::hx::IsNull( _g_value )) {
+HXLINE(2291)						goto _hx_goto_5;
             					}
             					else {
-HXLINE(2144)						eventsToRunIdx = (eventsToRunIdx + 1);
-HXDLIN(2144)						recycleOneTimers[(eventsToRunIdx - 1)] = _g_value;
-HXDLIN(2144)						eventLoop->oneTimeEvents[(_g_current - 1)] = null();
+HXLINE(2291)						eventsToRunIdx = (eventsToRunIdx + 1);
+HXDLIN(2291)						recycleOneTimers[(eventsToRunIdx - 1)] = _g_value;
+HXDLIN(2291)						eventLoop->oneTimeEvents[(_g_current - 1)] = null();
             					}
             				}
             				_hx_goto_5:;
-HXDLIN(2144)				eventLoop->oneTimeEventsIdx = 0;
-HXDLIN(2144)				bool hasPromisedEvents = (eventLoop->promisedEventsCount > 0);
-HXDLIN(2144)				eventLoop->mutex->release();
-HXDLIN(2144)				int _g4 = 0;
-HXDLIN(2144)				int _g5 = eventsToRunIdx;
-HXDLIN(2144)				while((_g4 < _g5)){
-HXLINE(2144)					_g4 = (_g4 + 1);
-HXDLIN(2144)					int i1 = (_g4 - 1);
-HXDLIN(2144)					recycleOneTimers->__get(i1)();
-HXDLIN(2144)					recycleOneTimers[i1] = null();
+HXDLIN(2291)				eventLoop->oneTimeEventsIdx = 0;
+HXDLIN(2291)				bool hasPromisedEvents = (eventLoop->promisedEventsCount > 0);
+HXDLIN(2291)				eventLoop->mutex->release();
+HXDLIN(2291)				int _g4 = 0;
+HXDLIN(2291)				int _g5 = eventsToRunIdx;
+HXDLIN(2291)				while((_g4 < _g5)){
+HXLINE(2291)					_g4 = (_g4 + 1);
+HXDLIN(2291)					int i1 = (_g4 - 1);
+HXDLIN(2291)					recycleOneTimers->__get(i1)();
+HXDLIN(2291)					recycleOneTimers[i1] = null();
             				}
-HXDLIN(2144)				if (eventLoop->isMainThread) {
-HXLINE(2144)					Float next = ::haxe::MainLoop_obj::tick();
-HXDLIN(2144)					if (::haxe::MainLoop_obj::hasEvents()) {
-HXLINE(2144)						eventsToRunIdx = (eventsToRunIdx + 1);
-HXDLIN(2144)						if ((nextEventAt > next)) {
+HXDLIN(2291)				if (eventLoop->isMainThread) {
+HXLINE(2291)					Float next = ::haxe::MainLoop_obj::tick();
+HXDLIN(2291)					if (::haxe::MainLoop_obj::hasEvents()) {
+HXLINE(2291)						eventsToRunIdx = (eventsToRunIdx + 1);
+HXDLIN(2291)						if ((nextEventAt > next)) {
 HXLINE( 264)							nextEventAt = next;
             						}
             					}
             				}
-HXLINE(2144)				if ((eventsToRunIdx > 0)) {
+HXLINE(2291)				if ((eventsToRunIdx > 0)) {
 HXLINE( 270)					nextEventAt = ( (Float)(-2) );
             				}
-HXLINE(2144)				Float eventTickInfo_nextEventAt = nextEventAt;
-HXLINE(2145)				if (hasPendingNativeCalls()) {
-HXLINE(2146)					continue;
+HXLINE(2291)				Float eventTickInfo_nextEventAt = nextEventAt;
+HXLINE(2292)				if (hasPendingNativeCalls()) {
+HXLINE(2293)					continue;
             				}
-HXLINE(2148)				Float _hx_switch_0 = eventTickInfo_nextEventAt;
+HXLINE(2295)				Float _hx_switch_0 = eventTickInfo_nextEventAt;
             				if (  (_hx_switch_0==( (Float)(-2) )) ){
-HXLINE(2149)					goto _hx_goto_7;
+HXLINE(2296)					goto _hx_goto_7;
             				}
             				if (  (_hx_switch_0==( (Float)(-1) )) ){
-HXLINE(2151)					bool _hx_tmp3;
-HXDLIN(2151)					if (::_HaxeCBridge::Internal_obj::mainThreadEndIfNoPending) {
-HXLINE(2151)						_hx_tmp3 = !(hasPromisedEvents);
+HXLINE(2298)					bool _hx_tmp3;
+HXDLIN(2298)					if (::_HaxeCBridge::Internal_obj::mainThreadEndIfNoPending) {
+HXLINE(2298)						_hx_tmp3 = !(hasPromisedEvents);
             					}
             					else {
-HXLINE(2151)						_hx_tmp3 = false;
+HXLINE(2298)						_hx_tmp3 = false;
             					}
-HXDLIN(2151)					if (_hx_tmp3) {
-HXLINE(2153)						goto _hx_goto_1;
+HXDLIN(2298)					if (_hx_tmp3) {
+HXLINE(2300)						goto _hx_goto_1;
             					}
-HXLINE(2155)					::_HaxeCBridge::Internal_obj::mainThreadWaitLock->wait(null());
-HXLINE(2150)					goto _hx_goto_7;
+HXLINE(2302)					::_HaxeCBridge::Internal_obj::mainThreadWaitLock->wait(null());
+HXLINE(2297)					goto _hx_goto_7;
             				}
             				/* default */{
-HXLINE(2157)					Float timeout = (eventTickInfo_nextEventAt - ::Sys_obj::time());
-HXLINE(2158)					::_HaxeCBridge::Internal_obj::mainThreadWaitLock->wait(::Math_obj::max(( (Float)(0) ),timeout));
+HXLINE(2304)					Float timeout = (eventTickInfo_nextEventAt - ::Sys_obj::time());
+HXLINE(2305)					::_HaxeCBridge::Internal_obj::mainThreadWaitLock->wait(::Math_obj::max(( (Float)(0) ),timeout));
             				}
             				_hx_goto_7:;
             			} catch( ::Dynamic _hx_e) {
             				if (_hx_e.IsClass<  ::Dynamic >() ){
             					HX_STACK_BEGIN_CATCH
             					 ::Dynamic _g6 = _hx_e;
-HXLINE(2160)					{
-HXLINE(2160)						null();
+HXLINE(2307)					{
+HXLINE(2307)						null();
             					}
-HXLINE(2161)					::String s;
-HXDLIN(2161)					if (::hx::IsNull( _g6 )) {
-HXLINE(2161)						s = HX_("null",87,9e,0e,49);
+HXLINE(2308)					::String s;
+HXDLIN(2308)					if (::hx::IsNull( _g6 )) {
+HXLINE(2308)						s = HX_("null",87,9e,0e,49);
             					}
             					else {
-HXLINE(2161)						s = ::Std_obj::string(_g6);
+HXLINE(2308)						s = ::Std_obj::string(_g6);
             					}
-HXDLIN(2161)					onUnhandledException(s.utf8_str());
+HXDLIN(2308)					onUnhandledException(s.utf8_str());
             				}
             				else {
             					HX_STACK_DO_THROW(_hx_e);
@@ -246,123 +246,123 @@ HXDLIN(2161)					onUnhandledException(s.utf8_str());
             			}
             		}
             		_hx_goto_1:;
-HXLINE(2166)		__hxcpp_collect(true);
+HXLINE(2313)		__hxcpp_collect(true);
             	}
 
 
 void** HaxeCBridge::retainHaxeArray(::cpp::VirtualArray haxeArray){
-            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2212_retainHaxeArray)
-HXLINE(2215)		void** ptr = (void**)haxeArray->getBase();
-HXLINE(2216)		::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXLINE(2217)		{
-HXLINE(2217)			 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN(2217)			if (::hx::IsNull( store )) {
-HXLINE(2217)				store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2359_retainHaxeArray)
+HXLINE(2362)		void** ptr = (void**)haxeArray->getBase();
+HXLINE(2363)		::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXLINE(2364)		{
+HXLINE(2364)			 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN(2364)			if (::hx::IsNull( store )) {
+HXLINE(2364)				store =  ::Dynamic(::hx::Anon_obj::Create(2)
             					->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             					->setFixed(1,HX_("value",71,7f,b8,31),haxeArray));
-HXDLIN(2217)				::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN(2364)				::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             			}
             			else {
-HXLINE(2217)				::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE(2364)				::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             			}
             		}
-HXLINE(2218)		return ptr;
+HXLINE(2365)		return ptr;
             	}
 
 
 void* HaxeCBridge::retainHaxeObject( ::Dynamic haxeObject){
-            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2221_retainHaxeObject)
-HXLINE(2223)		void* ptr = haxeObject.mPtr;
-HXLINE(2226)		::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXLINE(2227)		{
-HXLINE(2227)			 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN(2227)			if (::hx::IsNull( store )) {
-HXLINE(2227)				store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2368_retainHaxeObject)
+HXLINE(2370)		void* ptr = haxeObject.mPtr;
+HXLINE(2373)		::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXLINE(2374)		{
+HXLINE(2374)			 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN(2374)			if (::hx::IsNull( store )) {
+HXLINE(2374)				store =  ::Dynamic(::hx::Anon_obj::Create(2)
             					->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             					->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN(2227)				::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN(2374)				::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             			}
             			else {
-HXLINE(2227)				::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE(2374)				::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             			}
             		}
-HXLINE(2228)		return ptr;
+HXLINE(2375)		return ptr;
             	}
 
 
 const char* HaxeCBridge::retainHaxeString(::String haxeString){
-            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2231_retainHaxeString)
-HXLINE(2232)		const char* cStrPtr = haxeString.utf8_str();
-HXLINE(2233)		::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXLINE(2234)		{
-HXLINE(2234)			 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN(2234)			if (::hx::IsNull( store )) {
-HXLINE(2234)				store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2378_retainHaxeString)
+HXLINE(2379)		const char* cStrPtr = haxeString.utf8_str();
+HXLINE(2380)		::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
+HXLINE(2381)		{
+HXLINE(2381)			 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN(2381)			if (::hx::IsNull( store )) {
+HXLINE(2381)				store =  ::Dynamic(::hx::Anon_obj::Create(2)
             					->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             					->setFixed(1,HX_("value",71,7f,b8,31),haxeString));
-HXDLIN(2234)				::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN(2381)				::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             			}
             			else {
-HXLINE(2234)				::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE(2381)				::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             			}
             		}
-HXLINE(2235)		return cStrPtr;
+HXLINE(2382)		return cStrPtr;
             	}
 
 
 void HaxeCBridge::retainPtr(::cpp::Int64 ptrInt64, ::Dynamic haxeObject){
-            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2238_retainPtr)
-HXLINE(2240)		 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXLINE(2241)		if (::hx::IsNull( store )) {
-HXLINE(2243)			store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2385_retainPtr)
+HXLINE(2387)		 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXLINE(2388)		if (::hx::IsNull( store )) {
+HXLINE(2390)			store =  ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             				->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXLINE(2244)			::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXLINE(2391)			::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             		}
             		else {
-HXLINE(2247)			::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE(2394)			::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             		}
             	}
 
 
 void HaxeCBridge::releaseHaxePtr(void * haxePtr){
-            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2251_releaseHaxePtr)
-HXLINE(2252)		::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(haxePtr);
-HXLINE(2253)		 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXLINE(2254)		bool _hx_tmp;
-HXDLIN(2254)		if (::hx::IsNotNull( store )) {
-HXLINE(2254)			_hx_tmp = ::hx::IsGreater( store->__Field(HX_("refCount",7c,2e,66,86),::hx::paccDynamic),0 );
+            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2398_releaseHaxePtr)
+HXLINE(2399)		::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(haxePtr);
+HXLINE(2400)		 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXLINE(2401)		bool _hx_tmp;
+HXDLIN(2401)		if (::hx::IsNotNull( store )) {
+HXLINE(2401)			_hx_tmp = ::hx::IsGreater( store->__Field(HX_("refCount",7c,2e,66,86),::hx::paccDynamic),0 );
             		}
             		else {
-HXLINE(2254)			_hx_tmp = false;
+HXLINE(2401)			_hx_tmp = false;
             		}
-HXDLIN(2254)		if (_hx_tmp) {
-HXLINE(2255)			::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))--;
-HXLINE(2256)			if (::hx::IsLessEq( store->__Field(HX_("refCount",7c,2e,66,86),::hx::paccDynamic),0 )) {
-HXLINE(2257)				::_HaxeCBridge::Internal_obj::gcRetainMap->remove(ptrInt64);
+HXDLIN(2401)		if (_hx_tmp) {
+HXLINE(2402)			::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))--;
+HXLINE(2403)			if (::hx::IsLessEq( store->__Field(HX_("refCount",7c,2e,66,86),::hx::paccDynamic),0 )) {
+HXLINE(2404)				::_HaxeCBridge::Internal_obj::gcRetainMap->remove(ptrInt64);
             			}
             		}
             	}
 
 
 bool HaxeCBridge::isMainThread(){
-            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2264_isMainThread)
-HXDLIN(2264)		return ::_HaxeCBridge::Internal_obj::isMainThreadCb();
+            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2411_isMainThread)
+HXDLIN(2411)		return ::_HaxeCBridge::Internal_obj::isMainThreadCb();
             	}
 
 
 void HaxeCBridge::endMainThread(bool waitOnScheduledEvents){
-            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2269_endMainThread)
-HXLINE(2270)		::_HaxeCBridge::Internal_obj::mainThreadEndIfNoPending = true;
-HXLINE(2271)		bool _hx_tmp;
-HXDLIN(2271)		if (::_HaxeCBridge::Internal_obj::mainThreadLoopActive) {
-HXLINE(2271)			_hx_tmp = waitOnScheduledEvents;
+            	HX_STACKFRAME(&_hx_pos_74d844958d4dcf5a_2416_endMainThread)
+HXLINE(2417)		::_HaxeCBridge::Internal_obj::mainThreadEndIfNoPending = true;
+HXLINE(2418)		bool _hx_tmp;
+HXDLIN(2418)		if (::_HaxeCBridge::Internal_obj::mainThreadLoopActive) {
+HXLINE(2418)			_hx_tmp = waitOnScheduledEvents;
             		}
             		else {
-HXLINE(2271)			_hx_tmp = false;
+HXLINE(2418)			_hx_tmp = false;
             		}
-HXDLIN(2271)		::_HaxeCBridge::Internal_obj::mainThreadLoopActive = _hx_tmp;
-HXLINE(2272)		 ::__hxcpp_lock_release(::_HaxeCBridge::Internal_obj::mainThreadWaitLock->l);
+HXDLIN(2418)		::_HaxeCBridge::Internal_obj::mainThreadLoopActive = _hx_tmp;
+HXLINE(2419)		 ::__hxcpp_lock_release(::_HaxeCBridge::Internal_obj::mainThreadWaitLock->l);
             	}
 
 
diff --git a/Sources/c_borogove/src/Lambda.cpp b/Sources/c_borogove/src/Lambda.cpp
index 1b6299e..b6a0ec5 100644
--- a/Sources/c_borogove/src/Lambda.cpp
+++ b/Sources/c_borogove/src/Lambda.cpp
@@ -7,7 +7,6 @@
 
 HX_LOCAL_STACK_FRAME(_hx_pos_a2b9229e56451ffa_45_array,"Lambda","array",0x9c8b0512,"Lambda.array","/usr/local/lib/haxe/std/Lambda.hx",45,0xf61dfe9a)
 HX_LOCAL_STACK_FRAME(_hx_pos_a2b9229e56451ffa_125_exists,"Lambda","exists",0x65091043,"Lambda.exists","/usr/local/lib/haxe/std/Lambda.hx",125,0xf61dfe9a)
-HX_LOCAL_STACK_FRAME(_hx_pos_a2b9229e56451ffa_168_filter,"Lambda","filter",0x2a5e121f,"Lambda.filter","/usr/local/lib/haxe/std/Lambda.hx",168,0xf61dfe9a)
 HX_LOCAL_STACK_FRAME(_hx_pos_a2b9229e56451ffa_183_fold,"Lambda","fold",0x9b8816a8,"Lambda.fold","/usr/local/lib/haxe/std/Lambda.hx",183,0xf61dfe9a)
 HX_LOCAL_STACK_FRAME(_hx_pos_a2b9229e56451ffa_225_empty,"Lambda","empty",0xe6d5d206,"Lambda.empty","/usr/local/lib/haxe/std/Lambda.hx",225,0xf61dfe9a)
 HX_LOCAL_STACK_FRAME(_hx_pos_a2b9229e56451ffa_255_find,"Lambda","find",0x9b838ae0,"Lambda.find","/usr/local/lib/haxe/std/Lambda.hx",255,0xf61dfe9a)
@@ -61,24 +60,6 @@ HXLINE( 129)		return false;
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC2(Lambda_obj,exists,return )
 
-::cpp::VirtualArray Lambda_obj::filter( ::Dynamic it, ::Dynamic f){
-            	HX_STACKFRAME(&_hx_pos_a2b9229e56451ffa_168_filter)
-HXDLIN( 168)		::cpp::VirtualArray _g = ::cpp::VirtualArray_obj::__new(0);
-HXDLIN( 168)		{
-HXDLIN( 168)			 ::Dynamic x = it->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 168)			while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXDLIN( 168)				 ::Dynamic x1 = x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
-HXDLIN( 168)				if (( (bool)(f(x1)) )) {
-HXDLIN( 168)					_g->push(x1);
-            				}
-            			}
-            		}
-HXDLIN( 168)		return _g;
-            	}
-
-
-STATIC_HX_DEFINE_DYNAMIC_FUNC2(Lambda_obj,filter,return )
-
  ::Dynamic Lambda_obj::fold( ::Dynamic it, ::Dynamic f, ::Dynamic first){
             	HX_STACKFRAME(&_hx_pos_a2b9229e56451ffa_183_fold)
 HXLINE( 184)		{
@@ -154,7 +135,6 @@ bool Lambda_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::Pr
 		break;
 	case 6:
 		if (HX_FIELD_EQ(inName,"exists") ) { outValue = exists_dyn(); return true; }
-		if (HX_FIELD_EQ(inName,"filter") ) { outValue = filter_dyn(); return true; }
 		break;
 	case 9:
 		if (HX_FIELD_EQ(inName,"findIndex") ) { outValue = findIndex_dyn(); return true; }
@@ -172,7 +152,6 @@ static ::hx::StaticInfo *Lambda_obj_sStaticStorageInfo = 0;
 static ::String Lambda_obj_sStaticFields[] = {
 	HX_("array",99,6d,8f,25),
 	HX_("exists",dc,1d,e0,bf),
-	HX_("filter",b8,1f,35,85),
 	HX_("fold",01,5c,c0,43),
 	HX_("empty",8d,3a,da,6f),
 	HX_("find",39,d0,bb,43),
diff --git a/Sources/c_borogove/src/Reflect.cpp b/Sources/c_borogove/src/Reflect.cpp
index 1c4eb10..415f3f9 100644
--- a/Sources/c_borogove/src/Reflect.cpp
+++ b/Sources/c_borogove/src/Reflect.cpp
@@ -16,7 +16,6 @@ HX_LOCAL_STACK_FRAME(_hx_pos_7b3988d9963d5a21_81_compare,"Reflect","compare",0xa
 HX_LOCAL_STACK_FRAME(_hx_pos_7b3988d9963d5a21_84_compareMethods,"Reflect","compareMethods",0x8b8ddd7e,"Reflect.compareMethods","/usr/local/lib/haxe/std/cpp/_std/Reflect.hx",84,0x1c2422c3)
 HX_LOCAL_STACK_FRAME(_hx_pos_7b3988d9963d5a21_93_isObject,"Reflect","isObject",0xd04960ba,"Reflect.isObject","/usr/local/lib/haxe/std/cpp/_std/Reflect.hx",93,0x1c2422c3)
 HX_LOCAL_STACK_FRAME(_hx_pos_7b3988d9963d5a21_102_isEnumValue,"Reflect","isEnumValue",0x97884d95,"Reflect.isEnumValue","/usr/local/lib/haxe/std/cpp/_std/Reflect.hx",102,0x1c2422c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_7b3988d9963d5a21_106_deleteField,"Reflect","deleteField",0x21895ebe,"Reflect.deleteField","/usr/local/lib/haxe/std/cpp/_std/Reflect.hx",106,0x1c2422c3)
 HX_LOCAL_STACK_FRAME(_hx_pos_7b3988d9963d5a21_112_copy,"Reflect","copy",0x47e2b5a6,"Reflect.copy","/usr/local/lib/haxe/std/cpp/_std/Reflect.hx",112,0x1c2422c3)
 
 void Reflect_obj::__construct() { }
@@ -151,17 +150,6 @@ HXDLIN( 102)		return (::hx::IsNotNull( v ) && ::hx::IsEq( v->__GetType(),7 ));
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Reflect_obj,isEnumValue,return )
 
-bool Reflect_obj::deleteField( ::Dynamic o,::String field){
-            	HX_STACKFRAME(&_hx_pos_7b3988d9963d5a21_106_deleteField)
-HXLINE( 107)		if (::hx::IsNull( o )) {
-HXLINE( 108)			return false;
-            		}
-HXLINE( 109)		return  ::__hxcpp_anon_remove(o,field);
-            	}
-
-
-STATIC_HX_DEFINE_DYNAMIC_FUNC2(Reflect_obj,deleteField,return )
-
  ::Dynamic Reflect_obj::copy( ::Dynamic o){
             	HX_STACKFRAME(&_hx_pos_7b3988d9963d5a21_112_copy)
 HXLINE( 113)		if (::hx::IsNull( o )) {
@@ -221,7 +209,6 @@ bool Reflect_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::P
 	case 11:
 		if (HX_FIELD_EQ(inName,"getProperty") ) { outValue = getProperty_dyn(); return true; }
 		if (HX_FIELD_EQ(inName,"isEnumValue") ) { outValue = isEnumValue_dyn(); return true; }
-		if (HX_FIELD_EQ(inName,"deleteField") ) { outValue = deleteField_dyn(); return true; }
 		break;
 	case 14:
 		if (HX_FIELD_EQ(inName,"compareMethods") ) { outValue = compareMethods_dyn(); return true; }
@@ -248,7 +235,6 @@ static ::String Reflect_obj_sStaticFields[] = {
 	HX_("compareMethods",4d,ac,7b,37),
 	HX_("isObject",49,1a,a9,6d),
 	HX_("isEnumValue",66,b7,87,06),
-	HX_("deleteField",8f,c8,88,90),
 	HX_("copy",b5,bb,c4,41),
 	::String(null())
 };
diff --git a/Sources/c_borogove/src/Sys.cpp b/Sources/c_borogove/src/Sys.cpp
index bf25796..39a5076 100644
--- a/Sources/c_borogove/src/Sys.cpp
+++ b/Sources/c_borogove/src/Sys.cpp
@@ -5,6 +5,7 @@
 #include <Sys.h>
 #endif
 
+HX_LOCAL_STACK_FRAME(_hx_pos_39f5eab4124248fe_59_getEnv,"Sys","getEnv",0xd9e05658,"Sys.getEnv","/usr/local/lib/haxe/std/cpp/_std/Sys.hx",59,0xd23c22f3)
 HX_LOCAL_STACK_FRAME(_hx_pos_39f5eab4124248fe_79_getCwd,"Sys","getCwd",0xd9ded99b,"Sys.getCwd","/usr/local/lib/haxe/std/cpp/_std/Sys.hx",79,0xd23c22f3)
 HX_LOCAL_STACK_FRAME(_hx_pos_39f5eab4124248fe_87_systemName,"Sys","systemName",0xbea5b6bb,"Sys.systemName","/usr/local/lib/haxe/std/cpp/_std/Sys.hx",87,0xd23c22f3)
 HX_LOCAL_STACK_FRAME(_hx_pos_39f5eab4124248fe_113_time,"Sys","time",0xf7761b2e,"Sys.time","/usr/local/lib/haxe/std/cpp/_std/Sys.hx",113,0xd23c22f3)
@@ -26,6 +27,18 @@ bool Sys_obj::_hx_isInstanceOf(int inClassId) {
 	return inClassId==(int)0x00000001 || inClassId==(int)0x7ee3a981;
 }
 
+::String Sys_obj::getEnv(::String s){
+            	HX_STACKFRAME(&_hx_pos_39f5eab4124248fe_59_getEnv)
+HXLINE(  60)		::String v = _hx_std_get_env(s);
+HXLINE(  61)		if (::hx::IsNull( v )) {
+HXLINE(  62)			return null();
+            		}
+HXLINE(  63)		return v;
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Sys_obj,getEnv,return )
+
 ::String Sys_obj::getCwd(){
             	HX_STACKFRAME(&_hx_pos_39f5eab4124248fe_79_getCwd)
 HXDLIN(  79)		return _hx_std_get_cwd();
@@ -62,6 +75,7 @@ bool Sys_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::Prope
 		if (HX_FIELD_EQ(inName,"time") ) { outValue = time_dyn(); return true; }
 		break;
 	case 6:
+		if (HX_FIELD_EQ(inName,"getEnv") ) { outValue = getEnv_dyn(); return true; }
 		if (HX_FIELD_EQ(inName,"getCwd") ) { outValue = getCwd_dyn(); return true; }
 		break;
 	case 10:
@@ -78,6 +92,7 @@ static ::hx::StaticInfo *Sys_obj_sStaticStorageInfo = 0;
 ::hx::Class Sys_obj::__mClass;
 
 static ::String Sys_obj_sStaticFields[] = {
+	HX_("getEnv",f7,3c,1c,a3),
 	HX_("getCwd",3a,c0,1a,a3),
 	HX_("systemName",da,d8,82,f7),
 	HX_("time",0d,cc,fc,4c),
diff --git a/Sources/c_borogove/src/Xml.cpp b/Sources/c_borogove/src/Xml.cpp
index e9a0b7e..c31d092 100644
--- a/Sources/c_borogove/src/Xml.cpp
+++ b/Sources/c_borogove/src/Xml.cpp
@@ -21,7 +21,6 @@ HX_DEFINE_STACK_FRAME(_hx_pos_7e4d842269e66db1_397_new,"Xml","new",0x2e496e29,"X
 HX_LOCAL_STACK_FRAME(_hx_pos_7e4d842269e66db1_244_get,"Xml","get",0x2e441e5f,"Xml.get","/usr/local/lib/haxe/std/Xml.hx",244,0x5c1024e4)
 HX_LOCAL_STACK_FRAME(_hx_pos_7e4d842269e66db1_255_set,"Xml","set",0x2e4d396b,"Xml.set","/usr/local/lib/haxe/std/Xml.hx",255,0x5c1024e4)
 HX_LOCAL_STACK_FRAME(_hx_pos_7e4d842269e66db1_287_attributes,"Xml","attributes",0x1ab5462e,"Xml.attributes","/usr/local/lib/haxe/std/Xml.hx",287,0x5c1024e4)
-HX_LOCAL_STACK_FRAME(_hx_pos_7e4d842269e66db1_337_firstElement,"Xml","firstElement",0xc103a583,"Xml.firstElement","/usr/local/lib/haxe/std/Xml.hx",337,0x5c1024e4)
 HX_LOCAL_STACK_FRAME(_hx_pos_7e4d842269e66db1_394_toString,"Xml","toString",0xb7bb9a43,"Xml.toString","/usr/local/lib/haxe/std/Xml.hx",394,0x5c1024e4)
 HX_LOCAL_STACK_FRAME(_hx_pos_7e4d842269e66db1_182_createElement,"Xml","createElement",0x97359a29,"Xml.createElement","/usr/local/lib/haxe/std/Xml.hx",182,0x5c1024e4)
 HX_LOCAL_STACK_FRAME(_hx_pos_7e4d842269e66db1_86_boot,"Xml","boot",0x4a0ff649,"Xml.boot","/usr/local/lib/haxe/std/Xml.hx",86,0x5c1024e4)
@@ -82,35 +81,6 @@ HXLINE( 291)		return this->attributeMap->keys();
 
 HX_DEFINE_DYNAMIC_FUNC0(Xml_obj,attributes,return )
 
- ::Xml Xml_obj::firstElement(){
-            	HX_STACKFRAME(&_hx_pos_7e4d842269e66db1_337_firstElement)
-HXLINE( 338)		bool _hx_tmp;
-HXDLIN( 338)		if ((this->nodeType != ::Xml_obj::Document)) {
-HXLINE( 338)			_hx_tmp = (this->nodeType != ::Xml_obj::Element);
-            		}
-            		else {
-HXLINE( 338)			_hx_tmp = false;
-            		}
-HXDLIN( 338)		if (_hx_tmp) {
-HXLINE( 338)			HX_STACK_DO_THROW((HX_("Bad node type, expected Element or Document but found ",a0,d6,ba,79) + ::_Xml::XmlType_Impl__obj::toString(this->nodeType)));
-            		}
-HXLINE( 339)		{
-HXLINE( 339)			int _g = 0;
-HXDLIN( 339)			::Array< ::Dynamic> _g1 = this->children;
-HXDLIN( 339)			while((_g < _g1->length)){
-HXLINE( 339)				 ::Xml child = _g1->__get(_g).StaticCast<  ::Xml >();
-HXDLIN( 339)				_g = (_g + 1);
-HXLINE( 340)				if ((child->nodeType == ::Xml_obj::Element)) {
-HXLINE( 341)					return child;
-            				}
-            			}
-            		}
-HXLINE( 344)		return null();
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC0(Xml_obj,firstElement,return )
-
 ::String Xml_obj::toString(){
             	HX_STACKFRAME(&_hx_pos_7e4d842269e66db1_394_toString)
 HXDLIN( 394)		return ::haxe::xml::Printer_obj::print(::hx::ObjectPtr<OBJ_>(this),null());
@@ -197,7 +167,6 @@ void Xml_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 12:
 		if (HX_FIELD_EQ(inName,"attributeMap") ) { return ::hx::Val( attributeMap ); }
-		if (HX_FIELD_EQ(inName,"firstElement") ) { return ::hx::Val( firstElement_dyn() ); }
 	}
 	return super::__Field(inName,inCallProp);
 }
@@ -281,7 +250,6 @@ static ::String Xml_obj_sMemberFields[] = {
 	HX_("get",96,80,4e,00),
 	HX_("set",a2,9b,57,00),
 	HX_("attributes",d7,a8,71,97),
-	HX_("firstElement",6c,c4,9c,2f),
 	HX_("toString",ac,d0,6e,38),
 	::String(null()) };
 
diff --git a/Sources/c_borogove/src/_FractionalIndexing/FractionalIndexing_Fields_.cpp b/Sources/c_borogove/src/_FractionalIndexing/FractionalIndexing_Fields_.cpp
new file mode 100644
index 0000000..91bb1cb
--- /dev/null
+++ b/Sources/c_borogove/src/_FractionalIndexing/FractionalIndexing_Fields_.cpp
@@ -0,0 +1,479 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_95f339a1d026d52c
+#define INCLUDED_95f339a1d026d52c
+#include "hxMath.h"
+#endif
+#ifndef INCLUDED_StringTools
+#include <StringTools.h>
+#endif
+#ifndef INCLUDED__FractionalIndexing_FractionalIndexing_Fields_
+#include <_FractionalIndexing/FractionalIndexing_Fields_.h>
+#endif
+
+HX_LOCAL_STACK_FRAME(_hx_pos_5a1b628005ac96b3_6_midpoint,"_FractionalIndexing.FractionalIndexing_Fields_","midpoint",0xf4b9a000,"_FractionalIndexing.FractionalIndexing_Fields_.midpoint","FractionalIndexing.hx",6,0x12400921)
+HX_LOCAL_STACK_FRAME(_hx_pos_5a1b628005ac96b3_39_validateInteger,"_FractionalIndexing.FractionalIndexing_Fields_","validateInteger",0x052ea090,"_FractionalIndexing.FractionalIndexing_Fields_.validateInteger","FractionalIndexing.hx",39,0x12400921)
+HX_LOCAL_STACK_FRAME(_hx_pos_5a1b628005ac96b3_45_getIntegerLength,"_FractionalIndexing.FractionalIndexing_Fields_","getIntegerLength",0xfaccd506,"_FractionalIndexing.FractionalIndexing_Fields_.getIntegerLength","FractionalIndexing.hx",45,0x12400921)
+HX_LOCAL_STACK_FRAME(_hx_pos_5a1b628005ac96b3_54_getIntegerPart,"_FractionalIndexing.FractionalIndexing_Fields_","getIntegerPart",0x6e50dc13,"_FractionalIndexing.FractionalIndexing_Fields_.getIntegerPart","FractionalIndexing.hx",54,0x12400921)
+HX_LOCAL_STACK_FRAME(_hx_pos_5a1b628005ac96b3_62_validateOrderKey,"_FractionalIndexing.FractionalIndexing_Fields_","validateOrderKey",0x229e329f,"_FractionalIndexing.FractionalIndexing_Fields_.validateOrderKey","FractionalIndexing.hx",62,0x12400921)
+HX_LOCAL_STACK_FRAME(_hx_pos_5a1b628005ac96b3_73_incrementInteger,"_FractionalIndexing.FractionalIndexing_Fields_","incrementInteger",0xd9581587,"_FractionalIndexing.FractionalIndexing_Fields_.incrementInteger","FractionalIndexing.hx",73,0x12400921)
+HX_LOCAL_STACK_FRAME(_hx_pos_5a1b628005ac96b3_111_decrementInteger,"_FractionalIndexing.FractionalIndexing_Fields_","decrementInteger",0xb88eaa23,"_FractionalIndexing.FractionalIndexing_Fields_.decrementInteger","FractionalIndexing.hx",111,0x12400921)
+HX_LOCAL_STACK_FRAME(_hx_pos_5a1b628005ac96b3_149_between,"_FractionalIndexing.FractionalIndexing_Fields_","between",0x97d23690,"_FractionalIndexing.FractionalIndexing_Fields_.between","FractionalIndexing.hx",149,0x12400921)
+namespace _FractionalIndexing{
+
+void FractionalIndexing_Fields__obj::__construct() { }
+
+Dynamic FractionalIndexing_Fields__obj::__CreateEmpty() { return new FractionalIndexing_Fields__obj; }
+
+void *FractionalIndexing_Fields__obj::_hx_vtable = 0;
+
+Dynamic FractionalIndexing_Fields__obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< FractionalIndexing_Fields__obj > _hx_result = new FractionalIndexing_Fields__obj();
+	_hx_result->__construct();
+	return _hx_result;
+}
+
+bool FractionalIndexing_Fields__obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x73ff5bc0;
+}
+
+::String FractionalIndexing_Fields__obj::midpoint(::String a,::String b,::String digits){
+            	HX_STACKFRAME(&_hx_pos_5a1b628005ac96b3_6_midpoint)
+HXLINE(   7)		::String zero = digits.charAt(0);
+HXLINE(   8)		bool _hx_tmp;
+HXDLIN(   8)		if (::hx::IsNotNull( b )) {
+HXLINE(   8)			_hx_tmp = (a >= b);
+            		}
+            		else {
+HXLINE(   8)			_hx_tmp = false;
+            		}
+HXDLIN(   8)		if (_hx_tmp) {
+HXLINE(   9)			HX_STACK_DO_THROW(((a + HX_(" >= ",e1,14,56,15)) + b));
+            		}
+HXLINE(  11)		bool _hx_tmp1;
+HXDLIN(  11)		if ((a.charAt((a.length - 1)) != zero)) {
+HXLINE(  11)			if (::hx::IsNotNull( b )) {
+HXLINE(  11)				_hx_tmp1 = (b.charAt((b.length - 1)) == zero);
+            			}
+            			else {
+HXLINE(  11)				_hx_tmp1 = false;
+            			}
+            		}
+            		else {
+HXLINE(  11)			_hx_tmp1 = true;
+            		}
+HXDLIN(  11)		if (_hx_tmp1) {
+HXLINE(  12)			HX_STACK_DO_THROW(HX_("trailing zero",ec,68,91,d3));
+            		}
+HXLINE(  14)		if (::hx::IsNotNull( b )) {
+HXLINE(  15)			int n = 0;
+HXLINE(  16)			while(true){
+HXLINE(  16)				::String _hx_tmp2;
+HXDLIN(  16)				if ((n < a.length)) {
+HXLINE(  16)					_hx_tmp2 = a.charAt(n);
+            				}
+            				else {
+HXLINE(  16)					_hx_tmp2 = zero;
+            				}
+HXDLIN(  16)				if (!((_hx_tmp2 == b.charAt(n)))) {
+HXLINE(  16)					goto _hx_goto_0;
+            				}
+HXLINE(  17)				n = (n + 1);
+            			}
+            			_hx_goto_0:;
+HXLINE(  19)			if ((n > 0)) {
+HXLINE(  20)				::String _hx_tmp3 = b.substring(0,n);
+HXDLIN(  20)				::String _hx_tmp4 = a.substring(n,null());
+HXDLIN(  20)				return (_hx_tmp3 + ::_FractionalIndexing::FractionalIndexing_Fields__obj::midpoint(_hx_tmp4,b.substring(n,null()),digits));
+            			}
+            		}
+HXLINE(  24)		int digitA;
+HXDLIN(  24)		if ((a.length > 0)) {
+HXLINE(  24)			digitA = digits.indexOf(a.charAt(0),null());
+            		}
+            		else {
+HXLINE(  24)			digitA = 0;
+            		}
+HXLINE(  25)		int digitB;
+HXDLIN(  25)		if (::hx::IsNotNull( b )) {
+HXLINE(  25)			digitB = digits.indexOf(b.charAt(0),null());
+            		}
+            		else {
+HXLINE(  25)			digitB = digits.length;
+            		}
+HXLINE(  26)		if (((digitB - digitA) > 1)) {
+HXLINE(  28)			return digits.charAt(::Math_obj::round((((Float)0.5) * ( (Float)((digitA + digitB)) ))));
+            		}
+            		else {
+HXLINE(  30)			bool _hx_tmp5;
+HXDLIN(  30)			if (::hx::IsNotNull( b )) {
+HXLINE(  30)				_hx_tmp5 = (b.length > 1);
+            			}
+            			else {
+HXLINE(  30)				_hx_tmp5 = false;
+            			}
+HXDLIN(  30)			if (_hx_tmp5) {
+HXLINE(  31)				return b.substring(0,1);
+            			}
+            			else {
+HXLINE(  33)				::String _hx_tmp6 = digits.charAt(digitA);
+HXDLIN(  33)				return (_hx_tmp6 + ::_FractionalIndexing::FractionalIndexing_Fields__obj::midpoint(a.substring(1,null()),null(),digits));
+            			}
+            		}
+HXLINE(  26)		return null();
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC3(FractionalIndexing_Fields__obj,midpoint,return )
+
+void FractionalIndexing_Fields__obj::validateInteger(::String i){
+            	HX_STACKFRAME(&_hx_pos_5a1b628005ac96b3_39_validateInteger)
+HXDLIN(  39)		int i1 = i.length;
+HXDLIN(  39)		if ((i1 != ::_FractionalIndexing::FractionalIndexing_Fields__obj::getIntegerLength(i.charAt(0)))) {
+HXLINE(  40)			HX_STACK_DO_THROW((HX_("invalid integer part of order key: ",ec,3d,95,d8) + i));
+            		}
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(FractionalIndexing_Fields__obj,validateInteger,(void))
+
+int FractionalIndexing_Fields__obj::getIntegerLength(::String head){
+            	HX_STACKFRAME(&_hx_pos_5a1b628005ac96b3_45_getIntegerLength)
+HXDLIN(  45)		bool _hx_tmp;
+HXDLIN(  45)		if ((head >= HX_("a",61,00,00,00))) {
+HXDLIN(  45)			_hx_tmp = (head <= HX_("z",7a,00,00,00));
+            		}
+            		else {
+HXDLIN(  45)			_hx_tmp = false;
+            		}
+HXDLIN(  45)		if (_hx_tmp) {
+HXLINE(  46)			 ::Dynamic _hx_tmp1 = head.charCodeAt(0);
+HXDLIN(  46)			return ((( (int)(_hx_tmp1) ) - ( (int)(HX_("a",61,00,00,00).charCodeAt(0)) )) + 2);
+            		}
+            		else {
+HXLINE(  47)			bool _hx_tmp2;
+HXDLIN(  47)			if ((head >= HX_("A",41,00,00,00))) {
+HXLINE(  47)				_hx_tmp2 = (head <= HX_("Z",5a,00,00,00));
+            			}
+            			else {
+HXLINE(  47)				_hx_tmp2 = false;
+            			}
+HXDLIN(  47)			if (_hx_tmp2) {
+HXLINE(  48)				 ::Dynamic _hx_tmp3 = HX_("Z",5a,00,00,00).charCodeAt(0);
+HXDLIN(  48)				return ((( (int)(_hx_tmp3) ) - ( (int)(head.charCodeAt(0)) )) + 2);
+            			}
+            			else {
+HXLINE(  50)				HX_STACK_DO_THROW((HX_("invalid order key head: ",c2,19,af,55) + head));
+            			}
+            		}
+HXLINE(  45)		return 0;
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(FractionalIndexing_Fields__obj,getIntegerLength,return )
+
+::String FractionalIndexing_Fields__obj::getIntegerPart(::String key){
+            	HX_STACKFRAME(&_hx_pos_5a1b628005ac96b3_54_getIntegerPart)
+HXLINE(  55)		int integerPartLength = ::_FractionalIndexing::FractionalIndexing_Fields__obj::getIntegerLength(key.charAt(0));
+HXLINE(  56)		if ((integerPartLength > key.length)) {
+HXLINE(  57)			HX_STACK_DO_THROW((HX_("invalid order key: ",4a,a2,14,a1) + key));
+            		}
+HXLINE(  59)		return key.substring(0,integerPartLength);
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(FractionalIndexing_Fields__obj,getIntegerPart,return )
+
+void FractionalIndexing_Fields__obj::validateOrderKey(::String key,::String digits){
+            	HX_STACKFRAME(&_hx_pos_5a1b628005ac96b3_62_validateOrderKey)
+HXLINE(  63)		if ((key == (HX_("A",41,00,00,00) + ::StringTools_obj::lpad(HX_("",00,00,00,00),digits.charAt(0),26)))) {
+HXLINE(  64)			HX_STACK_DO_THROW((HX_("invalid order key: ",4a,a2,14,a1) + key));
+            		}
+HXLINE(  67)		::String f = key.substring(::_FractionalIndexing::FractionalIndexing_Fields__obj::getIntegerPart(key).length,null());
+HXLINE(  68)		::String _hx_tmp = f.charAt((f.length - 1));
+HXDLIN(  68)		if ((_hx_tmp == digits.charAt(0))) {
+HXLINE(  69)			HX_STACK_DO_THROW((HX_("invalid order key: ",4a,a2,14,a1) + key));
+            		}
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC2(FractionalIndexing_Fields__obj,validateOrderKey,(void))
+
+::String FractionalIndexing_Fields__obj::incrementInteger(::String x,::String digits){
+            	HX_STACKFRAME(&_hx_pos_5a1b628005ac96b3_73_incrementInteger)
+HXLINE(  74)		::_FractionalIndexing::FractionalIndexing_Fields__obj::validateInteger(x);
+HXLINE(  75)		::String head = x.charAt(0);
+HXLINE(  76)		::Array< ::String > digs = x.substring(1,null()).split(HX_("",00,00,00,00));
+HXLINE(  78)		bool _hx_tmp;
+HXDLIN(  78)		if ((digs->length == 1)) {
+HXLINE(  78)			_hx_tmp = (digs->__get(0) == HX_("",00,00,00,00));
+            		}
+            		else {
+HXLINE(  78)			_hx_tmp = false;
+            		}
+HXDLIN(  78)		if (_hx_tmp) {
+HXLINE(  78)			digs = ::Array_obj< ::String >::__new(0);
+            		}
+HXLINE(  80)		bool carry = true;
+HXLINE(  81)		int i = (digs->length - 1);
+HXLINE(  82)		while(true){
+HXLINE(  82)			bool _hx_tmp1;
+HXDLIN(  82)			if (carry) {
+HXLINE(  82)				_hx_tmp1 = (i >= 0);
+            			}
+            			else {
+HXLINE(  82)				_hx_tmp1 = false;
+            			}
+HXDLIN(  82)			if (!(_hx_tmp1)) {
+HXLINE(  82)				goto _hx_goto_6;
+            			}
+HXLINE(  83)			int d = (digits.indexOf(digs->__get(i),null()) + 1);
+HXLINE(  84)			if ((d == digits.length)) {
+HXLINE(  85)				digs[i] = digits.charAt(0);
+            			}
+            			else {
+HXLINE(  87)				digs[i] = digits.charAt(d);
+HXLINE(  88)				carry = false;
+            			}
+HXLINE(  90)			i = (i - 1);
+            		}
+            		_hx_goto_6:;
+HXLINE(  92)		if (carry) {
+HXLINE(  93)			if ((head == HX_("Z",5a,00,00,00))) {
+HXLINE(  94)				return (HX_("a",61,00,00,00) + digits.charAt(0));
+            			}
+HXLINE(  96)			if ((head == HX_("z",7a,00,00,00))) {
+HXLINE(  97)				return null();
+            			}
+HXLINE(  99)			::String h = ::String::fromCharCode((head.charCodeAt(0) + 1));
+HXLINE( 100)			if ((h > HX_("a",61,00,00,00))) {
+HXLINE( 101)				digs->push(digits.charAt(0));
+            			}
+            			else {
+HXLINE( 103)				digs->pop();
+            			}
+HXLINE( 105)			return (h + digs->join(HX_("",00,00,00,00)));
+            		}
+            		else {
+HXLINE( 107)			return (head + digs->join(HX_("",00,00,00,00)));
+            		}
+HXLINE(  92)		return null();
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC2(FractionalIndexing_Fields__obj,incrementInteger,return )
+
+::String FractionalIndexing_Fields__obj::decrementInteger(::String x,::String digits){
+            	HX_STACKFRAME(&_hx_pos_5a1b628005ac96b3_111_decrementInteger)
+HXLINE( 112)		::_FractionalIndexing::FractionalIndexing_Fields__obj::validateInteger(x);
+HXLINE( 113)		::String head = x.charAt(0);
+HXLINE( 114)		::Array< ::String > digs = x.substring(1,null()).split(HX_("",00,00,00,00));
+HXLINE( 116)		bool _hx_tmp;
+HXDLIN( 116)		if ((digs->length == 1)) {
+HXLINE( 116)			_hx_tmp = (digs->__get(0) == HX_("",00,00,00,00));
+            		}
+            		else {
+HXLINE( 116)			_hx_tmp = false;
+            		}
+HXDLIN( 116)		if (_hx_tmp) {
+HXLINE( 116)			digs = ::Array_obj< ::String >::__new(0);
+            		}
+HXLINE( 118)		bool borrow = true;
+HXLINE( 119)		int i = (digs->length - 1);
+HXLINE( 120)		while(true){
+HXLINE( 120)			bool _hx_tmp1;
+HXDLIN( 120)			if (borrow) {
+HXLINE( 120)				_hx_tmp1 = (i >= 0);
+            			}
+            			else {
+HXLINE( 120)				_hx_tmp1 = false;
+            			}
+HXDLIN( 120)			if (!(_hx_tmp1)) {
+HXLINE( 120)				goto _hx_goto_8;
+            			}
+HXLINE( 121)			int d = (digits.indexOf(digs->__get(i),null()) - 1);
+HXLINE( 122)			if ((d == -1)) {
+HXLINE( 123)				digs[i] = digits.charAt((digits.length - 1));
+            			}
+            			else {
+HXLINE( 125)				digs[i] = digits.charAt(d);
+HXLINE( 126)				borrow = false;
+            			}
+HXLINE( 128)			i = (i - 1);
+            		}
+            		_hx_goto_8:;
+HXLINE( 130)		if (borrow) {
+HXLINE( 131)			if ((head == HX_("a",61,00,00,00))) {
+HXLINE( 132)				return (HX_("Z",5a,00,00,00) + digits.charAt((digits.length - 1)));
+            			}
+HXLINE( 134)			if ((head == HX_("A",41,00,00,00))) {
+HXLINE( 135)				return null();
+            			}
+HXLINE( 137)			::String h = ::String::fromCharCode((( (int)(head.charCodeAt(0)) ) - 1));
+HXLINE( 138)			if ((h < HX_("Z",5a,00,00,00))) {
+HXLINE( 139)				digs->push(digits.charAt((digits.length - 1)));
+            			}
+            			else {
+HXLINE( 141)				digs->pop();
+            			}
+HXLINE( 143)			return (h + digs->join(HX_("",00,00,00,00)));
+            		}
+            		else {
+HXLINE( 145)			return (head + digs->join(HX_("",00,00,00,00)));
+            		}
+HXLINE( 130)		return null();
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC2(FractionalIndexing_Fields__obj,decrementInteger,return )
+
+::String FractionalIndexing_Fields__obj::between(::String a,::String b,::String __o_digits){
+            		::String digits = __o_digits;
+            		if (::hx::IsNull(__o_digits)) digits = HX_("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",9f,c5,5f,dd);
+            	HX_STACKFRAME(&_hx_pos_5a1b628005ac96b3_149_between)
+HXLINE( 150)		if (::hx::IsNotNull( a )) {
+HXLINE( 151)			::_FractionalIndexing::FractionalIndexing_Fields__obj::validateOrderKey(a,digits);
+            		}
+HXLINE( 153)		if (::hx::IsNotNull( b )) {
+HXLINE( 154)			::_FractionalIndexing::FractionalIndexing_Fields__obj::validateOrderKey(b,digits);
+            		}
+HXLINE( 156)		bool _hx_tmp;
+HXDLIN( 156)		bool _hx_tmp1;
+HXDLIN( 156)		if (::hx::IsNotNull( a )) {
+HXLINE( 156)			_hx_tmp1 = ::hx::IsNotNull( b );
+            		}
+            		else {
+HXLINE( 156)			_hx_tmp1 = false;
+            		}
+HXDLIN( 156)		if (_hx_tmp1) {
+HXLINE( 156)			_hx_tmp = (a >= b);
+            		}
+            		else {
+HXLINE( 156)			_hx_tmp = false;
+            		}
+HXDLIN( 156)		if (_hx_tmp) {
+HXLINE( 157)			HX_STACK_DO_THROW(((a + HX_(" >= ",e1,14,56,15)) + b));
+            		}
+HXLINE( 159)		if (::hx::IsNull( a )) {
+HXLINE( 160)			if (::hx::IsNull( b )) {
+HXLINE( 161)				return (HX_("a",61,00,00,00) + digits.charAt(0));
+            			}
+HXLINE( 163)			::String ib = ::_FractionalIndexing::FractionalIndexing_Fields__obj::getIntegerPart(b);
+HXLINE( 164)			::String fb = b.substring(ib.length,null());
+HXLINE( 165)			if ((ib == (HX_("A",41,00,00,00) + ::StringTools_obj::lpad(HX_("",00,00,00,00),digits.charAt(0),26)))) {
+HXLINE( 166)				return (ib + ::_FractionalIndexing::FractionalIndexing_Fields__obj::midpoint(HX_("",00,00,00,00),fb,digits));
+            			}
+HXLINE( 168)			if ((ib < b)) {
+HXLINE( 169)				return ib;
+            			}
+HXLINE( 171)			::String res = ::_FractionalIndexing::FractionalIndexing_Fields__obj::decrementInteger(ib,digits);
+HXLINE( 172)			if (::hx::IsNull( res )) {
+HXLINE( 173)				HX_STACK_DO_THROW(HX_("cannot decrement any more",f3,33,dd,eb));
+            			}
+HXLINE( 175)			return res;
+            		}
+HXLINE( 178)		if (::hx::IsNull( b )) {
+HXLINE( 179)			::String ia = ::_FractionalIndexing::FractionalIndexing_Fields__obj::getIntegerPart(a);
+HXLINE( 180)			::String fa = a.substring(ia.length,null());
+HXLINE( 181)			::String i = ::_FractionalIndexing::FractionalIndexing_Fields__obj::incrementInteger(ia,digits);
+HXLINE( 182)			if (::hx::IsNull( i )) {
+HXLINE( 182)				return (ia + ::_FractionalIndexing::FractionalIndexing_Fields__obj::midpoint(fa,null(),digits));
+            			}
+            			else {
+HXLINE( 182)				return i;
+            			}
+            		}
+HXLINE( 185)		::String ia1 = ::_FractionalIndexing::FractionalIndexing_Fields__obj::getIntegerPart(a);
+HXLINE( 186)		::String fa1 = a.substring(ia1.length,null());
+HXLINE( 187)		::String ib1 = ::_FractionalIndexing::FractionalIndexing_Fields__obj::getIntegerPart(b);
+HXLINE( 188)		::String fb1 = b.substring(ib1.length,null());
+HXLINE( 189)		if ((ia1 == ib1)) {
+HXLINE( 190)			return (ia1 + ::_FractionalIndexing::FractionalIndexing_Fields__obj::midpoint(fa1,fb1,digits));
+            		}
+HXLINE( 192)		::String i1 = ::_FractionalIndexing::FractionalIndexing_Fields__obj::incrementInteger(ia1,digits);
+HXLINE( 193)		if (::hx::IsNull( i1 )) {
+HXLINE( 194)			HX_STACK_DO_THROW(HX_("cannot increment any more",57,40,63,e2));
+            		}
+HXLINE( 196)		if ((i1 < b)) {
+HXLINE( 197)			return i1;
+            		}
+HXLINE( 199)		return (ia1 + ::_FractionalIndexing::FractionalIndexing_Fields__obj::midpoint(fa1,null(),digits));
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC3(FractionalIndexing_Fields__obj,between,return )
+
+
+FractionalIndexing_Fields__obj::FractionalIndexing_Fields__obj()
+{
+}
+
+bool FractionalIndexing_Fields__obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 7:
+		if (HX_FIELD_EQ(inName,"between") ) { outValue = between_dyn(); return true; }
+		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"midpoint") ) { outValue = midpoint_dyn(); return true; }
+		break;
+	case 14:
+		if (HX_FIELD_EQ(inName,"getIntegerPart") ) { outValue = getIntegerPart_dyn(); return true; }
+		break;
+	case 15:
+		if (HX_FIELD_EQ(inName,"validateInteger") ) { outValue = validateInteger_dyn(); return true; }
+		break;
+	case 16:
+		if (HX_FIELD_EQ(inName,"getIntegerLength") ) { outValue = getIntegerLength_dyn(); return true; }
+		if (HX_FIELD_EQ(inName,"validateOrderKey") ) { outValue = validateOrderKey_dyn(); return true; }
+		if (HX_FIELD_EQ(inName,"incrementInteger") ) { outValue = incrementInteger_dyn(); return true; }
+		if (HX_FIELD_EQ(inName,"decrementInteger") ) { outValue = decrementInteger_dyn(); return true; }
+	}
+	return false;
+}
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo *FractionalIndexing_Fields__obj_sMemberStorageInfo = 0;
+static ::hx::StaticInfo *FractionalIndexing_Fields__obj_sStaticStorageInfo = 0;
+#endif
+
+::hx::Class FractionalIndexing_Fields__obj::__mClass;
+
+static ::String FractionalIndexing_Fields__obj_sStaticFields[] = {
+	HX_("midpoint",c8,15,08,2b),
+	HX_("validateInteger",c8,f3,31,12),
+	HX_("getIntegerLength",ce,52,b2,50),
+	HX_("getIntegerPart",db,d7,29,1f),
+	HX_("validateOrderKey",67,b0,83,78),
+	HX_("incrementInteger",4f,93,3d,2f),
+	HX_("decrementInteger",eb,27,74,0e),
+	HX_("between",c8,91,b3,66),
+	::String(null())
+};
+
+void FractionalIndexing_Fields__obj::__register()
+{
+	FractionalIndexing_Fields__obj _hx_dummy;
+	FractionalIndexing_Fields__obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("_FractionalIndexing.FractionalIndexing_Fields_",36,fd,5c,1a);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &FractionalIndexing_Fields__obj::__GetStatic;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(FractionalIndexing_Fields__obj_sStaticFields);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(0 /* sMemberFields */);
+	__mClass->mCanCast = ::hx::TCanCast< FractionalIndexing_Fields__obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = FractionalIndexing_Fields__obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = FractionalIndexing_Fields__obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+} // end namespace _FractionalIndexing
diff --git a/Sources/c_borogove/src/_HaxeCBridge/HaxeArray_Impl_.cpp b/Sources/c_borogove/src/_HaxeCBridge/HaxeArray_Impl_.cpp
new file mode 100644
index 0000000..cc8f674
--- /dev/null
+++ b/Sources/c_borogove/src/_HaxeCBridge/HaxeArray_Impl_.cpp
@@ -0,0 +1,120 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_Internal
+#include <_HaxeCBridge/Internal.h>
+#endif
+#ifndef INCLUDED_cpp_Int64Map
+#include <cpp/Int64Map.h>
+#endif
+#ifndef INCLUDED_haxe_IMap
+#include <haxe/IMap.h>
+#endif
+
+HX_LOCAL_STACK_FRAME(_hx_pos_c8a4db259b59e383_2228_fromNullableArrayT,"_HaxeCBridge.HaxeArray_Impl_","fromNullableArrayT",0x40827fc8,"_HaxeCBridge.HaxeArray_Impl_.fromNullableArrayT","HaxeCBridge.hx",2228,0xa18550d8)
+namespace _HaxeCBridge{
+
+void HaxeArray_Impl__obj::__construct() { }
+
+Dynamic HaxeArray_Impl__obj::__CreateEmpty() { return new HaxeArray_Impl__obj; }
+
+void *HaxeArray_Impl__obj::_hx_vtable = 0;
+
+Dynamic HaxeArray_Impl__obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< HaxeArray_Impl__obj > _hx_result = new HaxeArray_Impl__obj();
+	_hx_result->__construct();
+	return _hx_result;
+}
+
+bool HaxeArray_Impl__obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x7f087fd8;
+}
+
+void** HaxeArray_Impl__obj::fromNullableArrayT(::cpp::VirtualArray x){
+            	HX_STACKFRAME(&_hx_pos_c8a4db259b59e383_2228_fromNullableArrayT)
+HXLINE(2229)		if (::hx::IsNull( x )) {
+HXLINE(2229)			return null();
+            		}
+HXLINE(2231)		::cpp::VirtualArray x1 = x;
+HXDLIN(2231)		{
+HXLINE(2231)			int _g = 0;
+HXDLIN(2231)			while((_g < x1->get_length())){
+HXLINE(2231)				 ::Dynamic el = x1->__get(_g);
+HXDLIN(2231)				_g = (_g + 1);
+HXDLIN(2231)				{
+HXLINE(2231)					 ::Dynamic haxeObject = el;
+HXDLIN(2231)					void* ptr = haxeObject.mPtr;
+HXDLIN(2231)					::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN(2231)					{
+HXLINE(2231)						 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN(2231)						if (::hx::IsNull( store )) {
+HXLINE(2231)							store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            								->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            								->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
+HXDLIN(2231)							::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            						}
+            						else {
+HXLINE(2231)							::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            						}
+            					}
+            				}
+            			}
+            		}
+HXDLIN(2231)		void** ptr1 = (void**)x1->getBase();
+HXDLIN(2231)		::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
+HXDLIN(2231)		{
+HXLINE(2231)			 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN(2231)			if (::hx::IsNull( store1 )) {
+HXLINE(2231)				store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+            					->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            					->setFixed(1,HX_("value",71,7f,b8,31),x1));
+HXDLIN(2231)				::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+            			}
+            			else {
+HXLINE(2231)				::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+            			}
+            		}
+HXDLIN(2231)		return ptr1;
+            	}
+
+
+
+HaxeArray_Impl__obj::HaxeArray_Impl__obj()
+{
+}
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo *HaxeArray_Impl__obj_sMemberStorageInfo = 0;
+static ::hx::StaticInfo *HaxeArray_Impl__obj_sStaticStorageInfo = 0;
+#endif
+
+::hx::Class HaxeArray_Impl__obj::__mClass;
+
+void HaxeArray_Impl__obj::__register()
+{
+	HaxeArray_Impl__obj _hx_dummy;
+	HaxeArray_Impl__obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("_HaxeCBridge.HaxeArray_Impl_",8c,21,8a,ee);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &::hx::Class_obj::GetNoStaticField;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(0 /* sStaticFields */);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(0 /* sMemberFields */);
+	__mClass->mCanCast = ::hx::TCanCast< HaxeArray_Impl__obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = HaxeArray_Impl__obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = HaxeArray_Impl__obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+} // end namespace _HaxeCBridge
diff --git a/Sources/c_borogove/src/_HaxeCBridge/HaxeOpaqueArray_Impl_.cpp b/Sources/c_borogove/src/_HaxeCBridge/HaxeOpaqueArray_Impl_.cpp
new file mode 100644
index 0000000..f1db3ce
--- /dev/null
+++ b/Sources/c_borogove/src/_HaxeCBridge/HaxeOpaqueArray_Impl_.cpp
@@ -0,0 +1,107 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED__HaxeCBridge_HaxeOpaqueArray_Impl_
+#include <_HaxeCBridge/HaxeOpaqueArray_Impl_.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_Internal
+#include <_HaxeCBridge/Internal.h>
+#endif
+#ifndef INCLUDED_cpp_Int64Map
+#include <cpp/Int64Map.h>
+#endif
+#ifndef INCLUDED_haxe_IMap
+#include <haxe/IMap.h>
+#endif
+
+HX_LOCAL_STACK_FRAME(_hx_pos_d33de724b9fc3cd4_2205_fromNullableArrayT,"_HaxeCBridge.HaxeOpaqueArray_Impl_","fromNullableArrayT",0xd5bd2249,"_HaxeCBridge.HaxeOpaqueArray_Impl_.fromNullableArrayT","HaxeCBridge.hx",2205,0xa18550d8)
+namespace _HaxeCBridge{
+
+void HaxeOpaqueArray_Impl__obj::__construct() { }
+
+Dynamic HaxeOpaqueArray_Impl__obj::__CreateEmpty() { return new HaxeOpaqueArray_Impl__obj; }
+
+void *HaxeOpaqueArray_Impl__obj::_hx_vtable = 0;
+
+Dynamic HaxeOpaqueArray_Impl__obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< HaxeOpaqueArray_Impl__obj > _hx_result = new HaxeOpaqueArray_Impl__obj();
+	_hx_result->__construct();
+	return _hx_result;
+}
+
+bool HaxeOpaqueArray_Impl__obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x65fb6c2b;
+}
+
+void** HaxeOpaqueArray_Impl__obj::fromNullableArrayT(::cpp::VirtualArray x){
+            	HX_STACKFRAME(&_hx_pos_d33de724b9fc3cd4_2205_fromNullableArrayT)
+HXLINE(2206)		if (::hx::IsNull( x )) {
+HXLINE(2206)			return null();
+            		}
+HXLINE(2208)		::cpp::VirtualArray x1 = x;
+HXDLIN(2208)		::Array< size_t > arr = ::Array_obj< size_t >::__new(x1->get_length());
+HXDLIN(2208)		{
+HXLINE(2208)			int _g_current = 0;
+HXDLIN(2208)			::cpp::VirtualArray _g_array = x1;
+HXDLIN(2208)			while((_g_current < _g_array->get_length())){
+HXLINE(2208)				 ::Dynamic _g_value = _g_array->__get(_g_current);
+HXDLIN(2208)				_g_current = (_g_current + 1);
+HXDLIN(2208)				 ::Dynamic el = _g_value;
+HXDLIN(2208)				arr[(_g_current - 1)] = reinterpret_cast<size_t>(( (void*)(( (::cpp::Pointer< void >)(el) )->get_raw()) ));
+            			}
+            		}
+HXDLIN(2208)		void** ptr = (void**)arr->getBase();
+HXDLIN(2208)		::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN(2208)		{
+HXLINE(2208)			 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN(2208)			if (::hx::IsNull( store )) {
+HXLINE(2390)				store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            					->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            					->setFixed(1,HX_("value",71,7f,b8,31),arr));
+HXLINE(2208)				::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            			}
+            			else {
+HXLINE(2208)				::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            			}
+            		}
+HXDLIN(2208)		return ptr;
+            	}
+
+
+
+HaxeOpaqueArray_Impl__obj::HaxeOpaqueArray_Impl__obj()
+{
+}
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo *HaxeOpaqueArray_Impl__obj_sMemberStorageInfo = 0;
+static ::hx::StaticInfo *HaxeOpaqueArray_Impl__obj_sStaticStorageInfo = 0;
+#endif
+
+::hx::Class HaxeOpaqueArray_Impl__obj::__mClass;
+
+void HaxeOpaqueArray_Impl__obj::__register()
+{
+	HaxeOpaqueArray_Impl__obj _hx_dummy;
+	HaxeOpaqueArray_Impl__obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("_HaxeCBridge.HaxeOpaqueArray_Impl_",6b,66,95,39);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &::hx::Class_obj::GetNoStaticField;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(0 /* sStaticFields */);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(0 /* sMemberFields */);
+	__mClass->mCanCast = ::hx::TCanCast< HaxeOpaqueArray_Impl__obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = HaxeOpaqueArray_Impl__obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = HaxeOpaqueArray_Impl__obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+} // end namespace _HaxeCBridge
diff --git a/Sources/c_borogove/src/_HaxeCBridge/HaxeStringArray_Impl_.cpp b/Sources/c_borogove/src/_HaxeCBridge/HaxeStringArray_Impl_.cpp
new file mode 100644
index 0000000..8576e65
--- /dev/null
+++ b/Sources/c_borogove/src/_HaxeCBridge/HaxeStringArray_Impl_.cpp
@@ -0,0 +1,124 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED__HaxeCBridge_HaxeStringArray_Impl_
+#include <_HaxeCBridge/HaxeStringArray_Impl_.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_Internal
+#include <_HaxeCBridge/Internal.h>
+#endif
+#ifndef INCLUDED_cpp_Int64Map
+#include <cpp/Int64Map.h>
+#endif
+#ifndef INCLUDED_haxe_IMap
+#include <haxe/IMap.h>
+#endif
+
+HX_LOCAL_STACK_FRAME(_hx_pos_6dd11d7cebaf62d3_2186_fromNullableArrayString,"_HaxeCBridge.HaxeStringArray_Impl_","fromNullableArrayString",0xff874cec,"_HaxeCBridge.HaxeStringArray_Impl_.fromNullableArrayString","HaxeCBridge.hx",2186,0xa18550d8)
+namespace _HaxeCBridge{
+
+void HaxeStringArray_Impl__obj::__construct() { }
+
+Dynamic HaxeStringArray_Impl__obj::__CreateEmpty() { return new HaxeStringArray_Impl__obj; }
+
+void *HaxeStringArray_Impl__obj::_hx_vtable = 0;
+
+Dynamic HaxeStringArray_Impl__obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< HaxeStringArray_Impl__obj > _hx_result = new HaxeStringArray_Impl__obj();
+	_hx_result->__construct();
+	return _hx_result;
+}
+
+bool HaxeStringArray_Impl__obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x32e5d073;
+}
+
+const char** HaxeStringArray_Impl__obj::fromNullableArrayString(::Array< ::String > x){
+            	HX_STACKFRAME(&_hx_pos_6dd11d7cebaf62d3_2186_fromNullableArrayString)
+HXLINE(2187)		if (::hx::IsNull( x )) {
+HXLINE(2187)			return null();
+            		}
+HXLINE(2189)		::Array< ::String > x1 = x;
+HXDLIN(2189)		::Array< size_t > arr = ::Array_obj< size_t >::__new(x1->length);
+HXDLIN(2189)		{
+HXLINE(2189)			int _g_current = 0;
+HXDLIN(2189)			::Array< ::String > _g_array = x1;
+HXDLIN(2189)			while((_g_current < _g_array->length)){
+HXLINE(2189)				::String _g_value = _g_array->__get(_g_current);
+HXDLIN(2189)				_g_current = (_g_current + 1);
+HXDLIN(2189)				::String el = _g_value;
+HXDLIN(2189)				{
+HXLINE(2189)					const char* cStrPtr = el.utf8_str();
+HXDLIN(2189)					::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
+HXDLIN(2189)					{
+HXLINE(2189)						 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN(2189)						if (::hx::IsNull( store )) {
+HXLINE(2390)							store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            								->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            								->setFixed(1,HX_("value",71,7f,b8,31),el));
+HXLINE(2189)							::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            						}
+            						else {
+HXLINE(2189)							::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            						}
+            					}
+HXDLIN(2189)					const char* ptr = cStrPtr;
+HXDLIN(2189)					arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
+            				}
+            			}
+            		}
+HXDLIN(2189)		void** ptr1 = (void**)arr->getBase();
+HXDLIN(2189)		::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
+HXDLIN(2189)		{
+HXLINE(2189)			 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN(2189)			if (::hx::IsNull( store1 )) {
+HXLINE(2390)				store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+            					->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            					->setFixed(1,HX_("value",71,7f,b8,31),arr));
+HXLINE(2189)				::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+            			}
+            			else {
+HXLINE(2189)				::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+            			}
+            		}
+HXDLIN(2189)		return ( (const char**)(ptr1) );
+            	}
+
+
+
+HaxeStringArray_Impl__obj::HaxeStringArray_Impl__obj()
+{
+}
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo *HaxeStringArray_Impl__obj_sMemberStorageInfo = 0;
+static ::hx::StaticInfo *HaxeStringArray_Impl__obj_sStaticStorageInfo = 0;
+#endif
+
+::hx::Class HaxeStringArray_Impl__obj::__mClass;
+
+void HaxeStringArray_Impl__obj::__register()
+{
+	HaxeStringArray_Impl__obj _hx_dummy;
+	HaxeStringArray_Impl__obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("_HaxeCBridge.HaxeStringArray_Impl_",7b,c0,ab,cc);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &::hx::Class_obj::GetNoStaticField;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(0 /* sStaticFields */);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(0 /* sMemberFields */);
+	__mClass->mCanCast = ::hx::TCanCast< HaxeStringArray_Impl__obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = HaxeStringArray_Impl__obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = HaxeStringArray_Impl__obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+} // end namespace _HaxeCBridge
diff --git a/Sources/c_borogove/src/_HaxeCBridge/Internal.cpp b/Sources/c_borogove/src/_HaxeCBridge/Internal.cpp
index faf0e98..1d180b1 100644
--- a/Sources/c_borogove/src/_HaxeCBridge/Internal.cpp
+++ b/Sources/c_borogove/src/_HaxeCBridge/Internal.cpp
@@ -14,9 +14,9 @@
 #include <sys/thread/Lock.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_afd834d22acce778_2290_boot,"_HaxeCBridge.Internal","boot",0xcd005bdc,"_HaxeCBridge.Internal.boot","HaxeCBridge.hx",2290,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afd834d22acce778_2291_boot,"_HaxeCBridge.Internal","boot",0xcd005bdc,"_HaxeCBridge.Internal.boot","HaxeCBridge.hx",2291,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afd834d22acce778_2292_boot,"_HaxeCBridge.Internal","boot",0xcd005bdc,"_HaxeCBridge.Internal.boot","HaxeCBridge.hx",2292,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afd834d22acce778_2437_boot,"_HaxeCBridge.Internal","boot",0xcd005bdc,"_HaxeCBridge.Internal.boot","HaxeCBridge.hx",2437,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afd834d22acce778_2438_boot,"_HaxeCBridge.Internal","boot",0xcd005bdc,"_HaxeCBridge.Internal.boot","HaxeCBridge.hx",2438,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afd834d22acce778_2439_boot,"_HaxeCBridge.Internal","boot",0xcd005bdc,"_HaxeCBridge.Internal.boot","HaxeCBridge.hx",2439,0xa18550d8)
 namespace _HaxeCBridge{
 
 void Internal_obj::__construct() { }
@@ -165,16 +165,16 @@ void Internal_obj::__register()
 void Internal_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_afd834d22acce778_2290_boot)
-HXDLIN(2290)		mainThreadLoopActive = true;
+            	HX_STACKFRAME(&_hx_pos_afd834d22acce778_2437_boot)
+HXDLIN(2437)		mainThreadLoopActive = true;
             	}
 {
-            	HX_STACKFRAME(&_hx_pos_afd834d22acce778_2291_boot)
-HXDLIN(2291)		mainThreadEndIfNoPending = false;
+            	HX_STACKFRAME(&_hx_pos_afd834d22acce778_2438_boot)
+HXDLIN(2438)		mainThreadEndIfNoPending = false;
             	}
 {
-            	HX_GC_STACKFRAME(&_hx_pos_afd834d22acce778_2292_boot)
-HXDLIN(2292)		gcRetainMap =  ::cpp::Int64Map_obj::__alloc( HX_CTX );
+            	HX_GC_STACKFRAME(&_hx_pos_afd834d22acce778_2439_boot)
+HXDLIN(2439)		gcRetainMap =  ::cpp::Int64Map_obj::__alloc( HX_CTX );
             	}
 }
 
diff --git a/Sources/c_borogove/src/_UUIDv7/UUIDv7_Fields_.cpp b/Sources/c_borogove/src/_UUIDv7/UUIDv7_Fields_.cpp
new file mode 100644
index 0000000..23e411d
--- /dev/null
+++ b/Sources/c_borogove/src/_UUIDv7/UUIDv7_Fields_.cpp
@@ -0,0 +1,124 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
+#ifndef INCLUDED_uuidv7_V7Generator
+#include <uuidv7/V7Generator.h>
+#endif
+
+HX_LOCAL_STACK_FRAME(_hx_pos_74637fa84fdfbdaf_11_uuidv7,"_UUIDv7.UUIDv7_Fields_","uuidv7",0x1cadd8d4,"_UUIDv7.UUIDv7_Fields_.uuidv7","UUIDv7.hx",11,0x29919a42)
+namespace _UUIDv7{
+
+void UUIDv7_Fields__obj::__construct() { }
+
+Dynamic UUIDv7_Fields__obj::__CreateEmpty() { return new UUIDv7_Fields__obj; }
+
+void *UUIDv7_Fields__obj::_hx_vtable = 0;
+
+Dynamic UUIDv7_Fields__obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< UUIDv7_Fields__obj > _hx_result = new UUIDv7_Fields__obj();
+	_hx_result->__construct();
+	return _hx_result;
+}
+
+bool UUIDv7_Fields__obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x0919bfda;
+}
+
+ ::uuidv7::V7Generator UUIDv7_Fields__obj::defaultGenerator;
+
+::String UUIDv7_Fields__obj::uuidv7(){
+            	HX_GC_STACKFRAME(&_hx_pos_74637fa84fdfbdaf_11_uuidv7)
+HXLINE(  12)		if (::hx::IsNull( ::_UUIDv7::UUIDv7_Fields__obj::defaultGenerator )) {
+HXLINE(  12)			::_UUIDv7::UUIDv7_Fields__obj::defaultGenerator =  ::uuidv7::V7Generator_obj::__alloc( HX_CTX );
+            		}
+HXLINE(  13)		return ::_UUIDv7::UUIDv7_Fields__obj::defaultGenerator->generate();
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC0(UUIDv7_Fields__obj,uuidv7,return )
+
+
+UUIDv7_Fields__obj::UUIDv7_Fields__obj()
+{
+}
+
+bool UUIDv7_Fields__obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 6:
+		if (HX_FIELD_EQ(inName,"uuidv7") ) { outValue = uuidv7_dyn(); return true; }
+		break;
+	case 16:
+		if (HX_FIELD_EQ(inName,"defaultGenerator") ) { outValue = ( defaultGenerator ); return true; }
+	}
+	return false;
+}
+
+bool UUIDv7_Fields__obj::__SetStatic(const ::String &inName,Dynamic &ioValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 16:
+		if (HX_FIELD_EQ(inName,"defaultGenerator") ) { defaultGenerator=ioValue.Cast<  ::uuidv7::V7Generator >(); return true; }
+	}
+	return false;
+}
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo *UUIDv7_Fields__obj_sMemberStorageInfo = 0;
+static ::hx::StaticInfo UUIDv7_Fields__obj_sStaticStorageInfo[] = {
+	{::hx::fsObject /*  ::uuidv7::V7Generator */ ,(void *) &UUIDv7_Fields__obj::defaultGenerator,HX_("defaultGenerator",52,5f,69,57)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+#endif
+
+static void UUIDv7_Fields__obj_sMarkStatics(HX_MARK_PARAMS) {
+	HX_MARK_MEMBER_NAME(UUIDv7_Fields__obj::defaultGenerator,"defaultGenerator");
+};
+
+#ifdef HXCPP_VISIT_ALLOCS
+static void UUIDv7_Fields__obj_sVisitStatics(HX_VISIT_PARAMS) {
+	HX_VISIT_MEMBER_NAME(UUIDv7_Fields__obj::defaultGenerator,"defaultGenerator");
+};
+
+#endif
+
+::hx::Class UUIDv7_Fields__obj::__mClass;
+
+static ::String UUIDv7_Fields__obj_sStaticFields[] = {
+	HX_("defaultGenerator",52,5f,69,57),
+	HX_("uuidv7",fc,c5,56,6b),
+	::String(null())
+};
+
+void UUIDv7_Fields__obj::__register()
+{
+	UUIDv7_Fields__obj _hx_dummy;
+	UUIDv7_Fields__obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("_UUIDv7.UUIDv7_Fields_",96,62,23,d5);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &UUIDv7_Fields__obj::__GetStatic;
+	__mClass->mSetStaticField = &UUIDv7_Fields__obj::__SetStatic;
+	__mClass->mMarkFunc = UUIDv7_Fields__obj_sMarkStatics;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(UUIDv7_Fields__obj_sStaticFields);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(0 /* sMemberFields */);
+	__mClass->mCanCast = ::hx::TCanCast< UUIDv7_Fields__obj >;
+#ifdef HXCPP_VISIT_ALLOCS
+	__mClass->mVisitFunc = UUIDv7_Fields__obj_sVisitStatics;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = UUIDv7_Fields__obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = UUIDv7_Fields__obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+} // end namespace _UUIDv7
diff --git a/Sources/c_borogove/src/__HaxeCBridgeBindings__.cpp b/Sources/c_borogove/src/__HaxeCBridgeBindings__.cpp
index 8af8dfd..904e356 100644
--- a/Sources/c_borogove/src/__HaxeCBridgeBindings__.cpp
+++ b/Sources/c_borogove/src/__HaxeCBridgeBindings__.cpp
@@ -21,21 +21,30 @@
 #include "borogove.h"
 
 #define HAXE_C_BRIDGE_LINKAGE HXCPP_EXTERN_CLASS_ATTRIBUTES
+#include <borogove/Html.h>
 #include <borogove/persistence/MediaStore__Companion.h>
 #include <borogove/persistence/MediaStore.h>
 #include <borogove/persistence/MediaStoreFS.h>
 #include <borogove/persistence/KeyValueStore__Companion.h>
 #include <borogove/persistence/KeyValueStore.h>
-#include <borogove/Chat.h>
 #include <borogove/ChatMessage.h>
+#include <borogove/EncryptionInfo.h>
 #include <borogove/ChatMessageBuilder.h>
-#include <borogove/Participant.h>
+#include <borogove/Member.h>
+#include <borogove/ChatAttachment.h>
+#include <borogove/Hash.h>
 #include <borogove/Reaction.h>
+#include <borogove/LinkMetadata.h>
+#include <borogove/EventEmitter.h>
+#include <borogove/Chat.h>
+#include <borogove/Status.h>
+#include <borogove/Role.h>
 #include <borogove/calls/Session.h>
 #include <borogove/calls/DTMFSender.h>
-#include <borogove/EncryptionInfo.h>
-#include <borogove/ChatAttachment.h>
-#include <borogove/Hash.h>
+#include <borogove/AvailableChat.h>
+#include <borogove/Client.h>
+#include <borogove/Profile.h>
+#include <borogove/ProfileItem.h>
 #include <borogove/calls/MediaStreamTrack.h>
 #include <borogove/calls/AudioFormat.h>
 #include <borogove/Command.h>
@@ -50,16 +59,12 @@
 #include <borogove/Persistence__Companion.h>
 #include <borogove/Persistence.h>
 #include <borogove/persistence/Sqlite.h>
-#include <borogove/Client.h>
-#include <borogove/Profile.h>
-#include <borogove/ProfileItem.h>
 #include <borogove/persistence/Dummy.h>
 #include <borogove/Push.h>
 #include <borogove/Notification.h>
-#include <borogove/EventEmitter.h>
 #include <borogove/ProfileBuilder.h>
 #include <borogove/AttachmentSource.h>
-#include <borogove/AvailableChat.h>
+#include <borogove/AvailableChatIterator.h>
 #include <borogove/calls/MediaStream.h>
 #include <borogove/calls/Session__Companion.h>
 #include <borogove/calls/InitiatedSession.h>
@@ -117,7 +122,7 @@ namespace HaxeCBridgeInternal {
 	HxMutex threadManageMutex;
 
 	void defaultExceptionHandler(const char* info) {
-		printf("Unhandled haxe exception: %s\n", info);
+		fprintf(stderr, "Unhandled Borogove exception: %s\n", info);
 	}
 
 	typedef void (* MainThreadCallback)(void* data);
@@ -260,29 +265,36 @@ void borogove_stop(bool waitOnScheduledEvents) {
 }
 			
 HAXE_C_BRIDGE_LINKAGE
-void borogove_release(const void* ptr) {
+void borogove_release(const void *ptr) {
 	struct Callback {
-		static void run(void* data) {
+		static void run(void *data) {
 			HaxeCBridge::releaseHaxePtr(data);
 		}
 	};
 	HaxeCBridgeInternal::runInMainThread(Callback::run, (void*)ptr);
 }
+
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_media_store_has_media(void *a0, const char *a1, const unsigned char *a2, size_t a3, void (*a4) (bool, void *handler__context), void *a5) {
+void borogove_set_finalizer(const void *ptr, void (*finalize)(void *)) {
+	// This is already locked internally so should be safe to just call
+	__hxcpp_set_finalizer((hx::Object*)ptr, (void*)finalize);
+}
+HAXE_C_BRIDGE_LINKAGE
+void *borogove_html_element(const char *a0, const char *const *a1, size_t a2, const char *const *a3, size_t a4, void *const *a5, size_t a6) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::persistence::MediaStore__Companion_obj::hasMedia__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, cpp::Function<void(bool, void * handler__context)>(a4), a5);
+		return HaxeCBridge::retainHaxeObject(borogove::Html_obj::element__fromC(a0, a1, a2, a3, a4, a5, a6));
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const unsigned char* a2; size_t a3; void (* a4) (bool, void * handler__context); void* a5;} args;
+		struct {const char * a0; const char* const* a1; size_t a2; const char* const* a3; size_t a4; void* const* a5; size_t a6;} args;
 		HxSemaphore lock;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::persistence::MediaStore__Companion_obj::hasMedia__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, cpp::Function<void(bool, void * handler__context)>(data->args.a4), data->args.a5);
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::Html_obj::element__fromC(data->args.a0, data->args.a1, data->args.a2, data->args.a3, data->args.a4, data->args.a5, data->args.a6));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -295,28 +307,30 @@ void borogove_persistence_media_store_has_media(void *a0, const char *a1, const
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4, a5} };
+	Data data = { {a0, a1, a2, a3, a4, a5, a6} };
 
-	// queue a callback to execute hasMedia__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute element__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_media_store_remove_media(void *a0, const char *a1, const unsigned char *a2, size_t a3) {
+void *borogove_html_text(const char *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::persistence::MediaStore__Companion_obj::removeMedia__fromC(Dynamic((hx::Object *)a0), a1, a2, a3);
+		return HaxeCBridge::retainHaxeObject(borogove::Html_obj::text(a0));
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const unsigned char* a2; size_t a3;} args;
+		struct {const char * a0;} args;
 		HxSemaphore lock;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::persistence::MediaStore__Companion_obj::removeMedia__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3);
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::Html_obj::text(data->args.a0));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -329,28 +343,30 @@ void borogove_persistence_media_store_remove_media(void *a0, const char *a1, con
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3} };
+	Data data = { {a0} };
 
-	// queue a callback to execute removeMedia__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute text() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_media_store_store_media(void *a0, const char *a1, const unsigned char *a2, size_t a3, void (*a4) (bool, void *handler__context), void *a5) {
+void *borogove_html_fragment(void *const *a0, size_t a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::persistence::MediaStore__Companion_obj::storeMedia__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, cpp::Function<void(bool, void * handler__context)>(a4), a5);
+		return HaxeCBridge::retainHaxeObject(borogove::Html_obj::fragment__fromC(a0, a1));
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const unsigned char* a2; size_t a3; void (* a4) (bool, void * handler__context); void* a5;} args;
+		struct {void* const* a0; size_t a1;} args;
 		HxSemaphore lock;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::persistence::MediaStore__Companion_obj::storeMedia__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, cpp::Function<void(bool, void * handler__context)>(data->args.a4), data->args.a5);
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::Html_obj::fragment__fromC(data->args.a0, data->args.a1));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -363,17 +379,18 @@ void borogove_persistence_media_store_store_media(void *a0, const char *a1, cons
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4, a5} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute storeMedia__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute fragment__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_persistence_media_store_fs_new(const char *a0) {
+void *borogove_html_from_string(const char *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject(borogove::persistence::MediaStoreFS_obj::__new(a0));
+		return HaxeCBridge::retainHaxeObject(borogove::Html_obj::fromString(a0));
 	}
 	struct Data {
 		struct {const char * a0;} args;
@@ -385,7 +402,7 @@ void *borogove_persistence_media_store_fs_new(const char *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject(borogove::persistence::MediaStoreFS_obj::__new(data->args.a0));
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::Html_obj::fromString(data->args.a0));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -400,27 +417,28 @@ void *borogove_persistence_media_store_fs_new(const char *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute new() on the main thread and wait until execution completes
+	// queue a callback to execute fromString() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_media_store_fs_get_media_path(void *a0, const char *a1, void (*a2) (const char*, void *handler__context), void *a3) {
+size_t borogove_html_reduce(void *a0, void *(*a1) (const char*, const char**, ptrdiff_t, const char**, ptrdiff_t, void**, ptrdiff_t, void*), void *a2, void ***a3) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::persistence::MediaStoreFS((hx::Object *)a0, true))->getMediaPath__fromC(a1, cpp::Function<void(const char*, void * handler__context)>(a2), a3);
+		return (borogove::Html((hx::Object *)a0, true))->reduce__fromC(cpp::Function<void*(const char*, const char**, ptrdiff_t, const char**, ptrdiff_t, void**, ptrdiff_t, void*)>(a1), a2, a3);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; void (* a2) (const char*, void * handler__context); void* a3;} args;
+		struct {void * a0; void* (* a1) (const char*, const char**, ptrdiff_t, const char**, ptrdiff_t, void**, ptrdiff_t, void*); void* a2; void*** a3;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::persistence::MediaStoreFS((hx::Object *)data->args.a0, true))->getMediaPath__fromC(data->args.a1, cpp::Function<void(const char*, void * handler__context)>(data->args.a2), data->args.a3);
+				data->ret = (borogove::Html((hx::Object *)data->args.a0, true))->reduce__fromC(cpp::Function<void*(const char*, const char**, ptrdiff_t, const char**, ptrdiff_t, void**, ptrdiff_t, void*)>(data->args.a1), data->args.a2, data->args.a3);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -435,26 +453,28 @@ void borogove_persistence_media_store_fs_get_media_path(void *a0, const char *a1
 
 	Data data = { {a0, a1, a2, a3} };
 
-	// queue a callback to execute getMediaPath__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute reduce__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_key_value_store_get(void *a0, const char *a1, void (*a2) (const char*, void *handler__context), void *a3) {
+const char *borogove_html_to_string(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::persistence::KeyValueStore__Companion_obj::get__fromC(Dynamic((hx::Object *)a0), a1, cpp::Function<void(const char*, void * handler__context)>(a2), a3);
+		return HaxeCBridge::retainHaxeString((borogove::Html((hx::Object *)a0, true))->toString());
 	}
 	struct Data {
-		struct {void * a0; const char * a1; void (* a2) (const char*, void * handler__context); void* a3;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::persistence::KeyValueStore__Companion_obj::get__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, cpp::Function<void(const char*, void * handler__context)>(data->args.a2), data->args.a3);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Html((hx::Object *)data->args.a0, true))->toString());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -467,28 +487,30 @@ void borogove_persistence_key_value_store_get(void *a0, const char *a1, void (*a
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3} };
+	Data data = { {a0} };
 
-	// queue a callback to execute get__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute toString() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_key_value_store_set(void *a0, const char *a1, const char *a2, void (*a3) (bool, void *handler__context), void *a4) {
+const char *borogove_html_to_plain_text(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::persistence::KeyValueStore__Companion_obj::set__fromC(Dynamic((hx::Object *)a0), a1, a2, cpp::Function<void(bool, void * handler__context)>(a3), a4);
+		return HaxeCBridge::retainHaxeString((borogove::Html((hx::Object *)a0, true))->toPlainText());
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2; void (* a3) (bool, void * handler__context); void* a4;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::persistence::KeyValueStore__Companion_obj::set__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, cpp::Function<void(bool, void * handler__context)>(data->args.a3), data->args.a4);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Html((hx::Object *)data->args.a0, true))->toPlainText());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -501,29 +523,29 @@ void borogove_persistence_key_value_store_set(void *a0, const char *a1, const ch
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4} };
+	Data data = { {a0} };
 
-	// queue a callback to execute set__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute toPlainText() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_chat_id(void *a0) {
+void borogove_persistence_media_store_has_media(void *a0, const char *a1, const unsigned char *a2, size_t a3, void (*a4) (bool, void *handler__context), void *a5) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->chatId__fromC());
+		return borogove::persistence::MediaStore__Companion_obj::hasMedia__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, cpp::Function<void(bool, void * handler__context)>(a4), a5);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; const char * a1; const unsigned char* a2; size_t a3; void (* a4) (bool, void * handler__context); void* a5;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->chatId__fromC());
+				borogove::persistence::MediaStore__Companion_obj::hasMedia__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, cpp::Function<void(bool, void * handler__context)>(data->args.a4), data->args.a5);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -536,30 +558,28 @@ const char *borogove_chat_chat_id(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2, a3, a4, a5} };
 
-	// queue a callback to execute chatId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute hasMedia__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-enum borogove_ui_state borogove_chat_ui_state(void *a0) {
+void borogove_persistence_media_store_remove_media(void *a0, const char *a1, const unsigned char *a2, size_t a3, void (*a4) (bool, void *handler__context), void *a5) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return static_cast<enum borogove_ui_state>((borogove::Chat((hx::Object *)a0, true))->uiState__fromC());
+		return borogove::persistence::MediaStore__Companion_obj::removeMedia__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, cpp::Function<void(bool, void * handler__context)>(a4), a5);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; const char * a1; const unsigned char* a2; size_t a3; void (* a4) (bool, void * handler__context); void* a5;} args;
 		HxSemaphore lock;
-		enum borogove_ui_state ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = static_cast<enum borogove_ui_state>((borogove::Chat((hx::Object *)data->args.a0, true))->uiState__fromC());
+				borogove::persistence::MediaStore__Companion_obj::removeMedia__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, cpp::Function<void(bool, void * handler__context)>(data->args.a4), data->args.a5);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -572,30 +592,28 @@ enum borogove_ui_state borogove_chat_ui_state(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2, a3, a4, a5} };
 
-	// queue a callback to execute uiState__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute removeMedia__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_is_blocked(void *a0) {
+void borogove_persistence_media_store_store_media(void *a0, const char *a1, const unsigned char *a2, size_t a3, void (*a4) (bool, void *handler__context), void *a5) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->isBlocked__fromC();
+		return borogove::persistence::MediaStore__Companion_obj::storeMedia__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, cpp::Function<void(bool, void * handler__context)>(a4), a5);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; const char * a1; const unsigned char* a2; size_t a3; void (* a4) (bool, void * handler__context); void* a5;} args;
 		HxSemaphore lock;
-		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->isBlocked__fromC();
+				borogove::persistence::MediaStore__Companion_obj::storeMedia__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, cpp::Function<void(bool, void * handler__context)>(data->args.a4), data->args.a5);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -608,21 +626,20 @@ bool borogove_chat_is_blocked(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2, a3, a4, a5} };
 
-	// queue a callback to execute isBlocked__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute storeMedia__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_chat_last_message(void *a0) {
+void *borogove_persistence_media_store_fs_new(const char *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)a0, true))->lastMessage__fromC());
+		return HaxeCBridge::retainHaxeObject(borogove::persistence::MediaStoreFS_obj::__new(a0));
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {const char * a0;} args;
 		HxSemaphore lock;
 		void * ret;
 	};
@@ -631,7 +648,7 @@ void *borogove_chat_last_message(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)data->args.a0, true))->lastMessage__fromC());
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::persistence::MediaStoreFS_obj::__new(data->args.a0));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -646,28 +663,27 @@ void *borogove_chat_last_message(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute lastMessage__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute new() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_is_bookmarked(void *a0) {
+void borogove_persistence_media_store_fs_get_media_path(void *a0, const char *a1, void (*a2) (const char*, void *handler__context), void *a3) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->isBookmarked__fromC();
+		return (borogove::persistence::MediaStoreFS((hx::Object *)a0, true))->getMediaPath__fromC(a1, cpp::Function<void(const char*, void * handler__context)>(a2), a3);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; const char * a1; void (* a2) (const char*, void * handler__context); void* a3;} args;
 		HxSemaphore lock;
-		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->isBookmarked__fromC();
+				(borogove::persistence::MediaStoreFS((hx::Object *)data->args.a0, true))->getMediaPath__fromC(data->args.a1, cpp::Function<void(const char*, void * handler__context)>(data->args.a2), data->args.a3);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -680,21 +696,20 @@ bool borogove_chat_is_bookmarked(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2, a3} };
 
-	// queue a callback to execute isBookmarked__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute getMediaPath__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_get_messages_before(void *a0, const char *a1, const char *a2, void (*a3) (void**, size_t, void *handler__context), void *a4) {
+void borogove_persistence_key_value_store_get(void *a0, const char *a1, void (*a2) (const char*, void *handler__context), void *a3) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->getMessagesBefore__fromC(a1, a2, cpp::Function<void(void**, size_t, void * handler__context)>(a3), a4);
+		return borogove::persistence::KeyValueStore__Companion_obj::get__fromC(Dynamic((hx::Object *)a0), a1, cpp::Function<void(const char*, void * handler__context)>(a2), a3);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2; void (* a3) (void**, size_t, void * handler__context); void* a4;} args;
+		struct {void * a0; const char * a1; void (* a2) (const char*, void * handler__context); void* a3;} args;
 		HxSemaphore lock;
 	};
 	struct Callback {
@@ -702,7 +717,7 @@ void borogove_chat_get_messages_before(void *a0, const char *a1, const char *a2,
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->getMessagesBefore__fromC(data->args.a1, data->args.a2, cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a3), data->args.a4);
+				borogove::persistence::KeyValueStore__Companion_obj::get__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, cpp::Function<void(const char*, void * handler__context)>(data->args.a2), data->args.a3);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -715,20 +730,20 @@ void borogove_chat_get_messages_before(void *a0, const char *a1, const char *a2,
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4} };
+	Data data = { {a0, a1, a2, a3} };
 
-	// queue a callback to execute getMessagesBefore__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute get__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_get_messages_after(void *a0, const char *a1, const char *a2, void (*a3) (void**, size_t, void *handler__context), void *a4) {
+void borogove_persistence_key_value_store_set(void *a0, const char *a1, const char *a2, void (*a3) (bool, void *handler__context), void *a4) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->getMessagesAfter__fromC(a1, a2, cpp::Function<void(void**, size_t, void * handler__context)>(a3), a4);
+		return borogove::persistence::KeyValueStore__Companion_obj::set__fromC(Dynamic((hx::Object *)a0), a1, a2, cpp::Function<void(bool, void * handler__context)>(a3), a4);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2; void (* a3) (void**, size_t, void * handler__context); void* a4;} args;
+		struct {void * a0; const char * a1; const char * a2; void (* a3) (bool, void * handler__context); void* a4;} args;
 		HxSemaphore lock;
 	};
 	struct Callback {
@@ -736,7 +751,7 @@ void borogove_chat_get_messages_after(void *a0, const char *a1, const char *a2,
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->getMessagesAfter__fromC(data->args.a1, data->args.a2, cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a3), data->args.a4);
+				borogove::persistence::KeyValueStore__Companion_obj::set__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, cpp::Function<void(bool, void * handler__context)>(data->args.a3), data->args.a4);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -751,26 +766,27 @@ void borogove_chat_get_messages_after(void *a0, const char *a1, const char *a2,
 
 	Data data = { {a0, a1, a2, a3, a4} };
 
-	// queue a callback to execute getMessagesAfter__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_get_messages_around(void *a0, const char *a1, const char *a2, void (*a3) (void**, size_t, void *handler__context), void *a4) {
+const char *borogove_chat_message_local_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->getMessagesAround__fromC(a1, a2, cpp::Function<void(void**, size_t, void * handler__context)>(a3), a4);
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->localId__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2; void (* a3) (void**, size_t, void * handler__context); void* a4;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->getMessagesAround__fromC(data->args.a1, data->args.a2, cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a3), data->args.a4);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->localId__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -783,28 +799,30 @@ void borogove_chat_get_messages_around(void *a0, const char *a1, const char *a2,
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4} };
+	Data data = { {a0} };
 
-	// queue a callback to execute getMessagesAround__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute localId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_send_message(void *a0, void *a1) {
+const char *borogove_chat_message_server_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->sendMessage__fromC(Dynamic((hx::Object *)a1));
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->serverId__fromC());
 	}
 	struct Data {
-		struct {void * a0; void * a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->sendMessage__fromC(Dynamic((hx::Object *)data->args.a1));
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->serverId__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -817,28 +835,30 @@ void borogove_chat_send_message(void *a0, void *a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute sendMessage__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute serverId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_mark_read_up_to(void *a0, void *a1) {
+const char *borogove_chat_message_server_id_by(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->markReadUpTo__fromC(Dynamic((hx::Object *)a1));
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->serverIdBy__fromC());
 	}
 	struct Data {
-		struct {void * a0; void * a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->markReadUpTo__fromC(Dynamic((hx::Object *)data->args.a1));
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->serverIdBy__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -851,28 +871,30 @@ void borogove_chat_mark_read_up_to(void *a0, void *a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute markReadUpTo__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute serverIdBy__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_bookmark(void *a0) {
+enum borogove_message_type borogove_chat_message_type(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->bookmark__fromC();
+		return static_cast<enum borogove_message_type>((borogove::ChatMessage((hx::Object *)a0, true))->type__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
+		enum borogove_message_type ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->bookmark__fromC();
+				data->ret = static_cast<enum borogove_message_type>((borogove::ChatMessage((hx::Object *)data->args.a0, true))->type__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -887,27 +909,28 @@ void borogove_chat_bookmark(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute bookmark__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute type__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_chat_get_participants(void *a0, const char ***a1) {
+const char *borogove_chat_message_timestamp(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->getParticipants__fromC(a1);
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->timestamp__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char*** a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		size_t ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->getParticipants__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->timestamp__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -920,30 +943,30 @@ size_t borogove_chat_get_participants(void *a0, const char ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute getParticipants__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute timestamp__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_chat_get_participant_details(void *a0, const char *a1) {
+const char *borogove_chat_message_sender_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)a0, true))->getParticipantDetails__fromC(a1));
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->senderId__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char * a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		void * ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)data->args.a0, true))->getParticipantDetails__fromC(data->args.a1));
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->senderId__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -956,29 +979,30 @@ void *borogove_chat_get_participant_details(void *a0, const char *a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute getParticipantDetails__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute senderId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_correct_message(void *a0, const char *a1, void *a2) {
+void *borogove_chat_message_reply_to_message(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->correctMessage__fromC(a1, Dynamic((hx::Object *)a2));
+		return HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)a0, true))->replyToMessage__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char * a1; void * a2;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->correctMessage__fromC(data->args.a1, Dynamic((hx::Object *)data->args.a2));
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)data->args.a0, true))->replyToMessage__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -991,28 +1015,30 @@ void borogove_chat_correct_message(void *a0, const char *a1, void *a2) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute correctMessage__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute replyToMessage__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_add_reaction(void *a0, void *a1, void *a2) {
+const char *borogove_chat_message_thread_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->addReaction(Dynamic((hx::Object *)a1), Dynamic((hx::Object *)a2));
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->threadId__fromC());
 	}
 	struct Data {
-		struct {void * a0; void * a1; void * a2;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->addReaction(Dynamic((hx::Object *)data->args.a1), Dynamic((hx::Object *)data->args.a2));
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->threadId__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1025,28 +1051,30 @@ void borogove_chat_add_reaction(void *a0, void *a1, void *a2) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute addReaction() on the main thread and wait until execution completes
+	// queue a callback to execute threadId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_remove_reaction(void *a0, void *a1, void *a2) {
+size_t borogove_chat_message_attachments(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->removeReaction__fromC(Dynamic((hx::Object *)a1), Dynamic((hx::Object *)a2));
+		return (borogove::ChatMessage((hx::Object *)a0, true))->attachments__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; void * a1; void * a2;} args;
+		struct {void * a0; void*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->removeReaction__fromC(Dynamic((hx::Object *)data->args.a1), Dynamic((hx::Object *)data->args.a2));
+				data->ret = (borogove::ChatMessage((hx::Object *)data->args.a0, true))->attachments__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1059,28 +1087,30 @@ void borogove_chat_remove_reaction(void *a0, void *a1, void *a2) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute removeReaction__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute attachments__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_typing(void *a0, const char *a1, const char *a2) {
+size_t borogove_chat_message_reaction_keys(void *a0, const char ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->typing(a1, a2);
+		return (borogove::ChatMessage((hx::Object *)a0, true))->reactionKeys__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2;} args;
+		struct {void * a0; const char*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->typing(data->args.a1, data->args.a2);
+				data->ret = (borogove::ChatMessage((hx::Object *)data->args.a0, true))->reactionKeys__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1093,28 +1123,30 @@ void borogove_chat_typing(void *a0, const char *a1, const char *a2) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute typing() on the main thread and wait until execution completes
+	// queue a callback to execute reactionKeys__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_set_active(void *a0, bool a1, const char *a2) {
+size_t borogove_chat_message_reaction_details(void *a0, const char *a1, void ***a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->setActive(a1, a2);
+		return (borogove::ChatMessage((hx::Object *)a0, true))->reactionDetails__fromC(a1, a2);
 	}
 	struct Data {
-		struct {void * a0; bool a1; const char * a2;} args;
+		struct {void * a0; const char * a1; void*** a2;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->setActive(data->args.a1, data->args.a2);
+				data->ret = (borogove::ChatMessage((hx::Object *)data->args.a0, true))->reactionDetails__fromC(data->args.a1, data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1129,26 +1161,28 @@ void borogove_chat_set_active(void *a0, bool a1, const char *a2) {
 
 	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute setActive() on the main thread and wait until execution completes
+	// queue a callback to execute reactionDetails__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_close(void *a0) {
+const char *borogove_chat_message_lang(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->close__fromC();
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->lang__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->close__fromC();
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->lang__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1163,26 +1197,28 @@ void borogove_chat_close(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute close__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute lang__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_toggle_pinned(void *a0) {
+enum borogove_message_direction borogove_chat_message_direction(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->togglePinned();
+		return static_cast<enum borogove_message_direction>((borogove::ChatMessage((hx::Object *)a0, true))->direction__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
+		enum borogove_message_direction ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->togglePinned();
+				data->ret = static_cast<enum borogove_message_direction>((borogove::ChatMessage((hx::Object *)data->args.a0, true))->direction__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1197,26 +1233,28 @@ void borogove_chat_toggle_pinned(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute togglePinned() on the main thread and wait until execution completes
+	// queue a callback to execute direction__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_block(void *a0, bool a1, void *a2, bool a3) {
+enum borogove_message_status borogove_chat_message_status(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->block(a1, Dynamic((hx::Object *)a2), a3);
+		return static_cast<enum borogove_message_status>((borogove::ChatMessage((hx::Object *)a0, true))->status__fromC());
 	}
 	struct Data {
-		struct {void * a0; bool a1; void * a2; bool a3;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		enum borogove_message_status ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->block(data->args.a1, Dynamic((hx::Object *)data->args.a2), data->args.a3);
+				data->ret = static_cast<enum borogove_message_status>((borogove::ChatMessage((hx::Object *)data->args.a0, true))->status__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1229,28 +1267,30 @@ void borogove_chat_block(void *a0, bool a1, void *a2, bool a3) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3} };
+	Data data = { {a0} };
 
-	// queue a callback to execute block() on the main thread and wait until execution completes
+	// queue a callback to execute status__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_unblock(void *a0, bool a1) {
+const char *borogove_chat_message_status_text(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->unblock(a1);
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->statusText__fromC());
 	}
 	struct Data {
-		struct {void * a0; bool a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->unblock(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->statusText__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1263,28 +1303,30 @@ void borogove_chat_unblock(void *a0, bool a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute unblock() on the main thread and wait until execution completes
+	// queue a callback to execute statusText__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_set_notifications(void *a0, bool a1, bool a2, bool a3) {
+size_t borogove_chat_message_versions(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->setNotifications(a1, a2, a3);
+		return (borogove::ChatMessage((hx::Object *)a0, true))->versions__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; bool a1; bool a2; bool a3;} args;
+		struct {void * a0; void*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->setNotifications(data->args.a1, data->args.a2, data->args.a3);
+				data->ret = (borogove::ChatMessage((hx::Object *)data->args.a0, true))->versions__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1297,29 +1339,30 @@ void borogove_chat_set_notifications(void *a0, bool a1, bool a2, bool a3) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute setNotifications() on the main thread and wait until execution completes
+	// queue a callback to execute versions__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_notifications_filtered(void *a0) {
+void *borogove_chat_message_encryption(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->notificationsFiltered();
+		return HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)a0, true))->encryption__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		bool ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->notificationsFiltered();
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)data->args.a0, true))->encryption__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1334,28 +1377,28 @@ bool borogove_chat_notifications_filtered(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute notificationsFiltered() on the main thread and wait until execution completes
+	// queue a callback to execute encryption__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_notify_mention(void *a0) {
+size_t borogove_chat_message_link_metadata(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->notifyMention();
+		return (borogove::ChatMessage((hx::Object *)a0, true))->linkMetadata__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void*** a1;} args;
 		HxSemaphore lock;
-		bool ret;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->notifyMention();
+				data->ret = (borogove::ChatMessage((hx::Object *)data->args.a0, true))->linkMetadata__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1368,30 +1411,30 @@ bool borogove_chat_notify_mention(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute notifyMention() on the main thread and wait until execution completes
+	// queue a callback to execute linkMetadata__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_notify_reply(void *a0) {
+void *borogove_chat_message_reply(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->notifyReply();
+		return HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)a0, true))->reply());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		bool ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->notifyReply();
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)data->args.a0, true))->reply());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1406,28 +1449,28 @@ bool borogove_chat_notify_reply(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute notifyReply() on the main thread and wait until execution completes
+	// queue a callback to execute reply() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_last_message_id(void *a0) {
+void *borogove_chat_message_body(void *a0, void *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->lastMessageId__fromC());
+		return HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)a0, true))->body(Dynamic((hx::Object *)a1)));
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1;} args;
 		HxSemaphore lock;
-		const char * ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->lastMessageId__fromC());
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)data->args.a0, true))->body(Dynamic((hx::Object *)data->args.a1)));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1440,18 +1483,18 @@ const char *borogove_chat_last_message_id(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute lastMessageId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute body() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_get_photo(void *a0) {
+const char *borogove_chat_message_subject(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->getPhoto());
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->subject());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -1463,7 +1506,7 @@ const char *borogove_chat_get_photo(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->getPhoto());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->subject());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1478,16 +1521,16 @@ const char *borogove_chat_get_photo(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute getPhoto() on the main thread and wait until execution completes
+	// queue a callback to execute subject() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_get_placeholder(void *a0) {
+const char *borogove_chat_message_chat_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->getPlaceholder());
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->chatId());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -1499,7 +1542,7 @@ const char *borogove_chat_get_placeholder(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->getPlaceholder());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->chatId());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1514,16 +1557,16 @@ const char *borogove_chat_get_placeholder(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute getPlaceholder() on the main thread and wait until execution completes
+	// queue a callback to execute chatId() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_read_up_to(void *a0) {
+const char *borogove_chat_message_account(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->readUpTo());
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->account());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -1535,7 +1578,7 @@ const char *borogove_chat_read_up_to(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->readUpTo());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->account());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1550,28 +1593,28 @@ const char *borogove_chat_read_up_to(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute readUpTo() on the main thread and wait until execution completes
+	// queue a callback to execute account() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-int borogove_chat_unread_count(void *a0) {
+void *borogove_chat_message_sender_member_stub(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->unreadCount();
+		return HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)a0, true))->senderMemberStub());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		int ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->unreadCount();
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)data->args.a0, true))->senderMemberStub());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1586,28 +1629,28 @@ int borogove_chat_unread_count(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute unreadCount() on the main thread and wait until execution completes
+	// queue a callback to execute senderMemberStub() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_preview(void *a0) {
+bool borogove_chat_message_can_replace(void *a0, void *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->preview());
+		return (borogove::ChatMessage((hx::Object *)a0, true))->canReplace(Dynamic((hx::Object *)a1));
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1;} args;
 		HxSemaphore lock;
-		const char * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->preview());
+				data->ret = (borogove::ChatMessage((hx::Object *)data->args.a0, true))->canReplace(Dynamic((hx::Object *)data->args.a1));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1620,29 +1663,30 @@ const char *borogove_chat_preview(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute preview() on the main thread and wait until execution completes
+	// queue a callback to execute canReplace() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_set_display_name(void *a0, const char *a1) {
+bool borogove_chat_message_is_incoming(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->setDisplayName(a1);
+		return (borogove::ChatMessage((hx::Object *)a0, true))->isIncoming();
 	}
 	struct Data {
-		struct {void * a0; const char * a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->setDisplayName(data->args.a1);
+				data->ret = (borogove::ChatMessage((hx::Object *)data->args.a0, true))->isIncoming();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1655,17 +1699,18 @@ void borogove_chat_set_display_name(void *a0, const char *a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute setDisplayName() on the main thread and wait until execution completes
+	// queue a callback to execute isIncoming() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_get_display_name(void *a0) {
+const char *borogove_chat_message_thread_icon(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->getDisplayName());
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->threadIcon());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -1677,7 +1722,7 @@ const char *borogove_chat_get_display_name(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->getDisplayName());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->threadIcon());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1692,27 +1737,28 @@ const char *borogove_chat_get_display_name(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute getDisplayName() on the main thread and wait until execution completes
+	// queue a callback to execute threadIcon() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_set_trusted(void *a0, bool a1) {
+const char *borogove_chat_message_moderation_reason(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->setTrusted(a1);
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->moderationReason());
 	}
 	struct Data {
-		struct {void * a0; bool a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->setTrusted(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->moderationReason());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1725,29 +1771,30 @@ void borogove_chat_set_trusted(void *a0, bool a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute setTrusted() on the main thread and wait until execution completes
+	// queue a callback to execute moderationReason() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_is_trusted(void *a0) {
+const char *borogove_chat_message_call_status(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->isTrusted();
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->callStatus());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		bool ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->isTrusted();
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->callStatus());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1762,28 +1809,28 @@ bool borogove_chat_is_trusted(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute isTrusted() on the main thread and wait until execution completes
+	// queue a callback to execute callStatus() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_syncing(void *a0) {
+const char *borogove_chat_message_call_sid(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->syncing();
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->callSid());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		bool ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->syncing();
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->callSid());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1798,28 +1845,28 @@ bool borogove_chat_syncing(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute syncing() on the main thread and wait until execution completes
+	// queue a callback to execute callSid() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_can_audio_call(void *a0) {
+const char *borogove_chat_message_call_duration(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->canAudioCall();
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->callDuration());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		bool ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->canAudioCall();
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->callDuration());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1834,28 +1881,28 @@ bool borogove_chat_can_audio_call(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute canAudioCall() on the main thread and wait until execution completes
+	// queue a callback to execute callDuration() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_can_video_call(void *a0) {
+void *borogove_chat_attachment_create(const char *a0, const char *a1, int a2, const char *a3) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->canVideoCall();
+		return HaxeCBridge::retainHaxeObject(borogove::ChatAttachment_obj::create(a0, a1, a2, a3));
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {const char * a0; const char * a1; int a2; const char * a3;} args;
 		HxSemaphore lock;
-		bool ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->canVideoCall();
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::ChatAttachment_obj::create(data->args.a0, data->args.a1, data->args.a2, data->args.a3));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1868,30 +1915,30 @@ bool borogove_chat_can_video_call(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2, a3} };
 
-	// queue a callback to execute canVideoCall() on the main thread and wait until execution completes
+	// queue a callback to execute create() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_chat_start_call(void *a0, bool a1, bool a2) {
+const char *borogove_chat_attachment_name(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)a0, true))->startCall(a1, a2));
+		return HaxeCBridge::retainHaxeString((borogove::ChatAttachment((hx::Object *)a0, true))->name__fromC());
 	}
 	struct Data {
-		struct {void * a0; bool a1; bool a2;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		void * ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)data->args.a0, true))->startCall(data->args.a1, data->args.a2));
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatAttachment((hx::Object *)data->args.a0, true))->name__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1904,29 +1951,30 @@ void *borogove_chat_start_call(void *a0, bool a1, bool a2) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute startCall() on the main thread and wait until execution completes
+	// queue a callback to execute name__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_accept_call(void *a0) {
+const char *borogove_chat_attachment_mime(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->acceptCall();
+		return HaxeCBridge::retainHaxeString((borogove::ChatAttachment((hx::Object *)a0, true))->mime__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->acceptCall();
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatAttachment((hx::Object *)data->args.a0, true))->mime__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1941,26 +1989,28 @@ void borogove_chat_accept_call(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute acceptCall() on the main thread and wait until execution completes
+	// queue a callback to execute mime__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_hangup(void *a0) {
+int borogove_chat_attachment_size(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->hangup();
+		return (borogove::ChatAttachment((hx::Object *)a0, true))->size__fromC();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
+		int ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->hangup();
+				data->ret = (borogove::ChatAttachment((hx::Object *)data->args.a0, true))->size__fromC();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -1975,27 +2025,28 @@ void borogove_chat_hangup(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute hangup() on the main thread and wait until execution completes
+	// queue a callback to execute size__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-enum borogove_calls_call_status borogove_chat_call_status(void *a0) {
+size_t borogove_chat_attachment_uris(void *a0, const char ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return static_cast<enum borogove_calls_call_status>((borogove::Chat((hx::Object *)a0, true))->callStatus());
+		return (borogove::ChatAttachment((hx::Object *)a0, true))->uris__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; const char*** a1;} args;
 		HxSemaphore lock;
-		enum borogove_calls_call_status ret;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = static_cast<enum borogove_calls_call_status>((borogove::Chat((hx::Object *)data->args.a0, true))->callStatus());
+				data->ret = (borogove::ChatAttachment((hx::Object *)data->args.a0, true))->uris__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2008,30 +2059,30 @@ enum borogove_calls_call_status borogove_chat_call_status(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute callStatus() on the main thread and wait until execution completes
+	// queue a callback to execute uris__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_chat_dtmf(void *a0) {
+size_t borogove_chat_attachment_hashes(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)a0, true))->dtmf());
+		return (borogove::ChatAttachment((hx::Object *)a0, true))->hashes__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void*** a1;} args;
 		HxSemaphore lock;
-		void * ret;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)data->args.a0, true))->dtmf());
+				data->ret = (borogove::ChatAttachment((hx::Object *)data->args.a0, true))->hashes__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2044,30 +2095,30 @@ void *borogove_chat_dtmf(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute dtmf() on the main thread and wait until execution completes
+	// queue a callback to execute hashes__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_chat_video_tracks(void *a0, void ***a1) {
+void *borogove_hash_from_hex(const char *a0, const char *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->videoTracks__fromC(a1);
+		return HaxeCBridge::retainHaxeObject(borogove::Hash_obj::fromHex(a0, a1));
 	}
 	struct Data {
-		struct {void * a0; void*** a1;} args;
+		struct {const char * a0; const char * a1;} args;
 		HxSemaphore lock;
-		size_t ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->videoTracks__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::Hash_obj::fromHex(data->args.a0, data->args.a1));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2082,28 +2133,28 @@ size_t borogove_chat_video_tracks(void *a0, void ***a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute videoTracks__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute fromHex() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_encryption_mode(void *a0) {
+void *borogove_hash_from_uri(const char *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->encryptionMode());
+		return HaxeCBridge::retainHaxeObject(borogove::Hash_obj::fromUri(a0));
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {const char * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->encryptionMode());
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::Hash_obj::fromUri(data->args.a0));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2118,28 +2169,28 @@ const char *borogove_chat_encryption_mode(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute encryptionMode() on the main thread and wait until execution completes
+	// queue a callback to execute fromUri() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_can_send(void *a0) {
+const char *borogove_hash_algorithm(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->canSend();
+		return HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)a0, true))->algorithm__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		bool ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->canSend();
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)data->args.a0, true))->algorithm__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2154,27 +2205,28 @@ bool borogove_chat_can_send(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute canSend() on the main thread and wait until execution completes
+	// queue a callback to execute algorithm__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_invite(void *a0, void *a1, const char *a2) {
+const char *borogove_hash_to_uri(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->invite(Dynamic((hx::Object *)a1), a2);
+		return HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)a0, true))->toUri());
 	}
 	struct Data {
-		struct {void * a0; void * a1; const char * a2;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->invite(Dynamic((hx::Object *)data->args.a1), data->args.a2);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)data->args.a0, true))->toUri());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2187,29 +2239,30 @@ void borogove_chat_invite(void *a0, void *a1, const char *a2) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute invite() on the main thread and wait until execution completes
+	// queue a callback to execute toUri() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_can_invite(void *a0) {
+const char *borogove_hash_to_hex(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->canInvite();
+		return HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)a0, true))->toHex());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		bool ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->canInvite();
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)data->args.a0, true))->toHex());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2224,28 +2277,28 @@ bool borogove_chat_can_invite(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute canInvite() on the main thread and wait until execution completes
+	// queue a callback to execute toHex() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_is_app(void *a0) {
+const char *borogove_hash_to_base_64(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->isApp();
+		return HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)a0, true))->toBase64());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		bool ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->isApp();
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)data->args.a0, true))->toBase64());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2260,28 +2313,28 @@ bool borogove_chat_is_app(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute isApp() on the main thread and wait until execution completes
+	// queue a callback to execute toBase64() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_has_commands(void *a0) {
+const char *borogove_hash_to_base_64_url(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->hasCommands();
+		return HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)a0, true))->toBase64Url());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		bool ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->hasCommands();
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)data->args.a0, true))->toBase64Url());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2296,27 +2349,28 @@ bool borogove_chat_has_commands(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute hasCommands() on the main thread and wait until execution completes
+	// queue a callback to execute toBase64Url() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_commands(void *a0, void (*a1) (void**, size_t, void *handler__context), void *a2) {
+void *borogove_reaction_unicode(const char *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Chat((hx::Object *)a0, true))->commands__fromC(cpp::Function<void(void**, size_t, void * handler__context)>(a1), a2);
+		return HaxeCBridge::retainHaxeObject(borogove::Reaction_obj::unicode(a0));
 	}
 	struct Data {
-		struct {void * a0; void (* a1) (void**, size_t, void * handler__context); void* a2;} args;
+		struct {const char * a0;} args;
 		HxSemaphore lock;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Chat((hx::Object *)data->args.a0, true))->commands__fromC(cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a1), data->args.a2);
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::Reaction_obj::unicode(data->args.a0));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2329,29 +2383,30 @@ void borogove_chat_commands(void *a0, void (*a1) (void**, size_t, void *handler_
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute commands__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute unicode() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_chat_invited_by(void *a0) {
+const char *borogove_reaction_sender_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)a0, true))->invitedBy());
+		return HaxeCBridge::retainHaxeString((borogove::Reaction((hx::Object *)a0, true))->senderId__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		void * ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)data->args.a0, true))->invitedBy());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Reaction((hx::Object *)data->args.a0, true))->senderId__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2366,16 +2421,16 @@ void *borogove_chat_invited_by(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute invitedBy() on the main thread and wait until execution completes
+	// queue a callback to execute senderId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_local_id(void *a0) {
+const char *borogove_reaction_timestamp(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->localId__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::Reaction((hx::Object *)a0, true))->timestamp__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -2387,7 +2442,7 @@ const char *borogove_chat_message_local_id(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->localId__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Reaction((hx::Object *)data->args.a0, true))->timestamp__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2402,16 +2457,16 @@ const char *borogove_chat_message_local_id(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute localId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute timestamp__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_server_id(void *a0) {
+const char *borogove_reaction_key(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->serverId__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::Reaction((hx::Object *)a0, true))->key__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -2423,7 +2478,7 @@ const char *borogove_chat_message_server_id(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->serverId__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Reaction((hx::Object *)data->args.a0, true))->key__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2438,28 +2493,28 @@ const char *borogove_chat_message_server_id(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute serverId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute key__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_server_id_by(void *a0) {
+enum borogove_encryption_status borogove_encryption_info_status(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->serverIdBy__fromC());
+		return static_cast<enum borogove_encryption_status>((borogove::EncryptionInfo((hx::Object *)a0, true))->status__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		enum borogove_encryption_status ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->serverIdBy__fromC());
+				data->ret = static_cast<enum borogove_encryption_status>((borogove::EncryptionInfo((hx::Object *)data->args.a0, true))->status__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2474,28 +2529,28 @@ const char *borogove_chat_message_server_id_by(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute serverIdBy__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute status__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-enum borogove_message_type borogove_chat_message_type(void *a0) {
+const char *borogove_encryption_info_method(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return static_cast<enum borogove_message_type>((borogove::ChatMessage((hx::Object *)a0, true))->type__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)a0, true))->method__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		enum borogove_message_type ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = static_cast<enum borogove_message_type>((borogove::ChatMessage((hx::Object *)data->args.a0, true))->type__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)data->args.a0, true))->method__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2510,16 +2565,16 @@ enum borogove_message_type borogove_chat_message_type(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute type__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute method__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_timestamp(void *a0) {
+const char *borogove_encryption_info_method_name(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->timestamp__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)a0, true))->methodName__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -2531,7 +2586,7 @@ const char *borogove_chat_message_timestamp(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->timestamp__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)data->args.a0, true))->methodName__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2546,16 +2601,16 @@ const char *borogove_chat_message_timestamp(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute timestamp__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute methodName__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_sender_id(void *a0) {
+const char *borogove_encryption_info_reason(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->senderId__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)a0, true))->reason__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -2567,7 +2622,7 @@ const char *borogove_chat_message_sender_id(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->senderId__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)data->args.a0, true))->reason__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2582,28 +2637,28 @@ const char *borogove_chat_message_sender_id(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute senderId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute reason__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_chat_message_reply_to_message(void *a0) {
+const char *borogove_encryption_info_reason_text(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)a0, true))->replyToMessage__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)a0, true))->reasonText__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		void * ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)data->args.a0, true))->replyToMessage__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)data->args.a0, true))->reasonText__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2618,16 +2673,16 @@ void *borogove_chat_message_reply_to_message(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute replyToMessage__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute reasonText__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_thread_id(void *a0) {
+const char *borogove_link_metadata_about(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->threadId__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::LinkMetadata((hx::Object *)a0, true))->about__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -2639,7 +2694,7 @@ const char *borogove_chat_message_thread_id(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->threadId__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::LinkMetadata((hx::Object *)data->args.a0, true))->about__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2654,28 +2709,28 @@ const char *borogove_chat_message_thread_id(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute threadId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute about__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_chat_message_attachments(void *a0, void ***a1) {
+const char *borogove_link_metadata_url(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessage((hx::Object *)a0, true))->attachments__fromC(a1);
+		return HaxeCBridge::retainHaxeString((borogove::LinkMetadata((hx::Object *)a0, true))->url__fromC());
 	}
 	struct Data {
-		struct {void * a0; void*** a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		size_t ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ChatMessage((hx::Object *)data->args.a0, true))->attachments__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::LinkMetadata((hx::Object *)data->args.a0, true))->url__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2688,30 +2743,30 @@ size_t borogove_chat_message_attachments(void *a0, void ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute attachments__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute url__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_chat_message_reaction_keys(void *a0, const char ***a1) {
+const char *borogove_link_metadata_title(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessage((hx::Object *)a0, true))->reactionKeys__fromC(a1);
+		return HaxeCBridge::retainHaxeString((borogove::LinkMetadata((hx::Object *)a0, true))->title__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char*** a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		size_t ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ChatMessage((hx::Object *)data->args.a0, true))->reactionKeys__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::LinkMetadata((hx::Object *)data->args.a0, true))->title__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2724,30 +2779,30 @@ size_t borogove_chat_message_reaction_keys(void *a0, const char ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute reactionKeys__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute title__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_chat_message_reaction_details(void *a0, const char *a1, void ***a2) {
+const char *borogove_link_metadata_description(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessage((hx::Object *)a0, true))->reactionDetails__fromC(a1, a2);
+		return HaxeCBridge::retainHaxeString((borogove::LinkMetadata((hx::Object *)a0, true))->description__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char * a1; void*** a2;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		size_t ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ChatMessage((hx::Object *)data->args.a0, true))->reactionDetails__fromC(data->args.a1, data->args.a2);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::LinkMetadata((hx::Object *)data->args.a0, true))->description__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2760,30 +2815,30 @@ size_t borogove_chat_message_reaction_details(void *a0, const char *a1, void ***
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute reactionDetails__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute description__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_text(void *a0) {
+size_t borogove_link_metadata_image(void *a0, const char ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->text__fromC());
+		return (borogove::LinkMetadata((hx::Object *)a0, true))->image__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; const char*** a1;} args;
 		HxSemaphore lock;
-		const char * ret;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->text__fromC());
+				data->ret = (borogove::LinkMetadata((hx::Object *)data->args.a0, true))->image__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2796,30 +2851,30 @@ const char *borogove_chat_message_text(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute text__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute image__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_lang(void *a0) {
+size_t borogove_link_metadata_video(void *a0, const char ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->lang__fromC());
+		return (borogove::LinkMetadata((hx::Object *)a0, true))->video__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; const char*** a1;} args;
 		HxSemaphore lock;
-		const char * ret;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->lang__fromC());
+				data->ret = (borogove::LinkMetadata((hx::Object *)data->args.a0, true))->video__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2832,30 +2887,29 @@ const char *borogove_chat_message_lang(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute lang__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute video__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-enum borogove_message_direction borogove_chat_message_direction(void *a0) {
+void borogove_event_emitter_remove_event_listener(void *a0, borogove_event_handler_token a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return static_cast<enum borogove_message_direction>((borogove::ChatMessage((hx::Object *)a0, true))->direction__fromC());
+		return (borogove::EventEmitter((hx::Object *)a0, true))->removeEventListener(a1);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; borogove_event_handler_token a1;} args;
 		HxSemaphore lock;
-		enum borogove_message_direction ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = static_cast<enum borogove_message_direction>((borogove::ChatMessage((hx::Object *)data->args.a0, true))->direction__fromC());
+				(borogove::EventEmitter((hx::Object *)data->args.a0, true))->removeEventListener(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2868,30 +2922,29 @@ enum borogove_message_direction borogove_chat_message_direction(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute direction__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute removeEventListener() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-enum borogove_message_status borogove_chat_message_status(void *a0) {
+void *borogove_chat_status(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return static_cast<enum borogove_message_status>((borogove::ChatMessage((hx::Object *)a0, true))->status__fromC());
+		return HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)a0, true))->status__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		enum borogove_message_status ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = static_cast<enum borogove_message_status>((borogove::ChatMessage((hx::Object *)data->args.a0, true))->status__fromC());
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)data->args.a0, true))->status__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2913,9 +2966,9 @@ enum borogove_message_status borogove_chat_message_status(void *a0) {
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_status_text(void *a0) {
+const char *borogove_chat_chat_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->statusText__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->chatId__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -2927,7 +2980,7 @@ const char *borogove_chat_message_status_text(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->statusText__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->chatId__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2942,28 +2995,28 @@ const char *borogove_chat_message_status_text(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute statusText__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute chatId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_chat_message_versions(void *a0, void ***a1) {
+enum borogove_ui_state borogove_chat_ui_state(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessage((hx::Object *)a0, true))->versions__fromC(a1);
+		return static_cast<enum borogove_ui_state>((borogove::Chat((hx::Object *)a0, true))->uiState__fromC());
 	}
 	struct Data {
-		struct {void * a0; void*** a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		size_t ret;
+		enum borogove_ui_state ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ChatMessage((hx::Object *)data->args.a0, true))->versions__fromC(data->args.a1);
+				data->ret = static_cast<enum borogove_ui_state>((borogove::Chat((hx::Object *)data->args.a0, true))->uiState__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -2976,30 +3029,30 @@ size_t borogove_chat_message_versions(void *a0, void ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute versions__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute uiState__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_chat_message_encryption(void *a0) {
+bool borogove_chat_is_blocked(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)a0, true))->encryption__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->isBlocked__fromC();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		void * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)data->args.a0, true))->encryption__fromC());
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->isBlocked__fromC();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3014,16 +3067,16 @@ void *borogove_chat_message_encryption(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute encryption__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute isBlocked__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_chat_message_reply(void *a0) {
+void *borogove_chat_last_message(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)a0, true))->reply());
+		return HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)a0, true))->lastMessage__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -3035,7 +3088,7 @@ void *borogove_chat_message_reply(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessage((hx::Object *)data->args.a0, true))->reply());
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)data->args.a0, true))->lastMessage__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3050,28 +3103,28 @@ void *borogove_chat_message_reply(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute reply() on the main thread and wait until execution completes
+	// queue a callback to execute lastMessage__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_html(void *a0, void *a1) {
+bool borogove_chat_is_bookmarked(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->html(Dynamic((hx::Object *)a1)));
+		return (borogove::Chat((hx::Object *)a0, true))->isBookmarked__fromC();
 	}
 	struct Data {
-		struct {void * a0; void * a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->html(Dynamic((hx::Object *)data->args.a1)));
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->isBookmarked__fromC();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3084,30 +3137,29 @@ const char *borogove_chat_message_html(void *a0, void *a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute html() on the main thread and wait until execution completes
+	// queue a callback to execute isBookmarked__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_chat_id(void *a0) {
+void borogove_chat_get_messages_before(void *a0, void *a1, void (*a2) (void**, size_t, void *handler__context), void *a3) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->chatId());
+		return (borogove::Chat((hx::Object *)a0, true))->getMessagesBefore__fromC(Dynamic((hx::Object *)a1), cpp::Function<void(void**, size_t, void * handler__context)>(a2), a3);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1; void (* a2) (void**, size_t, void * handler__context); void* a3;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->chatId());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->getMessagesBefore__fromC(Dynamic((hx::Object *)data->args.a1), cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a2), data->args.a3);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3120,30 +3172,28 @@ const char *borogove_chat_message_chat_id(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2, a3} };
 
-	// queue a callback to execute chatId() on the main thread and wait until execution completes
+	// queue a callback to execute getMessagesBefore__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_account(void *a0) {
+void borogove_chat_get_messages_after(void *a0, void *a1, void (*a2) (void**, size_t, void *handler__context), void *a3) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->account());
+		return (borogove::Chat((hx::Object *)a0, true))->getMessagesAfter__fromC(Dynamic((hx::Object *)a1), cpp::Function<void(void**, size_t, void * handler__context)>(a2), a3);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1; void (* a2) (void**, size_t, void * handler__context); void* a3;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->account());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->getMessagesAfter__fromC(Dynamic((hx::Object *)data->args.a1), cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a2), data->args.a3);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3156,30 +3206,28 @@ const char *borogove_chat_message_account(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2, a3} };
 
-	// queue a callback to execute account() on the main thread and wait until execution completes
+	// queue a callback to execute getMessagesAfter__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_chat_message_is_incoming(void *a0) {
+void borogove_chat_get_messages_around(void *a0, void *a1, void (*a2) (void**, size_t, void *handler__context), void *a3) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessage((hx::Object *)a0, true))->isIncoming();
+		return (borogove::Chat((hx::Object *)a0, true))->getMessagesAround__fromC(Dynamic((hx::Object *)a1), cpp::Function<void(void**, size_t, void * handler__context)>(a2), a3);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1; void (* a2) (void**, size_t, void * handler__context); void* a3;} args;
 		HxSemaphore lock;
-		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ChatMessage((hx::Object *)data->args.a0, true))->isIncoming();
+				(borogove::Chat((hx::Object *)data->args.a0, true))->getMessagesAround__fromC(Dynamic((hx::Object *)data->args.a1), cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a2), data->args.a3);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3192,30 +3240,28 @@ bool borogove_chat_message_is_incoming(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2, a3} };
 
-	// queue a callback to execute isIncoming() on the main thread and wait until execution completes
+	// queue a callback to execute getMessagesAround__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_thread_icon(void *a0) {
+void borogove_chat_send_message(void *a0, void *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->threadIcon());
+		return (borogove::Chat((hx::Object *)a0, true))->sendMessage__fromC(Dynamic((hx::Object *)a1));
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->threadIcon());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->sendMessage__fromC(Dynamic((hx::Object *)data->args.a1));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3228,30 +3274,28 @@ const char *borogove_chat_message_thread_icon(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute threadIcon() on the main thread and wait until execution completes
+	// queue a callback to execute sendMessage__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_call_status(void *a0) {
+void borogove_chat_mark_read_up_to(void *a0, void *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->callStatus());
+		return (borogove::Chat((hx::Object *)a0, true))->markReadUpTo__fromC(Dynamic((hx::Object *)a1));
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->callStatus());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->markReadUpTo__fromC(Dynamic((hx::Object *)data->args.a1));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3264,30 +3308,28 @@ const char *borogove_chat_message_call_status(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute callStatus() on the main thread and wait until execution completes
+	// queue a callback to execute markReadUpTo__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_call_sid(void *a0) {
+void borogove_chat_bookmark(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->callSid());
+		return (borogove::Chat((hx::Object *)a0, true))->bookmark__fromC();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->callSid());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->bookmark__fromC();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3302,28 +3344,26 @@ const char *borogove_chat_message_call_sid(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute callSid() on the main thread and wait until execution completes
+	// queue a callback to execute bookmark__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_call_duration(void *a0) {
+void borogove_chat_members(void *a0, void (*a1) (void**, size_t, void *handler__context), void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)a0, true))->callDuration());
+		return (borogove::Chat((hx::Object *)a0, true))->members__fromC(cpp::Function<void(void**, size_t, void * handler__context)>(a1), a2);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void (* a1) (void**, size_t, void * handler__context); void* a2;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessage((hx::Object *)data->args.a0, true))->callDuration());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->members__fromC(cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a1), data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3336,30 +3376,28 @@ const char *borogove_chat_message_call_duration(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute callDuration() on the main thread and wait until execution completes
+	// queue a callback to execute members__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_chat_attachment_create(const char *a0, const char *a1, int a2, const char *a3) {
+void borogove_chat_get_member_details(void *a0, const char *const *a1, size_t a2, void (*a3) (void**, size_t, void *handler__context), void *a4) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject(borogove::ChatAttachment_obj::create(a0, a1, a2, a3));
+		return (borogove::Chat((hx::Object *)a0, true))->getMemberDetails__fromC(a1, a2, cpp::Function<void(void**, size_t, void * handler__context)>(a3), a4);
 	}
 	struct Data {
-		struct {const char * a0; const char * a1; int a2; const char * a3;} args;
+		struct {void * a0; const char* const* a1; size_t a2; void (* a3) (void**, size_t, void * handler__context); void* a4;} args;
 		HxSemaphore lock;
-		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject(borogove::ChatAttachment_obj::create(data->args.a0, data->args.a1, data->args.a2, data->args.a3));
+				(borogove::Chat((hx::Object *)data->args.a0, true))->getMemberDetails__fromC(data->args.a1, data->args.a2, cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a3), data->args.a4);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3372,30 +3410,29 @@ void *borogove_chat_attachment_create(const char *a0, const char *a1, int a2, co
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3} };
+	Data data = { {a0, a1, a2, a3, a4} };
 
-	// queue a callback to execute create() on the main thread and wait until execution completes
+	// queue a callback to execute getMemberDetails__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_attachment_name(void *a0) {
+borogove_event_handler_token borogove_chat_add_members_updated_listener(void *a0, void (*a1) (void**, size_t, void*), void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatAttachment((hx::Object *)a0, true))->name__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->addMembersUpdatedListener__fromC(cpp::Function<void(void**, size_t, void*)>(a1), a2);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void (* a1) (void**, size_t, void*); void* a2;} args;
 		HxSemaphore lock;
-		const char * ret;
+		borogove_event_handler_token ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatAttachment((hx::Object *)data->args.a0, true))->name__fromC());
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->addMembersUpdatedListener__fromC(cpp::Function<void(void**, size_t, void*)>(data->args.a1), data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3408,30 +3445,30 @@ const char *borogove_chat_attachment_name(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute name__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute addMembersUpdatedListener__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_attachment_mime(void *a0) {
+size_t borogove_chat_available_roles(void *a0, void *a1, void ***a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatAttachment((hx::Object *)a0, true))->mime__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->availableRoles__fromC(Dynamic((hx::Object *)a1), a2);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1; void*** a2;} args;
 		HxSemaphore lock;
-		const char * ret;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatAttachment((hx::Object *)data->args.a0, true))->mime__fromC());
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->availableRoles__fromC(Dynamic((hx::Object *)data->args.a1), data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3444,30 +3481,30 @@ const char *borogove_chat_attachment_mime(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute mime__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute availableRoles__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-int borogove_chat_attachment_size(void *a0) {
+bool borogove_chat_can_remove_role(void *a0, void *a1, void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatAttachment((hx::Object *)a0, true))->size__fromC();
+		return (borogove::Chat((hx::Object *)a0, true))->canRemoveRole(Dynamic((hx::Object *)a1), Dynamic((hx::Object *)a2));
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1; void * a2;} args;
 		HxSemaphore lock;
-		int ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ChatAttachment((hx::Object *)data->args.a0, true))->size__fromC();
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->canRemoveRole(Dynamic((hx::Object *)data->args.a1), Dynamic((hx::Object *)data->args.a2));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3480,30 +3517,29 @@ int borogove_chat_attachment_size(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute size__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute canRemoveRole() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_chat_attachment_uris(void *a0, const char ***a1) {
+void borogove_chat_add_role(void *a0, void *a1, void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatAttachment((hx::Object *)a0, true))->uris__fromC(a1);
+		return (borogove::Chat((hx::Object *)a0, true))->addRole(Dynamic((hx::Object *)a1), Dynamic((hx::Object *)a2));
 	}
 	struct Data {
-		struct {void * a0; const char*** a1;} args;
+		struct {void * a0; void * a1; void * a2;} args;
 		HxSemaphore lock;
-		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ChatAttachment((hx::Object *)data->args.a0, true))->uris__fromC(data->args.a1);
+				(borogove::Chat((hx::Object *)data->args.a0, true))->addRole(Dynamic((hx::Object *)data->args.a1), Dynamic((hx::Object *)data->args.a2));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3516,30 +3552,28 @@ size_t borogove_chat_attachment_uris(void *a0, const char ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute uris__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute addRole() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_chat_attachment_hashes(void *a0, void ***a1) {
+void borogove_chat_remove_role(void *a0, void *a1, void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatAttachment((hx::Object *)a0, true))->hashes__fromC(a1);
+		return (borogove::Chat((hx::Object *)a0, true))->removeRole(Dynamic((hx::Object *)a1), Dynamic((hx::Object *)a2));
 	}
 	struct Data {
-		struct {void * a0; void*** a1;} args;
+		struct {void * a0; void * a1; void * a2;} args;
 		HxSemaphore lock;
-		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ChatAttachment((hx::Object *)data->args.a0, true))->hashes__fromC(data->args.a1);
+				(borogove::Chat((hx::Object *)data->args.a0, true))->removeRole(Dynamic((hx::Object *)data->args.a1), Dynamic((hx::Object *)data->args.a2));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3552,30 +3586,28 @@ size_t borogove_chat_attachment_hashes(void *a0, void ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute hashes__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute removeRole() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_hash_from_hex(const char *a0, const char *a1) {
+void borogove_chat_correct_message(void *a0, void *a1, void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject(borogove::Hash_obj::fromHex(a0, a1));
+		return (borogove::Chat((hx::Object *)a0, true))->correctMessage__fromC(Dynamic((hx::Object *)a1), Dynamic((hx::Object *)a2));
 	}
 	struct Data {
-		struct {const char * a0; const char * a1;} args;
+		struct {void * a0; void * a1; void * a2;} args;
 		HxSemaphore lock;
-		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject(borogove::Hash_obj::fromHex(data->args.a0, data->args.a1));
+				(borogove::Chat((hx::Object *)data->args.a0, true))->correctMessage__fromC(Dynamic((hx::Object *)data->args.a1), Dynamic((hx::Object *)data->args.a2));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3588,30 +3620,28 @@ void *borogove_hash_from_hex(const char *a0, const char *a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute fromHex() on the main thread and wait until execution completes
+	// queue a callback to execute correctMessage__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_hash_from_uri(const char *a0) {
+void borogove_chat_moderate(void *a0, void *a1, const char *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject(borogove::Hash_obj::fromUri(a0));
+		return (borogove::Chat((hx::Object *)a0, true))->moderate(Dynamic((hx::Object *)a1), a2);
 	}
 	struct Data {
-		struct {const char * a0;} args;
+		struct {void * a0; void * a1; const char * a2;} args;
 		HxSemaphore lock;
-		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject(borogove::Hash_obj::fromUri(data->args.a0));
+				(borogove::Chat((hx::Object *)data->args.a0, true))->moderate(Dynamic((hx::Object *)data->args.a1), data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3624,30 +3654,28 @@ void *borogove_hash_from_uri(const char *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute fromUri() on the main thread and wait until execution completes
+	// queue a callback to execute moderate() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_hash_algorithm(void *a0) {
+void borogove_chat_add_reaction(void *a0, void *a1, void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)a0, true))->algorithm__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->addReaction(Dynamic((hx::Object *)a1), Dynamic((hx::Object *)a2));
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1; void * a2;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)data->args.a0, true))->algorithm__fromC());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->addReaction(Dynamic((hx::Object *)data->args.a1), Dynamic((hx::Object *)data->args.a2));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3660,30 +3688,28 @@ const char *borogove_hash_algorithm(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute algorithm__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute addReaction() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_hash_to_uri(void *a0) {
+void borogove_chat_remove_reaction(void *a0, void *a1, void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)a0, true))->toUri());
+		return (borogove::Chat((hx::Object *)a0, true))->removeReaction__fromC(Dynamic((hx::Object *)a1), Dynamic((hx::Object *)a2));
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1; void * a2;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)data->args.a0, true))->toUri());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->removeReaction__fromC(Dynamic((hx::Object *)data->args.a1), Dynamic((hx::Object *)data->args.a2));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3696,30 +3722,28 @@ const char *borogove_hash_to_uri(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute toUri() on the main thread and wait until execution completes
+	// queue a callback to execute removeReaction__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_hash_to_hex(void *a0) {
+void borogove_chat_typing(void *a0, const char *a1, const char *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)a0, true))->toHex());
+		return (borogove::Chat((hx::Object *)a0, true))->typing(a1, a2);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; const char * a1; const char * a2;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)data->args.a0, true))->toHex());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->typing(data->args.a1, data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3732,30 +3756,28 @@ const char *borogove_hash_to_hex(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute toHex() on the main thread and wait until execution completes
+	// queue a callback to execute typing() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_hash_to_base_64(void *a0) {
+void borogove_chat_set_active(void *a0, bool a1, const char *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)a0, true))->toBase64());
+		return (borogove::Chat((hx::Object *)a0, true))->setActive(a1, a2);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; bool a1; const char * a2;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)data->args.a0, true))->toBase64());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->setActive(data->args.a1, data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3768,30 +3790,28 @@ const char *borogove_hash_to_base_64(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute toBase64() on the main thread and wait until execution completes
+	// queue a callback to execute setActive() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_hash_to_base_64_url(void *a0) {
+void borogove_chat_close(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)a0, true))->toBase64Url());
+		return (borogove::Chat((hx::Object *)a0, true))->close__fromC();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Hash((hx::Object *)data->args.a0, true))->toBase64Url());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->close__fromC();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3806,28 +3826,26 @@ const char *borogove_hash_to_base_64_url(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute toBase64Url() on the main thread and wait until execution completes
+	// queue a callback to execute close__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_reaction_unicode(const char *a0) {
+void borogove_chat_toggle_pinned(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject(borogove::Reaction_obj::unicode(a0));
+		return (borogove::Chat((hx::Object *)a0, true))->togglePinned();
 	}
 	struct Data {
-		struct {const char * a0;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject(borogove::Reaction_obj::unicode(data->args.a0));
+				(borogove::Chat((hx::Object *)data->args.a0, true))->togglePinned();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3842,28 +3860,26 @@ void *borogove_reaction_unicode(const char *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute unicode() on the main thread and wait until execution completes
+	// queue a callback to execute togglePinned() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_reaction_sender_id(void *a0) {
+void borogove_chat_block(void *a0, bool a1, void *a2, bool a3) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Reaction((hx::Object *)a0, true))->senderId__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->block(a1, Dynamic((hx::Object *)a2), a3);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; bool a1; void * a2; bool a3;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Reaction((hx::Object *)data->args.a0, true))->senderId__fromC());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->block(data->args.a1, Dynamic((hx::Object *)data->args.a2), data->args.a3);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3876,30 +3892,28 @@ const char *borogove_reaction_sender_id(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2, a3} };
 
-	// queue a callback to execute senderId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute block() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_reaction_timestamp(void *a0) {
+void borogove_chat_unblock(void *a0, bool a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Reaction((hx::Object *)a0, true))->timestamp__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->unblock(a1);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; bool a1;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Reaction((hx::Object *)data->args.a0, true))->timestamp__fromC());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->unblock(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3912,30 +3926,28 @@ const char *borogove_reaction_timestamp(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute timestamp__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute unblock() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_reaction_key(void *a0) {
+void borogove_chat_set_notifications(void *a0, bool a1, bool a2, bool a3) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Reaction((hx::Object *)a0, true))->key__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->setNotifications(a1, a2, a3);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; bool a1; bool a2; bool a3;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Reaction((hx::Object *)data->args.a0, true))->key__fromC());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->setNotifications(data->args.a1, data->args.a2, data->args.a3);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3948,30 +3960,29 @@ const char *borogove_reaction_key(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2, a3} };
 
-	// queue a callback to execute key__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute setNotifications() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-enum borogove_encryption_status borogove_encryption_info_status(void *a0) {
+bool borogove_chat_notifications_filtered(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return static_cast<enum borogove_encryption_status>((borogove::EncryptionInfo((hx::Object *)a0, true))->status__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->notificationsFiltered();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		enum borogove_encryption_status ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = static_cast<enum borogove_encryption_status>((borogove::EncryptionInfo((hx::Object *)data->args.a0, true))->status__fromC());
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->notificationsFiltered();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -3986,28 +3997,28 @@ enum borogove_encryption_status borogove_encryption_info_status(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute status__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute notificationsFiltered() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_encryption_info_method(void *a0) {
+bool borogove_chat_notify_mention(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)a0, true))->method__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->notifyMention();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)data->args.a0, true))->method__fromC());
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->notifyMention();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4022,28 +4033,28 @@ const char *borogove_encryption_info_method(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute method__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute notifyMention() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_encryption_info_method_name(void *a0) {
+bool borogove_chat_notify_reply(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)a0, true))->methodName__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->notifyReply();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)data->args.a0, true))->methodName__fromC());
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->notifyReply();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4058,16 +4069,16 @@ const char *borogove_encryption_info_method_name(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute methodName__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute notifyReply() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_encryption_info_reason(void *a0) {
+const char *borogove_chat_get_photo(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)a0, true))->reason__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->getPhoto());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -4079,7 +4090,7 @@ const char *borogove_encryption_info_reason(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)data->args.a0, true))->reason__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->getPhoto());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4094,16 +4105,16 @@ const char *borogove_encryption_info_reason(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute reason__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute getPhoto() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_encryption_info_reason_text(void *a0) {
+const char *borogove_chat_get_placeholder(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)a0, true))->reasonText__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->getPlaceholder());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -4115,7 +4126,7 @@ const char *borogove_encryption_info_reason_text(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::EncryptionInfo((hx::Object *)data->args.a0, true))->reasonText__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->getPlaceholder());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4130,28 +4141,27 @@ const char *borogove_encryption_info_reason_text(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute reasonText__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute getPlaceholder() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_calls_media_stream_track_id(void *a0) {
+void borogove_chat_read_up_to(void *a0, void (*a1) (void*, void *handler__context), void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->id__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->readUpTo__fromC(cpp::Function<void(void*, void * handler__context)>(a1), a2);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void (* a1) (void*, void * handler__context); void* a2;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->id__fromC());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->readUpTo__fromC(cpp::Function<void(void*, void * handler__context)>(data->args.a1), data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4164,30 +4174,29 @@ const char *borogove_calls_media_stream_track_id(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute id__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute readUpTo__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_calls_media_stream_track_muted(void *a0) {
+int borogove_chat_unread_count(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->muted__fromC();
+		return (borogove::Chat((hx::Object *)a0, true))->unreadCount();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		bool ret;
+		int ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->muted__fromC();
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->unreadCount();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4202,16 +4211,16 @@ bool borogove_calls_media_stream_track_muted(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute muted__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute unreadCount() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_calls_media_stream_track_kind(void *a0) {
+const char *borogove_chat_preview(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->kind__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->preview());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -4223,7 +4232,7 @@ const char *borogove_calls_media_stream_track_kind(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->kind__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->preview());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4238,28 +4247,27 @@ const char *borogove_calls_media_stream_track_kind(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute kind__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute preview() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_calls_media_stream_track_supported_audio_formats(void *a0, void ***a1) {
+void borogove_chat_set_display_name(void *a0, const char *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->supportedAudioFormats__fromC(a1);
+		return (borogove::Chat((hx::Object *)a0, true))->setDisplayName(a1);
 	}
 	struct Data {
-		struct {void * a0; void*** a1;} args;
+		struct {void * a0; const char * a1;} args;
 		HxSemaphore lock;
-		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->supportedAudioFormats__fromC(data->args.a1);
+				(borogove::Chat((hx::Object *)data->args.a0, true))->setDisplayName(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4274,27 +4282,27 @@ size_t borogove_calls_media_stream_track_supported_audio_formats(void *a0, void
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute supportedAudioFormats__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute setDisplayName() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_calls_media_stream_track_add_pcm_listener(void *a0, void (*a1) (short*, size_t, int, int, void*), void *a2) {
+const char *borogove_chat_get_display_name(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->addPCMListener__fromC(cpp::Function<void(short*, size_t, int, int, void*)>(a1), a2);
+		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->getDisplayName());
 	}
 	struct Data {
-		struct {void * a0; void (* a1) (short*, size_t, int, int, void*); void* a2;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->addPCMListener__fromC(cpp::Function<void(short*, size_t, int, int, void*)>(data->args.a1), data->args.a2);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->getDisplayName());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4307,28 +4315,30 @@ void borogove_calls_media_stream_track_add_pcm_listener(void *a0, void (*a1) (sh
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute addPCMListener__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute getDisplayName() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_calls_media_stream_track_add_ready_for_pcm_listener(void *a0, void (*a1) (void*), void *a2) {
+size_t borogove_chat_get_tags(void *a0, const char ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->addReadyForPCMListener__fromC(cpp::Function<void(void*)>(a1), a2);
+		return (borogove::Chat((hx::Object *)a0, true))->getTags__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; void (* a1) (void*); void* a2;} args;
+		struct {void * a0; const char*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->addReadyForPCMListener__fromC(cpp::Function<void(void*)>(data->args.a1), data->args.a2);
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->getTags__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4341,20 +4351,21 @@ void borogove_calls_media_stream_track_add_ready_for_pcm_listener(void *a0, void
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute addReadyForPCMListener__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute getTags__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_calls_media_stream_track_write_pcm(void *a0, const short *a1, size_t a2, int a3, int a4) {
+void borogove_chat_set_trusted(void *a0, bool a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->writePCM__fromC(a1, a2, a3, a4);
+		return (borogove::Chat((hx::Object *)a0, true))->setTrusted(a1);
 	}
 	struct Data {
-		struct {void * a0; const short* a1; size_t a2; int a3; int a4;} args;
+		struct {void * a0; bool a1;} args;
 		HxSemaphore lock;
 	};
 	struct Callback {
@@ -4362,7 +4373,7 @@ void borogove_calls_media_stream_track_write_pcm(void *a0, const short *a1, size
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->writePCM__fromC(data->args.a1, data->args.a2, data->args.a3, data->args.a4);
+				(borogove::Chat((hx::Object *)data->args.a0, true))->setTrusted(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4375,28 +4386,29 @@ void borogove_calls_media_stream_track_write_pcm(void *a0, const short *a1, size
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute writePCM__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute setTrusted() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_calls_media_stream_track_stop(void *a0) {
+bool borogove_chat_is_trusted(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->stop();
+		return (borogove::Chat((hx::Object *)a0, true))->isTrusted();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->stop();
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->isTrusted();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4411,27 +4423,28 @@ void borogove_calls_media_stream_track_stop(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute stop() on the main thread and wait until execution completes
+	// queue a callback to execute isTrusted() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_calls_audio_format_new(const char *a0, unsigned char a1, int a2, int a3) {
+bool borogove_chat_syncing(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject(borogove::calls::AudioFormat_obj::__new(a0, a1, a2, a3));
+		return (borogove::Chat((hx::Object *)a0, true))->syncing();
 	}
 	struct Data {
-		struct {const char * a0; unsigned char a1; int a2; int a3;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		void * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject(borogove::calls::AudioFormat_obj::__new(data->args.a0, data->args.a1, data->args.a2, data->args.a3));
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->syncing();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4444,30 +4457,30 @@ void *borogove_calls_audio_format_new(const char *a0, unsigned char a1, int a2,
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3} };
+	Data data = { {a0} };
 
-	// queue a callback to execute new() on the main thread and wait until execution completes
+	// queue a callback to execute syncing() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-int borogove_calls_audio_format_clock_rate(void *a0) {
+bool borogove_chat_can_audio_call(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::calls::AudioFormat((hx::Object *)a0, true))->clockRate__fromC();
+		return (borogove::Chat((hx::Object *)a0, true))->canAudioCall();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		int ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::calls::AudioFormat((hx::Object *)data->args.a0, true))->clockRate__fromC();
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->canAudioCall();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4482,28 +4495,28 @@ int borogove_calls_audio_format_clock_rate(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute clockRate__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute canAudioCall() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-int borogove_calls_audio_format_channels(void *a0) {
+bool borogove_chat_can_video_call(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::calls::AudioFormat((hx::Object *)a0, true))->channels__fromC();
+		return (borogove::Chat((hx::Object *)a0, true))->canVideoCall();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		int ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::calls::AudioFormat((hx::Object *)data->args.a0, true))->channels__fromC();
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->canVideoCall();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4518,28 +4531,28 @@ int borogove_calls_audio_format_channels(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute channels__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute canVideoCall() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_command_name(void *a0) {
+void *borogove_chat_start_call(void *a0, bool a1, bool a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Command((hx::Object *)a0, true))->name__fromC());
+		return HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)a0, true))->startCall(a1, a2));
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; bool a1; bool a2;} args;
 		HxSemaphore lock;
-		const char * ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Command((hx::Object *)data->args.a0, true))->name__fromC());
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)data->args.a0, true))->startCall(data->args.a1, data->args.a2));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4552,21 +4565,21 @@ const char *borogove_command_name(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute name__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute startCall() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_command_execute(void *a0, void (*a1) (void*, void *handler__context), void *a2) {
+void borogove_chat_accept_call(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Command((hx::Object *)a0, true))->execute__fromC(cpp::Function<void(void*, void * handler__context)>(a1), a2);
+		return (borogove::Chat((hx::Object *)a0, true))->acceptCall();
 	}
 	struct Data {
-		struct {void * a0; void (* a1) (void*, void * handler__context); void* a2;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
 	};
 	struct Callback {
@@ -4574,7 +4587,7 @@ void borogove_command_execute(void *a0, void (*a1) (void*, void *handler__contex
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Command((hx::Object *)data->args.a0, true))->execute__fromC(cpp::Function<void(void*, void * handler__context)>(data->args.a1), data->args.a2);
+				(borogove::Chat((hx::Object *)data->args.a0, true))->acceptCall();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4587,29 +4600,28 @@ void borogove_command_execute(void *a0, void (*a1) (void*, void *handler__contex
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute execute__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute acceptCall() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_command_session_name(void *a0) {
+void borogove_chat_hangup(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::CommandSession((hx::Object *)a0, true))->name__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->hangup();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::CommandSession((hx::Object *)data->args.a0, true))->name__fromC());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->hangup();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4624,28 +4636,27 @@ const char *borogove_command_session_name(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute name__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute hangup() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_command_session_status(void *a0) {
+enum borogove_calls_call_status borogove_chat_call_status(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::CommandSession((hx::Object *)a0, true))->status__fromC());
+		return static_cast<enum borogove_calls_call_status>((borogove::Chat((hx::Object *)a0, true))->callStatus());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		enum borogove_calls_call_status ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::CommandSession((hx::Object *)data->args.a0, true))->status__fromC());
+				data->ret = static_cast<enum borogove_calls_call_status>((borogove::Chat((hx::Object *)data->args.a0, true))->callStatus());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4660,28 +4671,28 @@ const char *borogove_command_session_status(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute status__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute callStatus() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_command_session_actions(void *a0, void ***a1) {
+void *borogove_chat_dtmf(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::CommandSession((hx::Object *)a0, true))->actions__fromC(a1);
+		return HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)a0, true))->dtmf());
 	}
 	struct Data {
-		struct {void * a0; void*** a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		size_t ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::CommandSession((hx::Object *)data->args.a0, true))->actions__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::Chat((hx::Object *)data->args.a0, true))->dtmf());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4694,18 +4705,18 @@ size_t borogove_command_session_actions(void *a0, void ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute actions__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute dtmf() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_command_session_forms(void *a0, void ***a1) {
+size_t borogove_chat_video_tracks(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::CommandSession((hx::Object *)a0, true))->forms__fromC(a1);
+		return (borogove::Chat((hx::Object *)a0, true))->videoTracks__fromC(a1);
 	}
 	struct Data {
 		struct {void * a0; void*** a1;} args;
@@ -4717,7 +4728,7 @@ size_t borogove_command_session_forms(void *a0, void ***a1) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::CommandSession((hx::Object *)data->args.a0, true))->forms__fromC(data->args.a1);
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->videoTracks__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4732,27 +4743,28 @@ size_t borogove_command_session_forms(void *a0, void ***a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute forms__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute videoTracks__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_command_session_execute(void *a0, const char *a1, void *a2, int a3, void (*a4) (void*, void *handler__context), void *a5) {
+const char *borogove_chat_encryption_mode(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::CommandSession((hx::Object *)a0, true))->execute__fromC(a1, Dynamic((hx::Object *)a2), a3, cpp::Function<void(void*, void * handler__context)>(a4), a5);
+		return HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)a0, true))->encryptionMode());
 	}
 	struct Data {
-		struct {void * a0; const char * a1; void * a2; int a3; void (* a4) (void*, void * handler__context); void* a5;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::CommandSession((hx::Object *)data->args.a0, true))->execute__fromC(data->args.a1, Dynamic((hx::Object *)data->args.a2), data->args.a3, cpp::Function<void(void*, void * handler__context)>(data->args.a4), data->args.a5);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Chat((hx::Object *)data->args.a0, true))->encryptionMode());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4765,29 +4777,30 @@ void borogove_command_session_execute(void *a0, const char *a1, void *a2, int a3
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4, a5} };
+	Data data = { {a0} };
 
-	// queue a callback to execute execute__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute encryptionMode() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_option_label(void *a0) {
+bool borogove_chat_can_send(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::FormOption((hx::Object *)a0, true))->label__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->canSend();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::FormOption((hx::Object *)data->args.a0, true))->label__fromC());
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->canSend();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4802,28 +4815,28 @@ const char *borogove_form_option_label(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute label__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute canSend() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_option_value(void *a0) {
+bool borogove_chat_can_moderate(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::FormOption((hx::Object *)a0, true))->value__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->canModerate();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::FormOption((hx::Object *)data->args.a0, true))->value__fromC());
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->canModerate();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4838,28 +4851,27 @@ const char *borogove_form_option_value(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute value__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute canModerate() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_item_text(void *a0) {
+void borogove_chat_invite(void *a0, void *a1, const char *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::FormItem((hx::Object *)a0, true))->text__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->invite(Dynamic((hx::Object *)a1), a2);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1; const char * a2;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::FormItem((hx::Object *)data->args.a0, true))->text__fromC());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->invite(Dynamic((hx::Object *)data->args.a1), data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4872,30 +4884,29 @@ const char *borogove_form_item_text(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute text__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute invite() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_form_item_field(void *a0) {
+bool borogove_chat_can_invite(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject((borogove::FormItem((hx::Object *)a0, true))->field__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->canInvite();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		void * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject((borogove::FormItem((hx::Object *)data->args.a0, true))->field__fromC());
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->canInvite();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4910,28 +4921,28 @@ void *borogove_form_item_field(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute field__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute canInvite() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_form_item_section(void *a0) {
+bool borogove_chat_is_app(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject((borogove::FormItem((hx::Object *)a0, true))->section__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->isApp();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		void * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject((borogove::FormItem((hx::Object *)data->args.a0, true))->section__fromC());
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->isApp();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4946,28 +4957,28 @@ void *borogove_form_item_section(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute section__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute isApp() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_item_status(void *a0) {
+bool borogove_chat_has_commands(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::FormItem((hx::Object *)a0, true))->status__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->hasCommands();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::FormItem((hx::Object *)data->args.a0, true))->status__fromC());
+				data->ret = (borogove::Chat((hx::Object *)data->args.a0, true))->hasCommands();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -4982,28 +4993,27 @@ const char *borogove_form_item_status(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute status__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute hasCommands() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_form_item_table_header(void *a0, void ***a1) {
+void borogove_chat_commands(void *a0, void (*a1) (void**, size_t, void *handler__context), void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::FormItem((hx::Object *)a0, true))->tableHeader__fromC(a1);
+		return (borogove::Chat((hx::Object *)a0, true))->commands__fromC(cpp::Function<void(void**, size_t, void * handler__context)>(a1), a2);
 	}
 	struct Data {
-		struct {void * a0; void*** a1;} args;
+		struct {void * a0; void (* a1) (void**, size_t, void * handler__context); void* a2;} args;
 		HxSemaphore lock;
-		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::FormItem((hx::Object *)data->args.a0, true))->tableHeader__fromC(data->args.a1);
+				(borogove::Chat((hx::Object *)data->args.a0, true))->commands__fromC(cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a1), data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5016,30 +5026,28 @@ size_t borogove_form_item_table_header(void *a0, void ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute tableHeader__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute commands__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_field_name(void *a0) {
+void borogove_chat_invited_by(void *a0, void (*a1) (void*, void *handler__context), void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->name__fromC());
+		return (borogove::Chat((hx::Object *)a0, true))->invitedBy__fromC(cpp::Function<void(void*, void * handler__context)>(a1), a2);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void (* a1) (void*, void * handler__context); void* a2;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->name__fromC());
+				(borogove::Chat((hx::Object *)data->args.a0, true))->invitedBy__fromC(cpp::Function<void(void*, void * handler__context)>(data->args.a1), data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5052,18 +5060,17 @@ const char *borogove_form_field_name(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute name__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute invitedBy__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_field_label(void *a0) {
+const char *borogove_member_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->label__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::Member((hx::Object *)a0, true))->id__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -5075,7 +5082,7 @@ const char *borogove_form_field_label(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->label__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Member((hx::Object *)data->args.a0, true))->id__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5090,16 +5097,16 @@ const char *borogove_form_field_label(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute label__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute id__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_field_desc(void *a0) {
+const char *borogove_member_display_name(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->desc__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::Member((hx::Object *)a0, true))->displayName__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -5111,7 +5118,7 @@ const char *borogove_form_field_desc(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->desc__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Member((hx::Object *)data->args.a0, true))->displayName__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5126,28 +5133,28 @@ const char *borogove_form_field_desc(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute desc__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute displayName__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_form_field_value(void *a0, const char ***a1) {
+const char *borogove_member_photo_uri(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::FormField((hx::Object *)a0, true))->value__fromC(a1);
+		return HaxeCBridge::retainHaxeString((borogove::Member((hx::Object *)a0, true))->photoUri__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char*** a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		size_t ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::FormField((hx::Object *)data->args.a0, true))->value__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Member((hx::Object *)data->args.a0, true))->photoUri__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5160,30 +5167,30 @@ size_t borogove_form_field_value(void *a0, const char ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute value__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute photoUri__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_form_field_required(void *a0) {
+const char *borogove_member_placeholder_uri(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::FormField((hx::Object *)a0, true))->required__fromC();
+		return HaxeCBridge::retainHaxeString((borogove::Member((hx::Object *)a0, true))->placeholderUri__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		bool ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::FormField((hx::Object *)data->args.a0, true))->required__fromC();
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Member((hx::Object *)data->args.a0, true))->placeholderUri__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5198,28 +5205,28 @@ bool borogove_form_field_required(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute required__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute placeholderUri__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_field_type(void *a0) {
+bool borogove_member_is_self(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->type__fromC());
+		return (borogove::Member((hx::Object *)a0, true))->isSelf__fromC();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->type__fromC());
+				data->ret = (borogove::Member((hx::Object *)data->args.a0, true))->isSelf__fromC();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5234,28 +5241,28 @@ const char *borogove_form_field_type(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute type__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute isSelf__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_field_datatype(void *a0) {
+void *borogove_member_chat(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->datatype__fromC());
+		return HaxeCBridge::retainHaxeObject((borogove::Member((hx::Object *)a0, true))->chat__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->datatype__fromC());
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::Member((hx::Object *)data->args.a0, true))->chat__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5270,16 +5277,16 @@ const char *borogove_form_field_datatype(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute datatype__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute chat__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_form_field_options(void *a0, void ***a1) {
+size_t borogove_member_roles(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::FormField((hx::Object *)a0, true))->options__fromC(a1);
+		return (borogove::Member((hx::Object *)a0, true))->roles__fromC(a1);
 	}
 	struct Data {
 		struct {void * a0; void*** a1;} args;
@@ -5291,7 +5298,7 @@ size_t borogove_form_field_options(void *a0, void ***a1) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::FormField((hx::Object *)data->args.a0, true))->options__fromC(data->args.a1);
+				data->ret = (borogove::Member((hx::Object *)data->args.a0, true))->roles__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5306,28 +5313,28 @@ size_t borogove_form_field_options(void *a0, void ***a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute options__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute roles__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_form_field_open(void *a0) {
+enum borogove_show_presence borogove_member_show_presence(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::FormField((hx::Object *)a0, true))->open__fromC();
+		return static_cast<enum borogove_show_presence>((borogove::Member((hx::Object *)a0, true))->showPresence__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		bool ret;
+		enum borogove_show_presence ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::FormField((hx::Object *)data->args.a0, true))->open__fromC();
+				data->ret = static_cast<enum borogove_show_presence>((borogove::Member((hx::Object *)data->args.a0, true))->showPresence__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5342,28 +5349,27 @@ bool borogove_form_field_open(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute open__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute showPresence__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_field_range_min(void *a0) {
+void borogove_member_profile(void *a0, void *a1, void (*a2) (void*, void *handler__context), void *a3) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->rangeMin__fromC());
+		return (borogove::Member((hx::Object *)a0, true))->profile__fromC(Dynamic((hx::Object *)a1), cpp::Function<void(void*, void * handler__context)>(a2), a3);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1; void (* a2) (void*, void * handler__context); void* a3;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->rangeMin__fromC());
+				(borogove::Member((hx::Object *)data->args.a0, true))->profile__fromC(Dynamic((hx::Object *)data->args.a1), cpp::Function<void(void*, void * handler__context)>(data->args.a2), data->args.a3);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5376,30 +5382,28 @@ const char *borogove_form_field_range_min(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2, a3} };
 
-	// queue a callback to execute rangeMin__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute profile__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_field_range_max(void *a0) {
+void borogove_member_status(void *a0, void *a1, void (*a2) (void*, void *handler__context), void *a3) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->rangeMax__fromC());
+		return (borogove::Member((hx::Object *)a0, true))->status__fromC(Dynamic((hx::Object *)a1), cpp::Function<void(void*, void * handler__context)>(a2), a3);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1; void (* a2) (void*, void * handler__context); void* a3;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->rangeMax__fromC());
+				(borogove::Member((hx::Object *)data->args.a0, true))->status__fromC(Dynamic((hx::Object *)data->args.a1), cpp::Function<void(void*, void * handler__context)>(data->args.a2), data->args.a3);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5412,18 +5416,17 @@ const char *borogove_form_field_range_max(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2, a3} };
 
-	// queue a callback to execute rangeMax__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute status__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_field_regex(void *a0) {
+const char *borogove_available_chat_chat_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->regex__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::AvailableChat((hx::Object *)a0, true))->chatId__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -5435,7 +5438,7 @@ const char *borogove_form_field_regex(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->regex__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::AvailableChat((hx::Object *)data->args.a0, true))->chatId__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5450,16 +5453,16 @@ const char *borogove_form_field_regex(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute regex__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute chatId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_section_title(void *a0) {
+const char *borogove_available_chat_display_name(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString(borogove::FormSection__Companion_obj::title__fromC(Dynamic((hx::Object *)a0)));
+		return HaxeCBridge::retainHaxeString((borogove::AvailableChat((hx::Object *)a0, true))->displayName__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -5471,7 +5474,7 @@ const char *borogove_form_section_title(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString(borogove::FormSection__Companion_obj::title__fromC(Dynamic((hx::Object *)data->args.a0)));
+				data->ret = HaxeCBridge::retainHaxeString((borogove::AvailableChat((hx::Object *)data->args.a0, true))->displayName__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5486,28 +5489,28 @@ const char *borogove_form_section_title(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute title__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute displayName__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_form_section_items(void *a0, void ***a1) {
+const char *borogove_available_chat_note(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::FormSection__Companion_obj::items__fromC(Dynamic((hx::Object *)a0), a1);
+		return HaxeCBridge::retainHaxeString((borogove::AvailableChat((hx::Object *)a0, true))->note__fromC());
 	}
 	struct Data {
-		struct {void * a0; void*** a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		size_t ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = borogove::FormSection__Companion_obj::items__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::AvailableChat((hx::Object *)data->args.a0, true))->note__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5520,18 +5523,18 @@ size_t borogove_form_section_items(void *a0, void ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute items__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute note__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_form_is_result(void *a0) {
+bool borogove_available_chat_is_channel(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Form((hx::Object *)a0, true))->isResult();
+		return (borogove::AvailableChat((hx::Object *)a0, true))->isChannel();
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -5543,7 +5546,7 @@ bool borogove_form_is_result(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Form((hx::Object *)data->args.a0, true))->isResult();
+				data->ret = (borogove::AvailableChat((hx::Object *)data->args.a0, true))->isChannel();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5558,28 +5561,28 @@ bool borogove_form_is_result(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute isResult() on the main thread and wait until execution completes
+	// queue a callback to execute isChannel() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_title(void *a0) {
+bool borogove_available_chat_can_audio_call(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Form((hx::Object *)a0, true))->title());
+		return (borogove::AvailableChat((hx::Object *)a0, true))->canAudioCall();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Form((hx::Object *)data->args.a0, true))->title());
+				data->ret = (borogove::AvailableChat((hx::Object *)data->args.a0, true))->canAudioCall();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5594,28 +5597,28 @@ const char *borogove_form_title(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute title() on the main thread and wait until execution completes
+	// queue a callback to execute canAudioCall() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_form_url(void *a0) {
+bool borogove_available_chat_can_video_call(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Form((hx::Object *)a0, true))->url());
+		return (borogove::AvailableChat((hx::Object *)a0, true))->canVideoCall();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Form((hx::Object *)data->args.a0, true))->url());
+				data->ret = (borogove::AvailableChat((hx::Object *)data->args.a0, true))->canVideoCall();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5630,28 +5633,28 @@ const char *borogove_form_url(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute url() on the main thread and wait until execution completes
+	// queue a callback to execute canVideoCall() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_form_items(void *a0, void ***a1) {
+const char *borogove_role_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Form((hx::Object *)a0, true))->items__fromC(a1);
+		return HaxeCBridge::retainHaxeString((borogove::Role((hx::Object *)a0, true))->id__fromC());
 	}
 	struct Data {
-		struct {void * a0; void*** a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		size_t ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Form((hx::Object *)data->args.a0, true))->items__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Role((hx::Object *)data->args.a0, true))->id__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5664,29 +5667,30 @@ size_t borogove_form_items(void *a0, void ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute items__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute id__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_last_id(void *a0, const char *a1, const char *a2, void (*a3) (const char*, void *handler__context), void *a4) {
+const char *borogove_role_title(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::lastId__fromC(Dynamic((hx::Object *)a0), a1, a2, cpp::Function<void(const char*, void * handler__context)>(a3), a4);
+		return HaxeCBridge::retainHaxeString((borogove::Role((hx::Object *)a0, true))->title__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2; void (* a3) (const char*, void * handler__context); void* a4;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::lastId__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, cpp::Function<void(const char*, void * handler__context)>(data->args.a3), data->args.a4);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Role((hx::Object *)data->args.a0, true))->title__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5699,28 +5703,30 @@ void borogove_persistence_last_id(void *a0, const char *a1, const char *a2, void
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4} };
+	Data data = { {a0} };
 
-	// queue a callback to execute lastId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute title__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_store_chats(void *a0, const char *a1, void *const *a2, size_t a3) {
+const char *borogove_role_color(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::storeChats__fromC(Dynamic((hx::Object *)a0), a1, a2, a3);
+		return HaxeCBridge::retainHaxeString((borogove::Role((hx::Object *)a0, true))->color());
 	}
 	struct Data {
-		struct {void * a0; const char * a1; void* const* a2; size_t a3;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::storeChats__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Role((hx::Object *)data->args.a0, true))->color());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5733,28 +5739,30 @@ void borogove_persistence_store_chats(void *a0, const char *a1, void *const *a2,
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3} };
+	Data data = { {a0} };
 
-	// queue a callback to execute storeChats__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute color() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_store_messages(void *a0, const char *a1, void *const *a2, size_t a3, void (*a4) (void**, size_t, void *handler__context), void *a5) {
+size_t borogove_profile_items(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::storeMessages__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, cpp::Function<void(void**, size_t, void * handler__context)>(a4), a5);
+		return (borogove::Profile((hx::Object *)a0, true))->items__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; void* const* a2; size_t a3; void (* a4) (void**, size_t, void * handler__context); void* a5;} args;
+		struct {void * a0; void*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::storeMessages__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a4), data->args.a5);
+				data->ret = (borogove::Profile((hx::Object *)data->args.a0, true))->items__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5767,28 +5775,30 @@ void borogove_persistence_store_messages(void *a0, const char *a1, void *const *
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4, a5} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute storeMessages__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute items__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_update_message(void *a0, const char *a1, void *a2) {
+const char *borogove_profile_item_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::updateMessage__fromC(Dynamic((hx::Object *)a0), a1, Dynamic((hx::Object *)a2));
+		return HaxeCBridge::retainHaxeString((borogove::ProfileItem((hx::Object *)a0, true))->id__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char * a1; void * a2;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::updateMessage__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, Dynamic((hx::Object *)data->args.a2));
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ProfileItem((hx::Object *)data->args.a0, true))->id__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5801,28 +5811,30 @@ void borogove_persistence_update_message(void *a0, const char *a1, void *a2) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute updateMessage__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute id__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_update_message_status(void *a0, const char *a1, const char *a2, enum borogove_message_status a3, const char *a4, void (*a5) (void*, void *handler__context), void *a6) {
+const char *borogove_profile_item_key(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::updateMessageStatus__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, a4, cpp::Function<void(void*, void * handler__context)>(a5), a6);
+		return HaxeCBridge::retainHaxeString((borogove::ProfileItem((hx::Object *)a0, true))->key__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2; enum borogove_message_status a3; const char * a4; void (* a5) (void*, void * handler__context); void* a6;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::updateMessageStatus__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, data->args.a4, cpp::Function<void(void*, void * handler__context)>(data->args.a5), data->args.a6);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ProfileItem((hx::Object *)data->args.a0, true))->key__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5835,28 +5847,30 @@ void borogove_persistence_update_message_status(void *a0, const char *a1, const
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4, a5, a6} };
+	Data data = { {a0} };
 
-	// queue a callback to execute updateMessageStatus__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute key__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_get_message(void *a0, const char *a1, const char *a2, const char *a3, const char *a4, void (*a5) (void*, void *handler__context), void *a6) {
+size_t borogove_profile_item_parameters(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::getMessage__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, a4, cpp::Function<void(void*, void * handler__context)>(a5), a6);
+		return (borogove::ProfileItem((hx::Object *)a0, true))->parameters__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2; const char * a3; const char * a4; void (* a5) (void*, void * handler__context); void* a6;} args;
+		struct {void * a0; void*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::getMessage__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, data->args.a4, cpp::Function<void(void*, void * handler__context)>(data->args.a5), data->args.a6);
+				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->parameters__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5869,28 +5883,30 @@ void borogove_persistence_get_message(void *a0, const char *a1, const char *a2,
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4, a5, a6} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute getMessage__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute parameters__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_get_messages_before(void *a0, const char *a1, const char *a2, const char *a3, const char *a4, void (*a5) (void**, size_t, void *handler__context), void *a6) {
+size_t borogove_profile_item_text(void *a0, const char ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::getMessagesBefore__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, a4, cpp::Function<void(void**, size_t, void * handler__context)>(a5), a6);
+		return (borogove::ProfileItem((hx::Object *)a0, true))->text__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2; const char * a3; const char * a4; void (* a5) (void**, size_t, void * handler__context); void* a6;} args;
+		struct {void * a0; const char*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::getMessagesBefore__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, data->args.a4, cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a5), data->args.a6);
+				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->text__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5903,28 +5919,30 @@ void borogove_persistence_get_messages_before(void *a0, const char *a1, const ch
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4, a5, a6} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute getMessagesBefore__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute text__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_get_messages_after(void *a0, const char *a1, const char *a2, const char *a3, const char *a4, void (*a5) (void**, size_t, void *handler__context), void *a6) {
+size_t borogove_profile_item_uri(void *a0, const char ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::getMessagesAfter__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, a4, cpp::Function<void(void**, size_t, void * handler__context)>(a5), a6);
+		return (borogove::ProfileItem((hx::Object *)a0, true))->uri__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2; const char * a3; const char * a4; void (* a5) (void**, size_t, void * handler__context); void* a6;} args;
+		struct {void * a0; const char*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::getMessagesAfter__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, data->args.a4, cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a5), data->args.a6);
+				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->uri__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5937,28 +5955,30 @@ void borogove_persistence_get_messages_after(void *a0, const char *a1, const cha
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4, a5, a6} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute getMessagesAfter__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute uri__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_get_messages_around(void *a0, const char *a1, const char *a2, const char *a3, const char *a4, void (*a5) (void**, size_t, void *handler__context), void *a6) {
+size_t borogove_profile_item_date(void *a0, const char ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::getMessagesAround__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, a4, cpp::Function<void(void**, size_t, void * handler__context)>(a5), a6);
+		return (borogove::ProfileItem((hx::Object *)a0, true))->date__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2; const char * a3; const char * a4; void (* a5) (void**, size_t, void * handler__context); void* a6;} args;
+		struct {void * a0; const char*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::getMessagesAround__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, data->args.a4, cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a5), data->args.a6);
+				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->date__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -5971,28 +5991,30 @@ void borogove_persistence_get_messages_around(void *a0, const char *a1, const ch
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4, a5, a6} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute getMessagesAround__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute date__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_has_media(void *a0, const char *a1, const unsigned char *a2, size_t a3, void (*a4) (bool, void *handler__context), void *a5) {
+size_t borogove_profile_item_time(void *a0, const char ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::hasMedia__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, cpp::Function<void(bool, void * handler__context)>(a4), a5);
+		return (borogove::ProfileItem((hx::Object *)a0, true))->time__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const unsigned char* a2; size_t a3; void (* a4) (bool, void * handler__context); void* a5;} args;
+		struct {void * a0; const char*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::hasMedia__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, cpp::Function<void(bool, void * handler__context)>(data->args.a4), data->args.a5);
+				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->time__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6005,28 +6027,30 @@ void borogove_persistence_has_media(void *a0, const char *a1, const unsigned cha
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4, a5} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute hasMedia__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute time__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_store_media(void *a0, const char *a1, const unsigned char *a2, size_t a3, void (*a4) (bool, void *handler__context), void *a5) {
+size_t borogove_profile_item_datetime(void *a0, const char ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::storeMedia__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, cpp::Function<void(bool, void * handler__context)>(a4), a5);
+		return (borogove::ProfileItem((hx::Object *)a0, true))->datetime__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const unsigned char* a2; size_t a3; void (* a4) (bool, void * handler__context); void* a5;} args;
+		struct {void * a0; const char*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::storeMedia__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, cpp::Function<void(bool, void * handler__context)>(data->args.a4), data->args.a5);
+				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->datetime__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6039,28 +6063,30 @@ void borogove_persistence_store_media(void *a0, const char *a1, const unsigned c
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4, a5} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute storeMedia__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute datetime__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_remove_media(void *a0, const char *a1, const unsigned char *a2, size_t a3) {
+size_t borogove_profile_item_language_tag(void *a0, const char ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::removeMedia__fromC(Dynamic((hx::Object *)a0), a1, a2, a3);
+		return (borogove::ProfileItem((hx::Object *)a0, true))->languageTag__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const unsigned char* a2; size_t a3;} args;
+		struct {void * a0; const char*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::removeMedia__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3);
+				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->languageTag__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6073,28 +6099,30 @@ void borogove_persistence_remove_media(void *a0, const char *a1, const unsigned
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute removeMedia__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute languageTag__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_store_login(void *a0, const char *a1, const char *a2, const char *a3, const char *a4) {
+void *borogove_status_new(const char *a0, const char *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::storeLogin__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, a4);
+		return HaxeCBridge::retainHaxeObject(borogove::Status_obj::__new(a0, a1));
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2; const char * a3; const char * a4;} args;
+		struct {const char * a0; const char * a1;} args;
 		HxSemaphore lock;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::storeLogin__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, data->args.a4);
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::Status_obj::__new(data->args.a0, data->args.a1));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6107,28 +6135,30 @@ void borogove_persistence_store_login(void *a0, const char *a1, const char *a2,
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute storeLogin__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute new() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_remove_account(void *a0, const char *a1, bool a2) {
+const char *borogove_status_emoji(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::removeAccount__fromC(Dynamic((hx::Object *)a0), a1, a2);
+		return HaxeCBridge::retainHaxeString((borogove::Status((hx::Object *)a0, true))->emoji__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char * a1; bool a2;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::removeAccount__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Status((hx::Object *)data->args.a0, true))->emoji__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6141,28 +6171,30 @@ void borogove_persistence_remove_account(void *a0, const char *a1, bool a2) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute removeAccount__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute emoji__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_list_accounts(void *a0, void (*a1) (const char**, size_t, void *handler__context), void *a2) {
+const char *borogove_status_text(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return borogove::Persistence__Companion_obj::listAccounts__fromC(Dynamic((hx::Object *)a0), cpp::Function<void(const char**, size_t, void * handler__context)>(a1), a2);
+		return HaxeCBridge::retainHaxeString((borogove::Status((hx::Object *)a0, true))->text__fromC());
 	}
 	struct Data {
-		struct {void * a0; void (* a1) (const char**, size_t, void * handler__context); void* a2;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				borogove::Persistence__Companion_obj::listAccounts__fromC(Dynamic((hx::Object *)data->args.a0), cpp::Function<void(const char**, size_t, void * handler__context)>(data->args.a1), data->args.a2);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Status((hx::Object *)data->args.a0, true))->text__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6175,29 +6207,30 @@ void borogove_persistence_list_accounts(void *a0, void (*a1) (const char**, size
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute listAccounts__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute text__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_persistence_sqlite_new(const char *a0, void *a1) {
+const char *borogove_status_to_string(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject(borogove::persistence::Sqlite_obj::__new(a0, Dynamic((hx::Object *)a1)));
+		return HaxeCBridge::retainHaxeString((borogove::Status((hx::Object *)a0, true))->toString());
 	}
 	struct Data {
-		struct {const char * a0; void * a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		void * ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject(borogove::persistence::Sqlite_obj::__new(data->args.a0, Dynamic((hx::Object *)data->args.a1)));
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Status((hx::Object *)data->args.a0, true))->toString());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6210,29 +6243,30 @@ void *borogove_persistence_sqlite_new(const char *a0, void *a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute new() on the main thread and wait until execution completes
+	// queue a callback to execute toString() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_sqlite_get_message(void *a0, const char *a1, const char *a2, const char *a3, const char *a4, void (*a5) (void*, void *handler__context), void *a6) {
+const char *borogove_calls_media_stream_track_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::persistence::Sqlite((hx::Object *)a0, true))->getMessage__fromC(a1, a2, a3, a4, cpp::Function<void(void*, void * handler__context)>(a5), a6);
+		return HaxeCBridge::retainHaxeString((borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->id__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2; const char * a3; const char * a4; void (* a5) (void*, void * handler__context); void* a6;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::persistence::Sqlite((hx::Object *)data->args.a0, true))->getMessage__fromC(data->args.a1, data->args.a2, data->args.a3, data->args.a4, cpp::Function<void(void*, void * handler__context)>(data->args.a5), data->args.a6);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->id__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6245,28 +6279,30 @@ void borogove_persistence_sqlite_get_message(void *a0, const char *a1, const cha
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3, a4, a5, a6} };
+	Data data = { {a0} };
 
-	// queue a callback to execute getMessage__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute id__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_sqlite_remove_account(void *a0, const char *a1, bool a2) {
+bool borogove_calls_media_stream_track_muted(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::persistence::Sqlite((hx::Object *)a0, true))->removeAccount(a1, a2);
+		return (borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->muted__fromC();
 	}
 	struct Data {
-		struct {void * a0; const char * a1; bool a2;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::persistence::Sqlite((hx::Object *)data->args.a0, true))->removeAccount(data->args.a1, data->args.a2);
+				data->ret = (borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->muted__fromC();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6279,28 +6315,30 @@ void borogove_persistence_sqlite_remove_account(void *a0, const char *a1, bool a
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute removeAccount() on the main thread and wait until execution completes
+	// queue a callback to execute muted__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_persistence_sqlite_list_accounts(void *a0, void (*a1) (const char**, size_t, void *handler__context), void *a2) {
+const char *borogove_calls_media_stream_track_kind(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::persistence::Sqlite((hx::Object *)a0, true))->listAccounts__fromC(cpp::Function<void(const char**, size_t, void * handler__context)>(a1), a2);
+		return HaxeCBridge::retainHaxeString((borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->kind__fromC());
 	}
 	struct Data {
-		struct {void * a0; void (* a1) (const char**, size_t, void * handler__context); void* a2;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::persistence::Sqlite((hx::Object *)data->args.a0, true))->listAccounts__fromC(cpp::Function<void(const char**, size_t, void * handler__context)>(data->args.a1), data->args.a2);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->kind__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6313,29 +6351,30 @@ void borogove_persistence_sqlite_list_accounts(void *a0, void (*a1) (const char*
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute listAccounts__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute kind__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_form_submit_builder_new() {
+size_t borogove_calls_media_stream_track_supported_audio_formats(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject(borogove::FormSubmitBuilder_obj::__new());
+		return (borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->supportedAudioFormats__fromC(a1);
 	}
 	struct Data {
-		struct {} args;
+		struct {void * a0; void*** a1;} args;
 		HxSemaphore lock;
-		void * ret;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject(borogove::FormSubmitBuilder_obj::__new());
+				data->ret = (borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->supportedAudioFormats__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6348,21 +6387,21 @@ void *borogove_form_submit_builder_new() {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute new() on the main thread and wait until execution completes
+	// queue a callback to execute supportedAudioFormats__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_form_submit_builder_add(void *a0, const char *a1, const char *a2) {
+void borogove_calls_media_stream_track_add_pcm_listener(void *a0, void (*a1) (short*, size_t, int, int, void*), void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::FormSubmitBuilder((hx::Object *)a0, true))->add(a1, a2);
+		return (borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->addPCMListener__fromC(cpp::Function<void(short*, size_t, int, int, void*)>(a1), a2);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; const char * a2;} args;
+		struct {void * a0; void (* a1) (short*, size_t, int, int, void*); void* a2;} args;
 		HxSemaphore lock;
 	};
 	struct Callback {
@@ -6370,7 +6409,7 @@ void borogove_form_submit_builder_add(void *a0, const char *a1, const char *a2)
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::FormSubmitBuilder((hx::Object *)data->args.a0, true))->add(data->args.a1, data->args.a2);
+				(borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->addPCMListener__fromC(cpp::Function<void(short*, size_t, int, int, void*)>(data->args.a1), data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6385,27 +6424,26 @@ void borogove_form_submit_builder_add(void *a0, const char *a1, const char *a2)
 
 	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute add() on the main thread and wait until execution completes
+	// queue a callback to execute addPCMListener__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_chat_message_builder_new() {
+void borogove_calls_media_stream_track_add_ready_for_pcm_listener(void *a0, void (*a1) (void*), void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject(borogove::ChatMessageBuilder_obj::__new());
+		return (borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->addReadyForPCMListener__fromC(cpp::Function<void(void*)>(a1), a2);
 	}
 	struct Data {
-		struct {} args;
+		struct {void * a0; void (* a1) (void*); void* a2;} args;
 		HxSemaphore lock;
-		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject(borogove::ChatMessageBuilder_obj::__new());
+				(borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->addReadyForPCMListener__fromC(cpp::Function<void(void*)>(data->args.a1), data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6418,30 +6456,62 @@ void *borogove_chat_message_builder_new() {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute new() on the main thread and wait until execution completes
+	// queue a callback to execute addReadyForPCMListener__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_builder_local_id(void *a0) {
+void borogove_calls_media_stream_track_write_pcm(void *a0, const short *a1, size_t a2, int a3, int a4) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->localId__fromC());
+		return (borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->writePCM__fromC(a1, a2, a3, a4);
+	}
+	struct Data {
+		struct {void * a0; const short* a1; size_t a2; int a3; int a4;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				(borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->writePCM__fromC(data->args.a1, data->args.a2, data->args.a3, data->args.a4);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4} };
+
+	// queue a callback to execute writePCM__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_calls_media_stream_track_stop(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return (borogove::calls::MediaStreamTrack((hx::Object *)a0, true))->stop();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->localId__fromC());
+				(borogove::calls::MediaStreamTrack((hx::Object *)data->args.a0, true))->stop();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6456,27 +6526,27 @@ const char *borogove_chat_message_builder_local_id(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute localId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute stop() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_local_id(void *a0, const char *a1) {
+void *borogove_calls_audio_format_new(const char *a0, unsigned char a1, int a2, int a3) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_localId__fromC(a1);
+		return HaxeCBridge::retainHaxeObject(borogove::calls::AudioFormat_obj::__new(a0, a1, a2, a3));
 	}
 	struct Data {
-		struct {void * a0; const char * a1;} args;
+		struct {const char * a0; unsigned char a1; int a2; int a3;} args;
 		HxSemaphore lock;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_localId__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::calls::AudioFormat_obj::__new(data->args.a0, data->args.a1, data->args.a2, data->args.a3));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6489,29 +6559,30 @@ void borogove_chat_message_builder_set_local_id(void *a0, const char *a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0, a1, a2, a3} };
 
-	// queue a callback to execute set_localId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute new() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_builder_server_id(void *a0) {
+int borogove_calls_audio_format_clock_rate(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->serverId__fromC());
+		return (borogove::calls::AudioFormat((hx::Object *)a0, true))->clockRate__fromC();
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		int ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->serverId__fromC());
+				data->ret = (borogove::calls::AudioFormat((hx::Object *)data->args.a0, true))->clockRate__fromC();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6526,27 +6597,28 @@ const char *borogove_chat_message_builder_server_id(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute serverId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute clockRate__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_server_id(void *a0, const char *a1) {
+int borogove_calls_audio_format_channels(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_serverId__fromC(a1);
+		return (borogove::calls::AudioFormat((hx::Object *)a0, true))->channels__fromC();
 	}
 	struct Data {
-		struct {void * a0; const char * a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		int ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_serverId__fromC(data->args.a1);
+				data->ret = (borogove::calls::AudioFormat((hx::Object *)data->args.a0, true))->channels__fromC();
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6559,17 +6631,18 @@ void borogove_chat_message_builder_set_server_id(void *a0, const char *a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute set_serverId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute channels__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_builder_server_id_by(void *a0) {
+const char *borogove_command_name(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->serverIdBy__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::Command((hx::Object *)a0, true))->name__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -6581,7 +6654,7 @@ const char *borogove_chat_message_builder_server_id_by(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->serverIdBy__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Command((hx::Object *)data->args.a0, true))->name__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6596,19 +6669,19 @@ const char *borogove_chat_message_builder_server_id_by(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute serverIdBy__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute name__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_server_id_by(void *a0, const char *a1) {
+void borogove_command_execute(void *a0, void (*a1) (void*, void *handler__context), void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_serverIdBy__fromC(a1);
+		return (borogove::Command((hx::Object *)a0, true))->execute__fromC(cpp::Function<void(void*, void * handler__context)>(a1), a2);
 	}
 	struct Data {
-		struct {void * a0; const char * a1;} args;
+		struct {void * a0; void (* a1) (void*, void * handler__context); void* a2;} args;
 		HxSemaphore lock;
 	};
 	struct Callback {
@@ -6616,7 +6689,7 @@ void borogove_chat_message_builder_set_server_id_by(void *a0, const char *a1) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_serverIdBy__fromC(data->args.a1);
+				(borogove::Command((hx::Object *)data->args.a0, true))->execute__fromC(cpp::Function<void(void*, void * handler__context)>(data->args.a1), data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6629,29 +6702,29 @@ void borogove_chat_message_builder_set_server_id_by(void *a0, const char *a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute set_serverIdBy__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute execute__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-enum borogove_message_type borogove_chat_message_builder_type(void *a0) {
+const char *borogove_command_session_name(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return static_cast<enum borogove_message_type>((borogove::ChatMessageBuilder((hx::Object *)a0, true))->type__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::CommandSession((hx::Object *)a0, true))->name__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		enum borogove_message_type ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = static_cast<enum borogove_message_type>((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->type__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::CommandSession((hx::Object *)data->args.a0, true))->name__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6666,27 +6739,28 @@ enum borogove_message_type borogove_chat_message_builder_type(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute type__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute name__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_type(void *a0, enum borogove_message_type a1) {
+const char *borogove_command_session_status(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_type__fromC(a1);
+		return HaxeCBridge::retainHaxeString((borogove::CommandSession((hx::Object *)a0, true))->status__fromC());
 	}
 	struct Data {
-		struct {void * a0; enum borogove_message_type a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_type__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::CommandSession((hx::Object *)data->args.a0, true))->status__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6699,29 +6773,30 @@ void borogove_chat_message_builder_set_type(void *a0, enum borogove_message_type
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute set_type__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute status__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_builder_timestamp(void *a0) {
+size_t borogove_command_session_actions(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->timestamp__fromC());
+		return (borogove::CommandSession((hx::Object *)a0, true))->actions__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void*** a1;} args;
 		HxSemaphore lock;
-		const char * ret;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->timestamp__fromC());
+				data->ret = (borogove::CommandSession((hx::Object *)data->args.a0, true))->actions__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6734,29 +6809,30 @@ const char *borogove_chat_message_builder_timestamp(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute timestamp__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute actions__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_timestamp(void *a0, const char *a1) {
+size_t borogove_command_session_forms(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_timestamp__fromC(a1);
+		return (borogove::CommandSession((hx::Object *)a0, true))->forms__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; const char * a1;} args;
+		struct {void * a0; void*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_timestamp__fromC(data->args.a1);
+				data->ret = (borogove::CommandSession((hx::Object *)data->args.a0, true))->forms__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6771,27 +6847,27 @@ void borogove_chat_message_builder_set_timestamp(void *a0, const char *a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute set_timestamp__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute forms__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_builder_sender_id(void *a0) {
+void borogove_command_session_execute(void *a0, const char *a1, void *a2, int a3, void (*a4) (void*, void *handler__context), void *a5) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->senderId__fromC());
+		return (borogove::CommandSession((hx::Object *)a0, true))->execute__fromC(a1, Dynamic((hx::Object *)a2), a3, cpp::Function<void(void*, void * handler__context)>(a4), a5);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; const char * a1; void * a2; int a3; void (* a4) (void*, void * handler__context); void* a5;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->senderId__fromC());
+				(borogove::CommandSession((hx::Object *)data->args.a0, true))->execute__fromC(data->args.a1, Dynamic((hx::Object *)data->args.a2), data->args.a3, cpp::Function<void(void*, void * handler__context)>(data->args.a4), data->args.a5);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6804,29 +6880,29 @@ const char *borogove_chat_message_builder_sender_id(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2, a3, a4, a5} };
 
-	// queue a callback to execute senderId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute execute__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_sender_id(void *a0, const char *a1) {
+const char *borogove_form_option_label(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_senderId__fromC(a1);
+		return HaxeCBridge::retainHaxeString((borogove::FormOption((hx::Object *)a0, true))->label__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char * a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_senderId__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::FormOption((hx::Object *)data->args.a0, true))->label__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6839,29 +6915,30 @@ void borogove_chat_message_builder_set_sender_id(void *a0, const char *a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute set_senderId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute label__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_chat_message_builder_reply_to_message(void *a0) {
+const char *borogove_form_option_value(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject((borogove::ChatMessageBuilder((hx::Object *)a0, true))->replyToMessage__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::FormOption((hx::Object *)a0, true))->value__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		void * ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->replyToMessage__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::FormOption((hx::Object *)data->args.a0, true))->value__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6876,27 +6953,28 @@ void *borogove_chat_message_builder_reply_to_message(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute replyToMessage__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute value__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_reply_to_message(void *a0, void *a1) {
+const char *borogove_form_item_text(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_replyToMessage__fromC(Dynamic((hx::Object *)a1));
+		return HaxeCBridge::retainHaxeString((borogove::FormItem((hx::Object *)a0, true))->text__fromC());
 	}
 	struct Data {
-		struct {void * a0; void * a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_replyToMessage__fromC(Dynamic((hx::Object *)data->args.a1));
+				data->ret = HaxeCBridge::retainHaxeString((borogove::FormItem((hx::Object *)data->args.a0, true))->text__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6909,29 +6987,1472 @@ void borogove_chat_message_builder_set_reply_to_message(void *a0, void *a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute set_replyToMessage__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute text__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void *borogove_form_item_field(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeObject((borogove::FormItem((hx::Object *)a0, true))->field__fromC());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		void * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::FormItem((hx::Object *)data->args.a0, true))->field__fromC());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute field__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void *borogove_form_item_section(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeObject((borogove::FormItem((hx::Object *)a0, true))->section__fromC());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		void * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::FormItem((hx::Object *)data->args.a0, true))->section__fromC());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute section__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_form_item_status(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::FormItem((hx::Object *)a0, true))->status__fromC());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::FormItem((hx::Object *)data->args.a0, true))->status__fromC());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute status__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+size_t borogove_form_item_table_header(void *a0, void ***a1) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return (borogove::FormItem((hx::Object *)a0, true))->tableHeader__fromC(a1);
+	}
+	struct Data {
+		struct {void * a0; void*** a1;} args;
+		HxSemaphore lock;
+		size_t ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = (borogove::FormItem((hx::Object *)data->args.a0, true))->tableHeader__fromC(data->args.a1);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1} };
+
+	// queue a callback to execute tableHeader__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_form_field_name(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->name__fromC());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->name__fromC());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute name__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_form_field_label(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->label__fromC());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->label__fromC());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute label__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_form_field_desc(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->desc__fromC());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->desc__fromC());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute desc__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+size_t borogove_form_field_value(void *a0, const char ***a1) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return (borogove::FormField((hx::Object *)a0, true))->value__fromC(a1);
+	}
+	struct Data {
+		struct {void * a0; const char*** a1;} args;
+		HxSemaphore lock;
+		size_t ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = (borogove::FormField((hx::Object *)data->args.a0, true))->value__fromC(data->args.a1);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1} };
+
+	// queue a callback to execute value__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+bool borogove_form_field_required(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return (borogove::FormField((hx::Object *)a0, true))->required__fromC();
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		bool ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = (borogove::FormField((hx::Object *)data->args.a0, true))->required__fromC();
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute required__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_form_field_type(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->type__fromC());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->type__fromC());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute type__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_form_field_datatype(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->datatype__fromC());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->datatype__fromC());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute datatype__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+size_t borogove_form_field_options(void *a0, void ***a1) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return (borogove::FormField((hx::Object *)a0, true))->options__fromC(a1);
+	}
+	struct Data {
+		struct {void * a0; void*** a1;} args;
+		HxSemaphore lock;
+		size_t ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = (borogove::FormField((hx::Object *)data->args.a0, true))->options__fromC(data->args.a1);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1} };
+
+	// queue a callback to execute options__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+bool borogove_form_field_open(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return (borogove::FormField((hx::Object *)a0, true))->open__fromC();
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		bool ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = (borogove::FormField((hx::Object *)data->args.a0, true))->open__fromC();
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute open__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_form_field_range_min(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->rangeMin__fromC());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->rangeMin__fromC());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute rangeMin__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_form_field_range_max(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->rangeMax__fromC());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->rangeMax__fromC());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute rangeMax__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_form_field_regex(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)a0, true))->regex__fromC());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::FormField((hx::Object *)data->args.a0, true))->regex__fromC());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute regex__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_form_section_title(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString(borogove::FormSection__Companion_obj::title__fromC(Dynamic((hx::Object *)a0)));
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString(borogove::FormSection__Companion_obj::title__fromC(Dynamic((hx::Object *)data->args.a0)));
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute title__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+size_t borogove_form_section_items(void *a0, void ***a1) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::FormSection__Companion_obj::items__fromC(Dynamic((hx::Object *)a0), a1);
+	}
+	struct Data {
+		struct {void * a0; void*** a1;} args;
+		HxSemaphore lock;
+		size_t ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = borogove::FormSection__Companion_obj::items__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1} };
+
+	// queue a callback to execute items__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+bool borogove_form_is_result(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return (borogove::Form((hx::Object *)a0, true))->isResult();
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		bool ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = (borogove::Form((hx::Object *)data->args.a0, true))->isResult();
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute isResult() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_form_title(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::Form((hx::Object *)a0, true))->title());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Form((hx::Object *)data->args.a0, true))->title());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute title() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_form_url(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::Form((hx::Object *)a0, true))->url());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Form((hx::Object *)data->args.a0, true))->url());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute url() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+size_t borogove_form_items(void *a0, void ***a1) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return (borogove::Form((hx::Object *)a0, true))->items__fromC(a1);
+	}
+	struct Data {
+		struct {void * a0; void*** a1;} args;
+		HxSemaphore lock;
+		size_t ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = (borogove::Form((hx::Object *)data->args.a0, true))->items__fromC(data->args.a1);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1} };
+
+	// queue a callback to execute items__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_sync_point(void *a0, const char *a1, const char *a2, void (*a3) (void*, void *handler__context), void *a4) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::syncPoint__fromC(Dynamic((hx::Object *)a0), a1, a2, cpp::Function<void(void*, void * handler__context)>(a3), a4);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; const char * a2; void (* a3) (void*, void * handler__context); void* a4;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::syncPoint__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, cpp::Function<void(void*, void * handler__context)>(data->args.a3), data->args.a4);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4} };
+
+	// queue a callback to execute syncPoint__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_store_chats(void *a0, const char *a1, void *const *a2, size_t a3) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::storeChats__fromC(Dynamic((hx::Object *)a0), a1, a2, a3);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; void* const* a2; size_t a3;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::storeChats__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3} };
+
+	// queue a callback to execute storeChats__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_store_messages(void *a0, const char *a1, void *const *a2, size_t a3, void (*a4) (void**, size_t, void *handler__context), void *a5) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::storeMessages__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, cpp::Function<void(void**, size_t, void * handler__context)>(a4), a5);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; void* const* a2; size_t a3; void (* a4) (void**, size_t, void * handler__context); void* a5;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::storeMessages__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a4), data->args.a5);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4, a5} };
+
+	// queue a callback to execute storeMessages__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_update_message(void *a0, const char *a1, void *a2) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::updateMessage__fromC(Dynamic((hx::Object *)a0), a1, Dynamic((hx::Object *)a2));
+	}
+	struct Data {
+		struct {void * a0; const char * a1; void * a2;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::updateMessage__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, Dynamic((hx::Object *)data->args.a2));
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2} };
+
+	// queue a callback to execute updateMessage__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_update_message_status(void *a0, const char *a1, const char *a2, enum borogove_message_status a3, const char *a4, void (*a5) (void*, void *handler__context), void *a6) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::updateMessageStatus__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, a4, cpp::Function<void(void*, void * handler__context)>(a5), a6);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; const char * a2; enum borogove_message_status a3; const char * a4; void (* a5) (void*, void * handler__context); void* a6;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::updateMessageStatus__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, data->args.a4, cpp::Function<void(void*, void * handler__context)>(data->args.a5), data->args.a6);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4, a5, a6} };
+
+	// queue a callback to execute updateMessageStatus__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_get_message(void *a0, const char *a1, const char *a2, const char *a3, const char *a4, void (*a5) (void*, void *handler__context), void *a6) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::getMessage__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, a4, cpp::Function<void(void*, void * handler__context)>(a5), a6);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; const char * a2; const char * a3; const char * a4; void (* a5) (void*, void * handler__context); void* a6;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::getMessage__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, data->args.a4, cpp::Function<void(void*, void * handler__context)>(data->args.a5), data->args.a6);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4, a5, a6} };
+
+	// queue a callback to execute getMessage__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_get_messages_before(void *a0, const char *a1, const char *a2, void *a3, void (*a4) (void**, size_t, void *handler__context), void *a5) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::getMessagesBefore__fromC(Dynamic((hx::Object *)a0), a1, a2, Dynamic((hx::Object *)a3), cpp::Function<void(void**, size_t, void * handler__context)>(a4), a5);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; const char * a2; void * a3; void (* a4) (void**, size_t, void * handler__context); void* a5;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::getMessagesBefore__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, Dynamic((hx::Object *)data->args.a3), cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a4), data->args.a5);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4, a5} };
+
+	// queue a callback to execute getMessagesBefore__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_get_messages_after(void *a0, const char *a1, const char *a2, void *a3, void (*a4) (void**, size_t, void *handler__context), void *a5) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::getMessagesAfter__fromC(Dynamic((hx::Object *)a0), a1, a2, Dynamic((hx::Object *)a3), cpp::Function<void(void**, size_t, void * handler__context)>(a4), a5);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; const char * a2; void * a3; void (* a4) (void**, size_t, void * handler__context); void* a5;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::getMessagesAfter__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, Dynamic((hx::Object *)data->args.a3), cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a4), data->args.a5);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4, a5} };
+
+	// queue a callback to execute getMessagesAfter__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_get_messages_around(void *a0, const char *a1, void *a2, void (*a3) (void**, size_t, void *handler__context), void *a4) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::getMessagesAround__fromC(Dynamic((hx::Object *)a0), a1, Dynamic((hx::Object *)a2), cpp::Function<void(void**, size_t, void * handler__context)>(a3), a4);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; void * a2; void (* a3) (void**, size_t, void * handler__context); void* a4;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::getMessagesAround__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, Dynamic((hx::Object *)data->args.a2), cpp::Function<void(void**, size_t, void * handler__context)>(data->args.a3), data->args.a4);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4} };
+
+	// queue a callback to execute getMessagesAround__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_has_media(void *a0, const char *a1, const unsigned char *a2, size_t a3, void (*a4) (bool, void *handler__context), void *a5) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::hasMedia__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, cpp::Function<void(bool, void * handler__context)>(a4), a5);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; const unsigned char* a2; size_t a3; void (* a4) (bool, void * handler__context); void* a5;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::hasMedia__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, cpp::Function<void(bool, void * handler__context)>(data->args.a4), data->args.a5);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4, a5} };
+
+	// queue a callback to execute hasMedia__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_store_media(void *a0, const char *a1, const unsigned char *a2, size_t a3, void (*a4) (bool, void *handler__context), void *a5) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::storeMedia__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, cpp::Function<void(bool, void * handler__context)>(a4), a5);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; const unsigned char* a2; size_t a3; void (* a4) (bool, void * handler__context); void* a5;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::storeMedia__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, cpp::Function<void(bool, void * handler__context)>(data->args.a4), data->args.a5);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4, a5} };
+
+	// queue a callback to execute storeMedia__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_remove_media(void *a0, const char *a1, const unsigned char *a2, size_t a3, void (*a4) (bool, void *handler__context), void *a5) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::removeMedia__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, cpp::Function<void(bool, void * handler__context)>(a4), a5);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; const unsigned char* a2; size_t a3; void (* a4) (bool, void * handler__context); void* a5;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::removeMedia__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, cpp::Function<void(bool, void * handler__context)>(data->args.a4), data->args.a5);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4, a5} };
+
+	// queue a callback to execute removeMedia__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_store_login(void *a0, const char *a1, const char *a2, const char *a3, const char *a4, void (*a5) (bool, void *handler__context), void *a6) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::storeLogin__fromC(Dynamic((hx::Object *)a0), a1, a2, a3, a4, cpp::Function<void(bool, void * handler__context)>(a5), a6);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; const char * a2; const char * a3; const char * a4; void (* a5) (bool, void * handler__context); void* a6;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::storeLogin__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, data->args.a3, data->args.a4, cpp::Function<void(bool, void * handler__context)>(data->args.a5), data->args.a6);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4, a5, a6} };
+
+	// queue a callback to execute storeLogin__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_remove_account(void *a0, const char *a1, bool a2, void (*a3) (bool, void *handler__context), void *a4) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::removeAccount__fromC(Dynamic((hx::Object *)a0), a1, a2, cpp::Function<void(bool, void * handler__context)>(a3), a4);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; bool a2; void (* a3) (bool, void * handler__context); void* a4;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::removeAccount__fromC(Dynamic((hx::Object *)data->args.a0), data->args.a1, data->args.a2, cpp::Function<void(bool, void * handler__context)>(data->args.a3), data->args.a4);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4} };
+
+	// queue a callback to execute removeAccount__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_list_accounts(void *a0, void (*a1) (const char**, size_t, void *handler__context), void *a2) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return borogove::Persistence__Companion_obj::listAccounts__fromC(Dynamic((hx::Object *)a0), cpp::Function<void(const char**, size_t, void * handler__context)>(a1), a2);
+	}
+	struct Data {
+		struct {void * a0; void (* a1) (const char**, size_t, void * handler__context); void* a2;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				borogove::Persistence__Companion_obj::listAccounts__fromC(Dynamic((hx::Object *)data->args.a0), cpp::Function<void(const char**, size_t, void * handler__context)>(data->args.a1), data->args.a2);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2} };
+
+	// queue a callback to execute listAccounts__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void *borogove_persistence_sqlite_new(const char *a0, void *a1) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeObject(borogove::persistence::Sqlite_obj::__new(a0, Dynamic((hx::Object *)a1)));
+	}
+	struct Data {
+		struct {const char * a0; void * a1;} args;
+		HxSemaphore lock;
+		void * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::persistence::Sqlite_obj::__new(data->args.a0, Dynamic((hx::Object *)data->args.a1)));
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1} };
+
+	// queue a callback to execute new() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_persistence_sqlite_get_message(void *a0, const char *a1, const char *a2, const char *a3, const char *a4, void (*a5) (void*, void *handler__context), void *a6) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return (borogove::persistence::Sqlite((hx::Object *)a0, true))->getMessage__fromC(a1, a2, a3, a4, cpp::Function<void(void*, void * handler__context)>(a5), a6);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; const char * a2; const char * a3; const char * a4; void (* a5) (void*, void * handler__context); void* a6;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				(borogove::persistence::Sqlite((hx::Object *)data->args.a0, true))->getMessage__fromC(data->args.a1, data->args.a2, data->args.a3, data->args.a4, cpp::Function<void(void*, void * handler__context)>(data->args.a5), data->args.a6);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3, a4, a5, a6} };
+
+	// queue a callback to execute getMessage__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void *borogove_form_submit_builder_new() {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeObject(borogove::FormSubmitBuilder_obj::__new());
+	}
+	struct Data {
+		struct {} args;
+		HxSemaphore lock;
+		void * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::FormSubmitBuilder_obj::__new());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {} };
+
+	// queue a callback to execute new() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_form_submit_builder_add(void *a0, const char *a1, const char *a2) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return (borogove::FormSubmitBuilder((hx::Object *)a0, true))->add(a1, a2);
+	}
+	struct Data {
+		struct {void * a0; const char * a1; const char * a2;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				(borogove::FormSubmitBuilder((hx::Object *)data->args.a0, true))->add(data->args.a1, data->args.a2);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2} };
+
+	// queue a callback to execute add() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_builder_thread_id(void *a0) {
+void *borogove_chat_message_builder_new() {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->threadId__fromC());
+		return HaxeCBridge::retainHaxeObject(borogove::ChatMessageBuilder_obj::__new());
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {} args;
 		HxSemaphore lock;
-		const char * ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->threadId__fromC());
+				data->ret = HaxeCBridge::retainHaxeObject(borogove::ChatMessageBuilder_obj::__new());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6944,29 +8465,30 @@ const char *borogove_chat_message_builder_thread_id(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {} };
 
-	// queue a callback to execute threadId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute new() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_thread_id(void *a0, const char *a1) {
+const char *borogove_chat_message_builder_local_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_threadId__fromC(a1);
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->localId__fromC());
 	}
 	struct Data {
-		struct {void * a0; const char * a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_threadId__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->localId__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -6979,29 +8501,29 @@ void borogove_chat_message_builder_set_thread_id(void *a0, const char *a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute set_threadId__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute localId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_chat_message_builder_attachments(void *a0, void ***a1) {
+void borogove_chat_message_builder_set_local_id(void *a0, const char *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->attachments__fromC(a1);
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_localId__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; void*** a1;} args;
+		struct {void * a0; const char * a1;} args;
 		HxSemaphore lock;
-		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->attachments__fromC(data->args.a1);
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_localId__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7016,16 +8538,15 @@ size_t borogove_chat_message_builder_attachments(void *a0, void ***a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute attachments__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set_localId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_builder_text(void *a0) {
+const char *borogove_chat_message_builder_server_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->text__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->serverId__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -7037,7 +8558,7 @@ const char *borogove_chat_message_builder_text(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->text__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->serverId__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7052,16 +8573,16 @@ const char *borogove_chat_message_builder_text(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute text__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute serverId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_text(void *a0, const char *a1) {
+void borogove_chat_message_builder_set_server_id(void *a0, const char *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_text__fromC(a1);
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_serverId__fromC(a1);
 	}
 	struct Data {
 		struct {void * a0; const char * a1;} args;
@@ -7072,7 +8593,7 @@ void borogove_chat_message_builder_set_text(void *a0, const char *a1) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_text__fromC(data->args.a1);
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_serverId__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7087,15 +8608,15 @@ void borogove_chat_message_builder_set_text(void *a0, const char *a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute set_text__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set_serverId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_builder_lang(void *a0) {
+const char *borogove_chat_message_builder_server_id_by(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->lang__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->serverIdBy__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -7107,7 +8628,7 @@ const char *borogove_chat_message_builder_lang(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->lang__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->serverIdBy__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7122,16 +8643,16 @@ const char *borogove_chat_message_builder_lang(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute lang__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute serverIdBy__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_lang(void *a0, const char *a1) {
+void borogove_chat_message_builder_set_server_id_by(void *a0, const char *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_lang__fromC(a1);
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_serverIdBy__fromC(a1);
 	}
 	struct Data {
 		struct {void * a0; const char * a1;} args;
@@ -7142,7 +8663,7 @@ void borogove_chat_message_builder_set_lang(void *a0, const char *a1) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_lang__fromC(data->args.a1);
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_serverIdBy__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7157,27 +8678,27 @@ void borogove_chat_message_builder_set_lang(void *a0, const char *a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute set_lang__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set_serverIdBy__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-enum borogove_message_direction borogove_chat_message_builder_direction(void *a0) {
+enum borogove_message_type borogove_chat_message_builder_type(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return static_cast<enum borogove_message_direction>((borogove::ChatMessageBuilder((hx::Object *)a0, true))->direction__fromC());
+		return static_cast<enum borogove_message_type>((borogove::ChatMessageBuilder((hx::Object *)a0, true))->type__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		enum borogove_message_direction ret;
+		enum borogove_message_type ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = static_cast<enum borogove_message_direction>((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->direction__fromC());
+				data->ret = static_cast<enum borogove_message_type>((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->type__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7192,19 +8713,19 @@ enum borogove_message_direction borogove_chat_message_builder_direction(void *a0
 
 	Data data = { {a0} };
 
-	// queue a callback to execute direction__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute type__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_direction(void *a0, enum borogove_message_direction a1) {
+void borogove_chat_message_builder_set_type(void *a0, enum borogove_message_type a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_direction__fromC(a1);
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_type__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; enum borogove_message_direction a1;} args;
+		struct {void * a0; enum borogove_message_type a1;} args;
 		HxSemaphore lock;
 	};
 	struct Callback {
@@ -7212,7 +8733,7 @@ void borogove_chat_message_builder_set_direction(void *a0, enum borogove_message
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_direction__fromC(data->args.a1);
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_type__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7227,27 +8748,27 @@ void borogove_chat_message_builder_set_direction(void *a0, enum borogove_message
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute set_direction__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set_type__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-enum borogove_message_status borogove_chat_message_builder_status(void *a0) {
+const char *borogove_chat_message_builder_timestamp(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return static_cast<enum borogove_message_status>((borogove::ChatMessageBuilder((hx::Object *)a0, true))->status__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->timestamp__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		enum borogove_message_status ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = static_cast<enum borogove_message_status>((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->status__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->timestamp__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7262,19 +8783,19 @@ enum borogove_message_status borogove_chat_message_builder_status(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute status__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute timestamp__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_status(void *a0, enum borogove_message_status a1) {
+void borogove_chat_message_builder_set_timestamp(void *a0, const char *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_status__fromC(a1);
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_timestamp__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; enum borogove_message_status a1;} args;
+		struct {void * a0; const char * a1;} args;
 		HxSemaphore lock;
 	};
 	struct Callback {
@@ -7282,7 +8803,7 @@ void borogove_chat_message_builder_set_status(void *a0, enum borogove_message_st
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_status__fromC(data->args.a1);
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_timestamp__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7297,15 +8818,15 @@ void borogove_chat_message_builder_set_status(void *a0, enum borogove_message_st
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute set_status__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set_timestamp__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_builder_status_text(void *a0) {
+const char *borogove_chat_message_builder_sender_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->statusText__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->senderId__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -7317,7 +8838,7 @@ const char *borogove_chat_message_builder_status_text(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->statusText__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->senderId__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7332,16 +8853,16 @@ const char *borogove_chat_message_builder_status_text(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute statusText__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute senderId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_status_text(void *a0, const char *a1) {
+void borogove_chat_message_builder_set_sender_id(void *a0, const char *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_statusText__fromC(a1);
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_senderId__fromC(a1);
 	}
 	struct Data {
 		struct {void * a0; const char * a1;} args;
@@ -7352,7 +8873,7 @@ void borogove_chat_message_builder_set_status_text(void *a0, const char *a1) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_statusText__fromC(data->args.a1);
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_senderId__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7367,26 +8888,27 @@ void borogove_chat_message_builder_set_status_text(void *a0, const char *a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute set_statusText__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set_senderId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_versions(void *a0, void *const *a1, size_t a2) {
+void *borogove_chat_message_builder_reply_to_message(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_versions__fromC(a1, a2);
+		return HaxeCBridge::retainHaxeObject((borogove::ChatMessageBuilder((hx::Object *)a0, true))->replyToMessage__fromC());
 	}
 	struct Data {
-		struct {void * a0; void* const* a1; size_t a2;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_versions__fromC(data->args.a1, data->args.a2);
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->replyToMessage__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7399,29 +8921,29 @@ void borogove_chat_message_builder_set_versions(void *a0, void *const *a1, size_
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2} };
+	Data data = { {a0} };
 
-	// queue a callback to execute set_versions__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute replyToMessage__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_chat_message_builder_versions(void *a0, void ***a1) {
+void borogove_chat_message_builder_set_reply_to_message(void *a0, void *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->versions__fromC(a1);
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_replyToMessage__fromC(Dynamic((hx::Object *)a1));
 	}
 	struct Data {
-		struct {void * a0; void*** a1;} args;
+		struct {void * a0; void * a1;} args;
 		HxSemaphore lock;
-		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->versions__fromC(data->args.a1);
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_replyToMessage__fromC(Dynamic((hx::Object *)data->args.a1));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7436,28 +8958,27 @@ size_t borogove_chat_message_builder_versions(void *a0, void ***a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute versions__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set_replyToMessage__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_chat_message_builder_encryption(void *a0) {
+const char *borogove_chat_message_builder_thread_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject((borogove::ChatMessageBuilder((hx::Object *)a0, true))->encryption__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->threadId__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		void * ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->encryption__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->threadId__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7472,19 +8993,19 @@ void *borogove_chat_message_builder_encryption(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute encryption__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute threadId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_encryption(void *a0, void *a1) {
+void borogove_chat_message_builder_set_thread_id(void *a0, const char *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_encryption__fromC(Dynamic((hx::Object *)a1));
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_threadId__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; void * a1;} args;
+		struct {void * a0; const char * a1;} args;
 		HxSemaphore lock;
 	};
 	struct Callback {
@@ -7492,7 +9013,7 @@ void borogove_chat_message_builder_set_encryption(void *a0, void *a1) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_encryption__fromC(Dynamic((hx::Object *)data->args.a1));
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_threadId__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7507,26 +9028,27 @@ void borogove_chat_message_builder_set_encryption(void *a0, void *a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute set_encryption__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set_threadId__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_add_attachment(void *a0, void *a1) {
+size_t borogove_chat_message_builder_attachments(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->addAttachment(Dynamic((hx::Object *)a1));
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->attachments__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; void * a1;} args;
+		struct {void * a0; void*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->addAttachment(Dynamic((hx::Object *)data->args.a1));
+				data->ret = (borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->attachments__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7541,15 +9063,52 @@ void borogove_chat_message_builder_add_attachment(void *a0, void *a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute addAttachment() on the main thread and wait until execution completes
+	// queue a callback to execute attachments__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_chat_message_builder_lang(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->lang__fromC());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->lang__fromC());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute lang__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_chat_message_builder_set_html(void *a0, const char *a1) {
+void borogove_chat_message_builder_set_lang(void *a0, const char *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->setHtml(a1);
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_lang__fromC(a1);
 	}
 	struct Data {
 		struct {void * a0; const char * a1;} args;
@@ -7560,7 +9119,7 @@ void borogove_chat_message_builder_set_html(void *a0, const char *a1) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->setHtml(data->args.a1);
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_lang__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7575,27 +9134,27 @@ void borogove_chat_message_builder_set_html(void *a0, const char *a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute setHtml() on the main thread and wait until execution completes
+	// queue a callback to execute set_lang__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_builder_chat_id(void *a0) {
+enum borogove_message_direction borogove_chat_message_builder_direction(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->chatId());
+		return static_cast<enum borogove_message_direction>((borogove::ChatMessageBuilder((hx::Object *)a0, true))->direction__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		const char * ret;
+		enum borogove_message_direction ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->chatId());
+				data->ret = static_cast<enum borogove_message_direction>((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->direction__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7610,28 +9169,27 @@ const char *borogove_chat_message_builder_chat_id(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute chatId() on the main thread and wait until execution completes
+	// queue a callback to execute direction__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_chat_message_builder_get_sender_id(void *a0) {
+void borogove_chat_message_builder_set_direction(void *a0, enum borogove_message_direction a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->get_senderId());
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_direction__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; enum borogove_message_direction a1;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->get_senderId());
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_direction__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7644,30 +9202,29 @@ const char *borogove_chat_message_builder_get_sender_id(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute get_senderId() on the main thread and wait until execution completes
+	// queue a callback to execute set_direction__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void *borogove_chat_message_builder_build(void *a0) {
+enum borogove_message_status borogove_chat_message_builder_status(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeObject((borogove::ChatMessageBuilder((hx::Object *)a0, true))->build());
+		return static_cast<enum borogove_message_status>((borogove::ChatMessageBuilder((hx::Object *)a0, true))->status__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
 		HxSemaphore lock;
-		void * ret;
+		enum borogove_message_status ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->build());
+				data->ret = static_cast<enum borogove_message_status>((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->status__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7682,28 +9239,27 @@ void *borogove_chat_message_builder_build(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute build() on the main thread and wait until execution completes
+	// queue a callback to execute status__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_participant_display_name(void *a0) {
+void borogove_chat_message_builder_set_status(void *a0, enum borogove_message_status a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Participant((hx::Object *)a0, true))->displayName__fromC());
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_status__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; enum borogove_message_status a1;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Participant((hx::Object *)data->args.a0, true))->displayName__fromC());
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_status__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7716,18 +9272,17 @@ const char *borogove_participant_display_name(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute displayName__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set_status__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_participant_photo_uri(void *a0) {
+const char *borogove_chat_message_builder_status_text(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Participant((hx::Object *)a0, true))->photoUri__fromC());
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->statusText__fromC());
 	}
 	struct Data {
 		struct {void * a0;} args;
@@ -7739,7 +9294,7 @@ const char *borogove_participant_photo_uri(void *a0) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Participant((hx::Object *)data->args.a0, true))->photoUri__fromC());
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->statusText__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7754,28 +9309,27 @@ const char *borogove_participant_photo_uri(void *a0) {
 
 	Data data = { {a0} };
 
-	// queue a callback to execute photoUri__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute statusText__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_participant_placeholder_uri(void *a0) {
+void borogove_chat_message_builder_set_status_text(void *a0, const char *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::Participant((hx::Object *)a0, true))->placeholderUri__fromC());
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_statusText__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; const char * a1;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::Participant((hx::Object *)data->args.a0, true))->placeholderUri__fromC());
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_statusText__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7788,30 +9342,28 @@ const char *borogove_participant_placeholder_uri(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute placeholderUri__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set_statusText__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-bool borogove_participant_is_self(void *a0) {
+void borogove_chat_message_builder_set_versions(void *a0, void *const *a1, size_t a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Participant((hx::Object *)a0, true))->isSelf__fromC();
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_versions__fromC(a1, a2);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void* const* a1; size_t a2;} args;
 		HxSemaphore lock;
-		bool ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Participant((hx::Object *)data->args.a0, true))->isSelf__fromC();
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_versions__fromC(data->args.a1, data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7824,29 +9376,29 @@ bool borogove_participant_is_self(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute isSelf__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set_versions__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_participant_profile(void *a0, void *a1, void (*a2) (void*, void *handler__context), void *a3) {
+size_t borogove_chat_message_builder_versions(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Participant((hx::Object *)a0, true))->profile__fromC(Dynamic((hx::Object *)a1), cpp::Function<void(void*, void * handler__context)>(a2), a3);
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->versions__fromC(a1);
 	}
 	struct Data {
-		struct {void * a0; void * a1; void (* a2) (void*, void * handler__context); void* a3;} args;
+		struct {void * a0; void*** a1;} args;
 		HxSemaphore lock;
+		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Participant((hx::Object *)data->args.a0, true))->profile__fromC(Dynamic((hx::Object *)data->args.a1), cpp::Function<void(void*, void * handler__context)>(data->args.a2), data->args.a3);
+				data->ret = (borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->versions__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7859,29 +9411,30 @@ void borogove_participant_profile(void *a0, void *a1, void (*a2) (void*, void *h
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute profile__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute versions__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_profile_items(void *a0, void ***a1) {
+void *borogove_chat_message_builder_encryption(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Profile((hx::Object *)a0, true))->items__fromC(a1);
+		return HaxeCBridge::retainHaxeObject((borogove::ChatMessageBuilder((hx::Object *)a0, true))->encryption__fromC());
 	}
 	struct Data {
-		struct {void * a0; void*** a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		size_t ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Profile((hx::Object *)data->args.a0, true))->items__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->encryption__fromC());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7894,30 +9447,29 @@ size_t borogove_profile_items(void *a0, void ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute items__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute encryption__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_profile_item_id(void *a0) {
+void borogove_chat_message_builder_set_encryption(void *a0, void *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ProfileItem((hx::Object *)a0, true))->id__fromC());
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_encryption__fromC(Dynamic((hx::Object *)a1));
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void * a1;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ProfileItem((hx::Object *)data->args.a0, true))->id__fromC());
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_encryption__fromC(Dynamic((hx::Object *)data->args.a1));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7930,30 +9482,28 @@ const char *borogove_profile_item_id(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute id__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set_encryption__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-const char *borogove_profile_item_key(void *a0) {
+void borogove_chat_message_builder_set_link_metadata(void *a0, void *const *a1, size_t a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::ProfileItem((hx::Object *)a0, true))->key__fromC());
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->set_linkMetadata__fromC(a1, a2);
 	}
 	struct Data {
-		struct {void * a0;} args;
+		struct {void * a0; void* const* a1; size_t a2;} args;
 		HxSemaphore lock;
-		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::ProfileItem((hx::Object *)data->args.a0, true))->key__fromC());
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->set_linkMetadata__fromC(data->args.a1, data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -7966,18 +9516,17 @@ const char *borogove_profile_item_key(void *a0) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute key__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute set_linkMetadata__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_profile_item_parameters(void *a0, void ***a1) {
+size_t borogove_chat_message_builder_link_metadata(void *a0, void ***a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ProfileItem((hx::Object *)a0, true))->parameters__fromC(a1);
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->linkMetadata__fromC(a1);
 	}
 	struct Data {
 		struct {void * a0; void*** a1;} args;
@@ -7989,7 +9538,7 @@ size_t borogove_profile_item_parameters(void *a0, void ***a1) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->parameters__fromC(data->args.a1);
+				data->ret = (borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->linkMetadata__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -8004,28 +9553,27 @@ size_t borogove_profile_item_parameters(void *a0, void ***a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute parameters__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute linkMetadata__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_profile_item_text(void *a0, const char ***a1) {
+void borogove_chat_message_builder_add_attachment(void *a0, void *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ProfileItem((hx::Object *)a0, true))->text__fromC(a1);
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->addAttachment(Dynamic((hx::Object *)a1));
 	}
 	struct Data {
-		struct {void * a0; const char*** a1;} args;
+		struct {void * a0; void * a1;} args;
 		HxSemaphore lock;
-		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->text__fromC(data->args.a1);
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->addAttachment(Dynamic((hx::Object *)data->args.a1));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -8040,28 +9588,26 @@ size_t borogove_profile_item_text(void *a0, const char ***a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute text__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute addAttachment() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_profile_item_uri(void *a0, const char ***a1) {
+void borogove_chat_message_builder_set_body(void *a0, void *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ProfileItem((hx::Object *)a0, true))->uri__fromC(a1);
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->setBody(Dynamic((hx::Object *)a1));
 	}
 	struct Data {
-		struct {void * a0; const char*** a1;} args;
+		struct {void * a0; void * a1;} args;
 		HxSemaphore lock;
-		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->uri__fromC(data->args.a1);
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->setBody(Dynamic((hx::Object *)data->args.a1));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -8076,28 +9622,26 @@ size_t borogove_profile_item_uri(void *a0, const char ***a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute uri__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute setBody() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_profile_item_date(void *a0, const char ***a1) {
+void borogove_chat_message_builder_set_subject(void *a0, const char *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ProfileItem((hx::Object *)a0, true))->date__fromC(a1);
+		return (borogove::ChatMessageBuilder((hx::Object *)a0, true))->setSubject(a1);
 	}
 	struct Data {
-		struct {void * a0; const char*** a1;} args;
+		struct {void * a0; const char * a1;} args;
 		HxSemaphore lock;
-		size_t ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->date__fromC(data->args.a1);
+				(borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->setSubject(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -8112,28 +9656,27 @@ size_t borogove_profile_item_date(void *a0, const char ***a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute date__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute setSubject() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
-	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_profile_item_time(void *a0, const char ***a1) {
+const char *borogove_chat_message_builder_chat_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ProfileItem((hx::Object *)a0, true))->time__fromC(a1);
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->chatId());
 	}
 	struct Data {
-		struct {void * a0; const char*** a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		size_t ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->time__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->chatId());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -8146,30 +9689,30 @@ size_t borogove_profile_item_time(void *a0, const char ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute time__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute chatId() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_profile_item_datetime(void *a0, const char ***a1) {
+const char *borogove_chat_message_builder_get_sender_id(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ProfileItem((hx::Object *)a0, true))->datetime__fromC(a1);
+		return HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)a0, true))->get_senderId());
 	}
 	struct Data {
-		struct {void * a0; const char*** a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		size_t ret;
+		const char * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->datetime__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeString((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->get_senderId());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -8182,30 +9725,30 @@ size_t borogove_profile_item_datetime(void *a0, const char ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute datetime__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute get_senderId() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_profile_item_language_tag(void *a0, const char ***a1) {
+void *borogove_chat_message_builder_build(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::ProfileItem((hx::Object *)a0, true))->languageTag__fromC(a1);
+		return HaxeCBridge::retainHaxeObject((borogove::ChatMessageBuilder((hx::Object *)a0, true))->build());
 	}
 	struct Data {
-		struct {void * a0; const char*** a1;} args;
+		struct {void * a0;} args;
 		HxSemaphore lock;
-		size_t ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::ProfileItem((hx::Object *)data->args.a0, true))->languageTag__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::ChatMessageBuilder((hx::Object *)data->args.a0, true))->build());
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -8218,9 +9761,9 @@ size_t borogove_profile_item_language_tag(void *a0, const char ***a1) {
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1} };
+	Data data = { {a0} };
 
-	// queue a callback to execute languageTag__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute build() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
@@ -8730,40 +10273,6 @@ const char *borogove_notification_timestamp(void *a0) {
 	return data.ret;
 }
 
-HAXE_C_BRIDGE_LINKAGE
-void borogove_event_emitter_remove_event_listener(void *a0, borogove_event_handler_token a1) {
-	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::EventEmitter((hx::Object *)a0, true))->removeEventListener(a1);
-	}
-	struct Data {
-		struct {void * a0; borogove_event_handler_token a1;} args;
-		HxSemaphore lock;
-	};
-	struct Callback {
-		static void run(void* p) {
-			// executed within the haxe main thread
-			Data* data = (Data*) p;
-			try {
-				(borogove::EventEmitter((hx::Object *)data->args.a0, true))->removeEventListener(data->args.a1);
-				data->lock.Set();
-			} catch(Dynamic runtimeException) {
-				data->lock.Set();
-				throw runtimeException;
-			}
-		}
-	};
-
-	#ifdef HXCPP_DEBUG
-	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
-	#endif
-
-	Data data = { {a0, a1} };
-
-	// queue a callback to execute removeEventListener() on the main thread and wait until execution completes
-	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
-	data.lock.Wait();
-}
-
 HAXE_C_BRIDGE_LINKAGE
 void *borogove_client_new(const char *a0, void *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
@@ -9076,6 +10585,40 @@ void borogove_client_set_profile(void *a0, void *a1, bool a2) {
 	data.lock.Wait();
 }
 
+HAXE_C_BRIDGE_LINKAGE
+void borogove_client_set_status(void *a0, void *a1, int a2, bool a3) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return (borogove::Client((hx::Object *)a0, true))->setStatus(Dynamic((hx::Object *)a1), a2, a3);
+	}
+	struct Data {
+		struct {void * a0; void * a1; int a2; bool a3;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				(borogove::Client((hx::Object *)data->args.a0, true))->setStatus(Dynamic((hx::Object *)data->args.a1), data->args.a2, data->args.a3);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3} };
+
+	// queue a callback to execute setStatus() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
 HAXE_C_BRIDGE_LINKAGE
 void borogove_client_prepare_attachment(void *a0, void *a1, void (*a2) (void*, void *handler__context), void *a3) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
@@ -9090,7 +10633,42 @@ void borogove_client_prepare_attachment(void *a0, void *a1, void (*a2) (void*, v
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Client((hx::Object *)data->args.a0, true))->prepareAttachment__fromC(Dynamic((hx::Object *)data->args.a1), cpp::Function<void(void*, void * handler__context)>(data->args.a2), data->args.a3);
+				(borogove::Client((hx::Object *)data->args.a0, true))->prepareAttachment__fromC(Dynamic((hx::Object *)data->args.a1), cpp::Function<void(void*, void * handler__context)>(data->args.a2), data->args.a3);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2, a3} };
+
+	// queue a callback to execute prepareAttachment__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+size_t borogove_client_get_chats(void *a0, void ***a1) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return (borogove::Client((hx::Object *)a0, true))->getChats__fromC(a1);
+	}
+	struct Data {
+		struct {void * a0; void*** a1;} args;
+		HxSemaphore lock;
+		size_t ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = (borogove::Client((hx::Object *)data->args.a0, true))->getChats__fromC(data->args.a1);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -9103,29 +10681,30 @@ void borogove_client_prepare_attachment(void *a0, void *a1, void (*a2) (void*, v
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3} };
+	Data data = { {a0, a1} };
 
-	// queue a callback to execute prepareAttachment__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute getChats__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
+	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-size_t borogove_client_get_chats(void *a0, void ***a1) {
+void *borogove_client_find_available_chats(void *a0, const char *a1) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Client((hx::Object *)a0, true))->getChats__fromC(a1);
+		return HaxeCBridge::retainHaxeObject((borogove::Client((hx::Object *)a0, true))->findAvailableChats(a1));
 	}
 	struct Data {
-		struct {void * a0; void*** a1;} args;
+		struct {void * a0; const char * a1;} args;
 		HxSemaphore lock;
-		size_t ret;
+		void * ret;
 	};
 	struct Callback {
 		static void run(void* p) {
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				data->ret = (borogove::Client((hx::Object *)data->args.a0, true))->getChats__fromC(data->args.a1);
+				data->ret = HaxeCBridge::retainHaxeObject((borogove::Client((hx::Object *)data->args.a0, true))->findAvailableChats(data->args.a1));
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -9140,19 +10719,19 @@ size_t borogove_client_get_chats(void *a0, void ***a1) {
 
 	Data data = { {a0, a1} };
 
-	// queue a callback to execute getChats__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute findAvailableChats() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 	return data.ret;
 }
 
 HAXE_C_BRIDGE_LINKAGE
-void borogove_client_find_available_chats(void *a0, const char *a1, bool (*a2) (const char*, void**, size_t, void*), void *a3) {
+void borogove_client_available_chat_sources(void *a0, void (*a1) (const char**, size_t, void *handler__context), void *a2) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::Client((hx::Object *)a0, true))->findAvailableChats__fromC(a1, cpp::Function<bool(const char*, void**, size_t, void*)>(a2), a3);
+		return (borogove::Client((hx::Object *)a0, true))->availableChatSources__fromC(cpp::Function<void(const char**, size_t, void * handler__context)>(a1), a2);
 	}
 	struct Data {
-		struct {void * a0; const char * a1; bool (* a2) (const char*, void**, size_t, void*); void* a3;} args;
+		struct {void * a0; void (* a1) (const char**, size_t, void * handler__context); void* a2;} args;
 		HxSemaphore lock;
 	};
 	struct Callback {
@@ -9160,7 +10739,7 @@ void borogove_client_find_available_chats(void *a0, const char *a1, bool (*a2) (
 			// executed within the haxe main thread
 			Data* data = (Data*) p;
 			try {
-				(borogove::Client((hx::Object *)data->args.a0, true))->findAvailableChats__fromC(data->args.a1, cpp::Function<bool(const char*, void**, size_t, void*)>(data->args.a2), data->args.a3);
+				(borogove::Client((hx::Object *)data->args.a0, true))->availableChatSources__fromC(cpp::Function<void(const char**, size_t, void * handler__context)>(data->args.a1), data->args.a2);
 				data->lock.Set();
 			} catch(Dynamic runtimeException) {
 				data->lock.Set();
@@ -9173,9 +10752,9 @@ void borogove_client_find_available_chats(void *a0, const char *a1, bool (*a2) (
 	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
 	#endif
 
-	Data data = { {a0, a1, a2, a3} };
+	Data data = { {a0, a1, a2} };
 
-	// queue a callback to execute findAvailableChats__fromC() on the main thread and wait until execution completes
+	// queue a callback to execute availableChatSources__fromC() on the main thread and wait until execution completes
 	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
 	data.lock.Wait();
 }
@@ -9858,150 +11437,6 @@ void borogove_client_set_not_in_foreground(void *a0) {
 	data.lock.Wait();
 }
 
-HAXE_C_BRIDGE_LINKAGE
-const char *borogove_available_chat_chat_id(void *a0) {
-	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::AvailableChat((hx::Object *)a0, true))->chatId__fromC());
-	}
-	struct Data {
-		struct {void * a0;} args;
-		HxSemaphore lock;
-		const char * ret;
-	};
-	struct Callback {
-		static void run(void* p) {
-			// executed within the haxe main thread
-			Data* data = (Data*) p;
-			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::AvailableChat((hx::Object *)data->args.a0, true))->chatId__fromC());
-				data->lock.Set();
-			} catch(Dynamic runtimeException) {
-				data->lock.Set();
-				throw runtimeException;
-			}
-		}
-	};
-
-	#ifdef HXCPP_DEBUG
-	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
-	#endif
-
-	Data data = { {a0} };
-
-	// queue a callback to execute chatId__fromC() on the main thread and wait until execution completes
-	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
-	data.lock.Wait();
-	return data.ret;
-}
-
-HAXE_C_BRIDGE_LINKAGE
-const char *borogove_available_chat_display_name(void *a0) {
-	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::AvailableChat((hx::Object *)a0, true))->displayName__fromC());
-	}
-	struct Data {
-		struct {void * a0;} args;
-		HxSemaphore lock;
-		const char * ret;
-	};
-	struct Callback {
-		static void run(void* p) {
-			// executed within the haxe main thread
-			Data* data = (Data*) p;
-			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::AvailableChat((hx::Object *)data->args.a0, true))->displayName__fromC());
-				data->lock.Set();
-			} catch(Dynamic runtimeException) {
-				data->lock.Set();
-				throw runtimeException;
-			}
-		}
-	};
-
-	#ifdef HXCPP_DEBUG
-	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
-	#endif
-
-	Data data = { {a0} };
-
-	// queue a callback to execute displayName__fromC() on the main thread and wait until execution completes
-	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
-	data.lock.Wait();
-	return data.ret;
-}
-
-HAXE_C_BRIDGE_LINKAGE
-const char *borogove_available_chat_note(void *a0) {
-	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return HaxeCBridge::retainHaxeString((borogove::AvailableChat((hx::Object *)a0, true))->note__fromC());
-	}
-	struct Data {
-		struct {void * a0;} args;
-		HxSemaphore lock;
-		const char * ret;
-	};
-	struct Callback {
-		static void run(void* p) {
-			// executed within the haxe main thread
-			Data* data = (Data*) p;
-			try {
-				data->ret = HaxeCBridge::retainHaxeString((borogove::AvailableChat((hx::Object *)data->args.a0, true))->note__fromC());
-				data->lock.Set();
-			} catch(Dynamic runtimeException) {
-				data->lock.Set();
-				throw runtimeException;
-			}
-		}
-	};
-
-	#ifdef HXCPP_DEBUG
-	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
-	#endif
-
-	Data data = { {a0} };
-
-	// queue a callback to execute note__fromC() on the main thread and wait until execution completes
-	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
-	data.lock.Wait();
-	return data.ret;
-}
-
-HAXE_C_BRIDGE_LINKAGE
-bool borogove_available_chat_is_channel(void *a0) {
-	if (HaxeCBridgeInternal::isHaxeMainThread()) {
-		return (borogove::AvailableChat((hx::Object *)a0, true))->isChannel();
-	}
-	struct Data {
-		struct {void * a0;} args;
-		HxSemaphore lock;
-		bool ret;
-	};
-	struct Callback {
-		static void run(void* p) {
-			// executed within the haxe main thread
-			Data* data = (Data*) p;
-			try {
-				data->ret = (borogove::AvailableChat((hx::Object *)data->args.a0, true))->isChannel();
-				data->lock.Set();
-			} catch(Dynamic runtimeException) {
-				data->lock.Set();
-				throw runtimeException;
-			}
-		}
-	};
-
-	#ifdef HXCPP_DEBUG
-	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
-	#endif
-
-	Data data = { {a0} };
-
-	// queue a callback to execute isChannel() on the main thread and wait until execution completes
-	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
-	data.lock.Wait();
-	return data.ret;
-}
-
 HAXE_C_BRIDGE_LINKAGE
 void *borogove_calls_media_stream_new() {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
@@ -10884,6 +12319,112 @@ void *borogove_profile_builder_build(void *a0) {
 	return data.ret;
 }
 
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_available_chat_iterator_q(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::AvailableChatIterator((hx::Object *)a0, true))->q__fromC());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::AvailableChatIterator((hx::Object *)data->args.a0, true))->q__fromC());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute q__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
+HAXE_C_BRIDGE_LINKAGE
+void borogove_available_chat_iterator_next(void *a0, void (*a1) (void*, void *handler__context), void *a2) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return (borogove::AvailableChatIterator((hx::Object *)a0, true))->next__fromC(cpp::Function<void(void*, void * handler__context)>(a1), a2);
+	}
+	struct Data {
+		struct {void * a0; void (* a1) (void*, void * handler__context); void* a2;} args;
+		HxSemaphore lock;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				(borogove::AvailableChatIterator((hx::Object *)data->args.a0, true))->next__fromC(cpp::Function<void(void*, void * handler__context)>(data->args.a1), data->args.a2);
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0, a1, a2} };
+
+	// queue a callback to execute next__fromC() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+}
+
+HAXE_C_BRIDGE_LINKAGE
+const char *borogove_channel_subject(void *a0) {
+	if (HaxeCBridgeInternal::isHaxeMainThread()) {
+		return HaxeCBridge::retainHaxeString((borogove::Channel((hx::Object *)a0, true))->subject());
+	}
+	struct Data {
+		struct {void * a0;} args;
+		HxSemaphore lock;
+		const char * ret;
+	};
+	struct Callback {
+		static void run(void* p) {
+			// executed within the haxe main thread
+			Data* data = (Data*) p;
+			try {
+				data->ret = HaxeCBridge::retainHaxeString((borogove::Channel((hx::Object *)data->args.a0, true))->subject());
+				data->lock.Set();
+			} catch(Dynamic runtimeException) {
+				data->lock.Set();
+				throw runtimeException;
+			}
+		}
+	};
+
+	#ifdef HXCPP_DEBUG
+	assert(HaxeCBridgeInternal::threadRunning && "haxe thread not running, use borogove_initializeHaxeThread() to activate the haxe thread");
+	#endif
+
+	Data data = { {a0} };
+
+	// queue a callback to execute subject() on the main thread and wait until execution completes
+	HaxeCBridgeInternal::runInMainThread(Callback::run, &data);
+	data.lock.Wait();
+	return data.ret;
+}
+
 HAXE_C_BRIDGE_LINKAGE
 const char *borogove_channel_description(void *a0) {
 	if (HaxeCBridgeInternal::isHaxeMainThread()) {
diff --git a/Sources/c_borogove/src/__boot__.cpp b/Sources/c_borogove/src/__boot__.cpp
index 18ccf0d..10d5b02 100644
--- a/Sources/c_borogove/src/__boot__.cpp
+++ b/Sources/c_borogove/src/__boot__.cpp
@@ -49,9 +49,6 @@
 #ifndef INCLUDED_thenshim_fallback_PromiseState
 #include <thenshim/fallback/PromiseState.h>
 #endif
-#ifndef INCLUDED_hx_strings_internal__Either2__Either2
-#include <hx/strings/internal/_Either2/_Either2.h>
-#endif
 #ifndef INCLUDED_haxe_io_Error
 #include <haxe/io/Error.h>
 #endif
@@ -85,6 +82,9 @@
 #ifndef INCLUDED_ValueType
 #include <ValueType.h>
 #endif
+#ifndef INCLUDED_uuidv7_V7Generator
+#include <uuidv7/V7Generator.h>
+#endif
 #ifndef INCLUDED_tink_io__Worker_Worker_Impl_
 #include <tink/io/_Worker/Worker_Impl_.h>
 #endif
@@ -127,27 +127,18 @@
 #ifndef INCLUDED_sys_Http
 #include <sys/Http.h>
 #endif
-#ifndef INCLUDED_sha__SHA256_SHA256_Fields_
-#include <sha/_SHA256/SHA256_Fields_.h>
-#endif
-#ifndef INCLUDED_hx_strings_StringBuilder
-#include <hx/strings/StringBuilder.h>
-#endif
-#ifndef INCLUDED_hx_strings_RandomStrings
-#include <hx/strings/RandomStrings.h>
-#endif
 #ifndef INCLUDED_htmlparser_HtmlParser
 #include <htmlparser/HtmlParser.h>
 #endif
 #ifndef INCLUDED_hsluv_Hsluv
 #include <hsluv/Hsluv.h>
 #endif
+#ifndef INCLUDED_haxe_crypto_random_SecureRandom
+#include <haxe/crypto/random/SecureRandom.h>
+#endif
 #ifndef INCLUDED_haxe_crypto_Base64
 #include <haxe/crypto/Base64.h>
 #endif
-#ifndef INCLUDED_haxe_Log
-#include <haxe/Log.h>
-#endif
 #ifndef INCLUDED_sys_thread__Thread_HaxeThread
 #include <sys/thread/_Thread/HaxeThread.h>
 #endif
@@ -199,6 +190,12 @@
 #ifndef INCLUDED_borogove_calls_DTMFSender
 #include <borogove/calls/DTMFSender.h>
 #endif
+#ifndef INCLUDED_borogove_Status
+#include <borogove/Status.h>
+#endif
+#ifndef INCLUDED_borogove_Role
+#include <borogove/Role.h>
+#endif
 #ifndef INCLUDED_borogove_CustomEmojiReaction
 #include <borogove/CustomEmojiReaction.h>
 #endif
@@ -220,17 +217,14 @@
 #ifndef INCLUDED_borogove_Persistence
 #include <borogove/Persistence.h>
 #endif
-#ifndef INCLUDED_borogove_Participant
-#include <borogove/Participant.h>
-#endif
 #ifndef INCLUDED_borogove_Notification
 #include <borogove/Notification.h>
 #endif
-#ifndef INCLUDED_borogove_NS
-#include <borogove/NS.h>
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
 #endif
-#ifndef INCLUDED_borogove_Hash
-#include <borogove/Hash.h>
+#ifndef INCLUDED_borogove_Html
+#include <borogove/Html.h>
 #endif
 #ifndef INCLUDED_borogove_FormSection__Companion
 #include <borogove/FormSection__Companion.h>
@@ -280,6 +274,12 @@
 #ifndef INCLUDED_borogove_ChatAttachment
 #include <borogove/ChatAttachment.h>
 #endif
+#ifndef INCLUDED_borogove_LinkMetadata
+#include <borogove/LinkMetadata.h>
+#endif
+#ifndef INCLUDED_borogove__Chat_Chat_Fields_
+#include <borogove/_Chat/Chat_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_AvailableChat
 #include <borogove/AvailableChat.h>
 #endif
@@ -292,12 +292,30 @@
 #ifndef INCLUDED_borogove_Chat
 #include <borogove/Chat.h>
 #endif
+#ifndef INCLUDED_borogove_EventEmitter
+#include <borogove/EventEmitter.h>
+#endif
+#ifndef INCLUDED_borogove_CapsRepo
+#include <borogove/CapsRepo.h>
+#endif
+#ifndef INCLUDED_borogove_Hash
+#include <borogove/Hash.h>
+#endif
+#ifndef INCLUDED_haxe_Log
+#include <haxe/Log.h>
+#endif
+#ifndef INCLUDED_borogove_AvailableChatIterator
+#include <borogove/AvailableChatIterator.h>
+#endif
 #ifndef INCLUDED_borogove_Autolink
 #include <borogove/Autolink.h>
 #endif
 #ifndef INCLUDED_borogove_AttachmentSource
 #include <borogove/AttachmentSource.h>
 #endif
+#ifndef INCLUDED_Xml
+#include <Xml.h>
+#endif
 #ifndef INCLUDED__HaxeCBridge_Internal
 #include <_HaxeCBridge/Internal.h>
 #endif
@@ -646,15 +664,6 @@
 #ifndef INCLUDED_sys_FileSystem
 #include <sys/FileSystem.h>
 #endif
-#ifndef INCLUDED_sha_SHA256
-#include <sha/SHA256.h>
-#endif
-#ifndef INCLUDED_sha_Hash
-#include <sha/Hash.h>
-#endif
-#ifndef INCLUDED_hx_strings_Strings
-#include <hx/strings/Strings.h>
-#endif
 #ifndef INCLUDED_httpstatus__HttpStatusMessage_HttpStatusMessage_Impl_
 #include <httpstatus/_HttpStatusMessage/HttpStatusMessage_Impl_.h>
 #endif
@@ -676,6 +685,9 @@
 #ifndef INCLUDED_htmlparser_HtmlAttribute
 #include <htmlparser/HtmlAttribute.h>
 #endif
+#ifndef INCLUDED_haxe_xml_Printer
+#include <haxe/xml/Printer.h>
+#endif
 #ifndef INCLUDED_haxe_iterators_MapKeyValueIterator
 #include <haxe/iterators/MapKeyValueIterator.h>
 #endif
@@ -769,6 +781,12 @@
 #ifndef INCLUDED_haxe_MainEvent
 #include <haxe/MainEvent.h>
 #endif
+#ifndef INCLUDED_haxe_Int64Helper
+#include <haxe/Int64Helper.h>
+#endif
+#ifndef INCLUDED_haxe__Int64_Int64_Impl_
+#include <haxe/_Int64/Int64_Impl_.h>
+#endif
 #ifndef INCLUDED_haxe_Exception
 #include <haxe/Exception.h>
 #endif
@@ -904,9 +922,6 @@
 #ifndef INCLUDED_borogove_StringUtil
 #include <borogove/StringUtil.h>
 #endif
-#ifndef INCLUDED_borogove_Stanza
-#include <borogove/Stanza.h>
-#endif
 #ifndef INCLUDED_borogove_StanzaError
 #include <borogove/StanzaError.h>
 #endif
@@ -922,8 +937,8 @@
 #ifndef INCLUDED_borogove_ProfileBuilder
 #include <borogove/ProfileBuilder.h>
 #endif
-#ifndef INCLUDED_borogove_Presence
-#include <borogove/Presence.h>
+#ifndef INCLUDED_borogove__Presence_Presence_Impl_
+#include <borogove/_Presence/Presence_Impl_.h>
 #endif
 #ifndef INCLUDED_borogove_OutboxItem
 #include <borogove/OutboxItem.h>
@@ -940,6 +955,9 @@
 #ifndef INCLUDED_borogove_Message
 #include <borogove/Message.h>
 #endif
+#ifndef INCLUDED_borogove_MemberUpdate
+#include <borogove/MemberUpdate.h>
+#endif
 #ifndef INCLUDED_borogove_JsonPrinter
 #include <borogove/JsonPrinter.h>
 #endif
@@ -949,9 +967,6 @@
 #ifndef INCLUDED_borogove_Identicon
 #include <borogove/Identicon.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
-#endif
 #ifndef INCLUDED_borogove_GenericStream
 #include <borogove/GenericStream.h>
 #endif
@@ -979,39 +994,48 @@
 #ifndef INCLUDED_borogove_UnicodeBlocks
 #include <borogove/UnicodeBlocks.h>
 #endif
-#ifndef INCLUDED_borogove_UnicodeRange
-#include <borogove/UnicodeRange.h>
-#endif
 #ifndef INCLUDED_borogove_UnicodeList
 #include <borogove/UnicodeList.h>
 #endif
+#ifndef INCLUDED_borogove_UnicodeRange
+#include <borogove/UnicodeRange.h>
+#endif
 #ifndef INCLUDED_borogove_UnicodeSet
 #include <borogove/UnicodeSet.h>
 #endif
 #ifndef INCLUDED_borogove_Date
 #include <borogove/Date.h>
 #endif
+#ifndef INCLUDED_borogove_SerializedChat
+#include <borogove/SerializedChat.h>
+#endif
+#ifndef INCLUDED_borogove_Stanza
+#include <borogove/Stanza.h>
+#endif
 #ifndef INCLUDED_borogove__DataForm_Field_Impl_
 #include <borogove/_DataForm/Field_Impl_.h>
 #endif
 #ifndef INCLUDED_borogove__DataForm_DataForm_Impl_
 #include <borogove/_DataForm/DataForm_Impl_.h>
 #endif
-#ifndef INCLUDED_borogove_EventEmitter
-#include <borogove/EventEmitter.h>
-#endif
-#ifndef INCLUDED_borogove_SerializedChat
-#include <borogove/SerializedChat.h>
-#endif
 #ifndef INCLUDED_borogove_Identity
 #include <borogove/Identity.h>
 #endif
 #ifndef INCLUDED_borogove_Caps
 #include <borogove/Caps.h>
 #endif
+#ifndef INCLUDED_borogove_AsyncLock
+#include <borogove/AsyncLock.h>
+#endif
+#ifndef INCLUDED__Xml_XmlType_Impl_
+#include <_Xml/XmlType_Impl_.h>
+#endif
 #ifndef INCLUDED__UnicodeString_UnicodeString_Impl_
 #include <_UnicodeString/UnicodeString_Impl_.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
 #ifndef INCLUDED_Type
 #include <Type.h>
 #endif
@@ -1033,6 +1057,18 @@
 #ifndef INCLUDED_Lambda
 #include <Lambda.h>
 #endif
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_HaxeOpaqueArray_Impl_
+#include <_HaxeCBridge/HaxeOpaqueArray_Impl_.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_HaxeStringArray_Impl_
+#include <_HaxeCBridge/HaxeStringArray_Impl_.h>
+#endif
+#ifndef INCLUDED__FractionalIndexing_FractionalIndexing_Fields_
+#include <_FractionalIndexing/FractionalIndexing_Fields_.h>
+#endif
 #ifndef INCLUDED_EReg
 #include <EReg.h>
 #endif
@@ -1062,7 +1098,6 @@ __files__boot();
 ::tink::core::Outcome_obj::__register();
 ::tink::core::FutureStatus_obj::__register();
 ::thenshim::fallback::PromiseState_obj::__register();
-::hx::strings::internal::_Either2::_Either2_obj::__register();
 ::haxe::io::Error_obj::__register();
 ::haxe::io::Encoding_obj::__register();
 ::haxe::ds::Option_obj::__register();
@@ -1074,6 +1109,7 @@ __files__boot();
 ::borogove::IqResult_obj::__register();
 ::borogove::EventResult_obj::__register();
 ::ValueType_obj::__register();
+::uuidv7::V7Generator_obj::__register();
 ::tink::io::_Worker::Worker_Impl__obj::__register();
 ::tink::io::_Source::Source_Impl__obj::__register();
 ::tink::streams::Empty_obj::__register();
@@ -1088,13 +1124,10 @@ __files__boot();
 ::sys::ssl::Certificate_obj::__register();
 ::sys::net::Host_obj::__register();
 ::sys::Http_obj::__register();
-::sha::_SHA256::SHA256_Fields__obj::__register();
-::hx::strings::StringBuilder_obj::__register();
-::hx::strings::RandomStrings_obj::__register();
 ::htmlparser::HtmlParser_obj::__register();
 ::hsluv::Hsluv_obj::__register();
+::haxe::crypto::random::SecureRandom_obj::__register();
 ::haxe::crypto::Base64_obj::__register();
-::haxe::Log_obj::__register();
 ::sys::thread::_Thread::HaxeThread_obj::__register();
 ::borogove::persistence::Sqlite_obj::__register();
 ::borogove::persistence::MediaStore__Companion_obj::__register();
@@ -1112,6 +1145,8 @@ __files__boot();
 ::borogove::calls::MediaStreamTrack_obj::__register();
 ::borogove::calls::AudioFormat_obj::__register();
 ::borogove::calls::DTMFSender_obj::__register();
+::borogove::Status_obj::__register();
+::borogove::Role_obj::__register();
 ::borogove::CustomEmojiReaction_obj::__register();
 ::borogove::Reaction_obj::__register();
 ::borogove::_Profile::Profile_Fields__obj::__register();
@@ -1119,10 +1154,9 @@ __files__boot();
 ::borogove::Profile_obj::__register();
 ::borogove::Persistence__Companion_obj::__register();
 ::borogove::Persistence_obj::__register();
-::borogove::Participant_obj::__register();
 ::borogove::Notification_obj::__register();
-::borogove::NS_obj::__register();
-::borogove::Hash_obj::__register();
+::borogove::Member_obj::__register();
+::borogove::Html_obj::__register();
 ::borogove::FormSection__Companion_obj::__register();
 ::borogove::Form_obj::__register();
 ::borogove::FormItem_obj::__register();
@@ -1139,12 +1173,20 @@ __files__boot();
 ::borogove::ChatMessageBuilder_obj::__register();
 ::borogove::ChatMessage_obj::__register();
 ::borogove::ChatAttachment_obj::__register();
+::borogove::LinkMetadata_obj::__register();
+::borogove::_Chat::Chat_Fields__obj::__register();
 ::borogove::AvailableChat_obj::__register();
 ::borogove::Channel_obj::__register();
 ::borogove::DirectChat_obj::__register();
 ::borogove::Chat_obj::__register();
+::borogove::EventEmitter_obj::__register();
+::borogove::CapsRepo_obj::__register();
+::borogove::Hash_obj::__register();
+::haxe::Log_obj::__register();
+::borogove::AvailableChatIterator_obj::__register();
 ::borogove::Autolink_obj::__register();
 ::borogove::AttachmentSource_obj::__register();
+::Xml_obj::__register();
 ::_HaxeCBridge::Internal_obj::__register();
 ::tink::url::_Path::Path_Impl__obj::__register();
 ::tink::url::_Host::Host_Impl__obj::__register();
@@ -1261,9 +1303,6 @@ __files__boot();
 ::sys::db::ResultSet_obj::__register();
 ::sys::db::Connection_obj::__register();
 ::sys::FileSystem_obj::__register();
-::sha::SHA256_obj::__register();
-::sha::Hash_obj::__register();
-::hx::strings::Strings_obj::__register();
 ::httpstatus::_HttpStatusMessage::HttpStatusMessage_Impl__obj::__register();
 ::htmlparser::HtmlTools_obj::__register();
 ::htmlparser::HtmlParserException_obj::__register();
@@ -1271,6 +1310,7 @@ __files__boot();
 ::htmlparser::HtmlNodeElement_obj::__register();
 ::htmlparser::HtmlNode_obj::__register();
 ::htmlparser::HtmlAttribute_obj::__register();
+::haxe::xml::Printer_obj::__register();
 ::haxe::iterators::MapKeyValueIterator_obj::__register();
 ::haxe::iterators::ArrayIterator_obj::__register();
 ::haxe::io::Path_obj::__register();
@@ -1302,6 +1342,8 @@ __files__boot();
 ::haxe::NativeStackTrace_obj::__register();
 ::haxe::MainLoop_obj::__register();
 ::haxe::MainEvent_obj::__register();
+::haxe::Int64Helper_obj::__register();
+::haxe::_Int64::Int64_Impl__obj::__register();
 ::haxe::Exception_obj::__register();
 ::haxe::EntryPoint_obj::__register();
 ::sys::thread::EventLoop_obj::__register();
@@ -1347,22 +1389,21 @@ __files__boot();
 ::borogove::_Util::Util_Fields__obj::__register();
 ::borogove::Util_obj::__register();
 ::borogove::StringUtil_obj::__register();
-::borogove::Stanza_obj::__register();
 ::borogove::StanzaError_obj::__register();
 ::borogove::ReactionUpdate_obj::__register();
 ::borogove::Push_obj::__register();
 ::borogove::PubsubEvent_obj::__register();
 ::borogove::ProfileBuilder_obj::__register();
-::borogove::Presence_obj::__register();
+::borogove::_Presence::Presence_Impl__obj::__register();
 ::borogove::OutboxItem_obj::__register();
 ::borogove::Outbox_obj::__register();
 ::borogove::ModerationAction_obj::__register();
 ::borogove::MessageSync_obj::__register();
 ::borogove::Message_obj::__register();
+::borogove::MemberUpdate_obj::__register();
 ::borogove::JsonPrinter_obj::__register();
 ::borogove::JID_obj::__register();
 ::borogove::Identicon_obj::__register();
-::borogove::ID_obj::__register();
 ::borogove::GenericStream_obj::__register();
 ::borogove::FormLayoutSection_obj::__register();
 ::borogove::FormSubmitBuilder_obj::__register();
@@ -1372,17 +1413,20 @@ __files__boot();
 ::borogove::Emoji_obj::__register();
 ::borogove::Symbol_obj::__register();
 ::borogove::UnicodeBlocks_obj::__register();
-::borogove::UnicodeRange_obj::__register();
 ::borogove::UnicodeList_obj::__register();
+::borogove::UnicodeRange_obj::__register();
 ::borogove::UnicodeSet_obj::__register();
 ::borogove::Date_obj::__register();
+::borogove::SerializedChat_obj::__register();
+::borogove::Stanza_obj::__register();
 ::borogove::_DataForm::Field_Impl__obj::__register();
 ::borogove::_DataForm::DataForm_Impl__obj::__register();
-::borogove::EventEmitter_obj::__register();
-::borogove::SerializedChat_obj::__register();
 ::borogove::Identity_obj::__register();
 ::borogove::Caps_obj::__register();
+::borogove::AsyncLock_obj::__register();
+::_Xml::XmlType_Impl__obj::__register();
 ::_UnicodeString::UnicodeString_Impl__obj::__register();
+::_UUIDv7::UUIDv7_Fields__obj::__register();
 ::Type_obj::__register();
 ::Sys_obj::__register();
 ::StringTools_obj::__register();
@@ -1390,6 +1434,10 @@ __files__boot();
 ::Std_obj::__register();
 ::Reflect_obj::__register();
 ::Lambda_obj::__register();
+::_HaxeCBridge::HaxeArray_Impl__obj::__register();
+::_HaxeCBridge::HaxeOpaqueArray_Impl__obj::__register();
+::_HaxeCBridge::HaxeStringArray_Impl__obj::__register();
+::_FractionalIndexing::FractionalIndexing_Fields__obj::__register();
 ::EReg_obj::__register();
 ::Date_obj::__register();
 ::tink::streams::Step_obj::__boot();
@@ -1408,7 +1456,6 @@ __files__boot();
 ::tink::core::Outcome_obj::__boot();
 ::tink::core::FutureStatus_obj::__boot();
 ::thenshim::fallback::PromiseState_obj::__boot();
-::hx::strings::internal::_Either2::_Either2_obj::__boot();
 ::haxe::io::Error_obj::__boot();
 ::haxe::io::Encoding_obj::__boot();
 ::haxe::ds::Option_obj::__boot();
@@ -1427,12 +1474,19 @@ __files__boot();
 ::sys::ssl::Socket_obj::__init__();
 ::haxe::Log_obj::__boot();
 ::_HaxeCBridge::Internal_obj::__boot();
+::Xml_obj::__boot();
 ::borogove::AttachmentSource_obj::__boot();
 ::borogove::Autolink_obj::__boot();
+::borogove::AvailableChatIterator_obj::__boot();
+::borogove::Hash_obj::__boot();
+::borogove::CapsRepo_obj::__boot();
+::borogove::EventEmitter_obj::__boot();
 ::borogove::Chat_obj::__boot();
 ::borogove::DirectChat_obj::__boot();
 ::borogove::Channel_obj::__boot();
 ::borogove::AvailableChat_obj::__boot();
+::borogove::_Chat::Chat_Fields__obj::__boot();
+::borogove::LinkMetadata_obj::__boot();
 ::borogove::ChatAttachment_obj::__boot();
 ::borogove::ChatMessage_obj::__boot();
 ::borogove::ChatMessageBuilder_obj::__boot();
@@ -1449,10 +1503,9 @@ __files__boot();
 ::borogove::FormItem_obj::__boot();
 ::borogove::Form_obj::__boot();
 ::borogove::FormSection__Companion_obj::__boot();
-::borogove::Hash_obj::__boot();
-::borogove::NS_obj::__boot();
+::borogove::Html_obj::__boot();
+::borogove::Member_obj::__boot();
 ::borogove::Notification_obj::__boot();
-::borogove::Participant_obj::__boot();
 ::borogove::Persistence_obj::__boot();
 ::borogove::Persistence__Companion_obj::__boot();
 ::borogove::Profile_obj::__boot();
@@ -1460,6 +1513,8 @@ __files__boot();
 ::borogove::_Profile::Profile_Fields__obj::__boot();
 ::borogove::Reaction_obj::__boot();
 ::borogove::CustomEmojiReaction_obj::__boot();
+::borogove::Role_obj::__boot();
+::borogove::Status_obj::__boot();
 ::borogove::calls::DTMFSender_obj::__boot();
 ::borogove::calls::AudioFormat_obj::__boot();
 ::borogove::calls::MediaStreamTrack_obj::__boot();
@@ -1478,11 +1533,9 @@ __files__boot();
 ::borogove::persistence::Sqlite_obj::__boot();
 ::sys::thread::_Thread::HaxeThread_obj::__boot();
 ::haxe::crypto::Base64_obj::__boot();
+::haxe::crypto::random::SecureRandom_obj::__boot();
 ::hsluv::Hsluv_obj::__boot();
 ::htmlparser::HtmlParser_obj::__boot();
-::hx::strings::RandomStrings_obj::__boot();
-::hx::strings::StringBuilder_obj::__boot();
-::sha::_SHA256::SHA256_Fields__obj::__boot();
 ::sys::Http_obj::__boot();
 ::sys::net::Host_obj::__boot();
 ::sys::ssl::Certificate_obj::__boot();
@@ -1497,5 +1550,6 @@ __files__boot();
 ::tink::streams::Empty_obj::__boot();
 ::tink::io::_Source::Source_Impl__obj::__boot();
 ::tink::io::_Worker::Worker_Impl__obj::__boot();
+::uuidv7::V7Generator_obj::__boot();
 }
 
diff --git a/Sources/c_borogove/src/__files__.cpp b/Sources/c_borogove/src/__files__.cpp
deleted file mode 100644
index f4821fc..0000000
--- a/Sources/c_borogove/src/__files__.cpp
+++ /dev/null
@@ -1,706 +0,0 @@
-// Generated by Haxe 4.3.3
-#include <hxcpp.h>
-
-namespace hx {
-const char *__hxcpp_all_files[] = {
-#ifdef HXCPP_DEBUGGER
-"/usr/local/lib/haxe/std/Lambda.hx",
-"/usr/local/lib/haxe/std/StringTools.hx",
-"/usr/local/lib/haxe/std/UnicodeString.hx",
-"/usr/local/lib/haxe/std/cpp/Int64Map.hx",
-"/usr/local/lib/haxe/std/cpp/NativeString.hx",
-"/usr/local/lib/haxe/std/cpp/_std/Date.hx",
-"/usr/local/lib/haxe/std/cpp/_std/EReg.hx",
-"/usr/local/lib/haxe/std/cpp/_std/Reflect.hx",
-"/usr/local/lib/haxe/std/cpp/_std/Std.hx",
-"/usr/local/lib/haxe/std/cpp/_std/StringBuf.hx",
-"/usr/local/lib/haxe/std/cpp/_std/Sys.hx",
-"/usr/local/lib/haxe/std/cpp/_std/Type.hx",
-"/usr/local/lib/haxe/std/cpp/_std/haxe/Exception.hx",
-"/usr/local/lib/haxe/std/cpp/_std/haxe/Log.hx",
-"/usr/local/lib/haxe/std/cpp/_std/haxe/NativeStackTrace.hx",
-"/usr/local/lib/haxe/std/cpp/_std/haxe/ds/IntMap.hx",
-"/usr/local/lib/haxe/std/cpp/_std/haxe/ds/ObjectMap.hx",
-"/usr/local/lib/haxe/std/cpp/_std/haxe/ds/StringMap.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/FileSystem.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/db/Sqlite.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/io/File.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/io/FileInput.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/io/FileOutput.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/io/Process.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/net/Host.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/net/Socket.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/ssl/Certificate.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/ssl/Key.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/ssl/Socket.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/thread/Deque.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/thread/Lock.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/thread/Mutex.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/thread/Thread.hx",
-"/usr/local/lib/haxe/std/haxe/CallStack.hx",
-"/usr/local/lib/haxe/std/haxe/EntryPoint.hx",
-"/usr/local/lib/haxe/std/haxe/MainLoop.hx",
-"/usr/local/lib/haxe/std/haxe/Timer.hx",
-"/usr/local/lib/haxe/std/haxe/ValueException.hx",
-"/usr/local/lib/haxe/std/haxe/crypto/Base64.hx",
-"/usr/local/lib/haxe/std/haxe/crypto/BaseCode.hx",
-"/usr/local/lib/haxe/std/haxe/crypto/Sha1.hx",
-"/usr/local/lib/haxe/std/haxe/crypto/Sha256.hx",
-"/usr/local/lib/haxe/std/haxe/ds/BalancedTree.hx",
-"/usr/local/lib/haxe/std/haxe/ds/EnumValueMap.hx",
-"/usr/local/lib/haxe/std/haxe/ds/List.hx",
-"/usr/local/lib/haxe/std/haxe/exceptions/NotImplementedException.hx",
-"/usr/local/lib/haxe/std/haxe/exceptions/PosException.hx",
-"/usr/local/lib/haxe/std/haxe/format/JsonParser.hx",
-"/usr/local/lib/haxe/std/haxe/format/JsonPrinter.hx",
-"/usr/local/lib/haxe/std/haxe/http/HttpBase.hx",
-"/usr/local/lib/haxe/std/haxe/io/Bytes.hx",
-"/usr/local/lib/haxe/std/haxe/io/BytesBuffer.hx",
-"/usr/local/lib/haxe/std/haxe/io/BytesInput.hx",
-"/usr/local/lib/haxe/std/haxe/io/BytesOutput.hx",
-"/usr/local/lib/haxe/std/haxe/io/Eof.hx",
-"/usr/local/lib/haxe/std/haxe/io/Input.hx",
-"/usr/local/lib/haxe/std/haxe/io/Output.hx",
-"/usr/local/lib/haxe/std/haxe/io/Path.hx",
-"/usr/local/lib/haxe/std/haxe/iterators/ArrayIterator.hx",
-"/usr/local/lib/haxe/std/haxe/iterators/MapKeyValueIterator.hx",
-"/usr/local/lib/haxe/std/sys/Http.hx",
-"/usr/local/lib/haxe/std/sys/thread/ElasticThreadPool.hx",
-"/usr/local/lib/haxe/std/sys/thread/EventLoop.hx",
-"/usr/local/lib/haxe/std/sys/thread/FixedThreadPool.hx",
-"/usr/local/lib/haxe/std/sys/thread/NoEventLoopException.hx",
-"/usr/local/lib/haxe/std/sys/thread/ThreadPoolException.hx",
-"HaxeCBridge.hx",
-"borogove/AttachmentSource.cpp.hx",
-"borogove/Autolink.hx",
-"borogove/Caps.hx",
-"borogove/Chat.hx",
-"borogove/ChatMessage.hx",
-"borogove/ChatMessageBuilder.hx",
-"borogove/Client.hx",
-"borogove/Color.hx",
-"borogove/Command.hx",
-"borogove/Config.hx",
-"borogove/DataForm.hx",
-"borogove/Date.hx",
-"borogove/EmojiUtil.hx",
-"borogove/EncryptionInfo.hx",
-"borogove/EncryptionPolicy.hx",
-"borogove/EventEmitter.hx",
-"borogove/Form.hx",
-"borogove/GenericStream.hx",
-"borogove/Hash.hx",
-"borogove/ID.hx",
-"borogove/Identicon.hx",
-"borogove/JID.hx",
-"borogove/JsonPrinter.hx",
-"borogove/Message.hx",
-"borogove/MessageSync.hx",
-"borogove/ModerationAction.hx",
-"borogove/NS.hx",
-"borogove/Notification.hx",
-"borogove/Outbox.hx",
-"borogove/Participant.hx",
-"borogove/Persistence.hx",
-"borogove/Presence.hx",
-"borogove/Profile.hx",
-"borogove/PubsubEvent.hx",
-"borogove/Push.hx",
-"borogove/Reaction.hx",
-"borogove/ReactionUpdate.hx",
-"borogove/Stanza.hx",
-"borogove/StringUtil.hx",
-"borogove/Util.hx",
-"borogove/XEP0393.hx",
-"borogove/calls/Group.hx",
-"borogove/calls/PeerConnection.cpp.hx",
-"borogove/calls/Session.hx",
-"borogove/calls/SessionDescription.hx",
-"borogove/persistence/Dummy.hx",
-"borogove/persistence/KeyValueStore.hx",
-"borogove/persistence/MediaStore.hx",
-"borogove/persistence/MediaStoreFS.hx",
-"borogove/persistence/Sqlite.hx",
-"borogove/persistence/SqliteDriver.hx",
-"borogove/queries/BlocklistGet.hx",
-"borogove/queries/BoB.hx",
-"borogove/queries/CommandExecute.hx",
-"borogove/queries/DiscoInfoGet.hx",
-"borogove/queries/DiscoItemsGet.hx",
-"borogove/queries/ExtDiscoGet.hx",
-"borogove/queries/GenericQuery.hx",
-"borogove/queries/HttpUploadSlot.hx",
-"borogove/queries/JabberIqGatewayGet.hx",
-"borogove/queries/MAMQuery.hx",
-"borogove/queries/PubsubGet.hx",
-"borogove/queries/Push2Disable.hx",
-"borogove/queries/Push2Enable.hx",
-"borogove/queries/RosterGet.hx",
-"borogove/queries/VcardTempGet.hx",
-"borogove/streams/XmppStropheStream.hx",
-"datetime/DateTime.hx",
-"datetime/DateTimeInterval.hx",
-"datetime/cores/DateTimeIntervalCore.hx",
-"datetime/utils/DateTimeIntervalUtils.hx",
-"datetime/utils/DateTimeMonthUtils.hx",
-"datetime/utils/DateTimeUtils.hx",
-"hsluv/Hsluv.hx",
-"htmlparser/HtmlAttribute.hx",
-"htmlparser/HtmlNodeElement.hx",
-"htmlparser/HtmlNodeText.hx",
-"htmlparser/HtmlParser.hx",
-"htmlparser/HtmlParserException.hx",
-"htmlparser/HtmlTools.hx",
-"httpstatus/HttpStatusMessage.hx",
-"hx/strings/RandomStrings.hx",
-"hx/strings/StringBuilder.hx",
-"hx/strings/Strings.hx",
-"sha/Hash.hx",
-"sha/SHA256.hx",
-"thenshim/Promise.hx",
-"thenshim/PromiseTools.hx",
-"thenshim/fallback/FallbackPromise.hx",
-"thenshim/fallback/FallbackPromiseFactory.hx",
-"thenshim/fallback/HandlerSession.hx",
-"thenshim/fallback/TaskScheduler.hx",
-"tink/Chunk.hx",
-"tink/Url.hx",
-"tink/chunk/ByteChunk.hx",
-"tink/chunk/ChunkBase.hx",
-"tink/chunk/ChunkCursor.hx",
-"tink/chunk/CompoundChunk.hx",
-"tink/core/Callback.hx",
-"tink/core/Disposable.hx",
-"tink/core/Error.hx",
-"tink/core/Future.hx",
-"tink/core/Lazy.hx",
-"tink/core/Named.hx",
-"tink/core/Pair.hx",
-"tink/core/Promise.hx",
-"tink/http/Client.hx",
-"tink/http/Fetch.hx",
-"tink/http/Header.hx",
-"tink/http/Message.hx",
-"tink/http/Request.hx",
-"tink/http/Response.hx",
-"tink/http/clients/CurlClient.hx",
-"tink/http/clients/Helpers.hx",
-"tink/http/clients/LocalContainerClient.hx",
-"tink/http/clients/SocketClient.hx",
-"tink/http/clients/StdClient.hx",
-"tink/http/containers/LocalContainer.hx",
-"tink/io/PipeResult.hx",
-"tink/io/Sink.hx",
-"tink/io/Source.hx",
-"tink/io/StreamParser.hx",
-"tink/io/Worker.hx",
-"tink/io/std/InputSource.hx",
-"tink/io/std/OutputSink.hx",
-"tink/streams/IdealStream.hx",
-"tink/streams/Stream.hx",
-"tink/url/Host.hx",
-"tink/url/Path.hx",
-#endif
- 0 };
-
-const char *__hxcpp_all_files_fullpath[] = {
-#ifdef HXCPP_DEBUGGER
-"/usr/local/lib/haxe/std/Lambda.hx",
-"/usr/local/lib/haxe/std/StringTools.hx",
-"/usr/local/lib/haxe/std/UnicodeString.hx",
-"/usr/local/lib/haxe/std/cpp/Int64Map.hx",
-"/usr/local/lib/haxe/std/cpp/NativeString.hx",
-"/usr/local/lib/haxe/std/cpp/_std/Date.hx",
-"/usr/local/lib/haxe/std/cpp/_std/EReg.hx",
-"/usr/local/lib/haxe/std/cpp/_std/Reflect.hx",
-"/usr/local/lib/haxe/std/cpp/_std/Std.hx",
-"/usr/local/lib/haxe/std/cpp/_std/StringBuf.hx",
-"/usr/local/lib/haxe/std/cpp/_std/Sys.hx",
-"/usr/local/lib/haxe/std/cpp/_std/Type.hx",
-"/usr/local/lib/haxe/std/cpp/_std/haxe/Exception.hx",
-"/usr/local/lib/haxe/std/cpp/_std/haxe/Log.hx",
-"/usr/local/lib/haxe/std/cpp/_std/haxe/NativeStackTrace.hx",
-"/usr/local/lib/haxe/std/cpp/_std/haxe/ds/IntMap.hx",
-"/usr/local/lib/haxe/std/cpp/_std/haxe/ds/ObjectMap.hx",
-"/usr/local/lib/haxe/std/cpp/_std/haxe/ds/StringMap.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/FileSystem.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/db/Sqlite.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/io/File.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/io/FileInput.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/io/FileOutput.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/io/Process.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/net/Host.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/net/Socket.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/ssl/Certificate.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/ssl/Key.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/ssl/Socket.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/thread/Deque.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/thread/Lock.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/thread/Mutex.hx",
-"/usr/local/lib/haxe/std/cpp/_std/sys/thread/Thread.hx",
-"/usr/local/lib/haxe/std/haxe/CallStack.hx",
-"/usr/local/lib/haxe/std/haxe/EntryPoint.hx",
-"/usr/local/lib/haxe/std/haxe/MainLoop.hx",
-"/usr/local/lib/haxe/std/haxe/Timer.hx",
-"/usr/local/lib/haxe/std/haxe/ValueException.hx",
-"/usr/local/lib/haxe/std/haxe/crypto/Base64.hx",
-"/usr/local/lib/haxe/std/haxe/crypto/BaseCode.hx",
-"/usr/local/lib/haxe/std/haxe/crypto/Sha1.hx",
-"/usr/local/lib/haxe/std/haxe/crypto/Sha256.hx",
-"/usr/local/lib/haxe/std/haxe/ds/BalancedTree.hx",
-"/usr/local/lib/haxe/std/haxe/ds/EnumValueMap.hx",
-"/usr/local/lib/haxe/std/haxe/ds/List.hx",
-"/usr/local/lib/haxe/std/haxe/exceptions/NotImplementedException.hx",
-"/usr/local/lib/haxe/std/haxe/exceptions/PosException.hx",
-"/usr/local/lib/haxe/std/haxe/format/JsonParser.hx",
-"/usr/local/lib/haxe/std/haxe/format/JsonPrinter.hx",
-"/usr/local/lib/haxe/std/haxe/http/HttpBase.hx",
-"/usr/local/lib/haxe/std/haxe/io/Bytes.hx",
-"/usr/local/lib/haxe/std/haxe/io/BytesBuffer.hx",
-"/usr/local/lib/haxe/std/haxe/io/BytesInput.hx",
-"/usr/local/lib/haxe/std/haxe/io/BytesOutput.hx",
-"/usr/local/lib/haxe/std/haxe/io/Eof.hx",
-"/usr/local/lib/haxe/std/haxe/io/Input.hx",
-"/usr/local/lib/haxe/std/haxe/io/Output.hx",
-"/usr/local/lib/haxe/std/haxe/io/Path.hx",
-"/usr/local/lib/haxe/std/haxe/iterators/ArrayIterator.hx",
-"/usr/local/lib/haxe/std/haxe/iterators/MapKeyValueIterator.hx",
-"/usr/local/lib/haxe/std/sys/Http.hx",
-"/usr/local/lib/haxe/std/sys/thread/ElasticThreadPool.hx",
-"/usr/local/lib/haxe/std/sys/thread/EventLoop.hx",
-"/usr/local/lib/haxe/std/sys/thread/FixedThreadPool.hx",
-"/usr/local/lib/haxe/std/sys/thread/NoEventLoopException.hx",
-"/usr/local/lib/haxe/std/sys/thread/ThreadPoolException.hx",
-"/Users/singpolyma/src/borogove/HaxeCBridge.hx",
-"/Users/singpolyma/src/borogove/borogove/AttachmentSource.cpp.hx",
-"/Users/singpolyma/src/borogove/borogove/Autolink.hx",
-"/Users/singpolyma/src/borogove/borogove/Caps.hx",
-"/Users/singpolyma/src/borogove/borogove/Chat.hx",
-"/Users/singpolyma/src/borogove/borogove/ChatMessage.hx",
-"/Users/singpolyma/src/borogove/borogove/ChatMessageBuilder.hx",
-"/Users/singpolyma/src/borogove/borogove/Client.hx",
-"/Users/singpolyma/src/borogove/borogove/Color.hx",
-"/Users/singpolyma/src/borogove/borogove/Command.hx",
-"/Users/singpolyma/src/borogove/borogove/Config.hx",
-"/Users/singpolyma/src/borogove/borogove/DataForm.hx",
-"/Users/singpolyma/src/borogove/borogove/Date.hx",
-"/Users/singpolyma/src/borogove/borogove/EmojiUtil.hx",
-"/Users/singpolyma/src/borogove/borogove/EncryptionInfo.hx",
-"/Users/singpolyma/src/borogove/borogove/EncryptionPolicy.hx",
-"/Users/singpolyma/src/borogove/borogove/EventEmitter.hx",
-"/Users/singpolyma/src/borogove/borogove/Form.hx",
-"/Users/singpolyma/src/borogove/borogove/GenericStream.hx",
-"/Users/singpolyma/src/borogove/borogove/Hash.hx",
-"/Users/singpolyma/src/borogove/borogove/ID.hx",
-"/Users/singpolyma/src/borogove/borogove/Identicon.hx",
-"/Users/singpolyma/src/borogove/borogove/JID.hx",
-"/Users/singpolyma/src/borogove/borogove/JsonPrinter.hx",
-"/Users/singpolyma/src/borogove/borogove/Message.hx",
-"/Users/singpolyma/src/borogove/borogove/MessageSync.hx",
-"/Users/singpolyma/src/borogove/borogove/ModerationAction.hx",
-"/Users/singpolyma/src/borogove/borogove/NS.hx",
-"/Users/singpolyma/src/borogove/borogove/Notification.hx",
-"/Users/singpolyma/src/borogove/borogove/Outbox.hx",
-"/Users/singpolyma/src/borogove/borogove/Participant.hx",
-"/Users/singpolyma/src/borogove/borogove/Persistence.hx",
-"/Users/singpolyma/src/borogove/borogove/Presence.hx",
-"/Users/singpolyma/src/borogove/borogove/Profile.hx",
-"/Users/singpolyma/src/borogove/borogove/PubsubEvent.hx",
-"/Users/singpolyma/src/borogove/borogove/Push.hx",
-"/Users/singpolyma/src/borogove/borogove/Reaction.hx",
-"/Users/singpolyma/src/borogove/borogove/ReactionUpdate.hx",
-"/Users/singpolyma/src/borogove/borogove/Stanza.hx",
-"/Users/singpolyma/src/borogove/borogove/StringUtil.hx",
-"/Users/singpolyma/src/borogove/borogove/Util.hx",
-"/Users/singpolyma/src/borogove/borogove/XEP0393.hx",
-"/Users/singpolyma/src/borogove/borogove/calls/Group.hx",
-"/Users/singpolyma/src/borogove/borogove/calls/PeerConnection.cpp.hx",
-"/Users/singpolyma/src/borogove/borogove/calls/Session.hx",
-"/Users/singpolyma/src/borogove/borogove/calls/SessionDescription.hx",
-"/Users/singpolyma/src/borogove/borogove/persistence/Dummy.hx",
-"/Users/singpolyma/src/borogove/borogove/persistence/KeyValueStore.hx",
-"/Users/singpolyma/src/borogove/borogove/persistence/MediaStore.hx",
-"/Users/singpolyma/src/borogove/borogove/persistence/MediaStoreFS.hx",
-"/Users/singpolyma/src/borogove/borogove/persistence/Sqlite.hx",
-"/Users/singpolyma/src/borogove/borogove/persistence/SqliteDriver.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/BlocklistGet.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/BoB.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/CommandExecute.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/DiscoInfoGet.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/DiscoItemsGet.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/ExtDiscoGet.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/GenericQuery.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/HttpUploadSlot.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/JabberIqGatewayGet.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/MAMQuery.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/PubsubGet.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/Push2Disable.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/Push2Enable.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/RosterGet.hx",
-"/Users/singpolyma/src/borogove/borogove/queries/VcardTempGet.hx",
-"/Users/singpolyma/src/borogove/borogove/streams/XmppStropheStream.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/datetime/3,1,4/src/datetime/DateTime.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/datetime/3,1,4/src/datetime/DateTimeInterval.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/datetime/3,1,4/src/datetime/cores/DateTimeIntervalCore.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/datetime/3,1,4/src/datetime/utils/DateTimeIntervalUtils.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/datetime/3,1,4/src/datetime/utils/DateTimeMonthUtils.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/datetime/3,1,4/src/datetime/utils/DateTimeUtils.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/hsluv/0,1,1/src/hsluv/Hsluv.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/HtmlParser/3,4,0/htmlparser/HtmlAttribute.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/HtmlParser/3,4,0/htmlparser/HtmlNodeElement.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/HtmlParser/3,4,0/htmlparser/HtmlNodeText.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/HtmlParser/3,4,0/htmlparser/HtmlParser.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/HtmlParser/3,4,0/htmlparser/HtmlParserException.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/HtmlParser/3,4,0/htmlparser/HtmlTools.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/http-status/1,3,1/src/httpstatus/HttpStatusMessage.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/haxe-strings/7,0,5/src/hx/strings/RandomStrings.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/haxe-strings/7,0,5/src/hx/strings/StringBuilder.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/haxe-strings/7,0,5/src/hx/strings/Strings.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/sha/0,0,1/src/sha/Hash.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/sha/0,0,1/src/sha/SHA256.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/thenshim/1,1,2/src/thenshim/Promise.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/thenshim/1,1,2/src/thenshim/PromiseTools.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/thenshim/1,1,2/src/thenshim/fallback/FallbackPromise.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/thenshim/1,1,2/src/thenshim/fallback/FallbackPromiseFactory.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/thenshim/1,1,2/src/thenshim/fallback/HandlerSession.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/thenshim/1,1,2/src/thenshim/fallback/TaskScheduler.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_chunk/0,4,0/src/tink/Chunk.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_url/0,5,0/src/tink/Url.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_chunk/0,4,0/src/tink/chunk/ByteChunk.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_chunk/0,4,0/src/tink/chunk/ChunkBase.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_chunk/0,4,0/src/tink/chunk/ChunkCursor.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_chunk/0,4,0/src/tink/chunk/CompoundChunk.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_core/2,1,1/src/tink/core/Callback.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_core/2,1,1/src/tink/core/Disposable.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_core/2,1,1/src/tink/core/Error.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_core/2,1,1/src/tink/core/Future.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_core/2,1,1/src/tink/core/Lazy.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_core/2,1,1/src/tink/core/Named.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_core/2,1,1/src/tink/core/Pair.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_core/2,1,1/src/tink/core/Promise.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_http/0,10,0/src/tink/http/Client.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_http/0,10,0/src/tink/http/Fetch.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_http/0,10,0/src/tink/http/Header.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_http/0,10,0/src/tink/http/Message.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_http/0,10,0/src/tink/http/Request.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_http/0,10,0/src/tink/http/Response.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_http/0,10,0/src/tink/http/clients/CurlClient.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_http/0,10,0/src/tink/http/clients/Helpers.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_http/0,10,0/src/tink/http/clients/LocalContainerClient.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_http/0,10,0/src/tink/http/clients/SocketClient.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_http/0,10,0/src/tink/http/clients/StdClient.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_http/0,10,0/src/tink/http/containers/LocalContainer.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_io/0,9,0/src/tink/io/PipeResult.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_io/0,9,0/src/tink/io/Sink.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_io/0,9,0/src/tink/io/Source.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_io/0,9,0/src/tink/io/StreamParser.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_io/0,9,0/src/tink/io/Worker.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_io/0,9,0/src/tink/io/std/InputSource.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_io/0,9,0/src/tink/io/std/OutputSink.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_streams/0,4,0/src/tink/streams/IdealStream.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_streams/0,4,0/src/tink/streams/Stream.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_url/0,5,0/src/tink/url/Host.hx",
-"/Users/singpolyma/.local/lib/haxe/lib/tink_url/0,5,0/src/tink/url/Path.hx",
-#endif
- 0 };
-
-const char *__hxcpp_all_classes[] = {
-#ifdef HXCPP_DEBUGGER
-"Date",
-"EReg",
-"HaxeCBridge",
-"_HaxeCBridge.Internal",
-"Lambda",
-"Reflect",
-"Std",
-"StringBuf",
-"StringTools",
-"Sys",
-"Type",
-"_UnicodeString.UnicodeString_Impl_",
-"borogove.AttachmentSource",
-"borogove.Autolink",
-"borogove.Caps",
-"borogove.Identity",
-"borogove.Chat",
-"borogove.DirectChat",
-"borogove.Channel",
-"borogove.AvailableChat",
-"borogove.SerializedChat",
-"borogove.ChatAttachment",
-"borogove.ChatMessage",
-"borogove.ChatMessageBuilder",
-"borogove.EventEmitter",
-"borogove.Client",
-"borogove.Color",
-"borogove.Command",
-"borogove.CommandSession",
-"borogove.Config",
-"borogove._DataForm.DataForm_Impl_",
-"borogove._DataForm.Field_Impl_",
-"borogove.FormField",
-"borogove.FormOption",
-"borogove.Date",
-"borogove.UnicodeList",
-"borogove.UnicodeRange",
-"borogove.UnicodeBlocks",
-"borogove.EmojiUtil",
-"borogove.Symbol",
-"borogove.Emoji",
-"borogove.Other",
-"borogove.Builder",
-"borogove.EncryptionInfo",
-"borogove.EncryptionPolicy",
-"borogove.FormItem",
-"borogove.FormSubmitBuilder",
-"borogove.Form",
-"borogove.FormLayoutSection",
-"borogove.FormSection__Companion",
-"borogove.GenericStream",
-"borogove.Hash",
-"borogove.ID",
-"borogove.Identicon",
-"borogove.JID",
-"borogove.JsonPrinter",
-"borogove.Message",
-"borogove.MessageSync",
-"borogove.ModerationAction",
-"borogove.NS",
-"borogove.Notification",
-"borogove.Outbox",
-"borogove.OutboxItem",
-"borogove.Participant",
-"borogove.Persistence__Companion",
-"borogove.Presence",
-"borogove.Profile",
-"borogove.ProfileItem",
-"borogove.ProfileBuilder",
-"borogove._Profile.Profile_Fields_",
-"borogove.PubsubEvent",
-"borogove.Push",
-"borogove.Reaction",
-"borogove.CustomEmojiReaction",
-"borogove.ReactionUpdate",
-"borogove.StanzaError",
-"borogove.Stanza",
-"borogove.StringUtil",
-"borogove.Util",
-"borogove._Util.Util_Fields_",
-"borogove.XEP0393",
-"borogove.calls.Group",
-"borogove.calls.DTMFSender",
-"borogove.calls.AudioFormat",
-"borogove.calls.MediaStreamTrack",
-"borogove.calls.MediaStream",
-"borogove.calls.PeerConnection",
-"borogove.calls.IncomingProposedSession",
-"borogove.calls.OutgoingProposedSession",
-"borogove.calls.InitiatedSession",
-"borogove.calls.OutgoingSession",
-"borogove.calls._Session.Session_Fields_",
-"borogove.calls.SessionDescription",
-"borogove.calls.TransportInfo",
-"borogove.calls.Media",
-"borogove.calls.IceCandidate",
-"borogove.calls.Attribute",
-"borogove.calls.Session__Companion",
-"borogove.persistence.Dummy",
-"borogove.persistence.KeyValueStore__Companion",
-"borogove.persistence.MediaStoreFS",
-"borogove.persistence.MediaStore__Companion",
-"borogove.persistence.Sqlite",
-"borogove.persistence.SqliteDriver",
-"borogove.queries.GenericQuery",
-"borogove.queries.BlocklistGet",
-"borogove.queries.BoB",
-"borogove.queries.CommandExecute",
-"borogove.queries.DiscoInfoGet",
-"borogove.queries.DiscoItemsGet",
-"borogove.queries.ExtDiscoGet",
-"borogove.queries.HttpUploadSlot",
-"borogove.queries.JabberIqGatewayGet",
-"borogove.queries.MAMQuery",
-"borogove.queries.PubsubGet",
-"borogove.queries.Push2Disable",
-"borogove.queries.Push2Enable",
-"borogove.queries.RosterGet",
-"borogove.queries.VcardTempGet",
-"borogove.streams.XmppStropheStream",
-"cpp.Int64Map",
-"cpp.Lib",
-"cpp._NativeString.NativeString_Impl_",
-"datetime._DateTime.DateTime_Impl_",
-"datetime._DateTimeInterval.DateTimeInterval_Impl_",
-"datetime.cores.DateTimeIntervalCore",
-"datetime.utils.DateTimeIntervalUtils",
-"datetime.utils.DateTimeMonthUtils",
-"datetime.utils.DateTimeUtils",
-"haxe._CallStack.CallStack_Impl_",
-"sys.thread.Mutex",
-"sys.thread.EventLoop",
-"sys.thread._Thread.HaxeThread",
-"haxe.EntryPoint",
-"haxe.Exception",
-"haxe.Log",
-"haxe.MainEvent",
-"haxe.MainLoop",
-"haxe.NativeStackTrace",
-"haxe.Timer",
-"haxe.ValueException",
-"haxe.io.Bytes",
-"haxe.crypto.Base64",
-"haxe.crypto.BaseCode",
-"haxe.crypto.Sha1",
-"haxe.crypto.Sha256",
-"haxe.ds.BalancedTree",
-"haxe.ds.TreeNode",
-"haxe.ds.EnumValueMap",
-"haxe.ds.IntMap",
-"haxe.ds.List",
-"haxe.ds._List.ListNode",
-"haxe.ds.ObjectMap",
-"haxe.ds.StringMap",
-"haxe.exceptions.PosException",
-"haxe.exceptions.NotImplementedException",
-"haxe.format.JsonParser",
-"haxe.format.JsonPrinter",
-"haxe.http.HttpBase",
-"haxe.io.BytesBuffer",
-"haxe.io.Input",
-"haxe.io.BytesInput",
-"haxe.io.Output",
-"haxe.io.BytesOutput",
-"haxe.io.Eof",
-"haxe.io.Path",
-"haxe.iterators.ArrayIterator",
-"haxe.iterators.MapKeyValueIterator",
-"hsluv.Hsluv",
-"htmlparser.HtmlAttribute",
-"htmlparser.HtmlNode",
-"htmlparser.HtmlNodeElement",
-"htmlparser.HtmlNodeText",
-"htmlparser.HtmlParser",
-"htmlparser.HtmlParserException",
-"htmlparser.HtmlTools",
-"httpstatus._HttpStatusMessage.HttpStatusMessage_Impl_",
-"hx.strings.Strings",
-"hx.strings.RandomStrings",
-"hx.strings.StringBuilder",
-"sha.Hash",
-"sha.SHA256",
-"sha._SHA256.SHA256_Fields_",
-"sys.FileSystem",
-"sys.Http",
-"sys.db._Sqlite.SqliteConnection",
-"sys.db._Sqlite.SqliteResultSet",
-"sys.db.Sqlite",
-"sys.io.File",
-"sys.io.FileInput",
-"sys.io.FileOutput",
-"sys.io._Process.Stdin",
-"sys.io._Process.Stdout",
-"sys.io.Process",
-"sys.net.Host",
-"sys.net._Socket.SocketInput",
-"sys.net._Socket.SocketOutput",
-"sys.net.Socket",
-"sys.ssl.Certificate",
-"sys.ssl.Key",
-"sys.ssl._Socket.SocketInput",
-"sys.ssl._Socket.SocketOutput",
-"sys.ssl.Socket",
-"sys.thread.Deque",
-"sys.thread.ElasticThreadPool",
-"sys.thread._ElasticThreadPool.Worker",
-"sys.thread._EventLoop.RegularEvent",
-"sys.thread.FixedThreadPool",
-"sys.thread._FixedThreadPool.ShutdownException",
-"sys.thread._FixedThreadPool.Worker",
-"sys.thread.Lock",
-"sys.thread.NoEventLoopException",
-"sys.thread._Thread.Thread_Impl_",
-"sys.thread.ThreadPoolException",
-"thenshim.fallback.FallbackPromiseFactory",
-"thenshim.fallback.TaskScheduler",
-"thenshim._Promise.Promise_Impl_",
-"thenshim.PromiseTools",
-"thenshim.fallback.FallbackPromise",
-"thenshim.fallback.HandlerSession",
-"tink.chunk.ChunkBase",
-"tink._Chunk.EmptyChunk",
-"tink._Chunk.Chunk_Impl_",
-"tink._Url.Url_Impl_",
-"tink.chunk.ByteChunk",
-"tink.chunk.ChunkCursor",
-"tink.chunk.CompoundChunk",
-"tink.core._Callback.Callback_Impl_",
-"tink.core.CallbackLinkRef",
-"tink.core._Callback.LinkPair",
-"tink.core._Callback.ListCell",
-"tink.core.SimpleDisposable",
-"tink.core.CallbackList",
-"tink.core.TypedError",
-"tink.core._Future.FutureObject",
-"tink.core._Lazy.LazyConst",
-"tink.core._Future.SyncFuture",
-"tink.core._Future.Future_Impl_",
-"tink.core._Future.SuspendableFuture",
-"tink.core._Lazy.Lazy_Impl_",
-"tink.core._Lazy.LazyFunc",
-"tink.core.NamedWith",
-"tink.core.MPair",
-"tink.core._Promise.Promise_Impl_",
-"tink.http._Client.CustomClient",
-"tink.http.Fetch",
-"tink.http._Fetch.FetchResponse_Impl_",
-"tink.http.Header",
-"tink.http._Header.HeaderValue_Impl_",
-"tink.http.HeaderField",
-"tink.io.BytewiseParser",
-"tink.http.HeaderParser",
-"tink.http.Message",
-"tink.http.RequestHeader",
-"tink.http.IncomingRequestHeader",
-"tink.http.OutgoingRequestHeader",
-"tink.http.OutgoingRequest",
-"tink.http.IncomingRequest",
-"tink.http.ResponseHeaderBase",
-"tink.http._Response.OutgoingResponseData",
-"tink.http.IncomingResponse",
-"tink.http.clients.CurlClient",
-"tink.http.clients.Helpers",
-"tink.http.clients.LocalContainerClient",
-"tink.http.clients.SocketClient",
-"tink.http.clients.StdClient",
-"tink.http.containers.LocalContainer",
-"tink.io.PipeResultTools",
-"tink.io.SinkBase",
-"tink.io._Sink.SinkYielding_Impl_",
-"tink.streams.StreamBase",
-"tink.streams.Empty",
-"tink.io._Source.Source_Impl_",
-"tink.io.RealSourceTools",
-"tink.io.IdealSourceTools",
-"tink.io._StreamParser.StreamParser_Impl_",
-"tink.io._Worker.EagerWorker",
-"tink.io._Worker.Worker_Impl_",
-"tink.streams.Generator",
-"tink.io.std.InputSource",
-"tink.io.std.OutputSink",
-"tink.streams.IdealStreamBase",
-"tink.streams._Stream.Stream_Impl_",
-"tink.streams._Stream.Regrouper_Impl_",
-"tink.streams._Stream.CompoundStream",
-"tink.streams._Stream.RegroupStream",
-"tink.streams._Stream.ErrorStream",
-"tink.streams.IdealizeStream",
-"tink.streams.Single",
-"tink.streams._Stream.Handler_Impl_",
-"tink.streams._Stream.Reducer_Impl_",
-"tink.streams.FutureStream",
-"tink.url._Host.Host_Impl_",
-"tink.url._Path.Path_Impl_",
-#endif
- 0 };
-} // namespace hx
-void __files__boot() { __hxcpp_set_debugger_info(::hx::__hxcpp_all_classes, ::hx::__hxcpp_all_files_fullpath); }
diff --git a/Sources/c_borogove/src/borogove/AsyncLock.cpp b/Sources/c_borogove/src/borogove/AsyncLock.cpp
new file mode 100644
index 0000000..27df4c1
--- /dev/null
+++ b/Sources/c_borogove/src/borogove/AsyncLock.cpp
@@ -0,0 +1,166 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_borogove_AsyncLock
+#include <borogove/AsyncLock.h>
+#endif
+#ifndef INCLUDED_thenshim_Thenable
+#include <thenshim/Thenable.h>
+#endif
+#ifndef INCLUDED_thenshim__Promise_Promise_Impl_
+#include <thenshim/_Promise/Promise_Impl_.h>
+#endif
+
+HX_DEFINE_STACK_FRAME(_hx_pos_3b45cafe0ded873a_13_new,"borogove.AsyncLock","new",0xe764d78c,"borogove.AsyncLock.new","borogove/AsyncLock.hx",13,0x3591dae5)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b45cafe0ded873a_23_run,"borogove.AsyncLock","run",0xe767ee77,"borogove.AsyncLock.run","borogove/AsyncLock.hx",23,0x3591dae5)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b45cafe0ded873a_24_run,"borogove.AsyncLock","run",0xe767ee77,"borogove.AsyncLock.run","borogove/AsyncLock.hx",24,0x3591dae5)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b45cafe0ded873a_22_run,"borogove.AsyncLock","run",0xe767ee77,"borogove.AsyncLock.run","borogove/AsyncLock.hx",22,0x3591dae5)
+namespace borogove{
+
+void AsyncLock_obj::__construct(){
+            	HX_STACKFRAME(&_hx_pos_3b45cafe0ded873a_13_new)
+HXDLIN(  13)		this->p = ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            	}
+
+Dynamic AsyncLock_obj::__CreateEmpty() { return new AsyncLock_obj; }
+
+void *AsyncLock_obj::_hx_vtable = 0;
+
+Dynamic AsyncLock_obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< AsyncLock_obj > _hx_result = new AsyncLock_obj();
+	_hx_result->__construct();
+	return _hx_result;
+}
+
+bool AsyncLock_obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x566e2226;
+}
+
+::Dynamic AsyncLock_obj::run( ::Dynamic fn){
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,fn) HXARGC(1)
+            		::Dynamic _hx_run( ::Dynamic _){
+            			HX_STACKFRAME(&_hx_pos_3b45cafe0ded873a_23_run)
+HXLINE(  23)			return fn();
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
+            		void _hx_run( ::Dynamic _){
+            			HX_STACKFRAME(&_hx_pos_3b45cafe0ded873a_24_run)
+HXLINE(  24)			return;
+            		}
+            		HX_END_LOCAL_FUNC1((void))
+
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(1)
+            		void _hx_run( ::Dynamic _){
+            			HX_STACKFRAME(&_hx_pos_3b45cafe0ded873a_24_run)
+HXLINE(  24)			return;
+            		}
+            		HX_END_LOCAL_FUNC1((void))
+
+            	HX_STACKFRAME(&_hx_pos_3b45cafe0ded873a_22_run)
+HXLINE(  23)		::Dynamic next = ::thenshim::_Promise::Promise_Impl__obj::then(this->p, ::Dynamic(new _hx_Closure_0(fn)),null());
+HXLINE(  24)		this->p = ::thenshim::_Promise::Promise_Impl__obj::then(next, ::Dynamic(new _hx_Closure_1()), ::Dynamic(new _hx_Closure_2()));
+HXLINE(  25)		return next;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(AsyncLock_obj,run,return )
+
+
+::hx::ObjectPtr< AsyncLock_obj > AsyncLock_obj::__new() {
+	::hx::ObjectPtr< AsyncLock_obj > __this = new AsyncLock_obj();
+	__this->__construct();
+	return __this;
+}
+
+::hx::ObjectPtr< AsyncLock_obj > AsyncLock_obj::__alloc(::hx::Ctx *_hx_ctx) {
+	AsyncLock_obj *__this = (AsyncLock_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(AsyncLock_obj), true, "borogove.AsyncLock"));
+	*(void **)__this = AsyncLock_obj::_hx_vtable;
+	__this->__construct();
+	return __this;
+}
+
+AsyncLock_obj::AsyncLock_obj()
+{
+}
+
+void AsyncLock_obj::__Mark(HX_MARK_PARAMS)
+{
+	HX_MARK_BEGIN_CLASS(AsyncLock);
+	HX_MARK_MEMBER_NAME(p,"p");
+	HX_MARK_END_CLASS();
+}
+
+void AsyncLock_obj::__Visit(HX_VISIT_PARAMS)
+{
+	HX_VISIT_MEMBER_NAME(p,"p");
+}
+
+::hx::Val AsyncLock_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 1:
+		if (HX_FIELD_EQ(inName,"p") ) { return ::hx::Val( p ); }
+		break;
+	case 3:
+		if (HX_FIELD_EQ(inName,"run") ) { return ::hx::Val( run_dyn() ); }
+	}
+	return super::__Field(inName,inCallProp);
+}
+
+::hx::Val AsyncLock_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 1:
+		if (HX_FIELD_EQ(inName,"p") ) { p=inValue.Cast< ::Dynamic >(); return inValue; }
+	}
+	return super::__SetField(inName,inValue,inCallProp);
+}
+
+void AsyncLock_obj::__GetFields(Array< ::String> &outFields)
+{
+	outFields->push(HX_("p",70,00,00,00));
+	super::__GetFields(outFields);
+};
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo AsyncLock_obj_sMemberStorageInfo[] = {
+	{::hx::fsObject /* ::Dynamic */ ,(int)offsetof(AsyncLock_obj,p),HX_("p",70,00,00,00)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+static ::hx::StaticInfo *AsyncLock_obj_sStaticStorageInfo = 0;
+#endif
+
+static ::String AsyncLock_obj_sMemberFields[] = {
+	HX_("p",70,00,00,00),
+	HX_("run",4b,e7,56,00),
+	::String(null()) };
+
+::hx::Class AsyncLock_obj::__mClass;
+
+void AsyncLock_obj::__register()
+{
+	AsyncLock_obj _hx_dummy;
+	AsyncLock_obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("borogove.AsyncLock",9a,61,2f,7b);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &::hx::Class_obj::GetNoStaticField;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(0 /* sStaticFields */);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(AsyncLock_obj_sMemberFields);
+	__mClass->mCanCast = ::hx::TCanCast< AsyncLock_obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = AsyncLock_obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = AsyncLock_obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+} // end namespace borogove
diff --git a/Sources/c_borogove/src/borogove/AttachmentSource.cpp b/Sources/c_borogove/src/borogove/AttachmentSource.cpp
index 11f5667..ddd284a 100644
--- a/Sources/c_borogove/src/borogove/AttachmentSource.cpp
+++ b/Sources/c_borogove/src/borogove/AttachmentSource.cpp
@@ -41,21 +41,21 @@
 #include <tink/streams/StreamObject.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_d724c8a9c8534014_18_new,"borogove.AttachmentSource","new",0x6c43ff9d,"borogove.AttachmentSource.new","borogove/AttachmentSource.cpp.hx",18,0xec06ee7d)
-HX_LOCAL_STACK_FRAME(_hx_pos_25944cb2fc8f2627_450_path__fromC,"borogove.AttachmentSource","path__fromC",0xf211edb1,"borogove.AttachmentSource.path__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_25944cb2fc8f2627_450_type__fromC,"borogove.AttachmentSource","type__fromC",0x0529dd3c,"borogove.AttachmentSource.type__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_25944cb2fc8f2627_450_name__fromC,"borogove.AttachmentSource","name__fromC",0x8023e1cb,"borogove.AttachmentSource.name__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_25944cb2fc8f2627_450_size__fromC,"borogove.AttachmentSource","size__fromC",0xbd120e15,"borogove.AttachmentSource.size__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_d724c8a9c8534014_27_tinkSource,"borogove.AttachmentSource","tinkSource",0xd8b715d0,"borogove.AttachmentSource.tinkSource","borogove/AttachmentSource.cpp.hx",27,0xec06ee7d)
+HX_DEFINE_STACK_FRAME(_hx_pos_d724c8a9c8534014_24_new,"borogove.AttachmentSource","new",0x6c43ff9d,"borogove.AttachmentSource.new","borogove/AttachmentSource.cpp.hx",24,0xec06ee7d)
+HX_LOCAL_STACK_FRAME(_hx_pos_25944cb2fc8f2627_478_path__fromC,"borogove.AttachmentSource","path__fromC",0xf211edb1,"borogove.AttachmentSource.path__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_25944cb2fc8f2627_478_type__fromC,"borogove.AttachmentSource","type__fromC",0x0529dd3c,"borogove.AttachmentSource.type__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_25944cb2fc8f2627_478_name__fromC,"borogove.AttachmentSource","name__fromC",0x8023e1cb,"borogove.AttachmentSource.name__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_25944cb2fc8f2627_478_size__fromC,"borogove.AttachmentSource","size__fromC",0xbd120e15,"borogove.AttachmentSource.size__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_d724c8a9c8534014_33_tinkSource,"borogove.AttachmentSource","tinkSource",0xd8b715d0,"borogove.AttachmentSource.tinkSource","borogove/AttachmentSource.cpp.hx",33,0xec06ee7d)
 HX_LOCAL_STACK_FRAME(_hx_pos_d724c8a9c8534014_12_boot,"borogove.AttachmentSource","boot",0x4754aa55,"borogove.AttachmentSource.boot","borogove/AttachmentSource.cpp.hx",12,0xec06ee7d)
 namespace borogove{
 
 void AttachmentSource_obj::__construct(::String path,::String mime){
-            	HX_STACKFRAME(&_hx_pos_d724c8a9c8534014_18_new)
-HXLINE(  19)		this->name = ::haxe::io::Path_obj::withoutDirectory(path);
-HXLINE(  20)		this->path = ::sys::FileSystem_obj::fullPath(path);
-HXLINE(  21)		this->size = ( (int)(::sys::FileSystem_obj::stat(this->path)->__Field(HX_("size",c1,a0,53,4c),::hx::paccDynamic)) );
-HXLINE(  22)		this->type = mime;
+            	HX_STACKFRAME(&_hx_pos_d724c8a9c8534014_24_new)
+HXLINE(  25)		this->name = ::haxe::io::Path_obj::withoutDirectory(path);
+HXLINE(  26)		this->path = ::sys::FileSystem_obj::fullPath(path);
+HXLINE(  27)		this->size = ( (int)(::sys::FileSystem_obj::stat(this->path)->__Field(HX_("size",c1,a0,53,4c),::hx::paccDynamic)) );
+HXLINE(  28)		this->type = mime;
             	}
 
 Dynamic AttachmentSource_obj::__CreateEmpty() { return new AttachmentSource_obj; }
@@ -74,53 +74,53 @@ bool AttachmentSource_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String AttachmentSource_obj::path__fromC(){
-            	HX_STACKFRAME(&_hx_pos_25944cb2fc8f2627_450_path__fromC)
-HXDLIN( 450)		return this->path;
+            	HX_STACKFRAME(&_hx_pos_25944cb2fc8f2627_478_path__fromC)
+HXDLIN( 478)		return this->path;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(AttachmentSource_obj,path__fromC,return )
 
 ::String AttachmentSource_obj::type__fromC(){
-            	HX_STACKFRAME(&_hx_pos_25944cb2fc8f2627_450_type__fromC)
-HXDLIN( 450)		return this->type;
+            	HX_STACKFRAME(&_hx_pos_25944cb2fc8f2627_478_type__fromC)
+HXDLIN( 478)		return this->type;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(AttachmentSource_obj,type__fromC,return )
 
 ::String AttachmentSource_obj::name__fromC(){
-            	HX_STACKFRAME(&_hx_pos_25944cb2fc8f2627_450_name__fromC)
-HXDLIN( 450)		return this->name;
+            	HX_STACKFRAME(&_hx_pos_25944cb2fc8f2627_478_name__fromC)
+HXDLIN( 478)		return this->name;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(AttachmentSource_obj,name__fromC,return )
 
 int AttachmentSource_obj::size__fromC(){
-            	HX_STACKFRAME(&_hx_pos_25944cb2fc8f2627_450_size__fromC)
-HXDLIN( 450)		return this->size;
+            	HX_STACKFRAME(&_hx_pos_25944cb2fc8f2627_478_size__fromC)
+HXDLIN( 478)		return this->size;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(AttachmentSource_obj,size__fromC,return )
 
 ::Dynamic AttachmentSource_obj::tinkSource(){
-            	HX_GC_STACKFRAME(&_hx_pos_d724c8a9c8534014_27_tinkSource)
-HXDLIN(  27)		::String name = this->name;
-HXDLIN(  27)		 ::haxe::io::Input input = ::sys::io::File_obj::read(this->path,null());
-HXDLIN(  27)		 ::Dynamic options = null();
-HXDLIN(  27)		options =  ::Dynamic(::hx::Anon_obj::Create(0));
-HXDLIN(  27)		::Dynamic _hx_tmp = ::tink::io::_Worker::Worker_Impl__obj::ensure( ::Dynamic(options->__Field(HX_("worker",7e,30,9e,c9),::hx::paccDynamic)));
-HXDLIN(  27)		 ::Dynamic _g = options->__Field(HX_("chunkSize",ce,cd,77,9f),::hx::paccDynamic);
-HXDLIN(  27)		int _hx_tmp1;
-HXDLIN(  27)		if (::hx::IsNull( _g )) {
-HXDLIN(  27)			_hx_tmp1 = 65536;
+            	HX_GC_STACKFRAME(&_hx_pos_d724c8a9c8534014_33_tinkSource)
+HXDLIN(  33)		::String name = this->name;
+HXDLIN(  33)		 ::haxe::io::Input input = ::sys::io::File_obj::read(this->path,null());
+HXDLIN(  33)		 ::Dynamic options = null();
+HXDLIN(  33)		options =  ::Dynamic(::hx::Anon_obj::Create(0));
+HXDLIN(  33)		::Dynamic _hx_tmp = ::tink::io::_Worker::Worker_Impl__obj::ensure( ::Dynamic(options->__Field(HX_("worker",7e,30,9e,c9),::hx::paccDynamic)));
+HXDLIN(  33)		 ::Dynamic _g = options->__Field(HX_("chunkSize",ce,cd,77,9f),::hx::paccDynamic);
+HXDLIN(  33)		int _hx_tmp1;
+HXDLIN(  33)		if (::hx::IsNull( _g )) {
+HXDLIN(  33)			_hx_tmp1 = 65536;
             		}
             		else {
-HXDLIN(  27)			_hx_tmp1 = ( (int)(_g) );
+HXDLIN(  33)			_hx_tmp1 = ( (int)(_g) );
             		}
-HXDLIN(  27)		return  ::tink::io::std::InputSource_obj::__alloc( HX_CTX ,name,input,_hx_tmp,::haxe::io::Bytes_obj::alloc(_hx_tmp1),0);
+HXDLIN(  33)		return  ::tink::io::std::InputSource_obj::__alloc( HX_CTX ,name,input,_hx_tmp,::haxe::io::Bytes_obj::alloc(_hx_tmp1),0);
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/Autolink.cpp b/Sources/c_borogove/src/borogove/Autolink.cpp
index 9042bb1..6b37136 100644
--- a/Sources/c_borogove/src/borogove/Autolink.cpp
+++ b/Sources/c_borogove/src/borogove/Autolink.cpp
@@ -20,10 +20,16 @@
 #include <borogove/Stanza.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_349_one,"borogove.Autolink","one",0xc87857ee,"borogove.Autolink.one","borogove/Autolink.hx",349,0x8c1e1427)
-HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_350_one,"borogove.Autolink","one",0xc87857ee,"borogove.Autolink.one","borogove/Autolink.hx",350,0x8c1e1427)
-HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_342_one,"borogove.Autolink","one",0xc87857ee,"borogove.Autolink.one","borogove/Autolink.hx",342,0x8c1e1427)
-HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_356_match,"borogove.Autolink","match",0xe9d778cd,"borogove.Autolink.match","borogove/Autolink.hx",356,0x8c1e1427)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_355_one,"borogove.Autolink","one",0xc87857ee,"borogove.Autolink.one","borogove/Autolink.hx",355,0x8c1e1427)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_356_one,"borogove.Autolink","one",0xc87857ee,"borogove.Autolink.one","borogove/Autolink.hx",356,0x8c1e1427)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_347_one,"borogove.Autolink","one",0xc87857ee,"borogove.Autolink.one","borogove/Autolink.hx",347,0x8c1e1427)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_362_match,"borogove.Autolink","match",0xe9d778cd,"borogove.Autolink.match","borogove/Autolink.hx",362,0x8c1e1427)
+static const ::String _hx_array_data_17d8b9f6_6[] = {
+	HX_("/",2f,00,00,00),HX_("#",23,00,00,00),
+};
+static const ::String _hx_array_data_17d8b9f6_7[] = {
+	HX_(".",2e,00,00,00),HX_(",",2c,00,00,00),HX_(";",3b,00,00,00),HX_(":",3a,00,00,00),HX_("!",21,00,00,00),HX_("?",3f,00,00,00),HX_(")",29,00,00,00),HX_("]",5d,00,00,00),HX_(">",3e,00,00,00),
+};
 HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_29_boot,"borogove.Autolink","boot",0x983d9daa,"borogove.Autolink.boot","borogove/Autolink.hx",29,0x8c1e1427)
 HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_41_boot,"borogove.Autolink","boot",0x983d9daa,"borogove.Autolink.boot","borogove/Autolink.hx",41,0x8c1e1427)
 HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_163_boot,"borogove.Autolink","boot",0x983d9daa,"borogove.Autolink.boot","borogove/Autolink.hx",163,0x8c1e1427)
@@ -49,6 +55,7 @@ HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_329_boot,"borogove.Autolink","boot
 HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_332_boot,"borogove.Autolink","boot",0x983d9daa,"borogove.Autolink.boot","borogove/Autolink.hx",332,0x8c1e1427)
 HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_335_boot,"borogove.Autolink","boot",0x983d9daa,"borogove.Autolink.boot","borogove/Autolink.hx",335,0x8c1e1427)
 HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_337_boot,"borogove.Autolink","boot",0x983d9daa,"borogove.Autolink.boot","borogove/Autolink.hx",337,0x8c1e1427)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6a92d28a7d85bf6_342_boot,"borogove.Autolink","boot",0x983d9daa,"borogove.Autolink.boot","borogove/Autolink.hx",342,0x8c1e1427)
 namespace borogove{
 
 void Autolink_obj::__construct() { }
@@ -116,93 +123,134 @@ bool Autolink_obj::_hx_isInstanceOf(int inClassId) {
 
  ::EReg Autolink_obj::XMPP_URI;
 
+ ::EReg Autolink_obj::AUTOLINK_EMAIL;
+
  ::Dynamic Autolink_obj::one(::String s,int start){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(2)
             		int _hx_run( ::Dynamic x, ::Dynamic y){
-            			HX_STACKFRAME(&_hx_pos_b6a92d28a7d85bf6_349_one)
-HXLINE( 349)			return (( (int)(x->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)) ) - ( (int)(y->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)) ));
+            			HX_STACKFRAME(&_hx_pos_b6a92d28a7d85bf6_355_one)
+HXLINE( 355)			return (( (int)(x->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)) ) - ( (int)(y->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)) ));
             		}
             		HX_END_LOCAL_FUNC2(return)
 
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             		bool _hx_run( ::Dynamic match){
-            			HX_STACKFRAME(&_hx_pos_b6a92d28a7d85bf6_350_one)
-HXLINE( 350)			return ::hx::IsNotNull( match->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic) );
+            			HX_STACKFRAME(&_hx_pos_b6a92d28a7d85bf6_356_one)
+HXLINE( 356)			return ::hx::IsNotNull( match->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic) );
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_b6a92d28a7d85bf6_342_one)
-HXLINE( 344)		 ::Dynamic matches = ::borogove::Autolink_obj::match(s,start,::borogove::Autolink_obj::XMPP_URI,false);
-HXLINE( 345)		 ::Dynamic matches1 = ::borogove::Autolink_obj::match(s,start,::borogove::Autolink_obj::TEL_URI,false);
-HXLINE( 346)		 ::Dynamic matches2 = ::borogove::Autolink_obj::match(s,start,::borogove::Autolink_obj::SMS_URI,false);
-HXLINE( 343)		::Array< ::Dynamic> matches3 = ::Array_obj< ::Dynamic>::__new(4)->init(0,matches)->init(1,matches1)->init(2,matches2)->init(3,::borogove::Autolink_obj::match(s,start,::borogove::Autolink_obj::AUTOLINK_WEB_URL,true));
-HXLINE( 349)		matches3->sort( ::Dynamic(new _hx_Closure_0()));
-HXLINE( 350)		 ::Dynamic tmp = ::Lambda_obj::find(matches3, ::Dynamic(new _hx_Closure_1()));
-HXDLIN( 350)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 350)			return tmp;
+            	HX_STACKFRAME(&_hx_pos_b6a92d28a7d85bf6_347_one)
+HXLINE( 349)		 ::Dynamic matches = ::borogove::Autolink_obj::match(s,start,::borogove::Autolink_obj::XMPP_URI,null());
+HXLINE( 350)		 ::Dynamic matches1 = ::borogove::Autolink_obj::match(s,start,::borogove::Autolink_obj::TEL_URI,null());
+HXLINE( 351)		 ::Dynamic matches2 = ::borogove::Autolink_obj::match(s,start,::borogove::Autolink_obj::SMS_URI,null());
+HXLINE( 352)		 ::Dynamic matches3 = ::borogove::Autolink_obj::match(s,start,::borogove::Autolink_obj::AUTOLINK_EMAIL,HX_("mailto:",88,ea,0f,3a));
+HXLINE( 348)		::Array< ::Dynamic> matches4 = ::Array_obj< ::Dynamic>::__new(5)->init(0,matches)->init(1,matches1)->init(2,matches2)->init(3,matches3)->init(4,::borogove::Autolink_obj::match(s,start,::borogove::Autolink_obj::AUTOLINK_WEB_URL,HX_("https://",cf,b4,ae,3e)));
+HXLINE( 355)		matches4->sort( ::Dynamic(new _hx_Closure_0()));
+HXLINE( 356)		 ::Dynamic tmp = ::Lambda_obj::find(matches4, ::Dynamic(new _hx_Closure_1()));
+HXDLIN( 356)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 356)			return tmp;
             		}
             		else {
-HXLINE( 350)			return matches3->__get(0);
+HXLINE( 356)			return matches4->__get(0);
             		}
-HXDLIN( 350)		return null();
+HXDLIN( 356)		return null();
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC2(Autolink_obj,one,return )
 
- ::Dynamic Autolink_obj::match(::String s,int start, ::EReg pattern,bool addHttps){
-            	HX_GC_STACKFRAME(&_hx_pos_b6a92d28a7d85bf6_356_match)
-HXDLIN( 356)		if (pattern->matchSub(s,start,null())) {
-HXLINE( 357)			 ::Dynamic pos = pattern->matchedPos();
-HXLINE( 358)			::String link = pattern->matched(0);
-HXLINE( 359)			::String uri;
-HXDLIN( 359)			bool uri1;
-HXDLIN( 359)			if (addHttps) {
-HXLINE( 359)				uri1 = (link.indexOf(HX_("://",da,2b,2c,00),null()) != -1);
+ ::Dynamic Autolink_obj::match(::String s,int start, ::EReg pattern,::String add){
+            	HX_GC_STACKFRAME(&_hx_pos_b6a92d28a7d85bf6_362_match)
+HXDLIN( 362)		if (pattern->matchSub(s,start,null())) {
+HXLINE( 363)			 ::Dynamic pos = pattern->matchedPos();
+HXLINE( 364)			int len = ( (int)(pos->__Field(HX_("len",d5,4b,52,00),::hx::paccDynamic)) );
+HXLINE( 365)			if ((add == HX_("https://",cf,b4,ae,3e))) {
+HXLINE( 366)				while(true){
+HXLINE( 366)					bool _hx_tmp;
+HXDLIN( 366)					if (::hx::IsLess( (pos->__Field(HX_("pos",94,5d,55,00),::hx::paccDynamic) + len),s.length )) {
+HXLINE( 366)						_hx_tmp = ::Array_obj< ::String >::fromData( _hx_array_data_17d8b9f6_6,2)->contains(s.charAt(( (int)((pos->__Field(HX_("pos",94,5d,55,00),::hx::paccDynamic) + len)) )));
+            					}
+            					else {
+HXLINE( 366)						_hx_tmp = false;
+            					}
+HXDLIN( 366)					if (!(_hx_tmp)) {
+HXLINE( 366)						goto _hx_goto_3;
+            					}
+HXLINE( 367)					len = (len + 1);
+            				}
+            				_hx_goto_3:;
+            			}
+HXLINE( 370)			while(true){
+HXLINE( 370)				bool _hx_tmp1;
+HXDLIN( 370)				if ((len > 0)) {
+HXLINE( 370)					_hx_tmp1 = ::Array_obj< ::String >::fromData( _hx_array_data_17d8b9f6_7,9)->contains(s.charAt((( (int)((pos->__Field(HX_("pos",94,5d,55,00),::hx::paccDynamic) + len)) ) - 1)));
+            				}
+            				else {
+HXLINE( 370)					_hx_tmp1 = false;
+            				}
+HXDLIN( 370)				if (!(_hx_tmp1)) {
+HXLINE( 370)					goto _hx_goto_4;
+            				}
+HXLINE( 371)				len = (len - 1);
+            			}
+            			_hx_goto_4:;
+HXLINE( 373)			::String link = s.substr(( (int)(pos->__Field(HX_("pos",94,5d,55,00),::hx::paccDynamic)) ),len);
+HXLINE( 374)			::String uri;
+HXDLIN( 374)			bool uri1;
+HXDLIN( 374)			bool uri2;
+HXDLIN( 374)			if (::hx::IsNotNull( add )) {
+HXLINE( 374)				uri2 = (link.indexOf(HX_("://",da,2b,2c,00),null()) != -1);
             			}
             			else {
-HXLINE( 359)				uri1 = true;
+HXLINE( 374)				uri2 = true;
             			}
-HXDLIN( 359)			if (uri1) {
-HXLINE( 359)				uri = link;
+HXDLIN( 374)			if (!(uri2)) {
+HXLINE( 374)				uri1 = ::StringTools_obj::startsWith(link,add);
             			}
             			else {
-HXLINE( 359)				uri = (HX_("https://",cf,b4,ae,3e) + link);
+HXLINE( 374)				uri1 = true;
             			}
-HXLINE( 360)			::String text;
-HXDLIN( 360)			if (::StringTools_obj::startsWith(link,HX_("xmpp:",65,3c,77,60))) {
-HXLINE( 360)				text =  ::EReg_obj::__alloc( HX_CTX ,HX_("omemo-sid[^;]+;?",a0,16,8d,49),HX_("",00,00,00,00))->replace(link,HX_("",00,00,00,00));
+HXDLIN( 374)			if (uri1) {
+HXLINE( 374)				uri = link;
             			}
             			else {
-HXLINE( 360)				text = link;
+HXLINE( 374)				uri = (add + link);
             			}
-HXLINE( 361)			bool text1;
-HXDLIN( 361)			if (::StringTools_obj::startsWith(link,HX_("xmpp:",65,3c,77,60))) {
-HXLINE( 361)				text1 = ::StringTools_obj::endsWith(text,HX_(";",3b,00,00,00));
+HXLINE( 375)			::String text;
+HXDLIN( 375)			if (::StringTools_obj::startsWith(link,HX_("xmpp:",65,3c,77,60))) {
+HXLINE( 375)				text =  ::EReg_obj::__alloc( HX_CTX ,HX_("omemo-sid[^;]+;?",a0,16,8d,49),HX_("",00,00,00,00))->replace(link,HX_("",00,00,00,00));
             			}
             			else {
-HXLINE( 361)				text1 = false;
+HXLINE( 375)				text = link;
             			}
-HXDLIN( 361)			if (text1) {
-HXLINE( 361)				text = text.substr(0,(text.length - 1));
+HXLINE( 376)			bool text1;
+HXDLIN( 376)			if (::StringTools_obj::startsWith(link,HX_("xmpp:",65,3c,77,60))) {
+HXLINE( 376)				text1 = ::StringTools_obj::endsWith(text,HX_(";",3b,00,00,00));
             			}
-HXLINE( 362)			if (::StringTools_obj::endsWith(text,HX_("?",3f,00,00,00))) {
-HXLINE( 362)				text = text.substr(0,(text.length - 1));
+            			else {
+HXLINE( 376)				text1 = false;
+            			}
+HXDLIN( 376)			if (text1) {
+HXLINE( 376)				text = text.substr(0,(text.length - 1));
+            			}
+HXLINE( 377)			if (::StringTools_obj::endsWith(text,HX_("?",3f,00,00,00))) {
+HXLINE( 377)				text = text.substr(0,(text.length - 1));
             			}
-HXLINE( 364)			 ::borogove::Node _hx_tmp = ::borogove::Node_obj::Element( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("a",61,00,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 379)			 ::borogove::Node _hx_tmp2 = ::borogove::Node_obj::Element( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("a",61,00,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("href",eb,09,15,45),uri)))->text(text));
-HXDLIN( 364)			return  ::Dynamic(::hx::Anon_obj::Create(3)
+HXDLIN( 379)			return  ::Dynamic(::hx::Anon_obj::Create(3)
             				->setFixed(0,HX_("start",62,74,0b,84), ::Dynamic(pos->__Field(HX_("pos",94,5d,55,00),::hx::paccDynamic)))
-            				->setFixed(1,HX_("end",db,03,4d,00), ::Dynamic((pos->__Field(HX_("pos",94,5d,55,00),::hx::paccDynamic) + pos->__Field(HX_("len",d5,4b,52,00),::hx::paccDynamic))))
-            				->setFixed(2,HX_("span",ca,da,58,4c),_hx_tmp));
+            				->setFixed(1,HX_("end",db,03,4d,00), ::Dynamic((pos->__Field(HX_("pos",94,5d,55,00),::hx::paccDynamic) + len)))
+            				->setFixed(2,HX_("span",ca,da,58,4c),_hx_tmp2));
             		}
             		else {
-HXLINE( 366)			return  ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE( 381)			return  ::Dynamic(::hx::Anon_obj::Create(3)
             				->setFixed(0,HX_("start",62,74,0b,84),s.length)
             				->setFixed(1,HX_("end",db,03,4d,00),s.length)
             				->setFixed(2,HX_("span",ca,da,58,4c),null()));
             		}
-HXLINE( 356)		return null();
+HXLINE( 362)		return null();
             	}
 
 
@@ -254,6 +302,7 @@ bool Autolink_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::
 		break;
 	case 14:
 		if (HX_FIELD_EQ(inName,"PATH_AND_QUERY") ) { outValue = ( PATH_AND_QUERY ); return true; }
+		if (HX_FIELD_EQ(inName,"AUTOLINK_EMAIL") ) { outValue = ( AUTOLINK_EMAIL ); return true; }
 		break;
 	case 16:
 		if (HX_FIELD_EQ(inName,"STRICT_HOST_NAME") ) { outValue = ( STRICT_HOST_NAME ); return true; }
@@ -312,6 +361,7 @@ bool Autolink_obj::__SetStatic(const ::String &inName,Dynamic &ioValue,::hx::Pro
 		break;
 	case 14:
 		if (HX_FIELD_EQ(inName,"PATH_AND_QUERY") ) { PATH_AND_QUERY=ioValue.Cast< ::String >(); return true; }
+		if (HX_FIELD_EQ(inName,"AUTOLINK_EMAIL") ) { AUTOLINK_EMAIL=ioValue.Cast<  ::EReg >(); return true; }
 		break;
 	case 16:
 		if (HX_FIELD_EQ(inName,"STRICT_HOST_NAME") ) { STRICT_HOST_NAME=ioValue.Cast< ::String >(); return true; }
@@ -362,6 +412,7 @@ static ::hx::StaticInfo Autolink_obj_sStaticStorageInfo[] = {
 	{::hx::fsObject /*  ::EReg */ ,(void *) &Autolink_obj::TEL_URI,HX_("TEL_URI",88,ff,2a,3d)},
 	{::hx::fsObject /*  ::EReg */ ,(void *) &Autolink_obj::SMS_URI,HX_("SMS_URI",46,7b,3e,4e)},
 	{::hx::fsObject /*  ::EReg */ ,(void *) &Autolink_obj::XMPP_URI,HX_("XMPP_URI",02,45,f3,76)},
+	{::hx::fsObject /*  ::EReg */ ,(void *) &Autolink_obj::AUTOLINK_EMAIL,HX_("AUTOLINK_EMAIL",e6,4d,1e,b1)},
 	{ ::hx::fsUnknown, 0, null()}
 };
 #endif
@@ -391,6 +442,7 @@ static void Autolink_obj_sMarkStatics(HX_MARK_PARAMS) {
 	HX_MARK_MEMBER_NAME(Autolink_obj::TEL_URI,"TEL_URI");
 	HX_MARK_MEMBER_NAME(Autolink_obj::SMS_URI,"SMS_URI");
 	HX_MARK_MEMBER_NAME(Autolink_obj::XMPP_URI,"XMPP_URI");
+	HX_MARK_MEMBER_NAME(Autolink_obj::AUTOLINK_EMAIL,"AUTOLINK_EMAIL");
 };
 
 #ifdef HXCPP_VISIT_ALLOCS
@@ -419,6 +471,7 @@ static void Autolink_obj_sVisitStatics(HX_VISIT_PARAMS) {
 	HX_VISIT_MEMBER_NAME(Autolink_obj::TEL_URI,"TEL_URI");
 	HX_VISIT_MEMBER_NAME(Autolink_obj::SMS_URI,"SMS_URI");
 	HX_VISIT_MEMBER_NAME(Autolink_obj::XMPP_URI,"XMPP_URI");
+	HX_VISIT_MEMBER_NAME(Autolink_obj::AUTOLINK_EMAIL,"AUTOLINK_EMAIL");
 };
 
 #endif
@@ -450,6 +503,7 @@ static ::String Autolink_obj_sStaticFields[] = {
 	HX_("TEL_URI",88,ff,2a,3d),
 	HX_("SMS_URI",46,7b,3e,4e),
 	HX_("XMPP_URI",02,45,f3,76),
+	HX_("AUTOLINK_EMAIL",e6,4d,1e,b1),
 	HX_("one",66,9a,54,00),
 	HX_("match",45,49,23,03),
 	::String(null())
@@ -587,6 +641,10 @@ HXDLIN( 335)		SMS_URI =  ::EReg_obj::__alloc( HX_CTX ,((HX_("sms:(?:(?:\\+\\d+)|
             	HX_GC_STACKFRAME(&_hx_pos_b6a92d28a7d85bf6_337_boot)
 HXDLIN( 337)		XMPP_URI =  ::EReg_obj::__alloc( HX_CTX ,(((HX_("xmpp\\:(?:(?:[",08,ef,83,26) + ::borogove::Autolink_obj::GOOD_IRI_CHAR) + HX_("\\;\\/\\?\\@\\&\\=\\#\\~\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])",75,2a,04,95)) + HX_("|(?:\\%[a-fA-F0-9]{2}))+",d1,f8,1c,37)),HX_("u",75,00,00,00));
             	}
+{
+            	HX_GC_STACKFRAME(&_hx_pos_b6a92d28a7d85bf6_342_boot)
+HXDLIN( 342)		AUTOLINK_EMAIL =  ::EReg_obj::__alloc( HX_CTX ,(((((((HX_("(?:mailto\\:)?(?:(?:[",52,fe,c8,e9) + ::borogove::Autolink_obj::GOOD_IRI_CHAR) + HX_("\\;\\/\\?\\=\\~\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])",80,3a,ae,de)) + HX_("|(?:\\%[a-fA-F0-9]{2}))+@",4f,be,3c,02)) + ::borogove::Autolink_obj::STRICT_HOST_NAME) + HX_("(?:\\?",66,f8,d7,31)) + ::borogove::Autolink_obj::PATH_CHAR) + HX_("+)?",e1,c4,20,00)),HX_("u",75,00,00,00));
+            	}
 }
 
 } // end namespace borogove
diff --git a/Sources/c_borogove/src/borogove/AvailableChat.cpp b/Sources/c_borogove/src/borogove/AvailableChat.cpp
index 6a75e92..33e70b5 100644
--- a/Sources/c_borogove/src/borogove/AvailableChat.cpp
+++ b/Sources/c_borogove/src/borogove/AvailableChat.cpp
@@ -8,20 +8,22 @@
 #include <borogove/Caps.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_eed68530cdcabc2a_1940_new,"borogove.AvailableChat","new",0x5dac2a06,"borogove.AvailableChat.new","borogove/Chat.hx",1940,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_5767937a9c3c6668_450_chatId__fromC,"borogove.AvailableChat","chatId__fromC",0xf38d212c,"borogove.AvailableChat.chatId__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_5767937a9c3c6668_450_displayName__fromC,"borogove.AvailableChat","displayName__fromC",0x70140f86,"borogove.AvailableChat.displayName__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_5767937a9c3c6668_450_note__fromC,"borogove.AvailableChat","note__fromC",0x82768a6d,"borogove.AvailableChat.note__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_eed68530cdcabc2a_1936_isChannel,"borogove.AvailableChat","isChannel",0xad5c981f,"borogove.AvailableChat.isChannel","borogove/Chat.hx",1936,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_eed68530cdcabc2a_1916_boot,"borogove.AvailableChat","boot",0x91119bcc,"borogove.AvailableChat.boot","borogove/Chat.hx",1916,0x1763ae98)
+HX_DEFINE_STACK_FRAME(_hx_pos_eed68530cdcabc2a_2354_new,"borogove.AvailableChat","new",0x5dac2a06,"borogove.AvailableChat.new","borogove/Chat.hx",2354,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_5767937a9c3c6668_478_chatId__fromC,"borogove.AvailableChat","chatId__fromC",0xf38d212c,"borogove.AvailableChat.chatId__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_5767937a9c3c6668_478_displayName__fromC,"borogove.AvailableChat","displayName__fromC",0x70140f86,"borogove.AvailableChat.displayName__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_5767937a9c3c6668_478_note__fromC,"borogove.AvailableChat","note__fromC",0x82768a6d,"borogove.AvailableChat.note__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_eed68530cdcabc2a_2330_isChannel,"borogove.AvailableChat","isChannel",0xad5c981f,"borogove.AvailableChat.isChannel","borogove/Chat.hx",2330,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_eed68530cdcabc2a_2336_canAudioCall,"borogove.AvailableChat","canAudioCall",0xb02e8bfe,"borogove.AvailableChat.canAudioCall","borogove/Chat.hx",2336,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_eed68530cdcabc2a_2346_canVideoCall,"borogove.AvailableChat","canVideoCall",0xb6315e23,"borogove.AvailableChat.canVideoCall","borogove/Chat.hx",2346,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_eed68530cdcabc2a_2310_boot,"borogove.AvailableChat","boot",0x91119bcc,"borogove.AvailableChat.boot","borogove/Chat.hx",2310,0x1763ae98)
 namespace borogove{
 
 void AvailableChat_obj::__construct(::String chatId,::String displayName,::String note, ::borogove::Caps caps){
-            	HX_STACKFRAME(&_hx_pos_eed68530cdcabc2a_1940_new)
-HXLINE(1941)		this->chatId = chatId;
-HXLINE(1942)		this->displayName = displayName;
-HXLINE(1943)		this->note = note;
-HXLINE(1944)		this->caps = caps;
+            	HX_STACKFRAME(&_hx_pos_eed68530cdcabc2a_2354_new)
+HXLINE(2355)		this->chatId = chatId;
+HXLINE(2356)		this->displayName = displayName;
+HXLINE(2357)		this->note = note;
+HXLINE(2358)		this->caps = caps;
             	}
 
 Dynamic AvailableChat_obj::__CreateEmpty() { return new AvailableChat_obj; }
@@ -40,37 +42,89 @@ bool AvailableChat_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String AvailableChat_obj::chatId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_5767937a9c3c6668_450_chatId__fromC)
-HXDLIN( 450)		return this->chatId;
+            	HX_STACKFRAME(&_hx_pos_5767937a9c3c6668_478_chatId__fromC)
+HXDLIN( 478)		return this->chatId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(AvailableChat_obj,chatId__fromC,return )
 
 ::String AvailableChat_obj::displayName__fromC(){
-            	HX_STACKFRAME(&_hx_pos_5767937a9c3c6668_450_displayName__fromC)
-HXDLIN( 450)		return this->displayName;
+            	HX_STACKFRAME(&_hx_pos_5767937a9c3c6668_478_displayName__fromC)
+HXDLIN( 478)		return this->displayName;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(AvailableChat_obj,displayName__fromC,return )
 
 ::String AvailableChat_obj::note__fromC(){
-            	HX_STACKFRAME(&_hx_pos_5767937a9c3c6668_450_note__fromC)
-HXDLIN( 450)		return this->note;
+            	HX_STACKFRAME(&_hx_pos_5767937a9c3c6668_478_note__fromC)
+HXDLIN( 478)		return this->note;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(AvailableChat_obj,note__fromC,return )
 
 bool AvailableChat_obj::isChannel(){
-            	HX_STACKFRAME(&_hx_pos_eed68530cdcabc2a_1936_isChannel)
-HXDLIN(1936)		return this->caps->isChannel(this->chatId);
+            	HX_STACKFRAME(&_hx_pos_eed68530cdcabc2a_2330_isChannel)
+HXDLIN(2330)		return this->caps->isChannel(this->chatId);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(AvailableChat_obj,isChannel,return )
 
+bool AvailableChat_obj::canAudioCall(){
+            	HX_STACKFRAME(&_hx_pos_eed68530cdcabc2a_2336_canAudioCall)
+HXLINE(2338)		bool _hx_tmp;
+HXDLIN(2338)		::Array< ::String > tmp = this->caps->features;
+HXDLIN(2338)		 ::Dynamic tmp1;
+HXDLIN(2338)		if (::hx::IsNotNull( tmp )) {
+HXLINE(2338)			tmp1 = tmp->contains(HX_("urn:xmpp:jingle:apps:rtp:audio",0f,8b,54,6c));
+            		}
+            		else {
+HXLINE(2338)			tmp1 = null();
+            		}
+HXDLIN(2338)		if (::hx::IsNotNull( tmp1 )) {
+HXLINE(2338)			_hx_tmp = ( (bool)(tmp1) );
+            		}
+            		else {
+HXLINE(2338)			_hx_tmp = false;
+            		}
+HXDLIN(2338)		if (_hx_tmp) {
+HXLINE(2338)			return true;
+            		}
+HXLINE(2340)		return false;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(AvailableChat_obj,canAudioCall,return )
+
+bool AvailableChat_obj::canVideoCall(){
+            	HX_STACKFRAME(&_hx_pos_eed68530cdcabc2a_2346_canVideoCall)
+HXLINE(2348)		bool _hx_tmp;
+HXDLIN(2348)		::Array< ::String > tmp = this->caps->features;
+HXDLIN(2348)		 ::Dynamic tmp1;
+HXDLIN(2348)		if (::hx::IsNotNull( tmp )) {
+HXLINE(2348)			tmp1 = tmp->contains(HX_("urn:xmpp:jingle:apps:rtp:video",b4,26,d0,7b));
+            		}
+            		else {
+HXLINE(2348)			tmp1 = null();
+            		}
+HXDLIN(2348)		if (::hx::IsNotNull( tmp1 )) {
+HXLINE(2348)			_hx_tmp = ( (bool)(tmp1) );
+            		}
+            		else {
+HXLINE(2348)			_hx_tmp = false;
+            		}
+HXDLIN(2348)		if (_hx_tmp) {
+HXLINE(2348)			return true;
+            		}
+HXLINE(2350)		return false;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(AvailableChat_obj,canVideoCall,return )
+
 
 ::hx::ObjectPtr< AvailableChat_obj > AvailableChat_obj::__new(::String chatId,::String displayName,::String note, ::borogove::Caps caps) {
 	::hx::ObjectPtr< AvailableChat_obj > __this = new AvailableChat_obj();
@@ -124,6 +178,10 @@ void AvailableChat_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"displayName") ) { return ::hx::Val( displayName ); }
 		if (HX_FIELD_EQ(inName,"note__fromC") ) { return ::hx::Val( note__fromC_dyn() ); }
 		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"canAudioCall") ) { return ::hx::Val( canAudioCall_dyn() ); }
+		if (HX_FIELD_EQ(inName,"canVideoCall") ) { return ::hx::Val( canVideoCall_dyn() ); }
+		break;
 	case 13:
 		if (HX_FIELD_EQ(inName,"chatId__fromC") ) { return ::hx::Val( chatId__fromC_dyn() ); }
 		break;
@@ -178,6 +236,8 @@ static ::String AvailableChat_obj_sMemberFields[] = {
 	HX_("note__fromC",c7,1a,13,57),
 	HX_("caps",21,1c,ba,41),
 	HX_("isChannel",f9,7d,d0,d0),
+	HX_("canAudioCall",64,4a,90,e4),
+	HX_("canVideoCall",89,1c,93,ea),
 	::String(null()) };
 
 ::hx::Class AvailableChat_obj::__mClass;
@@ -208,8 +268,8 @@ void AvailableChat_obj::__register()
 void AvailableChat_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_eed68530cdcabc2a_1916_boot)
-HXDLIN(1916)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_eed68530cdcabc2a_2310_boot)
+HXDLIN(2310)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(3)
             				->setFixed(0,HX_("chatId__fromC",06,fc,b1,94), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
diff --git a/Sources/c_borogove/src/borogove/AvailableChatIterator.cpp b/Sources/c_borogove/src/borogove/AvailableChatIterator.cpp
new file mode 100644
index 0000000..5a2404e
--- /dev/null
+++ b/Sources/c_borogove/src/borogove/AvailableChatIterator.cpp
@@ -0,0 +1,887 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_EReg
+#include <EReg.h>
+#endif
+#ifndef INCLUDED_Lambda
+#include <Lambda.h>
+#endif
+#ifndef INCLUDED_StringTools
+#include <StringTools.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_Internal
+#include <_HaxeCBridge/Internal.h>
+#endif
+#ifndef INCLUDED_borogove_AvailableChat
+#include <borogove/AvailableChat.h>
+#endif
+#ifndef INCLUDED_borogove_AvailableChatIterator
+#include <borogove/AvailableChatIterator.h>
+#endif
+#ifndef INCLUDED_borogove_Caps
+#include <borogove/Caps.h>
+#endif
+#ifndef INCLUDED_borogove_CapsRepo
+#include <borogove/CapsRepo.h>
+#endif
+#ifndef INCLUDED_borogove_Chat
+#include <borogove/Chat.h>
+#endif
+#ifndef INCLUDED_borogove_Client
+#include <borogove/Client.h>
+#endif
+#ifndef INCLUDED_borogove_EventEmitter
+#include <borogove/EventEmitter.h>
+#endif
+#ifndef INCLUDED_borogove_Identity
+#include <borogove/Identity.h>
+#endif
+#ifndef INCLUDED_borogove_JID
+#include <borogove/JID.h>
+#endif
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
+#endif
+#ifndef INCLUDED_borogove_Persistence
+#include <borogove/Persistence.h>
+#endif
+#ifndef INCLUDED_borogove_Stanza
+#include <borogove/Stanza.h>
+#endif
+#ifndef INCLUDED_borogove__Chat_Chat_Fields_
+#include <borogove/_Chat/Chat_Fields_.h>
+#endif
+#ifndef INCLUDED_borogove__Util_Util_Fields_
+#include <borogove/_Util/Util_Fields_.h>
+#endif
+#ifndef INCLUDED_borogove_queries_DiscoInfoGet
+#include <borogove/queries/DiscoInfoGet.h>
+#endif
+#ifndef INCLUDED_borogove_queries_GenericQuery
+#include <borogove/queries/GenericQuery.h>
+#endif
+#ifndef INCLUDED_borogove_queries_JabberIqGatewayGet
+#include <borogove/queries/JabberIqGatewayGet.h>
+#endif
+#ifndef INCLUDED_cpp_Int64Map
+#include <cpp/Int64Map.h>
+#endif
+#ifndef INCLUDED_haxe_IMap
+#include <haxe/IMap.h>
+#endif
+#ifndef INCLUDED_haxe_ds_Either
+#include <haxe/ds/Either.h>
+#endif
+#ifndef INCLUDED_haxe_ds_StringMap
+#include <haxe/ds/StringMap.h>
+#endif
+#ifndef INCLUDED_thenshim_Thenable
+#include <thenshim/Thenable.h>
+#endif
+#ifndef INCLUDED_thenshim__Promise_Promise_Impl_
+#include <thenshim/_Promise/Promise_Impl_.h>
+#endif
+
+HX_DEFINE_STACK_FRAME(_hx_pos_d2dba419a7f92221_24_new,"borogove.AvailableChatIterator","new",0xf41c8314,"borogove.AvailableChatIterator.new","borogove/AvailableChatIterator.hx",24,0xe9fab5dd)
+HX_DEFINE_STACK_FRAME(_hx_pos_d2dba419a7f92221_66_new,"borogove.AvailableChatIterator","new",0xf41c8314,"borogove.AvailableChatIterator.new","borogove/AvailableChatIterator.hx",66,0xe9fab5dd)
+HX_DEFINE_STACK_FRAME(_hx_pos_d2dba419a7f92221_91_new,"borogove.AvailableChatIterator","new",0xf41c8314,"borogove.AvailableChatIterator.new","borogove/AvailableChatIterator.hx",91,0xe9fab5dd)
+HX_DEFINE_STACK_FRAME(_hx_pos_d2dba419a7f92221_90_new,"borogove.AvailableChatIterator","new",0xf41c8314,"borogove.AvailableChatIterator.new","borogove/AvailableChatIterator.hx",90,0xe9fab5dd)
+HX_DEFINE_STACK_FRAME(_hx_pos_d2dba419a7f92221_101_new,"borogove.AvailableChatIterator","new",0xf41c8314,"borogove.AvailableChatIterator.new","borogove/AvailableChatIterator.hx",101,0xe9fab5dd)
+HX_DEFINE_STACK_FRAME(_hx_pos_d2dba419a7f92221_102_new,"borogove.AvailableChatIterator","new",0xf41c8314,"borogove.AvailableChatIterator.new","borogove/AvailableChatIterator.hx",102,0xe9fab5dd)
+HX_DEFINE_STACK_FRAME(_hx_pos_d2dba419a7f92221_114_new,"borogove.AvailableChatIterator","new",0xf41c8314,"borogove.AvailableChatIterator.new","borogove/AvailableChatIterator.hx",114,0xe9fab5dd)
+HX_DEFINE_STACK_FRAME(_hx_pos_d2dba419a7f92221_119_new,"borogove.AvailableChatIterator","new",0xf41c8314,"borogove.AvailableChatIterator.new","borogove/AvailableChatIterator.hx",119,0xe9fab5dd)
+HX_DEFINE_STACK_FRAME(_hx_pos_d2dba419a7f92221_118_new,"borogove.AvailableChatIterator","new",0xf41c8314,"borogove.AvailableChatIterator.new","borogove/AvailableChatIterator.hx",118,0xe9fab5dd)
+HX_LOCAL_STACK_FRAME(_hx_pos_07fd1ca5fb749c25_478_q__fromC,"borogove.AvailableChatIterator","q__fromC",0x85dfd0f4,"borogove.AvailableChatIterator.q__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2dba419a7f92221_150_check,"borogove.AvailableChatIterator","check",0x4318607c,"borogove.AvailableChatIterator.check","borogove/AvailableChatIterator.hx",150,0xe9fab5dd)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2dba419a7f92221_148_check,"borogove.AvailableChatIterator","check",0x4318607c,"borogove.AvailableChatIterator.check","borogove/AvailableChatIterator.hx",148,0xe9fab5dd)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2dba419a7f92221_147_check,"borogove.AvailableChatIterator","check",0x4318607c,"borogove.AvailableChatIterator.check","borogove/AvailableChatIterator.hx",147,0xe9fab5dd)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2dba419a7f92221_197_next,"borogove.AvailableChatIterator","next",0xa4d62fbf,"borogove.AvailableChatIterator.next","borogove/AvailableChatIterator.hx",197,0xe9fab5dd)
+HX_LOCAL_STACK_FRAME(_hx_pos_07fd1ca5fb749c25_365_next__fromC,"borogove.AvailableChatIterator","next__fromC",0xa26d469a,"borogove.AvailableChatIterator.next__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2dba419a7f92221_216_internalNext,"borogove.AvailableChatIterator","internalNext",0x8370519c,"borogove.AvailableChatIterator.internalNext","borogove/AvailableChatIterator.hx",216,0xe9fab5dd)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2dba419a7f92221_201_internalNext,"borogove.AvailableChatIterator","internalNext",0x8370519c,"borogove.AvailableChatIterator.internalNext","borogove/AvailableChatIterator.hx",201,0xe9fab5dd)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2dba419a7f92221_24_boot,"borogove.AvailableChatIterator","boot",0x9cef2efe,"borogove.AvailableChatIterator.boot","borogove/AvailableChatIterator.hx",24,0xe9fab5dd)
+namespace borogove{
+
+void AvailableChatIterator_obj::__construct(::String q, ::borogove::Client client,::Dynamic persistence){
+            	HX_GC_STACKFRAME(&_hx_pos_d2dba419a7f92221_24_new)
+HXLINE(  34)		this->dedup =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(  33)		this->head = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  32)		this->results = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  37)		 ::borogove::AvailableChatIterator _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(  38)		this->q = q;
+HXLINE(  39)		this->client = client;
+HXLINE(  40)		this->persistence = persistence;
+HXLINE(  41)		this->query = ::StringTools_obj::trim(q);
+HXLINE(  43)		 ::EReg vcard_regex =  ::EReg_obj::__alloc( HX_CTX ,HX_("\nIMPP[^:]*:xmpp:(.+)\n",e5,d9,ac,c6),HX_("",00,00,00,00));
+HXLINE(  44)		 ::borogove::JID jid;
+HXDLIN(  44)		if (::StringTools_obj::startsWith(this->query,HX_("xmpp:",65,3c,77,60))) {
+HXLINE(  45)			::Array< ::String > parts = this->query.substr(5,null()).split(HX_("?",3f,00,00,00));
+HXLINE(  44)			jid = ::borogove::JID_obj::parse(::borogove::_Util::Util_Fields__obj::uriDecode(parts->__get(0)));
+            		}
+            		else {
+HXLINE(  47)			bool jid1;
+HXDLIN(  47)			if (::StringTools_obj::startsWith(this->query,HX_("BEGIN:VCARD",75,85,ee,6a))) {
+HXLINE(  47)				jid1 = vcard_regex->match(this->query);
+            			}
+            			else {
+HXLINE(  47)				jid1 = false;
+            			}
+HXDLIN(  47)			if (jid1) {
+HXLINE(  48)				::Array< ::String > parts1 = vcard_regex->matched(1).split(HX_("?",3f,00,00,00));
+HXLINE(  44)				jid = ::borogove::JID_obj::parse(::borogove::_Util::Util_Fields__obj::uriDecode(parts1->__get(0)));
+            			}
+            			else {
+HXLINE(  50)				if (::StringTools_obj::startsWith(this->query,HX_("https://",cf,b4,ae,3e))) {
+HXLINE(  51)					::Array< ::String > hashParts = this->query.split(HX_("#",23,00,00,00));
+HXLINE(  52)					if ((hashParts->length > 1)) {
+HXLINE(  44)						jid = ::borogove::JID_obj::parse(::borogove::_Util::Util_Fields__obj::uriDecode(hashParts->__get(1)));
+            					}
+            					else {
+HXLINE(  55)						::Array< ::String > pathParts = hashParts->__get(0).split(HX_("/",2f,00,00,00));
+HXLINE(  44)						jid = ::borogove::JID_obj::parse(::borogove::_Util::Util_Fields__obj::uriDecode(pathParts->__get((pathParts->length - 1))));
+            					}
+            				}
+            				else {
+HXLINE(  44)					jid = ::borogove::JID_obj::parse(this->query);
+            				}
+            			}
+            		}
+HXLINE(  61)		if (jid->isValid()) {
+HXLINE(  62)			::Array< ::Dynamic> _hx_tmp = this->results;
+HXDLIN(  62)			_hx_tmp->push(this->check(jid));
+            		}
+HXLINE(  65)		if (::StringTools_obj::startsWith(this->query,HX_("https://",cf,b4,ae,3e))) {
+            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::AvailableChatIterator,_gthis) HXARGC(1)
+            			::Dynamic _hx_run(::String xmppUri){
+            				HX_GC_STACKFRAME(&_hx_pos_d2dba419a7f92221_66_new)
+HXLINE(  67)				::Array< ::String > parts = xmppUri.substr(5,null()).split(HX_("?",3f,00,00,00));
+HXLINE(  68)				 ::borogove::JID jid = ::borogove::JID_obj::parse(::borogove::_Util::Util_Fields__obj::uriDecode(parts->__get(0)));
+HXLINE(  69)				if (jid->isValid()) {
+HXLINE(  69)					return _gthis->check(jid);
+            				}
+HXLINE(  71)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+            			}
+            			HX_END_LOCAL_FUNC1(return)
+
+HXLINE(  66)			::Array< ::Dynamic> _hx_tmp1 = this->results;
+HXDLIN(  66)			_hx_tmp1->push(::thenshim::_Promise::Promise_Impl__obj::then(::borogove::_Util::Util_Fields__obj::xmppLinkHeader(this->query), ::Dynamic(new _hx_Closure_0(_gthis)),null()));
+            		}
+HXLINE(  75)		::String lowerQ = this->query.toLowerCase();
+HXLINE(  76)		::Array< ::Dynamic> laterResults = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  77)		{
+HXLINE(  77)			int _g = 0;
+HXDLIN(  77)			::Array< ::Dynamic> _g1 = client->chats;
+HXDLIN(  77)			while((_g < _g1->length)){
+HXLINE(  77)				 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
+HXDLIN(  77)				_g = (_g + 1);
+HXLINE(  78)				::String chat1 = chat->chatId;
+HXDLIN(  78)				if ((chat1 != client->accountId())) {
+            					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2,::String,lowerQ) HXARGC(1)
+            					::Array< ::Dynamic> _hx_run(::Array< ::Dynamic> members){
+            						HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1,::String,lowerQ) HXARGC(1)
+            						bool _hx_run( ::borogove::AvailableChat chat){
+            							HX_GC_STACKFRAME(&_hx_pos_d2dba419a7f92221_91_new)
+HXLINE(  91)							if (::hx::IsNotNull( chat )) {
+HXLINE(  91)								if ((chat->chatId.indexOf(lowerQ,null()) == -1)) {
+HXLINE(  91)									::String tmp = chat->displayName;
+HXDLIN(  91)									::String s;
+HXDLIN(  91)									if (::hx::IsNotNull( tmp )) {
+HXLINE(  91)										s = tmp;
+            									}
+            									else {
+HXLINE(  91)										s = HX_("",00,00,00,00);
+            									}
+HXDLIN(  91)									::String s1 = s.toLowerCase();
+HXDLIN(  91)									return (s1.indexOf(lowerQ,null()) != -1);
+            								}
+            								else {
+HXLINE(  91)									return true;
+            								}
+            							}
+            							else {
+HXLINE(  91)								return false;
+            							}
+            						}
+            						HX_END_LOCAL_FUNC1(return)
+
+            						HX_GC_STACKFRAME(&_hx_pos_d2dba419a7f92221_90_new)
+HXLINE(  90)						::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(members->length);
+HXDLIN(  90)						{
+HXLINE(  90)							int _g = 0;
+HXDLIN(  90)							int _g1 = members->length;
+HXDLIN(  90)							while((_g < _g1)){
+HXLINE(  90)								_g = (_g + 1);
+HXDLIN(  90)								int i = (_g - 1);
+HXDLIN(  90)								{
+HXLINE(  90)									 ::borogove::AvailableChat inValue = ( ( ::borogove::Member)(_hx_array_unsafe_get(members,i)) )->chat;
+HXDLIN(  90)									result->__unsafe_set(i,inValue);
+            								}
+            							}
+            						}
+HXDLIN(  90)						 ::Dynamic f =  ::Dynamic(new _hx_Closure_1(lowerQ));
+HXDLIN(  90)						::Array< ::Dynamic> _g2 = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN(  90)						{
+HXLINE(  90)							int _g3 = 0;
+HXDLIN(  90)							while((_g3 < result->length)){
+HXLINE(  90)								 ::borogove::AvailableChat v = result->__get(_g3).StaticCast<  ::borogove::AvailableChat >();
+HXDLIN(  90)								_g3 = (_g3 + 1);
+HXDLIN(  90)								bool _hx_tmp;
+HXDLIN(  90)								if (::hx::IsNotNull( v )) {
+HXLINE(  90)									_hx_tmp = ( (bool)(f(v)) );
+            								}
+            								else {
+HXLINE(  90)									_hx_tmp = false;
+            								}
+HXDLIN(  90)								if (_hx_tmp) {
+HXLINE(  90)									_g2->push(v);
+            								}
+            							}
+            						}
+HXDLIN(  90)						return _g2;
+            					}
+            					HX_END_LOCAL_FUNC1(return)
+
+HXLINE(  79)					bool _hx_tmp2;
+HXDLIN(  79)					bool _hx_tmp3;
+HXDLIN(  79)					if ((chat->chatId.indexOf(lowerQ,null()) == -1)) {
+HXLINE(  79)						::String s = chat->getDisplayName().toLowerCase();
+HXDLIN(  79)						_hx_tmp3 = (s.indexOf(lowerQ,null()) != -1);
+            					}
+            					else {
+HXLINE(  79)						_hx_tmp3 = true;
+            					}
+HXDLIN(  79)					if (!(_hx_tmp3)) {
+HXLINE(  79)						::Array< ::String > it = chat->getTags();
+HXDLIN(  79)						bool result = false;
+HXDLIN(  79)						{
+HXLINE(  79)							int _g2 = 0;
+HXDLIN(  79)							while((_g2 < it->length)){
+HXLINE(  79)								::String x = it->__get(_g2);
+HXDLIN(  79)								_g2 = (_g2 + 1);
+HXDLIN(  79)								::String _hx_tmp4 = x.toLowerCase();
+HXDLIN(  79)								if ((_hx_tmp4 == lowerQ)) {
+HXLINE(  84)									result = true;
+HXLINE(  79)									goto _hx_goto_1;
+            								}
+            							}
+            							_hx_goto_1:;
+            						}
+HXDLIN(  79)						_hx_tmp2 = result;
+            					}
+            					else {
+HXLINE(  79)						_hx_tmp2 = true;
+            					}
+HXDLIN(  79)					if (_hx_tmp2) {
+HXLINE(  80)						 ::Dynamic caps = chat->getCaps();
+HXLINE(  81)						::String chat2 = chat->chatId;
+HXDLIN(  81)						::String available = chat->getDisplayName();
+HXDLIN(  81)						::String chat3 = chat->chatId;
+HXDLIN(  81)						 ::borogove::Caps available1;
+HXDLIN(  81)						if (( (bool)(caps->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )) {
+HXLINE(  81)							available1 = ( ( ::borogove::Caps)(caps->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)) );
+            						}
+            						else {
+HXLINE(  81)							available1 = ::borogove::CapsRepo_obj::empty;
+            						}
+HXDLIN(  81)						::Dynamic available2 = ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(1)->init(0, ::borogove::AvailableChat_obj::__alloc( HX_CTX ,chat2,available,chat3,available1)));
+HXLINE(  82)						if (chat->isTrusted()) {
+HXLINE(  83)							this->results->push(available2);
+            						}
+            						else {
+HXLINE(  85)							laterResults->push(available2);
+            						}
+            					}
+HXLINE(  89)					laterResults->push(::thenshim::_Promise::Promise_Impl__obj::then(chat->members(), ::Dynamic(new _hx_Closure_2(lowerQ)),null()));
+            				}
+HXLINE(  95)				if (chat->isTrusted()) {
+HXLINE(  96)					 ::haxe::ds::StringMap resources =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(  97)					{
+HXLINE(  97)						 ::Dynamic _g3 = ::borogove::Caps_obj::withIdentity(chat->getCaps(),HX_("gateway",04,40,59,91),null());
+HXDLIN(  97)						while(( (bool)(_g3->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(  97)							 ::Dynamic _g4 = _g3->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
+HXDLIN(  97)							::String resource = ( (::String)(_g4->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic)) );
+HXDLIN(  97)							 ::borogove::Caps caps1 = ( ( ::borogove::Caps)(_g4->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)) );
+HXDLIN(  97)							{
+HXLINE(  99)								::Array< ::Dynamic> identities = caps1->identities;
+HXLINE( 101)								bool _hx_tmp5;
+HXDLIN( 101)								bool _hx_tmp6;
+HXDLIN( 101)								if ((chat->chatId.indexOf(HX_("@",40,00,00,00),null()) >= 0)) {
+            									HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_3) HXARGC(1)
+            									bool _hx_run( ::borogove::Identity i){
+            										HX_GC_STACKFRAME(&_hx_pos_d2dba419a7f92221_101_new)
+HXLINE( 101)										return (i->category == HX_("conference",1c,2b,83,41));
+            									}
+            									HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 101)									_hx_tmp6 = ::hx::IsNull( ::Lambda_obj::find(identities, ::Dynamic(new _hx_Closure_3())) );
+            								}
+            								else {
+HXLINE( 101)									_hx_tmp6 = true;
+            								}
+HXDLIN( 101)								if (_hx_tmp6) {
+            									HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_4) HXARGC(1)
+            									bool _hx_run( ::borogove::Identity i){
+            										HX_GC_STACKFRAME(&_hx_pos_d2dba419a7f92221_102_new)
+HXLINE( 102)										return (i->category == HX_("client",4b,ca,4f,0a));
+            									}
+            									HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 101)									_hx_tmp5 = ::hx::IsNull( ::Lambda_obj::find(identities, ::Dynamic(new _hx_Closure_4())) );
+            								}
+            								else {
+HXLINE( 101)									_hx_tmp5 = false;
+            								}
+HXLINE( 100)								if (_hx_tmp5) {
+HXLINE( 104)									::String _hx_tmp7;
+HXDLIN( 104)									if (::hx::IsNull( resource )) {
+HXLINE( 104)										_hx_tmp7 = ::borogove::_Chat::Chat_Fields__obj::nullSentinel;
+            									}
+            									else {
+HXLINE( 104)										_hx_tmp7 = resource;
+            									}
+HXDLIN( 104)									resources->set(_hx_tmp7,caps1);
+            								}
+            							}
+            						}
+            					}
+HXLINE( 111)					bool _hx_tmp8;
+HXDLIN( 111)					bool _hx_tmp9;
+HXDLIN( 111)					if (!(resources->exists(::borogove::_Chat::Chat_Fields__obj::nullSentinel))) {
+HXLINE( 111)						_hx_tmp9 = !(client->sendAvailable);
+            					}
+            					else {
+HXLINE( 111)						_hx_tmp9 = false;
+            					}
+HXDLIN( 111)					if (_hx_tmp9) {
+HXLINE( 111)						_hx_tmp8 = ::borogove::JID_obj::parse(chat->chatId)->isDomain();
+            					}
+            					else {
+HXLINE( 111)						_hx_tmp8 = false;
+            					}
+HXDLIN( 111)					if (_hx_tmp8) {
+HXLINE( 112)						resources->set(::borogove::_Chat::Chat_Fields__obj::nullSentinel,::borogove::CapsRepo_obj::empty);
+            					}
+HXLINE( 114)					{
+            						HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_5,::Array< ::Dynamic>,iter_keys) HXARGC(0)
+            						bool _hx_run(){
+            							HX_GC_STACKFRAME(&_hx_pos_d2dba419a7f92221_114_new)
+HXLINE( 114)							return ( (bool)(iter_keys->__get(0)->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) );
+            						}
+            						HX_END_LOCAL_FUNC0(return)
+
+            						HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_6,::Array< ::Dynamic>,iter_map,::Array< ::Dynamic>,iter_keys) HXARGC(0)
+            						 ::Dynamic _hx_run(){
+            							HX_GC_STACKFRAME(&_hx_pos_d2dba419a7f92221_114_new)
+HXLINE( 114)							::String key = ( (::String)(iter_keys->__get(0)->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN( 114)							 ::Dynamic v =  ::Dynamic(::hx::Anon_obj::Create(2)
+            								->setFixed(0,HX_("key",9f,89,51,00),key)
+            								->setFixed(1,HX_("value",71,7f,b8,31),( ( ::borogove::Caps)(::haxe::IMap_obj::get(iter_map->__get(0),key)) )));
+HXDLIN( 114)							if (::hx::IsEq( v->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic),::borogove::_Chat::Chat_Fields__obj::nullSentinel )) {
+HXLINE( 114)								return  ::Dynamic(::hx::Anon_obj::Create(2)
+            									->setFixed(0,HX_("key",9f,89,51,00),null())
+            									->setFixed(1,HX_("value",71,7f,b8,31), ::Dynamic(v->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic))));
+            							}
+            							else {
+HXLINE( 114)								return v;
+            							}
+            						}
+            						HX_END_LOCAL_FUNC0(return)
+
+HXLINE( 114)						::Array< ::Dynamic> iter_map = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 114)						::Array< ::Dynamic> iter_keys = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 114)						::Dynamic map = resources;
+HXDLIN( 114)						iter_map[0] = map;
+HXDLIN( 114)						iter_keys[0] = ::haxe::IMap_obj::keys(map);
+HXDLIN( 114)						 ::Dynamic _g_hasNext =  ::Dynamic(new _hx_Closure_5(iter_keys));
+HXDLIN( 114)						 ::Dynamic _g_next =  ::Dynamic(new _hx_Closure_6(iter_map,iter_keys));
+HXDLIN( 114)						while(( (bool)(_g_hasNext()) )){
+HXLINE( 114)							 ::Dynamic _g5 = _g_next();
+HXDLIN( 114)							::String resource1 = ( (::String)(_g5->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic)) );
+HXDLIN( 114)							 ::borogove::Caps caps2 = ( ( ::borogove::Caps)(_g5->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)) );
+HXDLIN( 114)							{
+            								HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_8, ::borogove::Caps,caps2, ::borogove::AvailableChatIterator,_gthis, ::borogove::Client,client, ::borogove::queries::JabberIqGatewayGet,jigGet1, ::borogove::JID,bareJid) HXARGC(2)
+            								void _hx_run( ::Dynamic resolve, ::Dynamic reject){
+            									HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_7, ::borogove::AvailableChatIterator,_gthis, ::borogove::Caps,caps2, ::borogove::queries::JabberIqGatewayGet,jigGet1, ::Dynamic,resolve, ::borogove::JID,bareJid) HXARGC(0)
+            									void _hx_run(){
+            										HX_GC_STACKFRAME(&_hx_pos_d2dba419a7f92221_119_new)
+HXLINE( 120)										 ::haxe::ds::Either result = jigGet1->getResult();
+HXLINE( 121)										if (::hx::IsNull( result )) {
+HXLINE( 122)											bool _hx_tmp;
+HXDLIN( 122)											if (bareJid->isDomain()) {
+HXLINE( 122)												_hx_tmp = caps2->features->contains(HX_("jid\\20escaping",73,c5,d2,4a));
+            											}
+            											else {
+HXLINE( 122)												_hx_tmp = false;
+            											}
+HXDLIN( 122)											if (_hx_tmp) {
+HXLINE( 123)												 ::borogove::AvailableChatIterator _gthis1 = _gthis;
+HXDLIN( 123)												::Dynamic _hx_tmp1 = _gthis1->check( ::borogove::JID_obj::__alloc( HX_CTX ,_gthis->query,bareJid->domain,null(),null()));
+HXDLIN( 123)												::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp1,resolve,null());
+            											}
+            											else {
+HXLINE( 124)												if (bareJid->isDomain()) {
+HXLINE( 125)													 ::borogove::AvailableChatIterator _gthis2 = _gthis;
+HXDLIN( 125)													::String _hx_tmp2 = ::StringTools_obj::replace(_gthis->query,HX_("@",40,00,00,00),HX_("%",25,00,00,00));
+HXDLIN( 125)													::Dynamic _hx_tmp3 = _gthis2->check( ::borogove::JID_obj::__alloc( HX_CTX ,_hx_tmp2,bareJid->domain,null(),null()));
+HXDLIN( 125)													::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp3,resolve,null());
+            												}
+            											}
+            										}
+            										else {
+HXLINE( 128)											switch((int)(result->_hx_getIndex())){
+            												case (int)0: {
+HXLINE( 129)													resolve(::Array_obj< ::Dynamic>::__new(0));
+            												}
+            												break;
+            												case (int)1: {
+HXLINE( 131)													 ::borogove::AvailableChatIterator _gthis3 = _gthis;
+HXDLIN( 131)													::Dynamic _hx_tmp4 = _gthis3->check(::borogove::JID_obj::parse(( (::String)(result->_hx_getObject(0)) )));
+HXDLIN( 131)													::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp4,resolve,null());
+            												}
+            												break;
+            											}
+            										}
+            									}
+            									HX_END_LOCAL_FUNC0((void))
+
+            									HX_GC_STACKFRAME(&_hx_pos_d2dba419a7f92221_118_new)
+HXLINE( 119)									jigGet1->onFinished( ::Dynamic(new _hx_Closure_7(_gthis,caps2,jigGet1,resolve,bareJid)));
+HXLINE( 135)									client->sendQuery(jigGet1);
+            								}
+            								HX_END_LOCAL_FUNC2((void))
+
+HXLINE( 115)								 ::borogove::JID bareJid = ::borogove::JID_obj::parse(chat->chatId);
+HXLINE( 116)								::String bareJid1 = bareJid->node;
+HXDLIN( 116)								::String bareJid2 = bareJid->domain;
+HXDLIN( 116)								::String fullJid;
+HXDLIN( 116)								bool fullJid1;
+HXDLIN( 116)								if (bareJid->isDomain()) {
+HXLINE( 116)									fullJid1 = (resource1 == HX_("",00,00,00,00));
+            								}
+            								else {
+HXLINE( 116)									fullJid1 = false;
+            								}
+HXDLIN( 116)								if (fullJid1) {
+HXLINE( 116)									fullJid = null();
+            								}
+            								else {
+HXLINE( 116)									fullJid = resource1;
+            								}
+HXLINE( 117)								::String jigGet =  ::borogove::JID_obj::__alloc( HX_CTX ,bareJid1,bareJid2,fullJid,null())->asString();
+HXDLIN( 117)								 ::borogove::queries::JabberIqGatewayGet jigGet1 =  ::borogove::queries::JabberIqGatewayGet_obj::__alloc( HX_CTX ,jigGet,this->query);
+HXLINE( 118)								::Array< ::Dynamic> _hx_tmp10 = this->results;
+HXDLIN( 118)								_hx_tmp10->push(::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_8(caps2,_gthis,client,jigGet1,bareJid))));
+            							}
+            						}
+            					}
+            				}
+            			}
+            		}
+HXLINE( 142)		{
+HXLINE( 142)			int _g6 = 0;
+HXDLIN( 142)			while((_g6 < laterResults->length)){
+HXLINE( 142)				::Dynamic later = laterResults->__get(_g6);
+HXDLIN( 142)				_g6 = (_g6 + 1);
+HXLINE( 143)				this->results->push(later);
+            			}
+            		}
+            	}
+
+Dynamic AvailableChatIterator_obj::__CreateEmpty() { return new AvailableChatIterator_obj; }
+
+void *AvailableChatIterator_obj::_hx_vtable = 0;
+
+Dynamic AvailableChatIterator_obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< AvailableChatIterator_obj > _hx_result = new AvailableChatIterator_obj();
+	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2]);
+	return _hx_result;
+}
+
+bool AvailableChatIterator_obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x1765281e;
+}
+
+::String AvailableChatIterator_obj::q__fromC(){
+            	HX_STACKFRAME(&_hx_pos_07fd1ca5fb749c25_478_q__fromC)
+HXDLIN( 478)		return this->q;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(AvailableChatIterator_obj,q__fromC,return )
+
+::Dynamic AvailableChatIterator_obj::check( ::borogove::JID jid){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::AvailableChatIterator,_gthis, ::borogove::JID,jid) HXARGC(2)
+            		void _hx_run( ::Dynamic resolve, ::Dynamic reject){
+            			HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_0, ::borogove::AvailableChatIterator,_gthis, ::Dynamic,resolve, ::borogove::queries::DiscoInfoGet,discoGet, ::borogove::JID,jid) HXARGC(0)
+            			void _hx_run(){
+            				HX_GC_STACKFRAME(&_hx_pos_d2dba419a7f92221_150_check)
+HXLINE( 151)				 ::borogove::Caps resultCaps = discoGet->getResult();
+HXLINE( 152)				if (::hx::IsNull( resultCaps )) {
+HXLINE( 153)					 ::borogove::Stanza tmp = discoGet->responseStanza;
+HXDLIN( 153)					 ::borogove::Stanza tmp1;
+HXDLIN( 153)					if (::hx::IsNotNull( tmp )) {
+HXLINE( 153)						tmp1 = tmp->getChild(HX_("error",c8,cb,29,73),null());
+            					}
+            					else {
+HXLINE( 153)						tmp1 = null();
+            					}
+HXDLIN( 153)					 ::borogove::Stanza err;
+HXDLIN( 153)					if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 153)						err = tmp1->getChild(null(),HX_("urn:ietf:params:xml:ns:xmpp-stanzas",27,f2,3d,30));
+            					}
+            					else {
+HXLINE( 153)						err = null();
+            					}
+HXLINE( 154)					bool _hx_tmp;
+HXDLIN( 154)					bool _hx_tmp1;
+HXDLIN( 154)					if (::hx::IsNotNull( err )) {
+HXLINE( 154)						::String _hx_tmp2;
+HXDLIN( 154)						if (::hx::IsNotNull( err )) {
+HXLINE( 154)							_hx_tmp2 = err->name;
+            						}
+            						else {
+HXLINE( 154)							_hx_tmp2 = null();
+            						}
+HXDLIN( 154)						_hx_tmp1 = (_hx_tmp2 == HX_("service-unavailable",f8,3c,11,1c));
+            					}
+            					else {
+HXLINE( 154)						_hx_tmp1 = true;
+            					}
+HXDLIN( 154)					if (!(_hx_tmp1)) {
+HXLINE( 154)						::String _hx_tmp3;
+HXDLIN( 154)						if (::hx::IsNotNull( err )) {
+HXLINE( 154)							_hx_tmp3 = err->name;
+            						}
+            						else {
+HXLINE( 154)							_hx_tmp3 = null();
+            						}
+HXDLIN( 154)						_hx_tmp = (_hx_tmp3 == HX_("feature-not-implemented",71,20,2e,96));
+            					}
+            					else {
+HXLINE( 154)						_hx_tmp = true;
+            					}
+HXDLIN( 154)					if (_hx_tmp) {
+HXLINE( 155)						 ::Dynamic resolve1 = resolve;
+HXDLIN( 155)						::String _hx_tmp4 = jid->asString();
+HXDLIN( 155)						::String _hx_tmp5;
+HXDLIN( 155)						if (::hx::IsNull( jid->node )) {
+HXLINE( 155)							_hx_tmp5 = _gthis->query;
+            						}
+            						else {
+HXLINE( 155)							_hx_tmp5 = jid->node;
+            						}
+HXDLIN( 155)						resolve1(::Array_obj< ::Dynamic>::__new(1)->init(0, ::borogove::AvailableChat_obj::__alloc( HX_CTX ,_hx_tmp4,_hx_tmp5,jid->asString(),::borogove::CapsRepo_obj::empty)));
+            					}
+            					else {
+HXLINE( 157)						resolve(::Array_obj< ::Dynamic>::__new(0));
+            					}
+            				}
+            				else {
+HXLINE( 160)					 ::borogove::Caps caps = _gthis->client->capsRepo->add(resultCaps,null());
+HXLINE( 161)					 ::borogove::Identity identity = resultCaps->identities->__get(0).StaticCast<  ::borogove::Identity >();
+HXLINE( 162)					::String displayName;
+HXDLIN( 162)					::String tmp2;
+HXDLIN( 162)					if (::hx::IsNotNull( identity )) {
+HXLINE( 162)						tmp2 = identity->name;
+            					}
+            					else {
+HXLINE( 162)						tmp2 = null();
+            					}
+HXDLIN( 162)					if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 162)						displayName = tmp2;
+            					}
+            					else {
+HXLINE( 162)						displayName = _gthis->query;
+            					}
+HXLINE( 163)					::String note = jid->asString();
+HXDLIN( 163)					::String note1;
+HXDLIN( 163)					if (::hx::IsNull( identity )) {
+HXLINE( 163)						note1 = HX_("",00,00,00,00);
+            					}
+            					else {
+HXLINE( 163)						note1 = ((HX_(" (",08,1c,00,00) + identity->type) + HX_(")",29,00,00,00));
+            					}
+HXLINE( 164)					 ::Dynamic resolve2 = resolve;
+HXDLIN( 164)					resolve2(::Array_obj< ::Dynamic>::__new(1)->init(0, ::borogove::AvailableChat_obj::__alloc( HX_CTX ,jid->asString(),displayName,(note + note1),caps)));
+            				}
+            			}
+            			HX_END_LOCAL_FUNC0((void))
+
+            			HX_GC_STACKFRAME(&_hx_pos_d2dba419a7f92221_148_check)
+HXLINE( 149)			 ::borogove::queries::DiscoInfoGet discoGet =  ::borogove::queries::DiscoInfoGet_obj::__alloc( HX_CTX ,jid->asString(),null());
+HXLINE( 150)			discoGet->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,resolve,discoGet,jid)));
+HXLINE( 167)			_gthis->client->sendQuery(discoGet);
+            		}
+            		HX_END_LOCAL_FUNC2((void))
+
+            	HX_STACKFRAME(&_hx_pos_d2dba419a7f92221_147_check)
+HXDLIN( 147)		 ::borogove::AvailableChatIterator _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 148)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(_gthis,jid)));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(AvailableChatIterator_obj,check,return )
+
+::Dynamic AvailableChatIterator_obj::next(){
+            	HX_STACKFRAME(&_hx_pos_d2dba419a7f92221_197_next)
+HXDLIN( 197)		return this->internalNext();
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(AvailableChatIterator_obj,next,return )
+
+void AvailableChatIterator_obj::next__fromC(::cpp::Function< void  (void*,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_07fd1ca5fb749c25_365_next__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->next();
+            		}
+            		else {
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::borogove::AvailableChat v){
+            				HX_STACKFRAME(&_hx_pos_07fd1ca5fb749c25_365_next__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            					}
+            					else {
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            					}
+            				}
+HXLINE( 365)				handler1(ptr,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::Dynamic e){
+            				HX_STACKFRAME(&_hx_pos_07fd1ca5fb749c25_365_next__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->next(), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+            		}
+            	}
+
+
+::Dynamic AvailableChatIterator_obj::internalNext(){
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::AvailableChatIterator,_gthis) HXARGC(1)
+            		::Dynamic _hx_run(::Array< ::Dynamic> availables){
+            			HX_STACKFRAME(&_hx_pos_d2dba419a7f92221_216_internalNext)
+HXLINE( 217)			_gthis->head = availables;
+HXLINE( 218)			return _gthis->internalNext();
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_d2dba419a7f92221_201_internalNext)
+HXDLIN( 201)		 ::borogove::AvailableChatIterator _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 202)		if ((this->head->length > 0)) {
+HXLINE( 203)			 ::borogove::AvailableChat available = this->head->shift().StaticCast<  ::borogove::AvailableChat >();
+HXLINE( 205)			if (::hx::IsNotNull( available )) {
+HXLINE( 206)				if (this->dedup->exists(available->chatId)) {
+HXLINE( 206)					return this->internalNext();
+            				}
+HXLINE( 208)				this->dedup->set(available->chatId,true);
+HXLINE( 209)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(available);
+            			}
+            		}
+HXLINE( 213)		::Dynamic promise = this->results->shift();
+HXLINE( 214)		if (::hx::IsNull( promise )) {
+HXLINE( 214)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            		}
+HXLINE( 216)		return ::thenshim::_Promise::Promise_Impl__obj::then(promise, ::Dynamic(new _hx_Closure_0(_gthis)),null());
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(AvailableChatIterator_obj,internalNext,return )
+
+
+::hx::ObjectPtr< AvailableChatIterator_obj > AvailableChatIterator_obj::__new(::String q, ::borogove::Client client,::Dynamic persistence) {
+	::hx::ObjectPtr< AvailableChatIterator_obj > __this = new AvailableChatIterator_obj();
+	__this->__construct(q,client,persistence);
+	return __this;
+}
+
+::hx::ObjectPtr< AvailableChatIterator_obj > AvailableChatIterator_obj::__alloc(::hx::Ctx *_hx_ctx,::String q, ::borogove::Client client,::Dynamic persistence) {
+	AvailableChatIterator_obj *__this = (AvailableChatIterator_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(AvailableChatIterator_obj), true, "borogove.AvailableChatIterator"));
+	*(void **)__this = AvailableChatIterator_obj::_hx_vtable;
+	__this->__construct(q,client,persistence);
+	return __this;
+}
+
+AvailableChatIterator_obj::AvailableChatIterator_obj()
+{
+}
+
+void AvailableChatIterator_obj::__Mark(HX_MARK_PARAMS)
+{
+	HX_MARK_BEGIN_CLASS(AvailableChatIterator);
+	HX_MARK_MEMBER_NAME(q,"q");
+	HX_MARK_MEMBER_NAME(query,"query");
+	HX_MARK_MEMBER_NAME(client,"client");
+	HX_MARK_MEMBER_NAME(persistence,"persistence");
+	HX_MARK_MEMBER_NAME(results,"results");
+	HX_MARK_MEMBER_NAME(head,"head");
+	HX_MARK_MEMBER_NAME(dedup,"dedup");
+	HX_MARK_END_CLASS();
+}
+
+void AvailableChatIterator_obj::__Visit(HX_VISIT_PARAMS)
+{
+	HX_VISIT_MEMBER_NAME(q,"q");
+	HX_VISIT_MEMBER_NAME(query,"query");
+	HX_VISIT_MEMBER_NAME(client,"client");
+	HX_VISIT_MEMBER_NAME(persistence,"persistence");
+	HX_VISIT_MEMBER_NAME(results,"results");
+	HX_VISIT_MEMBER_NAME(head,"head");
+	HX_VISIT_MEMBER_NAME(dedup,"dedup");
+}
+
+::hx::Val AvailableChatIterator_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 1:
+		if (HX_FIELD_EQ(inName,"q") ) { return ::hx::Val( q ); }
+		break;
+	case 4:
+		if (HX_FIELD_EQ(inName,"head") ) { return ::hx::Val( head ); }
+		if (HX_FIELD_EQ(inName,"next") ) { return ::hx::Val( next_dyn() ); }
+		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"query") ) { return ::hx::Val( query ); }
+		if (HX_FIELD_EQ(inName,"dedup") ) { return ::hx::Val( dedup ); }
+		if (HX_FIELD_EQ(inName,"check") ) { return ::hx::Val( check_dyn() ); }
+		break;
+	case 6:
+		if (HX_FIELD_EQ(inName,"client") ) { return ::hx::Val( client ); }
+		break;
+	case 7:
+		if (HX_FIELD_EQ(inName,"results") ) { return ::hx::Val( results ); }
+		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"q__fromC") ) { return ::hx::Val( q__fromC_dyn() ); }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"persistence") ) { return ::hx::Val( persistence ); }
+		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"internalNext") ) { return ::hx::Val( internalNext_dyn() ); }
+	}
+	return super::__Field(inName,inCallProp);
+}
+
+::hx::Val AvailableChatIterator_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 1:
+		if (HX_FIELD_EQ(inName,"q") ) { q=inValue.Cast< ::String >(); return inValue; }
+		break;
+	case 4:
+		if (HX_FIELD_EQ(inName,"head") ) { head=inValue.Cast< ::Array< ::Dynamic> >(); return inValue; }
+		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"query") ) { query=inValue.Cast< ::String >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"dedup") ) { dedup=inValue.Cast<  ::haxe::ds::StringMap >(); return inValue; }
+		break;
+	case 6:
+		if (HX_FIELD_EQ(inName,"client") ) { client=inValue.Cast<  ::borogove::Client >(); return inValue; }
+		break;
+	case 7:
+		if (HX_FIELD_EQ(inName,"results") ) { results=inValue.Cast< ::Array< ::Dynamic> >(); return inValue; }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"persistence") ) { persistence=inValue.Cast< ::Dynamic >(); return inValue; }
+	}
+	return super::__SetField(inName,inValue,inCallProp);
+}
+
+void AvailableChatIterator_obj::__GetFields(Array< ::String> &outFields)
+{
+	outFields->push(HX_("q",71,00,00,00));
+	outFields->push(HX_("query",08,8b,ea,5d));
+	outFields->push(HX_("client",4b,ca,4f,0a));
+	outFields->push(HX_("persistence",5f,17,c4,f6));
+	outFields->push(HX_("results",f6,58,57,6b));
+	outFields->push(HX_("head",20,29,0b,45));
+	outFields->push(HX_("dedup",de,d6,20,d7));
+	super::__GetFields(outFields);
+};
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo AvailableChatIterator_obj_sMemberStorageInfo[] = {
+	{::hx::fsString,(int)offsetof(AvailableChatIterator_obj,q),HX_("q",71,00,00,00)},
+	{::hx::fsString,(int)offsetof(AvailableChatIterator_obj,query),HX_("query",08,8b,ea,5d)},
+	{::hx::fsObject /*  ::borogove::Client */ ,(int)offsetof(AvailableChatIterator_obj,client),HX_("client",4b,ca,4f,0a)},
+	{::hx::fsObject /* ::Dynamic */ ,(int)offsetof(AvailableChatIterator_obj,persistence),HX_("persistence",5f,17,c4,f6)},
+	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(AvailableChatIterator_obj,results),HX_("results",f6,58,57,6b)},
+	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(AvailableChatIterator_obj,head),HX_("head",20,29,0b,45)},
+	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(AvailableChatIterator_obj,dedup),HX_("dedup",de,d6,20,d7)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+static ::hx::StaticInfo *AvailableChatIterator_obj_sStaticStorageInfo = 0;
+#endif
+
+static ::String AvailableChatIterator_obj_sMemberFields[] = {
+	HX_("q",71,00,00,00),
+	HX_("q__fromC",28,d0,30,b0),
+	HX_("query",08,8b,ea,5d),
+	HX_("client",4b,ca,4f,0a),
+	HX_("persistence",5f,17,c4,f6),
+	HX_("results",f6,58,57,6b),
+	HX_("head",20,29,0b,45),
+	HX_("dedup",de,d6,20,d7),
+	HX_("check",c8,98,b6,45),
+	HX_("next",f3,84,02,49),
+	HX_("internalNext",d0,fa,82,34),
+	::String(null()) };
+
+::hx::Class AvailableChatIterator_obj::__mClass;
+
+void AvailableChatIterator_obj::__register()
+{
+	AvailableChatIterator_obj _hx_dummy;
+	AvailableChatIterator_obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("borogove.AvailableChatIterator",22,a9,b8,4d);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &::hx::Class_obj::GetNoStaticField;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(0 /* sStaticFields */);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(AvailableChatIterator_obj_sMemberFields);
+	__mClass->mCanCast = ::hx::TCanCast< AvailableChatIterator_obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = AvailableChatIterator_obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = AvailableChatIterator_obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+void AvailableChatIterator_obj::__boot()
+{
+{
+            	HX_STACKFRAME(&_hx_pos_d2dba419a7f92221_24_boot)
+HXDLIN(  24)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(3)
+            				->setFixed(0,HX_("q__fromC",28,d0,30,b0), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(1,HX_("next",f3,84,02,49), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
+            				->setFixed(2,HX_("next__fromC",e6,bf,e4,79), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null()))))));
+            	}
+}
+
+} // end namespace borogove
diff --git a/Sources/c_borogove/src/borogove/Builder.cpp b/Sources/c_borogove/src/borogove/Builder.cpp
index 11ba02f..76a2f4b 100644
--- a/Sources/c_borogove/src/borogove/Builder.cpp
+++ b/Sources/c_borogove/src/borogove/Builder.cpp
@@ -26,15 +26,15 @@
 #include <borogove/UnicodeSet.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_38ecfe6debe5c00d_155_new,"borogove.Builder","new",0x4ea5eca0,"borogove.Builder.new","borogove/EmojiUtil.hx",155,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_38ecfe6debe5c00d_159_offer,"borogove.Builder","offer",0x497591dc,"borogove.Builder.offer","borogove/EmojiUtil.hx",159,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_38ecfe6debe5c00d_203_build,"borogove.Builder","build",0xd72c876e,"borogove.Builder.build","borogove/EmojiUtil.hx",203,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_38ecfe6debe5c00d_200_isMerger,"borogove.Builder","isMerger",0x7dd0d604,"borogove.Builder.isMerger","borogove/EmojiUtil.hx",200,0xaaf41424)
+HX_DEFINE_STACK_FRAME(_hx_pos_38ecfe6debe5c00d_163_new,"borogove.Builder","new",0x4ea5eca0,"borogove.Builder.new","borogove/EmojiUtil.hx",163,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_38ecfe6debe5c00d_167_offer,"borogove.Builder","offer",0x497591dc,"borogove.Builder.offer","borogove/EmojiUtil.hx",167,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_38ecfe6debe5c00d_211_build,"borogove.Builder","build",0xd72c876e,"borogove.Builder.build","borogove/EmojiUtil.hx",211,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_38ecfe6debe5c00d_208_isMerger,"borogove.Builder","isMerger",0x7dd0d604,"borogove.Builder.isMerger","borogove/EmojiUtil.hx",208,0xaaf41424)
 namespace borogove{
 
 void Builder_obj::__construct(){
-            	HX_STACKFRAME(&_hx_pos_38ecfe6debe5c00d_155_new)
-HXDLIN( 155)		this->codepoints = ::Array_obj< int >::__new(0);
+            	HX_STACKFRAME(&_hx_pos_38ecfe6debe5c00d_163_new)
+HXDLIN( 163)		this->codepoints = ::Array_obj< int >::__new(0);
             	}
 
 Dynamic Builder_obj::__CreateEmpty() { return new Builder_obj; }
@@ -53,97 +53,97 @@ bool Builder_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 bool Builder_obj::offer(int codepoint){
-            	HX_STACKFRAME(&_hx_pos_38ecfe6debe5c00d_159_offer)
-HXLINE( 160)		bool add = false;
-HXLINE( 161)		if ((this->codepoints->length == 0)) {
-HXLINE( 162)			if (::borogove::EmojiUtil_obj::SYMBOLIZE->contains(codepoint)) {
-HXLINE( 163)				add = true;
+            	HX_STACKFRAME(&_hx_pos_38ecfe6debe5c00d_167_offer)
+HXLINE( 168)		bool add = false;
+HXLINE( 169)		if ((this->codepoints->length == 0)) {
+HXLINE( 170)			if (::borogove::EmojiUtil_obj::SYMBOLIZE->contains(codepoint)) {
+HXLINE( 171)				add = true;
             			}
             			else {
-HXLINE( 164)				if (::borogove::EmojiUtil_obj::REGIONAL_INDICATORS->contains(codepoint)) {
-HXLINE( 165)					add = true;
+HXLINE( 172)				if (::borogove::EmojiUtil_obj::REGIONAL_INDICATORS->contains(codepoint)) {
+HXLINE( 173)					add = true;
             				}
             				else {
-HXLINE( 166)					bool _hx_tmp;
-HXDLIN( 166)					bool _hx_tmp1;
-HXDLIN( 166)					if (::borogove::EmojiUtil_obj::EMOJIS->contains(codepoint)) {
-HXLINE( 166)						_hx_tmp1 = !(::borogove::EmojiUtil_obj::FITZPATRICK->contains(codepoint));
+HXLINE( 174)					bool _hx_tmp;
+HXDLIN( 174)					bool _hx_tmp1;
+HXDLIN( 174)					if (::borogove::EmojiUtil_obj::EMOJIS->contains(codepoint)) {
+HXLINE( 174)						_hx_tmp1 = !(::borogove::EmojiUtil_obj::FITZPATRICK->contains(codepoint));
             					}
             					else {
-HXLINE( 166)						_hx_tmp1 = false;
+HXLINE( 174)						_hx_tmp1 = false;
             					}
-HXDLIN( 166)					if (_hx_tmp1) {
-HXLINE( 166)						_hx_tmp = (codepoint != ::borogove::EmojiUtil_obj::ZWJ);
+HXDLIN( 174)					if (_hx_tmp1) {
+HXLINE( 174)						_hx_tmp = (codepoint != ::borogove::EmojiUtil_obj::ZWJ);
             					}
             					else {
-HXLINE( 166)						_hx_tmp = false;
+HXLINE( 174)						_hx_tmp = false;
             					}
-HXDLIN( 166)					if (_hx_tmp) {
-HXLINE( 167)						add = true;
+HXDLIN( 174)					if (_hx_tmp) {
+HXLINE( 175)						add = true;
             					}
             				}
             			}
             		}
             		else {
-HXLINE( 170)			int previous = this->codepoints->__get((this->codepoints->length - 1));
-HXLINE( 171)			if ((this->codepoints->__get(0) == ::borogove::EmojiUtil_obj::BLACK_FLAG)) {
-HXLINE( 172)				add = ::borogove::EmojiUtil_obj::TAGS->contains(codepoint);
+HXLINE( 178)			int previous = this->codepoints->__get((this->codepoints->length - 1));
+HXLINE( 179)			if ((this->codepoints->__get(0) == ::borogove::EmojiUtil_obj::BLACK_FLAG)) {
+HXLINE( 180)				add = ::borogove::EmojiUtil_obj::TAGS->contains(codepoint);
             			}
             			else {
-HXLINE( 173)				if ((::borogove::EmojiUtil_obj::COMBINING_ENCLOSING_KEYCAP == codepoint)) {
-HXLINE( 174)					if (!(::borogove::EmojiUtil_obj::KEYCAP_COMBINEABLE->contains(previous))) {
-HXLINE( 174)						add = (previous == ::borogove::EmojiUtil_obj::VARIATION_16);
+HXLINE( 181)				if ((::borogove::EmojiUtil_obj::COMBINING_ENCLOSING_KEYCAP == codepoint)) {
+HXLINE( 182)					if (!(::borogove::EmojiUtil_obj::KEYCAP_COMBINEABLE->contains(previous))) {
+HXLINE( 182)						add = (previous == ::borogove::EmojiUtil_obj::VARIATION_16);
             					}
             					else {
-HXLINE( 174)						add = true;
+HXLINE( 182)						add = true;
             					}
             				}
             				else {
-HXLINE( 175)					if (::borogove::EmojiUtil_obj::SYMBOLIZE->contains(previous)) {
-HXLINE( 176)						add = (codepoint == ::borogove::EmojiUtil_obj::VARIATION_16);
+HXLINE( 183)					if (::borogove::EmojiUtil_obj::SYMBOLIZE->contains(previous)) {
+HXLINE( 184)						add = (codepoint == ::borogove::EmojiUtil_obj::VARIATION_16);
             					}
             					else {
-HXLINE( 177)						bool _hx_tmp2;
-HXDLIN( 177)						if (::borogove::EmojiUtil_obj::REGIONAL_INDICATORS->contains(previous)) {
-HXLINE( 177)							_hx_tmp2 = ::borogove::EmojiUtil_obj::REGIONAL_INDICATORS->contains(codepoint);
+HXLINE( 185)						bool _hx_tmp2;
+HXDLIN( 185)						if (::borogove::EmojiUtil_obj::REGIONAL_INDICATORS->contains(previous)) {
+HXLINE( 185)							_hx_tmp2 = ::borogove::EmojiUtil_obj::REGIONAL_INDICATORS->contains(codepoint);
             						}
             						else {
-HXLINE( 177)							_hx_tmp2 = false;
+HXLINE( 185)							_hx_tmp2 = false;
             						}
-HXDLIN( 177)						if (_hx_tmp2) {
-HXLINE( 178)							add = (this->codepoints->length == 1);
+HXDLIN( 185)						if (_hx_tmp2) {
+HXLINE( 186)							add = (this->codepoints->length == 1);
             						}
             						else {
-HXLINE( 179)							if ((previous == ::borogove::EmojiUtil_obj::VARIATION_16)) {
-HXLINE( 180)								if (!(::borogove::Builder_obj::isMerger(codepoint))) {
-HXLINE( 180)									add = (codepoint == ::borogove::EmojiUtil_obj::VARIATION_16);
+HXLINE( 187)							if ((previous == ::borogove::EmojiUtil_obj::VARIATION_16)) {
+HXLINE( 188)								if (!(::borogove::Builder_obj::isMerger(codepoint))) {
+HXLINE( 188)									add = (codepoint == ::borogove::EmojiUtil_obj::VARIATION_16);
             								}
             								else {
-HXLINE( 180)									add = true;
+HXLINE( 188)									add = true;
             								}
             							}
             							else {
-HXLINE( 181)								if (::borogove::EmojiUtil_obj::FITZPATRICK->contains(previous)) {
-HXLINE( 182)									add = (codepoint == ::borogove::EmojiUtil_obj::ZWJ);
+HXLINE( 189)								if (::borogove::EmojiUtil_obj::FITZPATRICK->contains(previous)) {
+HXLINE( 190)									add = (codepoint == ::borogove::EmojiUtil_obj::ZWJ);
             								}
             								else {
-HXLINE( 183)									if ((::borogove::EmojiUtil_obj::ZWJ == previous)) {
-HXLINE( 184)										add = ::borogove::EmojiUtil_obj::EMOJIS->contains(codepoint);
+HXLINE( 191)									if ((::borogove::EmojiUtil_obj::ZWJ == previous)) {
+HXLINE( 192)										add = ::borogove::EmojiUtil_obj::EMOJIS->contains(codepoint);
             									}
             									else {
-HXLINE( 185)										if (::borogove::Builder_obj::isMerger(codepoint)) {
-HXLINE( 186)											add = true;
+HXLINE( 193)										if (::borogove::Builder_obj::isMerger(codepoint)) {
+HXLINE( 194)											add = true;
             										}
             										else {
-HXLINE( 187)											bool _hx_tmp3;
-HXDLIN( 187)											if ((codepoint == ::borogove::EmojiUtil_obj::VARIATION_16)) {
-HXLINE( 187)												_hx_tmp3 = ::borogove::EmojiUtil_obj::EMOJIS->contains(previous);
+HXLINE( 195)											bool _hx_tmp3;
+HXDLIN( 195)											if ((codepoint == ::borogove::EmojiUtil_obj::VARIATION_16)) {
+HXLINE( 195)												_hx_tmp3 = ::borogove::EmojiUtil_obj::EMOJIS->contains(previous);
             											}
             											else {
-HXLINE( 187)												_hx_tmp3 = false;
+HXLINE( 195)												_hx_tmp3 = false;
             											}
-HXDLIN( 187)											if (_hx_tmp3) {
-HXLINE( 188)												add = true;
+HXDLIN( 195)											if (_hx_tmp3) {
+HXLINE( 196)												add = true;
             											}
             										}
             									}
@@ -154,71 +154,71 @@ HXLINE( 188)												add = true;
             				}
             			}
             		}
-HXLINE( 191)		if (add) {
-HXLINE( 192)			this->codepoints->push(codepoint);
-HXLINE( 193)			return true;
+HXLINE( 199)		if (add) {
+HXLINE( 200)			this->codepoints->push(codepoint);
+HXLINE( 201)			return true;
             		}
             		else {
-HXLINE( 195)			return false;
+HXLINE( 203)			return false;
             		}
-HXLINE( 191)		return false;
+HXLINE( 199)		return false;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Builder_obj,offer,return )
 
  ::borogove::Symbol Builder_obj::build(){
-            	HX_GC_STACKFRAME(&_hx_pos_38ecfe6debe5c00d_203_build)
-HXLINE( 204)		bool _hx_tmp;
-HXDLIN( 204)		if ((this->codepoints->length > 0)) {
-HXLINE( 204)			_hx_tmp = ::borogove::EmojiUtil_obj::SYMBOLIZE->contains(this->codepoints->__get((this->codepoints->length - 1)));
+            	HX_GC_STACKFRAME(&_hx_pos_38ecfe6debe5c00d_211_build)
+HXLINE( 212)		bool _hx_tmp;
+HXDLIN( 212)		if ((this->codepoints->length > 0)) {
+HXLINE( 212)			_hx_tmp = ::borogove::EmojiUtil_obj::SYMBOLIZE->contains(this->codepoints->__get((this->codepoints->length - 1)));
             		}
             		else {
-HXLINE( 204)			_hx_tmp = false;
+HXLINE( 212)			_hx_tmp = false;
             		}
-HXDLIN( 204)		if (_hx_tmp) {
-HXLINE( 205)			return  ::borogove::Other_obj::__alloc( HX_CTX ,this->codepoints);
+HXDLIN( 212)		if (_hx_tmp) {
+HXLINE( 213)			return  ::borogove::Other_obj::__alloc( HX_CTX ,this->codepoints);
             		}
             		else {
-HXLINE( 206)			bool _hx_tmp1;
-HXDLIN( 206)			bool _hx_tmp2;
-HXDLIN( 206)			if ((this->codepoints->length > 1)) {
-HXLINE( 206)				_hx_tmp2 = ::borogove::EmojiUtil_obj::KEYCAP_COMBINEABLE->contains(this->codepoints->__get(0));
+HXLINE( 214)			bool _hx_tmp1;
+HXDLIN( 214)			bool _hx_tmp2;
+HXDLIN( 214)			if ((this->codepoints->length > 1)) {
+HXLINE( 214)				_hx_tmp2 = ::borogove::EmojiUtil_obj::KEYCAP_COMBINEABLE->contains(this->codepoints->__get(0));
             			}
             			else {
-HXLINE( 206)				_hx_tmp2 = false;
+HXLINE( 214)				_hx_tmp2 = false;
             			}
-HXDLIN( 206)			if (_hx_tmp2) {
-HXLINE( 206)				_hx_tmp1 = (this->codepoints->__get((this->codepoints->length - 1)) != ::borogove::EmojiUtil_obj::COMBINING_ENCLOSING_KEYCAP);
+HXDLIN( 214)			if (_hx_tmp2) {
+HXLINE( 214)				_hx_tmp1 = (this->codepoints->__get((this->codepoints->length - 1)) != ::borogove::EmojiUtil_obj::COMBINING_ENCLOSING_KEYCAP);
             			}
             			else {
-HXLINE( 206)				_hx_tmp1 = false;
+HXLINE( 214)				_hx_tmp1 = false;
             			}
-HXDLIN( 206)			if (_hx_tmp1) {
-HXLINE( 207)				return  ::borogove::Other_obj::__alloc( HX_CTX ,this->codepoints);
+HXDLIN( 214)			if (_hx_tmp1) {
+HXLINE( 215)				return  ::borogove::Other_obj::__alloc( HX_CTX ,this->codepoints);
             			}
             		}
-HXLINE( 209)		if ((this->codepoints->length == 0)) {
-HXLINE( 209)			return  ::borogove::Other_obj::__alloc( HX_CTX ,this->codepoints);
+HXLINE( 217)		if ((this->codepoints->length == 0)) {
+HXLINE( 217)			return  ::borogove::Other_obj::__alloc( HX_CTX ,this->codepoints);
             		}
             		else {
-HXLINE( 209)			return  ::borogove::Emoji_obj::__alloc( HX_CTX ,this->codepoints);
+HXLINE( 217)			return  ::borogove::Emoji_obj::__alloc( HX_CTX ,this->codepoints);
             		}
-HXDLIN( 209)		return null();
+HXDLIN( 217)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Builder_obj,build,return )
 
 bool Builder_obj::isMerger(int codepoint){
-            	HX_STACKFRAME(&_hx_pos_38ecfe6debe5c00d_200_isMerger)
-HXDLIN( 200)		if ((codepoint != ::borogove::EmojiUtil_obj::ZWJ)) {
-HXDLIN( 200)			return ::borogove::EmojiUtil_obj::FITZPATRICK->contains(codepoint);
+            	HX_STACKFRAME(&_hx_pos_38ecfe6debe5c00d_208_isMerger)
+HXDLIN( 208)		if ((codepoint != ::borogove::EmojiUtil_obj::ZWJ)) {
+HXDLIN( 208)			return ::borogove::EmojiUtil_obj::FITZPATRICK->contains(codepoint);
             		}
             		else {
-HXDLIN( 200)			return true;
+HXDLIN( 208)			return true;
             		}
-HXDLIN( 200)		return false;
+HXDLIN( 208)		return false;
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/Caps.cpp b/Sources/c_borogove/src/borogove/Caps.cpp
index 51f5c8e..c42940a 100644
--- a/Sources/c_borogove/src/borogove/Caps.cpp
+++ b/Sources/c_borogove/src/borogove/Caps.cpp
@@ -38,40 +38,44 @@
 #include <haxe/io/Output.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_16_new,"borogove.Caps","new",0xd5c5c0a0,"borogove.Caps.new","borogove/Caps.hx",16,0xed3da4ef)
-HX_DEFINE_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_56_new,"borogove.Caps","new",0xd5c5c0a0,"borogove.Caps.new","borogove/Caps.hx",56,0xed3da4ef)
-HX_DEFINE_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_57_new,"borogove.Caps","new",0xd5c5c0a0,"borogove.Caps.new","borogove/Caps.hx",57,0xed3da4ef)
-HX_DEFINE_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_58_new,"borogove.Caps","new",0xd5c5c0a0,"borogove.Caps.new","borogove/Caps.hx",58,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_70_isChannel,"borogove.Caps","isChannel",0x55b41e39,"borogove.Caps.isChannel","borogove/Caps.hx",70,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_72_isChannel,"borogove.Caps","isChannel",0x55b41e39,"borogove.Caps.isChannel","borogove/Caps.hx",72,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_75_discoReply,"borogove.Caps","discoReply",0x066a3310,"borogove.Caps.discoReply","borogove/Caps.hx",75,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_87_addC,"borogove.Caps","addC",0x2eaa32c2,"borogove.Caps.addC","borogove/Caps.hx",87,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_104_hashInput,"borogove.Caps","hashInput",0x77a0999c,"borogove.Caps.hashInput","borogove/Caps.hx",104,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_117_hashInput,"borogove.Caps","hashInput",0x77a0999c,"borogove.Caps.hashInput","borogove/Caps.hx",117,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_135_computeVer,"borogove.Caps","computeVer",0xf6e0aeec,"borogove.Caps.computeVer","borogove/Caps.hx",135,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_146_computeVer,"borogove.Caps","computeVer",0xf6e0aeec,"borogove.Caps.computeVer","borogove/Caps.hx",146,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_161_verRaw,"borogove.Caps","verRaw",0xd5dfc305,"borogove.Caps.verRaw","borogove/Caps.hx",161,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_167_ver,"borogove.Caps","ver",0xd5cbd2a3,"borogove.Caps.ver","borogove/Caps.hx",167,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_24_withIdentity,"borogove.Caps","withIdentity",0x2955f524,"borogove.Caps.withIdentity","borogove/Caps.hx",24,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_39_withFeature,"borogove.Caps","withFeature",0xbcdb4190,"borogove.Caps.withFeature","borogove/Caps.hx",39,0xed3da4ef)
+HX_DEFINE_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_17_new,"borogove.Caps","new",0xd5c5c0a0,"borogove.Caps.new","borogove/Caps.hx",17,0xed3da4ef)
+HX_DEFINE_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_74_new,"borogove.Caps","new",0xd5c5c0a0,"borogove.Caps.new","borogove/Caps.hx",74,0xed3da4ef)
+HX_DEFINE_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_75_new,"borogove.Caps","new",0xd5c5c0a0,"borogove.Caps.new","borogove/Caps.hx",75,0xed3da4ef)
+HX_DEFINE_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_76_new,"borogove.Caps","new",0xd5c5c0a0,"borogove.Caps.new","borogove/Caps.hx",76,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_94_isChannel,"borogove.Caps","isChannel",0x55b41e39,"borogove.Caps.isChannel","borogove/Caps.hx",94,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_96_isChannel,"borogove.Caps","isChannel",0x55b41e39,"borogove.Caps.isChannel","borogove/Caps.hx",96,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_102_discoReply,"borogove.Caps","discoReply",0x066a3310,"borogove.Caps.discoReply","borogove/Caps.hx",102,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_120_addC,"borogove.Caps","addC",0x2eaa32c2,"borogove.Caps.addC","borogove/Caps.hx",120,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_139_hashInput,"borogove.Caps","hashInput",0x77a0999c,"borogove.Caps.hashInput","borogove/Caps.hx",139,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_152_hashInput,"borogove.Caps","hashInput",0x77a0999c,"borogove.Caps.hashInput","borogove/Caps.hx",152,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_170_computeVer,"borogove.Caps","computeVer",0xf6e0aeec,"borogove.Caps.computeVer","borogove/Caps.hx",170,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_183_computeVer,"borogove.Caps","computeVer",0xf6e0aeec,"borogove.Caps.computeVer","borogove/Caps.hx",183,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_201_verRaw,"borogove.Caps","verRaw",0xd5dfc305,"borogove.Caps.verRaw","borogove/Caps.hx",201,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_214_ver,"borogove.Caps","ver",0xd5cbd2a3,"borogove.Caps.ver","borogove/Caps.hx",214,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_27_filter,"borogove.Caps","filter",0xb9e6d778,"borogove.Caps.filter","borogove/Caps.hx",27,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_41_filter,"borogove.Caps","filter",0xb9e6d778,"borogove.Caps.filter","borogove/Caps.hx",41,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_42_filter,"borogove.Caps","filter",0xb9e6d778,"borogove.Caps.filter","borogove/Caps.hx",42,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_24_filter,"borogove.Caps","filter",0xb9e6d778,"borogove.Caps.filter","borogove/Caps.hx",24,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_54_withIdentity,"borogove.Caps","withIdentity",0x2955f524,"borogove.Caps.withIdentity","borogove/Caps.hx",54,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_4d51f4c65f9a1a9f_59_withFeature,"borogove.Caps","withFeature",0xbcdb4190,"borogove.Caps.withFeature","borogove/Caps.hx",59,0xed3da4ef)
 namespace borogove{
 
 void Caps_obj::__construct(::String node,::Array< ::Dynamic> identities,::Array< ::String > features,::Array< ::Dynamic> data,::Array< unsigned char > ver){
-            	HX_GC_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_16_new)
-HXLINE(  21)		this->_ver = null();
-HXLINE(  54)		if (::hx::IsNull( ver )) {
+            	HX_GC_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_17_new)
+HXLINE(  22)		this->_ver = null();
+HXLINE(  72)		if (::hx::IsNull( ver )) {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(2)
             			int _hx_run(::String x,::String y){
-            				HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_56_new)
-HXLINE(  56)				if ((x == y)) {
-HXLINE(  56)					return 0;
+            				HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_74_new)
+HXLINE(  74)				if ((x == y)) {
+HXLINE(  74)					return 0;
             				}
             				else {
-HXLINE(  56)					if ((x < y)) {
-HXLINE(  56)						return -1;
+HXLINE(  74)					if ((x < y)) {
+HXLINE(  74)						return -1;
             					}
             					else {
-HXLINE(  56)						return 1;
+HXLINE(  74)						return 1;
             					}
             				}
             			}
@@ -79,18 +83,18 @@ HXLINE(  56)						return 1;
 
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(2)
             			int _hx_run( ::borogove::Identity x, ::borogove::Identity y){
-            				HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_57_new)
-HXLINE(  57)				::String _hx_tmp = x->ver();
-HXDLIN(  57)				if ((_hx_tmp == y->ver())) {
-HXLINE(  57)					return 0;
+            				HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_75_new)
+HXLINE(  75)				::String _hx_tmp = x->ver();
+HXDLIN(  75)				if ((_hx_tmp == y->ver())) {
+HXLINE(  75)					return 0;
             				}
             				else {
-HXLINE(  57)					::String _hx_tmp1 = x->ver();
-HXDLIN(  57)					if ((_hx_tmp1 < y->ver())) {
-HXLINE(  57)						return -1;
+HXLINE(  75)					::String _hx_tmp1 = x->ver();
+HXDLIN(  75)					if ((_hx_tmp1 < y->ver())) {
+HXLINE(  75)						return -1;
             					}
             					else {
-HXLINE(  57)						return 1;
+HXLINE(  75)						return 1;
             					}
             				}
             			}
@@ -98,52 +102,52 @@ HXLINE(  57)						return 1;
 
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(2)
             			int _hx_run( ::borogove::Stanza x, ::borogove::Stanza y){
-            				HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_58_new)
-HXLINE(  58)				 ::borogove::Stanza tmp = ::borogove::_DataForm::DataForm_Impl__obj::field(x,HX_("FORM_TYPE",d5,96,c9,5a));
-HXDLIN(  58)				::Array< ::String > tmp1;
-HXDLIN(  58)				if (::hx::IsNotNull( tmp )) {
-HXLINE(  58)					tmp1 = ::borogove::_DataForm::Field_Impl__obj::get_value(tmp);
+            				HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_76_new)
+HXLINE(  76)				 ::borogove::Stanza tmp = ::borogove::_DataForm::DataForm_Impl__obj::field(x,HX_("FORM_TYPE",d5,96,c9,5a));
+HXDLIN(  76)				::Array< ::String > tmp1;
+HXDLIN(  76)				if (::hx::IsNotNull( tmp )) {
+HXLINE(  76)					tmp1 = ::borogove::_DataForm::Field_Impl__obj::get_value(tmp);
             				}
             				else {
-HXLINE(  58)					tmp1 = null();
+HXLINE(  76)					tmp1 = null();
             				}
-HXDLIN(  58)				::Array< ::String > _hx_tmp;
-HXDLIN(  58)				if (::hx::IsNotNull( tmp1 )) {
-HXLINE(  58)					_hx_tmp = tmp1;
+HXDLIN(  76)				::Array< ::String > _hx_tmp;
+HXDLIN(  76)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE(  76)					_hx_tmp = tmp1;
             				}
             				else {
-HXLINE(  58)					_hx_tmp = ::Array_obj< ::String >::__new(0);
+HXLINE(  76)					_hx_tmp = ::Array_obj< ::String >::__new(0);
             				}
-HXDLIN(  58)				::String _hx_tmp1 = _hx_tmp->join(HX_("\n",0a,00,00,00));
-HXDLIN(  58)				 ::borogove::Stanza tmp2 = ::borogove::_DataForm::DataForm_Impl__obj::field(y,HX_("FORM_TYPE",d5,96,c9,5a));
-HXDLIN(  58)				::Array< ::String > tmp3;
-HXDLIN(  58)				if (::hx::IsNotNull( tmp2 )) {
-HXLINE(  58)					tmp3 = ::borogove::_DataForm::Field_Impl__obj::get_value(tmp2);
+HXDLIN(  76)				::String _hx_tmp1 = _hx_tmp->join(HX_("\n",0a,00,00,00));
+HXDLIN(  76)				 ::borogove::Stanza tmp2 = ::borogove::_DataForm::DataForm_Impl__obj::field(y,HX_("FORM_TYPE",d5,96,c9,5a));
+HXDLIN(  76)				::Array< ::String > tmp3;
+HXDLIN(  76)				if (::hx::IsNotNull( tmp2 )) {
+HXLINE(  76)					tmp3 = ::borogove::_DataForm::Field_Impl__obj::get_value(tmp2);
             				}
             				else {
-HXLINE(  58)					tmp3 = null();
+HXLINE(  76)					tmp3 = null();
             				}
-HXDLIN(  58)				::Array< ::String > _hx_tmp2;
-HXDLIN(  58)				if (::hx::IsNotNull( tmp3 )) {
-HXLINE(  58)					_hx_tmp2 = tmp3;
+HXDLIN(  76)				::Array< ::String > _hx_tmp2;
+HXDLIN(  76)				if (::hx::IsNotNull( tmp3 )) {
+HXLINE(  76)					_hx_tmp2 = tmp3;
             				}
             				else {
-HXLINE(  58)					_hx_tmp2 = ::Array_obj< ::String >::__new(0);
+HXLINE(  76)					_hx_tmp2 = ::Array_obj< ::String >::__new(0);
             				}
-HXDLIN(  58)				return ::Reflect_obj::compare(_hx_tmp1,_hx_tmp2->join(HX_("\n",0a,00,00,00)));
+HXDLIN(  76)				return ::Reflect_obj::compare(_hx_tmp1,_hx_tmp2->join(HX_("\n",0a,00,00,00)));
             			}
             			HX_END_LOCAL_FUNC2(return)
 
-HXLINE(  56)			features->sort( ::Dynamic(new _hx_Closure_0()));
-HXLINE(  57)			identities->sort( ::Dynamic(new _hx_Closure_1()));
-HXLINE(  58)			data->sort( ::Dynamic(new _hx_Closure_2()));
+HXLINE(  74)			features->sort( ::Dynamic(new _hx_Closure_0()));
+HXLINE(  75)			identities->sort( ::Dynamic(new _hx_Closure_1()));
+HXLINE(  76)			data->sort( ::Dynamic(new _hx_Closure_2()));
             		}
-HXLINE(  61)		this->node = node;
-HXLINE(  62)		this->identities = identities;
-HXLINE(  63)		this->features = features;
-HXLINE(  64)		this->data = data;
-HXLINE(  65)		if (::hx::IsNotNull( ver )) {
-HXLINE(  66)			this->_ver =  ::borogove::Hash_obj::__alloc( HX_CTX ,HX_("sha-1",90,a8,1c,7c),ver);
+HXLINE(  79)		this->node = node;
+HXLINE(  80)		this->identities = identities;
+HXLINE(  81)		this->features = features;
+HXLINE(  82)		this->data = data;
+HXLINE(  83)		if (::hx::IsNotNull( ver )) {
+HXLINE(  84)			this->_ver =  ::borogove::Hash_obj::__alloc( HX_CTX ,HX_("sha-1",90,a8,1c,7c),ver);
             		}
             	}
 
@@ -163,267 +167,292 @@ bool Caps_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 bool Caps_obj::isChannel(::String chatId){
-            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_70_isChannel)
-HXLINE(  71)		if ((chatId.indexOf(HX_("@",40,00,00,00),null()) < 0)) {
-HXLINE(  71)			return false;
+            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_94_isChannel)
+HXLINE(  95)		if ((chatId.indexOf(HX_("@",40,00,00,00),null()) < 0)) {
+HXLINE(  95)			return false;
             		}
-HXLINE(  72)		if (this->features->contains(HX_("http://jabber.org/protocol/muc",07,b2,7f,c6))) {
+HXLINE(  96)		if (this->features->contains(HX_("http://jabber.org/protocol/muc",07,b2,7f,c6))) {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             			bool _hx_run( ::borogove::Identity identity){
-            				HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_72_isChannel)
-HXLINE(  72)				return (identity->category == HX_("conference",1c,2b,83,41));
+            				HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_96_isChannel)
+HXLINE(  96)				return (identity->category == HX_("conference",1c,2b,83,41));
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-HXLINE(  72)			return ::hx::IsNotNull( ::Lambda_obj::find(this->identities, ::Dynamic(new _hx_Closure_0())) );
+HXLINE(  96)			return ::hx::IsNotNull( ::Lambda_obj::find(this->identities, ::Dynamic(new _hx_Closure_0())) );
             		}
             		else {
-HXLINE(  72)			return false;
+HXLINE(  96)			return false;
             		}
-HXDLIN(  72)		return false;
+HXDLIN(  96)		return false;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Caps_obj,isChannel,return )
 
  ::borogove::Stanza Caps_obj::discoReply(){
-            	HX_GC_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_75_discoReply)
-HXLINE(  76)		 ::borogove::Stanza query =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("query",08,8b,ea,5d), ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_GC_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_102_discoReply)
+HXLINE( 103)		 ::borogove::Stanza query =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("query",08,8b,ea,5d), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/disco#info",cb,2b,7f,0b))));
-HXLINE(  77)		{
-HXLINE(  77)			int _g = 0;
-HXDLIN(  77)			::Array< ::Dynamic> _g1 = this->identities;
-HXDLIN(  77)			while((_g < _g1->length)){
-HXLINE(  77)				 ::borogove::Identity identity = _g1->__get(_g).StaticCast<  ::borogove::Identity >();
-HXDLIN(  77)				_g = (_g + 1);
-HXLINE(  78)				identity->addToDisco(query);
+HXLINE( 104)		{
+HXLINE( 104)			int _g = 0;
+HXDLIN( 104)			::Array< ::Dynamic> _g1 = this->identities;
+HXDLIN( 104)			while((_g < _g1->length)){
+HXLINE( 104)				 ::borogove::Identity identity = _g1->__get(_g).StaticCast<  ::borogove::Identity >();
+HXDLIN( 104)				_g = (_g + 1);
+HXLINE( 105)				identity->addToDisco(query);
             			}
             		}
-HXLINE(  80)		{
-HXLINE(  80)			int _g2 = 0;
-HXDLIN(  80)			::Array< ::String > _g3 = this->features;
-HXDLIN(  80)			while((_g2 < _g3->length)){
-HXLINE(  80)				::String feature = _g3->__get(_g2);
-HXDLIN(  80)				_g2 = (_g2 + 1);
-HXLINE(  81)				query->tag(HX_("feature",b6,f2,7c,1a), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 107)		{
+HXLINE( 107)			int _g2 = 0;
+HXDLIN( 107)			::Array< ::String > _g3 = this->features;
+HXDLIN( 107)			while((_g2 < _g3->length)){
+HXLINE( 107)				::String feature = _g3->__get(_g2);
+HXDLIN( 107)				_g2 = (_g2 + 1);
+HXLINE( 108)				query->tag(HX_("feature",b6,f2,7c,1a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("var",e7,de,59,00),feature)))->up();
             			}
             		}
-HXLINE(  83)		query->addChildren(this->data);
-HXLINE(  84)		return query;
+HXLINE( 110)		query->addChildren(this->data);
+HXLINE( 111)		return query;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Caps_obj,discoReply,return )
 
  ::borogove::Stanza Caps_obj::addC( ::borogove::Stanza stanza){
-            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_87_addC)
-HXLINE(  91)		::String _hx_tmp = this->node;
-HXLINE(  88)		stanza->tag(HX_("c",63,00,00,00), ::Dynamic(::hx::Anon_obj::Create(4)
+            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_120_addC)
+HXLINE( 124)		::String _hx_tmp = this->node;
+HXLINE( 121)		stanza->tag(HX_("c",63,00,00,00), ::Dynamic(::hx::Anon_obj::Create(4)
             			->setFixed(0,HX_("ver",63,e2,59,00),this->ver())
             			->setFixed(1,HX_("hash",ce,2f,08,45),HX_("sha-1",90,a8,1c,7c))
             			->setFixed(2,HX_("node",02,0a,0a,49),_hx_tmp)
             			->setFixed(3,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/caps",95,d0,90,e2))))->up();
-HXLINE(  94)		 ::borogove::Stanza _hx_tmp1 = stanza->tag(HX_("c",63,00,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:caps",3d,5a,a1,f4))));
-HXLINE(  98)		::String _hx_tmp2 = ::borogove::Hash_obj::sha256(this->hashInput())->toBase64();
-HXLINE(  94)		_hx_tmp1->textTag(HX_("hash",ce,2f,08,45),_hx_tmp2, ::Dynamic(::hx::Anon_obj::Create(2)
-            			->setFixed(0,HX_("algo",d3,ff,6f,40),HX_("sha-256",32,dd,04,3b))
-            			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:hashes:2",90,ad,87,c7))))->up();
-HXLINE( 101)		return stanza;
+HXLINE( 127)		bool _hx_tmp1;
+HXDLIN( 127)		bool _hx_tmp2;
+HXDLIN( 127)		if ((this->identities->length <= 0)) {
+HXLINE( 127)			_hx_tmp2 = (this->features->length > 0);
+            		}
+            		else {
+HXLINE( 127)			_hx_tmp2 = true;
+            		}
+HXDLIN( 127)		if (!(_hx_tmp2)) {
+HXLINE( 127)			_hx_tmp1 = (this->data->length > 0);
+            		}
+            		else {
+HXLINE( 127)			_hx_tmp1 = true;
+            		}
+HXDLIN( 127)		if (_hx_tmp1) {
+HXLINE( 128)			 ::borogove::Stanza _hx_tmp3 = stanza->tag(HX_("c",63,00,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:caps",3d,5a,a1,f4))));
+HXLINE( 132)			::String _hx_tmp4 = ::borogove::Hash_obj::sha256(this->hashInput())->toBase64();
+HXLINE( 128)			_hx_tmp3->textTag(HX_("hash",ce,2f,08,45),_hx_tmp4, ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("algo",d3,ff,6f,40),HX_("sha-256",32,dd,04,3b))
+            				->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:hashes:2",90,ad,87,c7))))->up();
+            		}
+HXLINE( 136)		return stanza;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Caps_obj,addC,return )
 
  ::haxe::io::Bytes Caps_obj::hashInput(){
-            	HX_GC_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_104_hashInput)
-HXLINE( 105)		 ::haxe::io::BytesOutput s =  ::haxe::io::BytesOutput_obj::__alloc( HX_CTX );
-HXLINE( 106)		{
-HXLINE( 106)			int _g = 0;
-HXDLIN( 106)			::Array< ::String > _g1 = this->features;
-HXDLIN( 106)			while((_g < _g1->length)){
-HXLINE( 106)				::String feature = _g1->__get(_g);
-HXDLIN( 106)				_g = (_g + 1);
-HXLINE( 107)				{
-HXLINE( 107)					 ::haxe::io::Bytes b = ::haxe::io::Bytes_obj::ofString(feature,null());
-HXDLIN( 107)					s->writeBytes(b,0,b->length);
+            	HX_GC_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_139_hashInput)
+HXLINE( 140)		 ::haxe::io::BytesOutput s =  ::haxe::io::BytesOutput_obj::__alloc( HX_CTX );
+HXLINE( 141)		{
+HXLINE( 141)			int _g = 0;
+HXDLIN( 141)			::Array< ::String > _g1 = this->features;
+HXDLIN( 141)			while((_g < _g1->length)){
+HXLINE( 141)				::String feature = _g1->__get(_g);
+HXDLIN( 141)				_g = (_g + 1);
+HXLINE( 142)				{
+HXLINE( 142)					 ::haxe::io::Bytes b = ::haxe::io::Bytes_obj::ofString(feature,null());
+HXDLIN( 142)					s->writeBytes(b,0,b->length);
             				}
-HXLINE( 108)				s->writeByte(31);
+HXLINE( 143)				s->writeByte(31);
             			}
             		}
-HXLINE( 110)		s->writeByte(28);
-HXLINE( 111)		{
-HXLINE( 111)			int _g2 = 0;
-HXDLIN( 111)			::Array< ::Dynamic> _g3 = this->identities;
-HXDLIN( 111)			while((_g2 < _g3->length)){
-HXLINE( 111)				 ::borogove::Identity identity = _g3->__get(_g2).StaticCast<  ::borogove::Identity >();
-HXDLIN( 111)				_g2 = (_g2 + 1);
-HXLINE( 112)				identity->writeTo(s);
+HXLINE( 145)		s->writeByte(28);
+HXLINE( 146)		{
+HXLINE( 146)			int _g2 = 0;
+HXDLIN( 146)			::Array< ::Dynamic> _g3 = this->identities;
+HXDLIN( 146)			while((_g2 < _g3->length)){
+HXLINE( 146)				 ::borogove::Identity identity = _g3->__get(_g2).StaticCast<  ::borogove::Identity >();
+HXDLIN( 146)				_g2 = (_g2 + 1);
+HXLINE( 147)				identity->writeTo(s);
             			}
             		}
-HXLINE( 114)		s->writeByte(28);
-HXLINE( 115)		{
-HXLINE( 115)			int _g4 = 0;
-HXDLIN( 115)			::Array< ::Dynamic> _g5 = this->data;
-HXDLIN( 115)			while((_g4 < _g5->length)){
+HXLINE( 149)		s->writeByte(28);
+HXLINE( 150)		{
+HXLINE( 150)			int _g4 = 0;
+HXDLIN( 150)			::Array< ::Dynamic> _g5 = this->data;
+HXDLIN( 150)			while((_g4 < _g5->length)){
             				HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(2)
             				int _hx_run( ::borogove::Stanza x, ::borogove::Stanza y){
-            					HX_GC_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_117_hashInput)
-HXLINE( 117)					::String tmp = ( (::String)(::Reflect_obj::field(x->attr,HX_("var",e7,de,59,00))) );
-HXDLIN( 117)					::String _hx_tmp;
-HXDLIN( 117)					if (::hx::IsNotNull( tmp )) {
-HXLINE( 117)						_hx_tmp = tmp;
+            					HX_GC_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_152_hashInput)
+HXLINE( 152)					::String tmp = ( (::String)(::Reflect_obj::field(x->attr,HX_("var",e7,de,59,00))) );
+HXDLIN( 152)					::String _hx_tmp;
+HXDLIN( 152)					if (::hx::IsNotNull( tmp )) {
+HXLINE( 152)						_hx_tmp = tmp;
             					}
             					else {
-HXLINE( 117)						_hx_tmp = HX_("",00,00,00,00);
+HXLINE( 152)						_hx_tmp = HX_("",00,00,00,00);
             					}
-HXDLIN( 117)					::String _hx_tmp1 = ::Array_obj< ::String >::__new(1)->init(0,_hx_tmp)->concat(::borogove::_DataForm::Field_Impl__obj::get_value(x))->join(HX_("\x1f""",1f,00,00,00));
-HXDLIN( 117)					::String tmp1 = ( (::String)(::Reflect_obj::field(y->attr,HX_("var",e7,de,59,00))) );
-HXDLIN( 117)					::String _hx_tmp2;
-HXDLIN( 117)					if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 117)						_hx_tmp2 = tmp1;
+HXDLIN( 152)					::String _hx_tmp1 = ::Array_obj< ::String >::__new(1)->init(0,_hx_tmp)->concat(::borogove::_DataForm::Field_Impl__obj::get_value(x))->join(HX_("\x1f""",1f,00,00,00));
+HXDLIN( 152)					::String tmp1 = ( (::String)(::Reflect_obj::field(y->attr,HX_("var",e7,de,59,00))) );
+HXDLIN( 152)					::String _hx_tmp2;
+HXDLIN( 152)					if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 152)						_hx_tmp2 = tmp1;
             					}
             					else {
-HXLINE( 117)						_hx_tmp2 = HX_("",00,00,00,00);
+HXLINE( 152)						_hx_tmp2 = HX_("",00,00,00,00);
             					}
-HXDLIN( 117)					return ::Reflect_obj::compare(_hx_tmp1,::Array_obj< ::String >::__new(1)->init(0,_hx_tmp2)->concat(::borogove::_DataForm::Field_Impl__obj::get_value(y))->join(HX_("\x1f""",1f,00,00,00)));
+HXDLIN( 152)					return ::Reflect_obj::compare(_hx_tmp1,::Array_obj< ::String >::__new(1)->init(0,_hx_tmp2)->concat(::borogove::_DataForm::Field_Impl__obj::get_value(y))->join(HX_("\x1f""",1f,00,00,00)));
             				}
             				HX_END_LOCAL_FUNC2(return)
 
-HXLINE( 115)				 ::borogove::Stanza form = _g5->__get(_g4).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 115)				_g4 = (_g4 + 1);
-HXLINE( 116)				::Array< ::Dynamic> fields = form->allTags(HX_("field",ba,94,93,00),null());
-HXLINE( 117)				fields->sort( ::Dynamic(new _hx_Closure_0()));
-HXLINE( 118)				{
-HXLINE( 118)					int _g6 = 0;
-HXDLIN( 118)					while((_g6 < fields->length)){
-HXLINE( 118)						 ::borogove::Stanza field = fields->__get(_g6).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 118)						_g6 = (_g6 + 1);
-HXLINE( 119)						::Array< ::String > values = ::borogove::_DataForm::Field_Impl__obj::get_value(field);
-HXLINE( 120)						values->sort(::Reflect_obj::compare_dyn());
-HXLINE( 121)						{
-HXLINE( 121)							::String s1;
-HXDLIN( 121)							::String tmp = ( (::String)(::Reflect_obj::field(field->attr,HX_("var",e7,de,59,00))) );
-HXDLIN( 121)							if (::hx::IsNotNull( tmp )) {
-HXLINE( 121)								s1 = tmp;
+HXLINE( 150)				 ::borogove::Stanza form = _g5->__get(_g4).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 150)				_g4 = (_g4 + 1);
+HXLINE( 151)				::Array< ::Dynamic> fields = form->allTags(HX_("field",ba,94,93,00),null());
+HXLINE( 152)				fields->sort( ::Dynamic(new _hx_Closure_0()));
+HXLINE( 153)				{
+HXLINE( 153)					int _g6 = 0;
+HXDLIN( 153)					while((_g6 < fields->length)){
+HXLINE( 153)						 ::borogove::Stanza field = fields->__get(_g6).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 153)						_g6 = (_g6 + 1);
+HXLINE( 154)						::Array< ::String > values = ::borogove::_DataForm::Field_Impl__obj::get_value(field);
+HXLINE( 155)						values->sort(::Reflect_obj::compare_dyn());
+HXLINE( 156)						{
+HXLINE( 156)							::String s1;
+HXDLIN( 156)							::String tmp = ( (::String)(::Reflect_obj::field(field->attr,HX_("var",e7,de,59,00))) );
+HXDLIN( 156)							if (::hx::IsNotNull( tmp )) {
+HXLINE( 156)								s1 = tmp;
             							}
             							else {
-HXLINE( 121)								s1 = HX_("",00,00,00,00);
+HXLINE( 156)								s1 = HX_("",00,00,00,00);
             							}
-HXDLIN( 121)							 ::haxe::io::Bytes b1 = ::haxe::io::Bytes_obj::ofString(s1,null());
-HXDLIN( 121)							s->writeBytes(b1,0,b1->length);
+HXDLIN( 156)							 ::haxe::io::Bytes b1 = ::haxe::io::Bytes_obj::ofString(s1,null());
+HXDLIN( 156)							s->writeBytes(b1,0,b1->length);
             						}
-HXLINE( 122)						s->writeByte(31);
-HXLINE( 123)						{
-HXLINE( 123)							int _g7 = 0;
-HXDLIN( 123)							while((_g7 < values->length)){
-HXLINE( 123)								::String value = values->__get(_g7);
-HXDLIN( 123)								_g7 = (_g7 + 1);
-HXLINE( 124)								{
-HXLINE( 124)									 ::haxe::io::Bytes b2 = ::haxe::io::Bytes_obj::ofString(value,null());
-HXDLIN( 124)									s->writeBytes(b2,0,b2->length);
+HXLINE( 157)						s->writeByte(31);
+HXLINE( 158)						{
+HXLINE( 158)							int _g7 = 0;
+HXDLIN( 158)							while((_g7 < values->length)){
+HXLINE( 158)								::String value = values->__get(_g7);
+HXDLIN( 158)								_g7 = (_g7 + 1);
+HXLINE( 159)								{
+HXLINE( 159)									 ::haxe::io::Bytes b2 = ::haxe::io::Bytes_obj::ofString(value,null());
+HXDLIN( 159)									s->writeBytes(b2,0,b2->length);
             								}
-HXLINE( 125)								s->writeByte(31);
+HXLINE( 160)								s->writeByte(31);
             							}
             						}
-HXLINE( 127)						s->writeByte(30);
+HXLINE( 162)						s->writeByte(30);
             					}
             				}
-HXLINE( 129)				s->writeByte(29);
+HXLINE( 164)				s->writeByte(29);
             			}
             		}
-HXLINE( 131)		s->writeByte(28);
-HXLINE( 132)		return s->getBytes();
+HXLINE( 166)		s->writeByte(28);
+HXLINE( 167)		return s->getBytes();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Caps_obj,hashInput,return )
 
  ::borogove::Hash Caps_obj::computeVer(){
-            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_135_computeVer)
-HXLINE( 136)		::String s = HX_("",00,00,00,00);
-HXLINE( 137)		{
-HXLINE( 137)			int _g = 0;
-HXDLIN( 137)			::Array< ::Dynamic> _g1 = this->identities;
-HXDLIN( 137)			while((_g < _g1->length)){
-HXLINE( 137)				 ::borogove::Identity identity = _g1->__get(_g).StaticCast<  ::borogove::Identity >();
-HXDLIN( 137)				_g = (_g + 1);
-HXLINE( 138)				s = (s + (identity->ver() + HX_("<",3c,00,00,00)));
+            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_170_computeVer)
+HXLINE( 171)		::String s = HX_("",00,00,00,00);
+HXLINE( 172)		{
+HXLINE( 172)			int _g = 0;
+HXDLIN( 172)			::Array< ::Dynamic> _g1 = this->identities;
+HXDLIN( 172)			while((_g < _g1->length)){
+HXLINE( 172)				 ::borogove::Identity identity = _g1->__get(_g).StaticCast<  ::borogove::Identity >();
+HXDLIN( 172)				_g = (_g + 1);
+HXLINE( 173)				s = (s + (identity->ver() + HX_("<",3c,00,00,00)));
             			}
             		}
-HXLINE( 140)		{
-HXLINE( 140)			int _g2 = 0;
-HXDLIN( 140)			::Array< ::String > _g3 = this->features;
-HXDLIN( 140)			while((_g2 < _g3->length)){
-HXLINE( 140)				::String feature = _g3->__get(_g2);
-HXDLIN( 140)				_g2 = (_g2 + 1);
-HXLINE( 141)				s = (s + (feature + HX_("<",3c,00,00,00)));
+HXLINE( 175)		{
+HXLINE( 175)			int _g2 = 0;
+HXDLIN( 175)			::Array< ::String > _g3 = this->features;
+HXDLIN( 175)			while((_g2 < _g3->length)){
+HXLINE( 175)				::String feature = _g3->__get(_g2);
+HXDLIN( 175)				_g2 = (_g2 + 1);
+HXLINE( 176)				s = (s + (feature + HX_("<",3c,00,00,00)));
             			}
             		}
-HXLINE( 143)		{
-HXLINE( 143)			int _g4 = 0;
-HXDLIN( 143)			::Array< ::Dynamic> _g5 = this->data;
-HXDLIN( 143)			while((_g4 < _g5->length)){
+HXLINE( 178)		{
+HXLINE( 178)			int _g4 = 0;
+HXDLIN( 178)			::Array< ::Dynamic> _g5 = this->data;
+HXDLIN( 178)			while((_g4 < _g5->length)){
             				HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(2)
             				int _hx_run( ::borogove::Stanza x, ::borogove::Stanza y){
-            					HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_146_computeVer)
-HXLINE( 146)					::String _hx_tmp;
-HXDLIN( 146)					::String tmp = ( (::String)(::Reflect_obj::field(x->attr,HX_("var",e7,de,59,00))) );
-HXDLIN( 146)					if (::hx::IsNotNull( tmp )) {
-HXLINE( 146)						_hx_tmp = tmp;
+            					HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_183_computeVer)
+HXLINE( 183)					::String _hx_tmp;
+HXDLIN( 183)					::String tmp = ( (::String)(::Reflect_obj::field(x->attr,HX_("var",e7,de,59,00))) );
+HXDLIN( 183)					if (::hx::IsNotNull( tmp )) {
+HXLINE( 183)						_hx_tmp = tmp;
             					}
             					else {
-HXLINE( 146)						_hx_tmp = HX_("",00,00,00,00);
+HXLINE( 183)						_hx_tmp = HX_("",00,00,00,00);
             					}
-HXDLIN( 146)					::String tmp1 = ( (::String)(::Reflect_obj::field(y->attr,HX_("var",e7,de,59,00))) );
-HXDLIN( 146)					::String _hx_tmp1;
-HXDLIN( 146)					if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 146)						_hx_tmp1 = tmp1;
+HXDLIN( 183)					::String tmp1 = ( (::String)(::Reflect_obj::field(y->attr,HX_("var",e7,de,59,00))) );
+HXDLIN( 183)					::String _hx_tmp1;
+HXDLIN( 183)					if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 183)						_hx_tmp1 = tmp1;
             					}
             					else {
-HXLINE( 146)						_hx_tmp1 = HX_("",00,00,00,00);
+HXLINE( 183)						_hx_tmp1 = HX_("",00,00,00,00);
             					}
-HXDLIN( 146)					return ::Reflect_obj::compare(_hx_tmp,_hx_tmp1);
+HXDLIN( 183)					return ::Reflect_obj::compare(_hx_tmp,_hx_tmp1);
             				}
             				HX_END_LOCAL_FUNC2(return)
 
-HXLINE( 143)				 ::borogove::Stanza form = _g5->__get(_g4).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 143)				_g4 = (_g4 + 1);
-HXLINE( 144)				s = (s + (::borogove::_DataForm::Field_Impl__obj::get_value(::borogove::_DataForm::DataForm_Impl__obj::field(form,HX_("FORM_TYPE",d5,96,c9,5a)))->__get(0) + HX_("<",3c,00,00,00)));
-HXLINE( 145)				::Array< ::Dynamic> fields = form->allTags(HX_("field",ba,94,93,00),null());
-HXLINE( 146)				fields->sort( ::Dynamic(new _hx_Closure_0()));
-HXLINE( 147)				{
-HXLINE( 147)					int _g6 = 0;
-HXDLIN( 147)					while((_g6 < fields->length)){
-HXLINE( 147)						 ::borogove::Stanza field = fields->__get(_g6).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 147)						_g6 = (_g6 + 1);
-HXLINE( 148)						::String tmp = ( (::String)(::Reflect_obj::field(field->attr,HX_("var",e7,de,59,00))) );
-HXDLIN( 148)						::String _hx_tmp;
-HXDLIN( 148)						if (::hx::IsNotNull( tmp )) {
-HXLINE( 148)							_hx_tmp = tmp;
+HXLINE( 178)				 ::borogove::Stanza form = _g5->__get(_g4).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 178)				_g4 = (_g4 + 1);
+HXLINE( 179)				 ::borogove::Stanza formType = ::borogove::_DataForm::DataForm_Impl__obj::field(form,HX_("FORM_TYPE",d5,96,c9,5a));
+HXLINE( 180)				::String s1;
+HXDLIN( 180)				if (::hx::IsNull( formType )) {
+HXLINE( 180)					s1 = HX_("",00,00,00,00);
+            				}
+            				else {
+HXLINE( 180)					s1 = ::borogove::_DataForm::Field_Impl__obj::get_value(formType)->__get(0);
+            				}
+HXDLIN( 180)				s = (s + s1);
+HXLINE( 181)				s = (s + HX_("<",3c,00,00,00));
+HXLINE( 182)				::Array< ::Dynamic> fields = form->allTags(HX_("field",ba,94,93,00),null());
+HXLINE( 183)				fields->sort( ::Dynamic(new _hx_Closure_0()));
+HXLINE( 184)				{
+HXLINE( 184)					int _g6 = 0;
+HXDLIN( 184)					while((_g6 < fields->length)){
+HXLINE( 184)						 ::borogove::Stanza field = fields->__get(_g6).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 184)						_g6 = (_g6 + 1);
+HXLINE( 185)						::String tmp = ( (::String)(::Reflect_obj::field(field->attr,HX_("var",e7,de,59,00))) );
+HXDLIN( 185)						::String _hx_tmp;
+HXDLIN( 185)						if (::hx::IsNotNull( tmp )) {
+HXLINE( 185)							_hx_tmp = tmp;
             						}
             						else {
-HXLINE( 148)							_hx_tmp = HX_("",00,00,00,00);
+HXLINE( 185)							_hx_tmp = HX_("",00,00,00,00);
             						}
-HXDLIN( 148)						if ((_hx_tmp != HX_("FORM_TYPE",d5,96,c9,5a))) {
-HXLINE( 149)							::String tmp1 = ( (::String)(::Reflect_obj::field(field->attr,HX_("var",e7,de,59,00))) );
-HXDLIN( 149)							::String s1;
-HXDLIN( 149)							if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 149)								s1 = tmp1;
+HXDLIN( 185)						if ((_hx_tmp != HX_("FORM_TYPE",d5,96,c9,5a))) {
+HXLINE( 186)							::String tmp1 = ( (::String)(::Reflect_obj::field(field->attr,HX_("var",e7,de,59,00))) );
+HXDLIN( 186)							::String s2;
+HXDLIN( 186)							if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 186)								s2 = tmp1;
             							}
             							else {
-HXLINE( 149)								s1 = HX_("",00,00,00,00);
+HXLINE( 186)								s2 = HX_("",00,00,00,00);
             							}
-HXDLIN( 149)							s = (s + (s1 + HX_("<",3c,00,00,00)));
-HXLINE( 150)							::Array< ::String > values = ::borogove::_DataForm::Field_Impl__obj::get_value(field);
-HXLINE( 151)							values->sort(::Reflect_obj::compare_dyn());
-HXLINE( 152)							{
-HXLINE( 152)								int _g7 = 0;
-HXDLIN( 152)								while((_g7 < values->length)){
-HXLINE( 152)									::String value = values->__get(_g7);
-HXDLIN( 152)									_g7 = (_g7 + 1);
-HXLINE( 153)									s = (s + (value + HX_("<",3c,00,00,00)));
+HXDLIN( 186)							s = (s + (s2 + HX_("<",3c,00,00,00)));
+HXLINE( 187)							::Array< ::String > values = ::borogove::_DataForm::Field_Impl__obj::get_value(field);
+HXLINE( 188)							values->sort(::Reflect_obj::compare_dyn());
+HXLINE( 189)							{
+HXLINE( 189)								int _g7 = 0;
+HXDLIN( 189)								while((_g7 < values->length)){
+HXLINE( 189)									::String value = values->__get(_g7);
+HXDLIN( 189)									_g7 = (_g7 + 1);
+HXLINE( 190)									s = (s + (value + HX_("<",3c,00,00,00)));
             								}
             							}
             						}
@@ -431,91 +460,130 @@ HXLINE( 153)									s = (s + (value + HX_("<",3c,00,00,00)));
             				}
             			}
             		}
-HXLINE( 158)		return ::borogove::Hash_obj::sha1(::haxe::io::Bytes_obj::ofString(s,null()));
+HXLINE( 195)		return ::borogove::Hash_obj::sha1(::haxe::io::Bytes_obj::ofString(s,null()));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Caps_obj,computeVer,return )
 
  ::borogove::Hash Caps_obj::verRaw(){
-            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_161_verRaw)
-HXLINE( 162)		if (::hx::IsNull( this->_ver )) {
-HXLINE( 162)			this->_ver = this->computeVer();
+            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_201_verRaw)
+HXLINE( 202)		 ::borogove::Hash ver = this->_ver;
+HXLINE( 203)		if (::hx::IsNotNull( ver )) {
+HXLINE( 203)			return ver;
             		}
-HXLINE( 163)		return this->_ver;
+HXLINE( 205)		 ::borogove::Hash newVer = this->computeVer();
+HXLINE( 206)		this->_ver = newVer;
+HXLINE( 207)		return newVer;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Caps_obj,verRaw,return )
 
 ::String Caps_obj::ver(){
-            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_167_ver)
-HXDLIN( 167)		return this->verRaw()->toBase64();
+            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_214_ver)
+HXDLIN( 214)		return this->verRaw()->toBase64();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Caps_obj,ver,return )
 
-::Array< ::String > Caps_obj::withIdentity( ::Dynamic caps,::String category,::String type){
-            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_24_withIdentity)
-HXLINE(  25)		::Array< ::String > result = ::Array_obj< ::String >::__new(0);
-HXLINE(  26)		while(( (bool)(caps->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE(  26)			 ::Dynamic cap = caps->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
-HXLINE(  27)			if (::hx::IsNotNull( cap->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic) )) {
-HXLINE(  28)				int _g = 0;
-HXDLIN(  28)				::Array< ::Dynamic> _g1 = ( ( ::borogove::Caps)(cap->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)) )->identities;
-HXDLIN(  28)				while((_g < _g1->length)){
-HXLINE(  28)					 ::borogove::Identity identity = _g1->__get(_g).StaticCast<  ::borogove::Identity >();
-HXDLIN(  28)					_g = (_g + 1);
-HXLINE(  29)					bool _hx_tmp;
-HXDLIN(  29)					bool _hx_tmp1;
-HXDLIN(  29)					if (::hx::IsNotNull( category )) {
-HXLINE(  29)						_hx_tmp1 = (category == identity->category);
-            					}
-            					else {
-HXLINE(  29)						_hx_tmp1 = true;
-            					}
-HXDLIN(  29)					if (_hx_tmp1) {
-HXLINE(  29)						if (::hx::IsNotNull( type )) {
-HXLINE(  29)							_hx_tmp = (type == identity->type);
-            						}
-            						else {
-HXLINE(  29)							_hx_tmp = true;
-            						}
+ ::Dynamic Caps_obj::filter( ::Dynamic caps, ::Dynamic predicate){
+            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,predicate, ::Dynamic,caps,::Array< ::Dynamic>,nextMatch) HXARGC(0)
+            		void _hx_run(){
+            			HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_27_filter)
+HXLINE(  28)			while(( (bool)(caps->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(  29)				 ::Dynamic n = caps->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
+HXLINE(  30)				if (( (bool)(predicate( ::Dynamic(n->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)))) )) {
+HXLINE(  31)					nextMatch[0] = n;
+HXLINE(  32)					return;
+            				}
+            			}
+HXLINE(  35)			nextMatch[0] = null();
+            		}
+            		HX_END_LOCAL_FUNC0((void))
+
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1,::Array< ::Dynamic>,nextMatch) HXARGC(0)
+            		bool _hx_run(){
+            			HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_41_filter)
+HXLINE(  41)			return ::hx::IsNotNull( nextMatch->__get(0) );
+            		}
+            		HX_END_LOCAL_FUNC0(return)
+
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_2, ::Dynamic,findNext,::Array< ::Dynamic>,nextMatch) HXARGC(0)
+            		 ::Dynamic _hx_run(){
+            			HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_42_filter)
+HXLINE(  43)			 ::Dynamic r = nextMatch->__get(0);
+HXLINE(  44)			if (::hx::IsNull( r )) {
+HXLINE(  44)				HX_STACK_DO_THROW(HX_("No more elements",23,94,c5,f6));
+            			}
+HXLINE(  46)			findNext();
+HXLINE(  47)			return r;
+            		}
+            		HX_END_LOCAL_FUNC0(return)
+
+            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_24_filter)
+HXLINE(  25)		::Array< ::Dynamic> nextMatch = ::Array_obj< ::Dynamic>::__new(1)->init(0,null());
+HXLINE(  27)		 ::Dynamic findNext =  ::Dynamic(new _hx_Closure_0(predicate,caps,nextMatch));
+HXLINE(  38)		findNext();
+HXLINE(  40)		return  ::Dynamic(::hx::Anon_obj::Create(2)
+            			->setFixed(0,HX_("hasNext",6d,a5,46,18), ::Dynamic(new _hx_Closure_1(nextMatch)))
+            			->setFixed(1,HX_("next",f3,84,02,49), ::Dynamic(new _hx_Closure_2(findNext,nextMatch))));
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC2(Caps_obj,filter,return )
+
+ ::Dynamic Caps_obj::withIdentity( ::Dynamic caps,::String category,::String type){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::String,type,::String,category) HXARGC(1)
+            		bool _hx_run( ::borogove::Caps c){
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::String,type,::String,category) HXARGC(1)
+            			bool _hx_run( ::borogove::Identity identity){
+            				HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_54_withIdentity)
+HXDLIN(  54)				bool _hx_tmp;
+HXDLIN(  54)				if (::hx::IsNotNull( category )) {
+HXDLIN(  54)					_hx_tmp = (category == identity->category);
+            				}
+            				else {
+HXDLIN(  54)					_hx_tmp = true;
+            				}
+HXDLIN(  54)				if (_hx_tmp) {
+HXDLIN(  54)					if (::hx::IsNotNull( type )) {
+HXDLIN(  54)						return (type == identity->type);
             					}
             					else {
-HXLINE(  29)						_hx_tmp = false;
-            					}
-HXDLIN(  29)					if (_hx_tmp) {
-HXLINE(  30)						result->push( ::Dynamic(cap->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic)));
+HXDLIN(  54)						return true;
             					}
             				}
+            				else {
+HXDLIN(  54)					return false;
+            				}
+HXDLIN(  54)				return false;
             			}
+            			HX_END_LOCAL_FUNC1(return)
+
+            			HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_54_withIdentity)
+HXDLIN(  54)			return ::Lambda_obj::exists(c->identities, ::Dynamic(new _hx_Closure_0(type,category)));
             		}
-HXLINE(  35)		return result;
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_54_withIdentity)
+HXDLIN(  54)		return ::borogove::Caps_obj::filter(caps, ::Dynamic(new _hx_Closure_1(type,category)));
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC3(Caps_obj,withIdentity,return )
 
-::Array< ::String > Caps_obj::withFeature( ::Dynamic caps,::String feature){
-            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_39_withFeature)
-HXLINE(  40)		::Array< ::String > result = ::Array_obj< ::String >::__new(0);
-HXLINE(  41)		while(( (bool)(caps->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE(  41)			 ::Dynamic cap = caps->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
-HXLINE(  42)			if (::hx::IsNotNull( cap->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic) )) {
-HXLINE(  43)				int _g = 0;
-HXDLIN(  43)				::Array< ::String > _g1 = ( ( ::borogove::Caps)(cap->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)) )->features;
-HXDLIN(  43)				while((_g < _g1->length)){
-HXLINE(  43)					::String feat = _g1->__get(_g);
-HXDLIN(  43)					_g = (_g + 1);
-HXLINE(  44)					if ((feature == feat)) {
-HXLINE(  45)						result->push( ::Dynamic(cap->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic)));
-            					}
-            				}
-            			}
+ ::Dynamic Caps_obj::withFeature( ::Dynamic caps,::String feature){
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0,::String,feature) HXARGC(1)
+            		bool _hx_run( ::borogove::Caps c){
+            			HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_59_withFeature)
+HXDLIN(  59)			return c->features->contains(feature);
             		}
-HXLINE(  50)		return result;
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_4d51f4c65f9a1a9f_59_withFeature)
+HXDLIN(  59)		return ::borogove::Caps_obj::filter(caps, ::Dynamic(new _hx_Closure_0(feature)));
             	}
 
 
@@ -592,6 +660,9 @@ void Caps_obj::__Visit(HX_VISIT_PARAMS)
 bool Caps_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
 {
 	switch(inName.length) {
+	case 6:
+		if (HX_FIELD_EQ(inName,"filter") ) { outValue = filter_dyn(); return true; }
+		break;
 	case 11:
 		if (HX_FIELD_EQ(inName,"withFeature") ) { outValue = withFeature_dyn(); return true; }
 		break;
@@ -658,6 +729,7 @@ static ::String Caps_obj_sMemberFields[] = {
 ::hx::Class Caps_obj::__mClass;
 
 static ::String Caps_obj_sStaticFields[] = {
+	HX_("filter",b8,1f,35,85),
 	HX_("withIdentity",64,ed,e7,d1),
 	HX_("withFeature",50,11,9f,7f),
 	::String(null())
diff --git a/Sources/c_borogove/src/borogove/CapsRepo.cpp b/Sources/c_borogove/src/borogove/CapsRepo.cpp
new file mode 100644
index 0000000..5707fff
--- /dev/null
+++ b/Sources/c_borogove/src/borogove/CapsRepo.cpp
@@ -0,0 +1,317 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_Reflect
+#include <Reflect.h>
+#endif
+#ifndef INCLUDED_borogove_Caps
+#include <borogove/Caps.h>
+#endif
+#ifndef INCLUDED_borogove_CapsRepo
+#include <borogove/CapsRepo.h>
+#endif
+#ifndef INCLUDED_borogove_Identity
+#include <borogove/Identity.h>
+#endif
+#ifndef INCLUDED_borogove_Persistence
+#include <borogove/Persistence.h>
+#endif
+#ifndef INCLUDED_borogove_Stanza
+#include <borogove/Stanza.h>
+#endif
+#ifndef INCLUDED_haxe_IMap
+#include <haxe/IMap.h>
+#endif
+#ifndef INCLUDED_haxe_ds_StringMap
+#include <haxe/ds/StringMap.h>
+#endif
+#ifndef INCLUDED_thenshim_Thenable
+#include <thenshim/Thenable.h>
+#endif
+#ifndef INCLUDED_thenshim__Promise_Promise_Impl_
+#include <thenshim/_Promise/Promise_Impl_.h>
+#endif
+
+HX_DEFINE_STACK_FRAME(_hx_pos_92d2b0aa8e71fa73_7_new,"borogove.CapsRepo","new",0x2a0d6532,"borogove.CapsRepo.new","borogove/CapsRepo.hx",7,0x77e4341d)
+HX_LOCAL_STACK_FRAME(_hx_pos_92d2b0aa8e71fa73_16_add,"borogove.CapsRepo","add",0x2a0386f3,"borogove.CapsRepo.add","borogove/CapsRepo.hx",16,0x77e4341d)
+HX_LOCAL_STACK_FRAME(_hx_pos_92d2b0aa8e71fa73_35_getAsync,"borogove.CapsRepo","getAsync",0x4614c0b4,"borogove.CapsRepo.getAsync","borogove/CapsRepo.hx",35,0x77e4341d)
+HX_LOCAL_STACK_FRAME(_hx_pos_92d2b0aa8e71fa73_28_getAsync,"borogove.CapsRepo","getAsync",0x4614c0b4,"borogove.CapsRepo.getAsync","borogove/CapsRepo.hx",28,0x77e4341d)
+HX_LOCAL_STACK_FRAME(_hx_pos_92d2b0aa8e71fa73_42_get,"borogove.CapsRepo","get",0x2a081568,"borogove.CapsRepo.get","borogove/CapsRepo.hx",42,0x77e4341d)
+HX_LOCAL_STACK_FRAME(_hx_pos_92d2b0aa8e71fa73_8_boot,"borogove.CapsRepo","boot",0x99c42720,"borogove.CapsRepo.boot","borogove/CapsRepo.hx",8,0x77e4341d)
+namespace borogove{
+
+void CapsRepo_obj::__construct(::Dynamic persistence){
+            	HX_GC_STACKFRAME(&_hx_pos_92d2b0aa8e71fa73_7_new)
+HXLINE(  10)		this->cache =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(  13)		this->persistence = persistence;
+            	}
+
+Dynamic CapsRepo_obj::__CreateEmpty() { return new CapsRepo_obj; }
+
+void *CapsRepo_obj::_hx_vtable = 0;
+
+Dynamic CapsRepo_obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< CapsRepo_obj > _hx_result = new CapsRepo_obj();
+	_hx_result->__construct(inArgs[0]);
+	return _hx_result;
+}
+
+bool CapsRepo_obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x796e3934;
+}
+
+ ::borogove::Caps CapsRepo_obj::add( ::borogove::Caps caps,::hx::Null< bool >  __o_storeOnMiss){
+            		bool storeOnMiss = __o_storeOnMiss.Default(true);
+            	HX_STACKFRAME(&_hx_pos_92d2b0aa8e71fa73_16_add)
+HXLINE(  17)		::String ver = caps->ver();
+HXLINE(  18)		 ::borogove::Caps r = ( ( ::borogove::Caps)(this->cache->get(ver)) );
+HXLINE(  19)		if (::hx::IsNull( r )) {
+HXLINE(  20)			if (storeOnMiss) {
+HXLINE(  20)				::borogove::Persistence_obj::storeCaps(this->persistence,caps);
+            			}
+HXLINE(  21)			this->cache->set(ver,caps);
+HXLINE(  22)			return caps;
+            		}
+HXLINE(  25)		return r;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(CapsRepo_obj,add,return )
+
+::Dynamic CapsRepo_obj::getAsync( ::borogove::Stanza presence){
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::CapsRepo,_gthis) HXARGC(1)
+            		::Dynamic _hx_run( ::borogove::Caps result){
+            			HX_STACKFRAME(&_hx_pos_92d2b0aa8e71fa73_35_getAsync)
+HXLINE(  37)			if (::hx::IsNotNull( result )) {
+HXLINE(  37)				::Dynamic this1 = _gthis->cache;
+HXDLIN(  37)				( ( ::haxe::ds::StringMap)(this1) )->set(result->ver(),result);
+            			}
+HXLINE(  38)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(result);
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_92d2b0aa8e71fa73_28_getAsync)
+HXDLIN(  28)		 ::borogove::CapsRepo _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(  29)		 ::borogove::Stanza c = presence->getChild(HX_("c",63,00,00,00),HX_("http://jabber.org/protocol/caps",95,d0,90,e2));
+HXDLIN(  29)		 ::Dynamic tmp;
+HXDLIN(  29)		if (::hx::IsNotNull( c )) {
+HXLINE(  29)			tmp = c->attr;
+            		}
+            		else {
+HXLINE(  29)			tmp = null();
+            		}
+HXDLIN(  29)		::String ver;
+HXDLIN(  29)		if (::hx::IsNotNull( tmp )) {
+HXLINE(  29)			ver = ( (::String)(::Reflect_obj::field(tmp,HX_("ver",63,e2,59,00))) );
+            		}
+            		else {
+HXLINE(  29)			ver = null();
+            		}
+HXLINE(  30)		if (::hx::IsNull( ver )) {
+HXLINE(  30)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            		}
+HXLINE(  32)		 ::borogove::Caps cached = ( ( ::borogove::Caps)(this->cache->get(ver)) );
+HXLINE(  33)		if (::hx::IsNotNull( cached )) {
+HXLINE(  33)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(cached);
+            		}
+HXLINE(  35)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getCaps(this->persistence,ver), ::Dynamic(new _hx_Closure_0(_gthis)),null());
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(CapsRepo_obj,getAsync,return )
+
+ ::borogove::Caps CapsRepo_obj::get( ::borogove::Stanza presence){
+            	HX_STACKFRAME(&_hx_pos_92d2b0aa8e71fa73_42_get)
+HXLINE(  43)		 ::borogove::Stanza c = presence->getChild(HX_("c",63,00,00,00),HX_("http://jabber.org/protocol/caps",95,d0,90,e2));
+HXDLIN(  43)		 ::Dynamic tmp;
+HXDLIN(  43)		if (::hx::IsNotNull( c )) {
+HXLINE(  43)			tmp = c->attr;
+            		}
+            		else {
+HXLINE(  43)			tmp = null();
+            		}
+HXDLIN(  43)		::String ver;
+HXDLIN(  43)		if (::hx::IsNotNull( tmp )) {
+HXLINE(  43)			ver = ( (::String)(::Reflect_obj::field(tmp,HX_("ver",63,e2,59,00))) );
+            		}
+            		else {
+HXLINE(  43)			ver = null();
+            		}
+HXLINE(  44)		if (::hx::IsNotNull( ver )) {
+HXLINE(  45)			 ::borogove::Caps cached = ( ( ::borogove::Caps)(this->cache->get(ver)) );
+HXLINE(  46)			if (::hx::IsNotNull( cached )) {
+HXLINE(  46)				return cached;
+            			}
+HXLINE(  48)			this->getAsync(presence);
+            		}
+HXLINE(  51)		return ::borogove::CapsRepo_obj::empty;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(CapsRepo_obj,get,return )
+
+ ::borogove::Caps CapsRepo_obj::empty;
+
+
+::hx::ObjectPtr< CapsRepo_obj > CapsRepo_obj::__new(::Dynamic persistence) {
+	::hx::ObjectPtr< CapsRepo_obj > __this = new CapsRepo_obj();
+	__this->__construct(persistence);
+	return __this;
+}
+
+::hx::ObjectPtr< CapsRepo_obj > CapsRepo_obj::__alloc(::hx::Ctx *_hx_ctx,::Dynamic persistence) {
+	CapsRepo_obj *__this = (CapsRepo_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(CapsRepo_obj), true, "borogove.CapsRepo"));
+	*(void **)__this = CapsRepo_obj::_hx_vtable;
+	__this->__construct(persistence);
+	return __this;
+}
+
+CapsRepo_obj::CapsRepo_obj()
+{
+}
+
+void CapsRepo_obj::__Mark(HX_MARK_PARAMS)
+{
+	HX_MARK_BEGIN_CLASS(CapsRepo);
+	HX_MARK_MEMBER_NAME(persistence,"persistence");
+	HX_MARK_MEMBER_NAME(cache,"cache");
+	HX_MARK_END_CLASS();
+}
+
+void CapsRepo_obj::__Visit(HX_VISIT_PARAMS)
+{
+	HX_VISIT_MEMBER_NAME(persistence,"persistence");
+	HX_VISIT_MEMBER_NAME(cache,"cache");
+}
+
+::hx::Val CapsRepo_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 3:
+		if (HX_FIELD_EQ(inName,"add") ) { return ::hx::Val( add_dyn() ); }
+		if (HX_FIELD_EQ(inName,"get") ) { return ::hx::Val( get_dyn() ); }
+		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"cache") ) { return ::hx::Val( cache ); }
+		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"getAsync") ) { return ::hx::Val( getAsync_dyn() ); }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"persistence") ) { return ::hx::Val( persistence ); }
+	}
+	return super::__Field(inName,inCallProp);
+}
+
+bool CapsRepo_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 5:
+		if (HX_FIELD_EQ(inName,"empty") ) { outValue = ( empty ); return true; }
+	}
+	return false;
+}
+
+::hx::Val CapsRepo_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 5:
+		if (HX_FIELD_EQ(inName,"cache") ) { cache=inValue.Cast<  ::haxe::ds::StringMap >(); return inValue; }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"persistence") ) { persistence=inValue.Cast< ::Dynamic >(); return inValue; }
+	}
+	return super::__SetField(inName,inValue,inCallProp);
+}
+
+bool CapsRepo_obj::__SetStatic(const ::String &inName,Dynamic &ioValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 5:
+		if (HX_FIELD_EQ(inName,"empty") ) { empty=ioValue.Cast<  ::borogove::Caps >(); return true; }
+	}
+	return false;
+}
+
+void CapsRepo_obj::__GetFields(Array< ::String> &outFields)
+{
+	outFields->push(HX_("persistence",5f,17,c4,f6));
+	outFields->push(HX_("cache",42,9a,14,41));
+	super::__GetFields(outFields);
+};
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo CapsRepo_obj_sMemberStorageInfo[] = {
+	{::hx::fsObject /* ::Dynamic */ ,(int)offsetof(CapsRepo_obj,persistence),HX_("persistence",5f,17,c4,f6)},
+	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(CapsRepo_obj,cache),HX_("cache",42,9a,14,41)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+static ::hx::StaticInfo CapsRepo_obj_sStaticStorageInfo[] = {
+	{::hx::fsObject /*  ::borogove::Caps */ ,(void *) &CapsRepo_obj::empty,HX_("empty",8d,3a,da,6f)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+#endif
+
+static ::String CapsRepo_obj_sMemberFields[] = {
+	HX_("persistence",5f,17,c4,f6),
+	HX_("cache",42,9a,14,41),
+	HX_("add",21,f2,49,00),
+	HX_("getAsync",c6,0e,15,86),
+	HX_("get",96,80,4e,00),
+	::String(null()) };
+
+static void CapsRepo_obj_sMarkStatics(HX_MARK_PARAMS) {
+	HX_MARK_MEMBER_NAME(CapsRepo_obj::empty,"empty");
+};
+
+#ifdef HXCPP_VISIT_ALLOCS
+static void CapsRepo_obj_sVisitStatics(HX_VISIT_PARAMS) {
+	HX_VISIT_MEMBER_NAME(CapsRepo_obj::empty,"empty");
+};
+
+#endif
+
+::hx::Class CapsRepo_obj::__mClass;
+
+static ::String CapsRepo_obj_sStaticFields[] = {
+	HX_("empty",8d,3a,da,6f),
+	::String(null())
+};
+
+void CapsRepo_obj::__register()
+{
+	CapsRepo_obj _hx_dummy;
+	CapsRepo_obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("borogove.CapsRepo",40,a4,8a,ed);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &CapsRepo_obj::__GetStatic;
+	__mClass->mSetStaticField = &CapsRepo_obj::__SetStatic;
+	__mClass->mMarkFunc = CapsRepo_obj_sMarkStatics;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(CapsRepo_obj_sStaticFields);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(CapsRepo_obj_sMemberFields);
+	__mClass->mCanCast = ::hx::TCanCast< CapsRepo_obj >;
+#ifdef HXCPP_VISIT_ALLOCS
+	__mClass->mVisitFunc = CapsRepo_obj_sVisitStatics;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = CapsRepo_obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = CapsRepo_obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+void CapsRepo_obj::__boot()
+{
+{
+            	HX_GC_STACKFRAME(&_hx_pos_92d2b0aa8e71fa73_8_boot)
+HXDLIN(   8)		empty =  ::borogove::Caps_obj::__alloc( HX_CTX ,HX_("",00,00,00,00),::Array_obj< ::Dynamic>::__new(0),::Array_obj< ::String >::__new(0),::Array_obj< ::Dynamic>::__new(0),null());
+            	}
+}
+
+} // end namespace borogove
diff --git a/Sources/c_borogove/src/borogove/Channel.cpp b/Sources/c_borogove/src/borogove/Channel.cpp
index 4aacad3..18c626b 100644
--- a/Sources/c_borogove/src/borogove/Channel.cpp
+++ b/Sources/c_borogove/src/borogove/Channel.cpp
@@ -13,9 +13,21 @@
 #ifndef INCLUDED_Std
 #include <Std.h>
 #endif
+#ifndef INCLUDED__FractionalIndexing_FractionalIndexing_Fields_
+#include <_FractionalIndexing/FractionalIndexing_Fields_.h>
+#endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
+#ifndef INCLUDED_borogove_AvailableChat
+#include <borogove/AvailableChat.h>
+#endif
 #ifndef INCLUDED_borogove_Caps
 #include <borogove/Caps.h>
 #endif
+#ifndef INCLUDED_borogove_CapsRepo
+#include <borogove/CapsRepo.h>
+#endif
 #ifndef INCLUDED_borogove_Channel
 #include <borogove/Channel.h>
 #endif
@@ -31,9 +43,6 @@
 #ifndef INCLUDED_borogove_Client
 #include <borogove/Client.h>
 #endif
-#ifndef INCLUDED_borogove_Color
-#include <borogove/Color.h>
-#endif
 #ifndef INCLUDED_borogove_CustomEmojiReaction
 #include <borogove/CustomEmojiReaction.h>
 #endif
@@ -58,8 +67,8 @@
 #ifndef INCLUDED_borogove_Hash
 #include <borogove/Hash.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED_borogove_Html
+#include <borogove/Html.h>
 #endif
 #ifndef INCLUDED_borogove_Identity
 #include <borogove/Identity.h>
@@ -67,6 +76,12 @@
 #ifndef INCLUDED_borogove_JID
 #include <borogove/JID.h>
 #endif
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
+#endif
+#ifndef INCLUDED_borogove_MemberUpdate
+#include <borogove/MemberUpdate.h>
+#endif
 #ifndef INCLUDED_borogove_Message
 #include <borogove/Message.h>
 #endif
@@ -85,27 +100,27 @@
 #ifndef INCLUDED_borogove_OutboxItem
 #include <borogove/OutboxItem.h>
 #endif
-#ifndef INCLUDED_borogove_Participant
-#include <borogove/Participant.h>
-#endif
 #ifndef INCLUDED_borogove_Persistence
 #include <borogove/Persistence.h>
 #endif
-#ifndef INCLUDED_borogove_Presence
-#include <borogove/Presence.h>
-#endif
 #ifndef INCLUDED_borogove_Reaction
 #include <borogove/Reaction.h>
 #endif
 #ifndef INCLUDED_borogove_ReactionUpdate
 #include <borogove/ReactionUpdate.h>
 #endif
+#ifndef INCLUDED_borogove_Role
+#include <borogove/Role.h>
+#endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
 #ifndef INCLUDED_borogove_Util
 #include <borogove/Util.h>
 #endif
+#ifndef INCLUDED_borogove__Chat_Chat_Fields_
+#include <borogove/_Chat/Chat_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove__DataForm_DataForm_Impl_
 #include <borogove/_DataForm/DataForm_Impl_.h>
 #endif
@@ -136,9 +151,6 @@
 #ifndef INCLUDED_haxe_io_Bytes
 #include <haxe/io/Bytes.h>
 #endif
-#ifndef INCLUDED_haxe_iterators_MapKeyValueIterator
-#include <haxe/iterators/MapKeyValueIterator.h>
-#endif
 #ifndef INCLUDED_thenshim_PromiseTools
 #include <thenshim/PromiseTools.h>
 #endif
@@ -149,103 +161,159 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1236_new,"borogove.Channel","new",0x12050648,"borogove.Channel.new","borogove/Chat.hx",1236,0x1763ae98)
+HX_DEFINE_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1430_new,"borogove.Channel","new",0x12050648,"borogove.Channel.new","borogove/Chat.hx",1430,0x1763ae98)
 static const ::String _hx_array_data_da6a8256_1[] = {
 	HX_("http://jabber.org/protocol/muc",07,b2,7f,c6),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1284_selfPing,"borogove.Channel","selfPing",0x11d6c136,"borogove.Channel.selfPing","borogove/Chat.hx",1284,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1273_selfPing,"borogove.Channel","selfPing",0x11d6c136,"borogove.Channel.selfPing","borogove/Chat.hx",1273,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1259_selfPing,"borogove.Channel","selfPing",0x11d6c136,"borogove.Channel.selfPing","borogove/Chat.hx",1259,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1265_selfPing,"borogove.Channel","selfPing",0x11d6c136,"borogove.Channel.selfPing","borogove/Chat.hx",1265,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1314_join,"borogove.Channel","join",0xafc32902,"borogove.Channel.join","borogove/Chat.hx",1314,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1300_join,"borogove.Channel","join",0xafc32902,"borogove.Channel.join","borogove/Chat.hx",1300,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1325_selfPingSuccess,"borogove.Channel","selfPingSuccess",0x1336bf2d,"borogove.Channel.selfPingSuccess","borogove/Chat.hx",1325,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1336_getDisplayName,"borogove.Channel","getDisplayName",0x49aca7cf,"borogove.Channel.getDisplayName","borogove/Chat.hx",1336,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1346_description,"borogove.Channel","description",0x2f5266e4,"borogove.Channel.description","borogove/Chat.hx",1346,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1350_info,"borogove.Channel","info",0xaf192d86,"borogove.Channel.info","borogove/Chat.hx",1350,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1354_invite,"borogove.Channel","invite",0x94735ce1,"borogove.Channel.invite","borogove/Chat.hx",1354,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1367_canInvite,"borogove.Channel","canInvite",0x7f9cd9e1,"borogove.Channel.canInvite","borogove/Chat.hx",1367,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1379_canSend,"borogove.Channel","canSend",0x7a8ebf60,"borogove.Channel.canSend","borogove/Chat.hx",1379,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1391_getCaps,"borogove.Channel","getCaps",0x242315bf,"borogove.Channel.getCaps","borogove/Chat.hx",1391,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1395_setPresence,"borogove.Channel","setPresence",0x676d79e5,"borogove.Channel.setPresence","borogove/Chat.hx",1395,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1396_setPresence,"borogove.Channel","setPresence",0x676d79e5,"borogove.Channel.setPresence","borogove/Chat.hx",1396,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1406_setPresence,"borogove.Channel","setPresence",0x676d79e5,"borogove.Channel.setPresence","borogove/Chat.hx",1406,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1414_setPresence,"borogove.Channel","setPresence",0x676d79e5,"borogove.Channel.setPresence","borogove/Chat.hx",1414,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1437_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1437,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1473_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1473,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1500_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1500,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1508_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1508,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1443_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1443,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1467_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1467,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1459_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1459,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1455_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1455,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1518_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1518,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1420_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1420,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1530_setTrusted,"borogove.Channel","setTrusted",0xa74cb38d,"borogove.Channel.setTrusted","borogove/Chat.hx",1530,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1536_isTrusted,"borogove.Channel","isTrusted",0xa81fc915,"borogove.Channel.isTrusted","borogove/Chat.hx",1536,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1540_isPrivate,"borogove.Channel","isPrivate",0x1ae83e21,"borogove.Channel.isPrivate","borogove/Chat.hx",1540,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1544_setupNotifications,"borogove.Channel","setupNotifications",0xe0d25d83,"borogove.Channel.setupNotifications","borogove/Chat.hx",1544,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1552_refreshDisco,"borogove.Channel","refreshDisco",0x4bcfccb7,"borogove.Channel.refreshDisco","borogove/Chat.hx",1552,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1564_refreshDisco,"borogove.Channel","refreshDisco",0x4bcfccb7,"borogove.Channel.refreshDisco","borogove/Chat.hx",1564,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1570_refreshDisco,"borogove.Channel","refreshDisco",0x4bcfccb7,"borogove.Channel.refreshDisco","borogove/Chat.hx",1570,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1567_refreshDisco,"borogove.Channel","refreshDisco",0x4bcfccb7,"borogove.Channel.refreshDisco","borogove/Chat.hx",1567,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1550_refreshDisco,"borogove.Channel","refreshDisco",0x4bcfccb7,"borogove.Channel.refreshDisco","borogove/Chat.hx",1550,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1582_preview,"borogove.Channel","preview",0x4bc129f0,"borogove.Channel.preview","borogove/Chat.hx",1582,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1589_livePresence,"borogove.Channel","livePresence",0x1293c65f,"borogove.Channel.livePresence","borogove/Chat.hx",1589,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1596_syncing,"borogove.Channel","syncing",0xb70d474f,"borogove.Channel.syncing","borogove/Chat.hx",1596,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1600_canAudioCall,"borogove.Channel","canAudioCall",0x430d177c,"borogove.Channel.canAudioCall","borogove/Chat.hx",1600,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1604_canVideoCall,"borogove.Channel","canVideoCall",0x490fe9a1,"borogove.Channel.canVideoCall","borogove/Chat.hx",1604,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1608_nickInUse,"borogove.Channel","nickInUse",0xd519bea7,"borogove.Channel.nickInUse","borogove/Chat.hx",1608,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1612_getFullJid,"borogove.Channel","getFullJid",0x5d591998,"borogove.Channel.getFullJid","borogove/Chat.hx",1612,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1618_getParticipants,"borogove.Channel","getParticipants",0x9c657cfe,"borogove.Channel.getParticipants","borogove/Chat.hx",1618,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1616_getParticipants,"borogove.Channel","getParticipants",0x9c657cfe,"borogove.Channel.getParticipants","borogove/Chat.hx",1616,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1623_getParticipantDetails,"borogove.Channel","getParticipantDetails",0xe879fb6d,"borogove.Channel.getParticipantDetails","borogove/Chat.hx",1623,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1637_getMessagesBefore,"borogove.Channel","getMessagesBefore",0x72d1ad89,"borogove.Channel.getMessagesBefore","borogove/Chat.hx",1637,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1643_getMessagesBefore,"borogove.Channel","getMessagesBefore",0x72d1ad89,"borogove.Channel.getMessagesBefore","borogove/Chat.hx",1643,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1635_getMessagesBefore,"borogove.Channel","getMessagesBefore",0x72d1ad89,"borogove.Channel.getMessagesBefore","borogove/Chat.hx",1635,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1659_getMessagesAfter,"borogove.Channel","getMessagesAfter",0x9a967c52,"borogove.Channel.getMessagesAfter","borogove/Chat.hx",1659,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1665_getMessagesAfter,"borogove.Channel","getMessagesAfter",0x9a967c52,"borogove.Channel.getMessagesAfter","borogove/Chat.hx",1665,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1654_getMessagesAfter,"borogove.Channel","getMessagesAfter",0x9a967c52,"borogove.Channel.getMessagesAfter","borogove/Chat.hx",1654,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1678_getMessagesAround,"borogove.Channel","getMessagesAround",0x8ea35157,"borogove.Channel.getMessagesAround","borogove/Chat.hx",1678,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1682_prepareIncomingMessage,"borogove.Channel","prepareIncomingMessage",0xe60006d2,"borogove.Channel.prepareIncomingMessage","borogove/Chat.hx",1682,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1693_prepareOutgoingMessage,"borogove.Channel","prepareOutgoingMessage",0x4c2ccc0c,"borogove.Channel.prepareOutgoingMessage","borogove/Chat.hx",1693,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1712_correctMessage,"borogove.Channel","correctMessage",0x85df7995,"borogove.Channel.correctMessage","borogove/Chat.hx",1712,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1706_correctMessage,"borogove.Channel","correctMessage",0x85df7995,"borogove.Channel.correctMessage","borogove/Chat.hx",1706,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1725_sendMessage,"borogove.Channel","sendMessage",0xf452e747,"borogove.Channel.sendMessage","borogove/Chat.hx",1725,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1743_sendMessage,"borogove.Channel","sendMessage",0xf452e747,"borogove.Channel.sendMessage","borogove/Chat.hx",1743,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1750_sendMessage,"borogove.Channel","sendMessage",0xf452e747,"borogove.Channel.sendMessage","borogove/Chat.hx",1750,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1782_removeReaction,"borogove.Channel","removeReaction",0x52276725,"borogove.Channel.removeReaction","borogove/Chat.hx",1782,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1761_removeReaction,"borogove.Channel","removeReaction",0x52276725,"borogove.Channel.removeReaction","borogove/Chat.hx",1761,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1776_removeReaction,"borogove.Channel","removeReaction",0x52276725,"borogove.Channel.removeReaction","borogove/Chat.hx",1776,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1794_sendMessageStanza,"borogove.Channel","sendMessageStanza",0x9ef9e89c,"borogove.Channel.sendMessageStanza","borogove/Chat.hx",1794,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1788_sendMessageStanza,"borogove.Channel","sendMessageStanza",0x9ef9e89c,"borogove.Channel.sendMessageStanza","borogove/Chat.hx",1788,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1799_lastMessageId,"borogove.Channel","lastMessageId",0x760f3834,"borogove.Channel.lastMessageId","borogove/Chat.hx",1799,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1804_markReadUpTo,"borogove.Channel","markReadUpTo",0x4caa3571,"borogove.Channel.markReadUpTo","borogove/Chat.hx",1804,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1819_markReadUpTo,"borogove.Channel","markReadUpTo",0x4caa3571,"borogove.Channel.markReadUpTo","borogove/Chat.hx",1819,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1803_markReadUpTo,"borogove.Channel","markReadUpTo",0x4caa3571,"borogove.Channel.markReadUpTo","borogove/Chat.hx",1803,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1845_bookmark,"borogove.Channel","bookmark",0x0c8bedce,"borogove.Channel.bookmark","borogove/Chat.hx",1845,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1863_bookmark,"borogove.Channel","bookmark",0x0c8bedce,"borogove.Channel.bookmark","borogove/Chat.hx",1863,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1823_bookmark,"borogove.Channel","bookmark",0x0c8bedce,"borogove.Channel.bookmark","borogove/Chat.hx",1823,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1874_sendChatState,"borogove.Channel","sendChatState",0xbd4bc999,"borogove.Channel.sendChatState","borogove/Chat.hx",1874,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1890_close,"borogove.Channel","close",0x113b97a0,"borogove.Channel.close","borogove/Chat.hx",1890,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1236_boot,"borogove.Channel","boot",0xaa79794a,"borogove.Channel.boot","borogove/Chat.hx",1236,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1487_selfPing,"borogove.Channel","selfPing",0x11d6c136,"borogove.Channel.selfPing","borogove/Chat.hx",1487,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1476_selfPing,"borogove.Channel","selfPing",0x11d6c136,"borogove.Channel.selfPing","borogove/Chat.hx",1476,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1462_selfPing,"borogove.Channel","selfPing",0x11d6c136,"borogove.Channel.selfPing","borogove/Chat.hx",1462,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1468_selfPing,"borogove.Channel","selfPing",0x11d6c136,"borogove.Channel.selfPing","borogove/Chat.hx",1468,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1517_join,"borogove.Channel","join",0xafc32902,"borogove.Channel.join","borogove/Chat.hx",1517,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1528_join,"borogove.Channel","join",0xafc32902,"borogove.Channel.join","borogove/Chat.hx",1528,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1509_join,"borogove.Channel","join",0xafc32902,"borogove.Channel.join","borogove/Chat.hx",1509,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1503_join,"borogove.Channel","join",0xafc32902,"borogove.Channel.join","borogove/Chat.hx",1503,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1542_selfPingSuccess,"borogove.Channel","selfPingSuccess",0x1336bf2d,"borogove.Channel.selfPingSuccess","borogove/Chat.hx",1542,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1534_selfPingSuccess,"borogove.Channel","selfPingSuccess",0x1336bf2d,"borogove.Channel.selfPingSuccess","borogove/Chat.hx",1534,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1545_getDisplayName,"borogove.Channel","getDisplayName",0x49aca7cf,"borogove.Channel.getDisplayName","borogove/Chat.hx",1545,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1561_subject,"borogove.Channel","subject",0x396e4b94,"borogove.Channel.subject","borogove/Chat.hx",1561,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1568_description,"borogove.Channel","description",0x2f5266e4,"borogove.Channel.description","borogove/Chat.hx",1568,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1572_info,"borogove.Channel","info",0xaf192d86,"borogove.Channel.info","borogove/Chat.hx",1572,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1575_invite,"borogove.Channel","invite",0x94735ce1,"borogove.Channel.invite","borogove/Chat.hx",1575,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1588_canInvite,"borogove.Channel","canInvite",0x7f9cd9e1,"borogove.Channel.canInvite","borogove/Chat.hx",1588,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1600_canSend,"borogove.Channel","canSend",0x7a8ebf60,"borogove.Channel.canSend","borogove/Chat.hx",1600,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1610_canModerate,"borogove.Channel","canModerate",0xd0f331db,"borogove.Channel.canModerate","borogove/Chat.hx",1610,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1623_getCaps,"borogove.Channel","getCaps",0x242315bf,"borogove.Channel.getCaps","borogove/Chat.hx",1623,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1624_getCaps,"borogove.Channel","getCaps",0x242315bf,"borogove.Channel.getCaps","borogove/Chat.hx",1624,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1620_getCaps,"borogove.Channel","getCaps",0x242315bf,"borogove.Channel.getCaps","borogove/Chat.hx",1620,0x1763ae98)
+static const bool _hx_array_data_da6a8256_26[] = {
+	1,
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1632_setPresence,"borogove.Channel","setPresence",0x676d79e5,"borogove.Channel.setPresence","borogove/Chat.hx",1632,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1633_setPresence,"borogove.Channel","setPresence",0x676d79e5,"borogove.Channel.setPresence","borogove/Chat.hx",1633,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1646_setPresence,"borogove.Channel","setPresence",0x676d79e5,"borogove.Channel.setPresence","borogove/Chat.hx",1646,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1650_setPresence,"borogove.Channel","setPresence",0x676d79e5,"borogove.Channel.setPresence","borogove/Chat.hx",1650,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1679_setPresence,"borogove.Channel","setPresence",0x676d79e5,"borogove.Channel.setPresence","borogove/Chat.hx",1679,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1683_setPresence,"borogove.Channel","setPresence",0x676d79e5,"borogove.Channel.setPresence","borogove/Chat.hx",1683,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1685_setPresence,"borogove.Channel","setPresence",0x676d79e5,"borogove.Channel.setPresence","borogove/Chat.hx",1685,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1714_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1714,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1750_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1750,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1777_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1777,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1779_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1779,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1788_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1788,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1720_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1720,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1744_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1744,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1736_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1736,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1732_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1732,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1798_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1798,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1689_doSync,"borogove.Channel","doSync",0x10faca9e,"borogove.Channel.doSync","borogove/Chat.hx",1689,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1812_setTrusted,"borogove.Channel","setTrusted",0xa74cb38d,"borogove.Channel.setTrusted","borogove/Chat.hx",1812,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1818_isTrusted,"borogove.Channel","isTrusted",0xa81fc915,"borogove.Channel.isTrusted","borogove/Chat.hx",1818,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1825_isPrivate,"borogove.Channel","isPrivate",0x1ae83e21,"borogove.Channel.isPrivate","borogove/Chat.hx",1825,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1829_setupNotifications,"borogove.Channel","setupNotifications",0xe0d25d83,"borogove.Channel.setupNotifications","borogove/Chat.hx",1829,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1837_refreshDisco,"borogove.Channel","refreshDisco",0x4bcfccb7,"borogove.Channel.refreshDisco","borogove/Chat.hx",1837,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1848_refreshDisco,"borogove.Channel","refreshDisco",0x4bcfccb7,"borogove.Channel.refreshDisco","borogove/Chat.hx",1848,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1853_refreshDisco,"borogove.Channel","refreshDisco",0x4bcfccb7,"borogove.Channel.refreshDisco","borogove/Chat.hx",1853,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1850_refreshDisco,"borogove.Channel","refreshDisco",0x4bcfccb7,"borogove.Channel.refreshDisco","borogove/Chat.hx",1850,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1835_refreshDisco,"borogove.Channel","refreshDisco",0x4bcfccb7,"borogove.Channel.refreshDisco","borogove/Chat.hx",1835,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1865_preview,"borogove.Channel","preview",0x4bc129f0,"borogove.Channel.preview","borogove/Chat.hx",1865,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1872_livePresence,"borogove.Channel","livePresence",0x1293c65f,"borogove.Channel.livePresence","borogove/Chat.hx",1872,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1879_syncing,"borogove.Channel","syncing",0xb70d474f,"borogove.Channel.syncing","borogove/Chat.hx",1879,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1887_setLastMessage,"borogove.Channel","setLastMessage",0x879768a7,"borogove.Channel.setLastMessage","borogove/Chat.hx",1887,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1883_setLastMessage,"borogove.Channel","setLastMessage",0x879768a7,"borogove.Channel.setLastMessage","borogove/Chat.hx",1883,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1882_setLastMessage,"borogove.Channel","setLastMessage",0x879768a7,"borogove.Channel.setLastMessage","borogove/Chat.hx",1882,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1895_canAudioCall,"borogove.Channel","canAudioCall",0x430d177c,"borogove.Channel.canAudioCall","borogove/Chat.hx",1895,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1899_canVideoCall,"borogove.Channel","canVideoCall",0x490fe9a1,"borogove.Channel.canVideoCall","borogove/Chat.hx",1899,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1903_nickInUse,"borogove.Channel","nickInUse",0xd519bea7,"borogove.Channel.nickInUse","borogove/Chat.hx",1903,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1908_getFullJid,"borogove.Channel","getFullJid",0x5d591998,"borogove.Channel.getFullJid","borogove/Chat.hx",1908,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1915_members,"borogove.Channel","members",0x2a5676c1,"borogove.Channel.members","borogove/Chat.hx",1915,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1912_members,"borogove.Channel","members",0x2a5676c1,"borogove.Channel.members","borogove/Chat.hx",1912,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1914_members,"borogove.Channel","members",0x2a5676c1,"borogove.Channel.members","borogove/Chat.hx",1914,0x1763ae98)
+static const ::String _hx_array_data_da6a8256_78[] = {
+	HX_("admin",8f,ac,4a,1c),HX_("owner",33,98,76,38),
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1919_getMemberDetails,"borogove.Channel","getMemberDetails",0xf634642a,"borogove.Channel.getMemberDetails","borogove/Chat.hx",1919,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1925_buildMember,"borogove.Channel","buildMember",0x255c2610,"borogove.Channel.buildMember","borogove/Chat.hx",1925,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1926_buildMember,"borogove.Channel","buildMember",0x255c2610,"borogove.Channel.buildMember","borogove/Chat.hx",1926,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1966_availableRoles,"borogove.Channel","availableRoles",0xa01e5ccc,"borogove.Channel.availableRoles","borogove/Chat.hx",1966,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1970_availableRoles,"borogove.Channel","availableRoles",0xa01e5ccc,"borogove.Channel.availableRoles","borogove/Chat.hx",1970,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1963_availableRoles,"borogove.Channel","availableRoles",0xa01e5ccc,"borogove.Channel.availableRoles","borogove/Chat.hx",1963,0x1763ae98)
+static const ::String _hx_array_data_da6a8256_91[] = {
+	HX_("owner",33,98,76,38),HX_("admin",8f,ac,4a,1c),HX_("none",b8,12,0a,49),HX_("outcast",4d,1e,c5,db),
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1967_availableRoles,"borogove.Channel","availableRoles",0xa01e5ccc,"borogove.Channel.availableRoles","borogove/Chat.hx",1967,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1971_availableRoles,"borogove.Channel","availableRoles",0xa01e5ccc,"borogove.Channel.availableRoles","borogove/Chat.hx",1971,0x1763ae98)
+static const ::String _hx_array_data_da6a8256_94[] = {
+	HX_("none",b8,12,0a,49),HX_("outcast",4d,1e,c5,db),
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1973_availableRoles,"borogove.Channel","availableRoles",0xa01e5ccc,"borogove.Channel.availableRoles","borogove/Chat.hx",1973,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1982_canRemoveRole,"borogove.Channel","canRemoveRole",0x50c0f9f2,"borogove.Channel.canRemoveRole","borogove/Chat.hx",1982,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1986_canRemoveRole,"borogove.Channel","canRemoveRole",0x50c0f9f2,"borogove.Channel.canRemoveRole","borogove/Chat.hx",1986,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1979_canRemoveRole,"borogove.Channel","canRemoveRole",0x50c0f9f2,"borogove.Channel.canRemoveRole","borogove/Chat.hx",1979,0x1763ae98)
+static const ::String _hx_array_data_da6a8256_99[] = {
+	HX_("owner",33,98,76,38),HX_("admin",8f,ac,4a,1c),HX_("none",b8,12,0a,49),HX_("outcast",4d,1e,c5,db),
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1987_canRemoveRole,"borogove.Channel","canRemoveRole",0x50c0f9f2,"borogove.Channel.canRemoveRole","borogove/Chat.hx",1987,0x1763ae98)
+static const ::String _hx_array_data_da6a8256_101[] = {
+	HX_("admin",8f,ac,4a,1c),HX_("none",b8,12,0a,49),HX_("outcast",4d,1e,c5,db),
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2001_addRole,"borogove.Channel","addRole",0x97d2781f,"borogove.Channel.addRole","borogove/Chat.hx",2001,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1995_addRole,"borogove.Channel","addRole",0x97d2781f,"borogove.Channel.addRole","borogove/Chat.hx",1995,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2006_removeRole,"borogove.Channel","removeRole",0x0694fcf2,"borogove.Channel.removeRole","borogove/Chat.hx",2006,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2014_getMessagesBefore,"borogove.Channel","getMessagesBefore",0x72d1ad89,"borogove.Channel.getMessagesBefore","borogove/Chat.hx",2014,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2020_getMessagesBefore,"borogove.Channel","getMessagesBefore",0x72d1ad89,"borogove.Channel.getMessagesBefore","borogove/Chat.hx",2020,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2010_getMessagesBefore,"borogove.Channel","getMessagesBefore",0x72d1ad89,"borogove.Channel.getMessagesBefore","borogove/Chat.hx",2010,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2038_getMessagesAfter,"borogove.Channel","getMessagesAfter",0x9a967c52,"borogove.Channel.getMessagesAfter","borogove/Chat.hx",2038,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2044_getMessagesAfter,"borogove.Channel","getMessagesAfter",0x9a967c52,"borogove.Channel.getMessagesAfter","borogove/Chat.hx",2044,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2031_getMessagesAfter,"borogove.Channel","getMessagesAfter",0x9a967c52,"borogove.Channel.getMessagesAfter","borogove/Chat.hx",2031,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2055_getMessagesAround,"borogove.Channel","getMessagesAround",0x8ea35157,"borogove.Channel.getMessagesAround","borogove/Chat.hx",2055,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2063_prepareIncomingMessage,"borogove.Channel","prepareIncomingMessage",0xe60006d2,"borogove.Channel.prepareIncomingMessage","borogove/Chat.hx",2063,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2082_prepareOutgoingMessage,"borogove.Channel","prepareOutgoingMessage",0x4c2ccc0c,"borogove.Channel.prepareOutgoingMessage","borogove/Chat.hx",2082,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2103_correctMessage,"borogove.Channel","correctMessage",0x85df7995,"borogove.Channel.correctMessage","borogove/Chat.hx",2103,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2110_correctMessage,"borogove.Channel","correctMessage",0x85df7995,"borogove.Channel.correctMessage","borogove/Chat.hx",2110,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2097_correctMessage,"borogove.Channel","correctMessage",0x85df7995,"borogove.Channel.correctMessage","borogove/Chat.hx",2097,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2125_sendMessage,"borogove.Channel","sendMessage",0xf452e747,"borogove.Channel.sendMessage","borogove/Chat.hx",2125,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2117_sendMessage,"borogove.Channel","sendMessage",0xf452e747,"borogove.Channel.sendMessage","borogove/Chat.hx",2117,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2140_sendMessage,"borogove.Channel","sendMessage",0xf452e747,"borogove.Channel.sendMessage","borogove/Chat.hx",2140,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2138_sendMessage,"borogove.Channel","sendMessage",0xf452e747,"borogove.Channel.sendMessage","borogove/Chat.hx",2138,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2146_sendMessage,"borogove.Channel","sendMessage",0xf452e747,"borogove.Channel.sendMessage","borogove/Chat.hx",2146,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2181_removeReaction,"borogove.Channel","removeReaction",0x52276725,"borogove.Channel.removeReaction","borogove/Chat.hx",2181,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2157_removeReaction,"borogove.Channel","removeReaction",0x52276725,"borogove.Channel.removeReaction","borogove/Chat.hx",2157,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2175_removeReaction,"borogove.Channel","removeReaction",0x52276725,"borogove.Channel.removeReaction","borogove/Chat.hx",2175,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2193_sendMessageStanza,"borogove.Channel","sendMessageStanza",0x9ef9e89c,"borogove.Channel.sendMessageStanza","borogove/Chat.hx",2193,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2187_sendMessageStanza,"borogove.Channel","sendMessageStanza",0x9ef9e89c,"borogove.Channel.sendMessageStanza","borogove/Chat.hx",2187,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2198_markReadUpTo,"borogove.Channel","markReadUpTo",0x4caa3571,"borogove.Channel.markReadUpTo","borogove/Chat.hx",2198,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2213_markReadUpTo,"borogove.Channel","markReadUpTo",0x4caa3571,"borogove.Channel.markReadUpTo","borogove/Chat.hx",2213,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2197_markReadUpTo,"borogove.Channel","markReadUpTo",0x4caa3571,"borogove.Channel.markReadUpTo","borogove/Chat.hx",2197,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2239_bookmark,"borogove.Channel","bookmark",0x0c8bedce,"borogove.Channel.bookmark","borogove/Chat.hx",2239,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2257_bookmark,"borogove.Channel","bookmark",0x0c8bedce,"borogove.Channel.bookmark","borogove/Chat.hx",2257,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2217_bookmark,"borogove.Channel","bookmark",0x0c8bedce,"borogove.Channel.bookmark","borogove/Chat.hx",2217,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2268_sendChatState,"borogove.Channel","sendChatState",0xbd4bc999,"borogove.Channel.sendChatState","borogove/Chat.hx",2268,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_2284_close,"borogove.Channel","close",0x113b97a0,"borogove.Channel.close","borogove/Chat.hx",2284,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_bf6e937f28c6df5e_1430_boot,"borogove.Channel","boot",0xaa79794a,"borogove.Channel.boot","borogove/Chat.hx",1430,0x1763ae98)
 namespace borogove{
 
-void Channel_obj::__construct( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy, ::borogove::Caps disco){
+void Channel_obj::__construct( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy, ::borogove::Caps disco){
             		int uiState = __o_uiState.Default(1);
+            		bool isBookmarked = __o_isBookmarked.Default(false);
             		bool isBlocked = __o_isBlocked.Default(false);
-            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1236_new)
-HXLINE(1243)		this->_nickInUse = null();
-HXLINE(1242)		this->forceLive = false;
-HXLINE(1241)		this->sync = null();
-HXLINE(1240)		this->inSync = false;
-HXLINE(1238)		this->disco =  ::borogove::Caps_obj::__alloc( HX_CTX ,HX_("",00,00,00,00),::Array_obj< ::Dynamic>::__new(0),::Array_obj< ::String >::fromData( _hx_array_data_da6a8256_1,1),::Array_obj< ::Dynamic>::__new(0),null());
-HXLINE(1247)		super::__construct(client,stream,persistence,chatId,uiState,isBlocked,extensions,readUpToId,readUpToBy,null());
-HXLINE(1248)		if (::hx::IsNotNull( disco )) {
-HXLINE(1249)			this->disco = disco;
-HXLINE(1250)			if (!(disco->features->contains(HX_("http://jabber.org/protocol/muc",07,b2,7f,c6)))) {
-HXLINE(1252)				this->forceLive = true;
-HXLINE(1253)				this->outbox->start();
+            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1430_new)
+HXLINE(1446)		this->lastMessageSenderName = null();
+HXLINE(1445)		this->sortId = null();
+HXLINE(1444)		this->membersForName = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1442)		this->mavUntil = null();
+HXLINE(1440)		this->self = null();
+HXLINE(1438)		this->forceLive = false;
+HXLINE(1437)		this->sync = null();
+HXLINE(1436)		this->joinFailed = null();
+HXLINE(1434)		this->inSync = false;
+HXLINE(1432)		this->disco =  ::borogove::Caps_obj::__alloc( HX_CTX ,HX_("",00,00,00,00),::Array_obj< ::Dynamic>::__new(0),::Array_obj< ::String >::fromData( _hx_array_data_da6a8256_1,1),::Array_obj< ::Dynamic>::__new(0),null());
+HXLINE(1450)		super::__construct(client,stream,persistence,chatId,uiState,isBookmarked,isBlocked,extensions,readUpToId,readUpToBy,null());
+HXLINE(1451)		if (::hx::IsNotNull( disco )) {
+HXLINE(1452)			this->disco = disco;
+HXLINE(1453)			if (!(disco->features->contains(HX_("http://jabber.org/protocol/muc",07,b2,7f,c6)))) {
+HXLINE(1455)				this->forceLive = true;
+HXLINE(1456)				this->outbox->start();
             			}
             		}
             	}
@@ -257,13 +325,17 @@ void *Channel_obj::_hx_vtable = 0;
 Dynamic Channel_obj::__Create(::hx::DynamicArray inArgs)
 {
 	::hx::ObjectPtr< Channel_obj > _hx_result = new Channel_obj();
-	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2],inArgs[3],inArgs[4],inArgs[5],inArgs[6],inArgs[7],inArgs[8],inArgs[9]);
+	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2],inArgs[3],inArgs[4],inArgs[5],inArgs[6],inArgs[7],inArgs[8],inArgs[9],inArgs[10]);
 	return _hx_result;
 }
 
 bool Channel_obj::_hx_isInstanceOf(int inClassId) {
-	if (inClassId<=(int)0x2acf7e59) {
-		return inClassId==(int)0x00000001 || inClassId==(int)0x2acf7e59;
+	if (inClassId<=(int)0x4fb834f5) {
+		if (inClassId<=(int)0x2acf7e59) {
+			return inClassId==(int)0x00000001 || inClassId==(int)0x2acf7e59;
+		} else {
+			return inClassId==(int)0x4fb834f5;
+		}
 	} else {
 		return inClassId==(int)0x7f70c446;
 	}
@@ -274,787 +346,1090 @@ void Channel_obj::selfPing(bool refresh){
             		void _hx_run(){
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::borogove::Channel,_gthis) HXARGC(1)
             			void _hx_run( ::borogove::Stanza response){
-            				HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1284_selfPing)
-HXLINE(1284)				if ((( (::String)(::Reflect_obj::field(response->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
-HXLINE(1285)					 ::borogove::Stanza tmp = response->getChild(HX_("error",c8,cb,29,73),null());
-HXDLIN(1285)					 ::borogove::Stanza err;
-HXDLIN(1285)					if (::hx::IsNotNull( tmp )) {
-HXLINE(1285)						err = tmp->getChild(null(),HX_("urn:ietf:params:xml:ns:xmpp-stanzas",27,f2,3d,30));
+            				HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1487_selfPing)
+HXLINE(1487)				if ((( (::String)(::Reflect_obj::field(response->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
+HXLINE(1488)					 ::borogove::Stanza tmp = response->getChild(HX_("error",c8,cb,29,73),null());
+HXDLIN(1488)					 ::borogove::Stanza err;
+HXDLIN(1488)					if (::hx::IsNotNull( tmp )) {
+HXLINE(1488)						err = tmp->getChild(null(),HX_("urn:ietf:params:xml:ns:xmpp-stanzas",27,f2,3d,30));
             					}
             					else {
-HXLINE(1285)						err = null();
+HXLINE(1488)						err = null();
             					}
-HXLINE(1286)					bool _hx_tmp;
-HXDLIN(1286)					if ((err->name != HX_("service-unavailable",f8,3c,11,1c))) {
-HXLINE(1286)						_hx_tmp = (err->name == HX_("feature-not-implemented",71,20,2e,96));
+HXLINE(1489)					bool _hx_tmp;
+HXDLIN(1489)					if ((err->name != HX_("service-unavailable",f8,3c,11,1c))) {
+HXLINE(1489)						_hx_tmp = (err->name == HX_("feature-not-implemented",71,20,2e,96));
             					}
             					else {
-HXLINE(1286)						_hx_tmp = true;
+HXLINE(1489)						_hx_tmp = true;
             					}
-HXDLIN(1286)					if (_hx_tmp) {
-HXLINE(1286)						_gthis->selfPingSuccess();
-HXDLIN(1286)						return;
+HXDLIN(1489)					if (_hx_tmp) {
+HXLINE(1489)						_gthis->selfPingSuccess();
+HXDLIN(1489)						return;
             					}
-HXLINE(1287)					bool _hx_tmp1;
-HXDLIN(1287)					if ((err->name != HX_("remote-server-not-found",e5,4f,ca,aa))) {
-HXLINE(1287)						_hx_tmp1 = (err->name == HX_("remote-server-timeout",fe,b0,ee,1a));
+HXLINE(1490)					bool _hx_tmp1;
+HXDLIN(1490)					if ((err->name != HX_("remote-server-not-found",e5,4f,ca,aa))) {
+HXLINE(1490)						_hx_tmp1 = (err->name == HX_("remote-server-timeout",fe,b0,ee,1a));
             					}
             					else {
-HXLINE(1287)						_hx_tmp1 = true;
+HXLINE(1490)						_hx_tmp1 = true;
             					}
-HXDLIN(1287)					if (_hx_tmp1) {
-HXLINE(1287)						_gthis->selfPingSuccess();
-HXDLIN(1287)						return;
+HXDLIN(1490)					if (_hx_tmp1) {
+HXLINE(1490)						_gthis->selfPingSuccess();
+HXDLIN(1490)						return;
             					}
-HXLINE(1288)					if ((err->name == HX_("item-not-found",4e,b5,9b,5b))) {
-HXLINE(1288)						_gthis->selfPingSuccess();
-HXDLIN(1288)						return;
+HXLINE(1491)					if ((err->name == HX_("item-not-found",4e,b5,9b,5b))) {
+HXLINE(1491)						_gthis->selfPingSuccess();
+HXDLIN(1491)						return;
             					}
-HXLINE(1289)					::haxe::Log_obj::trace(HX_("SYNC: self-ping fail, join",ea,45,f2,f0), ::Dynamic(::hx::Anon_obj::Create(5)
+HXLINE(1492)					::haxe::Log_obj::trace(HX_("SYNC: self-ping fail, join",ea,45,f2,f0), ::Dynamic(::hx::Anon_obj::Create(5)
             						->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Channel",56,82,6a,da))
             						->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis->chatId))
             						->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("selfPing",1e,60,3c,38))
             						->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Chat.hx",98,ae,63,17))
-            						->setFixed(4,HX_("lineNumber",dd,81,22,76),1289)));
-HXLINE(1290)					_gthis->join();
+            						->setFixed(4,HX_("lineNumber",dd,81,22,76),1492)));
+HXLINE(1493)					_gthis->join();
             				}
             				else {
-HXLINE(1292)					_gthis->selfPingSuccess();
+HXLINE(1495)					_gthis->selfPingSuccess();
             				}
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1273_selfPing)
-HXLINE(1274)			if (!(_gthis->disco->features->contains(HX_("http://jabber.org/protocol/muc",07,b2,7f,c6)))) {
-HXLINE(1276)				_gthis->forceLive = true;
-HXLINE(1277)				_gthis->outbox->start();
-HXLINE(1278)				return;
+            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1476_selfPing)
+HXLINE(1477)			if (!(_gthis->disco->features->contains(HX_("http://jabber.org/protocol/muc",07,b2,7f,c6)))) {
+HXLINE(1479)				_gthis->forceLive = true;
+HXLINE(1480)				_gthis->outbox->start();
+HXLINE(1481)				return;
             			}
-HXLINE(1280)			 ::borogove::GenericStream _gthis1 = _gthis->stream;
-HXLINE(1281)			::String _hx_tmp = _gthis->getFullJid()->asString();
-HXLINE(1280)			_gthis1->sendIq( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE(1483)			 ::borogove::GenericStream _gthis1 = _gthis->stream;
+HXLINE(1484)			::String _hx_tmp = _gthis->getFullJid()->asString();
+HXLINE(1483)			_gthis1->sendIq( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("to",7b,65,00,00),_hx_tmp)
             				->setFixed(1,HX_("type",ba,f2,08,4d),HX_("get",96,80,4e,00))))->tag(HX_("ping",72,f2,57,4a), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:ping",8e,30,3f,fd))))->up(), ::Dynamic(new _hx_Closure_2(_gthis)));
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1259_selfPing)
-HXDLIN(1259)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1260)		if ((this->uiState == 3)) {
-HXLINE(1260)			return;
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1462_selfPing)
+HXDLIN(1462)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1463)		if ((this->uiState == 3)) {
+HXLINE(1463)			return;
             		}
-HXLINE(1262)		if ((this->uiState == 2)) {
+HXLINE(1465)		if ((this->uiState == 2)) {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             			 ::borogove::Stanza _hx_run( ::borogove::Stanza stanza){
-            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1265_selfPing)
-HXLINE(1266)				::Reflect_obj::setField(stanza->attr,HX_("type",ba,f2,08,4d),HX_("unavailable",50,e0,29,fd));
-HXLINE(1267)				return stanza;
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1468_selfPing)
+HXLINE(1469)				::Reflect_obj::setField(stanza->attr,HX_("type",ba,f2,08,4d),HX_("unavailable",50,e0,29,fd));
+HXLINE(1470)				return stanza;
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1263)			 ::borogove::Client _hx_tmp = this->client;
-HXDLIN(1263)			_hx_tmp->sendPresence(this->getFullJid()->asString(), ::Dynamic(new _hx_Closure_0()));
-HXLINE(1270)			return;
+HXLINE(1466)			 ::borogove::Client _hx_tmp = this->client;
+HXDLIN(1466)			_hx_tmp->sendPresence(this->getFullJid()->asString(), ::Dynamic(new _hx_Closure_0()));
+HXLINE(1473)			return;
             		}
-HXLINE(1273)		 ::Dynamic _hx_tmp1;
-HXDLIN(1273)		if (refresh) {
-HXLINE(1273)			_hx_tmp1 = this->refreshDisco_dyn();
+HXLINE(1476)		 ::Dynamic _hx_tmp1;
+HXDLIN(1476)		if (refresh) {
+HXLINE(1476)			_hx_tmp1 = this->refreshDisco_dyn();
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             			void _hx_run( ::Dynamic cb){
-            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1273_selfPing)
-HXLINE(1273)				cb();
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1476_selfPing)
+HXLINE(1476)				cb();
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXLINE(1273)			_hx_tmp1 =  ::Dynamic(new _hx_Closure_1());
+HXLINE(1476)			_hx_tmp1 =  ::Dynamic(new _hx_Closure_1());
             		}
-HXDLIN(1273)		_hx_tmp1( ::Dynamic(new _hx_Closure_3(_gthis)));
+HXDLIN(1476)		_hx_tmp1( ::Dynamic(new _hx_Closure_3(_gthis)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Channel_obj,selfPing,(void))
 
-void Channel_obj::join(){
-            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis) HXARGC(1)
-            		 ::borogove::Stanza _hx_run( ::borogove::Stanza stanza){
-            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1314_join)
-HXLINE(1315)			stanza->tag(HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
-            				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/muc",07,b2,7f,c6))));
-HXLINE(1316)			if (_gthis->disco->features->contains(HX_("urn:xmpp:mam:2",f5,ef,8c,da))) {
-HXLINE(1316)				stanza->tag(HX_("history",54,35,47,64), ::Dynamic(::hx::Anon_obj::Create(1)
-            					->setFixed(0,HX_("maxchars",b9,7f,a3,5c),HX_("0",30,00,00,00))))->up();
+::Dynamic Channel_obj::join(){
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::borogove::Channel,_gthis) HXARGC(1)
+            		::Dynamic _hx_run(bool _){
+            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis) HXARGC(1)
+            			 ::borogove::Stanza _hx_run( ::borogove::Stanza stanza){
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1517_join)
+HXLINE(1518)				 ::Dynamic mavAttr =  ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:muc:affiliations:1",75,28,1f,fe)));
+HXLINE(1519)				if (::hx::IsNotNull( _gthis->mavUntil )) {
+HXLINE(1519)					::Reflect_obj::setField(mavAttr,HX_("since",ba,eb,cf,7c),_gthis->mavUntil);
+            				}
+HXLINE(1520)				stanza->tag(HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/muc",07,b2,7f,c6))))->tag(HX_("mav",a2,0a,53,00),mavAttr)->up();
+HXLINE(1522)				if (_gthis->disco->features->contains(HX_("urn:xmpp:mam:2",f5,ef,8c,da))) {
+HXLINE(1522)					stanza->tag(HX_("history",54,35,47,64), ::Dynamic(::hx::Anon_obj::Create(1)
+            						->setFixed(0,HX_("maxchars",b9,7f,a3,5c),HX_("0",30,00,00,00))))->up();
+            				}
+HXLINE(1524)				stanza->up();
+HXLINE(1525)				return stanza;
+            			}
+            			HX_END_LOCAL_FUNC1(return)
+
+            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis) HXARGC(1)
+            			void _hx_run( ::borogove::ChatMessage point){
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1528_join)
+HXLINE(1528)				_gthis->doSync(point,null());
             			}
-HXLINE(1318)			stanza->up();
-HXLINE(1319)			return stanza;
+            			HX_END_LOCAL_FUNC1((void))
+
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1509_join)
+HXLINE(1510)			_gthis->self = null();
+HXLINE(1511)			_gthis->outbox->pause();
+HXLINE(1512)			_gthis->inSync = false;
+HXLINE(1513)			_gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
+HXLINE(1514)			 ::borogove::JID desiredFullJid = ::borogove::JID_obj::parse(_gthis->chatId);
+HXDLIN(1514)			 ::borogove::JID desiredFullJid1 = desiredFullJid->withResource(_gthis->client->displayName());
+HXLINE(1515)			 ::borogove::Client _gthis1 = _gthis->client;
+HXDLIN(1515)			_gthis1->sendPresence(desiredFullJid1->asString(), ::Dynamic(new _hx_Closure_0(_gthis)));
+HXLINE(1528)			::Dynamic _gthis2 = _gthis->persistence;
+HXDLIN(1528)			::String _hx_tmp = _gthis->client->accountId();
+HXDLIN(1528)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::syncPoint(_gthis2,_hx_tmp,_gthis->chatId), ::Dynamic(new _hx_Closure_1(_gthis)),null());
+HXLINE(1530)			return null();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1300_join)
-HXDLIN(1300)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1301)		bool _hx_tmp;
-HXDLIN(1301)		if ((this->uiState != 3)) {
-HXLINE(1301)			_hx_tmp = (this->uiState == 2);
-            		}
-            		else {
-HXLINE(1301)			_hx_tmp = true;
-            		}
-HXDLIN(1301)		if (_hx_tmp) {
-HXLINE(1303)			return;
-            		}
-HXLINE(1306)		this->presence =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(1307)		this->_nickInUse = null();
-HXLINE(1308)		this->outbox->pause();
-HXLINE(1309)		this->inSync = false;
-HXLINE(1310)		this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
-HXLINE(1311)		 ::borogove::JID desiredFullJid = ::borogove::JID_obj::parse(this->chatId);
-HXDLIN(1311)		 ::borogove::JID desiredFullJid1 = desiredFullJid->withResource(this->client->displayName());
-HXLINE(1312)		 ::borogove::Client _hx_tmp1 = this->client;
-HXDLIN(1312)		_hx_tmp1->sendPresence(desiredFullJid1->asString(), ::Dynamic(new _hx_Closure_0(_gthis)));
-HXLINE(1322)		::Dynamic _hx_tmp2 = this->persistence;
-HXDLIN(1322)		::String _hx_tmp3 = this->client->accountId();
-HXDLIN(1322)		::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::lastId(_hx_tmp2,_hx_tmp3,this->chatId),this->doSync_dyn(),null());
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1503_join)
+HXDLIN(1503)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1504)		bool _hx_tmp;
+HXDLIN(1504)		if ((this->uiState != 3)) {
+HXLINE(1504)			_hx_tmp = (this->uiState == 2);
+            		}
+            		else {
+HXLINE(1504)			_hx_tmp = true;
+            		}
+HXDLIN(1504)		if (_hx_tmp) {
+HXLINE(1506)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            		}
+HXLINE(1509)		::Dynamic _hx_tmp1 = this->persistence;
+HXDLIN(1509)		::String _hx_tmp2 = this->client->accountId();
+HXDLIN(1509)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::clearMemberPresence(_hx_tmp1,_hx_tmp2,this->chatId), ::Dynamic(new _hx_Closure_2(_gthis)),null());
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC0(Channel_obj,join,(void))
+HX_DEFINE_DYNAMIC_FUNC0(Channel_obj,join,return )
 
 void Channel_obj::selfPingSuccess(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1325_selfPingSuccess)
-HXLINE(1326)		::String _hx_tmp = this->nickInUse();
-HXDLIN(1326)		if ((_hx_tmp != this->client->displayName())) {
-HXLINE(1327)			 ::borogove::JID desiredFullJid = ::borogove::JID_obj::parse(this->chatId);
-HXDLIN(1327)			 ::borogove::JID desiredFullJid1 = desiredFullJid->withResource(this->client->displayName());
-HXLINE(1328)			 ::borogove::Client _hx_tmp1 = this->client;
-HXDLIN(1328)			_hx_tmp1->sendPresence(desiredFullJid1->asString(),null());
-            		}
-HXLINE(1332)		this->inSync = false;
-HXLINE(1333)		::Dynamic _hx_tmp2 = this->persistence;
-HXDLIN(1333)		::String _hx_tmp3 = this->client->accountId();
-HXDLIN(1333)		::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::lastId(_hx_tmp2,_hx_tmp3,this->chatId),this->doSync_dyn(),null());
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis) HXARGC(1)
+            		void _hx_run( ::borogove::ChatMessage point){
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1542_selfPingSuccess)
+HXLINE(1542)			_gthis->doSync(point,null());
+            		}
+            		HX_END_LOCAL_FUNC1((void))
+
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1534_selfPingSuccess)
+HXDLIN(1534)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1535)		::String _hx_tmp = this->nickInUse();
+HXDLIN(1535)		if ((_hx_tmp != this->client->displayName())) {
+HXLINE(1536)			 ::borogove::JID desiredFullJid = ::borogove::JID_obj::parse(this->chatId);
+HXDLIN(1536)			 ::borogove::JID desiredFullJid1 = desiredFullJid->withResource(this->client->displayName());
+HXLINE(1537)			 ::borogove::Client _hx_tmp1 = this->client;
+HXDLIN(1537)			_hx_tmp1->sendPresence(desiredFullJid1->asString(),null());
+            		}
+HXLINE(1541)		this->inSync = false;
+HXLINE(1542)		::Dynamic _hx_tmp2 = this->persistence;
+HXDLIN(1542)		::String _hx_tmp3 = this->client->accountId();
+HXDLIN(1542)		::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::syncPoint(_hx_tmp2,_hx_tmp3,this->chatId), ::Dynamic(new _hx_Closure_0(_gthis)),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Channel_obj,selfPingSuccess,(void))
 
 ::String Channel_obj::getDisplayName(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1336_getDisplayName)
-HXLINE(1337)		if ((this->displayName == this->chatId)) {
-HXLINE(1338)			 ::borogove::Stanza tmp = this->info();
-HXDLIN(1338)			 ::borogove::Stanza tmp1;
-HXDLIN(1338)			if (::hx::IsNotNull( tmp )) {
-HXLINE(1338)				tmp1 = ::borogove::_DataForm::DataForm_Impl__obj::field(tmp,HX_("muc#roomconfig_roomname",c0,87,9a,72));
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1545_getDisplayName)
+HXLINE(1546)		::String name = this->super::getDisplayName();
+HXLINE(1547)		if ((name == this->chatId)) {
+HXLINE(1548)			 ::borogove::Stanza tmp = this->info();
+HXDLIN(1548)			 ::borogove::Stanza tmp1;
+HXDLIN(1548)			if (::hx::IsNotNull( tmp )) {
+HXLINE(1548)				tmp1 = ::borogove::_DataForm::DataForm_Impl__obj::field(tmp,HX_("muc#roomconfig_roomname",c0,87,9a,72));
+            			}
+            			else {
+HXLINE(1548)				tmp1 = null();
+            			}
+HXDLIN(1548)			::Array< ::String > tmp2;
+HXDLIN(1548)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE(1548)				tmp2 = ::borogove::_DataForm::Field_Impl__obj::get_value(tmp1);
             			}
             			else {
-HXLINE(1338)				tmp1 = null();
+HXLINE(1548)				tmp2 = null();
             			}
-HXDLIN(1338)			::Array< ::String > tmp2;
-HXDLIN(1338)			if (::hx::IsNotNull( tmp1 )) {
-HXLINE(1338)				tmp2 = ::borogove::_DataForm::Field_Impl__obj::get_value(tmp1);
+HXDLIN(1548)			::Array< ::String > title;
+HXDLIN(1548)			if (::hx::IsNotNull( tmp2 )) {
+HXLINE(1548)				title = tmp2;
             			}
             			else {
-HXLINE(1338)				tmp2 = null();
+HXLINE(1548)				title = ::Array_obj< ::String >::__new(0);
             			}
-HXDLIN(1338)			::Array< ::String > title;
-HXDLIN(1338)			if (::hx::IsNotNull( tmp2 )) {
-HXLINE(1338)				title = tmp2;
+HXDLIN(1548)			::String title1 = title->join(HX_("\n",0a,00,00,00));
+HXLINE(1549)			bool _hx_tmp;
+HXDLIN(1549)			if (::hx::IsNotNull( title1 )) {
+HXLINE(1549)				_hx_tmp = (title1 != HX_("",00,00,00,00));
             			}
             			else {
-HXLINE(1338)				title = ::Array_obj< ::String >::__new(0);
+HXLINE(1549)				_hx_tmp = false;
             			}
-HXDLIN(1338)			::String title1 = title->join(HX_("\n",0a,00,00,00));
-HXLINE(1339)			bool _hx_tmp;
-HXDLIN(1339)			if (::hx::IsNotNull( title1 )) {
-HXLINE(1339)				_hx_tmp = (title1 != HX_("",00,00,00,00));
+HXDLIN(1549)			if (_hx_tmp) {
+HXLINE(1549)				return title1;
+            			}
+HXLINE(1551)			bool _hx_tmp1;
+HXDLIN(1551)			bool _hx_tmp2;
+HXDLIN(1551)			if (::hx::IsNotNull( this->membersForName )) {
+HXLINE(1551)				_hx_tmp2 = (this->membersForName->length > 0);
             			}
             			else {
-HXLINE(1339)				_hx_tmp = false;
+HXLINE(1551)				_hx_tmp2 = false;
+            			}
+HXDLIN(1551)			if (_hx_tmp2) {
+HXLINE(1551)				_hx_tmp1 = (this->membersForName->length < 20);
             			}
-HXDLIN(1339)			if (_hx_tmp) {
-HXLINE(1339)				return title1;
+            			else {
+HXLINE(1551)				_hx_tmp1 = false;
+            			}
+HXDLIN(1551)			if (_hx_tmp1) {
+HXLINE(1551)				::Array< ::Dynamic> _this = this->membersForName;
+HXDLIN(1551)				::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN(1551)				{
+HXLINE(1551)					int _g = 0;
+HXDLIN(1551)					int _g1 = _this->length;
+HXDLIN(1551)					while((_g < _g1)){
+HXLINE(1551)						_g = (_g + 1);
+HXDLIN(1551)						int i = (_g - 1);
+HXDLIN(1551)						{
+HXLINE(1551)							::String inValue = ( (::String)(_hx_array_unsafe_get(_this,i)->__Field(HX_("displayName",ad,11,f2,30),::hx::paccDynamic)) );
+HXDLIN(1551)							result->__unsafe_set(i,inValue);
+            						}
+            					}
+            				}
+HXDLIN(1551)				return result->join(HX_(", ",74,26,00,00));
             			}
             		}
-HXLINE(1342)		return this->super::getDisplayName();
+HXLINE(1554)		return name;
+            	}
+
+
+::String Channel_obj::subject(){
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1561_subject)
+HXDLIN(1561)		::String tmp = this->threads->get_string(::borogove::_Chat::Chat_Fields__obj::nullSentinel);
+HXDLIN(1561)		if (::hx::IsNotNull( tmp )) {
+HXDLIN(1561)			return tmp;
+            		}
+            		else {
+HXDLIN(1561)			return HX_("",00,00,00,00);
+            		}
+HXDLIN(1561)		return null();
             	}
 
 
+HX_DEFINE_DYNAMIC_FUNC0(Channel_obj,subject,return )
+
 ::String Channel_obj::description(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1346_description)
-HXDLIN(1346)		 ::borogove::Stanza tmp = this->info();
-HXDLIN(1346)		 ::borogove::Stanza tmp1;
-HXDLIN(1346)		if (::hx::IsNotNull( tmp )) {
-HXDLIN(1346)			tmp1 = ::borogove::_DataForm::DataForm_Impl__obj::field(tmp,HX_("muc#roominfo_description",4e,e4,04,f2));
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1568_description)
+HXDLIN(1568)		 ::borogove::Stanza tmp = this->info();
+HXDLIN(1568)		 ::borogove::Stanza tmp1;
+HXDLIN(1568)		if (::hx::IsNotNull( tmp )) {
+HXDLIN(1568)			tmp1 = ::borogove::_DataForm::DataForm_Impl__obj::field(tmp,HX_("muc#roominfo_description",4e,e4,04,f2));
             		}
             		else {
-HXDLIN(1346)			tmp1 = null();
+HXDLIN(1568)			tmp1 = null();
             		}
-HXDLIN(1346)		::Array< ::String > tmp2;
-HXDLIN(1346)		if (::hx::IsNotNull( tmp1 )) {
-HXDLIN(1346)			tmp2 = ::borogove::_DataForm::Field_Impl__obj::get_value(tmp1);
+HXDLIN(1568)		::Array< ::String > tmp2;
+HXDLIN(1568)		if (::hx::IsNotNull( tmp1 )) {
+HXDLIN(1568)			tmp2 = ::borogove::_DataForm::Field_Impl__obj::get_value(tmp1);
             		}
             		else {
-HXDLIN(1346)			tmp2 = null();
+HXDLIN(1568)			tmp2 = null();
             		}
-HXDLIN(1346)		::Array< ::String > _hx_tmp;
-HXDLIN(1346)		if (::hx::IsNotNull( tmp2 )) {
-HXDLIN(1346)			_hx_tmp = tmp2;
+HXDLIN(1568)		::Array< ::String > _hx_tmp;
+HXDLIN(1568)		if (::hx::IsNotNull( tmp2 )) {
+HXDLIN(1568)			_hx_tmp = tmp2;
             		}
             		else {
-HXDLIN(1346)			_hx_tmp = ::Array_obj< ::String >::__new(0);
+HXDLIN(1568)			_hx_tmp = ::Array_obj< ::String >::__new(0);
             		}
-HXDLIN(1346)		return _hx_tmp->join(HX_("\n",0a,00,00,00));
+HXDLIN(1568)		return _hx_tmp->join(HX_("\n",0a,00,00,00));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Channel_obj,description,return )
 
  ::borogove::Stanza Channel_obj::info(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1350_info)
-HXDLIN(1350)		 ::borogove::Caps tmp = this->disco;
-HXDLIN(1350)		::Array< ::Dynamic> tmp1;
-HXDLIN(1350)		if (::hx::IsNotNull( tmp )) {
-HXDLIN(1350)			tmp1 = tmp->data;
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1572_info)
+HXDLIN(1572)		 ::borogove::Caps tmp = this->disco;
+HXDLIN(1572)		::Array< ::Dynamic> tmp1;
+HXDLIN(1572)		if (::hx::IsNotNull( tmp )) {
+HXDLIN(1572)			tmp1 = tmp->data;
             		}
             		else {
-HXDLIN(1350)			tmp1 = null();
+HXDLIN(1572)			tmp1 = null();
             		}
-HXDLIN(1350)		if (::hx::IsNotNull( tmp1 )) {
+HXDLIN(1572)		if (::hx::IsNotNull( tmp1 )) {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             			bool _hx_run( ::borogove::Stanza d){
-            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1350_info)
-HXDLIN(1350)				 ::borogove::Stanza tmp = ::borogove::_DataForm::DataForm_Impl__obj::field(d,HX_("FORM_TYPE",d5,96,c9,5a));
-HXDLIN(1350)				::Array< ::String > tmp1;
-HXDLIN(1350)				if (::hx::IsNotNull( tmp )) {
-HXDLIN(1350)					tmp1 = ::borogove::_DataForm::Field_Impl__obj::get_value(tmp);
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1572_info)
+HXDLIN(1572)				 ::borogove::Stanza tmp = ::borogove::_DataForm::DataForm_Impl__obj::field(d,HX_("FORM_TYPE",d5,96,c9,5a));
+HXDLIN(1572)				::Array< ::String > tmp1;
+HXDLIN(1572)				if (::hx::IsNotNull( tmp )) {
+HXDLIN(1572)					tmp1 = ::borogove::_DataForm::Field_Impl__obj::get_value(tmp);
             				}
             				else {
-HXDLIN(1350)					tmp1 = null();
+HXDLIN(1572)					tmp1 = null();
             				}
-HXDLIN(1350)				::String _hx_tmp;
-HXDLIN(1350)				if (::hx::IsNotNull( tmp1 )) {
-HXDLIN(1350)					_hx_tmp = tmp1->__get(0);
+HXDLIN(1572)				::String _hx_tmp;
+HXDLIN(1572)				if (::hx::IsNotNull( tmp1 )) {
+HXDLIN(1572)					_hx_tmp = tmp1->__get(0);
             				}
             				else {
-HXDLIN(1350)					_hx_tmp = null();
+HXDLIN(1572)					_hx_tmp = null();
             				}
-HXDLIN(1350)				return (_hx_tmp == HX_("http://jabber.org/protocol/muc#roominfo",45,80,4f,bc));
+HXDLIN(1572)				return (_hx_tmp == HX_("http://jabber.org/protocol/muc#roominfo",45,80,4f,bc));
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-HXDLIN(1350)			return ( ( ::borogove::Stanza)(::Lambda_obj::find(tmp1, ::Dynamic(new _hx_Closure_0()))) );
+HXDLIN(1572)			return ( ( ::borogove::Stanza)(::Lambda_obj::find(tmp1, ::Dynamic(new _hx_Closure_0()))) );
             		}
             		else {
-HXDLIN(1350)			return null();
+HXDLIN(1572)			return null();
             		}
-HXDLIN(1350)		return null();
+HXDLIN(1572)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Channel_obj,info,return )
 
 void Channel_obj::invite( ::borogove::Chat chat,::String threadId){
-            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1354_invite)
-HXLINE(1355)		if (this->isPrivate()) {
-HXLINE(1356)			 ::borogove::Client _hx_tmp = this->client;
-HXDLIN(1356)			_hx_tmp->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1575_invite)
+HXLINE(1576)		if (this->isPrivate()) {
+HXLINE(1577)			 ::borogove::Client _hx_tmp = this->client;
+HXDLIN(1577)			_hx_tmp->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("to",7b,65,00,00),this->chatId)))->tag(HX_("query",08,8b,ea,5d), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/muc#admin",d3,be,2f,5a))))->tag(HX_("item",13,c5,bf,45), ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("affiliation",b0,1a,35,a1),HX_("member",5a,e2,b5,04))
             				->setFixed(1,HX_("jid",c5,ca,50,00),chat->chatId)))->up()->up());
             		}
-HXLINE(1364)		this->super::invite(chat,threadId);
+HXLINE(1585)		this->super::invite(chat,threadId);
             	}
 
 
 bool Channel_obj::canInvite(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1367_canInvite)
-HXLINE(1368)		if (!(this->isPrivate())) {
-HXLINE(1368)			return true;
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1588_canInvite)
+HXLINE(1589)		if (!(this->isPrivate())) {
+HXLINE(1589)			return true;
             		}
-HXLINE(1369)		if (::hx::IsNull( this->_nickInUse )) {
-HXLINE(1369)			return false;
+HXLINE(1590)		if (::hx::IsNull( this->self )) {
+HXLINE(1590)			return false;
             		}
-HXLINE(1371)		 ::borogove::Presence p = ( ( ::borogove::Presence)(this->presence->get(this->_nickInUse)) );
-HXLINE(1372)		if (::hx::IsNull( p )) {
-HXLINE(1372)			return false;
+HXLINE(1592)		 ::Dynamic it = this->self->presence->iterator();
+HXLINE(1593)		if (!(( (bool)(it->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) ))) {
+HXLINE(1593)			return false;
             		}
-HXLINE(1374)		::String _hx_tmp;
-HXDLIN(1374)		 ::borogove::Stanza tmp = p->mucUser->getChild(HX_("item",13,c5,bf,45),null());
-HXDLIN(1374)		 ::Dynamic tmp1;
-HXDLIN(1374)		if (::hx::IsNotNull( tmp )) {
-HXLINE(1374)			tmp1 = tmp->attr;
+HXLINE(1595)		::String _hx_tmp;
+HXDLIN(1595)		 ::borogove::Stanza tmp = ( ( ::borogove::Stanza)(it->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) )->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14))->getChild(HX_("item",13,c5,bf,45),null());
+HXDLIN(1595)		 ::Dynamic tmp1;
+HXDLIN(1595)		if (::hx::IsNotNull( tmp )) {
+HXLINE(1595)			tmp1 = tmp->attr;
             		}
             		else {
-HXLINE(1374)			tmp1 = null();
+HXLINE(1595)			tmp1 = null();
             		}
-HXDLIN(1374)		::String tmp2;
-HXDLIN(1374)		if (::hx::IsNotNull( tmp1 )) {
-HXLINE(1374)			tmp2 = ( (::String)(::Reflect_obj::field(tmp1,HX_("role",76,eb,ae,4b))) );
+HXDLIN(1595)		::String tmp2;
+HXDLIN(1595)		if (::hx::IsNotNull( tmp1 )) {
+HXLINE(1595)			tmp2 = ( (::String)(::Reflect_obj::field(tmp1,HX_("role",76,eb,ae,4b))) );
             		}
             		else {
-HXLINE(1374)			tmp2 = null();
+HXLINE(1595)			tmp2 = null();
             		}
-HXDLIN(1374)		if (::hx::IsNotNull( tmp2 )) {
-HXLINE(1374)			_hx_tmp = tmp2;
+HXDLIN(1595)		if (::hx::IsNotNull( tmp2 )) {
+HXLINE(1595)			_hx_tmp = tmp2;
             		}
             		else {
-HXLINE(1374)			_hx_tmp = HX_("none",b8,12,0a,49);
+HXLINE(1595)			_hx_tmp = HX_("none",b8,12,0a,49);
             		}
-HXDLIN(1374)		if ((_hx_tmp == HX_("moderator",05,40,3b,22))) {
-HXLINE(1374)			return true;
+HXDLIN(1595)		if ((_hx_tmp == HX_("moderator",05,40,3b,22))) {
+HXLINE(1595)			return true;
             		}
-HXLINE(1376)		return false;
+HXLINE(1597)		return false;
             	}
 
 
 bool Channel_obj::canSend(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1379_canSend)
-HXLINE(1380)		if (!(this->super::canSend())) {
-HXLINE(1380)			return false;
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1600_canSend)
+HXLINE(1601)		if (!(this->super::canSend())) {
+HXLINE(1601)			return false;
+            		}
+HXLINE(1602)		if (::hx::IsNull( this->self )) {
+HXLINE(1602)			return true;
+            		}
+HXLINE(1604)		 ::Dynamic it = this->self->presence->iterator();
+HXLINE(1605)		if (!(( (bool)(it->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) ))) {
+HXLINE(1605)			return true;
+            		}
+HXLINE(1607)		::String _hx_tmp;
+HXDLIN(1607)		 ::borogove::Stanza tmp = ( ( ::borogove::Stanza)(it->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) )->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14))->getChild(HX_("item",13,c5,bf,45),null());
+HXDLIN(1607)		 ::Dynamic tmp1;
+HXDLIN(1607)		if (::hx::IsNotNull( tmp )) {
+HXLINE(1607)			tmp1 = tmp->attr;
+            		}
+            		else {
+HXLINE(1607)			tmp1 = null();
             		}
-HXLINE(1381)		if (::hx::IsNull( this->_nickInUse )) {
-HXLINE(1381)			return true;
+HXDLIN(1607)		::String tmp2;
+HXDLIN(1607)		if (::hx::IsNotNull( tmp1 )) {
+HXLINE(1607)			tmp2 = ( (::String)(::Reflect_obj::field(tmp1,HX_("role",76,eb,ae,4b))) );
             		}
-HXLINE(1383)		 ::borogove::Presence p = ( ( ::borogove::Presence)(this->presence->get(this->_nickInUse)) );
-HXLINE(1384)		if (::hx::IsNull( p )) {
-HXLINE(1384)			return true;
+            		else {
+HXLINE(1607)			tmp2 = null();
             		}
-HXLINE(1386)		::String _hx_tmp;
-HXDLIN(1386)		 ::borogove::Stanza tmp = p->mucUser->getChild(HX_("item",13,c5,bf,45),null());
-HXDLIN(1386)		 ::Dynamic tmp1;
-HXDLIN(1386)		if (::hx::IsNotNull( tmp )) {
-HXLINE(1386)			tmp1 = tmp->attr;
+HXDLIN(1607)		if (::hx::IsNotNull( tmp2 )) {
+HXLINE(1607)			_hx_tmp = tmp2;
             		}
             		else {
-HXLINE(1386)			tmp1 = null();
+HXLINE(1607)			_hx_tmp = HX_("none",b8,12,0a,49);
             		}
-HXDLIN(1386)		::String tmp2;
-HXDLIN(1386)		if (::hx::IsNotNull( tmp1 )) {
-HXLINE(1386)			tmp2 = ( (::String)(::Reflect_obj::field(tmp1,HX_("role",76,eb,ae,4b))) );
+HXDLIN(1607)		return (_hx_tmp != HX_("visitor",ae,23,32,a3));
+            	}
+
+
+bool Channel_obj::canModerate(){
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1610_canModerate)
+HXLINE(1611)		bool _hx_tmp;
+HXDLIN(1611)		if (::hx::IsNotNull( this->self )) {
+HXLINE(1611)			_hx_tmp = ::hx::IsNull( this->disco );
             		}
             		else {
-HXLINE(1386)			tmp2 = null();
+HXLINE(1611)			_hx_tmp = true;
             		}
-HXDLIN(1386)		if (::hx::IsNotNull( tmp2 )) {
-HXLINE(1386)			_hx_tmp = tmp2;
+HXDLIN(1611)		if (_hx_tmp) {
+HXLINE(1611)			return false;
+            		}
+HXLINE(1613)		 ::Dynamic it = this->self->presence->iterator();
+HXLINE(1614)		if (!(( (bool)(it->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) ))) {
+HXLINE(1614)			return false;
+            		}
+HXLINE(1616)		if (this->disco->features->contains(HX_("urn:xmpp:message-moderate:1",5c,30,1a,b9))) {
+HXLINE(1616)			::String _hx_tmp1;
+HXDLIN(1616)			 ::borogove::Stanza tmp = ( ( ::borogove::Stanza)(it->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) )->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14))->getChild(HX_("item",13,c5,bf,45),null());
+HXDLIN(1616)			 ::Dynamic tmp1;
+HXDLIN(1616)			if (::hx::IsNotNull( tmp )) {
+HXLINE(1616)				tmp1 = tmp->attr;
+            			}
+            			else {
+HXLINE(1616)				tmp1 = null();
+            			}
+HXDLIN(1616)			::String tmp2;
+HXDLIN(1616)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE(1616)				tmp2 = ( (::String)(::Reflect_obj::field(tmp1,HX_("role",76,eb,ae,4b))) );
+            			}
+            			else {
+HXLINE(1616)				tmp2 = null();
+            			}
+HXDLIN(1616)			if (::hx::IsNotNull( tmp2 )) {
+HXLINE(1616)				_hx_tmp1 = tmp2;
+            			}
+            			else {
+HXLINE(1616)				_hx_tmp1 = HX_("none",b8,12,0a,49);
+            			}
+HXDLIN(1616)			return (_hx_tmp1 == HX_("moderator",05,40,3b,22));
             		}
             		else {
-HXLINE(1386)			_hx_tmp = HX_("none",b8,12,0a,49);
+HXLINE(1616)			return false;
             		}
-HXDLIN(1386)		return (_hx_tmp != HX_("visitor",ae,23,32,a3));
+HXDLIN(1616)		return false;
             	}
 
 
  ::Dynamic Channel_obj::getCaps(){
-            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1391_getCaps)
-HXDLIN(1391)		 ::haxe::ds::StringMap _g =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXDLIN(1391)		_g->set(HX_("",00,00,00,00),this->disco);
-HXDLIN(1391)		return  ::haxe::iterators::MapKeyValueIterator_obj::__alloc( HX_CTX ,_g);
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0,::Array< bool >,hasNext) HXARGC(0)
+            		bool _hx_run(){
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1623_getCaps)
+HXLINE(1623)			return hasNext->__get(0);
+            		}
+            		HX_END_LOCAL_FUNC0(return)
+
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis,::Array< bool >,hasNext) HXARGC(0)
+            		 ::Dynamic _hx_run(){
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1624_getCaps)
+HXLINE(1625)			hasNext[0] = false;
+HXLINE(1626)			return  ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("key",9f,89,51,00),null())
+            				->setFixed(1,HX_("value",71,7f,b8,31),_gthis->disco));
+            		}
+            		HX_END_LOCAL_FUNC0(return)
+
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1620_getCaps)
+HXDLIN(1620)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1621)		::Array< bool > hasNext = ::Array_obj< bool >::fromData( _hx_array_data_da6a8256_26,1);
+HXLINE(1622)		return  ::Dynamic(::hx::Anon_obj::Create(2)
+            			->setFixed(0,HX_("hasNext",6d,a5,46,18), ::Dynamic(new _hx_Closure_0(hasNext)))
+            			->setFixed(1,HX_("next",f3,84,02,49), ::Dynamic(new _hx_Closure_1(_gthis,hasNext))));
             	}
 
 
-void Channel_obj::setPresence(::String resource, ::borogove::Presence presence){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1395_setPresence)
-HXLINE(1396)		 ::borogove::Stanza tmp;
-HXDLIN(1396)		if (::hx::IsNotNull( presence )) {
-HXLINE(1396)			tmp = presence->mucUser;
-            		}
-            		else {
-HXLINE(1396)			tmp = null();
-            		}
-HXDLIN(1396)		::Array< ::String > tmp1;
-HXDLIN(1396)		if (::hx::IsNotNull( tmp )) {
-HXLINE(1396)			::Array< ::Dynamic> _this = tmp->allTags(HX_("status",32,e7,fb,05),null());
-HXDLIN(1396)			::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN(1396)			{
-HXLINE(1396)				int _g = 0;
-HXDLIN(1396)				int _g1 = _this->length;
-HXDLIN(1396)				while((_g < _g1)){
-HXLINE(1396)					_g = (_g + 1);
-HXDLIN(1396)					int i = (_g - 1);
-HXDLIN(1396)					{
-HXLINE(1396)						::String inValue = ( (::String)(::Reflect_obj::field(( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->attr,HX_("code",2d,b1,c4,41))) );
-HXDLIN(1396)						result->__unsafe_set(i,inValue);
+void Channel_obj::setPresence(::String resource, ::borogove::Stanza presence,bool noStore){
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1632_setPresence)
+HXDLIN(1632)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1633)		 ::borogove::Stanza tmp;
+HXDLIN(1633)		if (::hx::IsNotNull( presence )) {
+HXLINE(1633)			tmp = presence->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
+            		}
+            		else {
+HXLINE(1633)			tmp = null();
+            		}
+HXDLIN(1633)		::Array< ::String > tmp1;
+HXDLIN(1633)		if (::hx::IsNotNull( tmp )) {
+HXLINE(1633)			::Array< ::Dynamic> _this = tmp->allTags(HX_("status",32,e7,fb,05),null());
+HXDLIN(1633)			::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN(1633)			{
+HXLINE(1633)				int _g = 0;
+HXDLIN(1633)				int _g1 = _this->length;
+HXDLIN(1633)				while((_g < _g1)){
+HXLINE(1633)					_g = (_g + 1);
+HXDLIN(1633)					int i = (_g - 1);
+HXDLIN(1633)					{
+HXLINE(1633)						::String inValue = ( (::String)(::Reflect_obj::field(( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->attr,HX_("code",2d,b1,c4,41))) );
+HXDLIN(1633)						result->__unsafe_set(i,inValue);
             					}
             				}
             			}
-HXDLIN(1396)			tmp1 = result;
+HXDLIN(1633)			tmp1 = result;
             		}
             		else {
-HXLINE(1396)			tmp1 = null();
+HXLINE(1633)			tmp1 = null();
             		}
-HXDLIN(1396)		::String oneTen;
-HXDLIN(1396)		if (::hx::IsNotNull( tmp1 )) {
+HXDLIN(1633)		::String oneTen;
+HXDLIN(1633)		if (::hx::IsNotNull( tmp1 )) {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             			bool _hx_run(::String status){
-            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1396_setPresence)
-HXLINE(1396)				return (status == HX_("110",50,59,25,00));
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1633_setPresence)
+HXLINE(1633)				return (status == HX_("110",50,59,25,00));
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1396)			oneTen = ( (::String)(::Lambda_obj::find(tmp1, ::Dynamic(new _hx_Closure_0()))) );
+HXLINE(1633)			oneTen = ( (::String)(::Lambda_obj::find(tmp1, ::Dynamic(new _hx_Closure_0()))) );
             		}
             		else {
-HXLINE(1396)			oneTen = null();
+HXLINE(1633)			oneTen = null();
             		}
-HXLINE(1397)		if (::hx::IsNotNull( oneTen )) {
-HXLINE(1398)			this->_nickInUse = resource;
-HXLINE(1399)			this->outbox->start();
+HXLINE(1634)		 ::borogove::Member member = this->buildMember(resource,presence);
+HXLINE(1635)		bool _hx_tmp;
+HXDLIN(1635)		bool _hx_tmp1;
+HXDLIN(1635)		if (::hx::IsNotNull( presence->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14)) )) {
+HXLINE(1635)			_hx_tmp1 = ::hx::IsNull( oneTen );
             		}
             		else {
-HXLINE(1400)			if ((resource == this->_nickInUse)) {
-HXLINE(1401)				this->_nickInUse = null();
-HXLINE(1402)				this->outbox->pause();
-            			}
+HXLINE(1635)			_hx_tmp1 = false;
+            		}
+HXDLIN(1635)		if (_hx_tmp1) {
+HXLINE(1635)			_hx_tmp = member->isSelf;
+            		}
+            		else {
+HXLINE(1635)			_hx_tmp = false;
+            		}
+HXDLIN(1635)		if (_hx_tmp) {
+HXLINE(1637)			 ::borogove::Stanza mucUser = presence->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
+HXLINE(1638)			mucUser->tag(HX_("status",32,e7,fb,05), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(0,HX_("code",2d,b1,c4,41),HX_("110",50,59,25,00))))->up();
+HXLINE(1639)			this->setPresence(resource,presence,noStore);
+HXLINE(1640)			return;
+            		}
+HXLINE(1642)		 ::borogove::Stanza tmp2 = presence->getChild(HX_("occupant-id",2b,a5,8b,91),HX_("urn:xmpp:occupant-id:0",05,d7,05,11));
+HXDLIN(1642)		 ::Dynamic tmp3;
+HXDLIN(1642)		if (::hx::IsNotNull( tmp2 )) {
+HXLINE(1642)			tmp3 = tmp2->attr;
+            		}
+            		else {
+HXLINE(1642)			tmp3 = null();
             		}
-HXLINE(1404)		bool _hx_tmp;
-HXDLIN(1404)		bool _hx_tmp1;
-HXDLIN(1404)		if (::hx::IsNotNull( presence )) {
-HXLINE(1404)			_hx_tmp1 = ::hx::IsNotNull( presence->mucUser );
+HXDLIN(1642)		::String occupantId;
+HXDLIN(1642)		if (::hx::IsNotNull( tmp3 )) {
+HXLINE(1642)			occupantId = ( (::String)(::Reflect_obj::field(tmp3,HX_("id",db,5b,00,00))) );
             		}
             		else {
-HXLINE(1404)			_hx_tmp1 = false;
+HXLINE(1642)			occupantId = null();
             		}
-HXDLIN(1404)		if (_hx_tmp1) {
-HXLINE(1404)			_hx_tmp = ::hx::IsNull( oneTen );
+HXLINE(1643)		bool _hx_tmp2;
+HXDLIN(1643)		if (!(noStore)) {
+HXLINE(1643)			bool _hx_tmp3;
+HXDLIN(1643)			if (this->disco->features->contains(HX_("urn:xmpp:occupant-id:0",05,d7,05,11))) {
+HXLINE(1643)				_hx_tmp3 = (member->id != ((this->chatId + HX_("/",2f,00,00,00)) + occupantId));
+            			}
+            			else {
+HXLINE(1643)				_hx_tmp3 = false;
+            			}
+HXDLIN(1643)			_hx_tmp2 = !(_hx_tmp3);
             		}
             		else {
-HXLINE(1404)			_hx_tmp = false;
+HXLINE(1643)			_hx_tmp2 = false;
+            		}
+HXDLIN(1643)		if (_hx_tmp2) {
+HXLINE(1644)			bool _hx_tmp4;
+HXDLIN(1644)			if ((( (::String)(::Reflect_obj::field(presence->attr,HX_("type",ba,f2,08,4d))) ) == HX_("unavailable",50,e0,29,fd))) {
+HXLINE(1644)				_hx_tmp4 = ::hx::IsNull( member->photoUri );
+            			}
+            			else {
+HXLINE(1644)				_hx_tmp4 = false;
+            			}
+HXDLIN(1644)			if (_hx_tmp4) {
+            				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis) HXARGC(1)
+            				 ::borogove::EventResult _hx_run(::Array< ::Dynamic> members){
+            					HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1646_setPresence)
+HXLINE(1646)					return _gthis->trigger(HX_("members/update",bf,63,66,64),members);
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+HXLINE(1645)				::Array< ::Dynamic> memberUpdates = ::borogove::MemberUpdate_obj::extractUpdates(this->client->accountId(),::hx::ObjectPtr<OBJ_>(this),presence);
+HXLINE(1646)				::Dynamic _hx_tmp5 = this->persistence;
+HXDLIN(1646)				::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMemberUpdates(_hx_tmp5,this->client->accountId(),::hx::ObjectPtr<OBJ_>(this),memberUpdates,false), ::Dynamic(new _hx_Closure_1(_gthis)),null());
+            			}
+            			else {
+            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_2, ::borogove::Channel,_gthis, ::borogove::Member,member) HXARGC(1)
+            				 ::borogove::EventResult _hx_run(bool _){
+            					HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1650_setPresence)
+HXLINE(1650)					return _gthis->trigger(HX_("members/update",bf,63,66,64),::cpp::VirtualArray_obj::__new(1)->init(0,member));
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+HXLINE(1650)				::Dynamic _hx_tmp6 = this->persistence;
+HXDLIN(1650)				::String _hx_tmp7 = this->client->accountId();
+HXDLIN(1650)				::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMembers(_hx_tmp6,_hx_tmp7,this->chatId,::Array_obj< ::Dynamic>::__new(1)->init(0,member)), ::Dynamic(new _hx_Closure_2(_gthis,member)),null());
+            			}
             		}
-HXDLIN(1404)		if (_hx_tmp) {
-HXLINE(1405)			 ::borogove::Presence existing = ( ( ::borogove::Presence)(this->presence->get(resource)) );
-HXLINE(1406)			bool _hx_tmp2;
-HXDLIN(1406)			if (::hx::IsNotNull( existing )) {
-HXLINE(1406)				 ::borogove::Stanza tmp2;
-HXDLIN(1406)				if (::hx::IsNotNull( existing )) {
-HXLINE(1406)					tmp2 = existing->mucUser;
+HXLINE(1655)		 ::borogove::Stanza mucUser1 = presence->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
+HXLINE(1656)		if (::hx::IsNotNull( mucUser1 )) {
+HXLINE(1657)			 ::borogove::Stanza mav = mucUser1->getChild(HX_("mav",a2,0a,53,00),HX_("urn:xmpp:muc:affiliations:1",75,28,1f,fe));
+HXLINE(1658)			bool _hx_tmp8;
+HXDLIN(1658)			 ::Dynamic tmp4;
+HXDLIN(1658)			if (::hx::IsNotNull( mav )) {
+HXLINE(1658)				tmp4 = mav->attr;
+            			}
+            			else {
+HXLINE(1658)				tmp4 = null();
+            			}
+HXDLIN(1658)			::String _hx_tmp9;
+HXDLIN(1658)			if (::hx::IsNotNull( tmp4 )) {
+HXLINE(1658)				_hx_tmp9 = ( (::String)(::Reflect_obj::field(tmp4,HX_("since",ba,eb,cf,7c))) );
+            			}
+            			else {
+HXLINE(1658)				_hx_tmp9 = null();
+            			}
+HXDLIN(1658)			if (::hx::IsNotNull( _hx_tmp9 )) {
+HXLINE(1658)				 ::Dynamic tmp5;
+HXDLIN(1658)				if (::hx::IsNotNull( mav )) {
+HXLINE(1658)					tmp5 = mav->attr;
             				}
             				else {
-HXLINE(1406)					tmp2 = null();
-            				}
-HXDLIN(1406)				::Array< ::String > tmp3;
-HXDLIN(1406)				if (::hx::IsNotNull( tmp2 )) {
-HXLINE(1406)					::Array< ::Dynamic> _this1 = tmp2->allTags(HX_("status",32,e7,fb,05),null());
-HXDLIN(1406)					::Array< ::String > result1 = ::Array_obj< ::String >::__new(_this1->length);
-HXDLIN(1406)					{
-HXLINE(1406)						int _g2 = 0;
-HXDLIN(1406)						int _g3 = _this1->length;
-HXDLIN(1406)						while((_g2 < _g3)){
-HXLINE(1406)							_g2 = (_g2 + 1);
-HXDLIN(1406)							int i1 = (_g2 - 1);
-HXDLIN(1406)							{
-HXLINE(1406)								::String inValue1 = ( (::String)(::Reflect_obj::field(( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this1,i1)) )->attr,HX_("code",2d,b1,c4,41))) );
-HXDLIN(1406)								result1->__unsafe_set(i1,inValue1);
-            							}
-            						}
-            					}
-HXDLIN(1406)					tmp3 = result1;
+HXLINE(1658)					tmp5 = null();
+            				}
+HXDLIN(1658)				::String _hx_tmp10;
+HXDLIN(1658)				if (::hx::IsNotNull( tmp5 )) {
+HXLINE(1658)					_hx_tmp10 = ( (::String)(::Reflect_obj::field(tmp5,HX_("since",ba,eb,cf,7c))) );
             				}
             				else {
-HXLINE(1406)					tmp3 = null();
-            				}
-HXDLIN(1406)				::String _hx_tmp3;
-HXDLIN(1406)				if (::hx::IsNotNull( tmp3 )) {
-            					HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
-            					bool _hx_run(::String status){
-            						HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1406_setPresence)
-HXLINE(1406)						return (status == HX_("110",50,59,25,00));
-            					}
-            					HX_END_LOCAL_FUNC1(return)
-
-HXLINE(1406)					_hx_tmp3 = ( (::String)(::Lambda_obj::find(tmp3, ::Dynamic(new _hx_Closure_1()))) );
+HXLINE(1658)					_hx_tmp10 = null();
+            				}
+HXDLIN(1658)				_hx_tmp8 = (_hx_tmp10 != this->mavUntil);
+            			}
+            			else {
+HXLINE(1658)				_hx_tmp8 = false;
+            			}
+HXDLIN(1658)			if (_hx_tmp8) {
+HXLINE(1659)				::haxe::Log_obj::trace(HX_("MAV update with unknown previous version",e6,80,1b,7e), ::Dynamic(::hx::Anon_obj::Create(5)
+            					->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Channel",56,82,6a,da))
+            					->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(2)->init(0,this->mavUntil)->init(1,presence))
+            					->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("setPresence",fd,1b,38,97))
+            					->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Chat.hx",98,ae,63,17))
+            					->setFixed(4,HX_("lineNumber",dd,81,22,76),1659)));
+            			}
+HXLINE(1661)			bool _hx_tmp11;
+HXDLIN(1661)			 ::Dynamic tmp6;
+HXDLIN(1661)			if (::hx::IsNotNull( mav )) {
+HXLINE(1661)				tmp6 = mav->attr;
+            			}
+            			else {
+HXLINE(1661)				tmp6 = null();
+            			}
+HXDLIN(1661)			::String _hx_tmp12;
+HXDLIN(1661)			if (::hx::IsNotNull( tmp6 )) {
+HXLINE(1661)				_hx_tmp12 = ( (::String)(::Reflect_obj::field(tmp6,HX_("until",9e,b8,ef,a6))) );
+            			}
+            			else {
+HXLINE(1661)				_hx_tmp12 = null();
+            			}
+HXDLIN(1661)			if (::hx::IsNotNull( _hx_tmp12 )) {
+HXLINE(1661)				::String _hx_tmp13 = this->mavUntil;
+HXDLIN(1661)				 ::Dynamic tmp7;
+HXDLIN(1661)				if (::hx::IsNotNull( mav )) {
+HXLINE(1661)					tmp7 = mav->attr;
+            				}
+            				else {
+HXLINE(1661)					tmp7 = null();
+            				}
+HXDLIN(1661)				::String _hx_tmp14;
+HXDLIN(1661)				if (::hx::IsNotNull( tmp7 )) {
+HXLINE(1661)					_hx_tmp14 = ( (::String)(::Reflect_obj::field(tmp7,HX_("until",9e,b8,ef,a6))) );
+            				}
+            				else {
+HXLINE(1661)					_hx_tmp14 = null();
+            				}
+HXDLIN(1661)				_hx_tmp11 = (_hx_tmp13 != _hx_tmp14);
+            			}
+            			else {
+HXLINE(1661)				_hx_tmp11 = false;
+            			}
+HXDLIN(1661)			if (_hx_tmp11) {
+HXLINE(1662)				 ::Dynamic tmp8;
+HXDLIN(1662)				if (::hx::IsNotNull( mav )) {
+HXLINE(1662)					tmp8 = mav->attr;
+            				}
+            				else {
+HXLINE(1662)					tmp8 = null();
+            				}
+HXDLIN(1662)				::String _hx_tmp15;
+HXDLIN(1662)				if (::hx::IsNotNull( tmp8 )) {
+HXLINE(1662)					_hx_tmp15 = ( (::String)(::Reflect_obj::field(tmp8,HX_("until",9e,b8,ef,a6))) );
             				}
             				else {
-HXLINE(1406)					_hx_tmp3 = null();
+HXLINE(1662)					_hx_tmp15 = null();
             				}
-HXDLIN(1406)				_hx_tmp2 = ::hx::IsNotNull( _hx_tmp3 );
+HXDLIN(1662)				this->mavUntil = _hx_tmp15;
+HXLINE(1663)				::Dynamic _hx_tmp16 = this->persistence;
+HXDLIN(1663)				::borogove::Persistence_obj::storeChats(_hx_tmp16,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+            			}
+            		}
+HXLINE(1666)		if (member->isSelf) {
+HXLINE(1667)			if ((( (::String)(::Reflect_obj::field(presence->attr,HX_("type",ba,f2,08,4d))) ) == HX_("unavailable",50,e0,29,fd))) {
+HXLINE(1668)				this->self = null();
+HXLINE(1669)				this->outbox->pause();
             			}
             			else {
-HXLINE(1406)				_hx_tmp2 = false;
-            			}
-HXDLIN(1406)			if (_hx_tmp2) {
-HXLINE(1408)				presence->mucUser->tag(HX_("status",32,e7,fb,05), ::Dynamic(::hx::Anon_obj::Create(1)
-            					->setFixed(0,HX_("code",2d,b1,c4,41),HX_("110",50,59,25,00))))->up();
-HXLINE(1409)				this->setPresence(resource,presence);
-HXLINE(1410)				return;
-            			}
-            		}
-HXLINE(1413)		this->super::setPresence(resource,presence);
-HXLINE(1414)		 ::borogove::Stanza tmp4;
-HXDLIN(1414)		if (::hx::IsNotNull( presence )) {
-HXLINE(1414)			tmp4 = presence->mucUser;
-            		}
-            		else {
-HXLINE(1414)			tmp4 = null();
-            		}
-HXDLIN(1414)		::Array< ::String > tmp5;
-HXDLIN(1414)		if (::hx::IsNotNull( tmp4 )) {
-HXLINE(1414)			::Array< ::Dynamic> _this2 = tmp4->allTags(HX_("status",32,e7,fb,05),null());
-HXDLIN(1414)			::Array< ::String > result2 = ::Array_obj< ::String >::__new(_this2->length);
-HXDLIN(1414)			{
-HXLINE(1414)				int _g4 = 0;
-HXDLIN(1414)				int _g5 = _this2->length;
-HXDLIN(1414)				while((_g4 < _g5)){
-HXLINE(1414)					_g4 = (_g4 + 1);
-HXDLIN(1414)					int i2 = (_g4 - 1);
-HXDLIN(1414)					{
-HXLINE(1414)						::String inValue2 = ( (::String)(::Reflect_obj::field(( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this2,i2)) )->attr,HX_("code",2d,b1,c4,41))) );
-HXDLIN(1414)						result2->__unsafe_set(i2,inValue2);
+HXLINE(1671)				this->self = member;
+HXLINE(1672)				this->outbox->start();
+            			}
+HXLINE(1674)			this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+            		}
+HXLINE(1676)		bool _hx_tmp17;
+HXDLIN(1676)		bool _hx_tmp18;
+HXDLIN(1676)		if (!(member->isSelf)) {
+HXLINE(1676)			_hx_tmp18 = (member->id != this->chatId);
+            		}
+            		else {
+HXLINE(1676)			_hx_tmp18 = false;
+            		}
+HXDLIN(1676)		if (_hx_tmp18) {
+HXLINE(1676)			_hx_tmp17 = ::hx::IsNotNull( this->membersForName );
+            		}
+            		else {
+HXLINE(1676)			_hx_tmp17 = false;
+            		}
+HXDLIN(1676)		if (_hx_tmp17) {
+            			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_3) HXARGC(2)
+            			int _hx_run( ::Dynamic a, ::Dynamic b){
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1679_setPresence)
+HXLINE(1679)				return ::Reflect_obj::compare( ::Dynamic(a->__Field(HX_("displayName",ad,11,f2,30),::hx::paccDynamic)), ::Dynamic(b->__Field(HX_("displayName",ad,11,f2,30),::hx::paccDynamic)));
+            			}
+            			HX_END_LOCAL_FUNC2(return)
+
+HXLINE(1677)			::Array< ::Dynamic> _this1 = this->membersForName;
+HXDLIN(1677)			::Array< ::Dynamic> _g2 = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN(1677)			{
+HXLINE(1677)				int _g3 = 0;
+HXDLIN(1677)				while((_g3 < _this1->length)){
+HXLINE(1677)					 ::Dynamic v = _this1->__get(_g3);
+HXDLIN(1677)					_g3 = (_g3 + 1);
+HXDLIN(1677)					if (::hx::IsNotEq( v->__Field(HX_("id",db,5b,00,00),::hx::paccDynamic),member->id )) {
+HXLINE(1677)						_g2->push(v);
+            					}
+            				}
+            			}
+HXDLIN(1677)			this->membersForName = _g2;
+HXLINE(1678)			this->membersForName->push( ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("id",db,5b,00,00),member->id)
+            				->setFixed(1,HX_("displayName",ad,11,f2,30),member->displayName)));
+HXLINE(1679)			this->membersForName->sort( ::Dynamic(new _hx_Closure_3()));
+HXLINE(1680)			if ((this->membersForName->length > 20)) {
+HXLINE(1680)				this->membersForName = null();
+            			}
+HXLINE(1681)			if ((this->displayName == this->chatId)) {
+HXLINE(1681)				this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+            			}
+            		}
+HXLINE(1683)		 ::borogove::Stanza tmp9;
+HXDLIN(1683)		if (::hx::IsNotNull( presence )) {
+HXLINE(1683)			tmp9 = presence->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
+            		}
+            		else {
+HXLINE(1683)			tmp9 = null();
+            		}
+HXDLIN(1683)		::Array< ::String > tmp10;
+HXDLIN(1683)		if (::hx::IsNotNull( tmp9 )) {
+HXLINE(1683)			::Array< ::Dynamic> _this2 = tmp9->allTags(HX_("status",32,e7,fb,05),null());
+HXDLIN(1683)			::Array< ::String > result1 = ::Array_obj< ::String >::__new(_this2->length);
+HXDLIN(1683)			{
+HXLINE(1683)				int _g4 = 0;
+HXDLIN(1683)				int _g5 = _this2->length;
+HXDLIN(1683)				while((_g4 < _g5)){
+HXLINE(1683)					_g4 = (_g4 + 1);
+HXDLIN(1683)					int i1 = (_g4 - 1);
+HXDLIN(1683)					{
+HXLINE(1683)						::String inValue1 = ( (::String)(::Reflect_obj::field(( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this2,i1)) )->attr,HX_("code",2d,b1,c4,41))) );
+HXDLIN(1683)						result1->__unsafe_set(i1,inValue1);
             					}
             				}
             			}
-HXDLIN(1414)			tmp5 = result2;
+HXDLIN(1683)			tmp10 = result1;
             		}
             		else {
-HXLINE(1414)			tmp5 = null();
+HXLINE(1683)			tmp10 = null();
             		}
-HXDLIN(1414)		::String tripleThree;
-HXDLIN(1414)		if (::hx::IsNotNull( tmp5 )) {
-            			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(1)
+HXDLIN(1683)		::String tripleThree;
+HXDLIN(1683)		if (::hx::IsNotNull( tmp10 )) {
+            			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_4) HXARGC(1)
             			bool _hx_run(::String status){
-            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1414_setPresence)
-HXLINE(1414)				return (status == HX_("333",93,df,26,00));
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1683_setPresence)
+HXLINE(1683)				return (status == HX_("333",93,df,26,00));
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1414)			tripleThree = ( (::String)(::Lambda_obj::find(tmp5, ::Dynamic(new _hx_Closure_2()))) );
+HXLINE(1683)			tripleThree = ( (::String)(::Lambda_obj::find(tmp10, ::Dynamic(new _hx_Closure_4()))) );
             		}
             		else {
-HXLINE(1414)			tripleThree = null();
+HXLINE(1683)			tripleThree = null();
             		}
-HXLINE(1415)		bool _hx_tmp4;
-HXDLIN(1415)		if (::hx::IsNotNull( oneTen )) {
-HXLINE(1415)			_hx_tmp4 = ::hx::IsNotNull( tripleThree );
+HXLINE(1684)		bool _hx_tmp19;
+HXDLIN(1684)		if (member->isSelf) {
+HXLINE(1684)			_hx_tmp19 = ::hx::IsNotNull( tripleThree );
             		}
             		else {
-HXLINE(1415)			_hx_tmp4 = false;
+HXLINE(1684)			_hx_tmp19 = false;
             		}
-HXDLIN(1415)		if (_hx_tmp4) {
-HXLINE(1416)			this->selfPing(true);
+HXDLIN(1684)		if (_hx_tmp19) {
+            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_5, ::borogove::Channel,_gthis) HXARGC(0)
+            			void _hx_run(){
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1685_setPresence)
+HXLINE(1685)				_gthis->selfPing(true);
+            			}
+            			HX_END_LOCAL_FUNC0((void))
+
+HXLINE(1685)			::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_5(_gthis)),5000);
             		}
             	}
 
 
-void Channel_obj::doSync(::String lastId){
+void Channel_obj::doSync( ::borogove::ChatMessage syncPoint,::String sortA){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis) HXARGC(2)
             		 ::borogove::ChatMessageBuilder _hx_run( ::borogove::ChatMessageBuilder builder, ::borogove::Stanza stanza){
-            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1437_doSync)
-HXLINE(1438)			builder = _gthis->prepareIncomingMessage(builder,stanza);
-HXLINE(1439)			builder->syncPoint = true;
-HXLINE(1440)			return builder;
+            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1714_doSync)
+HXLINE(1715)			builder = _gthis->prepareIncomingMessage(builder,stanza);
+HXLINE(1716)			builder->syncPoint = true;
+HXLINE(1717)			return builder;
             		}
             		HX_END_LOCAL_FUNC2(return)
 
-            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_9, ::borogove::Channel,_gthis,::Array< ::Dynamic>,chatMessages) HXARGC(1)
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_10, ::borogove::Channel,_gthis,::Array< ::Dynamic>,chatMessages) HXARGC(1)
             		void _hx_run( ::Dynamic messageList){
-            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_8, ::borogove::Channel,_gthis,::Array< ::Dynamic>,chatMessages) HXARGC(1)
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_9, ::borogove::Channel,_gthis,::Array< ::Dynamic>,chatMessages) HXARGC(1)
             			void _hx_run(::Array< ::Dynamic> stored){
-            				HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1473_doSync)
-HXLINE(1474)				{
-HXLINE(1474)					int _g = 0;
-HXDLIN(1474)					while((_g < stored->length)){
-HXLINE(1474)						::Array< ::Dynamic> messages = stored->__get(_g).StaticCast< ::Array< ::Dynamic> >();
-HXDLIN(1474)						_g = (_g + 1);
-HXLINE(1475)						if (::hx::IsNotNull( messages )) {
-HXLINE(1476)							int _g1 = 0;
-HXDLIN(1476)							while((_g1 < messages->length)){
-HXLINE(1476)								 ::borogove::ChatMessage message = messages->__get(_g1).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN(1476)								_g1 = (_g1 + 1);
-HXLINE(1477)								_gthis->client->notifySyncMessageHandlers(message);
-HXLINE(1478)								bool _hx_tmp;
-HXDLIN(1478)								if (::hx::IsNotNull( message )) {
-HXLINE(1478)									::String _hx_tmp1 = message->chatId();
-HXDLIN(1478)									_hx_tmp = (_hx_tmp1 == _gthis->chatId);
+            				HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1750_doSync)
+HXLINE(1751)				{
+HXLINE(1751)					int _g = 0;
+HXDLIN(1751)					while((_g < stored->length)){
+HXLINE(1751)						::Array< ::Dynamic> messages = stored->__get(_g).StaticCast< ::Array< ::Dynamic> >();
+HXDLIN(1751)						_g = (_g + 1);
+HXLINE(1752)						if (::hx::IsNotNull( messages )) {
+HXLINE(1753)							int _g1 = 0;
+HXDLIN(1753)							while((_g1 < messages->length)){
+HXLINE(1753)								 ::borogove::ChatMessage message = messages->__get(_g1).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN(1753)								_g1 = (_g1 + 1);
+HXLINE(1754)								_gthis->client->notifySyncMessageHandlers(message);
+HXLINE(1755)								bool _hx_tmp;
+HXDLIN(1755)								if (::hx::IsNotNull( message )) {
+HXLINE(1755)									::String _hx_tmp1 = message->chatId();
+HXDLIN(1755)									_hx_tmp = (_hx_tmp1 == _gthis->chatId);
             								}
             								else {
-HXLINE(1478)									_hx_tmp = false;
+HXLINE(1755)									_hx_tmp = false;
             								}
-HXDLIN(1478)								if (_hx_tmp) {
-HXLINE(1478)									chatMessages->push(message);
+HXDLIN(1755)								if (_hx_tmp) {
+HXLINE(1755)									chatMessages->push(message);
             								}
-HXLINE(1479)								if ((chatMessages->length > 1000)) {
-HXLINE(1479)									chatMessages->shift().StaticCast<  ::borogove::ChatMessage >();
+HXLINE(1756)								if ((chatMessages->length > 1000)) {
+HXLINE(1756)									chatMessages->shift().StaticCast<  ::borogove::ChatMessage >();
             								}
             							}
             						}
             					}
             				}
-HXLINE(1483)				if (_gthis->sync->hasMore()) {
-HXLINE(1484)					_gthis->sync->fetchNext();
+HXLINE(1760)				if (_gthis->sync->hasMore()) {
+HXLINE(1761)					_gthis->sync->fetchNext();
             				}
             				else {
             					HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_6) HXARGC(2)
             					int _hx_run( ::borogove::ChatMessage x, ::borogove::ChatMessage y){
-            						HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1500_doSync)
-HXLINE(1500)						return ::Reflect_obj::compare(x->timestamp,y->timestamp);
+            						HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1777_doSync)
+HXLINE(1777)						return ::Reflect_obj::compare(x->timestamp,y->timestamp);
             					}
             					HX_END_LOCAL_FUNC2(return)
 
             					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_7, ::borogove::Channel,_gthis) HXARGC(1)
             					bool _hx_run( ::borogove::ChatMessage m){
-            						HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1508_doSync)
-HXLINE(1508)						::String m1 = m->serverId;
-HXDLIN(1508)						if ((m1 != _gthis->readUpTo())) {
-HXLINE(1508)							return !(m->isIncoming());
+            						HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1779_doSync)
+HXLINE(1779)						if ((m->serverId != _gthis->readUpToId)) {
+HXLINE(1779)							return !(m->isIncoming());
             						}
             						else {
-HXLINE(1508)							return true;
+HXLINE(1779)							return true;
             						}
-HXDLIN(1508)						return false;
+HXDLIN(1779)						return false;
             					}
             					HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1486)					_gthis->inSync = true;
-HXLINE(1487)					_gthis->sync = null();
-HXLINE(1489)					 ::haxe::ds::StringMap serverIds =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(1490)					::Array< ::Dynamic> dedupedMessages = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1491)					chatMessages->reverse();
-HXLINE(1492)					{
-HXLINE(1492)						int _g2 = 0;
-HXDLIN(1492)						while((_g2 < chatMessages->length)){
-HXLINE(1492)							 ::borogove::ChatMessage m = chatMessages->__get(_g2).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN(1492)							_g2 = (_g2 + 1);
-HXLINE(1493)							 ::Dynamic tmp = serverIds->get(m->serverId);
-HXDLIN(1493)							bool _hx_tmp2;
-HXDLIN(1493)							if (::hx::IsNotNull( tmp )) {
-HXLINE(1493)								_hx_tmp2 = ( (bool)(tmp) );
+HXLINE(1763)					_gthis->inSync = true;
+HXLINE(1764)					_gthis->sync = null();
+HXLINE(1766)					 ::haxe::ds::StringMap serverIds =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(1767)					::Array< ::Dynamic> dedupedMessages = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1768)					chatMessages->reverse();
+HXLINE(1769)					{
+HXLINE(1769)						int _g2 = 0;
+HXDLIN(1769)						while((_g2 < chatMessages->length)){
+HXLINE(1769)							 ::borogove::ChatMessage m = chatMessages->__get(_g2).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN(1769)							_g2 = (_g2 + 1);
+HXLINE(1770)							 ::Dynamic tmp = serverIds->get(m->serverId);
+HXDLIN(1770)							bool _hx_tmp2;
+HXDLIN(1770)							if (::hx::IsNotNull( tmp )) {
+HXLINE(1770)								_hx_tmp2 = ( (bool)(tmp) );
             							}
             							else {
-HXLINE(1493)								_hx_tmp2 = false;
+HXLINE(1770)								_hx_tmp2 = false;
             							}
-HXDLIN(1493)							if (!(_hx_tmp2)) {
-HXLINE(1494)								dedupedMessages->unshift(m);
-HXLINE(1495)								serverIds->set(m->serverId,true);
+HXDLIN(1770)							if (!(_hx_tmp2)) {
+HXLINE(1771)								dedupedMessages->unshift(m);
+HXLINE(1772)								serverIds->set(m->serverId,true);
             							}
             						}
             					}
-HXLINE(1500)					dedupedMessages->sort( ::Dynamic(new _hx_Closure_6()));
-HXLINE(1502)					 ::borogove::ChatMessage lastFromSync = dedupedMessages->__get((dedupedMessages->length - 1)).StaticCast<  ::borogove::ChatMessage >();
-HXLINE(1503)					bool _hx_tmp3;
-HXDLIN(1503)					if (::hx::IsNotNull( lastFromSync )) {
-HXLINE(1503)						 ::borogove::ChatMessage tmp1 = _gthis->lastMessage;
-HXDLIN(1503)						::String _hx_tmp4;
-HXDLIN(1503)						if (::hx::IsNotNull( tmp1 )) {
-HXLINE(1503)							_hx_tmp4 = tmp1->timestamp;
-            						}
-            						else {
-HXLINE(1503)							_hx_tmp4 = null();
-            						}
-HXDLIN(1503)						if (::hx::IsNotNull( _hx_tmp4 )) {
-HXLINE(1503)							 ::borogove::ChatMessage tmp2 = _gthis->lastMessage;
-HXDLIN(1503)							::String _hx_tmp5;
-HXDLIN(1503)							if (::hx::IsNotNull( tmp2 )) {
-HXLINE(1503)								_hx_tmp5 = tmp2->timestamp;
-            							}
-            							else {
-HXLINE(1503)								_hx_tmp5 = null();
-            							}
-HXDLIN(1503)							_hx_tmp3 = (::Reflect_obj::compare(lastFromSync->timestamp,_hx_tmp5) > 0);
+HXLINE(1777)					dedupedMessages->sort( ::Dynamic(new _hx_Closure_6()));
+HXLINE(1779)					int readIndex = ::borogove::Util_obj::findLastIndex(dedupedMessages, ::Dynamic(new _hx_Closure_7(_gthis)));
+HXLINE(1780)					if ((readIndex < 0)) {
+HXLINE(1781)						 ::borogove::Channel _gthis1 = _gthis;
+HXDLIN(1781)						int _hx_tmp3 = _gthis->unreadCount();
+HXDLIN(1781)						_gthis1->setUnreadCount((_hx_tmp3 + dedupedMessages->length));
+            					}
+            					else {
+HXLINE(1783)						_gthis->setUnreadCount(((dedupedMessages->length - readIndex) - 1));
+            					}
+HXLINE(1786)					 ::borogove::ChatMessage lastFromSync = dedupedMessages->__get((dedupedMessages->length - 1)).StaticCast<  ::borogove::ChatMessage >();
+HXLINE(1787)					bool _hx_tmp4;
+HXDLIN(1787)					if (::hx::IsNotNull( lastFromSync )) {
+HXLINE(1787)						if (::hx::IsNotNull( _gthis->lastMessage )) {
+HXLINE(1787)							_hx_tmp4 = (lastFromSync->sortId > _gthis->lastMessage->sortId);
             						}
             						else {
-HXLINE(1503)							_hx_tmp3 = true;
+HXLINE(1787)							_hx_tmp4 = true;
             						}
             					}
             					else {
-HXLINE(1503)						_hx_tmp3 = false;
-            					}
-HXDLIN(1503)					if (_hx_tmp3) {
-HXLINE(1504)						_gthis->setLastMessage(lastFromSync);
-HXLINE(1505)						_gthis->client->sortChats();
+HXLINE(1787)						_hx_tmp4 = false;
             					}
-HXLINE(1508)					int readIndex = ::borogove::Util_obj::findLastIndex(dedupedMessages, ::Dynamic(new _hx_Closure_7(_gthis)));
-HXLINE(1509)					if ((readIndex < 0)) {
-HXLINE(1510)						 ::borogove::Channel _gthis1 = _gthis;
-HXDLIN(1510)						int _hx_tmp6 = _gthis->unreadCount();
-HXDLIN(1510)						_gthis1->setUnreadCount((_hx_tmp6 + dedupedMessages->length));
+HXDLIN(1787)					if (_hx_tmp4) {
+            						HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_8, ::borogove::Channel,_gthis) HXARGC(1)
+            						 ::borogove::EventResult _hx_run( ::Dynamic _){
+            							HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1788_doSync)
+HXLINE(1789)							_gthis->client->sortChats();
+HXLINE(1790)							return _gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
+            						}
+            						HX_END_LOCAL_FUNC1(return)
+
+HXLINE(1788)						::thenshim::_Promise::Promise_Impl__obj::then(_gthis->setLastMessage(lastFromSync), ::Dynamic(new _hx_Closure_8(_gthis)),null());
             					}
             					else {
-HXLINE(1512)						_gthis->setUnreadCount(((dedupedMessages->length - readIndex) - 1));
+HXLINE(1793)						::thenshim::_Promise::Promise_Impl__obj::resolve(_gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis)));
             					}
-HXLINE(1514)					_gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
             				}
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1443_doSync)
-HXLINE(1444)			::Array< ::Dynamic> promises = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1445)			::Array< ::Dynamic> pageChatMessages = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1446)			{
-HXLINE(1446)				int _g = 0;
-HXDLIN(1446)				::Array< ::Dynamic> _g1 = ( (::Array< ::Dynamic>)(messageList->__Field(HX_("messages",cc,d8,fd,34),::hx::paccDynamic)) );
-HXDLIN(1446)				while((_g < _g1->length)){
-HXLINE(1446)					 ::borogove::Message m = _g1->__get(_g).StaticCast<  ::borogove::Message >();
-HXDLIN(1446)					_g = (_g + 1);
-HXLINE(1447)					{
-HXLINE(1447)						 ::borogove::MessageStanza _g2 = m->parsed;
-HXDLIN(1447)						switch((int)(_g2->_hx_getIndex())){
+            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1720_doSync)
+HXLINE(1721)			::Array< ::Dynamic> promises = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1722)			::Array< ::Dynamic> pageChatMessages = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1723)			{
+HXLINE(1723)				int _g = 0;
+HXDLIN(1723)				::Array< ::Dynamic> _g1 = ( (::Array< ::Dynamic>)(messageList->__Field(HX_("messages",cc,d8,fd,34),::hx::paccDynamic)) );
+HXDLIN(1723)				while((_g < _g1->length)){
+HXLINE(1723)					 ::borogove::Message m = _g1->__get(_g).StaticCast<  ::borogove::Message >();
+HXDLIN(1723)					_g = (_g + 1);
+HXLINE(1724)					{
+HXLINE(1724)						 ::borogove::MessageStanza _g2 = m->parsed;
+HXDLIN(1724)						switch((int)(_g2->_hx_getIndex())){
             							case (int)0: {
             								HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             								::Array< ::Dynamic> _hx_run( ::borogove::ChatMessage m){
-            									HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1467_doSync)
-HXLINE(1467)									return ::Array_obj< ::Dynamic>::__new(1)->init(0,m);
+            									HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1744_doSync)
+HXLINE(1744)									return ::Array_obj< ::Dynamic>::__new(1)->init(0,m);
             								}
             								HX_END_LOCAL_FUNC1(return)
 
             								HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(1)
             								::Array< ::Dynamic> _hx_run( ::Dynamic _){
-            									HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1467_doSync)
-HXLINE(1467)									return ::Array_obj< ::Dynamic>::__new(0);
+            									HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1744_doSync)
+HXLINE(1744)									return ::Array_obj< ::Dynamic>::__new(0);
             								}
             								HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1462)								::Dynamic _gthis1 = _gthis->persistence;
-HXLINE(1463)								::String _hx_tmp = _gthis->client->accountId();
-HXLINE(1462)								promises->push(::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::updateMessageStatus(_gthis1,_hx_tmp,_g2->_hx_getString(0),3,_g2->_hx_getObject(1).StaticCast<  ::borogove::Stanza >()->getErrorText()), ::Dynamic(new _hx_Closure_1()), ::Dynamic(new _hx_Closure_2())));
+HXLINE(1739)								::Dynamic _gthis1 = _gthis->persistence;
+HXLINE(1740)								::String _hx_tmp = _gthis->client->accountId();
+HXLINE(1739)								promises->push(::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::updateMessageStatus(_gthis1,_hx_tmp,_g2->_hx_getString(0),3,_g2->_hx_getObject(1).StaticCast<  ::borogove::Stanza >()->getErrorText()), ::Dynamic(new _hx_Closure_1()), ::Dynamic(new _hx_Closure_2())));
             							}
             							break;
             							case (int)1: {
-HXLINE(1448)								 ::borogove::ChatMessage _g3 = _g2->_hx_getObject(0).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN(1448)								{
-HXLINE(1449)									{
-HXLINE(1449)										int _g4 = 0;
-HXDLIN(1449)										::Array< ::Dynamic> _g5 = _g3->inlineHashReferences();
-HXDLIN(1449)										while((_g4 < _g5->length)){
-HXLINE(1449)											 ::borogove::Hash hash = _g5->__get(_g4).StaticCast<  ::borogove::Hash >();
-HXDLIN(1449)											_g4 = (_g4 + 1);
-HXLINE(1450)											_gthis->client->fetchMediaByHash(::Array_obj< ::Dynamic>::__new(1)->init(0,hash),::Array_obj< ::Dynamic>::__new(1)->init(0,_g3->from));
+HXLINE(1725)								 ::borogove::ChatMessage _g3 = _g2->_hx_getObject(0).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN(1725)								{
+HXLINE(1726)									{
+HXLINE(1726)										int _g4 = 0;
+HXDLIN(1726)										::Array< ::Dynamic> _g5 = _g3->inlineHashReferences();
+HXDLIN(1726)										while((_g4 < _g5->length)){
+HXLINE(1726)											 ::borogove::Hash hash = _g5->__get(_g4).StaticCast<  ::borogove::Hash >();
+HXDLIN(1726)											_g4 = (_g4 + 1);
+HXLINE(1727)											_gthis->client->fetchMediaByHash(::Array_obj< ::Dynamic>::__new(1)->init(0,hash),::Array_obj< ::Dynamic>::__new(1)->init(0,_g3->from));
             										}
             									}
-HXLINE(1452)									pageChatMessages->push(_g3);
+HXLINE(1729)									pageChatMessages->push(_g3);
             								}
             							}
             							break;
-            							case (int)2: {
+            							case (int)3: {
             								HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_4, ::borogove::Channel,_gthis, ::borogove::ModerationAction,action) HXARGC(2)
             								void _hx_run( ::Dynamic resolve, ::Dynamic reject){
             									HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_3, ::Dynamic,resolve) HXARGC(1)
             									void _hx_run( ::borogove::ChatMessage _){
-            										HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1459_doSync)
-HXLINE(1459)										resolve(null());
+            										HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1736_doSync)
+HXLINE(1736)										resolve(null());
             									}
             									HX_END_LOCAL_FUNC1((void))
 
-            									HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1459_doSync)
-HXLINE(1459)									::thenshim::_Promise::Promise_Impl__obj::then(_gthis->client->moderateMessage(action), ::Dynamic(new _hx_Closure_3(resolve)),null());
+            									HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1736_doSync)
+HXLINE(1736)									::thenshim::_Promise::Promise_Impl__obj::then(_gthis->client->moderateMessage(action), ::Dynamic(new _hx_Closure_3(resolve)),null());
             								}
             								HX_END_LOCAL_FUNC2((void))
 
-HXLINE(1457)								 ::borogove::ModerationAction action = _g2->_hx_getObject(0).StaticCast<  ::borogove::ModerationAction >();
-HXLINE(1458)								promises->push(::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_4(_gthis,action))));
+HXLINE(1734)								 ::borogove::ModerationAction action = _g2->_hx_getObject(0).StaticCast<  ::borogove::ModerationAction >();
+HXLINE(1735)								promises->push(::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_4(_gthis,action))));
             							}
             							break;
-            							case (int)3: {
+            							case (int)4: {
             								HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_5) HXARGC(1)
             								::Dynamic _hx_run( ::borogove::ChatMessage _){
-            									HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1455_doSync)
-HXLINE(1455)									return null();
+            									HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1732_doSync)
+HXLINE(1732)									return null();
             								}
             								HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1455)								::Dynamic _gthis2 = _gthis->persistence;
-HXLINE(1454)								promises->push(::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_gthis2,_gthis->client->accountId(),_g2->_hx_getObject(0).StaticCast<  ::borogove::ReactionUpdate >()), ::Dynamic(new _hx_Closure_5()),null()));
+HXLINE(1732)								::Dynamic _gthis2 = _gthis->persistence;
+HXLINE(1731)								promises->push(::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_gthis2,_gthis->client->accountId(),_g2->_hx_getObject(0).StaticCast<  ::borogove::ReactionUpdate >()), ::Dynamic(new _hx_Closure_5()),null()));
             							}
             							break;
             							default:{
@@ -1063,97 +1438,137 @@ HXLINE(1454)								promises->push(::thenshim::_Promise::Promise_Impl__obj::then
             					}
             				}
             			}
-HXLINE(1472)			promises->push(_gthis->client->storeMessages(pageChatMessages));
-HXLINE(1473)			::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(promises), ::Dynamic(new _hx_Closure_8(_gthis,chatMessages)),null());
+HXLINE(1749)			promises->push(_gthis->client->storeMessages(pageChatMessages));
+HXLINE(1750)			::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(promises), ::Dynamic(new _hx_Closure_9(_gthis,chatMessages)),null());
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_10, ::borogove::Channel,_gthis,::String,lastId) HXARGC(1)
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_11, ::borogove::Channel,_gthis, ::borogove::ChatMessage,syncPoint) HXARGC(1)
             		void _hx_run( ::borogove::Stanza stanza){
-            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1518_doSync)
-HXLINE(1519)			_gthis->sync = null();
-HXLINE(1520)			if (::hx::IsNotNull( lastId )) {
-HXLINE(1522)				_gthis->doSync(null());
+            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1798_doSync)
+HXLINE(1799)			_gthis->sync = null();
+HXLINE(1800)			if (::hx::IsNotNull( syncPoint )) {
+HXLINE(1802)				_gthis->doSync(null(),syncPoint->sortId);
             			}
             			else {
-HXLINE(1524)				::haxe::Log_obj::trace(HX_("SYNC failed",e2,ec,6f,fa), ::Dynamic(::hx::Anon_obj::Create(5)
+HXLINE(1804)				::haxe::Log_obj::trace(HX_("SYNC failed",e2,ec,6f,fa), ::Dynamic(::hx::Anon_obj::Create(5)
             					->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Channel",56,82,6a,da))
             					->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(2)->init(0,_gthis->chatId)->init(1,stanza))
             					->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("doSync",86,5f,63,1c))
             					->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Chat.hx",98,ae,63,17))
-            					->setFixed(4,HX_("lineNumber",dd,81,22,76),1524)));
+            					->setFixed(4,HX_("lineNumber",dd,81,22,76),1804)));
+HXLINE(1805)				_gthis->joinFailed = stanza;
+HXLINE(1806)				_gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
             			}
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1420_doSync)
-HXDLIN(1420)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1421)		if (!(this->disco->features->contains(HX_("urn:xmpp:mam:2",f5,ef,8c,da)))) {
-HXLINE(1422)			this->inSync = true;
-HXLINE(1423)			return;
+            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1689_doSync)
+HXDLIN(1689)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1690)		if (!(this->disco->features->contains(HX_("urn:xmpp:mam:2",f5,ef,8c,da)))) {
+HXLINE(1691)			this->inSync = true;
+HXLINE(1692)			return;
+            		}
+HXLINE(1694)		if (::hx::IsNotNull( this->sync )) {
+HXLINE(1694)			return;
+            		}
+HXLINE(1697)		::String sortFrom;
+HXDLIN(1697)		if (::hx::IsNotNull( sortA )) {
+HXLINE(1697)			sortFrom = sortA;
+            		}
+            		else {
+HXLINE(1697)			if (::hx::IsNotNull( syncPoint )) {
+HXLINE(1697)				sortFrom = syncPoint->sortId;
+            			}
+            			else {
+HXLINE(1697)				sortFrom = null();
+            			}
+            		}
+HXLINE(1698)		::String sortNext = ::_FractionalIndexing::FractionalIndexing_Fields__obj::between(sortFrom,null(),HX_(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",6f,61,48,0a));
+HXLINE(1699)		::String tmp = this->sortId;
+HXDLIN(1699)		::String sortIdNext;
+HXDLIN(1699)		if (::hx::IsNotNull( tmp )) {
+HXLINE(1699)			sortIdNext = tmp;
+            		}
+            		else {
+HXLINE(1699)			sortIdNext = sortNext;
+            		}
+HXDLIN(1699)		::String sortIdNext1 = ::_FractionalIndexing::FractionalIndexing_Fields__obj::between(sortIdNext,null(),HX_(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",6f,61,48,0a));
+HXLINE(1700)		::String sortTo;
+HXDLIN(1700)		if ((sortNext < sortIdNext1)) {
+HXLINE(1700)			sortTo = sortNext;
+            		}
+            		else {
+HXLINE(1700)			sortTo = sortIdNext1;
+            		}
+HXLINE(1701)		bool _hx_tmp;
+HXDLIN(1701)		if (::hx::IsNotNull( this->sortId )) {
+HXLINE(1701)			_hx_tmp = (this->sortId <= sortTo);
+            		}
+            		else {
+HXLINE(1701)			_hx_tmp = true;
             		}
-HXLINE(1425)		if (::hx::IsNotNull( this->sync )) {
-HXLINE(1425)			return;
+HXDLIN(1701)		if (_hx_tmp) {
+HXLINE(1701)			this->sortId = ::_FractionalIndexing::FractionalIndexing_Fields__obj::between(sortTo,null(),HX_(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",6f,61,48,0a));
             		}
-HXLINE(1427)		::String threeDaysAgo = ::borogove::Date_obj::format(::Date_obj::fromTime((::Date_obj::now()->getTime() + ((Float)-259200000.))));
-HXLINE(1433)		 ::Dynamic _hx_tmp;
-HXDLIN(1433)		if (::hx::IsNull( lastId )) {
-HXLINE(1433)			_hx_tmp =  ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1703)		::String threeDaysAgo = ::borogove::Date_obj::format(::Date_obj::fromTime((::Date_obj::now()->getTime() + ((Float)-259200000.))));
+HXLINE(1709)		 ::Dynamic _hx_tmp1;
+HXDLIN(1709)		if (::hx::IsNull( syncPoint )) {
+HXLINE(1709)			_hx_tmp1 =  ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("startTime",8f,45,f0,05),threeDaysAgo));
             		}
             		else {
-HXLINE(1433)			_hx_tmp =  ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1709)			_hx_tmp1 =  ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("page",4f,da,51,4a), ::Dynamic(::hx::Anon_obj::Create(1)
-            					->setFixed(0,HX_("after",1c,66,a2,1d),lastId))));
-            		}
-HXLINE(1430)		this->sync =  ::borogove::MessageSync_obj::__alloc( HX_CTX ,this->client,this->stream,_hx_tmp,this->chatId);
-HXLINE(1436)		this->sync->setNewestPageFirst(false);
-HXLINE(1437)		this->sync->addContext( ::Dynamic(new _hx_Closure_0(_gthis)));
-HXLINE(1442)		::Array< ::Dynamic> chatMessages = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1443)		this->sync->onMessages( ::Dynamic(new _hx_Closure_9(_gthis,chatMessages)));
-HXLINE(1518)		this->sync->onError( ::Dynamic(new _hx_Closure_10(_gthis,lastId)));
-HXLINE(1527)		this->sync->fetchNext();
+            					->setFixed(0,HX_("after",1c,66,a2,1d),syncPoint->serverId))));
+            		}
+HXLINE(1706)		this->sync =  ::borogove::MessageSync_obj::__alloc( HX_CTX ,this->client,this->stream,_hx_tmp1,sortFrom,sortTo,this->chatId);
+HXLINE(1714)		this->sync->addContext( ::Dynamic(new _hx_Closure_0(_gthis)));
+HXLINE(1719)		::Array< ::Dynamic> chatMessages = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1720)		this->sync->onMessages( ::Dynamic(new _hx_Closure_10(_gthis,chatMessages)));
+HXLINE(1798)		this->sync->onError( ::Dynamic(new _hx_Closure_11(_gthis,syncPoint)));
+HXLINE(1809)		this->sync->fetchNext();
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC1(Channel_obj,doSync,(void))
+HX_DEFINE_DYNAMIC_FUNC2(Channel_obj,doSync,(void))
 
 void Channel_obj::setTrusted(bool trusted){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1530_setTrusted)
-HXLINE(1531)		this->super::setTrusted(trusted);
-HXLINE(1532)		if (trusted) {
-HXLINE(1532)			this->selfPing(true);
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1812_setTrusted)
+HXLINE(1813)		this->super::setTrusted(trusted);
+HXLINE(1814)		if (trusted) {
+HXLINE(1814)			this->selfPing(true);
             		}
             	}
 
 
 bool Channel_obj::isTrusted(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1536_isTrusted)
-HXDLIN(1536)		if ((this->uiState != 2)) {
-HXDLIN(1536)			return (this->uiState != 3);
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1818_isTrusted)
+HXDLIN(1818)		if ((this->uiState != 2)) {
+HXDLIN(1818)			return (this->uiState != 3);
             		}
             		else {
-HXDLIN(1536)			return false;
+HXDLIN(1818)			return false;
             		}
-HXDLIN(1536)		return false;
+HXDLIN(1818)		return false;
             	}
 
 
 bool Channel_obj::isPrivate(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1540_isPrivate)
-HXDLIN(1540)		return this->disco->features->contains(HX_("muc_membersonly",41,e9,70,b7));
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1825_isPrivate)
+HXDLIN(1825)		return this->disco->features->contains(HX_("muc_membersonly",41,e9,70,b7));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Channel_obj,isPrivate,return )
 
 void Channel_obj::setupNotifications(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1544_setupNotifications)
-HXLINE(1545)		if (::hx::IsNull( this->disco )) {
-HXLINE(1545)			return;
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1829_setupNotifications)
+HXLINE(1830)		if (::hx::IsNull( this->disco )) {
+HXLINE(1830)			return;
             		}
-HXLINE(1546)		if (!(this->isPrivate())) {
-HXLINE(1546)			this->notificationSettings =  ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE(1831)		if (!(this->isPrivate())) {
+HXLINE(1831)			this->notificationSettings =  ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("mention",ea,9e,bf,b9),true)
             				->setFixed(1,HX_("reply",2a,09,c6,e6),false));
             		}
@@ -1165,559 +1580,1249 @@ HX_DEFINE_DYNAMIC_FUNC0(Channel_obj,setupNotifications,(void))
 void Channel_obj::refreshDisco( ::Dynamic callback){
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_3, ::borogove::Channel,_gthis, ::borogove::queries::DiscoInfoGet,discoGet, ::Dynamic,callback) HXARGC(0)
             		void _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1552_refreshDisco)
-HXLINE(1553)			if (::hx::IsNotNull( discoGet->getResult() )) {
-HXLINE(1554)				_gthis->disco = discoGet->getResult();
-HXLINE(1555)				::Dynamic _gthis1 = _gthis->persistence;
-HXDLIN(1555)				::borogove::Persistence_obj::storeCaps(_gthis1,discoGet->getResult());
-HXLINE(1556)				::Dynamic _gthis2 = _gthis->persistence;
-HXDLIN(1556)				::String _hx_tmp = _gthis->client->accountId();
-HXDLIN(1556)				::borogove::Persistence_obj::storeChats(_gthis2,_hx_tmp,::Array_obj< ::Dynamic>::__new(1)->init(0,_gthis));
-            			}
-HXLINE(1558)			if (::hx::IsNotNull( callback )) {
-HXLINE(1558)				callback();
-            			}
-HXLINE(1559)			 ::borogove::Stanza tmp = _gthis->info();
-HXDLIN(1559)			 ::borogove::Stanza tmp1;
-HXDLIN(1559)			if (::hx::IsNotNull( tmp )) {
-HXLINE(1559)				tmp1 = ::borogove::_DataForm::DataForm_Impl__obj::field(tmp,HX_("muc#roominfo_avatarhash",55,a5,67,00));
+            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1837_refreshDisco)
+HXLINE(1838)			if (::hx::IsNotNull( discoGet->getResult() )) {
+HXLINE(1839)				 ::borogove::CapsRepo _gthis1 = _gthis->client->capsRepo;
+HXDLIN(1839)				 ::borogove::Caps _hx_tmp = discoGet->getResult();
+HXDLIN(1839)				_gthis->disco = _gthis1->add(_hx_tmp,null());
+HXLINE(1840)				::Dynamic _gthis2 = _gthis->persistence;
+HXDLIN(1840)				::String _hx_tmp1 = _gthis->client->accountId();
+HXDLIN(1840)				::borogove::Persistence_obj::storeChats(_gthis2,_hx_tmp1,::Array_obj< ::Dynamic>::__new(1)->init(0,_gthis));
+            			}
+HXLINE(1842)			if (::hx::IsNotNull( callback )) {
+HXLINE(1842)				callback();
+            			}
+HXLINE(1843)			 ::borogove::Stanza tmp = _gthis->info();
+HXDLIN(1843)			 ::borogove::Stanza tmp1;
+HXDLIN(1843)			if (::hx::IsNotNull( tmp )) {
+HXLINE(1843)				tmp1 = ::borogove::_DataForm::DataForm_Impl__obj::field(tmp,HX_("muc#roominfo_avatarhash",55,a5,67,00));
             			}
             			else {
-HXLINE(1559)				tmp1 = null();
+HXLINE(1843)				tmp1 = null();
             			}
-HXDLIN(1559)			::Array< ::String > tmp2;
-HXDLIN(1559)			if (::hx::IsNotNull( tmp1 )) {
-HXLINE(1559)				tmp2 = ::borogove::_DataForm::Field_Impl__obj::get_value(tmp1);
+HXDLIN(1843)			::Array< ::String > tmp2;
+HXDLIN(1843)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE(1843)				tmp2 = ::borogove::_DataForm::Field_Impl__obj::get_value(tmp1);
             			}
             			else {
-HXLINE(1559)				tmp2 = null();
+HXLINE(1843)				tmp2 = null();
             			}
-HXDLIN(1559)			::String avatarSha1Hex;
-HXDLIN(1559)			if (::hx::IsNotNull( tmp2 )) {
-HXLINE(1559)				avatarSha1Hex = tmp2->join(HX_("",00,00,00,00));
+HXDLIN(1843)			::String avatarSha1Hex;
+HXDLIN(1843)			if (::hx::IsNotNull( tmp2 )) {
+HXLINE(1843)				avatarSha1Hex = tmp2->join(HX_("",00,00,00,00));
             			}
             			else {
-HXLINE(1559)				avatarSha1Hex = null();
+HXLINE(1843)				avatarSha1Hex = null();
             			}
-HXLINE(1560)			bool _hx_tmp1;
-HXDLIN(1560)			if (::hx::IsNotNull( avatarSha1Hex )) {
-HXLINE(1560)				_hx_tmp1 = (avatarSha1Hex != HX_("",00,00,00,00));
+HXLINE(1844)			bool _hx_tmp2;
+HXDLIN(1844)			if (::hx::IsNotNull( avatarSha1Hex )) {
+HXLINE(1844)				_hx_tmp2 = (avatarSha1Hex != HX_("",00,00,00,00));
             			}
             			else {
-HXLINE(1560)				_hx_tmp1 = false;
+HXLINE(1844)				_hx_tmp2 = false;
             			}
-HXDLIN(1560)			if (_hx_tmp1) {
-            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_2, ::borogove::Channel,_gthis,::String,avatarSha1Hex) HXARGC(1)
+HXDLIN(1844)			if (_hx_tmp2) {
+            				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::borogove::Channel,_gthis) HXARGC(1)
             				void _hx_run(bool has){
-            					HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1564_refreshDisco)
-HXLINE(1564)					if (!(has)) {
+            					HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1848_refreshDisco)
+HXLINE(1848)					if (!(has)) {
             						HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis, ::borogove::queries::VcardTempGet,vcardGet) HXARGC(0)
             						void _hx_run(){
             							HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis) HXARGC(1)
             							 ::borogove::EventResult _hx_run(bool _){
-            								HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1570_refreshDisco)
-HXLINE(1570)								return _gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
+            								HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1853_refreshDisco)
+HXLINE(1853)								return _gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
             							}
             							HX_END_LOCAL_FUNC1(return)
 
-            							HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1567_refreshDisco)
-HXLINE(1568)							 ::Dynamic vcard = vcardGet->getResult();
-HXLINE(1569)							if (::hx::IsNull( vcard->__Field(HX_("photo",b2,c8,f3,c1),::hx::paccDynamic) )) {
-HXLINE(1569)								return;
+            							HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1850_refreshDisco)
+HXLINE(1851)							 ::Dynamic vcard = vcardGet->getResult();
+HXLINE(1852)							if (::hx::IsNull( vcard->__Field(HX_("photo",b2,c8,f3,c1),::hx::paccDynamic) )) {
+HXLINE(1852)								return;
             							}
-HXLINE(1570)							::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMedia(_gthis->persistence, ::Dynamic( ::Dynamic(vcard->__Field(HX_("photo",b2,c8,f3,c1),::hx::paccDynamic))->__Field(HX_("mime",b4,4d,5c,48),::hx::paccDynamic)),( ( ::haxe::io::Bytes)( ::Dynamic(vcard->__Field(HX_("photo",b2,c8,f3,c1),::hx::paccDynamic))->__Field(HX_("data",2a,56,63,42),::hx::paccDynamic)) )->b), ::Dynamic(new _hx_Closure_0(_gthis)),null());
+HXLINE(1853)							::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMedia(_gthis->persistence, ::Dynamic( ::Dynamic(vcard->__Field(HX_("photo",b2,c8,f3,c1),::hx::paccDynamic))->__Field(HX_("mime",b4,4d,5c,48),::hx::paccDynamic)),( ( ::haxe::io::Bytes)( ::Dynamic(vcard->__Field(HX_("photo",b2,c8,f3,c1),::hx::paccDynamic))->__Field(HX_("data",2a,56,63,42),::hx::paccDynamic)) )->b), ::Dynamic(new _hx_Closure_0(_gthis)),null());
             						}
             						HX_END_LOCAL_FUNC0((void))
 
-HXLINE(1565)						::haxe::Log_obj::trace(HX_("XYZZY no MUC avatar locally matching so fetch vcard",2c,00,99,15), ::Dynamic(::hx::Anon_obj::Create(5)
-            							->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Channel",56,82,6a,da))
-            							->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(2)->init(0,_gthis->chatId)->init(1,avatarSha1Hex))
-            							->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("refreshDisco",9f,ff,52,ed))
-            							->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Chat.hx",98,ae,63,17))
-            							->setFixed(4,HX_("lineNumber",dd,81,22,76),1565)));
-HXLINE(1566)						 ::borogove::queries::VcardTempGet vcardGet =  ::borogove::queries::VcardTempGet_obj::__alloc( HX_CTX ,::borogove::JID_obj::parse(_gthis->chatId));
-HXLINE(1567)						vcardGet->onFinished( ::Dynamic(new _hx_Closure_1(_gthis,vcardGet)));
-HXLINE(1574)						_gthis->client->sendQueryLazy(vcardGet);
+HXLINE(1849)						 ::borogove::queries::VcardTempGet vcardGet =  ::borogove::queries::VcardTempGet_obj::__alloc( HX_CTX ,::borogove::JID_obj::parse(_gthis->chatId));
+HXLINE(1850)						vcardGet->onFinished( ::Dynamic(new _hx_Closure_1(_gthis,vcardGet)));
+HXLINE(1857)						_gthis->client->sendQueryLazy(vcardGet);
             					}
             				}
             				HX_END_LOCAL_FUNC1((void))
 
-HXLINE(1561)				 ::borogove::Hash hash = ::borogove::Hash_obj::fromHex(HX_("sha-1",90,a8,1c,7c),avatarSha1Hex);
-HXLINE(1562)				_gthis->avatarSha1 = hash->hash;
-HXLINE(1563)				::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::hasMedia(_gthis->persistence,HX_("sha-1",90,a8,1c,7c),_gthis->avatarSha1), ::Dynamic(new _hx_Closure_2(_gthis,avatarSha1Hex)),null());
+HXLINE(1845)				 ::borogove::Hash hash = ::borogove::Hash_obj::fromHex(HX_("sha-1",90,a8,1c,7c),avatarSha1Hex);
+HXLINE(1846)				_gthis->avatarSha1 = hash->hash;
+HXLINE(1847)				::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::hasMedia(_gthis->persistence,HX_("sha-1",90,a8,1c,7c),_gthis->avatarSha1), ::Dynamic(new _hx_Closure_2(_gthis)),null());
             			}
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1550_refreshDisco)
-HXDLIN(1550)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1551)		 ::borogove::queries::DiscoInfoGet discoGet =  ::borogove::queries::DiscoInfoGet_obj::__alloc( HX_CTX ,this->chatId,null());
-HXLINE(1552)		discoGet->onFinished( ::Dynamic(new _hx_Closure_3(_gthis,discoGet,callback)));
-HXLINE(1579)		this->client->sendQuery(discoGet);
+            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1835_refreshDisco)
+HXDLIN(1835)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1836)		 ::borogove::queries::DiscoInfoGet discoGet =  ::borogove::queries::DiscoInfoGet_obj::__alloc( HX_CTX ,this->chatId,null());
+HXLINE(1837)		discoGet->onFinished( ::Dynamic(new _hx_Closure_3(_gthis,discoGet,callback)));
+HXLINE(1862)		this->client->sendQuery(discoGet);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Channel_obj,refreshDisco,(void))
 
 ::String Channel_obj::preview(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1582_preview)
-HXLINE(1583)		if (::hx::IsNull( this->lastMessage )) {
-HXLINE(1583)			return this->super::preview();
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1865_preview)
+HXLINE(1866)		if (::hx::IsNull( this->lastMessage )) {
+HXLINE(1866)			return this->super::preview();
             		}
-HXLINE(1585)		::String _hx_tmp = (this->getParticipantDetails(this->lastMessage->senderId)->displayName + HX_(": ",a6,32,00,00));
-HXDLIN(1585)		return (_hx_tmp + this->super::preview());
+HXLINE(1868)		::String _hx_tmp = (this->lastMessageSenderName + HX_(": ",a6,32,00,00));
+HXDLIN(1868)		return (_hx_tmp + this->super::preview());
             	}
 
 
 bool Channel_obj::livePresence(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1589_livePresence)
-HXLINE(1590)		if (this->forceLive) {
-HXLINE(1590)			return true;
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1872_livePresence)
+HXLINE(1873)		if (this->forceLive) {
+HXLINE(1873)			return true;
             		}
-HXLINE(1592)		return ::hx::IsNotNull( this->_nickInUse );
+HXLINE(1875)		return ::hx::IsNotNull( this->self );
             	}
 
 
 bool Channel_obj::syncing(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1596_syncing)
-HXDLIN(1596)		if (this->inSync) {
-HXDLIN(1596)			return !(this->livePresence());
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1879_syncing)
+HXDLIN(1879)		if (::hx::IsNull( this->sync )) {
+HXDLIN(1879)			if (!(this->livePresence())) {
+HXDLIN(1879)				return ::hx::IsNull( this->joinFailed );
+            			}
+            			else {
+HXDLIN(1879)				return false;
+            			}
             		}
             		else {
-HXDLIN(1596)			return true;
+HXDLIN(1879)			return true;
+            		}
+HXDLIN(1879)		return false;
+            	}
+
+
+::Dynamic Channel_obj::setLastMessage( ::borogove::ChatMessage message){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis, ::borogove::ChatMessage,message) HXARGC(1)
+            		::Dynamic _hx_run( ::Dynamic _){
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis, ::borogove::ChatMessage,message) HXARGC(1)
+            			::Dynamic _hx_run(::Array< ::Dynamic> sender){
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1887_setLastMessage)
+HXLINE(1888)				::String _hx_tmp;
+HXDLIN(1888)				if (::hx::IsNotNull( sender->__get(0).StaticCast<  ::borogove::Member >() )) {
+HXLINE(1888)					_hx_tmp = sender->__get(0).StaticCast<  ::borogove::Member >()->displayName;
+            				}
+            				else {
+HXLINE(1888)					_hx_tmp = message->senderMemberStub()->displayName;
+            				}
+HXDLIN(1888)				_gthis->lastMessageSenderName = _hx_tmp;
+HXLINE(1889)				return null();
+            			}
+            			HX_END_LOCAL_FUNC1(return)
+
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1883_setLastMessage)
+HXLINE(1884)			bool _hx_tmp;
+HXDLIN(1884)			bool _hx_tmp1;
+HXDLIN(1884)			if (::hx::IsNotNull( message )) {
+HXLINE(1884)				_hx_tmp1 = (message->type == 2);
+            			}
+            			else {
+HXLINE(1884)				_hx_tmp1 = false;
+            			}
+HXDLIN(1884)			if (_hx_tmp1) {
+HXLINE(1884)				if (::hx::IsNotNull( _gthis->sortId )) {
+HXLINE(1884)					_hx_tmp = (_gthis->sortId < message->sortId);
+            				}
+            				else {
+HXLINE(1884)					_hx_tmp = true;
+            				}
+            			}
+            			else {
+HXLINE(1884)				_hx_tmp = false;
+            			}
+HXDLIN(1884)			if (_hx_tmp) {
+HXLINE(1884)				_gthis->sortId = message->sortId;
+            			}
+HXLINE(1885)			if (::hx::IsNull( message )) {
+HXLINE(1885)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            			}
+HXLINE(1887)			return ::thenshim::_Promise::Promise_Impl__obj::then(_gthis->getMemberDetails(::Array_obj< ::String >::__new(1)->init(0,message->senderId)), ::Dynamic(new _hx_Closure_0(_gthis,message)),null());
             		}
-HXDLIN(1596)		return false;
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1882_setLastMessage)
+HXDLIN(1882)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1883)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->super::setLastMessage(message), ::Dynamic(new _hx_Closure_1(_gthis,message)),null());
             	}
 
 
 bool Channel_obj::canAudioCall(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1600_canAudioCall)
-HXDLIN(1600)		 ::borogove::Caps tmp = this->disco;
-HXDLIN(1600)		::Array< ::String > tmp1;
-HXDLIN(1600)		if (::hx::IsNotNull( tmp )) {
-HXDLIN(1600)			tmp1 = tmp->features;
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1895_canAudioCall)
+HXDLIN(1895)		 ::borogove::Caps tmp = this->disco;
+HXDLIN(1895)		::Array< ::String > tmp1;
+HXDLIN(1895)		if (::hx::IsNotNull( tmp )) {
+HXDLIN(1895)			tmp1 = tmp->features;
             		}
             		else {
-HXDLIN(1600)			tmp1 = null();
+HXDLIN(1895)			tmp1 = null();
             		}
-HXDLIN(1600)		 ::Dynamic tmp2;
-HXDLIN(1600)		if (::hx::IsNotNull( tmp1 )) {
-HXDLIN(1600)			tmp2 = tmp1->contains(HX_("urn:xmpp:jingle:apps:rtp:audio",0f,8b,54,6c));
+HXDLIN(1895)		 ::Dynamic tmp2;
+HXDLIN(1895)		if (::hx::IsNotNull( tmp1 )) {
+HXDLIN(1895)			tmp2 = tmp1->contains(HX_("urn:xmpp:jingle:apps:rtp:audio",0f,8b,54,6c));
             		}
             		else {
-HXDLIN(1600)			tmp2 = null();
+HXDLIN(1895)			tmp2 = null();
             		}
-HXDLIN(1600)		if (::hx::IsNotNull( tmp2 )) {
-HXDLIN(1600)			return ( (bool)(tmp2) );
+HXDLIN(1895)		if (::hx::IsNotNull( tmp2 )) {
+HXDLIN(1895)			return ( (bool)(tmp2) );
             		}
             		else {
-HXDLIN(1600)			return false;
+HXDLIN(1895)			return false;
             		}
-HXDLIN(1600)		return false;
+HXDLIN(1895)		return false;
             	}
 
 
 bool Channel_obj::canVideoCall(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1604_canVideoCall)
-HXDLIN(1604)		 ::borogove::Caps tmp = this->disco;
-HXDLIN(1604)		::Array< ::String > tmp1;
-HXDLIN(1604)		if (::hx::IsNotNull( tmp )) {
-HXDLIN(1604)			tmp1 = tmp->features;
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1899_canVideoCall)
+HXDLIN(1899)		 ::borogove::Caps tmp = this->disco;
+HXDLIN(1899)		::Array< ::String > tmp1;
+HXDLIN(1899)		if (::hx::IsNotNull( tmp )) {
+HXDLIN(1899)			tmp1 = tmp->features;
             		}
             		else {
-HXDLIN(1604)			tmp1 = null();
+HXDLIN(1899)			tmp1 = null();
             		}
-HXDLIN(1604)		 ::Dynamic tmp2;
-HXDLIN(1604)		if (::hx::IsNotNull( tmp1 )) {
-HXDLIN(1604)			tmp2 = tmp1->contains(HX_("urn:xmpp:jingle:apps:rtp:video",b4,26,d0,7b));
+HXDLIN(1899)		 ::Dynamic tmp2;
+HXDLIN(1899)		if (::hx::IsNotNull( tmp1 )) {
+HXDLIN(1899)			tmp2 = tmp1->contains(HX_("urn:xmpp:jingle:apps:rtp:video",b4,26,d0,7b));
             		}
             		else {
-HXDLIN(1604)			tmp2 = null();
+HXDLIN(1899)			tmp2 = null();
             		}
-HXDLIN(1604)		if (::hx::IsNotNull( tmp2 )) {
-HXDLIN(1604)			return ( (bool)(tmp2) );
+HXDLIN(1899)		if (::hx::IsNotNull( tmp2 )) {
+HXDLIN(1899)			return ( (bool)(tmp2) );
             		}
             		else {
-HXDLIN(1604)			return false;
+HXDLIN(1899)			return false;
             		}
-HXDLIN(1604)		return false;
+HXDLIN(1899)		return false;
             	}
 
 
 ::String Channel_obj::nickInUse(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1608_nickInUse)
-HXDLIN(1608)		::String tmp = this->_nickInUse;
-HXDLIN(1608)		if (::hx::IsNotNull( tmp )) {
-HXDLIN(1608)			return tmp;
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1903_nickInUse)
+HXDLIN(1903)		 ::borogove::Member tmp = this->self;
+HXDLIN(1903)		::String tmp1;
+HXDLIN(1903)		if (::hx::IsNotNull( tmp )) {
+HXDLIN(1903)			tmp1 = tmp->displayName;
+            		}
+            		else {
+HXDLIN(1903)			tmp1 = null();
+            		}
+HXDLIN(1903)		if (::hx::IsNotNull( tmp1 )) {
+HXDLIN(1903)			return tmp1;
             		}
             		else {
-HXDLIN(1608)			return this->client->displayName();
+HXDLIN(1903)			return this->client->displayName();
             		}
-HXDLIN(1608)		return null();
+HXDLIN(1903)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Channel_obj,nickInUse,return )
 
  ::borogove::JID Channel_obj::getFullJid(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1612_getFullJid)
-HXDLIN(1612)		 ::borogove::JID _hx_tmp = ::borogove::JID_obj::parse(this->chatId);
-HXDLIN(1612)		return _hx_tmp->withResource(this->nickInUse());
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1908_getFullJid)
+HXDLIN(1908)		 ::borogove::JID _hx_tmp = ::borogove::JID_obj::parse(this->chatId);
+HXDLIN(1908)		return _hx_tmp->withResource(this->nickInUse());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Channel_obj,getFullJid,return )
 
-::Array< ::String > Channel_obj::getParticipants(){
-            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis) HXARGC(0)
-            		 ::Dynamic _hx_run(){
-            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1618_getParticipants)
-HXLINE(1618)			return _gthis->presence->keys();
+::Dynamic Channel_obj::members(){
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis) HXARGC(1)
+            		::Array< ::Dynamic> _hx_run(::Array< ::Dynamic> members){
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1915_members)
+HXLINE(1915)			::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN(1915)			{
+HXLINE(1915)				int _g1 = 0;
+HXDLIN(1915)				while((_g1 < members->length)){
+HXLINE(1915)					 ::borogove::Member v = members->__get(_g1).StaticCast<  ::borogove::Member >();
+HXDLIN(1915)					_g1 = (_g1 + 1);
+HXDLIN(1915)					if ((v->id != _gthis->chatId)) {
+HXLINE(1915)						_g->push(v);
+            					}
+            				}
+            			}
+HXDLIN(1915)			return _g;
             		}
-            		HX_END_LOCAL_FUNC0(return)
+            		HX_END_LOCAL_FUNC1(return)
 
-            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
-            		bool _hx_run(::String resource){
-            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1618_getParticipants)
-HXLINE(1618)			return ::hx::IsNotNull( resource );
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1912_members)
+HXDLIN(1912)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1913)		::Dynamic _hx_tmp = this->persistence;
+HXLINE(1914)		::String _hx_tmp1 = this->client->accountId();
+HXDLIN(1914)		bool _hx_tmp2;
+HXDLIN(1914)		if (::hx::IsNull( this->self )) {
+HXLINE(1914)			_hx_tmp2 = false;
             		}
-            		HX_END_LOCAL_FUNC1(return)
+            		else {
+            			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            			bool _hx_run( ::borogove::Role r){
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1914_members)
+HXLINE(1914)				return ::Array_obj< ::String >::fromData( _hx_array_data_da6a8256_78,2)->contains(r->id);
+            			}
+            			HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1616_getParticipants)
-HXDLIN(1616)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1617)		 ::borogove::JID jid = ::borogove::JID_obj::parse(this->chatId);
-HXLINE(1618)		::Array< ::String > _this = ::Lambda_obj::filter( ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("iterator",ee,49,9a,93), ::Dynamic(new _hx_Closure_0(_gthis)))), ::Dynamic(new _hx_Closure_1()));
-HXDLIN(1618)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN(1618)		{
-HXLINE(1618)			int _g = 0;
-HXDLIN(1618)			int _g1 = _this->length;
-HXDLIN(1618)			while((_g < _g1)){
-HXLINE(1618)				_g = (_g + 1);
-HXDLIN(1618)				int i = (_g - 1);
-HXDLIN(1618)				{
-HXLINE(1618)					::String resource = ( (::String)(_hx_array_unsafe_get(_this,i)) );
-HXDLIN(1618)					::String inValue =  ::borogove::JID_obj::__alloc( HX_CTX ,jid->node,jid->domain,resource,null())->asString();
-HXDLIN(1618)					result->__unsafe_set(i,inValue);
-            				}
-            			}
-            		}
-HXDLIN(1618)		return result;
+HXLINE(1914)			_hx_tmp2 = ::Lambda_obj::exists(this->self->roles, ::Dynamic(new _hx_Closure_0()));
+            		}
+HXLINE(1913)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMembers(_hx_tmp,_hx_tmp1,::hx::ObjectPtr<OBJ_>(this),_hx_tmp2), ::Dynamic(new _hx_Closure_1(_gthis)),null());
             	}
 
 
- ::borogove::Participant Channel_obj::getParticipantDetails(::String participantId){
-            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1623_getParticipantDetails)
-HXDLIN(1623)		if ((participantId == this->getFullJid()->asString())) {
-HXLINE(1624)			 ::borogove::Client chat = this->client;
-HXDLIN(1624)			 ::borogove::DirectChat chat1 = chat->getDirectChat(this->client->accountId(),false);
-HXLINE(1625)			::String _hx_tmp = this->client->displayName();
-HXDLIN(1625)			::String _hx_tmp1 = chat1->getPhoto();
-HXDLIN(1625)			::String _hx_tmp2 = chat1->getPlaceholder();
-HXDLIN(1625)			return  ::borogove::Participant_obj::__alloc( HX_CTX ,_hx_tmp,_hx_tmp1,_hx_tmp2,true,::borogove::JID_obj::parse(chat1->chatId));
+::Dynamic Channel_obj::getMemberDetails(::Array< ::String > memberIds){
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1919_getMemberDetails)
+HXLINE(1920)		bool _hx_tmp;
+HXDLIN(1920)		bool _hx_tmp1;
+HXDLIN(1920)		if ((memberIds->length == 1)) {
+HXLINE(1920)			_hx_tmp1 = ::hx::IsNotNull( this->self );
             		}
             		else {
-HXLINE(1627)			 ::borogove::JID jid = ::borogove::JID_obj::parse(participantId);
-HXLINE(1628)			::String nick = jid->resource;
-HXLINE(1629)			::String placeholderUri;
-HXDLIN(1629)			if (::hx::IsNull( nick )) {
-HXLINE(1629)				placeholderUri = HX_(" ",20,00,00,00);
-            			}
-            			else {
-HXLINE(1629)				placeholderUri = nick.charAt(0);
-            			}
-HXDLIN(1629)			::String placeholderUri1 = ::borogove::Color_obj::defaultPhoto(participantId,placeholderUri);
-HXLINE(1630)			::String _hx_tmp3;
-HXDLIN(1630)			if (::hx::IsNotNull( nick )) {
-HXLINE(1630)				_hx_tmp3 = nick;
-            			}
-            			else {
-HXLINE(1630)				_hx_tmp3 = HX_("",00,00,00,00);
-            			}
-HXDLIN(1630)			 ::borogove::Presence tmp = ( ( ::borogove::Presence)(this->presence->get(nick)) );
-HXDLIN(1630)			 ::borogove::Hash tmp1;
-HXDLIN(1630)			if (::hx::IsNotNull( tmp )) {
-HXLINE(1630)				tmp1 = tmp->avatarHash;
-            			}
-            			else {
-HXLINE(1630)				tmp1 = null();
-            			}
-HXDLIN(1630)			::String _hx_tmp4;
-HXDLIN(1630)			if (::hx::IsNotNull( tmp1 )) {
-HXLINE(1630)				_hx_tmp4 = tmp1->toUri();
-            			}
-            			else {
-HXLINE(1630)				_hx_tmp4 = null();
-            			}
-HXDLIN(1630)			return  ::borogove::Participant_obj::__alloc( HX_CTX ,_hx_tmp3,_hx_tmp4,placeholderUri1,false,jid);
+HXLINE(1920)			_hx_tmp1 = false;
+            		}
+HXDLIN(1920)		if (_hx_tmp1) {
+HXLINE(1920)			_hx_tmp = (memberIds->__get(0) == this->self->id);
             		}
-HXLINE(1623)		return null();
+            		else {
+HXLINE(1920)			_hx_tmp = false;
+            		}
+HXDLIN(1920)		if (_hx_tmp) {
+HXLINE(1920)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(1)->init(0,this->self));
+            		}
+HXLINE(1922)		::Dynamic _hx_tmp2 = this->persistence;
+HXDLIN(1922)		return ::borogove::Persistence_obj::getMemberDetails(_hx_tmp2,this->client->accountId(),::hx::ObjectPtr<OBJ_>(this),memberIds);
             	}
 
 
-::Dynamic Channel_obj::getMessagesBefore(::String beforeId,::String beforeTime){
-            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis,::String,beforeId) HXARGC(1)
-            		::Dynamic _hx_run(::Array< ::Dynamic> messages){
-            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1637_getMessagesBefore)
-HXLINE(1637)			if ((messages->length > 0)) {
-HXLINE(1638)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(messages);
+ ::borogove::Member Channel_obj::buildMember(::String resource, ::borogove::Stanza presence){
+            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1925_buildMember)
+HXLINE(1926)		 ::borogove::Stanza tmp;
+HXDLIN(1926)		if (::hx::IsNotNull( presence )) {
+HXLINE(1926)			tmp = presence->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
+            		}
+            		else {
+HXLINE(1926)			tmp = null();
+            		}
+HXDLIN(1926)		::Array< ::String > tmp1;
+HXDLIN(1926)		if (::hx::IsNotNull( tmp )) {
+HXLINE(1926)			::Array< ::Dynamic> _this = tmp->allTags(HX_("status",32,e7,fb,05),null());
+HXDLIN(1926)			::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN(1926)			{
+HXLINE(1926)				int _g = 0;
+HXDLIN(1926)				int _g1 = _this->length;
+HXDLIN(1926)				while((_g < _g1)){
+HXLINE(1926)					_g = (_g + 1);
+HXDLIN(1926)					int i = (_g - 1);
+HXDLIN(1926)					{
+HXLINE(1926)						::String inValue = ( (::String)(::Reflect_obj::field(( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->attr,HX_("code",2d,b1,c4,41))) );
+HXDLIN(1926)						result->__unsafe_set(i,inValue);
+            					}
+            				}
+            			}
+HXDLIN(1926)			tmp1 = result;
+            		}
+            		else {
+HXLINE(1926)			tmp1 = null();
+            		}
+HXDLIN(1926)		::String oneTen;
+HXDLIN(1926)		if (::hx::IsNotNull( tmp1 )) {
+            			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            			bool _hx_run(::String status){
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1926_buildMember)
+HXLINE(1926)				return (status == HX_("110",50,59,25,00));
+            			}
+            			HX_END_LOCAL_FUNC1(return)
+
+HXLINE(1926)			oneTen = ( (::String)(::Lambda_obj::find(tmp1, ::Dynamic(new _hx_Closure_0()))) );
+            		}
+            		else {
+HXLINE(1926)			oneTen = null();
+            		}
+HXLINE(1927)		 ::borogove::JID jid = ::borogove::JID_obj::parse(this->chatId)->withResource(resource);
+HXLINE(1928)		::String nick;
+HXDLIN(1928)		if (::hx::IsNotNull( resource )) {
+HXLINE(1928)			nick = resource;
+            		}
+            		else {
+HXLINE(1928)			nick = this->getDisplayName();
+            		}
+HXLINE(1929)		::Array< ::Dynamic> roles;
+HXDLIN(1929)		::Array< ::Dynamic> tmp2;
+HXDLIN(1929)		if (::hx::IsNotNull( presence )) {
+HXLINE(1929)			::Array< ::Dynamic> _this1;
+HXDLIN(1929)			 ::borogove::Stanza tmp3 = presence->getChild(HX_("hats",b8,30,08,45),HX_("urn:xmpp:hats:0",8a,fe,c7,65));
+HXDLIN(1929)			::Array< ::Dynamic> tmp4;
+HXDLIN(1929)			if (::hx::IsNotNull( tmp3 )) {
+HXLINE(1929)				tmp4 = tmp3->allTags(HX_("hat",5b,3f,4f,00),null());
+            			}
+            			else {
+HXLINE(1929)				tmp4 = null();
+            			}
+HXDLIN(1929)			if (::hx::IsNotNull( tmp4 )) {
+HXLINE(1929)				_this1 = tmp4;
+            			}
+            			else {
+HXLINE(1929)				_this1 = ::Array_obj< ::Dynamic>::__new(0);
+            			}
+HXDLIN(1929)			::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new(_this1->length);
+HXDLIN(1929)			{
+HXLINE(1929)				int _g2 = 0;
+HXDLIN(1929)				int _g3 = _this1->length;
+HXDLIN(1929)				while((_g2 < _g3)){
+HXLINE(1929)					_g2 = (_g2 + 1);
+HXDLIN(1929)					int i1 = (_g2 - 1);
+HXDLIN(1929)					{
+HXLINE(1929)						 ::borogove::Stanza hat = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this1,i1)) );
+HXDLIN(1929)						::String inValue1;
+HXDLIN(1929)						::String tmp5 = ( (::String)(::Reflect_obj::field(hat->attr,HX_("uri",6c,2b,59,00))) );
+HXDLIN(1929)						if (::hx::IsNotNull( tmp5 )) {
+HXLINE(1929)							inValue1 = tmp5;
+            						}
+            						else {
+HXLINE(1929)							inValue1 = HX_("",00,00,00,00);
+            						}
+HXDLIN(1929)						::String tmp6 = ( (::String)(::Reflect_obj::field(hat->attr,HX_("title",98,15,3b,10))) );
+HXDLIN(1929)						::String inValue2;
+HXDLIN(1929)						if (::hx::IsNotNull( tmp6 )) {
+HXLINE(1929)							inValue2 = tmp6;
+            						}
+            						else {
+HXLINE(1929)							inValue2 = HX_("",00,00,00,00);
+            						}
+HXDLIN(1929)						result1->__unsafe_set(i1, ::borogove::Role_obj::__alloc( HX_CTX ,inValue1,inValue2));
+            					}
+            				}
+            			}
+HXDLIN(1929)			tmp2 = result1;
+            		}
+            		else {
+HXLINE(1929)			tmp2 = null();
+            		}
+HXDLIN(1929)		if (::hx::IsNotNull( tmp2 )) {
+HXLINE(1929)			roles = tmp2;
+            		}
+            		else {
+HXLINE(1929)			roles = ::Array_obj< ::Dynamic>::__new(0);
+            		}
+HXLINE(1930)		 ::borogove::Stanza tmp7 = presence->getChild(HX_("occupant-id",2b,a5,8b,91),HX_("urn:xmpp:occupant-id:0",05,d7,05,11));
+HXDLIN(1930)		 ::Dynamic tmp8;
+HXDLIN(1930)		if (::hx::IsNotNull( tmp7 )) {
+HXLINE(1930)			tmp8 = tmp7->attr;
+            		}
+            		else {
+HXLINE(1930)			tmp8 = null();
+            		}
+HXDLIN(1930)		::String occupantId;
+HXDLIN(1930)		if (::hx::IsNotNull( tmp8 )) {
+HXLINE(1930)			occupantId = ( (::String)(::Reflect_obj::field(tmp8,HX_("id",db,5b,00,00))) );
+            		}
+            		else {
+HXLINE(1930)			occupantId = null();
+            		}
+HXLINE(1931)		::String id;
+HXDLIN(1931)		if (::hx::IsNull( occupantId )) {
+HXLINE(1931)			id = jid->asString();
+            		}
+            		else {
+HXLINE(1931)			id = ((this->chatId + HX_("/",2f,00,00,00)) + occupantId);
+            		}
+HXLINE(1932)		 ::borogove::Stanza _hx_tmp;
+HXDLIN(1932)		if (::hx::IsNotNull( presence )) {
+HXLINE(1932)			_hx_tmp = presence->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
+            		}
+            		else {
+HXLINE(1932)			_hx_tmp = null();
+            		}
+HXDLIN(1932)		if (::hx::IsNotNull( _hx_tmp )) {
+HXLINE(1933)			::String affRole;
+HXDLIN(1933)			 ::borogove::Stanza tmp9 = presence->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14))->getChild(HX_("item",13,c5,bf,45),null());
+HXDLIN(1933)			 ::Dynamic tmp10;
+HXDLIN(1933)			if (::hx::IsNotNull( tmp9 )) {
+HXLINE(1933)				tmp10 = tmp9->attr;
+            			}
+            			else {
+HXLINE(1933)				tmp10 = null();
+            			}
+HXDLIN(1933)			::String tmp11;
+HXDLIN(1933)			if (::hx::IsNotNull( tmp10 )) {
+HXLINE(1933)				tmp11 = ( (::String)(::Reflect_obj::field(tmp10,HX_("affiliation",b0,1a,35,a1))) );
+            			}
+            			else {
+HXLINE(1933)				tmp11 = null();
+            			}
+HXDLIN(1933)			if (::hx::IsNotNull( tmp11 )) {
+HXLINE(1933)				affRole = tmp11;
+            			}
+            			else {
+HXLINE(1933)				affRole = HX_("none",b8,12,0a,49);
+            			}
+HXDLIN(1933)			 ::borogove::Role affRole1 = ::borogove::Role_obj::forAffiliation(affRole);
+HXLINE(1934)			if (::hx::IsNotNull( affRole1 )) {
+HXLINE(1934)				roles->unshift(affRole1);
+            			}
+            		}
+HXLINE(1936)		bool _hx_tmp1;
+HXDLIN(1936)		if (::hx::IsNull( oneTen )) {
+HXLINE(1936)			 ::borogove::Member tmp12 = this->self;
+HXDLIN(1936)			::String _hx_tmp2;
+HXDLIN(1936)			if (::hx::IsNotNull( tmp12 )) {
+HXLINE(1936)				_hx_tmp2 = tmp12->id;
+            			}
+            			else {
+HXLINE(1936)				_hx_tmp2 = null();
+            			}
+HXDLIN(1936)			_hx_tmp1 = (id == _hx_tmp2);
+            		}
+            		else {
+HXLINE(1936)			_hx_tmp1 = true;
+            		}
+HXDLIN(1936)		if (_hx_tmp1) {
+HXLINE(1937)			 ::borogove::Client chat = this->client;
+HXDLIN(1937)			 ::borogove::DirectChat chat1 = chat->getDirectChat(this->client->accountId(),false);
+HXLINE(1941)			::String _hx_tmp3 = chat1->getPhoto();
+HXLINE(1944)			 ::borogove::JID _hx_tmp4 = ::borogove::JID_obj::parse(chat1->chatId);
+HXLINE(1945)			 ::haxe::ds::StringMap _g4 =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXDLIN(1945)			_g4->set(nick,presence);
+HXLINE(1946)			::String chat2 = chat1->chatId;
+HXDLIN(1946)			::String _hx_tmp5 = chat1->getDisplayName();
+HXLINE(1938)			return  ::borogove::Member_obj::__alloc( HX_CTX ,id,nick,_hx_tmp3,true,roles,_hx_tmp4,_g4, ::borogove::AvailableChat_obj::__alloc( HX_CTX ,chat2,_hx_tmp5,chat1->chatId,::borogove::CapsRepo_obj::empty));
+            		}
+            		else {
+HXLINE(1949)			 ::borogove::Stanza tmp13;
+HXDLIN(1949)			if (::hx::IsNotNull( presence )) {
+HXLINE(1949)				tmp13 = presence->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
+            			}
+            			else {
+HXLINE(1949)				tmp13 = null();
+            			}
+HXDLIN(1949)			 ::borogove::JID tmp14;
+HXDLIN(1949)			if (::hx::IsNotNull( tmp13 )) {
+HXLINE(1949)				 ::borogove::Stanza tmp15 = tmp13->getChild(HX_("item",13,c5,bf,45),null());
+HXDLIN(1949)				 ::Dynamic tmp16;
+HXDLIN(1949)				if (::hx::IsNotNull( tmp15 )) {
+HXLINE(1949)					tmp16 = tmp15->attr;
+            				}
+            				else {
+HXLINE(1949)					tmp16 = null();
+            				}
+HXDLIN(1949)				::String jid1;
+HXDLIN(1949)				if (::hx::IsNotNull( tmp16 )) {
+HXLINE(1949)					jid1 = ( (::String)(::Reflect_obj::field(tmp16,HX_("jid",c5,ca,50,00))) );
+            				}
+            				else {
+HXLINE(1949)					jid1 = null();
+            				}
+HXDLIN(1949)				if (::hx::IsNull( jid1 )) {
+HXLINE(1949)					tmp14 = null();
+            				}
+            				else {
+HXLINE(1949)					tmp14 = ::borogove::JID_obj::parse(jid1);
+            				}
+            			}
+            			else {
+HXLINE(1949)				tmp14 = null();
+            			}
+HXDLIN(1949)			 ::borogove::JID tmp17;
+HXDLIN(1949)			if (::hx::IsNotNull( tmp14 )) {
+HXLINE(1949)				tmp17 = tmp14->asBare();
+            			}
+            			else {
+HXLINE(1949)				tmp17 = null();
+            			}
+HXDLIN(1949)			::String trueJid;
+HXDLIN(1949)			if (::hx::IsNotNull( tmp17 )) {
+HXLINE(1949)				trueJid = tmp17->asString();
+            			}
+            			else {
+HXLINE(1949)				trueJid = null();
+            			}
+HXLINE(1953)			 ::borogove::Hash tmp18;
+HXDLIN(1953)			if (::hx::IsNotNull( presence )) {
+HXLINE(1953)				::String avatarSha1Hex = presence->findText(HX_("{vcard-temp:x:update}x/photo#",f6,a1,33,28));
+HXDLIN(1953)				bool tmp19;
+HXDLIN(1953)				if (::hx::IsNotNull( avatarSha1Hex )) {
+HXLINE(1953)					tmp19 = (avatarSha1Hex == HX_("",00,00,00,00));
+            				}
+            				else {
+HXLINE(1953)					tmp19 = true;
+            				}
+HXDLIN(1953)				if (tmp19) {
+HXLINE(1953)					tmp18 = null();
+            				}
+            				else {
+HXLINE(1953)					tmp18 = ::borogove::Hash_obj::fromHex(HX_("sha-1",90,a8,1c,7c),avatarSha1Hex);
+            				}
+            			}
+            			else {
+HXLINE(1953)				tmp18 = null();
+            			}
+HXDLIN(1953)			::String _hx_tmp6;
+HXDLIN(1953)			if (::hx::IsNotNull( tmp18 )) {
+HXLINE(1953)				_hx_tmp6 = tmp18->toUri();
+            			}
+            			else {
+HXLINE(1953)				_hx_tmp6 = null();
+            			}
+HXLINE(1956)			 ::borogove::JID _hx_tmp7;
+HXDLIN(1956)			if (::hx::IsNull( trueJid )) {
+HXLINE(1956)				_hx_tmp7 = jid;
+            			}
+            			else {
+HXLINE(1956)				_hx_tmp7 = ::borogove::JID_obj::parse(trueJid);
+            			}
+HXLINE(1957)			 ::haxe::ds::StringMap _g5 =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXDLIN(1957)			_g5->set(nick,presence);
+HXLINE(1958)			 ::borogove::AvailableChat _hx_tmp8;
+HXDLIN(1958)			if (::hx::IsNull( trueJid )) {
+HXLINE(1958)				_hx_tmp8 = null();
+            			}
+            			else {
+HXLINE(1958)				_hx_tmp8 =  ::borogove::AvailableChat_obj::__alloc( HX_CTX ,trueJid,nick,((((HX_("",00,00,00,00) + trueJid) + HX_(" (via ",9a,ee,c1,21)) + this->displayName) + HX_(")",29,00,00,00)),::borogove::CapsRepo_obj::empty);
+            			}
+HXLINE(1950)			return  ::borogove::Member_obj::__alloc( HX_CTX ,id,nick,_hx_tmp6,false,roles,_hx_tmp7,_g5,_hx_tmp8);
+            		}
+HXLINE(1936)		return null();
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(Channel_obj,buildMember,return )
+
+::Array< ::Dynamic> Channel_obj::availableRoles( ::borogove::Member member){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            		bool _hx_run( ::borogove::Role r){
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1966_availableRoles)
+HXLINE(1966)			return (r->id == HX_("owner",33,98,76,38));
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(1)
+            		bool _hx_run( ::borogove::Role r){
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1970_availableRoles)
+HXLINE(1970)			return (r->id == HX_("admin",8f,ac,4a,1c));
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1963_availableRoles)
+HXLINE(1964)		if (::hx::IsNull( this->self )) {
+HXLINE(1964)			return ::Array_obj< ::Dynamic>::__new(0);
+            		}
+HXLINE(1966)		if (::Lambda_obj::exists(this->self->roles, ::Dynamic(new _hx_Closure_0()))) {
+HXLINE(1967)			::Array< ::String > _g = ::Array_obj< ::String >::__new(0);
+HXDLIN(1967)			{
+HXLINE(1967)				int _g1 = 0;
+HXDLIN(1967)				::Array< ::String > _g2 = ::Array_obj< ::String >::fromData( _hx_array_data_da6a8256_91,4);
+HXDLIN(1967)				while((_g1 < _g2->length)){
+            					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1,::String,aff) HXARGC(1)
+            					bool _hx_run( ::borogove::Role r){
+            						HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1967_availableRoles)
+HXLINE(1967)						return (r->id == aff);
+            					}
+            					HX_END_LOCAL_FUNC1(return)
+
+HXLINE(1967)					::String v = _g2->__get(_g1);
+HXDLIN(1967)					_g1 = (_g1 + 1);
+HXDLIN(1967)					::String aff = v;
+HXDLIN(1967)					if (!(::Lambda_obj::exists(member->roles, ::Dynamic(new _hx_Closure_1(aff))))) {
+HXLINE(1967)						_g->push(v);
+            					}
+            				}
+            			}
+HXDLIN(1967)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_g->length);
+HXDLIN(1967)			{
+HXLINE(1967)				int _g3 = 0;
+HXDLIN(1967)				int _g4 = _g->length;
+HXDLIN(1967)				while((_g3 < _g4)){
+HXLINE(1967)					_g3 = (_g3 + 1);
+HXDLIN(1967)					int i = (_g3 - 1);
+HXDLIN(1967)					{
+HXLINE(1967)						 ::borogove::Role inValue = ::borogove::Role_obj::forAffiliation(( (::String)(_hx_array_unsafe_get(_g,i)) ));
+HXDLIN(1967)						result->__unsafe_set(i,inValue);
+            					}
+            				}
+            			}
+HXDLIN(1967)			return result;
+            		}
+HXLINE(1970)		if (::Lambda_obj::exists(this->self->roles, ::Dynamic(new _hx_Closure_2()))) {
+            			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_3) HXARGC(1)
+            			bool _hx_run( ::borogove::Role r){
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1971_availableRoles)
+HXLINE(1971)				return (r->id == HX_("owner",33,98,76,38));
+            			}
+            			HX_END_LOCAL_FUNC1(return)
+
+HXLINE(1971)			if (::Lambda_obj::exists(member->roles, ::Dynamic(new _hx_Closure_3()))) {
+HXLINE(1971)				return ::Array_obj< ::Dynamic>::__new(0);
+            			}
+HXLINE(1973)			::Array< ::String > _g5 = ::Array_obj< ::String >::__new(0);
+HXDLIN(1973)			{
+HXLINE(1973)				int _g6 = 0;
+HXDLIN(1973)				::Array< ::String > _g7 = ::Array_obj< ::String >::fromData( _hx_array_data_da6a8256_94,2);
+HXDLIN(1973)				while((_g6 < _g7->length)){
+            					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_4,::String,aff1) HXARGC(1)
+            					bool _hx_run( ::borogove::Role r){
+            						HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1973_availableRoles)
+HXLINE(1973)						return (r->id == aff1);
+            					}
+            					HX_END_LOCAL_FUNC1(return)
+
+HXLINE(1973)					::String v1 = _g7->__get(_g6);
+HXDLIN(1973)					_g6 = (_g6 + 1);
+HXDLIN(1973)					::String aff1 = v1;
+HXDLIN(1973)					if (!(::Lambda_obj::exists(member->roles, ::Dynamic(new _hx_Closure_4(aff1))))) {
+HXLINE(1973)						_g5->push(v1);
+            					}
+            				}
+            			}
+HXDLIN(1973)			::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new(_g5->length);
+HXDLIN(1973)			{
+HXLINE(1973)				int _g8 = 0;
+HXDLIN(1973)				int _g9 = _g5->length;
+HXDLIN(1973)				while((_g8 < _g9)){
+HXLINE(1973)					_g8 = (_g8 + 1);
+HXDLIN(1973)					int i1 = (_g8 - 1);
+HXDLIN(1973)					{
+HXLINE(1973)						 ::borogove::Role inValue1 = ::borogove::Role_obj::forAffiliation(( (::String)(_hx_array_unsafe_get(_g5,i1)) ));
+HXDLIN(1973)						result1->__unsafe_set(i1,inValue1);
+            					}
+            				}
+            			}
+HXDLIN(1973)			return result1;
+            		}
+HXLINE(1976)		return ::Array_obj< ::Dynamic>::__new(0);
+            	}
+
+
+bool Channel_obj::canRemoveRole( ::borogove::Member member, ::borogove::Role role){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            		bool _hx_run( ::borogove::Role r){
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1982_canRemoveRole)
+HXLINE(1982)			return (r->id == HX_("owner",33,98,76,38));
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
+            		bool _hx_run( ::borogove::Role r){
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1986_canRemoveRole)
+HXLINE(1986)			return (r->id == HX_("admin",8f,ac,4a,1c));
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1979_canRemoveRole)
+HXLINE(1980)		if (::hx::IsNull( this->self )) {
+HXLINE(1980)			return false;
+            		}
+HXLINE(1982)		if (::Lambda_obj::exists(this->self->roles, ::Dynamic(new _hx_Closure_0()))) {
+HXLINE(1983)			return ::Array_obj< ::String >::fromData( _hx_array_data_da6a8256_99,4)->contains(role->id);
+            		}
+HXLINE(1986)		if (::Lambda_obj::exists(this->self->roles, ::Dynamic(new _hx_Closure_1()))) {
+            			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(1)
+            			bool _hx_run( ::borogove::Role r){
+            				HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1987_canRemoveRole)
+HXLINE(1987)				return (r->id == HX_("owner",33,98,76,38));
+            			}
+            			HX_END_LOCAL_FUNC1(return)
+
+HXLINE(1987)			if (::Lambda_obj::exists(member->roles, ::Dynamic(new _hx_Closure_2()))) {
+HXLINE(1987)				return false;
+            			}
+HXLINE(1989)			return ::Array_obj< ::String >::fromData( _hx_array_data_da6a8256_101,3)->contains(role->id);
+            		}
+HXLINE(1992)		return false;
+            	}
+
+
+void Channel_obj::addRole( ::borogove::Member member, ::borogove::Role role){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            		void _hx_run( ::borogove::Stanza response){
+            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2001_addRole)
+            		}
+            		HX_END_LOCAL_FUNC1((void))
+
+            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1995_addRole)
+HXLINE(1996)		if (::hx::IsNull( member->chat )) {
+HXLINE(1996)			return;
+            		}
+HXLINE(1998)		 ::borogove::Stanza iq =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+            			->setFixed(0,HX_("to",7b,65,00,00),this->chatId)
+            			->setFixed(1,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("query",08,8b,ea,5d), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/muc#admin",d3,be,2f,5a))))->textTag(HX_("item",13,c5,bf,45),HX_("",00,00,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+            			->setFixed(0,HX_("affiliation",b0,1a,35,a1),role->id)
+            			->setFixed(1,HX_("jid",c5,ca,50,00),member->chat->chatId)));
+HXLINE(2001)		this->stream->sendIq(iq, ::Dynamic(new _hx_Closure_0()));
+            	}
+
+
+void Channel_obj::removeRole( ::borogove::Member member, ::borogove::Role role){
+            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2006_removeRole)
+HXDLIN(2006)		this->addRole(member, ::borogove::Role_obj::__alloc( HX_CTX ,HX_("member",5a,e2,b5,04),HX_("",00,00,00,00)));
+            	}
+
+
+::Dynamic Channel_obj::getMessagesBefore( ::borogove::ChatMessage before){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis, ::borogove::ChatMessage,before) HXARGC(1)
+            		::Dynamic _hx_run(::Array< ::Dynamic> messages){
+            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2014_getMessagesBefore)
+HXLINE(2014)			bool _hx_tmp;
+HXDLIN(2014)			if ((messages->length <= 0)) {
+HXLINE(2014)				if (::hx::IsNotNull( before )) {
+HXLINE(2014)					_hx_tmp = ::hx::IsNull( before->serverId );
+            				}
+            				else {
+HXLINE(2014)					_hx_tmp = false;
+            				}
+            			}
+            			else {
+HXLINE(2014)				_hx_tmp = true;
+            			}
+HXDLIN(2014)			if (_hx_tmp) {
+HXLINE(2015)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(messages);
             			}
             			else {
             				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis) HXARGC(2)
             				 ::borogove::ChatMessageBuilder _hx_run( ::borogove::ChatMessageBuilder builder, ::borogove::Stanza stanza){
-            					HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1643_getMessagesBefore)
-HXLINE(1644)					builder = _gthis->prepareIncomingMessage(builder,stanza);
-HXLINE(1645)					builder->syncPoint = false;
-HXLINE(1646)					return builder;
+            					HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2020_getMessagesBefore)
+HXLINE(2021)					builder = _gthis->prepareIncomingMessage(builder,stanza);
+HXLINE(2022)					builder->syncPoint = false;
+HXLINE(2023)					return builder;
             				}
             				HX_END_LOCAL_FUNC2(return)
 
-HXLINE(1640)				 ::Dynamic filter =  ::Dynamic(::hx::Anon_obj::Create(0));
-HXLINE(1641)				if (::hx::IsNotNull( beforeId )) {
-HXLINE(1641)					filter->__SetField(HX_("page",4f,da,51,4a), ::Dynamic(::hx::Anon_obj::Create(1)
-            						->setFixed(0,HX_("before",7f,54,32,9a),beforeId)),::hx::paccDynamic);
+HXLINE(2017)				 ::Dynamic filter =  ::Dynamic(::hx::Anon_obj::Create(0));
+HXLINE(2018)				::String tmp;
+HXDLIN(2018)				if (::hx::IsNotNull( before )) {
+HXLINE(2018)					tmp = before->serverId;
             				}
-HXLINE(1642)				 ::borogove::MessageSync sync =  ::borogove::MessageSync_obj::__alloc( HX_CTX ,_gthis->client,_gthis->stream,filter,_gthis->chatId);
-HXLINE(1643)				sync->addContext( ::Dynamic(new _hx_Closure_0(_gthis)));
-HXLINE(1648)				return _gthis->fetchFromSync(sync);
+            				else {
+HXLINE(2018)					tmp = null();
+            				}
+HXDLIN(2018)				::String _hx_tmp1;
+HXDLIN(2018)				if (::hx::IsNotNull( tmp )) {
+HXLINE(2018)					_hx_tmp1 = tmp;
+            				}
+            				else {
+HXLINE(2018)					_hx_tmp1 = HX_("",00,00,00,00);
+            				}
+HXDLIN(2018)				filter->__SetField(HX_("page",4f,da,51,4a), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("before",7f,54,32,9a),_hx_tmp1)),::hx::paccDynamic);
+HXLINE(2019)				::String sync;
+HXDLIN(2019)				if (::hx::IsNotNull( before )) {
+HXLINE(2019)					sync = before->sortId;
+            				}
+            				else {
+HXLINE(2019)					sync = null();
+            				}
+HXDLIN(2019)				 ::borogove::MessageSync sync1 =  ::borogove::MessageSync_obj::__alloc( HX_CTX ,_gthis->client,_gthis->stream,filter,null(),sync,_gthis->chatId);
+HXLINE(2020)				sync1->addContext( ::Dynamic(new _hx_Closure_0(_gthis)));
+HXLINE(2025)				return _gthis->fetchFromSync(sync1);
             			}
-HXLINE(1637)			return null();
+HXLINE(2014)			return null();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1635_getMessagesBefore)
-HXDLIN(1635)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1636)		::Dynamic _hx_tmp = this->persistence;
-HXDLIN(1636)		::String _hx_tmp1 = this->client->accountId();
-HXDLIN(1636)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesBefore(_hx_tmp,_hx_tmp1,this->chatId,beforeId,beforeTime), ::Dynamic(new _hx_Closure_1(_gthis,beforeId)),null());
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2010_getMessagesBefore)
+HXDLIN(2010)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(2011)		bool _hx_tmp;
+HXDLIN(2011)		if (::hx::IsNotNull( before )) {
+HXLINE(2011)			::String _hx_tmp1 = before->chatId();
+HXDLIN(2011)			_hx_tmp = (_hx_tmp1 != this->chatId);
+            		}
+            		else {
+HXLINE(2011)			_hx_tmp = false;
+            		}
+HXDLIN(2011)		if (_hx_tmp) {
+HXLINE(2011)			HX_STACK_DO_THROW(HX_("Cannot look before from a different chat",f7,e6,d9,fa));
+            		}
+HXLINE(2013)		::Dynamic _hx_tmp2 = this->persistence;
+HXDLIN(2013)		::String _hx_tmp3 = this->client->accountId();
+HXDLIN(2013)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesBefore(_hx_tmp2,_hx_tmp3,this->chatId,before), ::Dynamic(new _hx_Closure_1(_gthis,before)),null());
             	}
 
 
-::Dynamic Channel_obj::getMessagesAfter(::String afterId,::String afterTime){
-            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis,::String,afterId) HXARGC(1)
+::Dynamic Channel_obj::getMessagesAfter( ::borogove::ChatMessage after){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::ChatMessage,after, ::borogove::Channel,_gthis) HXARGC(1)
             		::Dynamic _hx_run(::Array< ::Dynamic> messages){
-            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1659_getMessagesAfter)
-HXLINE(1659)			if ((messages->length > 0)) {
-HXLINE(1660)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(messages);
+            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2038_getMessagesAfter)
+HXLINE(2038)			bool _hx_tmp;
+HXDLIN(2038)			if ((messages->length <= 0)) {
+HXLINE(2038)				if (::hx::IsNotNull( after )) {
+HXLINE(2038)					_hx_tmp = ::hx::IsNull( after->serverId );
+            				}
+            				else {
+HXLINE(2038)					_hx_tmp = false;
+            				}
+            			}
+            			else {
+HXLINE(2038)				_hx_tmp = true;
+            			}
+HXDLIN(2038)			if (_hx_tmp) {
+HXLINE(2039)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(messages);
             			}
             			else {
             				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis) HXARGC(2)
             				 ::borogove::ChatMessageBuilder _hx_run( ::borogove::ChatMessageBuilder builder, ::borogove::Stanza stanza){
-            					HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1665_getMessagesAfter)
-HXLINE(1666)					builder = _gthis->prepareIncomingMessage(builder,stanza);
-HXLINE(1667)					builder->syncPoint = false;
-HXLINE(1668)					return builder;
+            					HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2044_getMessagesAfter)
+HXLINE(2045)					builder = _gthis->prepareIncomingMessage(builder,stanza);
+HXLINE(2046)					builder->syncPoint = false;
+HXLINE(2047)					return builder;
             				}
             				HX_END_LOCAL_FUNC2(return)
 
-HXLINE(1662)				 ::Dynamic filter =  ::Dynamic(::hx::Anon_obj::Create(0));
-HXLINE(1663)				if (::hx::IsNotNull( afterId )) {
-HXLINE(1663)					filter->__SetField(HX_("page",4f,da,51,4a), ::Dynamic(::hx::Anon_obj::Create(1)
-            						->setFixed(0,HX_("after",1c,66,a2,1d),afterId)),::hx::paccDynamic);
+HXLINE(2041)				 ::Dynamic filter =  ::Dynamic(::hx::Anon_obj::Create(0));
+HXLINE(2042)				::String _hx_tmp1;
+HXDLIN(2042)				if (::hx::IsNotNull( after )) {
+HXLINE(2042)					_hx_tmp1 = after->serverId;
+            				}
+            				else {
+HXLINE(2042)					_hx_tmp1 = null();
+            				}
+HXDLIN(2042)				if (::hx::IsNotNull( _hx_tmp1 )) {
+HXLINE(2042)					filter->__SetField(HX_("page",4f,da,51,4a), ::Dynamic(::hx::Anon_obj::Create(1)
+            						->setFixed(0,HX_("after",1c,66,a2,1d),after->serverId)),::hx::paccDynamic);
+            				}
+HXLINE(2043)				::String sync;
+HXDLIN(2043)				if (::hx::IsNotNull( after )) {
+HXLINE(2043)					sync = after->sortId;
             				}
-HXLINE(1664)				 ::borogove::MessageSync sync =  ::borogove::MessageSync_obj::__alloc( HX_CTX ,_gthis->client,_gthis->stream,filter,_gthis->chatId);
-HXLINE(1665)				sync->addContext( ::Dynamic(new _hx_Closure_0(_gthis)));
-HXLINE(1670)				return _gthis->fetchFromSync(sync);
+            				else {
+HXLINE(2043)					sync = null();
+            				}
+HXDLIN(2043)				 ::borogove::MessageSync sync1 =  ::borogove::MessageSync_obj::__alloc( HX_CTX ,_gthis->client,_gthis->stream,filter,sync,null(),_gthis->chatId);
+HXLINE(2044)				sync1->addContext( ::Dynamic(new _hx_Closure_0(_gthis)));
+HXLINE(2049)				return _gthis->fetchFromSync(sync1);
             			}
-HXLINE(1659)			return null();
+HXLINE(2038)			return null();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1654_getMessagesAfter)
-HXDLIN(1654)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1655)		bool _hx_tmp;
-HXDLIN(1655)		::String afterId1 = afterId;
-HXDLIN(1655)		if ((afterId1 == this->lastMessageId())) {
-HXLINE(1655)			_hx_tmp = !(this->syncing());
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2031_getMessagesAfter)
+HXDLIN(2031)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(2032)		bool _hx_tmp;
+HXDLIN(2032)		if (::hx::IsNotNull( after )) {
+HXLINE(2032)			::String _hx_tmp1 = after->chatId();
+HXDLIN(2032)			_hx_tmp = (_hx_tmp1 != this->chatId);
+            		}
+            		else {
+HXLINE(2032)			_hx_tmp = false;
+            		}
+HXDLIN(2032)		if (_hx_tmp) {
+HXLINE(2032)			HX_STACK_DO_THROW(HX_("Cannot look after from a different chat",8c,1a,5f,f4));
+            		}
+HXLINE(2033)		bool _hx_tmp2;
+HXDLIN(2033)		bool _hx_tmp3;
+HXDLIN(2033)		bool _hx_tmp4;
+HXDLIN(2033)		if (::hx::IsNotNull( after )) {
+HXLINE(2033)			_hx_tmp4 = ::hx::IsNotNull( this->lastMessage );
+            		}
+            		else {
+HXLINE(2033)			_hx_tmp4 = false;
+            		}
+HXDLIN(2033)		if (_hx_tmp4) {
+HXLINE(2033)			_hx_tmp3 = this->lastMessage->canReplace(after);
             		}
             		else {
-HXLINE(1655)			_hx_tmp = false;
+HXLINE(2033)			_hx_tmp3 = false;
             		}
-HXDLIN(1655)		if (_hx_tmp) {
-HXLINE(1656)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+HXDLIN(2033)		if (_hx_tmp3) {
+HXLINE(2033)			_hx_tmp2 = this->inSync;
             		}
-HXLINE(1658)		::Dynamic _hx_tmp1 = this->persistence;
-HXDLIN(1658)		::String _hx_tmp2 = this->client->accountId();
-HXDLIN(1658)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesAfter(_hx_tmp1,_hx_tmp2,this->chatId,afterId,afterTime), ::Dynamic(new _hx_Closure_1(_gthis,afterId)),null());
+            		else {
+HXLINE(2033)			_hx_tmp2 = false;
+            		}
+HXDLIN(2033)		if (_hx_tmp2) {
+HXLINE(2034)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+            		}
+HXLINE(2037)		::Dynamic _hx_tmp5 = this->persistence;
+HXDLIN(2037)		::String _hx_tmp6 = this->client->accountId();
+HXDLIN(2037)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesAfter(_hx_tmp5,_hx_tmp6,this->chatId,after), ::Dynamic(new _hx_Closure_1(after,_gthis)),null());
             	}
 
 
-::Dynamic Channel_obj::getMessagesAround(::String aroundId,::String aroundTime){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1678_getMessagesAround)
-HXDLIN(1678)		::Dynamic _hx_tmp = this->persistence;
-HXDLIN(1678)		::String _hx_tmp1 = this->client->accountId();
-HXDLIN(1678)		return ::borogove::Persistence_obj::getMessagesAround(_hx_tmp,_hx_tmp1,this->chatId,aroundId,aroundTime);
+::Dynamic Channel_obj::getMessagesAround( ::borogove::ChatMessage around){
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2055_getMessagesAround)
+HXLINE(2056)		::String _hx_tmp = around->chatId();
+HXDLIN(2056)		if ((_hx_tmp != this->chatId)) {
+HXLINE(2056)			HX_STACK_DO_THROW(HX_("Cannot look around from a different chat",45,55,1b,ba));
+            		}
+HXLINE(2059)		::Dynamic _hx_tmp1 = this->persistence;
+HXDLIN(2059)		return ::borogove::Persistence_obj::getMessagesAround(_hx_tmp1,this->client->accountId(),around);
             	}
 
 
  ::borogove::ChatMessageBuilder Channel_obj::prepareIncomingMessage( ::borogove::ChatMessageBuilder message, ::borogove::Stanza stanza){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1682_prepareIncomingMessage)
-HXLINE(1683)		message->syncPoint = !(this->syncing());
-HXLINE(1684)		if ((message->type == 0)) {
-HXLINE(1684)			message->type = 3;
-            		}
-HXLINE(1685)		message->senderId = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
-HXLINE(1686)		::String _hx_tmp = message->get_senderId();
-HXDLIN(1686)		if ((_hx_tmp == this->getFullJid()->asString())) {
-HXLINE(1687)			message->recipients = message->replyTo;
-HXLINE(1688)			message->direction = 1;
-            		}
-HXLINE(1690)		return message;
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2063_prepareIncomingMessage)
+HXLINE(2064)		message->syncPoint = this->inSync;
+HXLINE(2065)		if ((message->type == 0)) {
+HXLINE(2065)			message->type = 3;
+            		}
+HXLINE(2066)		if (::hx::IsNull( message->sortId )) {
+HXLINE(2067)			bool _hx_tmp;
+HXDLIN(2067)			if (::hx::IsNotNull( this->sortId )) {
+HXLINE(2067)				_hx_tmp = (message->type == 2);
+            			}
+            			else {
+HXLINE(2067)				_hx_tmp = false;
+            			}
+HXDLIN(2067)			if (_hx_tmp) {
+HXLINE(2068)				this->sortId = (message->sortId = ::_FractionalIndexing::FractionalIndexing_Fields__obj::between(this->sortId,null(),HX_(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",6f,61,48,0a)));
+            			}
+            			else {
+HXLINE(2070)				message->sortId = this->client->nextSortId();
+            			}
+            		}
+HXLINE(2073)		 ::borogove::Stanza tmp = stanza->getChild(HX_("occupant-id",2b,a5,8b,91),HX_("urn:xmpp:occupant-id:0",05,d7,05,11));
+HXDLIN(2073)		 ::Dynamic tmp1;
+HXDLIN(2073)		if (::hx::IsNotNull( tmp )) {
+HXLINE(2073)			tmp1 = tmp->attr;
+            		}
+            		else {
+HXLINE(2073)			tmp1 = null();
+            		}
+HXDLIN(2073)		::String occupantId;
+HXDLIN(2073)		if (::hx::IsNotNull( tmp1 )) {
+HXLINE(2073)			occupantId = ( (::String)(::Reflect_obj::field(tmp1,HX_("id",db,5b,00,00))) );
+            		}
+            		else {
+HXLINE(2073)			occupantId = null();
+            		}
+HXLINE(2074)		::String _hx_tmp1;
+HXDLIN(2074)		if (::hx::IsNull( occupantId )) {
+HXLINE(2074)			_hx_tmp1 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
+            		}
+            		else {
+HXLINE(2074)			_hx_tmp1 = ((this->chatId + HX_("/",2f,00,00,00)) + occupantId);
+            		}
+HXDLIN(2074)		message->senderId = _hx_tmp1;
+HXLINE(2075)		::String _hx_tmp2 = message->get_senderId();
+HXDLIN(2075)		 ::borogove::Member tmp2 = this->self;
+HXDLIN(2075)		::String _hx_tmp3;
+HXDLIN(2075)		if (::hx::IsNotNull( tmp2 )) {
+HXLINE(2075)			_hx_tmp3 = tmp2->id;
+            		}
+            		else {
+HXLINE(2075)			_hx_tmp3 = null();
+            		}
+HXDLIN(2075)		if ((_hx_tmp2 == _hx_tmp3)) {
+HXLINE(2076)			message->recipients = message->replyTo;
+HXLINE(2077)			message->direction = 1;
+            		}
+HXLINE(2079)		return message;
             	}
 
 
  ::borogove::ChatMessageBuilder Channel_obj::prepareOutgoingMessage( ::borogove::ChatMessageBuilder message){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1693_prepareOutgoingMessage)
-HXLINE(1694)		message->type = 2;
-HXLINE(1695)		::String tmp = message->timestamp;
-HXDLIN(1695)		::String _hx_tmp;
-HXDLIN(1695)		if (::hx::IsNotNull( tmp )) {
-HXLINE(1695)			_hx_tmp = tmp;
-            		}
-            		else {
-HXLINE(1695)			_hx_tmp = ::borogove::Date_obj::format(::Date_obj::now());
-            		}
-HXDLIN(1695)		message->timestamp = _hx_tmp;
-HXLINE(1696)		message->direction = 1;
-HXLINE(1697)		message->from = this->client->jid;
-HXLINE(1698)		message->sender = this->getFullJid();
-HXLINE(1699)		message->replyTo = ::Array_obj< ::Dynamic>::__new(1)->init(0,message->sender);
-HXLINE(1700)		message->to = ::borogove::JID_obj::parse(this->chatId);
-HXLINE(1701)		message->recipients = ::Array_obj< ::Dynamic>::__new(1)->init(0,message->to);
-HXLINE(1702)		return message;
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2082_prepareOutgoingMessage)
+HXLINE(2083)		message->type = 2;
+HXLINE(2084)		::String tmp = message->timestamp;
+HXDLIN(2084)		::String _hx_tmp;
+HXDLIN(2084)		if (::hx::IsNotNull( tmp )) {
+HXLINE(2084)			_hx_tmp = tmp;
+            		}
+            		else {
+HXLINE(2084)			_hx_tmp = ::borogove::Date_obj::format(::Date_obj::now());
+            		}
+HXDLIN(2084)		message->timestamp = _hx_tmp;
+HXLINE(2085)		message->direction = 1;
+HXLINE(2086)		message->from = this->client->jid;
+HXLINE(2087)		 ::borogove::Member tmp1 = this->self;
+HXDLIN(2087)		::String tmp2;
+HXDLIN(2087)		if (::hx::IsNotNull( tmp1 )) {
+HXLINE(2087)			tmp2 = tmp1->id;
+            		}
+            		else {
+HXLINE(2087)			tmp2 = null();
+            		}
+HXDLIN(2087)		::String _hx_tmp1;
+HXDLIN(2087)		if (::hx::IsNotNull( tmp2 )) {
+HXLINE(2087)			_hx_tmp1 = tmp2;
+            		}
+            		else {
+HXLINE(2087)			_hx_tmp1 = this->getFullJid()->asString();
+            		}
+HXDLIN(2087)		message->senderId = _hx_tmp1;
+HXLINE(2088)		message->replyTo = ::Array_obj< ::Dynamic>::__new(1)->init(0,this->getFullJid());
+HXLINE(2089)		message->to = ::borogove::JID_obj::parse(this->chatId);
+HXLINE(2090)		message->recipients = ::Array_obj< ::Dynamic>::__new(1)->init(0,message->to);
+HXLINE(2091)		if (::hx::IsNull( message->localId )) {
+HXLINE(2091)			message->localId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+            		}
+HXLINE(2092)		bool _hx_tmp2;
+HXDLIN(2092)		if (::hx::IsNotNull( this->sortId )) {
+HXLINE(2092)			_hx_tmp2 = ::hx::IsNull( message->sortId );
+            		}
+            		else {
+HXLINE(2092)			_hx_tmp2 = false;
+            		}
+HXDLIN(2092)		if (_hx_tmp2) {
+HXLINE(2092)			this->sortId = (message->sortId = ::_FractionalIndexing::FractionalIndexing_Fields__obj::between(this->sortId,null(),HX_(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",6f,61,48,0a)));
+            		}
+HXLINE(2093)		return message;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Channel_obj,prepareOutgoingMessage,return )
 
-void Channel_obj::correctMessage(::String localId, ::borogove::ChatMessageBuilder message){
-            		HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis,::Array< ::Dynamic>,message1,::String,localId,::String,toSendId, ::borogove::OutboxItem,outboxItem) HXARGC(1)
-            		void _hx_run(::Array< ::Dynamic> corrected){
-            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1712_correctMessage)
-HXLINE(1713)			::Array< ::Dynamic> _hx_tmp;
-HXDLIN(1713)			 ::borogove::ChatMessage tmp = corrected->__get(0).StaticCast<  ::borogove::ChatMessage >()->versions->__get(0).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN(1713)			::String _hx_tmp1;
-HXDLIN(1713)			if (::hx::IsNotNull( tmp )) {
-HXLINE(1713)				_hx_tmp1 = tmp->localId;
+void Channel_obj::correctMessage( ::borogove::ChatMessage correct, ::borogove::ChatMessageBuilder message){
+            		HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis,::Array< ::Dynamic>,message1,::String,toSendId, ::borogove::OutboxItem,outboxItem, ::borogove::ChatMessage,correct) HXARGC(1)
+            		void _hx_run( ::borogove::ChatMessage corrected){
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2103_correctMessage)
+HXLINE(2104)			::Array< ::Dynamic> _hx_tmp;
+HXDLIN(2104)			 ::borogove::ChatMessage tmp = corrected->versions->__get(0).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN(2104)			::String _hx_tmp1;
+HXDLIN(2104)			if (::hx::IsNotNull( tmp )) {
+HXLINE(2104)				_hx_tmp1 = tmp->localId;
             			}
             			else {
-HXLINE(1713)				_hx_tmp1 = null();
+HXLINE(2104)				_hx_tmp1 = null();
             			}
-HXDLIN(1713)			if ((_hx_tmp1 == localId)) {
-HXLINE(1713)				_hx_tmp = corrected->__get(0).StaticCast<  ::borogove::ChatMessage >()->versions;
+HXDLIN(2104)			if ((_hx_tmp1 == correct->localId)) {
+HXLINE(2104)				_hx_tmp = corrected->versions;
             			}
             			else {
-HXLINE(1713)				_hx_tmp = ::Array_obj< ::Dynamic>::__new(1)->init(0,message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build());
-            			}
-HXDLIN(1713)			message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->versions = _hx_tmp;
-HXLINE(1714)			message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->localId = toSendId;
-HXLINE(1715)			 ::borogove::Channel _gthis1 = _gthis;
-HXDLIN(1715)			 ::borogove::Stanza _hx_tmp2 = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build()->asStanza();
-HXDLIN(1715)			_gthis1->sendMessageStanza(_hx_tmp2,outboxItem);
-HXLINE(1716)			_gthis->client->notifyMessageHandlers(corrected->__get(0).StaticCast<  ::borogove::ChatMessage >(),1);
-HXLINE(1717)			 ::borogove::ChatMessage tmp1 = _gthis->lastMessage;
-HXDLIN(1717)			::String _hx_tmp3;
-HXDLIN(1717)			if (::hx::IsNotNull( tmp1 )) {
-HXLINE(1717)				_hx_tmp3 = tmp1->localId;
+HXLINE(2104)				_hx_tmp = ::Array_obj< ::Dynamic>::__new(1)->init(0,message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build());
+            			}
+HXDLIN(2104)			message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->versions = _hx_tmp;
+HXLINE(2105)			message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->localId = toSendId;
+HXLINE(2106)			 ::borogove::Channel _gthis1 = _gthis;
+HXDLIN(2106)			 ::borogove::Stanza _hx_tmp2 = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build()->asStanza();
+HXDLIN(2106)			_gthis1->sendMessageStanza(_hx_tmp2,outboxItem);
+HXLINE(2107)			_gthis->client->notifyMessageHandlers(corrected,1);
+HXLINE(2108)			bool _hx_tmp3;
+HXDLIN(2108)			if (::hx::IsNotNull( _gthis->lastMessage )) {
+HXLINE(2108)				_hx_tmp3 = corrected->canReplace(_gthis->lastMessage);
             			}
             			else {
-HXLINE(1717)				_hx_tmp3 = null();
+HXLINE(2108)				_hx_tmp3 = true;
             			}
-HXDLIN(1717)			if ((localId == _hx_tmp3)) {
-HXLINE(1718)				_gthis->setLastMessage(corrected->__get(0).StaticCast<  ::borogove::ChatMessage >());
-HXLINE(1719)				_gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
+HXDLIN(2108)			if (_hx_tmp3) {
+            				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis) HXARGC(1)
+            				 ::borogove::EventResult _hx_run( ::Dynamic _){
+            					HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2110_correctMessage)
+HXLINE(2110)					return _gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+HXLINE(2109)				::thenshim::_Promise::Promise_Impl__obj::then(_gthis->setLastMessage(corrected), ::Dynamic(new _hx_Closure_0(_gthis)),null());
             			}
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1706_correctMessage)
-HXDLIN(1706)		::Array< ::Dynamic> message1 = ::Array_obj< ::Dynamic>::__new(1)->init(0,message);
-HXDLIN(1706)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1707)		::String toSendId = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->localId;
-HXLINE(1708)		message1[0] = this->prepareOutgoingMessage(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >());
-HXLINE(1709)		 ::borogove::ChatMessage _hx_tmp = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build();
-HXDLIN(1709)		message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->versions = ::Array_obj< ::Dynamic>::__new(1)->init(0,_hx_tmp);
-HXLINE(1710)		message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->localId = localId;
-HXLINE(1711)		 ::borogove::OutboxItem outboxItem = this->outbox->newItem();
-HXLINE(1712)		 ::borogove::Client _hx_tmp1 = this->client;
-HXDLIN(1712)		::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp1->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build())), ::Dynamic(new _hx_Closure_0(_gthis,message1,localId,toSendId,outboxItem)),null());
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2097_correctMessage)
+HXDLIN(2097)		::Array< ::Dynamic> message1 = ::Array_obj< ::Dynamic>::__new(1)->init(0,message);
+HXDLIN(2097)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(2098)		message1[0] = this->prepareOutgoingMessage(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >());
+HXLINE(2099)		::String toSendId = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->localId;
+HXLINE(2100)		 ::borogove::ChatMessage _hx_tmp = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build();
+HXDLIN(2100)		message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->versions = ::Array_obj< ::Dynamic>::__new(1)->init(0,_hx_tmp);
+HXLINE(2101)		message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->localId = correct->localId;
+HXLINE(2102)		 ::borogove::OutboxItem outboxItem = this->outbox->newItem();
+HXLINE(2103)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessageBuilder(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()), ::Dynamic(new _hx_Closure_1(_gthis,message1,toSendId,outboxItem,correct)),null());
             	}
 
 
 void Channel_obj::sendMessage( ::borogove::ChatMessageBuilder message){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1725_sendMessage)
-HXDLIN(1725)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1726)		if ((this->uiState == 3)) {
-HXLINE(1726)			this->uiState = 1;
-            		}
-HXLINE(1727)		if (::hx::IsNotNull( this->typingTimer )) {
-HXLINE(1727)			this->typingTimer->stop();
-            		}
-HXLINE(1728)		this->client->chatActivity(::hx::ObjectPtr<OBJ_>(this),null());
-HXLINE(1729)		message = this->prepareOutgoingMessage(message);
-HXLINE(1730)		 ::borogove::Stanza stanza = message->build()->asStanza();
-HXLINE(1732)		{
-HXLINE(1732)			 ::Dynamic this1 = stanza->attr;
-HXDLIN(1732)			::Reflect_obj::setField(this1,HX_("from",6a,a5,c2,43),this->getFullJid()->asString());
-            		}
-HXLINE(1733)		 ::borogove::MessageStanza fromStanza = ::borogove::Message_obj::fromStanza(stanza,this->client->jid,null(),null())->parsed;
-HXLINE(1734)		{
-HXLINE(1734)			 ::Dynamic this2 = stanza->attr;
-HXDLIN(1734)			::Reflect_obj::setField(this2,HX_("from",6a,a5,c2,43),this->client->jid->asString());
-            		}
-HXLINE(1735)		switch((int)(fromStanza->_hx_getIndex())){
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0,::Array< ::Dynamic>,message1) HXARGC(2)
+            		 ::borogove::ChatMessageBuilder _hx_run( ::borogove::ChatMessageBuilder builder, ::borogove::Stanza _){
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2125_sendMessage)
+HXLINE(2126)			if (::hx::IsNotNull( message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->get_senderId() )) {
+HXLINE(2126)				builder->senderId = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->get_senderId();
+            			}
+HXLINE(2127)			return builder;
+            		}
+            		HX_END_LOCAL_FUNC2(return)
+
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2117_sendMessage)
+HXDLIN(2117)		::Array< ::Dynamic> message1 = ::Array_obj< ::Dynamic>::__new(1)->init(0,message);
+HXDLIN(2117)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(2118)		if ((this->uiState == 3)) {
+HXLINE(2118)			this->uiState = 1;
+            		}
+HXLINE(2119)		if (::hx::IsNotNull( this->typingTimer )) {
+HXLINE(2119)			this->typingTimer->stop();
+            		}
+HXLINE(2120)		this->client->chatActivity(::hx::ObjectPtr<OBJ_>(this),null());
+HXLINE(2121)		message1[0] = this->prepareOutgoingMessage(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >());
+HXLINE(2122)		 ::borogove::Stanza stanza = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build()->asStanza();
+HXLINE(2124)		{
+HXLINE(2124)			 ::Dynamic this1 = stanza->attr;
+HXDLIN(2124)			::Reflect_obj::setField(this1,HX_("from",6a,a5,c2,43),this->getFullJid()->asString());
+            		}
+HXLINE(2125)		 ::borogove::MessageStanza fromStanza = ::borogove::Message_obj::fromStanza(stanza,this->client->jid, ::Dynamic(new _hx_Closure_0(message1)),null(),null())->parsed;
+HXLINE(2129)		{
+HXLINE(2129)			 ::Dynamic this2 = stanza->attr;
+HXDLIN(2129)			::Reflect_obj::setField(this2,HX_("from",6a,a5,c2,43),this->client->jid->asString());
+            		}
+HXLINE(2130)		switch((int)(fromStanza->_hx_getIndex())){
             			case (int)1: {
-            				HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis, ::borogove::OutboxItem,outboxItem, ::borogove::Stanza,stanza) HXARGC(1)
-            				 ::borogove::EventResult _hx_run(::Array< ::Dynamic> stored){
-            					HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1743_sendMessage)
-HXLINE(1744)					_gthis->sendMessageStanza(stanza,outboxItem);
-HXLINE(1745)					_gthis->setLastMessage(stored->__get(0).StaticCast<  ::borogove::ChatMessage >());
-HXLINE(1746)					int _hx_tmp;
-HXDLIN(1746)					if ((stored->__get(0).StaticCast<  ::borogove::ChatMessage >()->versions->length > 1)) {
-HXLINE(1746)						_hx_tmp = 1;
-            					}
-            					else {
-HXLINE(1746)						_hx_tmp = 0;
+            				HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_2, ::borogove::Channel,_gthis, ::borogove::OutboxItem,outboxItem, ::borogove::Stanza,stanza) HXARGC(1)
+            				::Dynamic _hx_run( ::borogove::ChatMessage stored){
+            					HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis, ::borogove::ChatMessage,stored) HXARGC(1)
+            					 ::borogove::EventResult _hx_run( ::Dynamic _){
+            						HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2140_sendMessage)
+HXLINE(2141)						int _hx_tmp;
+HXDLIN(2141)						if ((stored->versions->length > 1)) {
+HXLINE(2141)							_hx_tmp = 1;
+            						}
+            						else {
+HXLINE(2141)							_hx_tmp = 0;
+            						}
+HXDLIN(2141)						_gthis->client->notifyMessageHandlers(stored,_hx_tmp);
+HXLINE(2142)						return _gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
             					}
-HXDLIN(1746)					_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),_hx_tmp);
-HXLINE(1747)					return _gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
+            					HX_END_LOCAL_FUNC1(return)
+
+            					HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2138_sendMessage)
+HXLINE(2139)					_gthis->sendMessageStanza(stanza,outboxItem);
+HXLINE(2140)					return ::thenshim::_Promise::Promise_Impl__obj::then(_gthis->setLastMessage(stored), ::Dynamic(new _hx_Closure_1(_gthis,stored)),null());
             				}
             				HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1737)				if (::hx::IsNotNull( this->isActive )) {
-HXLINE(1738)					this->isActive = true;
-HXLINE(1739)					this->activeThread = message->threadId;
-HXLINE(1740)					stanza->tag(HX_("active",c6,41,46,16), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(2132)				if (::hx::IsNotNull( this->isActive )) {
+HXLINE(2133)					this->isActive = true;
+HXLINE(2134)					this->activeThread = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->threadId;
+HXLINE(2135)					stanza->tag(HX_("active",c6,41,46,16), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/chatstates",8e,6d,41,6d))))->up();
             				}
-HXLINE(1742)				 ::borogove::OutboxItem outboxItem = this->outbox->newItem();
-HXLINE(1743)				 ::borogove::Client _hx_tmp = this->client;
-HXDLIN(1743)				::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,message->build())), ::Dynamic(new _hx_Closure_0(_gthis,outboxItem,stanza)),null());
+HXLINE(2137)				 ::borogove::OutboxItem outboxItem = this->outbox->newItem();
+HXLINE(2138)				::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessageBuilder(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()), ::Dynamic(new _hx_Closure_2(_gthis,outboxItem,stanza)),null());
             			}
             			break;
-            			case (int)3: {
-            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis, ::borogove::Stanza,stanza) HXARGC(1)
+            			case (int)4: {
+            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_3, ::borogove::Channel,_gthis, ::borogove::Stanza,stanza) HXARGC(1)
             				void _hx_run( ::borogove::ChatMessage stored){
-            					HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1750_sendMessage)
-HXLINE(1751)					_gthis->client->sendStanza(stanza);
-HXLINE(1752)					if (::hx::IsNotNull( stored )) {
-HXLINE(1752)						_gthis->client->notifyMessageHandlers(stored,2);
+            					HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2146_sendMessage)
+HXLINE(2147)					_gthis->client->sendStanza(stanza);
+HXLINE(2148)					if (::hx::IsNotNull( stored )) {
+HXLINE(2148)						_gthis->client->notifyMessageHandlers(stored,2);
             					}
             				}
             				HX_END_LOCAL_FUNC1((void))
 
-HXLINE(1750)				::Dynamic _hx_tmp1 = this->persistence;
-HXDLIN(1750)				::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_hx_tmp1,this->client->accountId(),fromStanza->_hx_getObject(0).StaticCast<  ::borogove::ReactionUpdate >()), ::Dynamic(new _hx_Closure_1(_gthis,stanza)),null());
+HXLINE(2146)				::Dynamic _hx_tmp = this->persistence;
+HXDLIN(2146)				::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_hx_tmp,this->client->accountId(),fromStanza->_hx_getObject(0).StaticCast<  ::borogove::ReactionUpdate >()), ::Dynamic(new _hx_Closure_3(_gthis,stanza)),null());
             			}
             			break;
             			default:{
-HXLINE(1755)				::haxe::Log_obj::trace(HX_("Invalid message",7e,ab,89,95), ::Dynamic(::hx::Anon_obj::Create(5)
+HXLINE(2151)				::haxe::Log_obj::trace(HX_("Invalid message",7e,ab,89,95), ::Dynamic(::hx::Anon_obj::Create(5)
             					->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Channel",56,82,6a,da))
             					->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,fromStanza))
             					->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("sendMessage",5f,89,1d,24))
             					->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Chat.hx",98,ae,63,17))
-            					->setFixed(4,HX_("lineNumber",dd,81,22,76),1755)));
-HXLINE(1756)				HX_STACK_DO_THROW(HX_("Trying to send invalid message.",dc,74,a0,91));
+            					->setFixed(4,HX_("lineNumber",dd,81,22,76),2151)));
+HXLINE(2152)				HX_STACK_DO_THROW(HX_("Trying to send invalid message.",dc,74,a0,91));
             			}
             		}
             	}
@@ -1726,181 +2831,184 @@ HXLINE(1756)				HX_STACK_DO_THROW(HX_("Trying to send invalid message.",dc,74,a0
 void Channel_obj::removeReaction( ::borogove::ChatMessage m, ::borogove::Reaction reaction){
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis, ::borogove::ReactionUpdate,update4, ::borogove::OutboxItem,outboxItem) HXARGC(1)
             		void _hx_run( ::borogove::ChatMessage stored){
-            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1782_removeReaction)
-HXLINE(1783)			 ::borogove::Channel _gthis1 = _gthis;
-HXDLIN(1783)			 ::borogove::Stanza _hx_tmp = update4->asStanza();
-HXDLIN(1783)			_gthis1->sendMessageStanza(_hx_tmp,outboxItem);
-HXLINE(1784)			if (::hx::IsNotNull( stored )) {
-HXLINE(1784)				_gthis->client->notifyMessageHandlers(stored,2);
+            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2181_removeReaction)
+HXLINE(2182)			 ::borogove::Channel _gthis1 = _gthis;
+HXDLIN(2182)			 ::borogove::Stanza _hx_tmp = update4->asStanza();
+HXDLIN(2182)			_gthis1->sendMessageStanza(_hx_tmp,outboxItem);
+HXLINE(2183)			if (::hx::IsNotNull( stored )) {
+HXLINE(2183)				_gthis->client->notifyMessageHandlers(stored,2);
             			}
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1761_removeReaction)
-HXDLIN(1761)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1762)		if (::Std_obj::isOfType(reaction,::hx::ClassOf< ::borogove::CustomEmojiReaction >())) {
-HXLINE(1763)			if (::hx::IsNull( reaction->envelopeId )) {
-HXLINE(1763)				HX_STACK_DO_THROW(HX_("Cannot remove custom emoji reaction without envelopeId",90,e6,80,fb));
-            			}
-HXLINE(1764)			 ::borogove::ChatMessageBuilder correct = m->reply();
-HXLINE(1765)			correct->localId = ::borogove::ID_obj::_hx_long();
-HXLINE(1766)			correct->setHtml(HX_("",00,00,00,00));
-HXLINE(1767)			correct->text = null();
-HXLINE(1768)			this->correctMessage(reaction->envelopeId,correct);
-HXLINE(1769)			return;
-            		}
-HXLINE(1773)		::Array< ::Dynamic> reactions = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1774)		{
-HXLINE(1774)			::Dynamic this1 = m->reactions;
-HXDLIN(1774)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this1);
-HXDLIN(1774)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE(1774)				::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXDLIN(1774)				::Array< ::Dynamic> _g_value = ( (::Array< ::Dynamic>)(::haxe::IMap_obj::get(this1,key)) );
-HXLINE(1775)				if ((key != reaction->key)) {
+            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2157_removeReaction)
+HXDLIN(2157)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(2158)		if (::Std_obj::isOfType(reaction,::hx::ClassOf< ::borogove::CustomEmojiReaction >())) {
+HXLINE(2159)			if (::hx::IsNull( reaction->envelopeId )) {
+HXLINE(2159)				HX_STACK_DO_THROW(HX_("Cannot remove custom emoji reaction without envelopeId",90,e6,80,fb));
+            			}
+HXLINE(2160)			 ::borogove::ChatMessageBuilder correct = m->reply();
+HXLINE(2161)			correct->localId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXLINE(2162)			correct->setBody(null());
+HXLINE(2164)			 ::borogove::ChatMessageBuilder fakeEnvelope =  ::borogove::ChatMessageBuilder_obj::__alloc( HX_CTX );
+HXLINE(2165)			fakeEnvelope->localId = reaction->envelopeId;
+HXLINE(2166)			fakeEnvelope->senderId = reaction->senderId;
+HXLINE(2167)			this->correctMessage(fakeEnvelope->build(),correct);
+HXLINE(2168)			return;
+            		}
+HXLINE(2172)		::Array< ::Dynamic> reactions = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(2173)		{
+HXLINE(2173)			::Dynamic this1 = m->reactions;
+HXDLIN(2173)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this1);
+HXDLIN(2173)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(2173)				::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN(2173)				::Array< ::Dynamic> _g_value = ( (::Array< ::Dynamic>)(::haxe::IMap_obj::get(this1,key)) );
+HXLINE(2174)				if ((key != reaction->key)) {
             					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis) HXARGC(1)
             					bool _hx_run( ::borogove::Reaction r){
-            						HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1776_removeReaction)
-HXLINE(1776)						::String r1 = r->senderId;
-HXDLIN(1776)						return (r1 == _gthis->getFullJid()->asString());
+            						HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2175_removeReaction)
+HXLINE(2175)						 ::borogove::Member tmp = _gthis->self;
+HXDLIN(2175)						::String react;
+HXDLIN(2175)						if (::hx::IsNotNull( tmp )) {
+HXLINE(2175)							react = tmp->id;
+            						}
+            						else {
+HXLINE(2175)							react = null();
+            						}
+HXDLIN(2175)						return (r->senderId == react);
             					}
             					HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1776)					 ::borogove::Reaction react = ( ( ::borogove::Reaction)(::Lambda_obj::find(_g_value, ::Dynamic(new _hx_Closure_0(_gthis)))) );
-HXLINE(1777)					bool _hx_tmp;
-HXDLIN(1777)					if (::hx::IsNotNull( react )) {
-HXLINE(1777)						_hx_tmp = !(::Std_obj::isOfType(react,::hx::ClassOf< ::borogove::CustomEmojiReaction >()));
+HXLINE(2175)					 ::borogove::Reaction react = ( ( ::borogove::Reaction)(::Lambda_obj::find(_g_value, ::Dynamic(new _hx_Closure_0(_gthis)))) );
+HXLINE(2176)					bool _hx_tmp;
+HXDLIN(2176)					if (::hx::IsNotNull( react )) {
+HXLINE(2176)						_hx_tmp = !(::Std_obj::isOfType(react,::hx::ClassOf< ::borogove::CustomEmojiReaction >()));
             					}
             					else {
-HXLINE(1777)						_hx_tmp = false;
+HXLINE(2176)						_hx_tmp = false;
             					}
-HXDLIN(1777)					if (_hx_tmp) {
-HXLINE(1777)						reactions->push(react);
+HXDLIN(2176)					if (_hx_tmp) {
+HXLINE(2176)						reactions->push(react);
             					}
             				}
             			}
             		}
-HXLINE(1780)		::String update = ::borogove::ID_obj::_hx_long();
-HXDLIN(1780)		::String m1 = m->serverId;
-HXDLIN(1780)		::String update1 = m->chatId();
-HXDLIN(1780)		::String update2 = m->chatId();
-HXDLIN(1780)		::String update3 = this->getFullJid()->asString();
-HXDLIN(1780)		 ::borogove::ReactionUpdate update4 =  ::borogove::ReactionUpdate_obj::__alloc( HX_CTX ,update,m1,update1,null(),update2,update3,::borogove::Date_obj::format(::Date_obj::now()),reactions,0);
-HXLINE(1781)		 ::borogove::OutboxItem outboxItem = this->outbox->newItem();
-HXLINE(1782)		::Dynamic _hx_tmp1 = this->persistence;
-HXDLIN(1782)		::String _hx_tmp2 = this->client->accountId();
-HXDLIN(1782)		::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_hx_tmp1,_hx_tmp2,update4), ::Dynamic(new _hx_Closure_1(_gthis,update4,outboxItem)),null());
+HXLINE(2179)		::String update = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXDLIN(2179)		::String m1 = m->serverId;
+HXDLIN(2179)		::String update1 = m->chatId();
+HXDLIN(2179)		::String update2 = m->chatId();
+HXDLIN(2179)		 ::borogove::Member tmp = this->self;
+HXDLIN(2179)		::String update3;
+HXDLIN(2179)		if (::hx::IsNotNull( tmp )) {
+HXLINE(2179)			update3 = tmp->id;
+            		}
+            		else {
+HXLINE(2179)			update3 = null();
+            		}
+HXDLIN(2179)		 ::borogove::ReactionUpdate update4 =  ::borogove::ReactionUpdate_obj::__alloc( HX_CTX ,update,m1,update1,null(),update2,update3,::borogove::Date_obj::format(::Date_obj::now()),reactions,0);
+HXLINE(2180)		 ::borogove::OutboxItem outboxItem = this->outbox->newItem();
+HXLINE(2181)		::Dynamic _hx_tmp1 = this->persistence;
+HXDLIN(2181)		::String _hx_tmp2 = this->client->accountId();
+HXDLIN(2181)		::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_hx_tmp1,_hx_tmp2,update4), ::Dynamic(new _hx_Closure_1(_gthis,update4,outboxItem)),null());
             	}
 
 
 void Channel_obj::sendMessageStanza( ::borogove::Stanza stanza, ::borogove::OutboxItem outboxItem){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis, ::borogove::Stanza,stanza) HXARGC(0)
             		void _hx_run(){
-            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1794_sendMessageStanza)
-HXLINE(1794)			_gthis->client->sendStanza(stanza);
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2193_sendMessageStanza)
+HXLINE(2193)			_gthis->client->sendStanza(stanza);
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1788_sendMessageStanza)
-HXDLIN(1788)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1789)		if ((stanza->name != HX_("message",c7,35,11,9a))) {
-HXLINE(1789)			HX_STACK_DO_THROW(HX_("Can only send message stanza this way",cb,e1,b3,60));
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2187_sendMessageStanza)
+HXDLIN(2187)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(2188)		if ((stanza->name != HX_("message",c7,35,11,9a))) {
+HXLINE(2188)			HX_STACK_DO_THROW(HX_("Can only send message stanza this way",cb,e1,b3,60));
             		}
-HXLINE(1791)		if (::hx::IsNull( outboxItem )) {
-HXLINE(1791)			outboxItem = this->outbox->newItem();
+HXLINE(2190)		if (::hx::IsNull( outboxItem )) {
+HXLINE(2190)			outboxItem = this->outbox->newItem();
             		}
-HXLINE(1792)		::Reflect_obj::setField(stanza->attr,HX_("type",ba,f2,08,4d),HX_("groupchat",97,1d,c8,e5));
-HXLINE(1793)		::Reflect_obj::setField(stanza->attr,HX_("to",7b,65,00,00),this->chatId);
-HXLINE(1794)		outboxItem->handle( ::Dynamic(new _hx_Closure_0(_gthis,stanza)));
-            	}
-
-
-::String Channel_obj::lastMessageId(){
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1799_lastMessageId)
-HXDLIN(1799)		 ::borogove::ChatMessage tmp = this->lastMessage;
-HXDLIN(1799)		if (::hx::IsNotNull( tmp )) {
-HXDLIN(1799)			return tmp->serverId;
-            		}
-            		else {
-HXDLIN(1799)			return null();
-            		}
-HXDLIN(1799)		return null();
+HXLINE(2191)		::Reflect_obj::setField(stanza->attr,HX_("type",ba,f2,08,4d),HX_("groupchat",97,1d,c8,e5));
+HXLINE(2192)		::Reflect_obj::setField(stanza->attr,HX_("to",7b,65,00,00),this->chatId);
+HXLINE(2193)		outboxItem->handle( ::Dynamic(new _hx_Closure_0(_gthis,stanza)));
             	}
 
 
 void Channel_obj::markReadUpTo( ::borogove::ChatMessage message){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis, ::borogove::ChatMessage,message) HXARGC(1)
             		void _hx_run( ::Dynamic _){
-            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1804_markReadUpTo)
-HXLINE(1807)			bool _hx_tmp;
-HXDLIN(1807)			if (message->isIncoming()) {
-HXLINE(1807)				_hx_tmp = ::hx::IsNotNull( message->serverId );
+            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2198_markReadUpTo)
+HXLINE(2201)			bool _hx_tmp;
+HXDLIN(2201)			if (message->isIncoming()) {
+HXLINE(2201)				_hx_tmp = ::hx::IsNotNull( message->serverId );
             			}
             			else {
-HXLINE(1807)				_hx_tmp = false;
+HXLINE(2201)				_hx_tmp = false;
             			}
-HXDLIN(1807)			if (_hx_tmp) {
-HXLINE(1808)				::String _gthis1 = _gthis->chatId;
-HXDLIN(1808)				::String stanza = ::borogove::ID_obj::_hx_long();
-HXDLIN(1808)				 ::borogove::Stanza stanza1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(3)
+HXDLIN(2201)			if (_hx_tmp) {
+HXLINE(2202)				::String _gthis1 = _gthis->chatId;
+HXDLIN(2202)				::String stanza = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXDLIN(2202)				 ::borogove::Stanza stanza1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(3)
             					->setFixed(0,HX_("id",db,5b,00,00),stanza)
             					->setFixed(1,HX_("to",7b,65,00,00),_gthis1)
             					->setFixed(2,HX_("type",ba,f2,08,4d),HX_("groupchat",97,1d,c8,e5))))->tag(HX_("displayed",21,17,db,c1), ::Dynamic(::hx::Anon_obj::Create(2)
             					->setFixed(0,HX_("id",db,5b,00,00),message->serverId)
             					->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:chat-markers:0",96,b8,66,e7))))->up();
-HXLINE(1810)				if (::hx::IsNotNull( message->threadId )) {
-HXLINE(1811)					stanza1->textTag(HX_("thread",ca,7a,b9,8e),message->threadId,null());
+HXLINE(2204)				if (::hx::IsNotNull( message->threadId )) {
+HXLINE(2205)					stanza1->textTag(HX_("thread",ca,7a,b9,8e),message->threadId,null());
             				}
-HXLINE(1813)				_gthis->client->sendStanza(stanza1);
+HXLINE(2207)				_gthis->client->sendStanza(stanza1);
             			}
-HXLINE(1816)			_gthis->publishMds();
-HXLINE(1817)			_gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
+HXLINE(2210)			_gthis->publishMds();
+HXLINE(2211)			_gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
             		}
             		HX_END_LOCAL_FUNC1((void))
 
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             		::Dynamic _hx_run( ::Dynamic e){
-            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1819_markReadUpTo)
-HXLINE(1819)			if (::hx::IsNotNull( e )) {
-HXLINE(1819)				return ::thenshim::_Promise::Promise_Impl__obj::reject(e);
+            			HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2213_markReadUpTo)
+HXLINE(2213)			if (::hx::IsNotNull( e )) {
+HXLINE(2213)				return ::thenshim::_Promise::Promise_Impl__obj::reject(e);
             			}
             			else {
-HXLINE(1819)				return null();
+HXLINE(2213)				return null();
             			}
-HXDLIN(1819)			return null();
+HXDLIN(2213)			return null();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1803_markReadUpTo)
-HXDLIN(1803)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1804)		::thenshim::_Promise::Promise_Impl__obj::then(this->markReadUpToMessage(message), ::Dynamic(new _hx_Closure_0(_gthis,message)), ::Dynamic(new _hx_Closure_1()));
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2197_markReadUpTo)
+HXDLIN(2197)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(2198)		::thenshim::_Promise::Promise_Impl__obj::then(this->markReadUpToMessage(message), ::Dynamic(new _hx_Closure_0(_gthis,message)), ::Dynamic(new _hx_Closure_1()));
             	}
 
 
 void Channel_obj::bookmark(){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,_gthis) HXARGC(1)
             		void _hx_run( ::borogove::Stanza response){
-            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1845_bookmark)
-HXLINE(1845)			if ((( (::String)(::Reflect_obj::field(response->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
-HXLINE(1846)				 ::borogove::Stanza tmp = response->getChild(HX_("error",c8,cb,29,73),null());
-HXDLIN(1846)				 ::borogove::Stanza preconditionError;
-HXDLIN(1846)				if (::hx::IsNotNull( tmp )) {
-HXLINE(1846)					preconditionError = tmp->getChild(HX_("precondition-not-met",2d,db,78,db),HX_("http://jabber.org/protocol/pubsub#errors",97,74,3a,a8));
+            			HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2239_bookmark)
+HXLINE(2239)			if ((( (::String)(::Reflect_obj::field(response->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
+HXLINE(2240)				 ::borogove::Stanza tmp = response->getChild(HX_("error",c8,cb,29,73),null());
+HXDLIN(2240)				 ::borogove::Stanza preconditionError;
+HXDLIN(2240)				if (::hx::IsNotNull( tmp )) {
+HXLINE(2240)					preconditionError = tmp->getChild(HX_("precondition-not-met",2d,db,78,db),HX_("http://jabber.org/protocol/pubsub#errors",97,74,3a,a8));
             				}
             				else {
-HXLINE(1846)					preconditionError = null();
+HXLINE(2240)					preconditionError = null();
             				}
-HXLINE(1847)				if (::hx::IsNotNull( preconditionError )) {
+HXLINE(2241)				if (::hx::IsNotNull( preconditionError )) {
             					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,_gthis) HXARGC(1)
             					void _hx_run( ::borogove::Stanza response){
-            						HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1863_bookmark)
-HXLINE(1863)						if ((( (::String)(::Reflect_obj::field(response->attr,HX_("type",ba,f2,08,4d))) ) == HX_("result",dd,68,84,08))) {
-HXLINE(1864)							_gthis->bookmark();
+            						HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2257_bookmark)
+HXLINE(2257)						if ((( (::String)(::Reflect_obj::field(response->attr,HX_("type",ba,f2,08,4d))) ) == HX_("result",dd,68,84,08))) {
+HXLINE(2258)							_gthis->bookmark();
             						}
             					}
             					HX_END_LOCAL_FUNC1((void))
 
-HXLINE(1849)					 ::borogove::GenericStream _gthis1 = _gthis->stream;
-HXDLIN(1849)					_gthis1->sendIq( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(2243)					 ::borogove::GenericStream _gthis1 = _gthis->stream;
+HXDLIN(2243)					_gthis1->sendIq( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("pubsub",e3,da,f8,66), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/pubsub#owner",c7,28,a3,08))))->tag(HX_("configure",e6,f9,5b,c0), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("node",02,0a,0a,49),HX_("urn:xmpp:bookmarks:1",58,3c,53,7d))))->tag(HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
@@ -1919,38 +3027,38 @@ HXDLIN(1849)					_gthis1->sendIq( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1823_bookmark)
-HXDLIN(1823)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1824)		if ((this->uiState == 3)) {
-HXLINE(1824)			this->uiState = 1;
+            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2217_bookmark)
+HXDLIN(2217)		 ::borogove::Channel _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(2218)		if ((this->uiState == 3)) {
+HXLINE(2218)			this->uiState = 1;
             		}
-HXLINE(1825)		 ::borogove::GenericStream _hx_tmp = this->stream;
-HXLINE(1826)		 ::borogove::Stanza _hx_tmp1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(2219)		 ::borogove::GenericStream _hx_tmp = this->stream;
+HXLINE(2220)		 ::borogove::Stanza _hx_tmp1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("pubsub",e3,da,f8,66), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/pubsub",57,94,3c,f2))))->tag(HX_("publish",8f,21,1d,ae), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("node",02,0a,0a,49),HX_("urn:xmpp:bookmarks:1",58,3c,53,7d))))->tag(HX_("item",13,c5,bf,45), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("id",db,5b,00,00),this->chatId)));
-HXLINE(1830)		::String _hx_tmp2 = this->getDisplayName();
-HXDLIN(1830)		::String _hx_tmp3;
-HXDLIN(1830)		bool _hx_tmp4;
-HXDLIN(1830)		if ((this->uiState != 2)) {
-HXLINE(1830)			_hx_tmp4 = (this->uiState == 3);
+HXLINE(2224)		::String _hx_tmp2 = this->getDisplayName();
+HXDLIN(2224)		::String _hx_tmp3;
+HXDLIN(2224)		bool _hx_tmp4;
+HXDLIN(2224)		if ((this->uiState != 2)) {
+HXLINE(2224)			_hx_tmp4 = (this->uiState == 3);
             		}
             		else {
-HXLINE(1830)			_hx_tmp4 = true;
+HXLINE(2224)			_hx_tmp4 = true;
             		}
-HXDLIN(1830)		if (_hx_tmp4) {
-HXLINE(1830)			_hx_tmp3 = HX_("false",a3,35,4f,fb);
+HXDLIN(2224)		if (_hx_tmp4) {
+HXLINE(2224)			_hx_tmp3 = HX_("false",a3,35,4f,fb);
             		}
             		else {
-HXLINE(1830)			_hx_tmp3 = HX_("true",4e,a7,03,4d);
+HXLINE(2224)			_hx_tmp3 = HX_("true",4e,a7,03,4d);
             		}
-HXLINE(1826)		 ::borogove::Stanza _hx_tmp5 = _hx_tmp1->tag(HX_("conference",1c,2b,83,41), ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE(2220)		 ::borogove::Stanza _hx_tmp5 = _hx_tmp1->tag(HX_("conference",1c,2b,83,41), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("autojoin",d9,f6,b1,3e),_hx_tmp3)
             			->setFixed(1,HX_("name",4b,72,ff,48),_hx_tmp2)
             			->setFixed(2,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:bookmarks:1",58,3c,53,7d))));
-HXLINE(1831)		::String _hx_tmp6 = this->client->displayName();
-HXLINE(1825)		_hx_tmp->sendIq(_hx_tmp5->textTag(HX_("nick",a3,7b,05,49),_hx_tmp6,null())->addChild(this->extensions)->up()->up()->tag(HX_("publish-options",60,0b,5c,74),null())->tag(HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE(2225)		::String _hx_tmp6 = this->client->displayName();
+HXLINE(2219)		_hx_tmp->sendIq(_hx_tmp5->textTag(HX_("nick",a3,7b,05,49),_hx_tmp6,null())->addChild(this->extensions)->up()->up()->tag(HX_("publish-options",60,0b,5c,74),null())->tag(HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("type",ba,f2,08,4d),HX_("submit",18,58,06,9a))
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("jabber:x:data",c2,e1,e9,7c))))->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("var",e7,de,59,00),HX_("FORM_TYPE",d5,96,c9,5a))
@@ -1965,64 +3073,64 @@ HXLINE(1825)		_hx_tmp->sendIq(_hx_tmp5->textTag(HX_("nick",a3,7b,05,49),_hx_tmp6
 
 
 void Channel_obj::sendChatState(::String state,::String threadId){
-            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1874_sendChatState)
-HXLINE(1876)		::String stanza = ::borogove::ID_obj::_hx_long();
-HXLINE(1878)		::String stanza1 = this->client->jid->asString();
-HXLINE(1875)		 ::borogove::Stanza stanza2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(4)
+            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2268_sendChatState)
+HXLINE(2270)		::String stanza = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXLINE(2272)		::String stanza1 = this->client->jid->asString();
+HXLINE(2269)		 ::borogove::Stanza stanza2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(4)
             			->setFixed(0,HX_("id",db,5b,00,00),stanza)
             			->setFixed(1,HX_("to",7b,65,00,00),this->chatId)
             			->setFixed(2,HX_("from",6a,a5,c2,43),stanza1)
             			->setFixed(3,HX_("type",ba,f2,08,4d),HX_("groupchat",97,1d,c8,e5))))->tag(state, ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/chatstates",8e,6d,41,6d))))->up();
-HXLINE(1883)		if (::hx::IsNotNull( threadId )) {
-HXLINE(1884)			stanza2->textTag(HX_("thread",ca,7a,b9,8e),threadId,null());
+HXLINE(2277)		if (::hx::IsNotNull( threadId )) {
+HXLINE(2278)			stanza2->textTag(HX_("thread",ca,7a,b9,8e),threadId,null());
             		}
-HXLINE(1886)		this->stream->sendStanza(stanza2);
+HXLINE(2280)		this->stream->sendStanza(stanza2);
             	}
 
 
 void Channel_obj::close(){
-            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1890_close)
-HXLINE(1891)		if (::hx::IsNotNull( this->typingTimer )) {
-HXLINE(1891)			this->typingTimer->stop();
-            		}
-HXLINE(1892)		if ((this->uiState == 3)) {
-HXLINE(1893)			int _g = 0;
-HXDLIN(1893)			::Array< ::Dynamic> _g1 = this->invites();
-HXDLIN(1893)			while((_g < _g1->length)){
-HXLINE(1893)				 ::borogove::Stanza invite = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
-HXDLIN(1893)				_g = (_g + 1);
-HXLINE(1894)				 ::borogove::Client _hx_tmp = this->client;
-HXLINE(1895)				::String _hx_tmp1 = ::borogove::ID_obj::_hx_long();
-HXDLIN(1895)				 ::borogove::Stanza _hx_tmp2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_GC_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_2284_close)
+HXLINE(2285)		if (::hx::IsNotNull( this->typingTimer )) {
+HXLINE(2285)			this->typingTimer->stop();
+            		}
+HXLINE(2286)		if ((this->uiState == 3)) {
+HXLINE(2287)			int _g = 0;
+HXDLIN(2287)			::Array< ::Dynamic> _g1 = this->invites();
+HXDLIN(2287)			while((_g < _g1->length)){
+HXLINE(2287)				 ::borogove::Stanza invite = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN(2287)				_g = (_g + 1);
+HXLINE(2288)				 ::borogove::Client _hx_tmp = this->client;
+HXLINE(2289)				::String _hx_tmp1 = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXDLIN(2289)				 ::borogove::Stanza _hx_tmp2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(2)
             					->setFixed(0,HX_("id",db,5b,00,00),_hx_tmp1)
             					->setFixed(1,HX_("to",7b,65,00,00),this->chatId)))->tag(HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14))));
-HXLINE(1894)				_hx_tmp->sendStanza(_hx_tmp2->tag(HX_("decline",b6,5a,cc,e8), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(2288)				_hx_tmp->sendStanza(_hx_tmp2->tag(HX_("decline",b6,5a,cc,e8), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("to",7b,65,00,00),( (::String)(::Reflect_obj::field(invite->attr,HX_("from",6a,a5,c2,43))) ))))->up()->up());
             			}
             		}
-HXLINE(1902)		this->uiState = 2;
-HXLINE(1903)		::Dynamic _hx_tmp3 = this->persistence;
-HXDLIN(1903)		::borogove::Persistence_obj::storeChats(_hx_tmp3,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
-HXLINE(1904)		this->selfPing(false);
-HXLINE(1905)		this->bookmark();
-HXLINE(1906)		this->sendChatState(HX_("gone",5f,94,69,44),null());
-HXLINE(1907)		this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+HXLINE(2296)		this->uiState = 2;
+HXLINE(2297)		::Dynamic _hx_tmp3 = this->persistence;
+HXDLIN(2297)		::borogove::Persistence_obj::storeChats(_hx_tmp3,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+HXLINE(2298)		this->selfPing(false);
+HXLINE(2299)		this->bookmark();
+HXLINE(2300)		this->sendChatState(HX_("gone",5f,94,69,44),null());
+HXLINE(2301)		this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
             	}
 
 
 
-::hx::ObjectPtr< Channel_obj > Channel_obj::__new( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy, ::borogove::Caps disco) {
+::hx::ObjectPtr< Channel_obj > Channel_obj::__new( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy, ::borogove::Caps disco) {
 	::hx::ObjectPtr< Channel_obj > __this = new Channel_obj();
-	__this->__construct(client,stream,persistence,chatId,__o_uiState,__o_isBlocked,extensions,readUpToId,readUpToBy,disco);
+	__this->__construct(client,stream,persistence,chatId,__o_uiState,__o_isBookmarked,__o_isBlocked,extensions,readUpToId,readUpToBy,disco);
 	return __this;
 }
 
-::hx::ObjectPtr< Channel_obj > Channel_obj::__alloc(::hx::Ctx *_hx_ctx, ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy, ::borogove::Caps disco) {
+::hx::ObjectPtr< Channel_obj > Channel_obj::__alloc(::hx::Ctx *_hx_ctx, ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy, ::borogove::Caps disco) {
 	Channel_obj *__this = (Channel_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Channel_obj), true, "borogove.Channel"));
 	*(void **)__this = Channel_obj::_hx_vtable;
-	__this->__construct(client,stream,persistence,chatId,__o_uiState,__o_isBlocked,extensions,readUpToId,readUpToBy,disco);
+	__this->__construct(client,stream,persistence,chatId,__o_uiState,__o_isBookmarked,__o_isBlocked,extensions,readUpToId,readUpToBy,disco);
 	return __this;
 }
 
@@ -2035,9 +3143,14 @@ void Channel_obj::__Mark(HX_MARK_PARAMS)
 	HX_MARK_BEGIN_CLASS(Channel);
 	HX_MARK_MEMBER_NAME(disco,"disco");
 	HX_MARK_MEMBER_NAME(inSync,"inSync");
+	HX_MARK_MEMBER_NAME(joinFailed,"joinFailed");
 	HX_MARK_MEMBER_NAME(sync,"sync");
 	HX_MARK_MEMBER_NAME(forceLive,"forceLive");
-	HX_MARK_MEMBER_NAME(_nickInUse,"_nickInUse");
+	HX_MARK_MEMBER_NAME(self,"self");
+	HX_MARK_MEMBER_NAME(mavUntil,"mavUntil");
+	HX_MARK_MEMBER_NAME(membersForName,"membersForName");
+	HX_MARK_MEMBER_NAME(sortId,"sortId");
+	HX_MARK_MEMBER_NAME(lastMessageSenderName,"lastMessageSenderName");
 	 ::borogove::Chat_obj::__Mark(HX_MARK_ARG);
 	HX_MARK_END_CLASS();
 }
@@ -2046,9 +3159,14 @@ void Channel_obj::__Visit(HX_VISIT_PARAMS)
 {
 	HX_VISIT_MEMBER_NAME(disco,"disco");
 	HX_VISIT_MEMBER_NAME(inSync,"inSync");
+	HX_VISIT_MEMBER_NAME(joinFailed,"joinFailed");
 	HX_VISIT_MEMBER_NAME(sync,"sync");
 	HX_VISIT_MEMBER_NAME(forceLive,"forceLive");
-	HX_VISIT_MEMBER_NAME(_nickInUse,"_nickInUse");
+	HX_VISIT_MEMBER_NAME(self,"self");
+	HX_VISIT_MEMBER_NAME(mavUntil,"mavUntil");
+	HX_VISIT_MEMBER_NAME(membersForName,"membersForName");
+	HX_VISIT_MEMBER_NAME(sortId,"sortId");
+	HX_VISIT_MEMBER_NAME(lastMessageSenderName,"lastMessageSenderName");
 	 ::borogove::Chat_obj::__Visit(HX_VISIT_ARG);
 }
 
@@ -2057,6 +3175,7 @@ void Channel_obj::__Visit(HX_VISIT_PARAMS)
 	switch(inName.length) {
 	case 4:
 		if (HX_FIELD_EQ(inName,"sync") ) { return ::hx::Val( sync ); }
+		if (HX_FIELD_EQ(inName,"self") ) { return ::hx::Val( self ); }
 		if (HX_FIELD_EQ(inName,"join") ) { return ::hx::Val( join_dyn() ); }
 		if (HX_FIELD_EQ(inName,"info") ) { return ::hx::Val( info_dyn() ); }
 		break;
@@ -2066,16 +3185,21 @@ void Channel_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 6:
 		if (HX_FIELD_EQ(inName,"inSync") ) { return ::hx::Val( inSync ); }
+		if (HX_FIELD_EQ(inName,"sortId") ) { return ::hx::Val( sortId ); }
 		if (HX_FIELD_EQ(inName,"invite") ) { return ::hx::Val( invite_dyn() ); }
 		if (HX_FIELD_EQ(inName,"doSync") ) { return ::hx::Val( doSync_dyn() ); }
 		break;
 	case 7:
+		if (HX_FIELD_EQ(inName,"subject") ) { return ::hx::Val( subject_dyn() ); }
 		if (HX_FIELD_EQ(inName,"canSend") ) { return ::hx::Val( canSend_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getCaps") ) { return ::hx::Val( getCaps_dyn() ); }
 		if (HX_FIELD_EQ(inName,"preview") ) { return ::hx::Val( preview_dyn() ); }
 		if (HX_FIELD_EQ(inName,"syncing") ) { return ::hx::Val( syncing_dyn() ); }
+		if (HX_FIELD_EQ(inName,"members") ) { return ::hx::Val( members_dyn() ); }
+		if (HX_FIELD_EQ(inName,"addRole") ) { return ::hx::Val( addRole_dyn() ); }
 		break;
 	case 8:
+		if (HX_FIELD_EQ(inName,"mavUntil") ) { return ::hx::Val( mavUntil ); }
 		if (HX_FIELD_EQ(inName,"selfPing") ) { return ::hx::Val( selfPing_dyn() ); }
 		if (HX_FIELD_EQ(inName,"bookmark") ) { return ::hx::Val( bookmark_dyn() ); }
 		break;
@@ -2087,13 +3211,16 @@ void Channel_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"nickInUse") ) { return ::hx::Val( nickInUse_dyn() ); }
 		break;
 	case 10:
-		if (HX_FIELD_EQ(inName,"_nickInUse") ) { return ::hx::Val( _nickInUse ); }
+		if (HX_FIELD_EQ(inName,"joinFailed") ) { return ::hx::Val( joinFailed ); }
 		if (HX_FIELD_EQ(inName,"setTrusted") ) { return ::hx::Val( setTrusted_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getFullJid") ) { return ::hx::Val( getFullJid_dyn() ); }
+		if (HX_FIELD_EQ(inName,"removeRole") ) { return ::hx::Val( removeRole_dyn() ); }
 		break;
 	case 11:
 		if (HX_FIELD_EQ(inName,"description") ) { return ::hx::Val( description_dyn() ); }
+		if (HX_FIELD_EQ(inName,"canModerate") ) { return ::hx::Val( canModerate_dyn() ); }
 		if (HX_FIELD_EQ(inName,"setPresence") ) { return ::hx::Val( setPresence_dyn() ); }
+		if (HX_FIELD_EQ(inName,"buildMember") ) { return ::hx::Val( buildMember_dyn() ); }
 		if (HX_FIELD_EQ(inName,"sendMessage") ) { return ::hx::Val( sendMessage_dyn() ); }
 		break;
 	case 12:
@@ -2104,19 +3231,22 @@ void Channel_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"markReadUpTo") ) { return ::hx::Val( markReadUpTo_dyn() ); }
 		break;
 	case 13:
-		if (HX_FIELD_EQ(inName,"lastMessageId") ) { return ::hx::Val( lastMessageId_dyn() ); }
+		if (HX_FIELD_EQ(inName,"canRemoveRole") ) { return ::hx::Val( canRemoveRole_dyn() ); }
 		if (HX_FIELD_EQ(inName,"sendChatState") ) { return ::hx::Val( sendChatState_dyn() ); }
 		break;
 	case 14:
+		if (HX_FIELD_EQ(inName,"membersForName") ) { return ::hx::Val( membersForName ); }
 		if (HX_FIELD_EQ(inName,"getDisplayName") ) { return ::hx::Val( getDisplayName_dyn() ); }
+		if (HX_FIELD_EQ(inName,"setLastMessage") ) { return ::hx::Val( setLastMessage_dyn() ); }
+		if (HX_FIELD_EQ(inName,"availableRoles") ) { return ::hx::Val( availableRoles_dyn() ); }
 		if (HX_FIELD_EQ(inName,"correctMessage") ) { return ::hx::Val( correctMessage_dyn() ); }
 		if (HX_FIELD_EQ(inName,"removeReaction") ) { return ::hx::Val( removeReaction_dyn() ); }
 		break;
 	case 15:
 		if (HX_FIELD_EQ(inName,"selfPingSuccess") ) { return ::hx::Val( selfPingSuccess_dyn() ); }
-		if (HX_FIELD_EQ(inName,"getParticipants") ) { return ::hx::Val( getParticipants_dyn() ); }
 		break;
 	case 16:
+		if (HX_FIELD_EQ(inName,"getMemberDetails") ) { return ::hx::Val( getMemberDetails_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getMessagesAfter") ) { return ::hx::Val( getMessagesAfter_dyn() ); }
 		break;
 	case 17:
@@ -2128,7 +3258,7 @@ void Channel_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"setupNotifications") ) { return ::hx::Val( setupNotifications_dyn() ); }
 		break;
 	case 21:
-		if (HX_FIELD_EQ(inName,"getParticipantDetails") ) { return ::hx::Val( getParticipantDetails_dyn() ); }
+		if (HX_FIELD_EQ(inName,"lastMessageSenderName") ) { return ::hx::Val( lastMessageSenderName ); }
 		break;
 	case 22:
 		if (HX_FIELD_EQ(inName,"prepareIncomingMessage") ) { return ::hx::Val( prepareIncomingMessage_dyn() ); }
@@ -2142,18 +3272,29 @@ void Channel_obj::__Visit(HX_VISIT_PARAMS)
 	switch(inName.length) {
 	case 4:
 		if (HX_FIELD_EQ(inName,"sync") ) { sync=inValue.Cast<  ::borogove::MessageSync >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"self") ) { self=inValue.Cast<  ::borogove::Member >(); return inValue; }
 		break;
 	case 5:
 		if (HX_FIELD_EQ(inName,"disco") ) { disco=inValue.Cast<  ::borogove::Caps >(); return inValue; }
 		break;
 	case 6:
 		if (HX_FIELD_EQ(inName,"inSync") ) { inSync=inValue.Cast< bool >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"sortId") ) { sortId=inValue.Cast< ::String >(); return inValue; }
+		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"mavUntil") ) { mavUntil=inValue.Cast< ::String >(); return inValue; }
 		break;
 	case 9:
 		if (HX_FIELD_EQ(inName,"forceLive") ) { forceLive=inValue.Cast< bool >(); return inValue; }
 		break;
 	case 10:
-		if (HX_FIELD_EQ(inName,"_nickInUse") ) { _nickInUse=inValue.Cast< ::String >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"joinFailed") ) { joinFailed=inValue.Cast<  ::borogove::Stanza >(); return inValue; }
+		break;
+	case 14:
+		if (HX_FIELD_EQ(inName,"membersForName") ) { membersForName=inValue.Cast< ::Array< ::Dynamic> >(); return inValue; }
+		break;
+	case 21:
+		if (HX_FIELD_EQ(inName,"lastMessageSenderName") ) { lastMessageSenderName=inValue.Cast< ::String >(); return inValue; }
 	}
 	return super::__SetField(inName,inValue,inCallProp);
 }
@@ -2162,9 +3303,14 @@ void Channel_obj::__GetFields(Array< ::String> &outFields)
 {
 	outFields->push(HX_("disco",7a,03,d1,d9));
 	outFields->push(HX_("inSync",e0,98,c5,88));
+	outFields->push(HX_("joinFailed",47,39,ff,85));
 	outFields->push(HX_("sync",5b,ba,5f,4c));
 	outFields->push(HX_("forceLive",77,ce,f7,4c));
-	outFields->push(HX_("_nickInUse",80,a6,41,a3));
+	outFields->push(HX_("self",8c,8b,50,4c));
+	outFields->push(HX_("mavUntil",9c,52,56,84));
+	outFields->push(HX_("membersForName",1b,56,f2,d2));
+	outFields->push(HX_("sortId",d9,7a,37,30));
+	outFields->push(HX_("lastMessageSenderName",11,72,8f,0b));
 	super::__GetFields(outFields);
 };
 
@@ -2172,9 +3318,14 @@ void Channel_obj::__GetFields(Array< ::String> &outFields)
 static ::hx::StorageInfo Channel_obj_sMemberStorageInfo[] = {
 	{::hx::fsObject /*  ::borogove::Caps */ ,(int)offsetof(Channel_obj,disco),HX_("disco",7a,03,d1,d9)},
 	{::hx::fsBool,(int)offsetof(Channel_obj,inSync),HX_("inSync",e0,98,c5,88)},
+	{::hx::fsObject /*  ::borogove::Stanza */ ,(int)offsetof(Channel_obj,joinFailed),HX_("joinFailed",47,39,ff,85)},
 	{::hx::fsObject /*  ::borogove::MessageSync */ ,(int)offsetof(Channel_obj,sync),HX_("sync",5b,ba,5f,4c)},
 	{::hx::fsBool,(int)offsetof(Channel_obj,forceLive),HX_("forceLive",77,ce,f7,4c)},
-	{::hx::fsString,(int)offsetof(Channel_obj,_nickInUse),HX_("_nickInUse",80,a6,41,a3)},
+	{::hx::fsObject /*  ::borogove::Member */ ,(int)offsetof(Channel_obj,self),HX_("self",8c,8b,50,4c)},
+	{::hx::fsString,(int)offsetof(Channel_obj,mavUntil),HX_("mavUntil",9c,52,56,84)},
+	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(Channel_obj,membersForName),HX_("membersForName",1b,56,f2,d2)},
+	{::hx::fsString,(int)offsetof(Channel_obj,sortId),HX_("sortId",d9,7a,37,30)},
+	{::hx::fsString,(int)offsetof(Channel_obj,lastMessageSenderName),HX_("lastMessageSenderName",11,72,8f,0b)},
 	{ ::hx::fsUnknown, 0, null()}
 };
 static ::hx::StaticInfo *Channel_obj_sStaticStorageInfo = 0;
@@ -2183,18 +3334,25 @@ static ::hx::StaticInfo *Channel_obj_sStaticStorageInfo = 0;
 static ::String Channel_obj_sMemberFields[] = {
 	HX_("disco",7a,03,d1,d9),
 	HX_("inSync",e0,98,c5,88),
+	HX_("joinFailed",47,39,ff,85),
 	HX_("sync",5b,ba,5f,4c),
 	HX_("forceLive",77,ce,f7,4c),
-	HX_("_nickInUse",80,a6,41,a3),
+	HX_("self",8c,8b,50,4c),
+	HX_("mavUntil",9c,52,56,84),
+	HX_("membersForName",1b,56,f2,d2),
+	HX_("sortId",d9,7a,37,30),
+	HX_("lastMessageSenderName",11,72,8f,0b),
 	HX_("selfPing",1e,60,3c,38),
 	HX_("join",ea,33,65,46),
 	HX_("selfPingSuccess",45,4d,98,ab),
 	HX_("getDisplayName",b7,64,90,b8),
+	HX_("subject",ac,01,88,29),
 	HX_("description",fc,08,1d,5f),
 	HX_("info",6e,38,bb,45),
 	HX_("invite",c9,f1,db,9f),
 	HX_("canInvite",f9,45,22,f2),
 	HX_("canSend",78,75,a8,6a),
+	HX_("canModerate",f3,d3,bd,00),
 	HX_("getCaps",d7,cb,3c,14),
 	HX_("setPresence",fd,1b,38,97),
 	HX_("doSync",86,5f,63,1c),
@@ -2206,12 +3364,18 @@ static ::String Channel_obj_sMemberFields[] = {
 	HX_("preview",08,e0,da,3b),
 	HX_("livePresence",47,f9,16,b4),
 	HX_("syncing",67,fd,26,a7),
+	HX_("setLastMessage",8f,25,7b,f6),
 	HX_("canAudioCall",64,4a,90,e4),
 	HX_("canVideoCall",89,1c,93,ea),
 	HX_("nickInUse",bf,2a,9f,47),
 	HX_("getFullJid",80,42,92,1f),
-	HX_("getParticipants",16,0b,c7,34),
-	HX_("getParticipantDetails",85,2b,7d,4d),
+	HX_("members",d9,2c,70,1a),
+	HX_("getMemberDetails",12,2b,2f,b3),
+	HX_("buildMember",28,c8,26,55),
+	HX_("availableRoles",b4,19,02,0f),
+	HX_("canRemoveRole",0a,52,0a,02),
+	HX_("addRole",37,2e,ec,87),
+	HX_("removeRole",da,25,ce,c8),
 	HX_("getMessagesBefore",a1,f1,44,11),
 	HX_("getMessagesAfter",3a,43,91,57),
 	HX_("getMessagesAround",6f,95,16,2d),
@@ -2221,7 +3385,6 @@ static ::String Channel_obj_sMemberFields[] = {
 	HX_("sendMessage",5f,89,1d,24),
 	HX_("removeReaction",0d,24,0b,c1),
 	HX_("sendMessageStanza",b4,2c,6d,3d),
-	HX_("lastMessageId",4c,90,58,27),
 	HX_("markReadUpTo",59,68,2d,ee),
 	HX_("bookmark",b6,8c,f1,32),
 	HX_("sendChatState",b1,21,95,6e),
@@ -2256,58 +3419,64 @@ void Channel_obj::__register()
 void Channel_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1236_boot)
-HXDLIN(1236)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(25)
-            				->setFixed(0,HX_("setPresence",fd,1b,38,97), ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_bf6e937f28c6df5e_1430_boot)
+HXDLIN(1430)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(28)
+            				->setFixed(0,HX_("addRole",37,2e,ec,87), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
             				->setFixed(1,HX_("invite",c9,f1,db,9f), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
             				->setFixed(2,HX_("syncing",67,fd,26,a7), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(3,HX_("livePresence",47,f9,16,b4), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(3,HX_("getMemberDetails",12,2b,2f,b3), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(4,HX_("livePresence",47,f9,16,b4), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(5,HX_("getDisplayName",b7,64,90,b8), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(6,HX_("removeReaction",0d,24,0b,c1), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(4,HX_("getDisplayName",b7,64,90,b8), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(7,HX_("removeRole",da,25,ce,c8), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(5,HX_("removeReaction",0d,24,0b,c1), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(8,HX_("canAudioCall",64,4a,90,e4), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(6,HX_("canAudioCall",64,4a,90,e4), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(9,HX_("canVideoCall",89,1c,93,ea), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(7,HX_("canVideoCall",89,1c,93,ea), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(10,HX_("markReadUpTo",59,68,2d,ee), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(8,HX_("markReadUpTo",59,68,2d,ee), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(11,HX_("canInvite",f9,45,22,f2), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(9,HX_("canInvite",f9,45,22,f2), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(12,HX_("correctMessage",7d,36,c3,f4), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(10,HX_("correctMessage",7d,36,c3,f4), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(13,HX_("setLastMessage",8f,25,7b,f6), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(11,HX_("getMessagesBefore",a1,f1,44,11), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(14,HX_("canModerate",f3,d3,bd,00), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(12,HX_("getCaps",d7,cb,3c,14), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(15,HX_("canRemoveRole",0a,52,0a,02), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(13,HX_("isTrusted",2d,35,a5,1a), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(16,HX_("availableRoles",b4,19,02,0f), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(14,HX_("sendMessage",5f,89,1d,24), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(17,HX_("getMessagesBefore",a1,f1,44,11), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(15,HX_("lastMessageId",4c,90,58,27), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(18,HX_("members",d9,2c,70,1a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(16,HX_("getMessagesAround",6f,95,16,2d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(19,HX_("isTrusted",2d,35,a5,1a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(17,HX_("bookmark",b6,8c,f1,32), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(20,HX_("sendMessage",5f,89,1d,24), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(18,HX_("getParticipants",16,0b,c7,34), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(21,HX_("getMessagesAround",6f,95,16,2d), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(19,HX_("preview",08,e0,da,3b), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(22,HX_("bookmark",b6,8c,f1,32), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(20,HX_("close",b8,17,63,48), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(23,HX_("preview",08,e0,da,3b), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(21,HX_("getParticipantDetails",85,2b,7d,4d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(24,HX_("close",b8,17,63,48), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(22,HX_("getMessagesAfter",3a,43,91,57), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(25,HX_("getMessagesAfter",3a,43,91,57), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(23,HX_("setTrusted",75,dc,85,69), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(26,HX_("setTrusted",75,dc,85,69), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(24,HX_("canSend",78,75,a8,6a), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(27,HX_("canSend",78,75,a8,6a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null()))))));
             	}
 }
diff --git a/Sources/c_borogove/src/borogove/Chat.cpp b/Sources/c_borogove/src/borogove/Chat.cpp
index 093fd06..bcd7443 100644
--- a/Sources/c_borogove/src/borogove/Chat.cpp
+++ b/Sources/c_borogove/src/borogove/Chat.cpp
@@ -13,12 +13,18 @@
 #ifndef INCLUDED_Std
 #include <Std.h>
 #endif
-#ifndef INCLUDED_StringTools
-#include <StringTools.h>
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_HaxeStringArray_Impl_
+#include <_HaxeCBridge/HaxeStringArray_Impl_.h>
 #endif
 #ifndef INCLUDED__HaxeCBridge_Internal
 #include <_HaxeCBridge/Internal.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_Caps
 #include <borogove/Caps.h>
 #endif
@@ -58,15 +64,15 @@
 #ifndef INCLUDED_borogove_Hash
 #include <borogove/Hash.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
-#endif
-#ifndef INCLUDED_borogove_Identity
-#include <borogove/Identity.h>
+#ifndef INCLUDED_borogove_Html
+#include <borogove/Html.h>
 #endif
 #ifndef INCLUDED_borogove_JID
 #include <borogove/JID.h>
 #endif
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
+#endif
 #ifndef INCLUDED_borogove_Message
 #include <borogove/Message.h>
 #endif
@@ -79,30 +85,36 @@
 #ifndef INCLUDED_borogove_ModerationAction
 #include <borogove/ModerationAction.h>
 #endif
+#ifndef INCLUDED_borogove_Node
+#include <borogove/Node.h>
+#endif
 #ifndef INCLUDED_borogove_Outbox
 #include <borogove/Outbox.h>
 #endif
 #ifndef INCLUDED_borogove_OutboxItem
 #include <borogove/OutboxItem.h>
 #endif
-#ifndef INCLUDED_borogove_Participant
-#include <borogove/Participant.h>
-#endif
 #ifndef INCLUDED_borogove_Persistence
 #include <borogove/Persistence.h>
 #endif
-#ifndef INCLUDED_borogove_Presence
-#include <borogove/Presence.h>
-#endif
 #ifndef INCLUDED_borogove_Reaction
 #include <borogove/Reaction.h>
 #endif
 #ifndef INCLUDED_borogove_ReactionUpdate
 #include <borogove/ReactionUpdate.h>
 #endif
+#ifndef INCLUDED_borogove_Role
+#include <borogove/Role.h>
+#endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
+#ifndef INCLUDED_borogove_Status
+#include <borogove/Status.h>
+#endif
+#ifndef INCLUDED_borogove__Chat_Chat_Fields_
+#include <borogove/_Chat/Chat_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove__Util_Util_Fields_
 #include <borogove/_Util/Util_Fields_.h>
 #endif
@@ -130,6 +142,9 @@
 #ifndef INCLUDED_cpp_Int64Map
 #include <cpp/Int64Map.h>
 #endif
+#ifndef INCLUDED_cpp__NativeString_NativeString_Impl_
+#include <cpp/_NativeString/NativeString_Impl_.h>
+#endif
 #ifndef INCLUDED_haxe_IMap
 #include <haxe/IMap.h>
 #endif
@@ -142,9 +157,6 @@
 #ifndef INCLUDED_haxe_io_Bytes
 #include <haxe/io/Bytes.h>
 #endif
-#ifndef INCLUDED_haxe_iterators_MapKeyValueIterator
-#include <haxe/iterators/MapKeyValueIterator.h>
-#endif
 #ifndef INCLUDED_thenshim_PromiseTools
 #include <thenshim/PromiseTools.h>
 #endif
@@ -155,193 +167,223 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_9cc1265c56ba593e_62_new,"borogove.Chat","new",0x8ce82ad7,"borogove.Chat.new","borogove/Chat.hx",62,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_398_chatId__fromC,"borogove.Chat","chatId__fromC",0x3b5eb13d,"borogove.Chat.chatId__fromC","HaxeCBridge.hx",398,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_398_uiState__fromC,"borogove.Chat","uiState__fromC",0xeee409e5,"borogove.Chat.uiState__fromC","HaxeCBridge.hx",398,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_398_isBlocked__fromC,"borogove.Chat","isBlocked__fromC",0x8b7ec7c0,"borogove.Chat.isBlocked__fromC","HaxeCBridge.hx",398,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_398_lastMessage__fromC,"borogove.Chat","lastMessage__fromC",0xda1e5df1,"borogove.Chat.lastMessage__fromC","HaxeCBridge.hx",398,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_398_isBookmarked__fromC,"borogove.Chat","isBookmarked__fromC",0x59d3f3b1,"borogove.Chat.isBookmarked__fromC","HaxeCBridge.hx",398,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_337_getMessagesBefore__fromC,"borogove.Chat","getMessagesBefore__fromC",0x7fc75d21,"borogove.Chat.getMessagesBefore__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_337_getMessagesAfter__fromC,"borogove.Chat","getMessagesAfter__fromC",0xee116876,"borogove.Chat.getMessagesAfter__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_337_getMessagesAround__fromC,"borogove.Chat","getMessagesAround__fromC",0x1557ef13,"borogove.Chat.getMessagesAround__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_169_fetchFromSync,"borogove.Chat","fetchFromSync",0x5969d876,"borogove.Chat.fetchFromSync","borogove/Chat.hx",169,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_193_fetchFromSync,"borogove.Chat","fetchFromSync",0x5969d876,"borogove.Chat.fetchFromSync","borogove/Chat.hx",193,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_168_fetchFromSync,"borogove.Chat","fetchFromSync",0x5969d876,"borogove.Chat.fetchFromSync","borogove/Chat.hx",168,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_167_fetchFromSync,"borogove.Chat","fetchFromSync",0x5969d876,"borogove.Chat.fetchFromSync","borogove/Chat.hx",167,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_339_sendMessage__fromC,"borogove.Chat","sendMessage__fromC",0x32fe6463,"borogove.Chat.sendMessage__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_339_markReadUpTo__fromC,"borogove.Chat","markReadUpTo__fromC",0x3f04adb7,"borogove.Chat.markReadUpTo__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_339_bookmark__fromC,"borogove.Chat","bookmark__fromC",0x618f377a,"borogove.Chat.bookmark__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_335_getParticipants__fromC,"borogove.Chat","getParticipants__fromC",0xa2d7000c,"borogove.Chat.getParticipants__fromC","HaxeCBridge.hx",335,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_339_getParticipantDetails__fromC,"borogove.Chat","getParticipantDetails__fromC",0x40afb03d,"borogove.Chat.getParticipantDetails__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_339_correctMessage__fromC,"borogove.Chat","correctMessage__fromC",0xb004f7d3,"borogove.Chat.correctMessage__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_258_addReaction,"borogove.Chat","addReaction",0x55c74861,"borogove.Chat.addReaction","borogove/Chat.hx",258,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_262_addReaction,"borogove.Chat","addReaction",0x55c74861,"borogove.Chat.addReaction","borogove/Chat.hx",262,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_254_addReaction,"borogove.Chat","addReaction",0x55c74861,"borogove.Chat.addReaction","borogove/Chat.hx",254,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_339_removeReaction__fromC,"borogove.Chat","removeReaction__fromC",0xeaa4dc43,"borogove.Chat.removeReaction__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_308_typing,"borogove.Chat","typing",0xab024860,"borogove.Chat.typing","borogove/Chat.hx",308,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_287_typing,"borogove.Chat","typing",0xab024860,"borogove.Chat.typing","borogove/Chat.hx",287,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_302_typing,"borogove.Chat","typing",0xab024860,"borogove.Chat.typing","borogove/Chat.hx",302,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_326_setActive,"borogove.Chat","setActive",0x89bbc4bf,"borogove.Chat.setActive","borogove/Chat.hx",326,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_339_close__fromC,"borogove.Chat","close__fromC",0xc11a5e6a,"borogove.Chat.close__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_351_togglePinned,"borogove.Chat","togglePinned",0xfddcd475,"borogove.Chat.togglePinned","borogove/Chat.hx",351,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_361_block,"borogove.Chat","block",0xd3359b84,"borogove.Chat.block","borogove/Chat.hx",361,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_380_block,"borogove.Chat","block",0xd3359b84,"borogove.Chat.block","borogove/Chat.hx",380,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_408_block,"borogove.Chat","block",0xd3359b84,"borogove.Chat.block","borogove/Chat.hx",408,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_415_unblock,"borogove.Chat","unblock",0xad05ce4b,"borogove.Chat.unblock","borogove/Chat.hx",415,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_425_unblock,"borogove.Chat","unblock",0xad05ce4b,"borogove.Chat.unblock","borogove/Chat.hx",425,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_432_setNotificationsInternal,"borogove.Chat","setNotificationsInternal",0x95c15fac,"borogove.Chat.setNotificationsInternal","borogove/Chat.hx",432,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_442_setNotifications,"borogove.Chat","setNotifications",0x82bcd54f,"borogove.Chat.setNotifications","borogove/Chat.hx",442,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_453_notificationsFiltered,"borogove.Chat","notificationsFiltered",0xcab45596,"borogove.Chat.notificationsFiltered","borogove/Chat.hx",453,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_460_notifyMention,"borogove.Chat","notifyMention",0x00cf7c58,"borogove.Chat.notifyMention","borogove/Chat.hx",460,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_467_notifyReply,"borogove.Chat","notifyReply",0x65560f18,"borogove.Chat.notifyReply","borogove/Chat.hx",467,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_339_lastMessageId__fromC,"borogove.Chat","lastMessageId__fromC",0x7b1a3156,"borogove.Chat.lastMessageId__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_476_updateFromBookmark,"borogove.Chat","updateFromBookmark",0x8ad9a752,"borogove.Chat.updateFromBookmark","borogove/Chat.hx",476,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_486_updateFromRoster,"borogove.Chat","updateFromRoster",0xec826927,"borogove.Chat.updateFromRoster","borogove/Chat.hx",486,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_496_getPhoto,"borogove.Chat","getPhoto",0x2fa82e65,"borogove.Chat.getPhoto","borogove/Chat.hx",496,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_505_getPlaceholder,"borogove.Chat","getPlaceholder",0x7303a166,"borogove.Chat.getPlaceholder","borogove/Chat.hx",505,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_512_readUpTo,"borogove.Chat","readUpTo",0x83806d55,"borogove.Chat.readUpTo","borogove/Chat.hx",512,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_519_unreadCount,"borogove.Chat","unreadCount",0xcea74197,"borogove.Chat.unreadCount","borogove/Chat.hx",519,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_524_setUnreadCount,"borogove.Chat","setUnreadCount",0x79212e87,"borogove.Chat.setUnreadCount","borogove/Chat.hx",524,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_530_preview,"borogove.Chat","preview",0x375341ff,"borogove.Chat.preview","borogove/Chat.hx",530,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_537_preview,"borogove.Chat","preview",0x375341ff,"borogove.Chat.preview","borogove/Chat.hx",537,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_543_setLastMessage,"borogove.Chat","setLastMessage",0x26ed0078,"borogove.Chat.setLastMessage","borogove/Chat.hx",543,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_551_setDisplayName,"borogove.Chat","setDisplayName",0x09222814,"borogove.Chat.setDisplayName","borogove/Chat.hx",551,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_559_getDisplayName,"borogove.Chat","getDisplayName",0xe9023fa0,"borogove.Chat.getDisplayName","borogove/Chat.hx",559,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_579_setPresence,"borogove.Chat","setPresence",0xc4ee4574,"borogove.Chat.setPresence","borogove/Chat.hx",579,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_583_setCaps,"borogove.Chat","setCaps",0x02b6beda,"borogove.Chat.setCaps","borogove/Chat.hx",583,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_595_removePresence,"borogove.Chat","removePresence",0x619f6988,"borogove.Chat.removePresence","borogove/Chat.hx",595,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_603_getCaps,"borogove.Chat","getCaps",0x0fb52dce,"borogove.Chat.getCaps","borogove/Chat.hx",603,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_599_getCaps,"borogove.Chat","getCaps",0x0fb52dce,"borogove.Chat.getCaps","borogove/Chat.hx",599,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_612_getResourceCaps,"borogove.Chat","getResourceCaps",0xdf352abc,"borogove.Chat.getResourceCaps","borogove/Chat.hx",612,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_617_setAvatarSha1,"borogove.Chat","setAvatarSha1",0x86f1e8b7,"borogove.Chat.setAvatarSha1","borogove/Chat.hx",617,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_625_setTrusted,"borogove.Chat","setTrusted",0xaa03cede,"borogove.Chat.setTrusted","borogove/Chat.hx",625,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_637_isTrusted,"borogove.Chat","isTrusted",0x2e7342e4,"borogove.Chat.isTrusted","borogove/Chat.hx",637,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_642_livePresence,"borogove.Chat","livePresence",0x85c517f0,"borogove.Chat.livePresence","borogove/Chat.hx",642,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_649_syncing,"borogove.Chat","syncing",0xa29f5f5e,"borogove.Chat.syncing","borogove/Chat.hx",649,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_655_canAudioCall,"borogove.Chat","canAudioCall",0xb63e690d,"borogove.Chat.canAudioCall","borogove/Chat.hx",655,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_667_canVideoCall,"borogove.Chat","canVideoCall",0xbc413b32,"borogove.Chat.canVideoCall","borogove/Chat.hx",667,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_683_startCall,"borogove.Chat","startCall",0x0e7b9fd7,"borogove.Chat.startCall","borogove/Chat.hx",683,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_692_addMedia,"borogove.Chat","addMedia",0x8cf6812c,"borogove.Chat.addMedia","borogove/Chat.hx",692,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_700_acceptCall,"borogove.Chat","acceptCall",0xf591ee2f,"borogove.Chat.acceptCall","borogove/Chat.hx",700,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_711_hangup,"borogove.Chat","hangup",0x0bc81c36,"borogove.Chat.hangup","borogove/Chat.hx",711,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_720_callStatus,"borogove.Chat","callStatus",0x71a9b0d9,"borogove.Chat.callStatus","borogove/Chat.hx",720,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_731_dtmf,"borogove.Chat","dtmf",0xb7ac8892,"borogove.Chat.dtmf","borogove/Chat.hx",731,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_744_videoTracks,"borogove.Chat","videoTracks",0xebdaebda,"borogove.Chat.videoTracks","borogove/Chat.hx",744,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_335_videoTracks__fromC,"borogove.Chat","videoTracks__fromC",0x180a13df,"borogove.Chat.videoTracks__fromC","HaxeCBridge.hx",335,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_751_encryptionMode,"borogove.Chat","encryptionMode",0xd881b46f,"borogove.Chat.encryptionMode","borogove/Chat.hx",751,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_763_canSend,"borogove.Chat","canSend",0x6620d76f,"borogove.Chat.canSend","borogove/Chat.hx",763,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_769_invite,"borogove.Chat","invite",0xf3a43bb2,"borogove.Chat.invite","borogove/Chat.hx",769,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_787_canInvite,"borogove.Chat","canInvite",0x05f053b0,"borogove.Chat.canInvite","borogove/Chat.hx",787,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_793_isApp,"borogove.Chat","isApp",0xdf814d0e,"borogove.Chat.isApp","borogove/Chat.hx",793,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_821_hasCommands,"borogove.Chat","hasCommands",0xbec2bfb9,"borogove.Chat.hasCommands","borogove/Chat.hx",821,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_836_commands,"borogove.Chat","commands",0xcc3306f1,"borogove.Chat.commands","borogove/Chat.hx",836,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_824_commands,"borogove.Chat","commands",0xcc3306f1,"borogove.Chat.commands","borogove/Chat.hx",824,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_827_commands,"borogove.Chat","commands",0xcc3306f1,"borogove.Chat.commands","borogove/Chat.hx",827,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_825_commands,"borogove.Chat","commands",0xcc3306f1,"borogove.Chat.commands","borogove/Chat.hx",825,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_337_commands__fromC,"borogove.Chat","commands__fromC",0xe84399a8,"borogove.Chat.commands__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_839_commandJids,"borogove.Chat","commandJids",0x11776a70,"borogove.Chat.commandJids","borogove/Chat.hx",839,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_854_invitedBy,"borogove.Chat","invitedBy",0x6066bae9,"borogove.Chat.invitedBy","borogove/Chat.hx",854,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_872_invites,"borogove.Chat","invites",0x3c100081,"borogove.Chat.invites","borogove/Chat.hx",872,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_876_recomputeUnread,"borogove.Chat","recomputeUnread",0x2d8f3a6a,"borogove.Chat.recomputeUnread","borogove/Chat.hx",876,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_875_recomputeUnread,"borogove.Chat","recomputeUnread",0x2d8f3a6a,"borogove.Chat.recomputeUnread","borogove/Chat.hx",875,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_886_markReadUpToId,"borogove.Chat","markReadUpToId",0x130d0b7d,"borogove.Chat.markReadUpToId","borogove/Chat.hx",886,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_904_markReadUpToMessage,"borogove.Chat","markReadUpToMessage",0x357a9ae5,"borogove.Chat.markReadUpToMessage","borogove/Chat.hx",904,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_896_markReadUpToMessage,"borogove.Chat","markReadUpToMessage",0x357a9ae5,"borogove.Chat.markReadUpToMessage","borogove/Chat.hx",896,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_914_publishMds,"borogove.Chat","publishMds",0xb14bb956,"borogove.Chat.publishMds","borogove/Chat.hx",914,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_62_boot,"borogove.Chat","boot",0xb65651db,"borogove.Chat.boot","borogove/Chat.hx",62,0x1763ae98)
+HX_DEFINE_STACK_FRAME(_hx_pos_9cc1265c56ba593e_111_new,"borogove.Chat","new",0x8ce82ad7,"borogove.Chat.new","borogove/Chat.hx",111,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_426_status__fromC,"borogove.Chat","status__fromC",0x47d268be,"borogove.Chat.status__fromC","HaxeCBridge.hx",426,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_426_chatId__fromC,"borogove.Chat","chatId__fromC",0x3b5eb13d,"borogove.Chat.chatId__fromC","HaxeCBridge.hx",426,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_426_uiState__fromC,"borogove.Chat","uiState__fromC",0xeee409e5,"borogove.Chat.uiState__fromC","HaxeCBridge.hx",426,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_426_isBlocked__fromC,"borogove.Chat","isBlocked__fromC",0x8b7ec7c0,"borogove.Chat.isBlocked__fromC","HaxeCBridge.hx",426,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_426_lastMessage__fromC,"borogove.Chat","lastMessage__fromC",0xda1e5df1,"borogove.Chat.lastMessage__fromC","HaxeCBridge.hx",426,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_426_isBookmarked__fromC,"borogove.Chat","isBookmarked__fromC",0x59d3f3b1,"borogove.Chat.isBookmarked__fromC","HaxeCBridge.hx",426,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_365_getMessagesBefore__fromC,"borogove.Chat","getMessagesBefore__fromC",0x7fc75d21,"borogove.Chat.getMessagesBefore__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_365_getMessagesAfter__fromC,"borogove.Chat","getMessagesAfter__fromC",0xee116876,"borogove.Chat.getMessagesAfter__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_365_getMessagesAround__fromC,"borogove.Chat","getMessagesAround__fromC",0x1557ef13,"borogove.Chat.getMessagesAround__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_218_fetchFromSync,"borogove.Chat","fetchFromSync",0x5969d876,"borogove.Chat.fetchFromSync","borogove/Chat.hx",218,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_242_fetchFromSync,"borogove.Chat","fetchFromSync",0x5969d876,"borogove.Chat.fetchFromSync","borogove/Chat.hx",242,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_217_fetchFromSync,"borogove.Chat","fetchFromSync",0x5969d876,"borogove.Chat.fetchFromSync","borogove/Chat.hx",217,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_216_fetchFromSync,"borogove.Chat","fetchFromSync",0x5969d876,"borogove.Chat.fetchFromSync","borogove/Chat.hx",216,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_354_sendMessage__fromC,"borogove.Chat","sendMessage__fromC",0x32fe6463,"borogove.Chat.sendMessage__fromC","HaxeCBridge.hx",354,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_354_markReadUpTo__fromC,"borogove.Chat","markReadUpTo__fromC",0x3f04adb7,"borogove.Chat.markReadUpTo__fromC","HaxeCBridge.hx",354,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_354_bookmark__fromC,"borogove.Chat","bookmark__fromC",0x618f377a,"borogove.Chat.bookmark__fromC","HaxeCBridge.hx",354,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_365_members__fromC,"borogove.Chat","members__fromC",0xdc4e5ba9,"borogove.Chat.members__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_365_getMemberDetails__fromC,"borogove.Chat","getMemberDetails__fromC",0xb79eab9e,"borogove.Chat.getMemberDetails__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_297_addMembersUpdatedListener,"borogove.Chat","addMembersUpdatedListener",0x143e1bae,"borogove.Chat.addMembersUpdatedListener","borogove/Chat.hx",297,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_282_addMembersUpdatedListener__fromC,"borogove.Chat","addMembersUpdatedListener__fromC",0xb2c1468b,"borogove.Chat.addMembersUpdatedListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_367_addMembersUpdatedListener__fromC,"borogove.Chat","addMembersUpdatedListener__fromC",0xb2c1468b,"borogove.Chat.addMembersUpdatedListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_307_availableRoles,"borogove.Chat","availableRoles",0x3f73f49d,"borogove.Chat.availableRoles","borogove/Chat.hx",307,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_363_availableRoles__fromC,"borogove.Chat","availableRoles__fromC",0x7e8ef97c,"borogove.Chat.availableRoles__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_314_canRemoveRole,"borogove.Chat","canRemoveRole",0xa8b70741,"borogove.Chat.canRemoveRole","borogove/Chat.hx",314,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_323_addRole,"borogove.Chat","addRole",0x8364902e,"borogove.Chat.addRole","borogove/Chat.hx",323,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_331_removeRole,"borogove.Chat","removeRole",0x094c1843,"borogove.Chat.removeRole","borogove/Chat.hx",331,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_354_correctMessage__fromC,"borogove.Chat","correctMessage__fromC",0xb004f7d3,"borogove.Chat.correctMessage__fromC","HaxeCBridge.hx",354,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_354_moderate,"borogove.Chat","moderate",0xdef369ec,"borogove.Chat.moderate","borogove/Chat.hx",354,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_347_moderate,"borogove.Chat","moderate",0xdef369ec,"borogove.Chat.moderate","borogove/Chat.hx",347,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_367_addReaction,"borogove.Chat","addReaction",0x55c74861,"borogove.Chat.addReaction","borogove/Chat.hx",367,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_371_addReaction,"borogove.Chat","addReaction",0x55c74861,"borogove.Chat.addReaction","borogove/Chat.hx",371,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_363_addReaction,"borogove.Chat","addReaction",0x55c74861,"borogove.Chat.addReaction","borogove/Chat.hx",363,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_354_removeReaction__fromC,"borogove.Chat","removeReaction__fromC",0xeaa4dc43,"borogove.Chat.removeReaction__fromC","HaxeCBridge.hx",354,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_419_typing,"borogove.Chat","typing",0xab024860,"borogove.Chat.typing","borogove/Chat.hx",419,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_398_typing,"borogove.Chat","typing",0xab024860,"borogove.Chat.typing","borogove/Chat.hx",398,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_413_typing,"borogove.Chat","typing",0xab024860,"borogove.Chat.typing","borogove/Chat.hx",413,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_437_setActive,"borogove.Chat","setActive",0x89bbc4bf,"borogove.Chat.setActive","borogove/Chat.hx",437,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_354_close__fromC,"borogove.Chat","close__fromC",0xc11a5e6a,"borogove.Chat.close__fromC","HaxeCBridge.hx",354,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_462_togglePinned,"borogove.Chat","togglePinned",0xfddcd475,"borogove.Chat.togglePinned","borogove/Chat.hx",462,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_472_block,"borogove.Chat","block",0xd3359b84,"borogove.Chat.block","borogove/Chat.hx",472,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_491_block,"borogove.Chat","block",0xd3359b84,"borogove.Chat.block","borogove/Chat.hx",491,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_519_block,"borogove.Chat","block",0xd3359b84,"borogove.Chat.block","borogove/Chat.hx",519,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_526_unblock,"borogove.Chat","unblock",0xad05ce4b,"borogove.Chat.unblock","borogove/Chat.hx",526,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_536_unblock,"borogove.Chat","unblock",0xad05ce4b,"borogove.Chat.unblock","borogove/Chat.hx",536,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_543_setNotificationsInternal,"borogove.Chat","setNotificationsInternal",0x95c15fac,"borogove.Chat.setNotificationsInternal","borogove/Chat.hx",543,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_553_setNotifications,"borogove.Chat","setNotifications",0x82bcd54f,"borogove.Chat.setNotifications","borogove/Chat.hx",553,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_564_notificationsFiltered,"borogove.Chat","notificationsFiltered",0xcab45596,"borogove.Chat.notificationsFiltered","borogove/Chat.hx",564,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_571_notifyMention,"borogove.Chat","notifyMention",0x00cf7c58,"borogove.Chat.notifyMention","borogove/Chat.hx",571,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_578_notifyReply,"borogove.Chat","notifyReply",0x65560f18,"borogove.Chat.notifyReply","borogove/Chat.hx",578,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_582_updateFromBookmark,"borogove.Chat","updateFromBookmark",0x8ad9a752,"borogove.Chat.updateFromBookmark","borogove/Chat.hx",582,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_592_updateFromRoster,"borogove.Chat","updateFromRoster",0xec826927,"borogove.Chat.updateFromRoster","borogove/Chat.hx",592,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_606_getPhoto,"borogove.Chat","getPhoto",0x2fa82e65,"borogove.Chat.getPhoto","borogove/Chat.hx",606,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_615_getPlaceholder,"borogove.Chat","getPlaceholder",0x7303a166,"borogove.Chat.getPlaceholder","borogove/Chat.hx",615,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_624_readUpTo,"borogove.Chat","readUpTo",0x83806d55,"borogove.Chat.readUpTo","borogove/Chat.hx",624,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_621_readUpTo,"borogove.Chat","readUpTo",0x83806d55,"borogove.Chat.readUpTo","borogove/Chat.hx",621,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_365_readUpTo__fromC,"borogove.Chat","readUpTo__fromC",0xd5c387c4,"borogove.Chat.readUpTo__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_637_unreadCount,"borogove.Chat","unreadCount",0xcea74197,"borogove.Chat.unreadCount","borogove/Chat.hx",637,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_642_setUnreadCount,"borogove.Chat","setUnreadCount",0x79212e87,"borogove.Chat.setUnreadCount","borogove/Chat.hx",642,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_648_preview,"borogove.Chat","preview",0x375341ff,"borogove.Chat.preview","borogove/Chat.hx",648,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_656_preview,"borogove.Chat","preview",0x375341ff,"borogove.Chat.preview","borogove/Chat.hx",656,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_661_setLastMessage,"borogove.Chat","setLastMessage",0x26ed0078,"borogove.Chat.setLastMessage","borogove/Chat.hx",661,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_671_setDisplayName,"borogove.Chat","setDisplayName",0x09222814,"borogove.Chat.setDisplayName","borogove/Chat.hx",671,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_679_getDisplayName,"borogove.Chat","getDisplayName",0xe9023fa0,"borogove.Chat.getDisplayName","borogove/Chat.hx",679,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_693_getTags,"borogove.Chat","getTags",0x1af1c686,"borogove.Chat.getTags","borogove/Chat.hx",693,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_363_getTags__fromC,"borogove.Chat","getTags__fromC",0xfac726b3,"borogove.Chat.getTags__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_698_setThreadSubject,"borogove.Chat","setThreadSubject",0x22a0ba29,"borogove.Chat.setThreadSubject","borogove/Chat.hx",698,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_709_setAvatarSha1,"borogove.Chat","setAvatarSha1",0x86f1e8b7,"borogove.Chat.setAvatarSha1","borogove/Chat.hx",709,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_717_setTrusted,"borogove.Chat","setTrusted",0xaa03cede,"borogove.Chat.setTrusted","borogove/Chat.hx",717,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_729_isTrusted,"borogove.Chat","isTrusted",0x2e7342e4,"borogove.Chat.isTrusted","borogove/Chat.hx",729,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_734_livePresence,"borogove.Chat","livePresence",0x85c517f0,"borogove.Chat.livePresence","borogove/Chat.hx",734,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_741_syncing,"borogove.Chat","syncing",0xa29f5f5e,"borogove.Chat.syncing","borogove/Chat.hx",741,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_747_canAudioCall,"borogove.Chat","canAudioCall",0xb63e690d,"borogove.Chat.canAudioCall","borogove/Chat.hx",747,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_759_canVideoCall,"borogove.Chat","canVideoCall",0xbc413b32,"borogove.Chat.canVideoCall","borogove/Chat.hx",759,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_775_startCall,"borogove.Chat","startCall",0x0e7b9fd7,"borogove.Chat.startCall","borogove/Chat.hx",775,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_789_addMedia,"borogove.Chat","addMedia",0x8cf6812c,"borogove.Chat.addMedia","borogove/Chat.hx",789,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_797_acceptCall,"borogove.Chat","acceptCall",0xf591ee2f,"borogove.Chat.acceptCall","borogove/Chat.hx",797,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_808_hangup,"borogove.Chat","hangup",0x0bc81c36,"borogove.Chat.hangup","borogove/Chat.hx",808,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_817_callStatus,"borogove.Chat","callStatus",0x71a9b0d9,"borogove.Chat.callStatus","borogove/Chat.hx",817,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_828_dtmf,"borogove.Chat","dtmf",0xb7ac8892,"borogove.Chat.dtmf","borogove/Chat.hx",828,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_841_videoTracks,"borogove.Chat","videoTracks",0xebdaebda,"borogove.Chat.videoTracks","borogove/Chat.hx",841,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_363_videoTracks__fromC,"borogove.Chat","videoTracks__fromC",0x180a13df,"borogove.Chat.videoTracks__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_848_encryptionMode,"borogove.Chat","encryptionMode",0xd881b46f,"borogove.Chat.encryptionMode","borogove/Chat.hx",848,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_860_canSend,"borogove.Chat","canSend",0x6620d76f,"borogove.Chat.canSend","borogove/Chat.hx",860,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_867_canModerate,"borogove.Chat","canModerate",0x2e73fd6a,"borogove.Chat.canModerate","borogove/Chat.hx",867,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_873_invite,"borogove.Chat","invite",0xf3a43bb2,"borogove.Chat.invite","borogove/Chat.hx",873,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_891_canInvite,"borogove.Chat","canInvite",0x05f053b0,"borogove.Chat.canInvite","borogove/Chat.hx",891,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_897_isApp,"borogove.Chat","isApp",0xdf814d0e,"borogove.Chat.isApp","borogove/Chat.hx",897,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_925_hasCommands,"borogove.Chat","hasCommands",0xbec2bfb9,"borogove.Chat.hasCommands","borogove/Chat.hx",925,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_943_commands,"borogove.Chat","commands",0xcc3306f1,"borogove.Chat.commands","borogove/Chat.hx",943,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_931_commands,"borogove.Chat","commands",0xcc3306f1,"borogove.Chat.commands","borogove/Chat.hx",931,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_934_commands,"borogove.Chat","commands",0xcc3306f1,"borogove.Chat.commands","borogove/Chat.hx",934,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_932_commands,"borogove.Chat","commands",0xcc3306f1,"borogove.Chat.commands","borogove/Chat.hx",932,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_365_commands__fromC,"borogove.Chat","commands__fromC",0xe84399a8,"borogove.Chat.commands__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_946_commandJids,"borogove.Chat","commandJids",0x11776a70,"borogove.Chat.commandJids","borogove/Chat.hx",946,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_977_invitedBy,"borogove.Chat","invitedBy",0x6066bae9,"borogove.Chat.invitedBy","borogove/Chat.hx",977,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_961_invitedBy,"borogove.Chat","invitedBy",0x6066bae9,"borogove.Chat.invitedBy","borogove/Chat.hx",961,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_972_invitedBy,"borogove.Chat","invitedBy",0x6066bae9,"borogove.Chat.invitedBy","borogove/Chat.hx",972,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_973_invitedBy,"borogove.Chat","invitedBy",0x6066bae9,"borogove.Chat.invitedBy","borogove/Chat.hx",973,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_a94f40d98d9e57cb_365_invitedBy__fromC,"borogove.Chat","invitedBy__fromC",0x3f1ad4b0,"borogove.Chat.invitedBy__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_981_invites,"borogove.Chat","invites",0x3c100081,"borogove.Chat.invites","borogove/Chat.hx",981,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_990_recomputeUnread,"borogove.Chat","recomputeUnread",0x2d8f3a6a,"borogove.Chat.recomputeUnread","borogove/Chat.hx",990,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_984_recomputeUnread,"borogove.Chat","recomputeUnread",0x2d8f3a6a,"borogove.Chat.recomputeUnread","borogove/Chat.hx",984,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_1000_markReadUpToId,"borogove.Chat","markReadUpToId",0x130d0b7d,"borogove.Chat.markReadUpToId","borogove/Chat.hx",1000,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_1023_markReadUpToMessage,"borogove.Chat","markReadUpToMessage",0x357a9ae5,"borogove.Chat.markReadUpToMessage","borogove/Chat.hx",1023,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_1012_markReadUpToMessage,"borogove.Chat","markReadUpToMessage",0x357a9ae5,"borogove.Chat.markReadUpToMessage","borogove/Chat.hx",1012,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_1033_publishMds,"borogove.Chat","publishMds",0xb14bb956,"borogove.Chat.publishMds","borogove/Chat.hx",1033,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_9cc1265c56ba593e_111_boot,"borogove.Chat","boot",0xb65651db,"borogove.Chat.boot","borogove/Chat.hx",111,0x1763ae98)
 namespace borogove{
 
-void Chat_obj::__construct( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs){
+void Chat_obj::__construct( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs){
             		int uiState = __o_uiState.Default(1);
+            		bool isBookmarked = __o_isBookmarked.Default(false);
             		bool isBlocked = __o_isBlocked.Default(false);
-            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_62_new)
-HXLINE( 114)		this->omemoContactDeviceIDs = null();
-HXLINE( 111)		this->_encryptionMode = 0;
-HXLINE( 110)		this->outbox =  ::borogove::Outbox_obj::__alloc( HX_CTX );
-HXLINE( 109)		this->notificationSettings = null();
-HXLINE( 108)		this->activeThread = null();
-HXLINE( 107)		this->isActive = null();
-HXLINE( 106)		this->typingTimer = null();
-HXLINE( 105)		this->typingThread = null();
-HXLINE( 104)		this->isTyping = false;
-HXLINE( 100)		this->_unreadCount = 0;
-HXLINE(  97)		this->isBookmarked = false;
-HXLINE(  89)		this->isBlocked = false;
-HXLINE(  85)		this->uiState = 1;
-HXLINE(  77)		this->jingleSessions =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(  70)		this->trusted = false;
-HXLINE(  69)		this->presence =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(  67)		this->avatarSha1 = null();
-HXLINE( 118)		bool _hx_tmp;
-HXDLIN( 118)		if (::hx::IsNotNull( chatId )) {
-HXLINE( 118)			_hx_tmp = (chatId == HX_("",00,00,00,00));
+            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_111_new)
+HXLINE( 167)		this->omemoContactDeviceIDs = null();
+HXLINE( 164)		this->_encryptionMode = 0;
+HXLINE( 163)		this->outbox =  ::borogove::Outbox_obj::__alloc( HX_CTX );
+HXLINE( 162)		this->notificationSettings = null();
+HXLINE( 161)		this->activeThread = null();
+HXLINE( 160)		this->isActive = null();
+HXLINE( 159)		this->typingTimer = null();
+HXLINE( 158)		this->typingThread = null();
+HXLINE( 157)		this->isTyping = false;
+HXLINE( 156)		this->threads =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 150)		this->_unreadCount = 0;
+HXLINE( 147)		this->isBookmarked = false;
+HXLINE( 139)		this->isBlocked = false;
+HXLINE( 135)		this->uiState = 1;
+HXLINE( 127)		this->jingleSessions =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 120)		this->status =  ::borogove::Status_obj::__alloc( HX_CTX ,HX_("",00,00,00,00),HX_("",00,00,00,00));
+HXLINE( 118)		this->trusted = false;
+HXLINE( 116)		this->avatarSha1 = null();
+HXLINE( 171)		super::__construct();
+HXLINE( 172)		bool _hx_tmp;
+HXDLIN( 172)		if (::hx::IsNotNull( chatId )) {
+HXLINE( 172)			_hx_tmp = (chatId == HX_("",00,00,00,00));
             		}
             		else {
-HXLINE( 118)			_hx_tmp = true;
-            		}
-HXDLIN( 118)		if (_hx_tmp) {
-HXLINE( 119)			HX_STACK_DO_THROW(HX_("chatId may not be empty",65,1d,3c,b1));
-            		}
-HXLINE( 121)		this->client = client;
-HXLINE( 122)		this->stream = stream;
-HXLINE( 123)		this->persistence = persistence;
-HXLINE( 124)		this->chatId = chatId;
-HXLINE( 125)		this->uiState = uiState;
-HXLINE( 126)		this->isBlocked = isBlocked;
-HXLINE( 127)		 ::borogove::Stanza _hx_tmp1;
-HXDLIN( 127)		if (::hx::IsNotNull( extensions )) {
-HXLINE( 127)			_hx_tmp1 = extensions;
+HXLINE( 172)			_hx_tmp = true;
+            		}
+HXDLIN( 172)		if (_hx_tmp) {
+HXLINE( 173)			HX_STACK_DO_THROW(HX_("chatId may not be empty",65,1d,3c,b1));
+            		}
+HXLINE( 175)		this->client = client;
+HXLINE( 176)		this->stream = stream;
+HXLINE( 177)		this->persistence = persistence;
+HXLINE( 178)		this->chatId = chatId;
+HXLINE( 179)		this->uiState = uiState;
+HXLINE( 180)		this->isBookmarked = isBookmarked;
+HXLINE( 181)		this->isBlocked = isBlocked;
+HXLINE( 182)		 ::borogove::Stanza _hx_tmp1;
+HXDLIN( 182)		if (::hx::IsNotNull( extensions )) {
+HXLINE( 182)			_hx_tmp1 = extensions;
             		}
             		else {
-HXLINE( 127)			_hx_tmp1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("extensions",14,7c,70,89), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 182)			_hx_tmp1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("extensions",14,7c,70,89), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:bookmarks:1",58,3c,53,7d))));
             		}
-HXDLIN( 127)		this->extensions = _hx_tmp1;
-HXLINE( 128)		this->readUpToId = readUpToId;
-HXLINE( 129)		this->readUpToBy = readUpToBy;
-HXLINE( 130)		this->displayName = chatId;
-HXLINE( 131)		this->omemoContactDeviceIDs = omemoContactDeviceIDs;
+HXDLIN( 182)		this->extensions = _hx_tmp1;
+HXLINE( 183)		this->readUpToId = readUpToId;
+HXLINE( 184)		this->readUpToBy = readUpToBy;
+HXLINE( 185)		this->displayName = chatId;
+HXLINE( 186)		this->omemoContactDeviceIDs = omemoContactDeviceIDs;
             	}
 
 bool Chat_obj::_hx_isInstanceOf(int inClassId) {
-	return inClassId==(int)0x00000001 || inClassId==(int)0x2acf7e59;
+	if (inClassId<=(int)0x2acf7e59) {
+		return inClassId==(int)0x00000001 || inClassId==(int)0x2acf7e59;
+	} else {
+		return inClassId==(int)0x4fb834f5;
+	}
 }
 
+ ::borogove::Status Chat_obj::status__fromC(){
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_426_status__fromC)
+HXDLIN( 426)		return this->status;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,status__fromC,return )
+
 ::String Chat_obj::chatId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_398_chatId__fromC)
-HXDLIN( 398)		return this->chatId;
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_426_chatId__fromC)
+HXDLIN( 426)		return this->chatId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,chatId__fromC,return )
 
 int Chat_obj::uiState__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_398_uiState__fromC)
-HXDLIN( 398)		return this->uiState;
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_426_uiState__fromC)
+HXDLIN( 426)		return this->uiState;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,uiState__fromC,return )
 
 bool Chat_obj::isBlocked__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_398_isBlocked__fromC)
-HXDLIN( 398)		return this->isBlocked;
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_426_isBlocked__fromC)
+HXDLIN( 426)		return this->isBlocked;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,isBlocked__fromC,return )
 
  ::borogove::ChatMessage Chat_obj::lastMessage__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_398_lastMessage__fromC)
-HXDLIN( 398)		return this->lastMessage;
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_426_lastMessage__fromC)
+HXDLIN( 426)		return this->lastMessage;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,lastMessage__fromC,return )
 
 bool Chat_obj::isBookmarked__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_398_isBookmarked__fromC)
-HXDLIN( 398)		return this->isBookmarked;
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_426_isBookmarked__fromC)
+HXDLIN( 426)		return this->isBookmarked;
             	}
 
 
@@ -349,200 +391,86 @@ HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,isBookmarked__fromC,return )
 
 HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,prepareIncomingMessage,return )
 
-HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,getMessagesBefore,return )
+HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,getMessagesBefore,return )
 
-void Chat_obj::getMessagesBefore__fromC(::String beforeId,::String beforeTime,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_337_getMessagesBefore__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			this->getMessagesBefore(beforeId,beforeTime);
+void Chat_obj::getMessagesBefore__fromC( ::borogove::ChatMessage before,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_getMessagesBefore__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->getMessagesBefore(before);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(::Array< ::Dynamic> v){
-            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_337_getMessagesBefore__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
-HXLINE( 308)				{
-HXLINE( 308)					int _g = 0;
-HXDLIN( 308)					while((_g < v->length)){
-HXLINE( 308)						 ::borogove::ChatMessage el = v->__get(_g).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 308)						_g = (_g + 1);
-HXDLIN( 308)						{
-HXLINE( 308)							 ::Dynamic haxeObject = el;
-HXDLIN( 308)							void* ptr = haxeObject.mPtr;
-HXDLIN( 308)							::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 308)							{
-HXLINE( 308)								 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 308)								if (::hx::IsNull( store )) {
-HXLINE( 308)									store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            										->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            										->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 308)									::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            								}
-            								else {
-HXLINE( 308)									::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            								}
-            							}
-            						}
-            					}
-            				}
-HXDLIN( 308)				void** ptr1 = (void**)v->getBase();
-HXDLIN( 308)				::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 308)				{
-HXLINE( 308)					 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 308)					if (::hx::IsNull( store1 )) {
-HXLINE( 308)						store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            							->setFixed(1,HX_("value",71,7f,b8,31),v));
-HXDLIN( 308)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            					}
-            					else {
-HXLINE( 308)						::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            					}
-            				}
-HXLINE( 337)				handler1(ptr1,( (size_t)(v->length) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_getMessagesBefore__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
+HXDLIN( 365)				handler1(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(v),( (size_t)(v->length) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_337_getMessagesBefore__fromC)
-HXDLIN( 337)				handler(null(),( (size_t)(0) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_getMessagesBefore__fromC)
+HXDLIN( 365)				handler(null(),( (size_t)(0) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->getMessagesBefore(beforeId,beforeTime), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->getMessagesBefore(before), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,getMessagesAfter,return )
+HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,getMessagesAfter,return )
 
-void Chat_obj::getMessagesAfter__fromC(::String afterId,::String afterTime,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_337_getMessagesAfter__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			this->getMessagesAfter(afterId,afterTime);
+void Chat_obj::getMessagesAfter__fromC( ::borogove::ChatMessage after,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_getMessagesAfter__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->getMessagesAfter(after);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(::Array< ::Dynamic> v){
-            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_337_getMessagesAfter__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
-HXLINE( 308)				{
-HXLINE( 308)					int _g = 0;
-HXDLIN( 308)					while((_g < v->length)){
-HXLINE( 308)						 ::borogove::ChatMessage el = v->__get(_g).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 308)						_g = (_g + 1);
-HXDLIN( 308)						{
-HXLINE( 308)							 ::Dynamic haxeObject = el;
-HXDLIN( 308)							void* ptr = haxeObject.mPtr;
-HXDLIN( 308)							::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 308)							{
-HXLINE( 308)								 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 308)								if (::hx::IsNull( store )) {
-HXLINE( 308)									store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            										->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            										->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 308)									::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            								}
-            								else {
-HXLINE( 308)									::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            								}
-            							}
-            						}
-            					}
-            				}
-HXDLIN( 308)				void** ptr1 = (void**)v->getBase();
-HXDLIN( 308)				::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 308)				{
-HXLINE( 308)					 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 308)					if (::hx::IsNull( store1 )) {
-HXLINE( 308)						store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            							->setFixed(1,HX_("value",71,7f,b8,31),v));
-HXDLIN( 308)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            					}
-            					else {
-HXLINE( 308)						::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            					}
-            				}
-HXLINE( 337)				handler1(ptr1,( (size_t)(v->length) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_getMessagesAfter__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
+HXDLIN( 365)				handler1(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(v),( (size_t)(v->length) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_337_getMessagesAfter__fromC)
-HXDLIN( 337)				handler(null(),( (size_t)(0) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_getMessagesAfter__fromC)
+HXDLIN( 365)				handler(null(),( (size_t)(0) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->getMessagesAfter(afterId,afterTime), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->getMessagesAfter(after), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,getMessagesAround,return )
+HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,getMessagesAround,return )
 
-void Chat_obj::getMessagesAround__fromC(::String aroundId,::String aroundTime,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_337_getMessagesAround__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			this->getMessagesAround(aroundId,aroundTime);
+void Chat_obj::getMessagesAround__fromC( ::borogove::ChatMessage around,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_getMessagesAround__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->getMessagesAround(around);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(::Array< ::Dynamic> v){
-            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_337_getMessagesAround__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
-HXLINE( 308)				{
-HXLINE( 308)					int _g = 0;
-HXDLIN( 308)					while((_g < v->length)){
-HXLINE( 308)						 ::borogove::ChatMessage el = v->__get(_g).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 308)						_g = (_g + 1);
-HXDLIN( 308)						{
-HXLINE( 308)							 ::Dynamic haxeObject = el;
-HXDLIN( 308)							void* ptr = haxeObject.mPtr;
-HXDLIN( 308)							::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 308)							{
-HXLINE( 308)								 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 308)								if (::hx::IsNull( store )) {
-HXLINE( 308)									store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            										->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            										->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 308)									::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            								}
-            								else {
-HXLINE( 308)									::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            								}
-            							}
-            						}
-            					}
-            				}
-HXDLIN( 308)				void** ptr1 = (void**)v->getBase();
-HXDLIN( 308)				::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 308)				{
-HXLINE( 308)					 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 308)					if (::hx::IsNull( store1 )) {
-HXLINE( 308)						store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            							->setFixed(1,HX_("value",71,7f,b8,31),v));
-HXDLIN( 308)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            					}
-            					else {
-HXLINE( 308)						::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            					}
-            				}
-HXLINE( 337)				handler1(ptr1,( (size_t)(v->length) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_getMessagesAround__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
+HXDLIN( 365)				handler1(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(v),( (size_t)(v->length) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_337_getMessagesAround__fromC)
-HXDLIN( 337)				handler(null(),( (size_t)(0) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_getMessagesAround__fromC)
+HXDLIN( 365)				handler(null(),( (size_t)(0) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->getMessagesAround(aroundId,aroundTime), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->getMessagesAround(around), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
@@ -552,34 +480,34 @@ HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->getMessagesAr
             		void _hx_run( ::Dynamic resolve, ::Dynamic reject){
             			HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_1, ::borogove::Chat,_gthis, ::borogove::MessageSync,sync, ::Dynamic,resolve) HXARGC(1)
             			void _hx_run( ::Dynamic messageList){
-            				HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_169_fetchFromSync)
-HXLINE( 170)				::Array< ::Dynamic> chatMessages = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 171)				{
-HXLINE( 171)					int _g = 0;
-HXDLIN( 171)					::Array< ::Dynamic> _g1 = ( (::Array< ::Dynamic>)(messageList->__Field(HX_("messages",cc,d8,fd,34),::hx::paccDynamic)) );
-HXDLIN( 171)					while((_g < _g1->length)){
-HXLINE( 171)						 ::borogove::Message m = _g1->__get(_g).StaticCast<  ::borogove::Message >();
-HXDLIN( 171)						_g = (_g + 1);
-HXLINE( 172)						{
-HXLINE( 172)							 ::borogove::MessageStanza _g2 = m->parsed;
-HXDLIN( 172)							switch((int)(_g2->_hx_getIndex())){
+            				HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_218_fetchFromSync)
+HXLINE( 219)				::Array< ::Dynamic> chatMessages = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 220)				{
+HXLINE( 220)					int _g = 0;
+HXDLIN( 220)					::Array< ::Dynamic> _g1 = ( (::Array< ::Dynamic>)(messageList->__Field(HX_("messages",cc,d8,fd,34),::hx::paccDynamic)) );
+HXDLIN( 220)					while((_g < _g1->length)){
+HXLINE( 220)						 ::borogove::Message m = _g1->__get(_g).StaticCast<  ::borogove::Message >();
+HXDLIN( 220)						_g = (_g + 1);
+HXLINE( 221)						{
+HXLINE( 221)							 ::borogove::MessageStanza _g2 = m->parsed;
+HXDLIN( 221)							switch((int)(_g2->_hx_getIndex())){
             								case (int)0: {
-HXLINE( 180)									::Dynamic _gthis1 = _gthis->persistence;
-HXLINE( 181)									::String _hx_tmp = _gthis->client->accountId();
-HXLINE( 180)									::borogove::Persistence_obj::updateMessageStatus(_gthis1,_hx_tmp,_g2->_hx_getString(0),3,_g2->_hx_getObject(1).StaticCast<  ::borogove::Stanza >()->getErrorText());
+HXLINE( 229)									::Dynamic _gthis1 = _gthis->persistence;
+HXLINE( 230)									::String _hx_tmp = _gthis->client->accountId();
+HXLINE( 229)									::borogove::Persistence_obj::updateMessageStatus(_gthis1,_hx_tmp,_g2->_hx_getString(0),3,_g2->_hx_getObject(1).StaticCast<  ::borogove::Stanza >()->getErrorText());
             								}
             								break;
             								case (int)1: {
-HXLINE( 174)									chatMessages->push(_g2->_hx_getObject(0).StaticCast<  ::borogove::ChatMessage >());
+HXLINE( 223)									chatMessages->push(_g2->_hx_getObject(0).StaticCast<  ::borogove::ChatMessage >());
             								}
             								break;
-            								case (int)2: {
-HXLINE( 178)									_gthis->client->moderateMessage(_g2->_hx_getObject(0).StaticCast<  ::borogove::ModerationAction >());
+            								case (int)3: {
+HXLINE( 227)									_gthis->client->moderateMessage(_g2->_hx_getObject(0).StaticCast<  ::borogove::ModerationAction >());
             								}
             								break;
-            								case (int)3: {
-HXLINE( 176)									::Dynamic _gthis2 = _gthis->persistence;
-HXDLIN( 176)									::borogove::Persistence_obj::storeReaction(_gthis2,_gthis->client->accountId(),_g2->_hx_getObject(0).StaticCast<  ::borogove::ReactionUpdate >());
+            								case (int)4: {
+HXLINE( 225)									::Dynamic _gthis2 = _gthis->persistence;
+HXDLIN( 225)									::borogove::Persistence_obj::storeReaction(_gthis2,_gthis->client->accountId(),_g2->_hx_getObject(0).StaticCast<  ::borogove::ReactionUpdate >());
             								}
             								break;
             								default:{
@@ -588,59 +516,59 @@ HXDLIN( 176)									::borogove::Persistence_obj::storeReaction(_gthis2,_gthis->
             						}
             					}
             				}
-HXLINE( 190)				bool _hx_tmp1;
-HXDLIN( 190)				if ((chatMessages->length < 1)) {
-HXLINE( 190)					_hx_tmp1 = sync->hasMore();
+HXLINE( 239)				bool _hx_tmp1;
+HXDLIN( 239)				if ((chatMessages->length < 1)) {
+HXLINE( 239)					_hx_tmp1 = sync->hasMore();
             				}
             				else {
-HXLINE( 190)					_hx_tmp1 = false;
+HXLINE( 239)					_hx_tmp1 = false;
             				}
-HXDLIN( 190)				if (_hx_tmp1) {
-HXLINE( 191)					sync->fetchNext();
+HXDLIN( 239)				if (_hx_tmp1) {
+HXLINE( 240)					sync->fetchNext();
             				}
             				else {
             					HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::Chat,_gthis, ::Dynamic,resolve) HXARGC(1)
             					void _hx_run(::Array< ::Dynamic> chatMessages){
-            						HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_193_fetchFromSync)
-HXLINE( 194)						 ::Dynamic resolve1 = resolve;
-HXDLIN( 194)						::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 194)						{
-HXLINE( 194)							int _g1 = 0;
-HXDLIN( 194)							while((_g1 < chatMessages->length)){
-HXLINE( 194)								 ::borogove::ChatMessage v = chatMessages->__get(_g1).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 194)								_g1 = (_g1 + 1);
-HXDLIN( 194)								bool _hx_tmp;
-HXDLIN( 194)								if (::hx::IsNotNull( v )) {
-HXLINE( 194)									::String _hx_tmp1 = v->chatId();
-HXDLIN( 194)									_hx_tmp = (_hx_tmp1 == _gthis->chatId);
+            						HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_242_fetchFromSync)
+HXLINE( 243)						 ::Dynamic resolve1 = resolve;
+HXDLIN( 243)						::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 243)						{
+HXLINE( 243)							int _g1 = 0;
+HXDLIN( 243)							while((_g1 < chatMessages->length)){
+HXLINE( 243)								 ::borogove::ChatMessage v = chatMessages->__get(_g1).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN( 243)								_g1 = (_g1 + 1);
+HXDLIN( 243)								bool _hx_tmp;
+HXDLIN( 243)								if (::hx::IsNotNull( v )) {
+HXLINE( 243)									::String _hx_tmp1 = v->chatId();
+HXDLIN( 243)									_hx_tmp = (_hx_tmp1 == _gthis->chatId);
             								}
             								else {
-HXLINE( 194)									_hx_tmp = false;
+HXLINE( 243)									_hx_tmp = false;
             								}
-HXDLIN( 194)								if (_hx_tmp) {
-HXLINE( 194)									_g->push(v);
+HXDLIN( 243)								if (_hx_tmp) {
+HXLINE( 243)									_g->push(v);
             								}
             							}
             						}
-HXDLIN( 194)						resolve1(_g);
+HXDLIN( 243)						resolve1(_g);
             					}
             					HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 193)					::thenshim::_Promise::Promise_Impl__obj::then(_gthis->client->storeMessages(chatMessages), ::Dynamic(new _hx_Closure_0(_gthis,resolve)),null());
+HXLINE( 242)					::thenshim::_Promise::Promise_Impl__obj::then(_gthis->client->storeMessages(chatMessages), ::Dynamic(new _hx_Closure_0(_gthis,resolve)),null());
             				}
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_168_fetchFromSync)
-HXLINE( 169)			sync->onMessages( ::Dynamic(new _hx_Closure_1(_gthis,sync,resolve)));
-HXLINE( 198)			sync->onError(reject);
-HXLINE( 199)			sync->fetchNext();
+            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_217_fetchFromSync)
+HXLINE( 218)			sync->onMessages( ::Dynamic(new _hx_Closure_1(_gthis,sync,resolve)));
+HXLINE( 247)			sync->onError(reject);
+HXLINE( 248)			sync->fetchNext();
             		}
             		HX_END_LOCAL_FUNC2((void))
 
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_167_fetchFromSync)
-HXDLIN( 167)		 ::borogove::Chat _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 168)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_2(_gthis,sync)));
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_216_fetchFromSync)
+HXDLIN( 216)		 ::borogove::Chat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 217)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_2(_gthis,sync)));
             	}
 
 
@@ -649,8 +577,8 @@ HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,fetchFromSync,return )
 HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,sendMessage,(void))
 
 void Chat_obj::sendMessage__fromC( ::borogove::ChatMessageBuilder message){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_339_sendMessage__fromC)
-HXDLIN( 339)		this->sendMessage(message);
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_354_sendMessage__fromC)
+HXDLIN( 354)		this->sendMessage(message);
             	}
 
 
@@ -661,8 +589,8 @@ HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,sendMessageStanza,(void))
 HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,markReadUpTo,(void))
 
 void Chat_obj::markReadUpTo__fromC( ::borogove::ChatMessage message){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_339_markReadUpTo__fromC)
-HXDLIN( 339)		this->markReadUpTo(message);
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_354_markReadUpTo__fromC)
+HXDLIN( 354)		this->markReadUpTo(message);
             	}
 
 
@@ -671,120 +599,280 @@ HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,markReadUpTo__fromC,(void))
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,bookmark,(void))
 
 void Chat_obj::bookmark__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_339_bookmark__fromC)
-HXDLIN( 339)		this->bookmark();
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_354_bookmark__fromC)
+HXDLIN( 354)		this->bookmark();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,bookmark__fromC,(void))
 
-HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,getParticipants,return )
-
-size_t Chat_obj::getParticipants__fromC(const char*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_335_getParticipants__fromC)
-HXDLIN( 335)		::Array< ::String > out = this->getParticipants();
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			::Array< size_t > arr = ::Array_obj< size_t >::__new(out->length);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g_current = 0;
-HXDLIN( 335)				::Array< ::String > _g_array = out;
-HXDLIN( 335)				while((_g_current < _g_array->length)){
-HXDLIN( 335)					::String _g_value = _g_array->__get(_g_current);
-HXDLIN( 335)					_g_current = (_g_current + 1);
-HXDLIN( 335)					::String el = _g_value;
-HXDLIN( 335)					{
-HXDLIN( 335)						const char* cStrPtr = el.utf8_str();
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXLINE(2243)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),el));
-HXLINE( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
+HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,members,return )
+
+void Chat_obj::members__fromC(::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_members__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->members();
+            		}
+            		else {
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run(::Array< ::Dynamic> v){
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_members__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
+HXDLIN( 365)				handler1(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(v),( (size_t)(v->length) ),handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::Dynamic e){
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_members__fromC)
+HXDLIN( 365)				handler(null(),( (size_t)(0) ),handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->members(), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+            		}
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,getMemberDetails,return )
+
+void Chat_obj::getMemberDetails__fromC(::cpp::Pointer< const char* > memberIds,size_t memberIds__len,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_getMemberDetails__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXLINE( 300)			::Array< ::String > _hx_tmp;
+HXDLIN( 300)			if (::hx::IsNull( memberIds )) {
+HXLINE( 300)				_hx_tmp = ::Array_obj< ::String >::__new(0);
+            			}
+            			else {
+HXLINE( 300)				::cpp::Pointer< ::cpp::Pointer< char > > _this = memberIds->reinterpret();
+HXDLIN( 300)				::Array< ::cpp::Pointer< char > > result = ::Array_obj< ::cpp::Pointer< char > >::__new();
+HXDLIN( 300)				::cpp::Pointer< ::cpp::Pointer< char > > tmp = _this;
+HXDLIN( 300)				result->setUnmanagedData(tmp,( (int)(memberIds__len) ));
+HXDLIN( 300)				 ::Dynamic f = ::cpp::_NativeString::NativeString_Impl__obj::fromPointer_dyn();
+HXDLIN( 300)				::Array< ::String > result1 = ::Array_obj< ::String >::__new(result->length);
+HXDLIN( 300)				{
+HXLINE( 300)					int _g = 0;
+HXDLIN( 300)					int _g1 = result->length;
+HXDLIN( 300)					while((_g < _g1)){
+HXLINE( 300)						_g = (_g + 1);
+HXDLIN( 300)						int i = (_g - 1);
+HXDLIN( 300)						{
+HXLINE( 300)							::cpp::Pointer< char > tmp1 = _hx_array_unsafe_get(result,i);
+HXDLIN( 300)							::String inValue = ( (::String)(f(tmp1)) );
+HXDLIN( 300)							result1->__unsafe_set(i,inValue);
             						}
-HXDLIN( 335)						const char* ptr = cStrPtr;
-HXDLIN( 335)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
             					}
             				}
+HXDLIN( 300)				_hx_tmp = result1->copy();
             			}
-HXDLIN( 335)			void** ptr1 = (void**)arr->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXLINE(2243)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),arr));
-HXLINE( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 365)			this->getMemberDetails(_hx_tmp);
+            		}
+            		else {
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run(::Array< ::Dynamic> v){
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_getMemberDetails__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
+HXDLIN( 365)				handler1(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(v),( (size_t)(v->length) ),handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::Dynamic e){
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_getMemberDetails__fromC)
+HXDLIN( 365)				handler(null(),( (size_t)(0) ),handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+HXLINE( 300)			::Array< ::String > _hx_tmp1;
+HXDLIN( 300)			if (::hx::IsNull( memberIds )) {
+HXLINE( 300)				_hx_tmp1 = ::Array_obj< ::String >::__new(0);
+            			}
+            			else {
+HXLINE( 300)				::cpp::Pointer< ::cpp::Pointer< char > > _this1 = memberIds->reinterpret();
+HXDLIN( 300)				::Array< ::cpp::Pointer< char > > result2 = ::Array_obj< ::cpp::Pointer< char > >::__new();
+HXDLIN( 300)				::cpp::Pointer< ::cpp::Pointer< char > > tmp2 = _this1;
+HXDLIN( 300)				result2->setUnmanagedData(tmp2,( (int)(memberIds__len) ));
+HXDLIN( 300)				 ::Dynamic f1 = ::cpp::_NativeString::NativeString_Impl__obj::fromPointer_dyn();
+HXDLIN( 300)				::Array< ::String > result3 = ::Array_obj< ::String >::__new(result2->length);
+HXDLIN( 300)				{
+HXLINE( 300)					int _g2 = 0;
+HXDLIN( 300)					int _g3 = result2->length;
+HXDLIN( 300)					while((_g2 < _g3)){
+HXLINE( 300)						_g2 = (_g2 + 1);
+HXDLIN( 300)						int i1 = (_g2 - 1);
+HXDLIN( 300)						{
+HXLINE( 300)							::cpp::Pointer< char > tmp3 = _hx_array_unsafe_get(result2,i1);
+HXDLIN( 300)							::String inValue1 = ( (::String)(f1(tmp3)) );
+HXDLIN( 300)							result3->__unsafe_set(i1,inValue1);
+            						}
+            					}
             				}
+HXDLIN( 300)				_hx_tmp1 = result3->copy();
             			}
-HXDLIN( 335)			_hx_tmp->set_ref(( (const char**)(ptr1) ));
+HXLINE( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->getMemberDetails(_hx_tmp1), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+            		}
+            	}
+
+
+int Chat_obj::addMembersUpdatedListener( ::Dynamic handler){
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,handler) HXARGC(1)
+            		 ::borogove::EventResult _hx_run(::Array< ::Dynamic> data){
+            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_297_addMembersUpdatedListener)
+HXLINE( 298)			handler(data);
+HXLINE( 299)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_297_addMembersUpdatedListener)
+HXDLIN( 297)		return this->on(HX_("members/update",bf,63,66,64), ::Dynamic(new _hx_Closure_0(handler)));
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,getParticipantDetails,return )
+HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,addMembersUpdatedListener,return )
+
+int Chat_obj::addMembersUpdatedListener__fromC(::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            		void _hx_run(::Array< ::Dynamic> a0){
+            			HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_282_addMembersUpdatedListener__fromC)
+HXLINE( 251)			void** x0 = ::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(a0);
+HXDLIN( 251)			int xl0;
+HXDLIN( 251)			 ::Dynamic tmp;
+HXDLIN( 251)			if (::hx::IsNotNull( a0 )) {
+HXLINE( 251)				tmp = a0->length;
+            			}
+            			else {
+HXLINE( 251)				tmp = null();
+            			}
+HXDLIN( 251)			if (::hx::IsNotNull( tmp )) {
+HXLINE( 251)				xl0 = ( (int)(tmp) );
+            			}
+            			else {
+HXLINE( 251)				xl0 = -1;
+            			}
+HXLINE( 269)			handler(x0,( (size_t)(xl0) ),handler__context);
+            		}
+            		HX_END_LOCAL_FUNC1((void))
+
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_367_addMembersUpdatedListener__fromC)
+HXDLIN( 367)		return this->addMembersUpdatedListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	}
+
 
- ::borogove::Participant Chat_obj::getParticipantDetails__fromC(::String participantId){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_339_getParticipantDetails__fromC)
-HXDLIN( 339)		return this->getParticipantDetails(participantId);
+::Array< ::Dynamic> Chat_obj::availableRoles( ::borogove::Member member){
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_307_availableRoles)
+HXDLIN( 307)		return ::Array_obj< ::Dynamic>::__new(0);
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,getParticipantDetails__fromC,return )
+HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,availableRoles,return )
+
+size_t Chat_obj::availableRoles__fromC( ::borogove::Member member,void*** outPtr){
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_363_availableRoles__fromC)
+HXDLIN( 363)		::Array< ::Dynamic> out = this->availableRoles(member);
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(out));
+            		}
+HXDLIN( 363)		return ( (size_t)(out->length) );
+            	}
+
+
+bool Chat_obj::canRemoveRole( ::borogove::Member member, ::borogove::Role role){
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_314_canRemoveRole)
+HXDLIN( 314)		return false;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,canRemoveRole,return )
+
+void Chat_obj::addRole( ::borogove::Member member, ::borogove::Role role){
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_323_addRole)
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,addRole,(void))
+
+void Chat_obj::removeRole( ::borogove::Member member, ::borogove::Role role){
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_331_removeRole)
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,removeRole,(void))
 
 HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,correctMessage,(void))
 
-void Chat_obj::correctMessage__fromC(::String localId, ::borogove::ChatMessageBuilder message){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_339_correctMessage__fromC)
-HXDLIN( 339)		this->correctMessage(localId,message);
+void Chat_obj::correctMessage__fromC( ::borogove::ChatMessage correct, ::borogove::ChatMessageBuilder message){
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_354_correctMessage__fromC)
+HXDLIN( 354)		this->correctMessage(correct,message);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,correctMessage__fromC,(void))
 
+void Chat_obj::moderate( ::borogove::ChatMessage message,::String reason){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            		void _hx_run( ::borogove::Stanza response){
+            			HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_354_moderate)
+            		}
+            		HX_END_LOCAL_FUNC1((void))
+
+            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_347_moderate)
+HXLINE( 348)		bool _hx_tmp;
+HXDLIN( 348)		if (::hx::IsNotNull( message->serverId )) {
+HXLINE( 348)			_hx_tmp = (message->serverIdBy != this->chatId);
+            		}
+            		else {
+HXLINE( 348)			_hx_tmp = true;
+            		}
+HXDLIN( 348)		if (_hx_tmp) {
+HXLINE( 348)			return;
+            		}
+HXLINE( 350)		 ::borogove::Stanza iq =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+            			->setFixed(0,HX_("to",7b,65,00,00),this->chatId)
+            			->setFixed(1,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("moderate",c3,13,16,d1), ::Dynamic(::hx::Anon_obj::Create(2)
+            			->setFixed(0,HX_("id",db,5b,00,00),message->serverId)
+            			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:message-moderate:1",5c,30,1a,b9))))->textTag(HX_("retract",01,e2,b9,fc),HX_("",00,00,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:message-retract:1",16,5e,d8,d5))))->textTag(HX_("reason",c4,0f,9d,fc),reason,null());
+HXLINE( 354)		this->stream->sendIq(iq, ::Dynamic(new _hx_Closure_0()));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,moderate,(void))
+
 void Chat_obj::addReaction( ::borogove::ChatMessage m, ::borogove::Reaction reaction){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::ChatMessageBuilder,toSend) HXARGC(1)
             		::String _hx_run(::String text){
-            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_258_addReaction)
-HXLINE( 259)			toSend->text = ::StringTools_obj::replace(text,HX_W(u"\ufe0f",fb86,00b5),HX_("",00,00,00,00));
-HXLINE( 260)			return HX_("",00,00,00,00);
+            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_367_addReaction)
+HXLINE( 368)			 ::borogove::ChatMessageBuilder toSend1 = toSend;
+HXDLIN( 368)			toSend1->setBody(::borogove::Html_obj::text(text));
+HXLINE( 369)			return HX_("",00,00,00,00);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::ChatMessageBuilder,toSend) HXARGC(2)
             		::String _hx_run(::String text,::String uri){
-            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_262_addReaction)
-HXLINE( 263)			 ::borogove::Hash hash = ::borogove::Hash_obj::fromUri(uri);
-HXLINE( 264)			 ::borogove::ChatMessageBuilder toSend1 = toSend;
-HXDLIN( 264)			::String _hx_tmp = ((HX_("<img alt=\"",15,9f,1a,99) + ::borogove::_Util::Util_Fields__obj::xmlEscape(text)) + HX_("\" src=\"",ab,ae,ff,d3));
-HXDLIN( 264)			::String _hx_tmp1;
-HXDLIN( 264)			if (::hx::IsNull( hash )) {
-HXLINE( 264)				_hx_tmp1 = uri;
+            			HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_371_addReaction)
+HXLINE( 372)			 ::borogove::Hash hash = ::borogove::Hash_obj::fromUri(uri);
+HXLINE( 373)			 ::borogove::ChatMessageBuilder toSend1 = toSend;
+HXLINE( 374)			::String _hx_tmp;
+HXDLIN( 374)			if (::hx::IsNull( hash )) {
+HXLINE( 374)				_hx_tmp = uri;
             			}
             			else {
-HXLINE( 264)				_hx_tmp1 = hash->bobUri();
+HXLINE( 374)				_hx_tmp = hash->bobUri();
             			}
-HXDLIN( 264)			toSend1->setHtml(((_hx_tmp + ::borogove::_Util::Util_Fields__obj::xmlEscape(_hx_tmp1)) + HX_("\" />",6d,b2,91,16)));
-HXLINE( 265)			return HX_("",00,00,00,00);
+HXLINE( 373)			toSend1->setBody( ::borogove::Html_obj::__alloc( HX_CTX ,::Array_obj< ::Dynamic>::__new(1)->init(0,::borogove::Node_obj::Element( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("img",03,0c,50,00), ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("alt",29,f9,49,00),text)
+            				->setFixed(1,HX_("src",e4,a6,57,00),_hx_tmp))))),null()));
+HXLINE( 376)			return HX_("",00,00,00,00);
             		}
             		HX_END_LOCAL_FUNC2(return)
 
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_254_addReaction)
-HXLINE( 255)		 ::borogove::ChatMessageBuilder toSend = m->reply();
-HXLINE( 256)		toSend->localId = ::borogove::ID_obj::_hx_long();
-HXLINE( 257)		reaction->render( ::Dynamic(new _hx_Closure_0(toSend)), ::Dynamic(new _hx_Closure_1(toSend)));
-HXLINE( 268)		this->sendMessage(toSend);
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_363_addReaction)
+HXLINE( 364)		 ::borogove::ChatMessageBuilder toSend = m->reply();
+HXLINE( 365)		toSend->localId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXLINE( 366)		reaction->render( ::Dynamic(new _hx_Closure_0(toSend)), ::Dynamic(new _hx_Closure_1(toSend)));
+HXLINE( 379)		this->sendMessage(toSend);
             	}
 
 
@@ -793,8 +881,8 @@ HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,addReaction,(void))
 HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,removeReaction,(void))
 
 void Chat_obj::removeReaction__fromC( ::borogove::ChatMessage m, ::borogove::Reaction reaction){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_339_removeReaction__fromC)
-HXDLIN( 339)		this->removeReaction(m,reaction);
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_354_removeReaction__fromC)
+HXDLIN( 354)		this->removeReaction(m,reaction);
             	}
 
 
@@ -805,111 +893,111 @@ HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,sendChatState,(void))
 void Chat_obj::typing(::String threadId,::String content){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::Chat,_gthis) HXARGC(0)
             		void _hx_run(){
-            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_308_typing)
-HXLINE( 309)			_gthis->sendChatState(HX_("paused",ae,40,84,ef),_gthis->typingThread);
-HXLINE( 310)			_gthis->isTyping = false;
+            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_419_typing)
+HXLINE( 420)			_gthis->sendChatState(HX_("paused",ae,40,84,ef),_gthis->typingThread);
+HXLINE( 421)			_gthis->isTyping = false;
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_287_typing)
-HXDLIN( 287)		 ::borogove::Chat _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 288)		bool _hx_tmp;
-HXDLIN( 288)		if ((threadId != this->typingThread)) {
-HXLINE( 288)			_hx_tmp = this->isTyping;
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_398_typing)
+HXDLIN( 398)		 ::borogove::Chat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 399)		bool _hx_tmp;
+HXDLIN( 399)		if ((threadId != this->typingThread)) {
+HXLINE( 399)			_hx_tmp = this->isTyping;
             		}
             		else {
-HXLINE( 288)			_hx_tmp = false;
+HXLINE( 399)			_hx_tmp = false;
             		}
-HXDLIN( 288)		if (_hx_tmp) {
-HXLINE( 290)			this->sendChatState(HX_("paused",ae,40,84,ef),this->typingThread);
-HXLINE( 291)			this->isTyping = false;
+HXDLIN( 399)		if (_hx_tmp) {
+HXLINE( 401)			this->sendChatState(HX_("paused",ae,40,84,ef),this->typingThread);
+HXLINE( 402)			this->isTyping = false;
             		}
-HXLINE( 294)		this->typingThread = threadId;
-HXLINE( 295)		if (::hx::IsNotNull( this->typingTimer )) {
-HXLINE( 295)			this->typingTimer->stop();
+HXLINE( 405)		this->typingThread = threadId;
+HXLINE( 406)		if (::hx::IsNotNull( this->typingTimer )) {
+HXLINE( 406)			this->typingTimer->stop();
             		}
-HXLINE( 297)		if ((content == HX_("",00,00,00,00))) {
-HXLINE( 298)			this->isTyping = false;
-HXLINE( 299)			this->sendChatState(HX_("active",c6,41,46,16),this->typingThread);
-HXLINE( 300)			if (::hx::IsNull( this->isActive )) {
+HXLINE( 408)		if ((content == HX_("",00,00,00,00))) {
+HXLINE( 409)			this->isTyping = false;
+HXLINE( 410)			this->sendChatState(HX_("active",c6,41,46,16),this->typingThread);
+HXLINE( 411)			if (::hx::IsNull( this->isActive )) {
             				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Chat,_gthis) HXARGC(0)
             				void _hx_run(){
-            					HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_302_typing)
-HXLINE( 302)					_gthis->sendChatState(HX_("inactive",6b,17,30,6a),_gthis->typingThread);
+            					HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_413_typing)
+HXLINE( 413)					_gthis->sendChatState(HX_("inactive",6b,17,30,6a),_gthis->typingThread);
             				}
             				HX_END_LOCAL_FUNC0((void))
 
-HXLINE( 301)				this->typingTimer = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_0(_gthis)),30000);
+HXLINE( 412)				this->typingTimer = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_0(_gthis)),30000);
             			}
-HXLINE( 305)			return;
+HXLINE( 416)			return;
             		}
-HXLINE( 308)		this->typingTimer = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_1(_gthis)),10000);
-HXLINE( 313)		if (this->isTyping) {
-HXLINE( 313)			return;
+HXLINE( 419)		this->typingTimer = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_1(_gthis)),10000);
+HXLINE( 424)		if (this->isTyping) {
+HXLINE( 424)			return;
             		}
-HXLINE( 314)		this->isTyping = true;
-HXLINE( 315)		this->sendChatState(HX_("composing",cf,0a,a5,12),this->typingThread);
+HXLINE( 425)		this->isTyping = true;
+HXLINE( 426)		this->sendChatState(HX_("composing",cf,0a,a5,12),this->typingThread);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,typing,(void))
 
 void Chat_obj::setActive(bool active,::String threadId){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_326_setActive)
-HXLINE( 327)		if (::hx::IsNotNull( this->typingTimer )) {
-HXLINE( 327)			this->typingTimer->stop();
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_437_setActive)
+HXLINE( 438)		if (::hx::IsNotNull( this->typingTimer )) {
+HXLINE( 438)			this->typingTimer->stop();
             		}
-HXLINE( 328)		this->isTyping = false;
-HXLINE( 330)		bool _hx_tmp;
-HXDLIN( 330)		bool _hx_tmp1;
-HXDLIN( 330)		if (( (bool)(this->isActive) )) {
-HXLINE( 330)			_hx_tmp1 = active;
+HXLINE( 439)		this->isTyping = false;
+HXLINE( 441)		bool _hx_tmp;
+HXDLIN( 441)		bool _hx_tmp1;
+HXDLIN( 441)		if (( (bool)(this->isActive) )) {
+HXLINE( 441)			_hx_tmp1 = active;
             		}
             		else {
-HXLINE( 330)			_hx_tmp1 = false;
+HXLINE( 441)			_hx_tmp1 = false;
             		}
-HXDLIN( 330)		if (_hx_tmp1) {
-HXLINE( 330)			_hx_tmp = (threadId != this->activeThread);
+HXDLIN( 441)		if (_hx_tmp1) {
+HXLINE( 441)			_hx_tmp = (threadId != this->activeThread);
             		}
             		else {
-HXLINE( 330)			_hx_tmp = false;
+HXLINE( 441)			_hx_tmp = false;
             		}
-HXDLIN( 330)		if (_hx_tmp) {
-HXLINE( 331)			this->sendChatState(HX_("inactive",6b,17,30,6a),this->activeThread);
-HXLINE( 332)			this->isActive = false;
+HXDLIN( 441)		if (_hx_tmp) {
+HXLINE( 442)			this->sendChatState(HX_("inactive",6b,17,30,6a),this->activeThread);
+HXLINE( 443)			this->isActive = false;
             		}
-HXLINE( 334)		if (::hx::IsNotNull( this->isActive )) {
-HXLINE( 335)			bool _hx_tmp2;
-HXDLIN( 335)			if (( (bool)(this->isActive) )) {
-HXLINE( 335)				_hx_tmp2 = active;
+HXLINE( 445)		if (::hx::IsNotNull( this->isActive )) {
+HXLINE( 446)			bool _hx_tmp2;
+HXDLIN( 446)			if (( (bool)(this->isActive) )) {
+HXLINE( 446)				_hx_tmp2 = active;
             			}
             			else {
-HXLINE( 335)				_hx_tmp2 = false;
+HXLINE( 446)				_hx_tmp2 = false;
             			}
-HXDLIN( 335)			if (_hx_tmp2) {
-HXLINE( 335)				return;
+HXDLIN( 446)			if (_hx_tmp2) {
+HXLINE( 446)				return;
             			}
-HXLINE( 336)			bool _hx_tmp3;
-HXDLIN( 336)			if (!(( (bool)(this->isActive) ))) {
-HXLINE( 336)				_hx_tmp3 = !(active);
+HXLINE( 447)			bool _hx_tmp3;
+HXDLIN( 447)			if (!(( (bool)(this->isActive) ))) {
+HXLINE( 447)				_hx_tmp3 = !(active);
             			}
             			else {
-HXLINE( 336)				_hx_tmp3 = false;
+HXLINE( 447)				_hx_tmp3 = false;
             			}
-HXDLIN( 336)			if (_hx_tmp3) {
-HXLINE( 336)				return;
+HXDLIN( 447)			if (_hx_tmp3) {
+HXLINE( 447)				return;
             			}
             		}
-HXLINE( 338)		this->isActive = active;
-HXLINE( 339)		this->activeThread = threadId;
-HXLINE( 340)		::String _hx_tmp4;
-HXDLIN( 340)		if (active) {
-HXLINE( 340)			_hx_tmp4 = HX_("active",c6,41,46,16);
+HXLINE( 449)		this->isActive = active;
+HXLINE( 450)		this->activeThread = threadId;
+HXLINE( 451)		::String _hx_tmp4;
+HXDLIN( 451)		if (active) {
+HXLINE( 451)			_hx_tmp4 = HX_("active",c6,41,46,16);
             		}
             		else {
-HXLINE( 340)			_hx_tmp4 = HX_("inactive",6b,17,30,6a);
+HXLINE( 451)			_hx_tmp4 = HX_("inactive",6b,17,30,6a);
             		}
-HXDLIN( 340)		this->sendChatState(_hx_tmp4,this->activeThread);
+HXDLIN( 451)		this->sendChatState(_hx_tmp4,this->activeThread);
             	}
 
 
@@ -918,27 +1006,27 @@ HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,setActive,(void))
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,close,(void))
 
 void Chat_obj::close__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_339_close__fromC)
-HXDLIN( 339)		this->close();
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_354_close__fromC)
+HXDLIN( 354)		this->close();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,close__fromC,(void))
 
 void Chat_obj::togglePinned(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_351_togglePinned)
-HXLINE( 352)		int _hx_tmp;
-HXDLIN( 352)		if ((this->uiState != 0)) {
-HXLINE( 352)			_hx_tmp = 0;
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_462_togglePinned)
+HXLINE( 463)		int _hx_tmp;
+HXDLIN( 463)		if ((this->uiState != 0)) {
+HXLINE( 463)			_hx_tmp = 0;
             		}
             		else {
-HXLINE( 352)			_hx_tmp = 1;
+HXLINE( 463)			_hx_tmp = 1;
             		}
-HXDLIN( 352)		this->uiState = _hx_tmp;
-HXLINE( 353)		::Dynamic _hx_tmp1 = this->persistence;
-HXDLIN( 353)		::borogove::Persistence_obj::storeChats(_hx_tmp1,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
-HXLINE( 354)		this->client->sortChats();
-HXLINE( 355)		this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+HXDLIN( 463)		this->uiState = _hx_tmp;
+HXLINE( 464)		::Dynamic _hx_tmp1 = this->persistence;
+HXDLIN( 464)		::borogove::Persistence_obj::storeChats(_hx_tmp1,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+HXLINE( 465)		this->client->sortChats();
+HXLINE( 466)		this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
             	}
 
 
@@ -947,129 +1035,129 @@ HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,togglePinned,(void))
 void Chat_obj::block(::hx::Null< bool >  __o_reportSpam, ::borogove::ChatMessage spamMessage,::hx::Null< bool >  __o_onServer){
             		bool reportSpam = __o_reportSpam.Default(false);
             		bool onServer = __o_onServer.Default(true);
-            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_361_block)
-HXLINE( 362)		bool _hx_tmp;
-HXDLIN( 362)		if (reportSpam) {
-HXLINE( 362)			_hx_tmp = !(onServer);
+            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_472_block)
+HXLINE( 473)		bool _hx_tmp;
+HXDLIN( 473)		if (reportSpam) {
+HXLINE( 473)			_hx_tmp = !(onServer);
             		}
             		else {
-HXLINE( 362)			_hx_tmp = false;
+HXLINE( 473)			_hx_tmp = false;
             		}
-HXDLIN( 362)		if (_hx_tmp) {
-HXLINE( 362)			HX_STACK_DO_THROW(HX_("Can't report SPAM if not sending to server",60,59,79,c5));
+HXDLIN( 473)		if (_hx_tmp) {
+HXLINE( 473)			HX_STACK_DO_THROW(HX_("Can't report SPAM if not sending to server",60,59,79,c5));
             		}
-HXLINE( 364)		bool _hx_tmp1;
-HXDLIN( 364)		bool _hx_tmp2;
-HXDLIN( 364)		if (onServer) {
-HXLINE( 364)			_hx_tmp2 = (this->invites()->length > 0);
+HXLINE( 475)		bool _hx_tmp1;
+HXDLIN( 475)		bool _hx_tmp2;
+HXDLIN( 475)		if (onServer) {
+HXLINE( 475)			_hx_tmp2 = (this->invites()->length > 0);
             		}
             		else {
-HXLINE( 364)			_hx_tmp2 = false;
+HXLINE( 475)			_hx_tmp2 = false;
             		}
-HXDLIN( 364)		if (_hx_tmp2) {
-HXLINE( 364)			_hx_tmp1 = (this->uiState == 3);
+HXDLIN( 475)		if (_hx_tmp2) {
+HXLINE( 475)			_hx_tmp1 = (this->uiState == 3);
             		}
             		else {
-HXLINE( 364)			_hx_tmp1 = false;
+HXLINE( 475)			_hx_tmp1 = false;
             		}
-HXDLIN( 364)		if (_hx_tmp1) {
-HXLINE( 366)			{
-HXLINE( 366)				int _g = 0;
-HXDLIN( 366)				::Array< ::Dynamic> _g1 = this->invites();
-HXDLIN( 366)				while((_g < _g1->length)){
+HXDLIN( 475)		if (_hx_tmp1) {
+HXLINE( 477)			{
+HXLINE( 477)				int _g = 0;
+HXDLIN( 477)				::Array< ::Dynamic> _g1 = this->invites();
+HXDLIN( 477)				while((_g < _g1->length)){
             					HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             					void _hx_run( ::borogove::Stanza response){
-            						HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_380_block)
+            						HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_491_block)
             					}
             					HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 366)					 ::borogove::Stanza invite = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 366)					_g = (_g + 1);
-HXLINE( 367)					 ::borogove::JID inviteFrom = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(invite->attr,HX_("from",6a,a5,c2,43))) ));
-HXLINE( 368)					 ::borogove::Client inviteFromBareChat = this->client;
-HXDLIN( 368)					 ::borogove::Chat inviteFromBareChat1 = inviteFromBareChat->getChat(inviteFrom->asBare()->asString());
-HXLINE( 369)					::String toBlock;
-HXDLIN( 369)					bool toBlock1;
-HXDLIN( 369)					if (::hx::IsNotNull( inviteFromBareChat1 )) {
-HXLINE( 369)						toBlock1 = ::Std_obj::isOfType(inviteFromBareChat1,::hx::ClassOf< ::borogove::Channel >());
+HXLINE( 477)					 ::borogove::Stanza invite = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 477)					_g = (_g + 1);
+HXLINE( 478)					 ::borogove::JID inviteFrom = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(invite->attr,HX_("from",6a,a5,c2,43))) ));
+HXLINE( 479)					 ::borogove::Client inviteFromBareChat = this->client;
+HXDLIN( 479)					 ::borogove::Chat inviteFromBareChat1 = inviteFromBareChat->getChat(inviteFrom->asBare()->asString());
+HXLINE( 480)					::String toBlock;
+HXDLIN( 480)					bool toBlock1;
+HXDLIN( 480)					if (::hx::IsNotNull( inviteFromBareChat1 )) {
+HXLINE( 480)						toBlock1 = ::Std_obj::isOfType(inviteFromBareChat1,::hx::ClassOf< ::borogove::Channel >());
             					}
             					else {
-HXLINE( 369)						toBlock1 = false;
+HXLINE( 480)						toBlock1 = false;
             					}
-HXDLIN( 369)					if (toBlock1) {
-HXLINE( 369)						toBlock = inviteFrom->asString();
+HXDLIN( 480)					if (toBlock1) {
+HXLINE( 480)						toBlock = inviteFrom->asString();
             					}
             					else {
-HXLINE( 369)						toBlock = inviteFrom->asBare()->asString();
+HXLINE( 480)						toBlock = inviteFrom->asBare()->asString();
             					}
-HXLINE( 371)					::String iq = ::borogove::ID_obj::_hx_short();
-HXDLIN( 371)					 ::borogove::Stanza iq1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 482)					::String iq = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXDLIN( 482)					 ::borogove::Stanza iq1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("id",db,5b,00,00),iq)
             						->setFixed(1,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("block",4d,75,fc,b4), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:blocking",d1,a1,46,c3))))->tag(HX_("item",13,c5,bf,45), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("jid",c5,ca,50,00),toBlock)));
-HXLINE( 374)					if (reportSpam) {
-HXLINE( 375)						 ::borogove::Stanza report = iq1->tag(HX_("report",b4,3c,84,06), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 485)					if (reportSpam) {
+HXLINE( 486)						 ::borogove::Stanza report = iq1->tag(HX_("report",b4,3c,84,06), ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("reason",c4,0f,9d,fc),HX_("urn:xmpp:reporting:spam",b1,09,15,35))
             							->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:reporting:1",49,f0,16,fc))));
-HXLINE( 376)						 ::borogove::Stanza stanzaIdEl = invite->getChild(HX_("stanza-id",73,8a,54,e9),HX_("urn:xmpp:sid:0",a8,4b,37,54));
-HXLINE( 377)						if (::hx::IsNotNull( stanzaIdEl )) {
-HXLINE( 377)							report->addChild(stanzaIdEl);
+HXLINE( 487)						 ::borogove::Stanza stanzaIdEl = invite->getChild(HX_("stanza-id",73,8a,54,e9),HX_("urn:xmpp:sid:0",a8,4b,37,54));
+HXLINE( 488)						if (::hx::IsNotNull( stanzaIdEl )) {
+HXLINE( 488)							report->addChild(stanzaIdEl);
             						}
-HXLINE( 378)						report->up();
+HXLINE( 489)						report->up();
             					}
-HXLINE( 380)					this->stream->sendIq(iq1, ::Dynamic(new _hx_Closure_0()));
+HXLINE( 491)					this->stream->sendIq(iq1, ::Dynamic(new _hx_Closure_0()));
             				}
             			}
-HXLINE( 382)			this->close();
-HXLINE( 383)			return;
+HXLINE( 493)			this->close();
+HXLINE( 494)			return;
             		}
-HXLINE( 386)		this->isBlocked = true;
-HXLINE( 387)		if ((this->uiState == 2)) {
-HXLINE( 388)			::Dynamic _hx_tmp3 = this->persistence;
-HXDLIN( 388)			::borogove::Persistence_obj::storeChats(_hx_tmp3,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+HXLINE( 497)		this->isBlocked = true;
+HXLINE( 498)		if ((this->uiState == 2)) {
+HXLINE( 499)			::Dynamic _hx_tmp3 = this->persistence;
+HXDLIN( 499)			::borogove::Persistence_obj::storeChats(_hx_tmp3,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
             		}
             		else {
-HXLINE( 390)			this->close();
+HXLINE( 501)			this->close();
             		}
-HXLINE( 392)		if (onServer) {
+HXLINE( 503)		if (onServer) {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             			void _hx_run( ::borogove::Stanza response){
-            				HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_408_block)
+            				HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_519_block)
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 393)			::String iq2 = ::borogove::ID_obj::_hx_short();
-HXDLIN( 393)			 ::borogove::Stanza iq3 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 504)			::String iq2 = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXDLIN( 504)			 ::borogove::Stanza iq3 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("id",db,5b,00,00),iq2)
             				->setFixed(1,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("block",4d,75,fc,b4), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:blocking",d1,a1,46,c3))))->tag(HX_("item",13,c5,bf,45), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("jid",c5,ca,50,00),this->chatId)));
-HXLINE( 396)			if (reportSpam) {
-HXLINE( 397)				 ::borogove::Stanza report1 = iq3->tag(HX_("report",b4,3c,84,06), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 507)			if (reportSpam) {
+HXLINE( 508)				 ::borogove::Stanza report1 = iq3->tag(HX_("report",b4,3c,84,06), ::Dynamic(::hx::Anon_obj::Create(2)
             					->setFixed(0,HX_("reason",c4,0f,9d,fc),HX_("urn:xmpp:reporting:spam",b1,09,15,35))
             					->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:reporting:1",49,f0,16,fc))));
-HXLINE( 398)				if (::hx::IsNotNull( spamMessage )) {
-HXLINE( 399)					report1->tag(HX_("stanza-id",73,8a,54,e9), ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE( 509)				if (::hx::IsNotNull( spamMessage )) {
+HXLINE( 510)					report1->tag(HX_("stanza-id",73,8a,54,e9), ::Dynamic(::hx::Anon_obj::Create(3)
             						->setFixed(0,HX_("by",d7,55,00,00),spamMessage->serverIdBy)
             						->setFixed(1,HX_("id",db,5b,00,00),spamMessage->serverId)
             						->setFixed(2,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:sid:0",a8,4b,37,54))))->up();
             				}
             				else {
-HXLINE( 401)					int _g2 = 0;
-HXDLIN( 401)					::Array< ::Dynamic> _g3 = this->invites();
-HXDLIN( 401)					while((_g2 < _g3->length)){
-HXLINE( 401)						 ::borogove::Stanza invite1 = _g3->__get(_g2).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 401)						_g2 = (_g2 + 1);
-HXLINE( 402)						 ::borogove::Stanza stanzaIdEl1 = invite1->getChild(HX_("stanza-id",73,8a,54,e9),HX_("urn:xmpp:sid:0",a8,4b,37,54));
-HXLINE( 403)						if (::hx::IsNotNull( stanzaIdEl1 )) {
-HXLINE( 403)							report1->addChild(stanzaIdEl1);
+HXLINE( 512)					int _g2 = 0;
+HXDLIN( 512)					::Array< ::Dynamic> _g3 = this->invites();
+HXDLIN( 512)					while((_g2 < _g3->length)){
+HXLINE( 512)						 ::borogove::Stanza invite1 = _g3->__get(_g2).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 512)						_g2 = (_g2 + 1);
+HXLINE( 513)						 ::borogove::Stanza stanzaIdEl1 = invite1->getChild(HX_("stanza-id",73,8a,54,e9),HX_("urn:xmpp:sid:0",a8,4b,37,54));
+HXLINE( 514)						if (::hx::IsNotNull( stanzaIdEl1 )) {
+HXLINE( 514)							report1->addChild(stanzaIdEl1);
             						}
             					}
             				}
-HXLINE( 406)				report1->up();
+HXLINE( 517)				report1->up();
             			}
-HXLINE( 408)			this->stream->sendIq(iq3, ::Dynamic(new _hx_Closure_1()));
+HXLINE( 519)			this->stream->sendIq(iq3, ::Dynamic(new _hx_Closure_1()));
             		}
             	}
 
@@ -1078,22 +1166,22 @@ HX_DEFINE_DYNAMIC_FUNC3(Chat_obj,block,(void))
 
 void Chat_obj::unblock(::hx::Null< bool >  __o_onServer){
             		bool onServer = __o_onServer.Default(true);
-            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_415_unblock)
-HXLINE( 416)		this->isBlocked = false;
-HXLINE( 417)		this->uiState = 1;
-HXLINE( 418)		::Dynamic _hx_tmp = this->persistence;
-HXDLIN( 418)		::borogove::Persistence_obj::storeChats(_hx_tmp,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
-HXLINE( 419)		this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
-HXLINE( 420)		if (onServer) {
+            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_526_unblock)
+HXLINE( 527)		this->isBlocked = false;
+HXLINE( 528)		this->uiState = 1;
+HXLINE( 529)		::Dynamic _hx_tmp = this->persistence;
+HXDLIN( 529)		::borogove::Persistence_obj::storeChats(_hx_tmp,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+HXLINE( 530)		this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+HXLINE( 531)		if (onServer) {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             			void _hx_run( ::borogove::Stanza response){
-            				HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_425_unblock)
+            				HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_536_unblock)
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 421)			 ::borogove::GenericStream _hx_tmp1 = this->stream;
-HXLINE( 422)			::String _hx_tmp2 = ::borogove::ID_obj::_hx_short();
-HXLINE( 421)			_hx_tmp1->sendIq( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 532)			 ::borogove::GenericStream _hx_tmp1 = this->stream;
+HXLINE( 533)			::String _hx_tmp2 = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXLINE( 532)			_hx_tmp1->sendIq( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("id",db,5b,00,00),_hx_tmp2)
             				->setFixed(1,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("unblock",54,6c,8d,b1), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:blocking",d1,a1,46,c3))))->tag(HX_("item",13,c5,bf,45), ::Dynamic(::hx::Anon_obj::Create(1)
@@ -1105,14 +1193,14 @@ HXLINE( 421)			_hx_tmp1->sendIq( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("i
 HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,unblock,(void))
 
 void Chat_obj::setNotificationsInternal(bool filtered,bool mention,bool reply){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_432_setNotificationsInternal)
-HXDLIN( 432)		if (filtered) {
-HXLINE( 433)			this->notificationSettings =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_543_setNotificationsInternal)
+HXDLIN( 543)		if (filtered) {
+HXLINE( 544)			this->notificationSettings =  ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("mention",ea,9e,bf,b9),mention)
             				->setFixed(1,HX_("reply",2a,09,c6,e6),reply));
             		}
             		else {
-HXLINE( 435)			this->notificationSettings = null();
+HXLINE( 546)			this->notificationSettings = null();
             		}
             	}
 
@@ -1120,129 +1208,130 @@ HXLINE( 435)			this->notificationSettings = null();
 HX_DEFINE_DYNAMIC_FUNC3(Chat_obj,setNotificationsInternal,(void))
 
 void Chat_obj::setNotifications(bool filtered,bool mention,bool reply){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_442_setNotifications)
-HXLINE( 443)		this->setNotificationsInternal(filtered,mention,reply);
-HXLINE( 444)		::Dynamic _hx_tmp = this->persistence;
-HXDLIN( 444)		::borogove::Persistence_obj::storeChats(_hx_tmp,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
-HXLINE( 445)		this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
-HXLINE( 446)		this->client->updatePushIfEnabled();
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_553_setNotifications)
+HXLINE( 554)		this->setNotificationsInternal(filtered,mention,reply);
+HXLINE( 555)		::Dynamic _hx_tmp = this->persistence;
+HXDLIN( 555)		::borogove::Persistence_obj::storeChats(_hx_tmp,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+HXLINE( 556)		this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+HXLINE( 557)		this->client->updatePushIfEnabled();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC3(Chat_obj,setNotifications,(void))
 
 bool Chat_obj::notificationsFiltered(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_453_notificationsFiltered)
-HXDLIN( 453)		return ::hx::IsNotNull( this->notificationSettings );
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_564_notificationsFiltered)
+HXDLIN( 564)		return ::hx::IsNotNull( this->notificationSettings );
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,notificationsFiltered,return )
 
 bool Chat_obj::notifyMention(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_460_notifyMention)
-HXDLIN( 460)		if (::hx::IsNotNull( this->notificationSettings )) {
-HXDLIN( 460)			return ( (bool)(this->notificationSettings->__Field(HX_("mention",ea,9e,bf,b9),::hx::paccDynamic)) );
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_571_notifyMention)
+HXDLIN( 571)		if (::hx::IsNotNull( this->notificationSettings )) {
+HXDLIN( 571)			return ( (bool)(this->notificationSettings->__Field(HX_("mention",ea,9e,bf,b9),::hx::paccDynamic)) );
             		}
             		else {
-HXDLIN( 460)			return true;
+HXDLIN( 571)			return true;
             		}
-HXDLIN( 460)		return false;
+HXDLIN( 571)		return false;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,notifyMention,return )
 
 bool Chat_obj::notifyReply(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_467_notifyReply)
-HXDLIN( 467)		if (::hx::IsNotNull( this->notificationSettings )) {
-HXDLIN( 467)			return ( (bool)(this->notificationSettings->__Field(HX_("reply",2a,09,c6,e6),::hx::paccDynamic)) );
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_578_notifyReply)
+HXDLIN( 578)		if (::hx::IsNotNull( this->notificationSettings )) {
+HXDLIN( 578)			return ( (bool)(this->notificationSettings->__Field(HX_("reply",2a,09,c6,e6),::hx::paccDynamic)) );
             		}
             		else {
-HXDLIN( 467)			return true;
+HXDLIN( 578)			return true;
             		}
-HXDLIN( 467)		return false;
+HXDLIN( 578)		return false;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,notifyReply,return )
 
-HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,lastMessageId,return )
-
-::String Chat_obj::lastMessageId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_339_lastMessageId__fromC)
-HXDLIN( 339)		return this->lastMessageId();
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,lastMessageId__fromC,return )
-
 void Chat_obj::updateFromBookmark( ::borogove::Stanza item){
-            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_476_updateFromBookmark)
-HXLINE( 477)		this->isBookmarked = true;
-HXLINE( 478)		 ::borogove::Stanza conf = item->getChild(HX_("conference",1c,2b,83,41),HX_("urn:xmpp:bookmarks:1",58,3c,53,7d));
-HXLINE( 479)		::String fn = ( (::String)(::Reflect_obj::field(conf->attr,HX_("name",4b,72,ff,48))) );
-HXLINE( 480)		if (::hx::IsNotNull( fn )) {
-HXLINE( 480)			this->displayName = fn;
-            		}
-HXLINE( 481)		int _hx_tmp;
-HXDLIN( 481)		bool _hx_tmp1;
-HXDLIN( 481)		if ((( (::String)(::Reflect_obj::field(conf->attr,HX_("autojoin",d9,f6,b1,3e))) ) != HX_("1",31,00,00,00))) {
-HXLINE( 481)			_hx_tmp1 = (( (::String)(::Reflect_obj::field(conf->attr,HX_("autojoin",d9,f6,b1,3e))) ) == HX_("true",4e,a7,03,4d));
+            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_582_updateFromBookmark)
+HXLINE( 583)		this->isBookmarked = true;
+HXLINE( 584)		 ::borogove::Stanza conf = item->getChild(HX_("conference",1c,2b,83,41),HX_("urn:xmpp:bookmarks:1",58,3c,53,7d));
+HXLINE( 585)		::String fn = ( (::String)(::Reflect_obj::field(conf->attr,HX_("name",4b,72,ff,48))) );
+HXLINE( 586)		if (::hx::IsNotNull( fn )) {
+HXLINE( 586)			this->displayName = fn;
+            		}
+HXLINE( 587)		int _hx_tmp;
+HXDLIN( 587)		bool _hx_tmp1;
+HXDLIN( 587)		if ((( (::String)(::Reflect_obj::field(conf->attr,HX_("autojoin",d9,f6,b1,3e))) ) != HX_("1",31,00,00,00))) {
+HXLINE( 587)			_hx_tmp1 = (( (::String)(::Reflect_obj::field(conf->attr,HX_("autojoin",d9,f6,b1,3e))) ) == HX_("true",4e,a7,03,4d));
             		}
             		else {
-HXLINE( 481)			_hx_tmp1 = true;
+HXLINE( 587)			_hx_tmp1 = true;
             		}
-HXDLIN( 481)		if (_hx_tmp1) {
-HXLINE( 481)			if ((this->uiState == 0)) {
-HXLINE( 481)				_hx_tmp = 0;
+HXDLIN( 587)		if (_hx_tmp1) {
+HXLINE( 587)			if ((this->uiState == 0)) {
+HXLINE( 587)				_hx_tmp = 0;
             			}
             			else {
-HXLINE( 481)				_hx_tmp = 1;
+HXLINE( 587)				_hx_tmp = 1;
             			}
             		}
             		else {
-HXLINE( 481)			_hx_tmp = 2;
+HXLINE( 587)			_hx_tmp = 2;
             		}
-HXDLIN( 481)		this->uiState = _hx_tmp;
-HXLINE( 482)		 ::borogove::Stanza tmp = conf->getChild(HX_("extensions",14,7c,70,89),null());
-HXDLIN( 482)		 ::borogove::Stanza _hx_tmp2;
-HXDLIN( 482)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 482)			_hx_tmp2 = tmp;
+HXDLIN( 587)		this->uiState = _hx_tmp;
+HXLINE( 588)		 ::borogove::Stanza tmp = conf->getChild(HX_("extensions",14,7c,70,89),null());
+HXDLIN( 588)		 ::borogove::Stanza _hx_tmp2;
+HXDLIN( 588)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 588)			_hx_tmp2 = tmp;
             		}
             		else {
-HXLINE( 482)			_hx_tmp2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("extensions",14,7c,70,89), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 588)			_hx_tmp2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("extensions",14,7c,70,89), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:bookmarks:1",58,3c,53,7d))));
             		}
-HXDLIN( 482)		this->extensions = _hx_tmp2;
+HXDLIN( 588)		this->extensions = _hx_tmp2;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,updateFromBookmark,(void))
 
 void Chat_obj::updateFromRoster( ::Dynamic item){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_486_updateFromRoster)
-HXLINE( 487)		this->isBookmarked = true;
-HXLINE( 488)		bool _hx_tmp;
-HXDLIN( 488)		if (::hx::IsNotEq( item->__Field(HX_("subscription",1d,ff,00,36),::hx::paccDynamic),HX_("both",81,88,1b,41) )) {
-HXLINE( 488)			_hx_tmp = ::hx::IsEq( item->__Field(HX_("subscription",1d,ff,00,36),::hx::paccDynamic),HX_("from",6a,a5,c2,43) );
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_592_updateFromRoster)
+HXLINE( 593)		this->isBookmarked = true;
+HXLINE( 594)		bool _hx_tmp;
+HXDLIN( 594)		if (::hx::IsNotEq( item->__Field(HX_("subscription",1d,ff,00,36),::hx::paccDynamic),HX_("both",81,88,1b,41) )) {
+HXLINE( 594)			_hx_tmp = ::hx::IsEq( item->__Field(HX_("subscription",1d,ff,00,36),::hx::paccDynamic),HX_("from",6a,a5,c2,43) );
             		}
             		else {
-HXLINE( 488)			_hx_tmp = true;
+HXLINE( 594)			_hx_tmp = true;
             		}
-HXDLIN( 488)		this->setTrusted(_hx_tmp);
-HXLINE( 489)		bool _hx_tmp1;
-HXDLIN( 489)		if (::hx::IsNotNull( item->__Field(HX_("fn",48,59,00,00),::hx::paccDynamic) )) {
-HXLINE( 489)			_hx_tmp1 = ::hx::IsNotEq( item->__Field(HX_("fn",48,59,00,00),::hx::paccDynamic),HX_("",00,00,00,00) );
+HXDLIN( 594)		this->setTrusted(_hx_tmp);
+HXLINE( 595)		bool _hx_tmp1;
+HXDLIN( 595)		if (::hx::IsNotNull( item->__Field(HX_("fn",48,59,00,00),::hx::paccDynamic) )) {
+HXLINE( 595)			_hx_tmp1 = ::hx::IsNotEq( item->__Field(HX_("fn",48,59,00,00),::hx::paccDynamic),HX_("",00,00,00,00) );
             		}
             		else {
-HXLINE( 489)			_hx_tmp1 = false;
-            		}
-HXDLIN( 489)		if (_hx_tmp1) {
-HXLINE( 489)			this->displayName = ( (::String)(item->__Field(HX_("fn",48,59,00,00),::hx::paccDynamic)) );
-            		}
-HXLINE( 490)		if ((this->uiState == 3)) {
-HXLINE( 490)			this->uiState = 1;
+HXLINE( 595)			_hx_tmp1 = false;
+            		}
+HXDLIN( 595)		if (_hx_tmp1) {
+HXLINE( 595)			this->displayName = ( (::String)(item->__Field(HX_("fn",48,59,00,00),::hx::paccDynamic)) );
+            		}
+HXLINE( 596)		if ((this->uiState == 3)) {
+HXLINE( 596)			this->uiState = 1;
+            		}
+HXLINE( 597)		this->extensions->removeChildren(HX_("group",3f,b3,f4,99),HX_("jabber:iq:roster",47,76,6e,06));
+HXLINE( 598)		{
+HXLINE( 598)			int _g = 0;
+HXDLIN( 598)			::Array< ::String > _g1 = ( (::Array< ::String >)(item->__Field(HX_("groups",54,24,28,1c),::hx::paccDynamic)) );
+HXDLIN( 598)			while((_g < _g1->length)){
+HXLINE( 598)				::String group = _g1->__get(_g);
+HXDLIN( 598)				_g = (_g + 1);
+HXLINE( 599)				this->extensions->textTag(HX_("group",3f,b3,f4,99),group, ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("jabber:iq:roster",47,76,6e,06))));
+            			}
             		}
             	}
 
@@ -1250,272 +1339,272 @@ HXLINE( 490)			this->uiState = 1;
 HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,updateFromRoster,(void))
 
 ::String Chat_obj::getPhoto(){
-            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_496_getPhoto)
-HXLINE( 497)		bool _hx_tmp;
-HXDLIN( 497)		if (::hx::IsNotNull( this->avatarSha1 )) {
-HXLINE( 497)			_hx_tmp = (::haxe::io::Bytes_obj::ofData(this->avatarSha1)->length < 1);
+            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_606_getPhoto)
+HXLINE( 607)		bool _hx_tmp;
+HXDLIN( 607)		if (::hx::IsNotNull( this->avatarSha1 )) {
+HXLINE( 607)			_hx_tmp = (::haxe::io::Bytes_obj::ofData(this->avatarSha1)->length < 1);
             		}
             		else {
-HXLINE( 497)			_hx_tmp = true;
+HXLINE( 607)			_hx_tmp = true;
             		}
-HXDLIN( 497)		if (_hx_tmp) {
-HXLINE( 497)			return null();
+HXDLIN( 607)		if (_hx_tmp) {
+HXLINE( 607)			return null();
             		}
-HXLINE( 498)		return  ::borogove::Hash_obj::__alloc( HX_CTX ,HX_("sha-1",90,a8,1c,7c),this->avatarSha1)->toUri();
+HXLINE( 608)		return  ::borogove::Hash_obj::__alloc( HX_CTX ,HX_("sha-1",90,a8,1c,7c),this->avatarSha1)->toUri();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,getPhoto,return )
 
 ::String Chat_obj::getPlaceholder(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_505_getPlaceholder)
-HXDLIN( 505)		::String _hx_tmp = this->chatId;
-HXDLIN( 505)		return ::borogove::Color_obj::defaultPhoto(_hx_tmp,this->getDisplayName().charAt(0).toUpperCase());
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_615_getPlaceholder)
+HXDLIN( 615)		::String _hx_tmp = this->chatId;
+HXDLIN( 615)		return ::borogove::Color_obj::defaultPhoto(_hx_tmp,this->getDisplayName().charAt(0).toUpperCase());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,getPlaceholder,return )
 
-::String Chat_obj::readUpTo(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_512_readUpTo)
-HXDLIN( 512)		return this->readUpToId;
+::Dynamic Chat_obj::readUpTo(){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            		 ::borogove::ChatMessage _hx_run( ::borogove::ChatMessage m){
+            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_624_readUpTo)
+HXLINE( 627)			 ::Dynamic _hx_tmp;
+HXDLIN( 627)			if (::hx::IsNotNull( m )) {
+HXLINE( 627)				_hx_tmp = m->type;
+            			}
+            			else {
+HXLINE( 627)				_hx_tmp = null();
+            			}
+HXDLIN( 627)			if (::hx::IsEq( _hx_tmp,3 )) {
+HXLINE( 627)				return null();
+            			}
+HXLINE( 629)			return m;
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_621_readUpTo)
+HXLINE( 622)		if (::hx::IsNull( this->readUpToId )) {
+HXLINE( 622)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            		}
+HXLINE( 624)		::Dynamic _hx_tmp = this->persistence;
+HXDLIN( 624)		::String _hx_tmp1 = this->client->accountId();
+HXDLIN( 624)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessage(_hx_tmp,_hx_tmp1,this->chatId,this->readUpToId,null()), ::Dynamic(new _hx_Closure_0()),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,readUpTo,return )
 
+void Chat_obj::readUpTo__fromC(::cpp::Function< void  (void*,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_readUpTo__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->readUpTo();
+            		}
+            		else {
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::borogove::ChatMessage v){
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_readUpTo__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            					}
+            					else {
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            					}
+            				}
+HXLINE( 365)				handler1(ptr,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::Dynamic e){
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_readUpTo__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->readUpTo(), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+            		}
+            	}
+
+
 int Chat_obj::unreadCount(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_519_unreadCount)
-HXDLIN( 519)		return this->_unreadCount;
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_637_unreadCount)
+HXDLIN( 637)		return this->_unreadCount;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,unreadCount,return )
 
 void Chat_obj::setUnreadCount(int count){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_524_setUnreadCount)
-HXDLIN( 524)		this->_unreadCount = count;
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_642_setUnreadCount)
+HXDLIN( 642)		this->_unreadCount = count;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,setUnreadCount,(void))
 
 ::String Chat_obj::preview(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_530_preview)
-HXLINE( 531)		if (::hx::IsNull( this->lastMessage )) {
-HXLINE( 531)			return HX_("",00,00,00,00);
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_648_preview)
+HXLINE( 649)		if (::hx::IsNull( this->lastMessage )) {
+HXLINE( 649)			return HX_("",00,00,00,00);
             		}
-HXLINE( 533)		if ((this->lastMessage->type == 1)) {
-HXLINE( 535)			if (this->lastMessage->isIncoming()) {
-HXLINE( 535)				return HX_("Incoming Call",18,e2,4d,47);
+HXLINE( 651)		if ((this->lastMessage->type == 1)) {
+HXLINE( 653)			if (this->lastMessage->isIncoming()) {
+HXLINE( 653)				return HX_("Incoming Call",18,e2,4d,47);
             			}
             			else {
-HXLINE( 535)				return HX_("Outgoing Call",d2,04,61,e8);
+HXLINE( 653)				return HX_("Outgoing Call",d2,04,61,e8);
             			}
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             			bool _hx_run(::String line){
-            				HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_537_preview)
-HXLINE( 537)				return !( ::EReg_obj::__alloc( HX_CTX ,HX_("(^[ \n]*$)|(^>)",bc,88,8d,c7),HX_("",00,00,00,00))->match(line));
+            				HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_656_preview)
+HXLINE( 656)				return !( ::EReg_obj::__alloc( HX_CTX ,HX_("(^[ \n]*$)|(^>)",bc,88,8d,c7),HX_("",00,00,00,00))->match(line));
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 537)			return ( (::String)(::Lambda_obj::find(this->lastMessage->text.split(HX_("\n",0a,00,00,00)), ::Dynamic(new _hx_Closure_0()))) );
+HXLINE( 655)			::String txt;
+HXDLIN( 655)			::String tmp = this->lastMessage->body(null())->toPlainText();
+HXDLIN( 655)			if (::hx::IsNotNull( tmp )) {
+HXLINE( 655)				txt = tmp;
+            			}
+            			else {
+HXLINE( 655)				txt = HX_("",00,00,00,00);
+            			}
+HXLINE( 656)			::String tmp1 = ( (::String)(::Lambda_obj::find(txt.split(HX_("\n",0a,00,00,00)), ::Dynamic(new _hx_Closure_0()))) );
+HXDLIN( 656)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 656)				return tmp1;
+            			}
+            			else {
+HXLINE( 656)				return txt;
+            			}
             		}
-HXLINE( 533)		return null();
+HXLINE( 651)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,preview,return )
 
-void Chat_obj::setLastMessage( ::borogove::ChatMessage message){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_543_setLastMessage)
-HXDLIN( 543)		this->lastMessage = message;
+::Dynamic Chat_obj::setLastMessage( ::borogove::ChatMessage message){
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_661_setLastMessage)
+HXLINE( 662)		this->lastMessage = message;
+HXLINE( 663)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,setLastMessage,(void))
+HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,setLastMessage,return )
 
 void Chat_obj::setDisplayName(::String displayName){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_551_setDisplayName)
-HXLINE( 552)		this->displayName = displayName;
-HXLINE( 553)		this->bookmark();
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_671_setDisplayName)
+HXLINE( 672)		this->displayName = displayName;
+HXLINE( 673)		this->bookmark();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,setDisplayName,(void))
 
 ::String Chat_obj::getDisplayName(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_559_getDisplayName)
-HXLINE( 560)		if ((this->displayName == this->chatId)) {
-HXLINE( 561)			::String _hx_tmp = this->chatId;
-HXDLIN( 561)			if ((_hx_tmp == this->client->accountId())) {
-HXLINE( 561)				return this->client->displayName();
-            			}
-HXLINE( 563)			::Array< ::String > participants = this->getParticipants();
-HXLINE( 564)			bool _hx_tmp1;
-HXDLIN( 564)			if ((participants->length > 2)) {
-HXLINE( 564)				_hx_tmp1 = (participants->length < 20);
-            			}
-            			else {
-HXLINE( 564)				_hx_tmp1 = false;
-            			}
-HXDLIN( 564)			if (_hx_tmp1) {
-HXLINE( 565)				::Array< ::String > result = ::Array_obj< ::String >::__new(participants->length);
-HXDLIN( 565)				{
-HXLINE( 565)					int _g = 0;
-HXDLIN( 565)					int _g1 = participants->length;
-HXDLIN( 565)					while((_g < _g1)){
-HXLINE( 565)						_g = (_g + 1);
-HXDLIN( 565)						int i = (_g - 1);
-HXDLIN( 565)						{
-HXLINE( 565)							::String id = ( (::String)(_hx_array_unsafe_get(participants,i)) );
-HXLINE( 566)							 ::borogove::Participant p;
-HXDLIN( 566)							if ((id == this->chatId)) {
-HXLINE( 566)								p = null();
-            							}
-            							else {
-HXLINE( 566)								p = this->getParticipantDetails(id);
-            							}
-HXLINE( 565)							::String inValue;
-HXLINE( 567)							bool inValue1;
-HXDLIN( 567)							if (::hx::IsNotNull( p )) {
-HXLINE( 567)								inValue1 = p->isSelf;
-            							}
-            							else {
-HXLINE( 567)								inValue1 = true;
-            							}
-HXDLIN( 567)							if (inValue1) {
-HXLINE( 565)								inValue = null();
-            							}
-            							else {
-HXLINE( 565)								inValue = p->displayName;
-            							}
-HXDLIN( 565)							result->__unsafe_set(i,inValue);
-            						}
-            					}
-            				}
-HXDLIN( 565)				::Array< ::String > _g2 = ::Array_obj< ::String >::__new(0);
-HXDLIN( 565)				{
-HXLINE( 565)					int _g3 = 0;
-HXDLIN( 565)					while((_g3 < result->length)){
-HXLINE( 565)						::String v = result->__get(_g3);
-HXDLIN( 565)						_g3 = (_g3 + 1);
-HXDLIN( 565)						if (::hx::IsNotNull( v )) {
-HXLINE( 565)							_g2->push(v);
-            						}
-            					}
-            				}
-HXDLIN( 565)				return _g2->join(HX_(", ",74,26,00,00));
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_679_getDisplayName)
+HXLINE( 680)		if ((this->displayName == this->chatId)) {
+HXLINE( 681)			::String _hx_tmp = this->chatId;
+HXDLIN( 681)			if ((_hx_tmp == this->client->accountId())) {
+HXLINE( 681)				return this->client->displayName();
             			}
             		}
             		else {
-HXLINE( 570)			if ((this->uiState == 3)) {
-HXLINE( 571)				return ((((HX_("",00,00,00,00) + this->displayName) + HX_(" (",08,1c,00,00)) + this->chatId) + HX_(")",29,00,00,00));
+HXLINE( 682)			if ((this->uiState == 3)) {
+HXLINE( 683)				return ((((HX_("",00,00,00,00) + this->displayName) + HX_(" (",08,1c,00,00)) + this->chatId) + HX_(")",29,00,00,00));
             			}
             		}
-HXLINE( 574)		return this->displayName;
+HXLINE( 686)		return this->displayName;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,getDisplayName,return )
 
-void Chat_obj::setPresence(::String resource, ::borogove::Presence presence){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_579_setPresence)
-HXDLIN( 579)		this->presence->set(resource,presence);
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,setPresence,(void))
-
-void Chat_obj::setCaps(::String resource, ::borogove::Caps caps){
-            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_583_setCaps)
-HXLINE( 584)		 ::borogove::Presence presence = ( ( ::borogove::Presence)(this->presence->get(resource)) );
-HXLINE( 585)		if (::hx::IsNotNull( presence )) {
-HXLINE( 586)			presence->caps = caps;
-HXLINE( 587)			this->setPresence(resource,presence);
-            		}
-            		else {
-HXLINE( 589)			this->setPresence(resource, ::borogove::Presence_obj::__alloc( HX_CTX ,caps,null(),null()));
+::Array< ::String > Chat_obj::getTags(){
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_693_getTags)
+HXDLIN( 693)		::Array< ::Dynamic> _this = this->extensions->allTags(HX_("group",3f,b3,f4,99),HX_("jabber:iq:roster",47,76,6e,06));
+HXDLIN( 693)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN( 693)		{
+HXDLIN( 693)			int _g = 0;
+HXDLIN( 693)			int _g1 = _this->length;
+HXDLIN( 693)			while((_g < _g1)){
+HXDLIN( 693)				_g = (_g + 1);
+HXDLIN( 693)				int i = (_g - 1);
+HXDLIN( 693)				{
+HXDLIN( 693)					::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
+HXDLIN( 693)					result->__unsafe_set(i,inValue);
+            				}
+            			}
             		}
+HXDLIN( 693)		return result;
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,setCaps,(void))
+HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,getTags,return )
 
-void Chat_obj::removePresence(::String resource){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_595_removePresence)
-HXDLIN( 595)		this->presence->remove(resource);
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,removePresence,(void))
-
- ::Dynamic Chat_obj::getCaps(){
-            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,iter) HXARGC(0)
-            		 ::Dynamic _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_603_getCaps)
-HXLINE( 604)			 ::Dynamic n = iter->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
-HXLINE( 605)			return  ::Dynamic(::hx::Anon_obj::Create(2)
-            				->setFixed(0,HX_("key",9f,89,51,00), ::Dynamic(n->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic)))
-            				->setFixed(1,HX_("value",71,7f,b8,31),( ( ::borogove::Presence)(n->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)) )->caps));
+size_t Chat_obj::getTags__fromC(const char*** outPtr){
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_363_getTags__fromC)
+HXDLIN( 363)		::Array< ::String > out = this->getTags();
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(out));
             		}
-            		HX_END_LOCAL_FUNC0(return)
-
-            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_599_getCaps)
-HXLINE( 600)		 ::Dynamic iter =  ::haxe::iterators::MapKeyValueIterator_obj::__alloc( HX_CTX ,this->presence);
-HXLINE( 601)		return  ::Dynamic(::hx::Anon_obj::Create(2)
-            			->setFixed(0,HX_("hasNext",6d,a5,46,18), ::Dynamic(iter->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)))
-            			->setFixed(1,HX_("next",f3,84,02,49), ::Dynamic(new _hx_Closure_0(iter))));
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,getCaps,return )
-
- ::borogove::Caps Chat_obj::getResourceCaps(::String resource){
-            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_612_getResourceCaps)
-HXDLIN( 612)		 ::borogove::Presence tmp = ( ( ::borogove::Presence)(this->presence->get(resource)) );
-HXDLIN( 612)		 ::borogove::Caps tmp1;
-HXDLIN( 612)		if (::hx::IsNotNull( tmp )) {
-HXDLIN( 612)			tmp1 = tmp->caps;
-            		}
-            		else {
-HXDLIN( 612)			tmp1 = null();
-            		}
-HXDLIN( 612)		if (::hx::IsNotNull( tmp1 )) {
-HXDLIN( 612)			return tmp1;
+void Chat_obj::setThreadSubject(::String threadId,::String subject){
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_698_setThreadSubject)
+HXDLIN( 698)		::String _hx_tmp;
+HXDLIN( 698)		if (::hx::IsNull( threadId )) {
+HXDLIN( 698)			_hx_tmp = ::borogove::_Chat::Chat_Fields__obj::nullSentinel;
             		}
             		else {
-HXDLIN( 612)			return  ::borogove::Caps_obj::__alloc( HX_CTX ,HX_("",00,00,00,00),::Array_obj< ::Dynamic>::__new(0),::Array_obj< ::String >::__new(0),::Array_obj< ::Dynamic>::__new(0),null());
+HXDLIN( 698)			_hx_tmp = threadId;
             		}
-HXDLIN( 612)		return null();
+HXDLIN( 698)		this->threads->set(_hx_tmp,subject);
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,getResourceCaps,return )
+HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,setThreadSubject,(void))
+
+HX_DEFINE_DYNAMIC_FUNC3(Chat_obj,setPresence,(void))
+
+HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,getCaps,return )
 
 void Chat_obj::setAvatarSha1(::Array< unsigned char > sha1){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_617_setAvatarSha1)
-HXDLIN( 617)		this->avatarSha1 = sha1;
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_709_setAvatarSha1)
+HXDLIN( 709)		this->avatarSha1 = sha1;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,setAvatarSha1,(void))
 
 void Chat_obj::setTrusted(bool trusted){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_625_setTrusted)
-HXLINE( 626)		this->trusted = trusted;
-HXLINE( 627)		bool _hx_tmp;
-HXDLIN( 627)		if (trusted) {
-HXLINE( 627)			_hx_tmp = (this->uiState == 3);
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_717_setTrusted)
+HXLINE( 718)		this->trusted = trusted;
+HXLINE( 719)		bool _hx_tmp;
+HXDLIN( 719)		if (trusted) {
+HXLINE( 719)			_hx_tmp = (this->uiState == 3);
             		}
             		else {
-HXLINE( 627)			_hx_tmp = false;
+HXLINE( 719)			_hx_tmp = false;
             		}
-HXDLIN( 627)		if (_hx_tmp) {
-HXLINE( 628)			this->uiState = 1;
-HXLINE( 629)			this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+HXDLIN( 719)		if (_hx_tmp) {
+HXLINE( 720)			this->uiState = 1;
+HXLINE( 721)			this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
             		}
             	}
 
@@ -1523,152 +1612,136 @@ HXLINE( 629)			this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::Virt
 HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,setTrusted,(void))
 
 bool Chat_obj::isTrusted(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_637_isTrusted)
-HXDLIN( 637)		if (!(this->trusted)) {
-HXDLIN( 637)			::String _hx_tmp = this->chatId;
-HXDLIN( 637)			return (_hx_tmp == this->client->accountId());
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_729_isTrusted)
+HXDLIN( 729)		if (!(this->trusted)) {
+HXDLIN( 729)			::String _hx_tmp = this->chatId;
+HXDLIN( 729)			return (_hx_tmp == this->client->accountId());
             		}
             		else {
-HXDLIN( 637)			return true;
+HXDLIN( 729)			return true;
             		}
-HXDLIN( 637)		return false;
+HXDLIN( 729)		return false;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,isTrusted,return )
 
 bool Chat_obj::livePresence(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_642_livePresence)
-HXDLIN( 642)		return true;
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_734_livePresence)
+HXDLIN( 734)		return true;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,livePresence,return )
 
 bool Chat_obj::syncing(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_649_syncing)
-HXDLIN( 649)		return !(this->client->inSync);
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_741_syncing)
+HXDLIN( 741)		return !(this->client->inSync);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,syncing,return )
 
 bool Chat_obj::canAudioCall(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_655_canAudioCall)
-HXLINE( 657)		{
-HXLINE( 657)			::Dynamic this1 = this->presence;
-HXDLIN( 657)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this1);
-HXDLIN( 657)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 658)				bool _hx_tmp;
-HXDLIN( 658)				 ::borogove::Caps tmp = ( ( ::borogove::Presence)(::haxe::IMap_obj::get(this1,_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)())) )->caps;
-HXDLIN( 658)				::Array< ::String > tmp1;
-HXDLIN( 658)				if (::hx::IsNotNull( tmp )) {
-HXLINE( 658)					tmp1 = tmp->features;
-            				}
-            				else {
-HXLINE( 658)					tmp1 = null();
-            				}
-HXDLIN( 658)				 ::Dynamic tmp2;
-HXDLIN( 658)				if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 658)					tmp2 = tmp1->contains(HX_("urn:xmpp:jingle:apps:rtp:audio",0f,8b,54,6c));
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_747_canAudioCall)
+HXLINE( 749)		{
+HXLINE( 749)			 ::Dynamic _g = this->getCaps();
+HXDLIN( 749)			while(( (bool)(_g->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 750)				bool _hx_tmp;
+HXDLIN( 750)				::Array< ::String > tmp = ( ( ::borogove::Caps)(_g->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)) )->features;
+HXDLIN( 750)				 ::Dynamic tmp1;
+HXDLIN( 750)				if (::hx::IsNotNull( tmp )) {
+HXLINE( 750)					tmp1 = tmp->contains(HX_("urn:xmpp:jingle:apps:rtp:audio",0f,8b,54,6c));
             				}
             				else {
-HXLINE( 658)					tmp2 = null();
+HXLINE( 750)					tmp1 = null();
             				}
-HXDLIN( 658)				if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 658)					_hx_tmp = ( (bool)(tmp2) );
+HXDLIN( 750)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 750)					_hx_tmp = ( (bool)(tmp1) );
             				}
             				else {
-HXLINE( 658)					_hx_tmp = false;
+HXLINE( 750)					_hx_tmp = false;
             				}
-HXDLIN( 658)				if (_hx_tmp) {
-HXLINE( 658)					return true;
+HXDLIN( 750)				if (_hx_tmp) {
+HXLINE( 750)					return true;
             				}
             			}
             		}
-HXLINE( 661)		return false;
+HXLINE( 753)		return false;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,canAudioCall,return )
 
 bool Chat_obj::canVideoCall(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_667_canVideoCall)
-HXLINE( 669)		{
-HXLINE( 669)			::Dynamic this1 = this->presence;
-HXDLIN( 669)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this1);
-HXDLIN( 669)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 670)				bool _hx_tmp;
-HXDLIN( 670)				 ::borogove::Caps tmp = ( ( ::borogove::Presence)(::haxe::IMap_obj::get(this1,_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)())) )->caps;
-HXDLIN( 670)				::Array< ::String > tmp1;
-HXDLIN( 670)				if (::hx::IsNotNull( tmp )) {
-HXLINE( 670)					tmp1 = tmp->features;
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_759_canVideoCall)
+HXLINE( 761)		{
+HXLINE( 761)			 ::Dynamic _g = this->getCaps();
+HXDLIN( 761)			while(( (bool)(_g->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 762)				bool _hx_tmp;
+HXDLIN( 762)				::Array< ::String > tmp = ( ( ::borogove::Caps)(_g->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)) )->features;
+HXDLIN( 762)				 ::Dynamic tmp1;
+HXDLIN( 762)				if (::hx::IsNotNull( tmp )) {
+HXLINE( 762)					tmp1 = tmp->contains(HX_("urn:xmpp:jingle:apps:rtp:video",b4,26,d0,7b));
             				}
             				else {
-HXLINE( 670)					tmp1 = null();
+HXLINE( 762)					tmp1 = null();
             				}
-HXDLIN( 670)				 ::Dynamic tmp2;
-HXDLIN( 670)				if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 670)					tmp2 = tmp1->contains(HX_("urn:xmpp:jingle:apps:rtp:video",b4,26,d0,7b));
+HXDLIN( 762)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 762)					_hx_tmp = ( (bool)(tmp1) );
             				}
             				else {
-HXLINE( 670)					tmp2 = null();
-            				}
-HXDLIN( 670)				if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 670)					_hx_tmp = ( (bool)(tmp2) );
+HXLINE( 762)					_hx_tmp = false;
             				}
-            				else {
-HXLINE( 670)					_hx_tmp = false;
-            				}
-HXDLIN( 670)				if (_hx_tmp) {
-HXLINE( 670)					return true;
+HXDLIN( 762)				if (_hx_tmp) {
+HXLINE( 762)					return true;
             				}
             			}
             		}
-HXLINE( 673)		return false;
+HXLINE( 765)		return false;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,canVideoCall,return )
 
 ::Dynamic Chat_obj::startCall(bool audio,bool video){
-            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_683_startCall)
-HXLINE( 684)		if ((this->uiState == 3)) {
-HXLINE( 684)			this->uiState = 1;
+            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_775_startCall)
+HXLINE( 776)		if ((this->uiState == 3)) {
+HXLINE( 776)			this->uiState = 1;
             		}
-HXLINE( 685)		 ::borogove::Client session = this->client;
-HXDLIN( 685)		 ::borogove::calls::OutgoingProposedSession session1 =  ::borogove::calls::OutgoingProposedSession_obj::__alloc( HX_CTX ,session,::borogove::JID_obj::parse(this->chatId));
-HXLINE( 686)		{
-HXLINE( 686)			::Dynamic this1 = this->jingleSessions;
-HXDLIN( 686)			( ( ::haxe::ds::StringMap)(this1) )->set(session1->get_sid(),session1);
+HXLINE( 777)		 ::borogove::Client session = this->client;
+HXDLIN( 777)		 ::borogove::calls::OutgoingProposedSession session1 =  ::borogove::calls::OutgoingProposedSession_obj::__alloc( HX_CTX ,session,::borogove::JID_obj::parse(this->chatId));
+HXLINE( 778)		{
+HXLINE( 778)			::Dynamic this1 = this->jingleSessions;
+HXDLIN( 778)			( ( ::haxe::ds::StringMap)(this1) )->set(session1->get_sid(),session1);
             		}
-HXLINE( 687)		session1->propose(audio,video);
-HXLINE( 688)		return session1;
+HXLINE( 779)		session1->propose(audio,video);
+HXLINE( 780)		return session1;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,startCall,return )
 
 void Chat_obj::addMedia(::Array< ::Dynamic> streams){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_692_addMedia)
-HXLINE( 693)		if ((this->callStatus() != 4)) {
-HXLINE( 693)			HX_STACK_DO_THROW(HX_("cannot add media when no call ongoing",6a,0b,2b,6e));
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_789_addMedia)
+HXLINE( 790)		if ((this->callStatus() != 4)) {
+HXLINE( 790)			HX_STACK_DO_THROW(HX_("cannot add media when no call ongoing",6a,0b,2b,6e));
             		}
-HXLINE( 694)		::borogove::calls::Session_obj::addMedia(this->jingleSessions->iterator()->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)(),streams);
+HXLINE( 791)		::borogove::calls::Session_obj::addMedia(this->jingleSessions->iterator()->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)(),streams);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,addMedia,(void))
 
 void Chat_obj::acceptCall(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_700_acceptCall)
-HXLINE( 701)		if ((this->uiState == 3)) {
-HXLINE( 701)			this->uiState = 1;
-            		}
-HXLINE( 702)		{
-HXLINE( 702)			 ::Dynamic session = this->jingleSessions->iterator();
-HXDLIN( 702)			while(( (bool)(session->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 703)				::borogove::calls::Session_obj::accept(session->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_797_acceptCall)
+HXLINE( 798)		if ((this->uiState == 3)) {
+HXLINE( 798)			this->uiState = 1;
+            		}
+HXLINE( 799)		{
+HXLINE( 799)			 ::Dynamic session = this->jingleSessions->iterator();
+HXDLIN( 799)			while(( (bool)(session->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 800)				::borogove::calls::Session_obj::accept(session->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
             			}
             		}
             	}
@@ -1677,14 +1750,14 @@ HXLINE( 703)				::borogove::calls::Session_obj::accept(session->__Field(HX_("nex
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,acceptCall,(void))
 
 void Chat_obj::hangup(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_711_hangup)
-HXDLIN( 711)		 ::Dynamic session = this->jingleSessions->iterator();
-HXDLIN( 711)		while(( (bool)(session->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXDLIN( 711)			::Dynamic session1 = session->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
-HXLINE( 712)			::borogove::calls::Session_obj::hangup(session1);
-HXLINE( 713)			{
-HXLINE( 713)				::Dynamic this1 = this->jingleSessions;
-HXDLIN( 713)				( ( ::haxe::ds::StringMap)(this1) )->remove(::borogove::calls::Session_obj::get_sid(session1));
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_808_hangup)
+HXDLIN( 808)		 ::Dynamic session = this->jingleSessions->iterator();
+HXDLIN( 808)		while(( (bool)(session->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXDLIN( 808)			::Dynamic session1 = session->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
+HXLINE( 809)			::borogove::calls::Session_obj::hangup(session1);
+HXLINE( 810)			{
+HXLINE( 810)				::Dynamic this1 = this->jingleSessions;
+HXDLIN( 810)				( ( ::haxe::ds::StringMap)(this1) )->remove(::borogove::calls::Session_obj::get_sid(session1));
             			}
             		}
             	}
@@ -1693,234 +1766,204 @@ HXDLIN( 713)				( ( ::haxe::ds::StringMap)(this1) )->remove(::borogove::calls::S
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,hangup,(void))
 
 int Chat_obj::callStatus(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_720_callStatus)
-HXLINE( 721)		{
-HXLINE( 721)			 ::Dynamic session = this->jingleSessions->iterator();
-HXDLIN( 721)			while(( (bool)(session->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 722)				return ::borogove::calls::Session_obj::callStatus(session->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_817_callStatus)
+HXLINE( 818)		{
+HXLINE( 818)			 ::Dynamic session = this->jingleSessions->iterator();
+HXDLIN( 818)			while(( (bool)(session->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 819)				return ::borogove::calls::Session_obj::callStatus(session->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
             			}
             		}
-HXLINE( 725)		return 0;
+HXLINE( 822)		return 0;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,callStatus,return )
 
  ::borogove::calls::DTMFSender Chat_obj::dtmf(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_731_dtmf)
-HXLINE( 732)		{
-HXLINE( 732)			 ::Dynamic session = this->jingleSessions->iterator();
-HXDLIN( 732)			while(( (bool)(session->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 733)				 ::borogove::calls::DTMFSender dtmf = ::borogove::calls::Session_obj::dtmf(session->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
-HXLINE( 734)				if (::hx::IsNotNull( dtmf )) {
-HXLINE( 734)					return dtmf;
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_828_dtmf)
+HXLINE( 829)		{
+HXLINE( 829)			 ::Dynamic session = this->jingleSessions->iterator();
+HXDLIN( 829)			while(( (bool)(session->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 830)				 ::borogove::calls::DTMFSender dtmf = ::borogove::calls::Session_obj::dtmf(session->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+HXLINE( 831)				if (::hx::IsNotNull( dtmf )) {
+HXLINE( 831)					return dtmf;
             				}
             			}
             		}
-HXLINE( 737)		return null();
+HXLINE( 834)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,dtmf,return )
 
 ::Array< ::Dynamic> Chat_obj::videoTracks(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_744_videoTracks)
-HXDLIN( 744)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 744)		{
-HXDLIN( 744)			 ::Dynamic x = this->jingleSessions->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 744)			while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXDLIN( 744)				_g->push(::borogove::calls::Session_obj::videoTracks(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()));
-            			}
-            		}
-HXDLIN( 744)		::Array< ::Dynamic> _g1 = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 744)		{
-HXDLIN( 744)			 ::Dynamic e = _g->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 744)			while(( (bool)(e->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXDLIN( 744)				 ::Dynamic x1 = e->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 744)				while(( (bool)(x1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXDLIN( 744)					_g1->push(x1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_841_videoTracks)
+HXDLIN( 841)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 841)		{
+HXDLIN( 841)			 ::Dynamic x = this->jingleSessions->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 841)			while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXDLIN( 841)				_g->push(::borogove::calls::Session_obj::videoTracks(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()));
+            			}
+            		}
+HXDLIN( 841)		::Array< ::Dynamic> _g1 = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 841)		{
+HXDLIN( 841)			 ::Dynamic e = _g->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 841)			while(( (bool)(e->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXDLIN( 841)				 ::Dynamic x1 = e->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 841)				while(( (bool)(x1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXDLIN( 841)					_g1->push(x1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
             				}
             			}
             		}
-HXDLIN( 744)		return _g1;
+HXDLIN( 841)		return _g1;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,videoTracks,return )
 
 size_t Chat_obj::videoTracks__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_335_videoTracks__fromC)
-HXDLIN( 335)		::Array< ::Dynamic> out = this->videoTracks();
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g = 0;
-HXDLIN( 335)				while((_g < out->length)){
-HXDLIN( 335)					 ::borogove::calls::MediaStreamTrack el = out->__get(_g).StaticCast<  ::borogove::calls::MediaStreamTrack >();
-HXDLIN( 335)					_g = (_g + 1);
-HXDLIN( 335)					{
-HXDLIN( 335)						 ::Dynamic haxeObject = el;
-HXDLIN( 335)						void* ptr = haxeObject.mPtr;
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXDLIN( 335)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)out->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXDLIN( 335)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),out));
-HXDLIN( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_363_videoTracks__fromC)
+HXDLIN( 363)		::Array< ::Dynamic> out = this->videoTracks();
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
 ::String Chat_obj::encryptionMode(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_751_encryptionMode)
-HXDLIN( 751)		switch((int)(this->_encryptionMode)){
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_848_encryptionMode)
+HXDLIN( 848)		switch((int)(this->_encryptionMode)){
             			case (int)0: {
-HXLINE( 753)				return HX_("unencrypted",8b,80,ea,f1);
+HXLINE( 850)				return HX_("unencrypted",8b,80,ea,f1);
             			}
             			break;
             			case (int)1: {
-HXLINE( 755)				return HX_("omemo",a9,a8,d3,31);
+HXLINE( 852)				return HX_("omemo",a9,a8,d3,31);
             			}
             			break;
             		}
-HXLINE( 751)		return null();
+HXLINE( 848)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,encryptionMode,return )
 
 bool Chat_obj::canSend(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_763_canSend)
-HXDLIN( 763)		return (::borogove::Caps_obj::withFeature(this->getCaps(),HX_("urn:xmpp:noreply:0",a3,10,eb,d5))->length < 1);
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_860_canSend)
+HXDLIN( 860)		return !(( (bool)(::borogove::Caps_obj::withFeature(this->getCaps(),HX_("urn:xmpp:noreply:0",a3,10,eb,d5))->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) ));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,canSend,return )
 
+bool Chat_obj::canModerate(){
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_867_canModerate)
+HXDLIN( 867)		return false;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,canModerate,return )
+
 void Chat_obj::invite( ::borogove::Chat other,::String threadId){
-            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_769_invite)
-HXLINE( 770)		 ::Dynamic attr =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_873_invite)
+HXLINE( 874)		 ::Dynamic attr =  ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("jid",c5,ca,50,00),this->chatId)
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("jabber:x:conference",b4,78,c2,fc)));
-HXLINE( 774)		if (::hx::IsNotNull( threadId )) {
-HXLINE( 775)			::Reflect_obj::setField(attr,HX_("continue",67,e0,c8,31),HX_("true",4e,a7,03,4d));
-HXLINE( 776)			::Reflect_obj::setField(attr,HX_("thread",ca,7a,b9,8e),threadId);
+HXLINE( 878)		if (::hx::IsNotNull( threadId )) {
+HXLINE( 879)			::Reflect_obj::setField(attr,HX_("continue",67,e0,c8,31),HX_("true",4e,a7,03,4d));
+HXLINE( 880)			::Reflect_obj::setField(attr,HX_("thread",ca,7a,b9,8e),threadId);
             		}
-HXLINE( 778)		other->sendMessageStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a),null())->tag(HX_("x",78,00,00,00),attr)->up(),null());
+HXLINE( 882)		other->sendMessageStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a),null())->tag(HX_("x",78,00,00,00),attr)->up(),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,invite,(void))
 
 bool Chat_obj::canInvite(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_787_canInvite)
-HXDLIN( 787)		return false;
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_891_canInvite)
+HXDLIN( 891)		return false;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,canInvite,return )
 
 bool Chat_obj::isApp(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_793_isApp)
-HXLINE( 794)		if ((::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_897_isApp)
+HXLINE( 898)		if ((::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("iterator",ee,49,9a,93),this->getCaps_dyn())))->get_length() < 1)) {
-HXLINE( 796)			if ((this->chatId.indexOf(HX_("@",40,00,00,00),null()) < 0)) {
-HXLINE( 796)				return this->hasCommands();
+HXLINE( 900)			if ((this->chatId.indexOf(HX_("@",40,00,00,00),null()) < 0)) {
+HXLINE( 900)				return this->hasCommands();
             			}
             			else {
-HXLINE( 796)				return false;
+HXLINE( 900)				return false;
             			}
             		}
-HXLINE( 799)		bool bot = (::borogove::Caps_obj::withIdentity(this->getCaps(),HX_("client",4b,ca,4f,0a),HX_("bot",07,be,4a,00))->length > 0);
-HXLINE( 800)		bool client = (::borogove::Caps_obj::withIdentity(this->getCaps(),HX_("client",4b,ca,4f,0a),null())->length > 0);
-HXLINE( 801)		bool account = (::borogove::Caps_obj::withIdentity(this->getCaps(),HX_("account",ad,fc,59,a1),null())->length > 0);
-HXLINE( 803)		bool _hx_tmp;
-HXDLIN( 803)		bool _hx_tmp1;
-HXDLIN( 803)		if (!(client)) {
-HXLINE( 803)			_hx_tmp1 = account;
+HXLINE( 903)		bool bot = ( (bool)(::borogove::Caps_obj::withIdentity(this->getCaps(),HX_("client",4b,ca,4f,0a),HX_("bot",07,be,4a,00))->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) );
+HXLINE( 904)		bool client = ( (bool)(::borogove::Caps_obj::withIdentity(this->getCaps(),HX_("client",4b,ca,4f,0a),null())->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) );
+HXLINE( 905)		bool account = ( (bool)(::borogove::Caps_obj::withIdentity(this->getCaps(),HX_("account",ad,fc,59,a1),null())->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) );
+HXLINE( 907)		bool _hx_tmp;
+HXDLIN( 907)		bool _hx_tmp1;
+HXDLIN( 907)		if (!(client)) {
+HXLINE( 907)			_hx_tmp1 = account;
             		}
             		else {
-HXLINE( 803)			_hx_tmp1 = true;
+HXLINE( 907)			_hx_tmp1 = true;
             		}
-HXDLIN( 803)		if (_hx_tmp1) {
-HXLINE( 803)			_hx_tmp = !(bot);
+HXDLIN( 907)		if (_hx_tmp1) {
+HXLINE( 907)			_hx_tmp = !(bot);
             		}
             		else {
-HXLINE( 803)			_hx_tmp = false;
+HXLINE( 907)			_hx_tmp = false;
             		}
-HXDLIN( 803)		if (_hx_tmp) {
-HXLINE( 803)			return false;
+HXDLIN( 907)		if (_hx_tmp) {
+HXLINE( 907)			return false;
             		}
-HXLINE( 805)		bool noReply = (::borogove::Caps_obj::withFeature(this->getCaps(),HX_("urn:xmpp:noreply:0",a3,10,eb,d5))->length > 0);
-HXLINE( 807)		bool _hx_tmp2;
-HXDLIN( 807)		if (bot) {
-HXLINE( 807)			_hx_tmp2 = noReply;
+HXLINE( 909)		bool noReply = ( (bool)(::borogove::Caps_obj::withFeature(this->getCaps(),HX_("urn:xmpp:noreply:0",a3,10,eb,d5))->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) );
+HXLINE( 911)		bool _hx_tmp2;
+HXDLIN( 911)		if (bot) {
+HXLINE( 911)			_hx_tmp2 = noReply;
             		}
             		else {
-HXLINE( 807)			_hx_tmp2 = false;
+HXLINE( 911)			_hx_tmp2 = false;
             		}
-HXDLIN( 807)		if (_hx_tmp2) {
-HXLINE( 807)			return this->hasCommands();
+HXDLIN( 911)		if (_hx_tmp2) {
+HXLINE( 911)			return this->hasCommands();
             		}
-HXLINE( 809)		bool conference = (::borogove::Caps_obj::withIdentity(this->getCaps(),HX_("conference",1c,2b,83,41),null())->length > 0);
-HXLINE( 811)		bool _hx_tmp3;
-HXDLIN( 811)		if (conference) {
-HXLINE( 811)			_hx_tmp3 = (this->chatId.indexOf(HX_("@",40,00,00,00),null()) < 0);
+HXLINE( 913)		bool conference = ( (bool)(::borogove::Caps_obj::withIdentity(this->getCaps(),HX_("conference",1c,2b,83,41),null())->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) );
+HXLINE( 915)		bool _hx_tmp3;
+HXDLIN( 915)		if (conference) {
+HXLINE( 915)			_hx_tmp3 = (this->chatId.indexOf(HX_("@",40,00,00,00),null()) < 0);
             		}
             		else {
-HXLINE( 811)			_hx_tmp3 = false;
+HXLINE( 915)			_hx_tmp3 = false;
             		}
-HXDLIN( 811)		if (_hx_tmp3) {
-HXLINE( 811)			return this->hasCommands();
+HXDLIN( 915)		if (_hx_tmp3) {
+HXLINE( 915)			return this->hasCommands();
             		}
-HXLINE( 814)		bool _hx_tmp4;
-HXDLIN( 814)		if (!(client)) {
-HXLINE( 814)			_hx_tmp4 = !(conference);
+HXLINE( 918)		bool _hx_tmp4;
+HXDLIN( 918)		if (!(client)) {
+HXLINE( 918)			_hx_tmp4 = !(conference);
             		}
             		else {
-HXLINE( 814)			_hx_tmp4 = false;
+HXLINE( 918)			_hx_tmp4 = false;
             		}
-HXDLIN( 814)		if (_hx_tmp4) {
-HXLINE( 814)			return this->hasCommands();
+HXDLIN( 918)		if (_hx_tmp4) {
+HXLINE( 918)			return this->hasCommands();
             		}
             		else {
-HXLINE( 814)			return false;
+HXLINE( 918)			return false;
             		}
-HXDLIN( 814)		return false;
+HXDLIN( 918)		return false;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,isApp,return )
 
 bool Chat_obj::hasCommands(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_821_hasCommands)
-HXDLIN( 821)		return (this->commandJids()->length > 0);
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_925_hasCommands)
+HXDLIN( 925)		return (this->commandJids()->length > 0);
             	}
 
 
@@ -1929,250 +1972,287 @@ HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,hasCommands,return )
 ::Dynamic Chat_obj::commands(){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(1)
             		::Array< ::Dynamic> _hx_run(::Array< ::Dynamic> commands){
-            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_836_commands)
-HXLINE( 836)			::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 836)			{
-HXLINE( 836)				int _g_current = 0;
-HXDLIN( 836)				while((_g_current < commands->length)){
-HXLINE( 836)					_g_current = (_g_current + 1);
-HXDLIN( 836)					{
-HXLINE( 836)						 ::Dynamic x = commands->__get((_g_current - 1)).StaticCast< ::Array< ::Dynamic> >()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 836)						while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 836)							_g->push(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_943_commands)
+HXLINE( 943)			::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 943)			{
+HXLINE( 943)				int _g_current = 0;
+HXDLIN( 943)				while((_g_current < commands->length)){
+HXLINE( 943)					_g_current = (_g_current + 1);
+HXDLIN( 943)					{
+HXLINE( 943)						 ::Dynamic x = commands->__get((_g_current - 1)).StaticCast< ::Array< ::Dynamic> >()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 943)						while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 943)							_g->push(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
             						}
             					}
             				}
             			}
-HXDLIN( 836)			return _g;
+HXDLIN( 943)			return _g;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_824_commands)
-HXDLIN( 824)		 ::borogove::Chat _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 825)		::Array< ::Dynamic> _this = this->commandJids();
-HXDLIN( 825)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_this->length);
-HXDLIN( 825)		{
-HXLINE( 825)			int _g = 0;
-HXDLIN( 825)			int _g1 = _this->length;
-HXDLIN( 825)			while((_g < _g1)){
-HXLINE( 825)				_g = (_g + 1);
-HXDLIN( 825)				int i = (_g - 1);
-HXDLIN( 825)				{
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_931_commands)
+HXDLIN( 931)		 ::borogove::Chat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 932)		::Array< ::Dynamic> _this = this->commandJids();
+HXDLIN( 932)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_this->length);
+HXDLIN( 932)		{
+HXLINE( 932)			int _g = 0;
+HXDLIN( 932)			int _g1 = _this->length;
+HXDLIN( 932)			while((_g < _g1)){
+HXLINE( 932)				_g = (_g + 1);
+HXDLIN( 932)				int i = (_g - 1);
+HXDLIN( 932)				{
             					HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Chat,_gthis, ::borogove::JID,jid) HXARGC(2)
             					void _hx_run( ::Dynamic resolve, ::Dynamic reject){
             						HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_0, ::borogove::Chat,_gthis, ::Dynamic,resolve, ::borogove::JID,jid, ::borogove::queries::DiscoItemsGet,itemsGet) HXARGC(0)
             						void _hx_run(){
-            							HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_827_commands)
-HXLINE( 828)							jid->asBare();
-HXLINE( 829)							 ::Dynamic resolve1 = resolve;
-HXDLIN( 829)							::Array< ::Dynamic> _this;
-HXDLIN( 829)							::Array< ::Dynamic> tmp = itemsGet->getResult();
-HXDLIN( 829)							if (::hx::IsNotNull( tmp )) {
-HXLINE( 829)								_this = tmp;
+            							HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_934_commands)
+HXLINE( 935)							jid->asBare();
+HXLINE( 936)							 ::Dynamic resolve1 = resolve;
+HXDLIN( 936)							::Array< ::Dynamic> _this;
+HXDLIN( 936)							::Array< ::Dynamic> tmp = itemsGet->getResult();
+HXDLIN( 936)							if (::hx::IsNotNull( tmp )) {
+HXLINE( 936)								_this = tmp;
             							}
             							else {
-HXLINE( 829)								_this = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 936)								_this = ::Array_obj< ::Dynamic>::__new(0);
             							}
-HXDLIN( 829)							::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 829)							{
-HXLINE( 829)								int _g1 = 0;
-HXDLIN( 829)								::Array< ::Dynamic> _g2 = _this;
-HXDLIN( 829)								while((_g1 < _g2->length)){
-HXLINE( 829)									 ::Dynamic v = _g2->__get(_g1);
-HXDLIN( 829)									_g1 = (_g1 + 1);
-HXLINE( 832)									bool inValue;
-HXDLIN( 832)									bool inValue1;
-HXDLIN( 832)									if (::hx::IsNotNull( v->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic) )) {
-HXLINE( 832)										inValue1 = ( ( ::borogove::JID)(v->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) )->asBare()->equals(jid);
+HXDLIN( 936)							::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 936)							{
+HXLINE( 936)								int _g1 = 0;
+HXDLIN( 936)								::Array< ::Dynamic> _g2 = _this;
+HXDLIN( 936)								while((_g1 < _g2->length)){
+HXLINE( 936)									 ::Dynamic v = _g2->__get(_g1);
+HXDLIN( 936)									_g1 = (_g1 + 1);
+HXLINE( 939)									bool inValue;
+HXDLIN( 939)									bool inValue1;
+HXDLIN( 939)									if (::hx::IsNotNull( v->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic) )) {
+HXLINE( 939)										inValue1 = ( ( ::borogove::JID)(v->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) )->asBare()->equals(jid);
             									}
             									else {
-HXLINE( 832)										inValue1 = false;
+HXLINE( 939)										inValue1 = false;
             									}
-HXDLIN( 832)									if (inValue1) {
-HXLINE( 832)										inValue = ::hx::IsNotNull( v->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic) );
+HXDLIN( 939)									if (inValue1) {
+HXLINE( 939)										inValue = ::hx::IsNotNull( v->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic) );
             									}
             									else {
-HXLINE( 832)										inValue = false;
+HXLINE( 939)										inValue = false;
             									}
-HXLINE( 829)									if (inValue) {
-HXLINE( 829)										_g->push(v);
+HXLINE( 936)									if (inValue) {
+HXLINE( 936)										_g->push(v);
             									}
             								}
             							}
-HXDLIN( 829)							::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_g->length);
-HXDLIN( 829)							{
-HXLINE( 829)								int _g3 = 0;
-HXDLIN( 829)								int _g4 = _g->length;
-HXDLIN( 829)								while((_g3 < _g4)){
-HXLINE( 829)									_g3 = (_g3 + 1);
-HXDLIN( 829)									int i = (_g3 - 1);
-HXDLIN( 829)									{
-HXLINE( 833)										 ::Dynamic item = _hx_array_unsafe_get(_g,i);
-HXLINE( 829)										result->__unsafe_set(i, ::borogove::Command_obj::__alloc( HX_CTX ,_gthis->client,item));
+HXDLIN( 936)							::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_g->length);
+HXDLIN( 936)							{
+HXLINE( 936)								int _g3 = 0;
+HXDLIN( 936)								int _g4 = _g->length;
+HXDLIN( 936)								while((_g3 < _g4)){
+HXLINE( 936)									_g3 = (_g3 + 1);
+HXDLIN( 936)									int i = (_g3 - 1);
+HXDLIN( 936)									{
+HXLINE( 940)										 ::Dynamic item = _hx_array_unsafe_get(_g,i);
+HXLINE( 936)										result->__unsafe_set(i, ::borogove::Command_obj::__alloc( HX_CTX ,_gthis->client,item));
             									}
             								}
             							}
-HXDLIN( 829)							resolve1(result);
+HXDLIN( 936)							resolve1(result);
             						}
             						HX_END_LOCAL_FUNC0((void))
 
-            						HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_825_commands)
-HXLINE( 826)						 ::borogove::queries::DiscoItemsGet itemsGet =  ::borogove::queries::DiscoItemsGet_obj::__alloc( HX_CTX ,jid->asString(),HX_("http://jabber.org/protocol/commands",3c,af,11,6d));
-HXLINE( 827)						itemsGet->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,resolve,jid,itemsGet)));
-HXLINE( 835)						_gthis->client->sendQuery(itemsGet);
+            						HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_932_commands)
+HXLINE( 933)						 ::borogove::queries::DiscoItemsGet itemsGet =  ::borogove::queries::DiscoItemsGet_obj::__alloc( HX_CTX ,jid->asString(),HX_("http://jabber.org/protocol/commands",3c,af,11,6d));
+HXLINE( 934)						itemsGet->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,resolve,jid,itemsGet)));
+HXLINE( 942)						_gthis->client->sendQuery(itemsGet);
             					}
             					HX_END_LOCAL_FUNC2((void))
 
-HXLINE( 825)					 ::borogove::JID jid = ( ( ::borogove::JID)(_hx_array_unsafe_get(_this,i)) );
-HXDLIN( 825)					::Dynamic inValue = ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(_gthis,jid)));
-HXDLIN( 825)					result->__unsafe_set(i,inValue);
+HXLINE( 932)					 ::borogove::JID jid = ( ( ::borogove::JID)(_hx_array_unsafe_get(_this,i)) );
+HXDLIN( 932)					::Dynamic inValue = ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(_gthis,jid)));
+HXDLIN( 932)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN( 825)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(result), ::Dynamic(new _hx_Closure_2()),null());
+HXDLIN( 932)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(result), ::Dynamic(new _hx_Closure_2()),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,commands,return )
 
 void Chat_obj::commands__fromC(::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_337_commands__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			this->commands();
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_commands__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->commands();
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(::Array< ::Dynamic> v){
-            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_337_commands__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
-HXLINE( 308)				{
-HXLINE( 308)					int _g = 0;
-HXDLIN( 308)					while((_g < v->length)){
-HXLINE( 308)						 ::borogove::Command el = v->__get(_g).StaticCast<  ::borogove::Command >();
-HXDLIN( 308)						_g = (_g + 1);
-HXDLIN( 308)						{
-HXLINE( 308)							 ::Dynamic haxeObject = el;
-HXDLIN( 308)							void* ptr = haxeObject.mPtr;
-HXDLIN( 308)							::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 308)							{
-HXLINE( 308)								 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 308)								if (::hx::IsNull( store )) {
-HXLINE( 308)									store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            										->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            										->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 308)									::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            								}
-            								else {
-HXLINE( 308)									::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            								}
-            							}
-            						}
-            					}
-            				}
-HXDLIN( 308)				void** ptr1 = (void**)v->getBase();
-HXDLIN( 308)				::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 308)				{
-HXLINE( 308)					 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 308)					if (::hx::IsNull( store1 )) {
-HXLINE( 308)						store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            							->setFixed(1,HX_("value",71,7f,b8,31),v));
-HXDLIN( 308)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            					}
-            					else {
-HXLINE( 308)						::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            					}
-            				}
-HXLINE( 337)				handler1(ptr1,( (size_t)(v->length) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_commands__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
+HXDLIN( 365)				handler1(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(v),( (size_t)(v->length) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_337_commands__fromC)
-HXDLIN( 337)				handler(null(),( (size_t)(0) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_commands__fromC)
+HXDLIN( 365)				handler(null(),( (size_t)(0) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->commands(), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->commands(), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
 ::Array< ::Dynamic> Chat_obj::commandJids(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_839_commandJids)
-HXLINE( 840)		::Array< ::Dynamic> jids = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 841)		 ::borogove::JID jid = ::borogove::JID_obj::parse(this->chatId);
-HXLINE( 842)		{
-HXLINE( 842)			int _g = 0;
-HXDLIN( 842)			::Array< ::String > _g1 = ::borogove::Caps_obj::withFeature(this->getCaps(),HX_("http://jabber.org/protocol/commands",3c,af,11,6d));
-HXDLIN( 842)			while((_g < _g1->length)){
-HXLINE( 842)				::String resource = _g1->__get(_g);
-HXDLIN( 842)				_g = (_g + 1);
-HXLINE( 843)				 ::borogove::JID _hx_tmp;
-HXDLIN( 843)				bool _hx_tmp1;
-HXDLIN( 843)				if ((resource != HX_("",00,00,00,00))) {
-HXLINE( 843)					_hx_tmp1 = ::hx::IsNull( resource );
-            				}
-            				else {
-HXLINE( 843)					_hx_tmp1 = true;
-            				}
-HXDLIN( 843)				if (_hx_tmp1) {
-HXLINE( 843)					_hx_tmp = jid;
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_946_commandJids)
+HXLINE( 947)		::Array< ::Dynamic> jids = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 948)		 ::borogove::JID jid = ::borogove::JID_obj::parse(this->chatId);
+HXLINE( 949)		{
+HXLINE( 949)			 ::Dynamic _g = ::borogove::Caps_obj::withFeature(this->getCaps(),HX_("http://jabber.org/protocol/commands",3c,af,11,6d));
+HXDLIN( 949)			while(( (bool)(_g->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 949)				::String resource = ( (::String)(_g->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic)) );
+HXLINE( 950)				 ::borogove::JID _hx_tmp;
+HXDLIN( 950)				if (::hx::IsNull( resource )) {
+HXLINE( 950)					_hx_tmp = jid;
             				}
             				else {
-HXLINE( 843)					_hx_tmp = jid->withResource(resource);
+HXLINE( 950)					_hx_tmp = jid->withResource(resource);
             				}
-HXDLIN( 843)				jids->push(_hx_tmp);
+HXDLIN( 950)				jids->push(_hx_tmp);
             			}
             		}
-HXLINE( 845)		bool _hx_tmp2;
-HXDLIN( 845)		if ((jids->length < 1)) {
-HXLINE( 845)			_hx_tmp2 = jid->isDomain();
+HXLINE( 952)		bool _hx_tmp1;
+HXDLIN( 952)		if ((jids->length < 1)) {
+HXLINE( 952)			_hx_tmp1 = jid->isDomain();
             		}
             		else {
-HXLINE( 845)			_hx_tmp2 = false;
+HXLINE( 952)			_hx_tmp1 = false;
             		}
-HXDLIN( 845)		if (_hx_tmp2) {
-HXLINE( 846)			jids->push(jid);
+HXDLIN( 952)		if (_hx_tmp1) {
+HXLINE( 953)			jids->push(jid);
             		}
-HXLINE( 848)		return jids;
+HXLINE( 955)		return jids;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,commandJids,return )
 
- ::borogove::Participant Chat_obj::invitedBy(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_854_invitedBy)
-HXLINE( 855)		::Array< ::Dynamic> inviteEls = this->invites();
-HXLINE( 856)		if ((inviteEls->length < 1)) {
-HXLINE( 856)			return null();
+::Dynamic Chat_obj::invitedBy(){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(1)
+            		 ::borogove::Member _hx_run(::Array< ::Dynamic> result){
+            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_977_invitedBy)
+HXLINE( 977)			if (::hx::IsNotNull( result->__get(0).StaticCast<  ::borogove::Member >() )) {
+HXLINE( 977)				return result->__get(0).StaticCast<  ::borogove::Member >();
+            			}
+            			else {
+HXLINE( 977)				return null();
+            			}
+HXDLIN( 977)			return null();
             		}
-HXLINE( 858)		 ::borogove::JID inviteFrom = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(inviteEls->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("from",6a,a5,c2,43))) ));
-HXLINE( 859)		::String bare = inviteFrom->asBare()->asString();
-HXLINE( 860)		 ::borogove::Chat maybeChannel = this->client->getChat(bare);
-HXLINE( 861)		if (::hx::IsNotNull( maybeChannel )) {
-HXLINE( 862)			 ::borogove::Channel channel = ( ( ::borogove::Channel)(::borogove::_Util::Util_Fields__obj::downcast(maybeChannel,::hx::ClassOf< ::borogove::Channel >())) );
-HXLINE( 863)			if (::hx::IsNotNull( channel )) {
-HXLINE( 864)				return channel->getParticipantDetails(inviteFrom->asString());
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_961_invitedBy)
+HXLINE( 962)		::Array< ::Dynamic> inviteEls = this->invites();
+HXLINE( 963)		if ((inviteEls->length < 1)) {
+HXLINE( 963)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            		}
+HXLINE( 965)		 ::borogove::JID inviteFrom = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(inviteEls->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("from",6a,a5,c2,43))) ));
+HXLINE( 966)		::String bare = inviteFrom->asBare()->asString();
+HXLINE( 967)		 ::borogove::Chat maybeChannel = this->client->getChat(bare);
+HXLINE( 968)		if (::hx::IsNotNull( maybeChannel )) {
+HXLINE( 970)			if (::hx::IsNotNull( ::borogove::_Util::Util_Fields__obj::downcast(maybeChannel,::hx::ClassOf< ::borogove::Channel >()) )) {
+            				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::JID,inviteFrom) HXARGC(1)
+            				::Array< ::Dynamic> _hx_run(::Array< ::Dynamic> members){
+            					HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_972_invitedBy)
+HXLINE( 972)					::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 972)					{
+HXLINE( 972)						int _g1 = 0;
+HXDLIN( 972)						while((_g1 < members->length)){
+HXLINE( 972)							 ::borogove::Member v = members->__get(_g1).StaticCast<  ::borogove::Member >();
+HXDLIN( 972)							_g1 = (_g1 + 1);
+HXDLIN( 972)							if ((v->displayName == inviteFrom->resource)) {
+HXLINE( 972)								_g->push(v);
+            							}
+            						}
+            					}
+HXDLIN( 972)					return _g;
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+            				HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
+            				 ::borogove::Member _hx_run(::Array< ::Dynamic> result){
+            					HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_973_invitedBy)
+HXLINE( 973)					if ((result->length > 0)) {
+HXLINE( 973)						return result->__get(0).StaticCast<  ::borogove::Member >();
+            					}
+            					else {
+HXLINE( 973)						return null();
+            					}
+HXDLIN( 973)					return null();
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 971)				::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->members(), ::Dynamic(new _hx_Closure_0(inviteFrom)),null()), ::Dynamic(new _hx_Closure_1()),null());
             			}
             		}
-HXLINE( 868)		 ::borogove::Chat _hx_tmp;
-HXDLIN( 868)		if (::hx::IsNotNull( maybeChannel )) {
-HXLINE( 868)			_hx_tmp = maybeChannel;
+HXLINE( 977)		 ::borogove::Chat _hx_tmp;
+HXDLIN( 977)		if (::hx::IsNotNull( maybeChannel )) {
+HXLINE( 977)			_hx_tmp = maybeChannel;
             		}
             		else {
-HXLINE( 868)			_hx_tmp = this->client->getDirectChat(bare,null());
+HXLINE( 977)			_hx_tmp = this->client->getDirectChat(bare,null());
             		}
-HXDLIN( 868)		return _hx_tmp->getParticipantDetails(bare);
+HXDLIN( 977)		return ::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->getMemberDetails(::Array_obj< ::String >::__new(1)->init(0,bare)), ::Dynamic(new _hx_Closure_2()),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,invitedBy,return )
 
+void Chat_obj::invitedBy__fromC(::cpp::Function< void  (void*,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_invitedBy__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->invitedBy();
+            		}
+            		else {
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::borogove::Member v){
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_invitedBy__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            					}
+            					else {
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            					}
+            				}
+HXLINE( 365)				handler1(ptr,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::Dynamic e){
+            				HX_STACKFRAME(&_hx_pos_a94f40d98d9e57cb_365_invitedBy__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->invitedBy(), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+            		}
+            	}
+
+
 ::Array< ::Dynamic> Chat_obj::invites(){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_872_invites)
-HXDLIN( 872)		return this->extensions->allTags(HX_("invite",c9,f1,db,9f),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_981_invites)
+HXDLIN( 981)		return this->extensions->allTags(HX_("invite",c9,f1,db,9f),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
             	}
 
 
@@ -2181,119 +2261,143 @@ HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,invites,return )
 ::Dynamic Chat_obj::recomputeUnread(){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Chat,_gthis) HXARGC(1)
             		void _hx_run(::Array< ::Dynamic> messages){
-            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_876_recomputeUnread)
-HXLINE( 877)			int i = messages->length;
-HXLINE( 878)			while(true){
-HXLINE( 878)				i = (i - 1);
-HXDLIN( 878)				if (!((i >= 0))) {
-HXLINE( 878)					goto _hx_goto_122;
+            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_990_recomputeUnread)
+HXLINE( 991)			int i = messages->length;
+HXLINE( 992)			while(true){
+HXLINE( 992)				i = (i - 1);
+HXDLIN( 992)				if (!((i >= 0))) {
+HXLINE( 992)					goto _hx_goto_142;
             				}
-HXLINE( 879)				bool _hx_tmp;
-HXDLIN( 879)				if ((messages->__get(i).StaticCast<  ::borogove::ChatMessage >()->serverId != _gthis->readUpToId)) {
-HXLINE( 879)					_hx_tmp = !(messages->__get(i).StaticCast<  ::borogove::ChatMessage >()->isIncoming());
+HXLINE( 993)				bool _hx_tmp;
+HXDLIN( 993)				if ((messages->__get(i).StaticCast<  ::borogove::ChatMessage >()->serverId != _gthis->readUpToId)) {
+HXLINE( 993)					_hx_tmp = !(messages->__get(i).StaticCast<  ::borogove::ChatMessage >()->isIncoming());
             				}
             				else {
-HXLINE( 879)					_hx_tmp = true;
+HXLINE( 993)					_hx_tmp = true;
             				}
-HXDLIN( 879)				if (_hx_tmp) {
-HXLINE( 879)					goto _hx_goto_122;
+HXDLIN( 993)				if (_hx_tmp) {
+HXLINE( 993)					goto _hx_goto_142;
             				}
             			}
-            			_hx_goto_122:;
-HXLINE( 881)			_gthis->setUnreadCount((messages->length - (i + 1)));
+            			_hx_goto_142:;
+HXLINE( 995)			_gthis->setUnreadCount((messages->length - (i + 1)));
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_875_recomputeUnread)
-HXDLIN( 875)		 ::borogove::Chat _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 876)		::Dynamic _hx_tmp = this->persistence;
-HXDLIN( 876)		::String _hx_tmp1 = this->client->accountId();
-HXDLIN( 876)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesBefore(_hx_tmp,_hx_tmp1,this->chatId,null(),null()), ::Dynamic(new _hx_Closure_0(_gthis)),null());
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_984_recomputeUnread)
+HXDLIN( 984)		 ::borogove::Chat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 985)		bool _hx_tmp;
+HXDLIN( 985)		if (::hx::IsNotNull( this->lastMessage )) {
+HXLINE( 985)			_hx_tmp = (this->lastMessage->serverId == this->readUpToId);
+            		}
+            		else {
+HXLINE( 985)			_hx_tmp = false;
+            		}
+HXDLIN( 985)		if (_hx_tmp) {
+HXLINE( 986)			this->setUnreadCount(0);
+HXLINE( 987)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            		}
+HXLINE( 990)		::Dynamic _hx_tmp1 = this->persistence;
+HXDLIN( 990)		::String _hx_tmp2 = this->client->accountId();
+HXDLIN( 990)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesBefore(_hx_tmp1,_hx_tmp2,this->chatId,null()), ::Dynamic(new _hx_Closure_0(_gthis)),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Chat_obj,recomputeUnread,return )
 
-::Dynamic Chat_obj::markReadUpToId(::String upTo,::String upToBy){
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_886_markReadUpToId)
-HXLINE( 887)		if (::hx::IsNull( upTo )) {
-HXLINE( 887)			return ::thenshim::_Promise::Promise_Impl__obj::reject(null());
+::Dynamic Chat_obj::markReadUpToId(::String upTo,::String upToBy,::hx::Null< bool >  __o_recompute){
+            		bool recompute = __o_recompute.Default(true);
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_1000_markReadUpToId)
+HXLINE(1001)		if (::hx::IsNull( upTo )) {
+HXLINE(1001)			return ::thenshim::_Promise::Promise_Impl__obj::reject(null());
             		}
-HXLINE( 888)		if ((this->readUpTo() == upTo)) {
-HXLINE( 888)			return ::thenshim::_Promise::Promise_Impl__obj::reject(null());
+HXLINE(1002)		if ((this->readUpToId == upTo)) {
+HXLINE(1003)			return ::thenshim::_Promise::Promise_Impl__obj::reject(null());
             		}
-HXLINE( 890)		this->readUpToId = upTo;
-HXLINE( 891)		this->readUpToBy = upToBy;
-HXLINE( 892)		::Dynamic _hx_tmp = this->persistence;
-HXDLIN( 892)		::borogove::Persistence_obj::storeChats(_hx_tmp,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
-HXLINE( 893)		return this->recomputeUnread();
+HXLINE(1006)		this->readUpToId = upTo;
+HXLINE(1007)		this->readUpToBy = upToBy;
+HXLINE(1008)		if (recompute) {
+HXLINE(1008)			::Dynamic _hx_tmp = this->persistence;
+HXDLIN(1008)			::borogove::Persistence_obj::storeChats(_hx_tmp,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+            		}
+HXLINE(1009)		if (recompute) {
+HXLINE(1009)			return this->recomputeUnread();
+            		}
+            		else {
+HXLINE(1009)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            		}
+HXDLIN(1009)		return null();
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Chat_obj,markReadUpToId,return )
+HX_DEFINE_DYNAMIC_FUNC3(Chat_obj,markReadUpToId,return )
 
 ::Dynamic Chat_obj::markReadUpToMessage( ::borogove::ChatMessage message){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::Chat,_gthis, ::borogove::ChatMessage,message) HXARGC(1)
             		::Dynamic _hx_run( ::borogove::ChatMessage readMessage){
-            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_904_markReadUpToMessage)
-HXLINE( 905)			bool _hx_tmp;
-HXDLIN( 905)			if (::hx::IsNotNull( readMessage )) {
-HXLINE( 905)				_hx_tmp = (::Reflect_obj::compare(message->timestamp,readMessage->timestamp) <= 0);
+            			HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_1023_markReadUpToMessage)
+HXLINE(1024)			bool _hx_tmp;
+HXDLIN(1024)			if (::hx::IsNotNull( readMessage )) {
+HXLINE(1024)				_hx_tmp = (message->sortId <= readMessage->sortId);
             			}
             			else {
-HXLINE( 905)				_hx_tmp = false;
+HXLINE(1024)				_hx_tmp = false;
             			}
-HXDLIN( 905)			if (_hx_tmp) {
-HXLINE( 906)				return ::thenshim::_Promise::Promise_Impl__obj::reject(null());
+HXDLIN(1024)			if (_hx_tmp) {
+HXLINE(1025)				return ::thenshim::_Promise::Promise_Impl__obj::reject(null());
             			}
-HXLINE( 909)			return _gthis->markReadUpToId(message->serverId,message->serverIdBy);
+HXLINE(1028)			return _gthis->markReadUpToId(message->serverId,message->serverIdBy,null());
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_896_markReadUpToMessage)
-HXDLIN( 896)		 ::borogove::Chat _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 897)		bool _hx_tmp;
-HXDLIN( 897)		if (::hx::IsNotNull( message->serverId )) {
-HXLINE( 897)			::String _hx_tmp1 = message->chatId();
-HXDLIN( 897)			_hx_tmp = (_hx_tmp1 != this->chatId);
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_1012_markReadUpToMessage)
+HXDLIN(1012)		 ::borogove::Chat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1013)		bool _hx_tmp;
+HXDLIN(1013)		if (::hx::IsNotNull( message->serverId )) {
+HXLINE(1013)			::String _hx_tmp1 = message->chatId();
+HXDLIN(1013)			_hx_tmp = (_hx_tmp1 != this->chatId);
             		}
             		else {
-HXLINE( 897)			_hx_tmp = true;
+HXLINE(1013)			_hx_tmp = true;
             		}
-HXDLIN( 897)		if (_hx_tmp) {
-HXLINE( 897)			return ::thenshim::_Promise::Promise_Impl__obj::reject(null());
+HXDLIN(1013)		if (_hx_tmp) {
+HXLINE(1013)			return ::thenshim::_Promise::Promise_Impl__obj::reject(null());
             		}
-HXLINE( 898)		::String _hx_tmp2 = this->readUpTo();
-HXDLIN( 898)		if ((_hx_tmp2 == message->serverId)) {
-HXLINE( 898)			return ::thenshim::_Promise::Promise_Impl__obj::reject(null());
+HXLINE(1014)		if ((this->readUpToId == message->serverId)) {
+HXLINE(1015)			bool _hx_tmp2;
+HXDLIN(1015)			if (::hx::IsNotNull( this->lastMessage )) {
+HXLINE(1015)				_hx_tmp2 = (this->lastMessage->serverId == this->readUpToId);
+            			}
+            			else {
+HXLINE(1015)				_hx_tmp2 = false;
+            			}
+HXDLIN(1015)			if (_hx_tmp2) {
+HXLINE(1015)				this->setUnreadCount(0);
+            			}
+HXLINE(1016)			return ::thenshim::_Promise::Promise_Impl__obj::reject(null());
             		}
-HXLINE( 900)		if (::hx::IsNull( this->readUpTo() )) {
-HXLINE( 901)			return this->markReadUpToId(message->serverId,message->serverIdBy);
+HXLINE(1019)		if (::hx::IsNull( this->readUpToId )) {
+HXLINE(1020)			return this->markReadUpToId(message->serverId,message->serverIdBy,null());
             		}
-HXLINE( 904)		::Dynamic _hx_tmp3 = this->persistence;
-HXDLIN( 904)		::String _hx_tmp4 = this->client->accountId();
-HXDLIN( 904)		::String _hx_tmp5 = this->chatId;
-HXDLIN( 904)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessage(_hx_tmp3,_hx_tmp4,_hx_tmp5,this->readUpTo(),null()), ::Dynamic(new _hx_Closure_0(_gthis,message)),null());
+HXLINE(1023)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->readUpTo(), ::Dynamic(new _hx_Closure_0(_gthis,message)),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Chat_obj,markReadUpToMessage,return )
 
 void Chat_obj::publishMds(){
-            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_914_publishMds)
-HXDLIN( 914)		 ::borogove::Client _hx_tmp = this->client;
-HXLINE( 915)		 ::borogove::Stanza _hx_tmp1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_GC_STACKFRAME(&_hx_pos_9cc1265c56ba593e_1033_publishMds)
+HXDLIN(1033)		 ::borogove::Client _hx_tmp = this->client;
+HXLINE(1034)		 ::borogove::Stanza _hx_tmp1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("pubsub",e3,da,f8,66), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/pubsub",57,94,3c,f2))))->tag(HX_("publish",8f,21,1d,ae), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("node",02,0a,0a,49),HX_("urn:xmpp:mds:displayed:0",bd,60,cc,fb))))->tag(HX_("item",13,c5,bf,45), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("id",db,5b,00,00),this->chatId)))->tag(HX_("displayed",21,17,db,c1), ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:mds:displayed:0",bd,60,cc,fb))));
-HXLINE( 920)		::String _hx_tmp2 = this->readUpTo();
-HXLINE( 915)		 ::borogove::Stanza _hx_tmp3 = _hx_tmp1->tag(HX_("stanza-id",73,8a,54,e9), ::Dynamic(::hx::Anon_obj::Create(3)
+            			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:mds:displayed:0",bd,60,cc,fb))))->tag(HX_("stanza-id",73,8a,54,e9), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("by",d7,55,00,00),this->readUpToBy)
-            			->setFixed(1,HX_("id",db,5b,00,00),_hx_tmp2)
+            			->setFixed(1,HX_("id",db,5b,00,00),this->readUpToId)
             			->setFixed(2,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:sid:0",a8,4b,37,54))))->up()->up()->up();
-HXLINE( 914)		_hx_tmp->publishWithOptions(_hx_tmp3, ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE(1033)		_hx_tmp->publishWithOptions(_hx_tmp1, ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("type",ba,f2,08,4d),HX_("submit",18,58,06,9a))
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("jabber:x:data",c2,e1,e9,7c))))->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("var",e7,de,59,00),HX_("FORM_TYPE",d5,96,c9,5a))
@@ -2319,8 +2423,8 @@ void Chat_obj::__Mark(HX_MARK_PARAMS)
 	HX_MARK_MEMBER_NAME(stream,"stream");
 	HX_MARK_MEMBER_NAME(persistence,"persistence");
 	HX_MARK_MEMBER_NAME(avatarSha1,"avatarSha1");
-	HX_MARK_MEMBER_NAME(presence,"presence");
 	HX_MARK_MEMBER_NAME(trusted,"trusted");
+	HX_MARK_MEMBER_NAME(status,"status");
 	HX_MARK_MEMBER_NAME(chatId,"chatId");
 	HX_MARK_MEMBER_NAME(jingleSessions,"jingleSessions");
 	HX_MARK_MEMBER_NAME(displayName,"displayName");
@@ -2332,6 +2436,7 @@ void Chat_obj::__Mark(HX_MARK_PARAMS)
 	HX_MARK_MEMBER_NAME(_unreadCount,"_unreadCount");
 	HX_MARK_MEMBER_NAME(readUpToId,"readUpToId");
 	HX_MARK_MEMBER_NAME(readUpToBy,"readUpToBy");
+	HX_MARK_MEMBER_NAME(threads,"threads");
 	HX_MARK_MEMBER_NAME(isTyping,"isTyping");
 	HX_MARK_MEMBER_NAME(typingThread,"typingThread");
 	HX_MARK_MEMBER_NAME(typingTimer,"typingTimer");
@@ -2341,6 +2446,7 @@ void Chat_obj::__Mark(HX_MARK_PARAMS)
 	HX_MARK_MEMBER_NAME(outbox,"outbox");
 	HX_MARK_MEMBER_NAME(_encryptionMode,"_encryptionMode");
 	HX_MARK_MEMBER_NAME(omemoContactDeviceIDs,"omemoContactDeviceIDs");
+	 ::borogove::EventEmitter_obj::__Mark(HX_MARK_ARG);
 	HX_MARK_END_CLASS();
 }
 
@@ -2350,8 +2456,8 @@ void Chat_obj::__Visit(HX_VISIT_PARAMS)
 	HX_VISIT_MEMBER_NAME(stream,"stream");
 	HX_VISIT_MEMBER_NAME(persistence,"persistence");
 	HX_VISIT_MEMBER_NAME(avatarSha1,"avatarSha1");
-	HX_VISIT_MEMBER_NAME(presence,"presence");
 	HX_VISIT_MEMBER_NAME(trusted,"trusted");
+	HX_VISIT_MEMBER_NAME(status,"status");
 	HX_VISIT_MEMBER_NAME(chatId,"chatId");
 	HX_VISIT_MEMBER_NAME(jingleSessions,"jingleSessions");
 	HX_VISIT_MEMBER_NAME(displayName,"displayName");
@@ -2363,6 +2469,7 @@ void Chat_obj::__Visit(HX_VISIT_PARAMS)
 	HX_VISIT_MEMBER_NAME(_unreadCount,"_unreadCount");
 	HX_VISIT_MEMBER_NAME(readUpToId,"readUpToId");
 	HX_VISIT_MEMBER_NAME(readUpToBy,"readUpToBy");
+	HX_VISIT_MEMBER_NAME(threads,"threads");
 	HX_VISIT_MEMBER_NAME(isTyping,"isTyping");
 	HX_VISIT_MEMBER_NAME(typingThread,"typingThread");
 	HX_VISIT_MEMBER_NAME(typingTimer,"typingTimer");
@@ -2372,6 +2479,7 @@ void Chat_obj::__Visit(HX_VISIT_PARAMS)
 	HX_VISIT_MEMBER_NAME(outbox,"outbox");
 	HX_VISIT_MEMBER_NAME(_encryptionMode,"_encryptionMode");
 	HX_VISIT_MEMBER_NAME(omemoContactDeviceIDs,"omemoContactDeviceIDs");
+	 ::borogove::EventEmitter_obj::__Visit(HX_VISIT_ARG);
 }
 
 ::hx::Val Chat_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
@@ -2388,6 +2496,7 @@ void Chat_obj::__Visit(HX_VISIT_PARAMS)
 	case 6:
 		if (HX_FIELD_EQ(inName,"client") ) { return ::hx::Val( client ); }
 		if (HX_FIELD_EQ(inName,"stream") ) { return ::hx::Val( stream ); }
+		if (HX_FIELD_EQ(inName,"status") ) { return ::hx::Val( status ); }
 		if (HX_FIELD_EQ(inName,"chatId") ) { return ::hx::Val( chatId ); }
 		if (HX_FIELD_EQ(inName,"outbox") ) { return ::hx::Val( outbox ); }
 		if (HX_FIELD_EQ(inName,"typing") ) { return ::hx::Val( typing_dyn() ); }
@@ -2397,19 +2506,22 @@ void Chat_obj::__Visit(HX_VISIT_PARAMS)
 	case 7:
 		if (HX_FIELD_EQ(inName,"trusted") ) { return ::hx::Val( trusted ); }
 		if (HX_FIELD_EQ(inName,"uiState") ) { return ::hx::Val( uiState ); }
+		if (HX_FIELD_EQ(inName,"threads") ) { return ::hx::Val( threads ); }
+		if (HX_FIELD_EQ(inName,"members") ) { return ::hx::Val( members_dyn() ); }
+		if (HX_FIELD_EQ(inName,"addRole") ) { return ::hx::Val( addRole_dyn() ); }
 		if (HX_FIELD_EQ(inName,"unblock") ) { return ::hx::Val( unblock_dyn() ); }
 		if (HX_FIELD_EQ(inName,"preview") ) { return ::hx::Val( preview_dyn() ); }
-		if (HX_FIELD_EQ(inName,"setCaps") ) { return ::hx::Val( setCaps_dyn() ); }
+		if (HX_FIELD_EQ(inName,"getTags") ) { return ::hx::Val( getTags_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getCaps") ) { return ::hx::Val( getCaps_dyn() ); }
 		if (HX_FIELD_EQ(inName,"syncing") ) { return ::hx::Val( syncing_dyn() ); }
 		if (HX_FIELD_EQ(inName,"canSend") ) { return ::hx::Val( canSend_dyn() ); }
 		if (HX_FIELD_EQ(inName,"invites") ) { return ::hx::Val( invites_dyn() ); }
 		break;
 	case 8:
-		if (HX_FIELD_EQ(inName,"presence") ) { return ::hx::Val( presence ); }
 		if (HX_FIELD_EQ(inName,"isTyping") ) { return ::hx::Val( isTyping ); }
 		if (HX_FIELD_EQ(inName,"isActive") ) { return ::hx::Val( isActive ); }
 		if (HX_FIELD_EQ(inName,"bookmark") ) { return ::hx::Val( bookmark_dyn() ); }
+		if (HX_FIELD_EQ(inName,"moderate") ) { return ::hx::Val( moderate_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getPhoto") ) { return ::hx::Val( getPhoto_dyn() ); }
 		if (HX_FIELD_EQ(inName,"readUpTo") ) { return ::hx::Val( readUpTo_dyn() ); }
 		if (HX_FIELD_EQ(inName,"addMedia") ) { return ::hx::Val( addMedia_dyn() ); }
@@ -2428,6 +2540,7 @@ void Chat_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"extensions") ) { return ::hx::Val( extensions ); }
 		if (HX_FIELD_EQ(inName,"readUpToId") ) { return ::hx::Val( readUpToId ); }
 		if (HX_FIELD_EQ(inName,"readUpToBy") ) { return ::hx::Val( readUpToBy ); }
+		if (HX_FIELD_EQ(inName,"removeRole") ) { return ::hx::Val( removeRole_dyn() ); }
 		if (HX_FIELD_EQ(inName,"setTrusted") ) { return ::hx::Val( setTrusted_dyn() ); }
 		if (HX_FIELD_EQ(inName,"acceptCall") ) { return ::hx::Val( acceptCall_dyn() ); }
 		if (HX_FIELD_EQ(inName,"callStatus") ) { return ::hx::Val( callStatus_dyn() ); }
@@ -2444,6 +2557,7 @@ void Chat_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"unreadCount") ) { return ::hx::Val( unreadCount_dyn() ); }
 		if (HX_FIELD_EQ(inName,"setPresence") ) { return ::hx::Val( setPresence_dyn() ); }
 		if (HX_FIELD_EQ(inName,"videoTracks") ) { return ::hx::Val( videoTracks_dyn() ); }
+		if (HX_FIELD_EQ(inName,"canModerate") ) { return ::hx::Val( canModerate_dyn() ); }
 		if (HX_FIELD_EQ(inName,"hasCommands") ) { return ::hx::Val( hasCommands_dyn() ); }
 		if (HX_FIELD_EQ(inName,"commandJids") ) { return ::hx::Val( commandJids_dyn() ); }
 		break;
@@ -2460,16 +2574,18 @@ void Chat_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"canVideoCall") ) { return ::hx::Val( canVideoCall_dyn() ); }
 		break;
 	case 13:
+		if (HX_FIELD_EQ(inName,"status__fromC") ) { return ::hx::Val( status__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"chatId__fromC") ) { return ::hx::Val( chatId__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"fetchFromSync") ) { return ::hx::Val( fetchFromSync_dyn() ); }
+		if (HX_FIELD_EQ(inName,"canRemoveRole") ) { return ::hx::Val( canRemoveRole_dyn() ); }
 		if (HX_FIELD_EQ(inName,"sendChatState") ) { return ::hx::Val( sendChatState_dyn() ); }
 		if (HX_FIELD_EQ(inName,"notifyMention") ) { return ::hx::Val( notifyMention_dyn() ); }
-		if (HX_FIELD_EQ(inName,"lastMessageId") ) { return ::hx::Val( lastMessageId_dyn() ); }
 		if (HX_FIELD_EQ(inName,"setAvatarSha1") ) { return ::hx::Val( setAvatarSha1_dyn() ); }
 		break;
 	case 14:
 		if (HX_FIELD_EQ(inName,"jingleSessions") ) { return ::hx::Val( jingleSessions ); }
 		if (HX_FIELD_EQ(inName,"uiState__fromC") ) { return ::hx::Val( uiState__fromC_dyn() ); }
+		if (HX_FIELD_EQ(inName,"availableRoles") ) { return ::hx::Val( availableRoles_dyn() ); }
 		if (HX_FIELD_EQ(inName,"correctMessage") ) { return ::hx::Val( correctMessage_dyn() ); }
 		if (HX_FIELD_EQ(inName,"removeReaction") ) { return ::hx::Val( removeReaction_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getPlaceholder") ) { return ::hx::Val( getPlaceholder_dyn() ); }
@@ -2477,22 +2593,21 @@ void Chat_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"setLastMessage") ) { return ::hx::Val( setLastMessage_dyn() ); }
 		if (HX_FIELD_EQ(inName,"setDisplayName") ) { return ::hx::Val( setDisplayName_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getDisplayName") ) { return ::hx::Val( getDisplayName_dyn() ); }
-		if (HX_FIELD_EQ(inName,"removePresence") ) { return ::hx::Val( removePresence_dyn() ); }
 		if (HX_FIELD_EQ(inName,"encryptionMode") ) { return ::hx::Val( encryptionMode_dyn() ); }
 		if (HX_FIELD_EQ(inName,"markReadUpToId") ) { return ::hx::Val( markReadUpToId_dyn() ); }
 		break;
 	case 15:
 		if (HX_FIELD_EQ(inName,"_encryptionMode") ) { return ::hx::Val( _encryptionMode ); }
 		if (HX_FIELD_EQ(inName,"bookmark__fromC") ) { return ::hx::Val( bookmark__fromC_dyn() ); }
-		if (HX_FIELD_EQ(inName,"getParticipants") ) { return ::hx::Val( getParticipants_dyn() ); }
-		if (HX_FIELD_EQ(inName,"getResourceCaps") ) { return ::hx::Val( getResourceCaps_dyn() ); }
 		if (HX_FIELD_EQ(inName,"recomputeUnread") ) { return ::hx::Val( recomputeUnread_dyn() ); }
 		break;
 	case 16:
 		if (HX_FIELD_EQ(inName,"isBlocked__fromC") ) { return ::hx::Val( isBlocked__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getMessagesAfter") ) { return ::hx::Val( getMessagesAfter_dyn() ); }
+		if (HX_FIELD_EQ(inName,"getMemberDetails") ) { return ::hx::Val( getMemberDetails_dyn() ); }
 		if (HX_FIELD_EQ(inName,"setNotifications") ) { return ::hx::Val( setNotifications_dyn() ); }
 		if (HX_FIELD_EQ(inName,"updateFromRoster") ) { return ::hx::Val( updateFromRoster_dyn() ); }
+		if (HX_FIELD_EQ(inName,"setThreadSubject") ) { return ::hx::Val( setThreadSubject_dyn() ); }
 		break;
 	case 17:
 		if (HX_FIELD_EQ(inName,"getMessagesBefore") ) { return ::hx::Val( getMessagesBefore_dyn() ); }
@@ -2511,11 +2626,9 @@ void Chat_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 20:
 		if (HX_FIELD_EQ(inName,"notificationSettings") ) { return ::hx::Val( notificationSettings ); }
-		if (HX_FIELD_EQ(inName,"lastMessageId__fromC") ) { return ::hx::Val( lastMessageId__fromC_dyn() ); }
 		break;
 	case 21:
 		if (HX_FIELD_EQ(inName,"omemoContactDeviceIDs") ) { return ::hx::Val( omemoContactDeviceIDs ); }
-		if (HX_FIELD_EQ(inName,"getParticipantDetails") ) { return ::hx::Val( getParticipantDetails_dyn() ); }
 		if (HX_FIELD_EQ(inName,"correctMessage__fromC") ) { return ::hx::Val( correctMessage__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"removeReaction__fromC") ) { return ::hx::Val( removeReaction__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"notificationsFiltered") ) { return ::hx::Val( notificationsFiltered_dyn() ); }
@@ -2526,8 +2639,8 @@ void Chat_obj::__Visit(HX_VISIT_PARAMS)
 	case 24:
 		if (HX_FIELD_EQ(inName,"setNotificationsInternal") ) { return ::hx::Val( setNotificationsInternal_dyn() ); }
 		break;
-	case 28:
-		if (HX_FIELD_EQ(inName,"getParticipantDetails__fromC") ) { return ::hx::Val( getParticipantDetails__fromC_dyn() ); }
+	case 25:
+		if (HX_FIELD_EQ(inName,"addMembersUpdatedListener") ) { return ::hx::Val( addMembersUpdatedListener_dyn() ); }
 	}
 	return super::__Field(inName,inCallProp);
 }
@@ -2538,15 +2651,16 @@ void Chat_obj::__Visit(HX_VISIT_PARAMS)
 	case 6:
 		if (HX_FIELD_EQ(inName,"client") ) { client=inValue.Cast<  ::borogove::Client >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"stream") ) { stream=inValue.Cast<  ::borogove::GenericStream >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"status") ) { status=inValue.Cast<  ::borogove::Status >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"chatId") ) { chatId=inValue.Cast< ::String >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"outbox") ) { outbox=inValue.Cast<  ::borogove::Outbox >(); return inValue; }
 		break;
 	case 7:
 		if (HX_FIELD_EQ(inName,"trusted") ) { trusted=inValue.Cast< bool >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"uiState") ) { uiState=inValue.Cast< int >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"threads") ) { threads=inValue.Cast<  ::haxe::ds::StringMap >(); return inValue; }
 		break;
 	case 8:
-		if (HX_FIELD_EQ(inName,"presence") ) { presence=inValue.Cast<  ::haxe::ds::StringMap >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"isTyping") ) { isTyping=inValue.Cast< bool >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"isActive") ) { isActive=inValue.Cast<  ::Dynamic >(); return inValue; }
 		break;
@@ -2592,8 +2706,8 @@ void Chat_obj::__GetFields(Array< ::String> &outFields)
 	outFields->push(HX_("stream",80,14,2d,11));
 	outFields->push(HX_("persistence",5f,17,c4,f6));
 	outFields->push(HX_("avatarSha1",3e,f5,cc,3e));
-	outFields->push(HX_("presence",3b,52,d7,66));
 	outFields->push(HX_("trusted",f7,b7,a6,16));
+	outFields->push(HX_("status",32,e7,fb,05));
 	outFields->push(HX_("chatId",d3,04,77,b7));
 	outFields->push(HX_("jingleSessions",ae,50,4d,15));
 	outFields->push(HX_("displayName",ad,11,f2,30));
@@ -2605,6 +2719,7 @@ void Chat_obj::__GetFields(Array< ::String> &outFields)
 	outFields->push(HX_("_unreadCount",21,c6,fa,06));
 	outFields->push(HX_("readUpToId",27,7a,f8,75));
 	outFields->push(HX_("readUpToBy",23,74,f8,75));
+	outFields->push(HX_("threads",69,f6,91,53));
 	outFields->push(HX_("isTyping",01,9a,a3,af));
 	outFields->push(HX_("typingThread",a1,a0,94,6b));
 	outFields->push(HX_("typingTimer",ce,61,a8,b7));
@@ -2623,8 +2738,8 @@ static ::hx::StorageInfo Chat_obj_sMemberStorageInfo[] = {
 	{::hx::fsObject /*  ::borogove::GenericStream */ ,(int)offsetof(Chat_obj,stream),HX_("stream",80,14,2d,11)},
 	{::hx::fsObject /* ::Dynamic */ ,(int)offsetof(Chat_obj,persistence),HX_("persistence",5f,17,c4,f6)},
 	{::hx::fsObject /* ::Array< unsigned char > */ ,(int)offsetof(Chat_obj,avatarSha1),HX_("avatarSha1",3e,f5,cc,3e)},
-	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(Chat_obj,presence),HX_("presence",3b,52,d7,66)},
 	{::hx::fsBool,(int)offsetof(Chat_obj,trusted),HX_("trusted",f7,b7,a6,16)},
+	{::hx::fsObject /*  ::borogove::Status */ ,(int)offsetof(Chat_obj,status),HX_("status",32,e7,fb,05)},
 	{::hx::fsString,(int)offsetof(Chat_obj,chatId),HX_("chatId",d3,04,77,b7)},
 	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(Chat_obj,jingleSessions),HX_("jingleSessions",ae,50,4d,15)},
 	{::hx::fsString,(int)offsetof(Chat_obj,displayName),HX_("displayName",ad,11,f2,30)},
@@ -2636,6 +2751,7 @@ static ::hx::StorageInfo Chat_obj_sMemberStorageInfo[] = {
 	{::hx::fsInt,(int)offsetof(Chat_obj,_unreadCount),HX_("_unreadCount",21,c6,fa,06)},
 	{::hx::fsString,(int)offsetof(Chat_obj,readUpToId),HX_("readUpToId",27,7a,f8,75)},
 	{::hx::fsString,(int)offsetof(Chat_obj,readUpToBy),HX_("readUpToBy",23,74,f8,75)},
+	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(Chat_obj,threads),HX_("threads",69,f6,91,53)},
 	{::hx::fsBool,(int)offsetof(Chat_obj,isTyping),HX_("isTyping",01,9a,a3,af)},
 	{::hx::fsString,(int)offsetof(Chat_obj,typingThread),HX_("typingThread",a1,a0,94,6b)},
 	{::hx::fsObject /*  ::haxe::Timer */ ,(int)offsetof(Chat_obj,typingTimer),HX_("typingTimer",ce,61,a8,b7)},
@@ -2655,8 +2771,9 @@ static ::String Chat_obj_sMemberFields[] = {
 	HX_("stream",80,14,2d,11),
 	HX_("persistence",5f,17,c4,f6),
 	HX_("avatarSha1",3e,f5,cc,3e),
-	HX_("presence",3b,52,d7,66),
 	HX_("trusted",f7,b7,a6,16),
+	HX_("status",32,e7,fb,05),
+	HX_("status__fromC",87,b3,25,a1),
 	HX_("chatId",d3,04,77,b7),
 	HX_("chatId__fromC",06,fc,b1,94),
 	HX_("jingleSessions",ae,50,4d,15),
@@ -2673,6 +2790,7 @@ static ::String Chat_obj_sMemberFields[] = {
 	HX_("_unreadCount",21,c6,fa,06),
 	HX_("readUpToId",27,7a,f8,75),
 	HX_("readUpToBy",23,74,f8,75),
+	HX_("threads",69,f6,91,53),
 	HX_("isTyping",01,9a,a3,af),
 	HX_("typingThread",a1,a0,94,6b),
 	HX_("typingTimer",ce,61,a8,b7),
@@ -2694,11 +2812,16 @@ static ::String Chat_obj_sMemberFields[] = {
 	HX_("markReadUpTo__fromC",40,b5,45,b3),
 	HX_("bookmark",b6,8c,f1,32),
 	HX_("bookmark__fromC",83,86,61,2e),
-	HX_("getParticipants",16,0b,c7,34),
-	HX_("getParticipantDetails",85,2b,7d,4d),
-	HX_("getParticipantDetails__fromC",94,ef,6f,ad),
+	HX_("members",d9,2c,70,1a),
+	HX_("getMemberDetails",12,2b,2f,b3),
+	HX_("addMembersUpdatedListener",f7,ef,7a,06),
+	HX_("availableRoles",b4,19,02,0f),
+	HX_("canRemoveRole",0a,52,0a,02),
+	HX_("addRole",37,2e,ec,87),
+	HX_("removeRole",da,25,ce,c8),
 	HX_("correctMessage",7d,36,c3,f4),
 	HX_("correctMessage__fromC",9c,b3,3d,7c),
+	HX_("moderate",c3,13,16,d1),
 	HX_("addReaction",ea,1e,11,28),
 	HX_("removeReaction",0d,24,0b,c1),
 	HX_("removeReaction__fromC",0c,98,dd,b6),
@@ -2715,8 +2838,6 @@ static ::String Chat_obj_sMemberFields[] = {
 	HX_("notificationsFiltered",5f,11,ed,96),
 	HX_("notifyMention",21,c7,22,5a),
 	HX_("notifyReply",a1,e5,9f,37),
-	HX_("lastMessageId",4c,90,58,27),
-	HX_("lastMessageId__fromC",ad,c1,bf,bf),
 	HX_("updateFromBookmark",e9,a3,15,4b),
 	HX_("updateFromRoster",fe,41,b5,57),
 	HX_("getPhoto",3c,d8,ca,21),
@@ -2728,11 +2849,10 @@ static ::String Chat_obj_sMemberFields[] = {
 	HX_("setLastMessage",8f,25,7b,f6),
 	HX_("setDisplayName",2b,4d,b0,d8),
 	HX_("getDisplayName",b7,64,90,b8),
+	HX_("getTags",8f,64,79,1f),
+	HX_("setThreadSubject",00,93,d3,8d),
 	HX_("setPresence",fd,1b,38,97),
-	HX_("setCaps",e3,5c,3e,07),
-	HX_("removePresence",9f,8e,2d,31),
 	HX_("getCaps",d7,cb,3c,14),
-	HX_("getResourceCaps",c5,79,07,ac),
 	HX_("setAvatarSha1",80,33,45,e0),
 	HX_("setTrusted",75,dc,85,69),
 	HX_("isTrusted",2d,35,a5,1a),
@@ -2749,6 +2869,7 @@ static ::String Chat_obj_sMemberFields[] = {
 	HX_("videoTracks",63,c2,24,be),
 	HX_("encryptionMode",86,d9,0f,a8),
 	HX_("canSend",78,75,a8,6a),
+	HX_("canModerate",f3,d3,bd,00),
 	HX_("invite",c9,f1,db,9f),
 	HX_("canInvite",f9,45,22,f2),
 	HX_("isApp",d7,26,48,c1),
@@ -2787,76 +2908,94 @@ void Chat_obj::__register()
 void Chat_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_62_boot)
-HXDLIN(  62)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(34)
-            				->setFixed(0,HX_("getParticipants__fromC",23,94,42,88), ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_9cc1265c56ba593e_111_boot)
+HXDLIN( 111)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(43)
+            				->setFixed(0,HX_("getMemberDetails__fromC",a7,ab,54,90), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
             				->setFixed(1,HX_("chatId__fromC",06,fc,b1,94), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
             				->setFixed(2,HX_("lastMessage__fromC",88,5a,5a,9a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(3,HX_("getParticipantDetails__fromC",94,ef,6f,ad), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(3,HX_("status__fromC",87,b3,25,a1), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(4,HX_("markReadUpTo__fromC",40,b5,45,b3), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(4,HX_("readUpTo__fromC",cd,d6,95,a2), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(5,HX_("commands__fromC",b1,e8,15,b5), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(5,HX_("invitedBy__fromC",87,ad,4d,aa), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(6,HX_("removeReaction__fromC",0c,98,dd,b6), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(6,HX_("members__fromC",c0,80,dc,ab), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(7,HX_("videoTracks",63,c2,24,be), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(7,HX_("getMemberDetails",12,2b,2f,b3), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(8,HX_("commands",c8,b0,55,be), ::Dynamic(::hx::Anon_obj::Create(1)
-            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(9,HX_("uiState__fromC",fc,2e,72,be), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(8,HX_("markReadUpTo__fromC",40,b5,45,b3), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(9,HX_("commands__fromC",b1,e8,15,b5), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(10,HX_("lastMessageId__fromC",ad,c1,bf,bf), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(10,HX_("removeReaction__fromC",0c,98,dd,b6), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(11,HX_("removeReaction",0d,24,0b,c1), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(11,HX_("videoTracks",63,c2,24,be), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(12,HX_("getMessagesAfter__fromC",7f,68,c7,c6), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(12,HX_("commands",c8,b0,55,be), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
+            				->setFixed(13,HX_("uiState__fromC",fc,2e,72,be), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(14,HX_("removeReaction",0d,24,0b,c1), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
+            				->setFixed(15,HX_("getMessagesAfter__fromC",7f,68,c7,c6), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(16,HX_("getTags__fromC",ca,4b,55,ca), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(17,HX_("isBookmarked__fromC",3a,fb,14,ce), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(13,HX_("isBookmarked__fromC",3a,fb,14,ce), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(18,HX_("addMembersUpdatedListener__fromC",62,7d,e9,d5), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(14,HX_("videoTracks__fromC",76,10,46,d8), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(19,HX_("videoTracks__fromC",76,10,46,d8), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(15,HX_("getMessagesAround__fromC",ea,f6,e1,db), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(20,HX_("getMessagesAround__fromC",ea,f6,e1,db), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(16,HX_("markReadUpTo",59,68,2d,ee), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(21,HX_("markReadUpTo",59,68,2d,ee), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(17,HX_("close__fromC",c1,3f,6c,ef), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(22,HX_("close__fromC",c1,3f,6c,ef), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(18,HX_("sendMessage__fromC",fa,60,3a,f3), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(23,HX_("sendMessage__fromC",fa,60,3a,f3), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(19,HX_("correctMessage",7d,36,c3,f4), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(24,HX_("correctMessage",7d,36,c3,f4), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(20,HX_("isBlocked__fromC",97,a0,b1,f6), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(25,HX_("isBlocked__fromC",97,a0,b1,f6), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(21,HX_("getMessagesBefore",a1,f1,44,11), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(26,HX_("addMembersUpdatedListener",f7,ef,7a,06), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(22,HX_("sendMessage",5f,89,1d,24), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(27,HX_("availableRoles",b4,19,02,0f), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(23,HX_("lastMessageId",4c,90,58,27), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(28,HX_("getMessagesBefore",a1,f1,44,11), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(24,HX_("getMessagesAround",6f,95,16,2d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(29,HX_("members",d9,2c,70,1a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(25,HX_("bookmark__fromC",83,86,61,2e), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(30,HX_("getTags",8f,64,79,1f), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
+            				->setFixed(31,HX_("sendMessage",5f,89,1d,24), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
+            				->setFixed(32,HX_("getMessagesAround",6f,95,16,2d), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
+            				->setFixed(33,HX_("bookmark__fromC",83,86,61,2e), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(26,HX_("bookmark",b6,8c,f1,32), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(34,HX_("bookmark",b6,8c,f1,32), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(27,HX_("getParticipants",16,0b,c7,34), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(35,HX_("getMessagesBefore__fromC",f8,64,51,46), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(36,HX_("close",b8,17,63,48), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(28,HX_("getMessagesBefore__fromC",f8,64,51,46), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(37,HX_("availableRoles__fromC",45,b5,c7,4a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(29,HX_("close",b8,17,63,48), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(38,HX_("invitedBy",32,ad,98,4c), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(30,HX_("getParticipantDetails",85,2b,7d,4d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(39,HX_("getMessagesAfter",3a,43,91,57), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(31,HX_("getMessagesAfter",3a,43,91,57), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(40,HX_("readUpTo",2c,17,a3,75), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(32,HX_("correctMessage__fromC",9c,b3,3d,7c), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(41,HX_("correctMessage__fromC",9c,b3,3d,7c), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(33,HX_("addMedia",03,2b,19,7f), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(42,HX_("addMedia",03,2b,19,7f), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null()))))));
             	}
 }
diff --git a/Sources/c_borogove/src/borogove/ChatAttachment.cpp b/Sources/c_borogove/src/borogove/ChatAttachment.cpp
index e789bc7..330cea2 100644
--- a/Sources/c_borogove/src/borogove/ChatAttachment.cpp
+++ b/Sources/c_borogove/src/borogove/ChatAttachment.cpp
@@ -17,23 +17,23 @@
 #include <haxe/IMap.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_eade94af8cfe154e_60_new,"borogove.ChatAttachment","new",0x0991249a,"borogove.ChatAttachment.new","borogove/ChatMessage.hx",60,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_824d5e0f7ace9ae5_450_name__fromC,"borogove.ChatAttachment","name__fromC",0x1dc9cbc8,"borogove.ChatAttachment.name__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_824d5e0f7ace9ae5_450_mime__fromC,"borogove.ChatAttachment","mime__fromC",0x9f3f1f7f,"borogove.ChatAttachment.mime__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_824d5e0f7ace9ae5_450_size__fromC,"borogove.ChatAttachment","size__fromC",0x5ab7f812,"borogove.ChatAttachment.size__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_824d5e0f7ace9ae5_424_uris__fromC,"borogove.ChatAttachment","uris__fromC",0x3dcd4a0c,"borogove.ChatAttachment.uris__fromC","HaxeCBridge.hx",424,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_824d5e0f7ace9ae5_424_hashes__fromC,"borogove.ChatAttachment","hashes__fromC",0xa2cd28f7,"borogove.ChatAttachment.hashes__fromC","HaxeCBridge.hx",424,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_eade94af8cfe154e_78_create,"borogove.ChatAttachment","create",0xc334f302,"borogove.ChatAttachment.create","borogove/ChatMessage.hx",78,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_eade94af8cfe154e_32_boot,"borogove.ChatAttachment","boot",0x4d87e2b8,"borogove.ChatAttachment.boot","borogove/ChatMessage.hx",32,0xe4a3cadd)
+HX_DEFINE_STACK_FRAME(_hx_pos_eade94af8cfe154e_85_new,"borogove.ChatAttachment","new",0x0991249a,"borogove.ChatAttachment.new","borogove/ChatMessage.hx",85,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_824d5e0f7ace9ae5_478_name__fromC,"borogove.ChatAttachment","name__fromC",0x1dc9cbc8,"borogove.ChatAttachment.name__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_824d5e0f7ace9ae5_478_mime__fromC,"borogove.ChatAttachment","mime__fromC",0x9f3f1f7f,"borogove.ChatAttachment.mime__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_824d5e0f7ace9ae5_478_size__fromC,"borogove.ChatAttachment","size__fromC",0x5ab7f812,"borogove.ChatAttachment.size__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_824d5e0f7ace9ae5_452_uris__fromC,"borogove.ChatAttachment","uris__fromC",0x3dcd4a0c,"borogove.ChatAttachment.uris__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_824d5e0f7ace9ae5_452_hashes__fromC,"borogove.ChatAttachment","hashes__fromC",0xa2cd28f7,"borogove.ChatAttachment.hashes__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_eade94af8cfe154e_103_create,"borogove.ChatAttachment","create",0xc334f302,"borogove.ChatAttachment.create","borogove/ChatMessage.hx",103,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_eade94af8cfe154e_57_boot,"borogove.ChatAttachment","boot",0x4d87e2b8,"borogove.ChatAttachment.boot","borogove/ChatMessage.hx",57,0xe4a3cadd)
 namespace borogove{
 
 void ChatAttachment_obj::__construct(::String name,::String mime, ::Dynamic size,::Array< ::String > uris,::Array< ::Dynamic> hashes){
-            	HX_STACKFRAME(&_hx_pos_eade94af8cfe154e_60_new)
-HXLINE(  61)		this->name = name;
-HXLINE(  62)		this->mime = mime;
-HXLINE(  63)		this->size = size;
-HXLINE(  64)		this->uris = uris;
-HXLINE(  65)		this->hashes = hashes;
+            	HX_STACKFRAME(&_hx_pos_eade94af8cfe154e_85_new)
+HXLINE(  86)		this->name = name;
+HXLINE(  87)		this->mime = mime;
+HXLINE(  88)		this->size = size;
+HXLINE(  89)		this->uris = uris;
+HXLINE(  90)		this->hashes = hashes;
             	}
 
 Dynamic ChatAttachment_obj::__CreateEmpty() { return new ChatAttachment_obj; }
@@ -52,143 +52,143 @@ bool ChatAttachment_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String ChatAttachment_obj::name__fromC(){
-            	HX_STACKFRAME(&_hx_pos_824d5e0f7ace9ae5_450_name__fromC)
-HXDLIN( 450)		return this->name;
+            	HX_STACKFRAME(&_hx_pos_824d5e0f7ace9ae5_478_name__fromC)
+HXDLIN( 478)		return this->name;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatAttachment_obj,name__fromC,return )
 
 ::String ChatAttachment_obj::mime__fromC(){
-            	HX_STACKFRAME(&_hx_pos_824d5e0f7ace9ae5_450_mime__fromC)
-HXDLIN( 450)		return this->mime;
+            	HX_STACKFRAME(&_hx_pos_824d5e0f7ace9ae5_478_mime__fromC)
+HXDLIN( 478)		return this->mime;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatAttachment_obj,mime__fromC,return )
 
  ::Dynamic ChatAttachment_obj::size__fromC(){
-            	HX_STACKFRAME(&_hx_pos_824d5e0f7ace9ae5_450_size__fromC)
-HXDLIN( 450)		return this->size;
+            	HX_STACKFRAME(&_hx_pos_824d5e0f7ace9ae5_478_size__fromC)
+HXDLIN( 478)		return this->size;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatAttachment_obj,size__fromC,return )
 
 size_t ChatAttachment_obj::uris__fromC(const char*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_824d5e0f7ace9ae5_424_uris__fromC)
-HXDLIN( 424)		::Array< ::String > x = this->uris;
-HXDLIN( 424)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 424)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 424)			::Array< ::String > x1 = x;
-HXDLIN( 424)			::Array< size_t > arr = ::Array_obj< size_t >::__new(x1->length);
-HXDLIN( 424)			{
-HXDLIN( 424)				int _g_current = 0;
-HXDLIN( 424)				::Array< ::String > _g_array = x1;
-HXDLIN( 424)				while((_g_current < _g_array->length)){
-HXDLIN( 424)					::String _g_value = _g_array->__get(_g_current);
-HXDLIN( 424)					_g_current = (_g_current + 1);
-HXDLIN( 424)					::String el = _g_value;
-HXDLIN( 424)					{
-HXDLIN( 424)						const char* cStrPtr = el.utf8_str();
-HXDLIN( 424)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 424)						{
-HXDLIN( 424)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 424)							if (::hx::IsNull( store )) {
-HXLINE(2243)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_824d5e0f7ace9ae5_452_uris__fromC)
+HXDLIN( 452)		::Array< ::String > x = this->uris;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			::Array< ::String > x1 = x;
+HXDLIN( 452)			::Array< size_t > arr = ::Array_obj< size_t >::__new(x1->length);
+HXDLIN( 452)			{
+HXDLIN( 452)				int _g_current = 0;
+HXDLIN( 452)				::Array< ::String > _g_array = x1;
+HXDLIN( 452)				while((_g_current < _g_array->length)){
+HXDLIN( 452)					::String _g_value = _g_array->__get(_g_current);
+HXDLIN( 452)					_g_current = (_g_current + 1);
+HXDLIN( 452)					::String el = _g_value;
+HXDLIN( 452)					{
+HXDLIN( 452)						const char* cStrPtr = el.utf8_str();
+HXDLIN( 452)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
+HXDLIN( 452)						{
+HXDLIN( 452)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 452)							if (::hx::IsNull( store )) {
+HXLINE(2390)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
             									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             									->setFixed(1,HX_("value",71,7f,b8,31),el));
-HXLINE( 424)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXLINE( 452)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             							}
             							else {
-HXDLIN( 424)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXDLIN( 452)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             							}
             						}
-HXDLIN( 424)						const char* ptr = cStrPtr;
-HXDLIN( 424)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
+HXDLIN( 452)						const char* ptr = cStrPtr;
+HXDLIN( 452)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
             					}
             				}
             			}
-HXDLIN( 424)			void** ptr1 = (void**)arr->getBase();
-HXDLIN( 424)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 424)			{
-HXDLIN( 424)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 424)				if (::hx::IsNull( store1 )) {
-HXLINE(2243)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+HXDLIN( 452)			void** ptr1 = (void**)arr->getBase();
+HXDLIN( 452)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
+HXDLIN( 452)			{
+HXDLIN( 452)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN( 452)				if (::hx::IsNull( store1 )) {
+HXLINE(2390)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),arr));
-HXLINE( 424)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+HXLINE( 452)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
             				}
             				else {
-HXDLIN( 424)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXDLIN( 452)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXDLIN( 424)			_hx_tmp->set_ref(( (const char**)(ptr1) ));
+HXDLIN( 452)			_hx_tmp->set_ref(( (const char**)(ptr1) ));
             		}
-HXDLIN( 424)		return ( (size_t)(x->length) );
+HXDLIN( 452)		return ( (size_t)(x->length) );
             	}
 
 
 size_t ChatAttachment_obj::hashes__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_824d5e0f7ace9ae5_424_hashes__fromC)
-HXDLIN( 424)		::Array< ::Dynamic> x = this->hashes;
-HXDLIN( 424)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 424)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 424)			::Array< ::Dynamic> x1 = x;
-HXDLIN( 424)			{
-HXDLIN( 424)				int _g = 0;
-HXDLIN( 424)				while((_g < x1->length)){
-HXDLIN( 424)					 ::borogove::Hash el = x1->__get(_g).StaticCast<  ::borogove::Hash >();
-HXDLIN( 424)					_g = (_g + 1);
-HXDLIN( 424)					{
-HXDLIN( 424)						 ::Dynamic haxeObject = el;
-HXDLIN( 424)						void* ptr = haxeObject.mPtr;
-HXDLIN( 424)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 424)						{
-HXDLIN( 424)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 424)							if (::hx::IsNull( store )) {
-HXDLIN( 424)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_824d5e0f7ace9ae5_452_hashes__fromC)
+HXDLIN( 452)		::Array< ::Dynamic> x = this->hashes;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			::Array< ::Dynamic> x1 = x;
+HXDLIN( 452)			{
+HXDLIN( 452)				int _g = 0;
+HXDLIN( 452)				while((_g < x1->length)){
+HXDLIN( 452)					 ::borogove::Hash el = x1->__get(_g).StaticCast<  ::borogove::Hash >();
+HXDLIN( 452)					_g = (_g + 1);
+HXDLIN( 452)					{
+HXDLIN( 452)						 ::Dynamic haxeObject = el;
+HXDLIN( 452)						void* ptr = haxeObject.mPtr;
+HXDLIN( 452)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 452)						{
+HXDLIN( 452)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 452)							if (::hx::IsNull( store )) {
+HXDLIN( 452)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
             									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 424)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 452)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             							}
             							else {
-HXDLIN( 424)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXDLIN( 452)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             							}
             						}
             					}
             				}
             			}
-HXDLIN( 424)			void** ptr1 = (void**)x1->getBase();
-HXDLIN( 424)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 424)			{
-HXDLIN( 424)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 424)				if (::hx::IsNull( store1 )) {
-HXDLIN( 424)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+HXDLIN( 452)			void** ptr1 = (void**)x1->getBase();
+HXDLIN( 452)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
+HXDLIN( 452)			{
+HXDLIN( 452)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN( 452)				if (::hx::IsNull( store1 )) {
+HXDLIN( 452)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),x1));
-HXDLIN( 424)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+HXDLIN( 452)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
             				}
             				else {
-HXDLIN( 424)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXDLIN( 452)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXDLIN( 424)			_hx_tmp->set_ref(ptr1);
+HXDLIN( 452)			_hx_tmp->set_ref(ptr1);
             		}
-HXDLIN( 424)		return ( (size_t)(x->length) );
+HXDLIN( 452)		return ( (size_t)(x->length) );
             	}
 
 
  ::borogove::ChatAttachment ChatAttachment_obj::create(::String name,::String mime,int size,::String uri){
-            	HX_GC_STACKFRAME(&_hx_pos_eade94af8cfe154e_78_create)
-HXDLIN(  78)		 ::Dynamic _hx_tmp;
-HXDLIN(  78)		if ((size > 0)) {
-HXDLIN(  78)			_hx_tmp = size;
+            	HX_GC_STACKFRAME(&_hx_pos_eade94af8cfe154e_103_create)
+HXDLIN( 103)		 ::Dynamic _hx_tmp;
+HXDLIN( 103)		if ((size > 0)) {
+HXDLIN( 103)			_hx_tmp = size;
             		}
             		else {
-HXDLIN(  78)			_hx_tmp = null();
+HXDLIN( 103)			_hx_tmp = null();
             		}
-HXDLIN(  78)		return  ::borogove::ChatAttachment_obj::__alloc( HX_CTX ,name,mime,_hx_tmp,::Array_obj< ::String >::__new(1)->init(0,uri),::Array_obj< ::Dynamic>::__new(0));
+HXDLIN( 103)		return  ::borogove::ChatAttachment_obj::__alloc( HX_CTX ,name,mime,_hx_tmp,::Array_obj< ::String >::__new(1)->init(0,uri),::Array_obj< ::Dynamic>::__new(0));
             	}
 
 
@@ -342,8 +342,8 @@ void ChatAttachment_obj::__register()
 void ChatAttachment_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_eade94af8cfe154e_32_boot)
-HXDLIN(  32)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_eade94af8cfe154e_57_boot)
+HXDLIN(  57)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(5)
             				->setFixed(0,HX_("mime__fromC",45,01,dc,8f), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
diff --git a/Sources/c_borogove/src/borogove/ChatMessage.cpp b/Sources/c_borogove/src/borogove/ChatMessage.cpp
index 9f2c567..b93900c 100644
--- a/Sources/c_borogove/src/borogove/ChatMessage.cpp
+++ b/Sources/c_borogove/src/borogove/ChatMessage.cpp
@@ -16,9 +16,21 @@
 #ifndef INCLUDED_StringTools
 #include <StringTools.h>
 #endif
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_HaxeStringArray_Impl_
+#include <_HaxeCBridge/HaxeStringArray_Impl_.h>
+#endif
 #ifndef INCLUDED__HaxeCBridge_Internal
 #include <_HaxeCBridge/Internal.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
+#ifndef INCLUDED_borogove_AvailableChat
+#include <borogove/AvailableChat.h>
+#endif
 #ifndef INCLUDED_borogove_ChatAttachment
 #include <borogove/ChatAttachment.h>
 #endif
@@ -37,8 +49,8 @@
 #ifndef INCLUDED_borogove_Hash
 #include <borogove/Hash.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED_borogove_Html
+#include <borogove/Html.h>
 #endif
 #ifndef INCLUDED_borogove_Identicon
 #include <borogove/Identicon.h>
@@ -46,6 +58,12 @@
 #ifndef INCLUDED_borogove_JID
 #include <borogove/JID.h>
 #endif
+#ifndef INCLUDED_borogove_LinkMetadata
+#include <borogove/LinkMetadata.h>
+#endif
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
+#endif
 #ifndef INCLUDED_borogove_Message
 #include <borogove/Message.h>
 #endif
@@ -55,12 +73,12 @@
 #ifndef INCLUDED_borogove_Node
 #include <borogove/Node.h>
 #endif
-#ifndef INCLUDED_borogove_Participant
-#include <borogove/Participant.h>
-#endif
 #ifndef INCLUDED_borogove_Reaction
 #include <borogove/Reaction.h>
 #endif
+#ifndef INCLUDED_borogove_Role
+#include <borogove/Role.h>
+#endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
@@ -70,9 +88,6 @@
 #ifndef INCLUDED_borogove_XEP0393
 #include <borogove/XEP0393.h>
 #endif
-#ifndef INCLUDED_borogove__Util_Util_Fields_
-#include <borogove/_Util/Util_Fields_.h>
-#endif
 #ifndef INCLUDED_cpp_Int64Map
 #include <cpp/Int64Map.h>
 #endif
@@ -100,164 +115,179 @@
 #ifndef INCLUDED_haxe_io_Bytes
 #include <haxe/io/Bytes.h>
 #endif
+#ifndef INCLUDED_haxe_io_Encoding
+#include <haxe/io/Encoding.h>
+#endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_20f00185d7354fd9_245_new,"borogove.ChatMessage","new",0x63820ad4,"borogove.ChatMessage.new","borogove/ChatMessage.hx",245,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_450_localId__fromC,"borogove.ChatMessage","localId__fromC",0x08ebd91f,"borogove.ChatMessage.localId__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_450_serverId__fromC,"borogove.ChatMessage","serverId__fromC",0x2996d32f,"borogove.ChatMessage.serverId__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_450_serverIdBy__fromC,"borogove.ChatMessage","serverIdBy__fromC",0xde126f98,"borogove.ChatMessage.serverIdBy__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_450_type__fromC,"borogove.ChatMessage","type__fromC",0x1bc87773,"borogove.ChatMessage.type__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_450_timestamp__fromC,"borogove.ChatMessage","timestamp__fromC",0x0b0acf6f,"borogove.ChatMessage.timestamp__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_450_senderId__fromC,"borogove.ChatMessage","senderId__fromC",0x731f27fd,"borogove.ChatMessage.senderId__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_398_replyToMessage__fromC,"borogove.ChatMessage","replyToMessage__fromC",0x9a6a4d2b,"borogove.ChatMessage.replyToMessage__fromC","HaxeCBridge.hx",398,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_450_threadId__fromC,"borogove.ChatMessage","threadId__fromC",0x2157ea48,"borogove.ChatMessage.threadId__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_424_attachments__fromC,"borogove.ChatMessage","attachments__fromC",0x5cad7f55,"borogove.ChatMessage.attachments__fromC","HaxeCBridge.hx",424,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_385_reactionKeys__fromC,"borogove.ChatMessage","reactionKeys__fromC",0x298e4650,"borogove.ChatMessage.reactionKeys__fromC","HaxeCBridge.hx",385,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_164_get_reactionKeys,"borogove.ChatMessage","get_reactionKeys",0xa96ab7d2,"borogove.ChatMessage.get_reactionKeys","borogove/ChatMessage.hx",164,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_171_reactionDetails,"borogove.ChatMessage","reactionDetails",0x6f916c8d,"borogove.ChatMessage.reactionDetails","borogove/ChatMessage.hx",171,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_335_reactionDetails__fromC,"borogove.ChatMessage","reactionDetails__fromC",0x4e695f8c,"borogove.ChatMessage.reactionDetails__fromC","HaxeCBridge.hx",335,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_450_text__fromC,"borogove.ChatMessage","text__fromC",0x077711e0,"borogove.ChatMessage.text__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_450_lang__fromC,"borogove.ChatMessage","lang__fromC",0xda5bf2bf,"borogove.ChatMessage.lang__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_450_direction__fromC,"borogove.ChatMessage","direction__fromC",0x7f45b126,"borogove.ChatMessage.direction__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_450_status__fromC,"borogove.ChatMessage","status__fromC",0xd2e906fb,"borogove.ChatMessage.status__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_450_statusText__fromC,"borogove.ChatMessage","statusText__fromC",0x6864dace,"borogove.ChatMessage.statusText__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_424_versions__fromC,"borogove.ChatMessage","versions__fromC",0xbcbe8bf2,"borogove.ChatMessage.versions__fromC","HaxeCBridge.hx",424,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_450_encryption__fromC,"borogove.ChatMessage","encryption__fromC",0xe59a97ca,"borogove.ChatMessage.encryption__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_286_reply,"borogove.ChatMessage","reply",0x1dcec89e,"borogove.ChatMessage.reply","borogove/ChatMessage.hx",286,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_295_getReplyId,"borogove.ChatMessage","getReplyId",0xd1e4a9bb,"borogove.ChatMessage.getReplyId","borogove/ChatMessage.hx",295,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_301_set_replyToMessage,"borogove.ChatMessage","set_replyToMessage",0xaa5f8a4b,"borogove.ChatMessage.set_replyToMessage","borogove/ChatMessage.hx",301,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_310_set_reactions,"borogove.ChatMessage","set_reactions",0x1fc2d601,"borogove.ChatMessage.set_reactions","borogove/ChatMessage.hx",310,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_311_set_reactions,"borogove.ChatMessage","set_reactions",0x1fc2d601,"borogove.ChatMessage.set_reactions","borogove/ChatMessage.hx",311,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_318_inlineHashReferences,"borogove.ChatMessage","inlineHashReferences",0x3ddc36fb,"borogove.ChatMessage.inlineHashReferences","borogove/ChatMessage.hx",318,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_316_inlineHashReferences,"borogove.ChatMessage","inlineHashReferences",0x3ddc36fb,"borogove.ChatMessage.inlineHashReferences","borogove/ChatMessage.hx",316,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_320_inlineHashReferences,"borogove.ChatMessage","inlineHashReferences",0x3ddc36fb,"borogove.ChatMessage.inlineHashReferences","borogove/ChatMessage.hx",320,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_347_html,"borogove.ChatMessage","html",0xaa5b8077,"borogove.ChatMessage.html","borogove/ChatMessage.hx",347,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_346_html,"borogove.ChatMessage","html",0xaa5b8077,"borogove.ChatMessage.html","borogove/ChatMessage.hx",346,0xe4a3cadd)
-static const bool _hx_array_data_424f50e2_43[] = {
-	0,
-};
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_351_html,"borogove.ChatMessage","html",0xaa5b8077,"borogove.ChatMessage.html","borogove/ChatMessage.hx",351,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_387_html,"borogove.ChatMessage","html",0xaa5b8077,"borogove.ChatMessage.html","borogove/ChatMessage.hx",387,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_392_html,"borogove.ChatMessage","html",0xaa5b8077,"borogove.ChatMessage.html","borogove/ChatMessage.hx",392,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_401_chatId,"borogove.ChatMessage","chatId",0xa815cadf,"borogove.ChatMessage.chatId","borogove/ChatMessage.hx",401,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_412_account,"borogove.ChatMessage","account",0x3ba88121,"borogove.ChatMessage.account","borogove/ChatMessage.hx",412,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_419_isIncoming,"borogove.ChatMessage","isIncoming",0x6d0d0efc,"borogove.ChatMessage.isIncoming","borogove/ChatMessage.hx",419,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_426_threadIcon,"borogove.ChatMessage","threadIcon",0x18c4776f,"borogove.ChatMessage.threadIcon","borogove/ChatMessage.hx",426,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_433_callStatus,"borogove.ChatMessage","callStatus",0x08747a7c,"borogove.ChatMessage.callStatus","borogove/ChatMessage.hx",433,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_440_callSid,"borogove.ChatMessage","callSid",0xeea27984,"borogove.ChatMessage.callSid","borogove/ChatMessage.hx",440,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_446_callDuration,"borogove.ChatMessage","callDuration",0x14c9891e,"borogove.ChatMessage.callDuration","borogove/ChatMessage.hx",446,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_470_asStanza,"borogove.ChatMessage","asStanza",0xff32c993,"borogove.ChatMessage.asStanza","borogove/ChatMessage.hx",470,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_518_asStanza,"borogove.ChatMessage","asStanza",0xff32c993,"borogove.ChatMessage.asStanza","borogove/ChatMessage.hx",518,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_275_fromStanza,"borogove.ChatMessage","fromStanza",0x20841f0b,"borogove.ChatMessage.fromStanza","borogove/ChatMessage.hx",275,0xe4a3cadd)
-HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_89_boot,"borogove.ChatMessage","boot",0xa6606f3e,"borogove.ChatMessage.boot","borogove/ChatMessage.hx",89,0xe4a3cadd)
+HX_DEFINE_STACK_FRAME(_hx_pos_20f00185d7354fd9_280_new,"borogove.ChatMessage","new",0x63820ad4,"borogove.ChatMessage.new","borogove/ChatMessage.hx",280,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_478_localId__fromC,"borogove.ChatMessage","localId__fromC",0x08ebd91f,"borogove.ChatMessage.localId__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_478_serverId__fromC,"borogove.ChatMessage","serverId__fromC",0x2996d32f,"borogove.ChatMessage.serverId__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_478_serverIdBy__fromC,"borogove.ChatMessage","serverIdBy__fromC",0xde126f98,"borogove.ChatMessage.serverIdBy__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_478_type__fromC,"borogove.ChatMessage","type__fromC",0x1bc87773,"borogove.ChatMessage.type__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_478_timestamp__fromC,"borogove.ChatMessage","timestamp__fromC",0x0b0acf6f,"borogove.ChatMessage.timestamp__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_478_senderId__fromC,"borogove.ChatMessage","senderId__fromC",0x731f27fd,"borogove.ChatMessage.senderId__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_426_replyToMessage__fromC,"borogove.ChatMessage","replyToMessage__fromC",0x9a6a4d2b,"borogove.ChatMessage.replyToMessage__fromC","HaxeCBridge.hx",426,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_478_threadId__fromC,"borogove.ChatMessage","threadId__fromC",0x2157ea48,"borogove.ChatMessage.threadId__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_452_attachments__fromC,"borogove.ChatMessage","attachments__fromC",0x5cad7f55,"borogove.ChatMessage.attachments__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_413_reactionKeys__fromC,"borogove.ChatMessage","reactionKeys__fromC",0x298e4650,"borogove.ChatMessage.reactionKeys__fromC","HaxeCBridge.hx",413,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_192_get_reactionKeys,"borogove.ChatMessage","get_reactionKeys",0xa96ab7d2,"borogove.ChatMessage.get_reactionKeys","borogove/ChatMessage.hx",192,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_199_reactionDetails,"borogove.ChatMessage","reactionDetails",0x6f916c8d,"borogove.ChatMessage.reactionDetails","borogove/ChatMessage.hx",199,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_363_reactionDetails__fromC,"borogove.ChatMessage","reactionDetails__fromC",0x4e695f8c,"borogove.ChatMessage.reactionDetails__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_478_lang__fromC,"borogove.ChatMessage","lang__fromC",0xda5bf2bf,"borogove.ChatMessage.lang__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_478_direction__fromC,"borogove.ChatMessage","direction__fromC",0x7f45b126,"borogove.ChatMessage.direction__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_478_status__fromC,"borogove.ChatMessage","status__fromC",0xd2e906fb,"borogove.ChatMessage.status__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_478_statusText__fromC,"borogove.ChatMessage","statusText__fromC",0x6864dace,"borogove.ChatMessage.statusText__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_452_versions__fromC,"borogove.ChatMessage","versions__fromC",0xbcbe8bf2,"borogove.ChatMessage.versions__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_478_encryption__fromC,"borogove.ChatMessage","encryption__fromC",0xe59a97ca,"borogove.ChatMessage.encryption__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9b90dadd5b659bbe_452_linkMetadata__fromC,"borogove.ChatMessage","linkMetadata__fromC",0xedfd4084,"borogove.ChatMessage.linkMetadata__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_323_reply,"borogove.ChatMessage","reply",0x1dcec89e,"borogove.ChatMessage.reply","borogove/ChatMessage.hx",323,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_332_getReplyId,"borogove.ChatMessage","getReplyId",0xd1e4a9bb,"borogove.ChatMessage.getReplyId","borogove/ChatMessage.hx",332,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_338_set_replyToMessage,"borogove.ChatMessage","set_replyToMessage",0xaa5f8a4b,"borogove.ChatMessage.set_replyToMessage","borogove/ChatMessage.hx",338,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_347_set_reactions,"borogove.ChatMessage","set_reactions",0x1fc2d601,"borogove.ChatMessage.set_reactions","borogove/ChatMessage.hx",347,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_348_set_reactions,"borogove.ChatMessage","set_reactions",0x1fc2d601,"borogove.ChatMessage.set_reactions","borogove/ChatMessage.hx",348,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_355_inlineHashReferences,"borogove.ChatMessage","inlineHashReferences",0x3ddc36fb,"borogove.ChatMessage.inlineHashReferences","borogove/ChatMessage.hx",355,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_353_inlineHashReferences,"borogove.ChatMessage","inlineHashReferences",0x3ddc36fb,"borogove.ChatMessage.inlineHashReferences","borogove/ChatMessage.hx",353,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_357_inlineHashReferences,"borogove.ChatMessage","inlineHashReferences",0x3ddc36fb,"borogove.ChatMessage.inlineHashReferences","borogove/ChatMessage.hx",357,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_377_htmlBody,"borogove.ChatMessage","htmlBody",0x6ebf2eb9,"borogove.ChatMessage.htmlBody","borogove/ChatMessage.hx",377,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_376_htmlBody,"borogove.ChatMessage","htmlBody",0x6ebf2eb9,"borogove.ChatMessage.htmlBody","borogove/ChatMessage.hx",376,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_390_htmlBody,"borogove.ChatMessage","htmlBody",0x6ebf2eb9,"borogove.ChatMessage.htmlBody","borogove/ChatMessage.hx",390,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_395_htmlBody,"borogove.ChatMessage","htmlBody",0x6ebf2eb9,"borogove.ChatMessage.htmlBody","borogove/ChatMessage.hx",395,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_415_body,"borogove.ChatMessage","body",0xa66065ae,"borogove.ChatMessage.body","borogove/ChatMessage.hx",415,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_422_subject,"borogove.ChatMessage","subject",0xc3d68620,"borogove.ChatMessage.subject","borogove/ChatMessage.hx",422,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_429_chatId,"borogove.ChatMessage","chatId",0xa815cadf,"borogove.ChatMessage.chatId","borogove/ChatMessage.hx",429,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_440_account,"borogove.ChatMessage","account",0x3ba88121,"borogove.ChatMessage.account","borogove/ChatMessage.hx",440,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_446_senderMemberStub,"borogove.ChatMessage","senderMemberStub",0x40e9e5c9,"borogove.ChatMessage.senderMemberStub","borogove/ChatMessage.hx",446,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_455_canReplace,"borogove.ChatMessage","canReplace",0x2db45a10,"borogove.ChatMessage.canReplace","borogove/ChatMessage.hx",455,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_465_isIncoming,"borogove.ChatMessage","isIncoming",0x6d0d0efc,"borogove.ChatMessage.isIncoming","borogove/ChatMessage.hx",465,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_472_threadIcon,"borogove.ChatMessage","threadIcon",0x18c4776f,"borogove.ChatMessage.threadIcon","borogove/ChatMessage.hx",472,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_479_moderationReason,"borogove.ChatMessage","moderationReason",0xcb530616,"borogove.ChatMessage.moderationReason","borogove/ChatMessage.hx",479,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_478_moderationReason,"borogove.ChatMessage","moderationReason",0xcb530616,"borogove.ChatMessage.moderationReason","borogove/ChatMessage.hx",478,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_487_callStatus,"borogove.ChatMessage","callStatus",0x08747a7c,"borogove.ChatMessage.callStatus","borogove/ChatMessage.hx",487,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_494_callSid,"borogove.ChatMessage","callSid",0xeea27984,"borogove.ChatMessage.callSid","borogove/ChatMessage.hx",494,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_500_callDuration,"borogove.ChatMessage","callDuration",0x14c9891e,"borogove.ChatMessage.callDuration","borogove/ChatMessage.hx",500,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_524_asStanza,"borogove.ChatMessage","asStanza",0xff32c993,"borogove.ChatMessage.asStanza","borogove/ChatMessage.hx",524,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_572_asStanza,"borogove.ChatMessage","asStanza",0xff32c993,"borogove.ChatMessage.asStanza","borogove/ChatMessage.hx",572,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_312_fromStanza,"borogove.ChatMessage","fromStanza",0x20841f0b,"borogove.ChatMessage.fromStanza","borogove/ChatMessage.hx",312,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f00185d7354fd9_114_boot,"borogove.ChatMessage","boot",0xa6606f3e,"borogove.ChatMessage.boot","borogove/ChatMessage.hx",114,0xe4a3cadd)
 namespace borogove{
 
 void ChatMessage_obj::__construct( ::Dynamic params){
-            	HX_GC_STACKFRAME(&_hx_pos_20f00185d7354fd9_245_new)
-HXLINE( 246)		this->localId = ( (::String)(params->__Field(HX_("localId",26,7a,c6,2d),::hx::paccDynamic)) );
-HXLINE( 247)		this->serverId = ( (::String)(params->__Field(HX_("serverId",7e,01,b2,e2),::hx::paccDynamic)) );
-HXLINE( 248)		this->serverIdBy = ( (::String)(params->__Field(HX_("serverIdBy",f5,16,54,74),::hx::paccDynamic)) );
-HXLINE( 249)		 ::Dynamic tmp = params->__Field(HX_("type",ba,f2,08,4d),::hx::paccDynamic);
-HXDLIN( 249)		int _hx_tmp;
-HXDLIN( 249)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 249)			_hx_tmp = ( (int)(tmp) );
+            	HX_GC_STACKFRAME(&_hx_pos_20f00185d7354fd9_280_new)
+HXLINE( 281)		this->localId = ( (::String)(params->__Field(HX_("localId",26,7a,c6,2d),::hx::paccDynamic)) );
+HXLINE( 282)		this->serverId = ( (::String)(params->__Field(HX_("serverId",7e,01,b2,e2),::hx::paccDynamic)) );
+HXLINE( 283)		this->serverIdBy = ( (::String)(params->__Field(HX_("serverIdBy",f5,16,54,74),::hx::paccDynamic)) );
+HXLINE( 284)		this->sortId = ( (::String)(params->__Field(HX_("sortId",d9,7a,37,30),::hx::paccDynamic)) );
+HXLINE( 285)		 ::Dynamic tmp = params->__Field(HX_("type",ba,f2,08,4d),::hx::paccDynamic);
+HXDLIN( 285)		int _hx_tmp;
+HXDLIN( 285)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 285)			_hx_tmp = ( (int)(tmp) );
             		}
             		else {
-HXLINE( 249)			_hx_tmp = 0;
+HXLINE( 285)			_hx_tmp = 0;
             		}
-HXDLIN( 249)		this->type = _hx_tmp;
-HXLINE( 250)		 ::Dynamic tmp1 = params->__Field(HX_("syncPoint",f5,ff,94,98),::hx::paccDynamic);
-HXDLIN( 250)		bool _hx_tmp1;
-HXDLIN( 250)		if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 250)			_hx_tmp1 = ( (bool)(tmp1) );
+HXDLIN( 285)		this->type = _hx_tmp;
+HXLINE( 286)		 ::Dynamic tmp1 = params->__Field(HX_("syncPoint",f5,ff,94,98),::hx::paccDynamic);
+HXDLIN( 286)		bool _hx_tmp1;
+HXDLIN( 286)		if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 286)			_hx_tmp1 = ( (bool)(tmp1) );
             		}
             		else {
-HXLINE( 250)			_hx_tmp1 = false;
-            		}
-HXDLIN( 250)		this->syncPoint = _hx_tmp1;
-HXLINE( 251)		this->replyId = ( (::String)(params->__Field(HX_("replyId",a5,67,3a,ab),::hx::paccDynamic)) );
-HXLINE( 252)		this->timestamp = ( (::String)(params->__Field(HX_("timestamp",d6,d4,ce,a5),::hx::paccDynamic)) );
-HXLINE( 253)		this->to = ( ( ::borogove::JID)(params->__Field(HX_("to",7b,65,00,00),::hx::paccDynamic)) );
-HXLINE( 254)		this->from = ( ( ::borogove::JID)(params->__Field(HX_("from",6a,a5,c2,43),::hx::paccDynamic)) );
-HXLINE( 255)		this->senderId = ( (::String)(params->__Field(HX_("senderId",f0,1e,0e,ec),::hx::paccDynamic)) );
-HXLINE( 256)		::Array< ::Dynamic> tmp2 = ( (::Array< ::Dynamic>)(params->__Field(HX_("recipients",7a,62,59,87),::hx::paccDynamic)) );
-HXDLIN( 256)		::Array< ::Dynamic> _hx_tmp2;
-HXDLIN( 256)		if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 256)			_hx_tmp2 = tmp2;
+HXLINE( 286)			_hx_tmp1 = false;
+            		}
+HXDLIN( 286)		this->syncPoint = _hx_tmp1;
+HXLINE( 287)		this->replyId = ( (::String)(params->__Field(HX_("replyId",a5,67,3a,ab),::hx::paccDynamic)) );
+HXLINE( 288)		this->timestamp = ( (::String)(params->__Field(HX_("timestamp",d6,d4,ce,a5),::hx::paccDynamic)) );
+HXLINE( 289)		this->to = ( ( ::borogove::JID)(params->__Field(HX_("to",7b,65,00,00),::hx::paccDynamic)) );
+HXLINE( 290)		this->from = ( ( ::borogove::JID)(params->__Field(HX_("from",6a,a5,c2,43),::hx::paccDynamic)) );
+HXLINE( 291)		this->senderId = ( (::String)(params->__Field(HX_("senderId",f0,1e,0e,ec),::hx::paccDynamic)) );
+HXLINE( 292)		::Array< ::Dynamic> tmp2 = ( (::Array< ::Dynamic>)(params->__Field(HX_("recipients",7a,62,59,87),::hx::paccDynamic)) );
+HXDLIN( 292)		::Array< ::Dynamic> _hx_tmp2;
+HXDLIN( 292)		if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 292)			_hx_tmp2 = tmp2;
             		}
             		else {
-HXLINE( 256)			_hx_tmp2 = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 292)			_hx_tmp2 = ::Array_obj< ::Dynamic>::__new(0);
             		}
-HXDLIN( 256)		this->recipients = _hx_tmp2;
-HXLINE( 257)		::Array< ::Dynamic> tmp3 = ( (::Array< ::Dynamic>)(params->__Field(HX_("replyTo",45,71,3a,ab),::hx::paccDynamic)) );
-HXDLIN( 257)		::Array< ::Dynamic> _hx_tmp3;
-HXDLIN( 257)		if (::hx::IsNotNull( tmp3 )) {
-HXLINE( 257)			_hx_tmp3 = tmp3;
+HXDLIN( 292)		this->recipients = _hx_tmp2;
+HXLINE( 293)		::Array< ::Dynamic> tmp3 = ( (::Array< ::Dynamic>)(params->__Field(HX_("replyTo",45,71,3a,ab),::hx::paccDynamic)) );
+HXDLIN( 293)		::Array< ::Dynamic> _hx_tmp3;
+HXDLIN( 293)		if (::hx::IsNotNull( tmp3 )) {
+HXLINE( 293)			_hx_tmp3 = tmp3;
             		}
             		else {
-HXLINE( 257)			_hx_tmp3 = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 293)			_hx_tmp3 = ::Array_obj< ::Dynamic>::__new(0);
             		}
-HXDLIN( 257)		this->replyTo = _hx_tmp3;
-HXLINE( 258)		this->replyToMessage = ( ( ::borogove::ChatMessage)(params->__Field(HX_("replyToMessage",02,cf,60,a6),::hx::paccDynamic)) );
-HXLINE( 259)		this->threadId = ( (::String)(params->__Field(HX_("threadId",45,81,25,cc),::hx::paccDynamic)) );
-HXLINE( 260)		::Array< ::Dynamic> tmp4 = ( (::Array< ::Dynamic>)(params->__Field(HX_("attachments",30,df,33,e7),::hx::paccDynamic)) );
-HXDLIN( 260)		::Array< ::Dynamic> _hx_tmp4;
-HXDLIN( 260)		if (::hx::IsNotNull( tmp4 )) {
-HXLINE( 260)			_hx_tmp4 = tmp4;
+HXDLIN( 293)		this->replyTo = _hx_tmp3;
+HXLINE( 294)		this->replyToMessage = ( ( ::borogove::ChatMessage)(params->__Field(HX_("replyToMessage",02,cf,60,a6),::hx::paccDynamic)) );
+HXLINE( 295)		this->threadId = ( (::String)(params->__Field(HX_("threadId",45,81,25,cc),::hx::paccDynamic)) );
+HXLINE( 296)		::Array< ::Dynamic> tmp4 = ( (::Array< ::Dynamic>)(params->__Field(HX_("attachments",30,df,33,e7),::hx::paccDynamic)) );
+HXDLIN( 296)		::Array< ::Dynamic> _hx_tmp4;
+HXDLIN( 296)		if (::hx::IsNotNull( tmp4 )) {
+HXLINE( 296)			_hx_tmp4 = tmp4;
             		}
             		else {
-HXLINE( 260)			_hx_tmp4 = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 296)			_hx_tmp4 = ::Array_obj< ::Dynamic>::__new(0);
             		}
-HXDLIN( 260)		this->attachments = _hx_tmp4;
-HXLINE( 261)		 ::haxe::ds::StringMap tmp5 = ( ( ::haxe::ds::StringMap)(params->__Field(HX_("reactions",aa,cc,95,e7),::hx::paccDynamic)) );
-HXDLIN( 261)		 ::haxe::ds::StringMap _hx_tmp5;
-HXDLIN( 261)		if (::hx::IsNotNull( tmp5 )) {
-HXLINE( 261)			_hx_tmp5 = tmp5;
+HXDLIN( 296)		this->attachments = _hx_tmp4;
+HXLINE( 297)		 ::haxe::ds::StringMap tmp5 = ( ( ::haxe::ds::StringMap)(params->__Field(HX_("reactions",aa,cc,95,e7),::hx::paccDynamic)) );
+HXDLIN( 297)		 ::haxe::ds::StringMap _hx_tmp5;
+HXDLIN( 297)		if (::hx::IsNotNull( tmp5 )) {
+HXLINE( 297)			_hx_tmp5 = tmp5;
             		}
             		else {
-HXLINE( 261)			_hx_tmp5 =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 297)			_hx_tmp5 =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
             		}
-HXDLIN( 261)		this->reactions = _hx_tmp5;
-HXLINE( 262)		this->text = ( (::String)(params->__Field(HX_("text",ad,cc,f9,4c),::hx::paccDynamic)) );
-HXLINE( 263)		this->lang = ( (::String)(params->__Field(HX_("lang",ee,05,ad,47),::hx::paccDynamic)) );
-HXLINE( 264)		 ::Dynamic tmp6 = params->__Field(HX_("direction",3f,62,40,10),::hx::paccDynamic);
-HXDLIN( 264)		int _hx_tmp6;
-HXDLIN( 264)		if (::hx::IsNotNull( tmp6 )) {
-HXLINE( 264)			_hx_tmp6 = ( (int)(tmp6) );
+HXDLIN( 297)		this->reactions = _hx_tmp5;
+HXLINE( 298)		this->text = ( (::String)(params->__Field(HX_("text",ad,cc,f9,4c),::hx::paccDynamic)) );
+HXLINE( 299)		this->lang = ( (::String)(params->__Field(HX_("lang",ee,05,ad,47),::hx::paccDynamic)) );
+HXLINE( 300)		 ::Dynamic tmp6 = params->__Field(HX_("direction",3f,62,40,10),::hx::paccDynamic);
+HXDLIN( 300)		int _hx_tmp6;
+HXDLIN( 300)		if (::hx::IsNotNull( tmp6 )) {
+HXLINE( 300)			_hx_tmp6 = ( (int)(tmp6) );
             		}
             		else {
-HXLINE( 264)			_hx_tmp6 = 1;
+HXLINE( 300)			_hx_tmp6 = 1;
             		}
-HXDLIN( 264)		this->direction = _hx_tmp6;
-HXLINE( 265)		 ::Dynamic tmp7 = params->__Field(HX_("status",32,e7,fb,05),::hx::paccDynamic);
-HXDLIN( 265)		int _hx_tmp7;
-HXDLIN( 265)		if (::hx::IsNotNull( tmp7 )) {
-HXLINE( 265)			_hx_tmp7 = ( (int)(tmp7) );
+HXDLIN( 300)		this->direction = _hx_tmp6;
+HXLINE( 301)		 ::Dynamic tmp7 = params->__Field(HX_("status",32,e7,fb,05),::hx::paccDynamic);
+HXDLIN( 301)		int _hx_tmp7;
+HXDLIN( 301)		if (::hx::IsNotNull( tmp7 )) {
+HXLINE( 301)			_hx_tmp7 = ( (int)(tmp7) );
             		}
             		else {
-HXLINE( 265)			_hx_tmp7 = 0;
+HXLINE( 301)			_hx_tmp7 = 0;
             		}
-HXDLIN( 265)		this->status = _hx_tmp7;
-HXLINE( 266)		this->statusText = ( (::String)(params->__Field(HX_("statusText",ff,60,57,b1),::hx::paccDynamic)) );
-HXLINE( 267)		::Array< ::Dynamic> tmp8 = ( (::Array< ::Dynamic>)(params->__Field(HX_("versions",5b,4e,b8,d6),::hx::paccDynamic)) );
-HXDLIN( 267)		::Array< ::Dynamic> _hx_tmp8;
-HXDLIN( 267)		if (::hx::IsNotNull( tmp8 )) {
-HXLINE( 267)			_hx_tmp8 = tmp8;
+HXDLIN( 301)		this->status = _hx_tmp7;
+HXLINE( 302)		this->statusText = ( (::String)(params->__Field(HX_("statusText",ff,60,57,b1),::hx::paccDynamic)) );
+HXLINE( 303)		::Array< ::Dynamic> tmp8 = ( (::Array< ::Dynamic>)(params->__Field(HX_("versions",5b,4e,b8,d6),::hx::paccDynamic)) );
+HXDLIN( 303)		::Array< ::Dynamic> _hx_tmp8;
+HXDLIN( 303)		if (::hx::IsNotNull( tmp8 )) {
+HXLINE( 303)			_hx_tmp8 = tmp8;
             		}
             		else {
-HXLINE( 267)			_hx_tmp8 = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 303)			_hx_tmp8 = ::Array_obj< ::Dynamic>::__new(0);
             		}
-HXDLIN( 267)		this->versions = _hx_tmp8;
-HXLINE( 268)		::Array< ::Dynamic> tmp9 = ( (::Array< ::Dynamic>)(params->__Field(HX_("payloads",25,dd,d1,a1),::hx::paccDynamic)) );
-HXDLIN( 268)		::Array< ::Dynamic> _hx_tmp9;
-HXDLIN( 268)		if (::hx::IsNotNull( tmp9 )) {
-HXLINE( 268)			_hx_tmp9 = tmp9;
+HXDLIN( 303)		this->versions = _hx_tmp8;
+HXLINE( 304)		::Array< ::Dynamic> tmp9 = ( (::Array< ::Dynamic>)(params->__Field(HX_("payloads",25,dd,d1,a1),::hx::paccDynamic)) );
+HXDLIN( 304)		::Array< ::Dynamic> _hx_tmp9;
+HXDLIN( 304)		if (::hx::IsNotNull( tmp9 )) {
+HXLINE( 304)			_hx_tmp9 = tmp9;
             		}
             		else {
-HXLINE( 268)			_hx_tmp9 = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 304)			_hx_tmp9 = ::Array_obj< ::Dynamic>::__new(0);
             		}
-HXDLIN( 268)		this->payloads = _hx_tmp9;
-HXLINE( 269)		this->encryption = ( ( ::borogove::EncryptionInfo)(params->__Field(HX_("encryption",83,dc,39,4f),::hx::paccDynamic)) );
-HXLINE( 270)		this->stanza = ( ( ::borogove::Stanza)(params->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic)) );
+HXDLIN( 304)		this->payloads = _hx_tmp9;
+HXLINE( 305)		this->encryption = ( ( ::borogove::EncryptionInfo)(params->__Field(HX_("encryption",83,dc,39,4f),::hx::paccDynamic)) );
+HXLINE( 306)		::Array< ::Dynamic> tmp10 = ( (::Array< ::Dynamic>)(params->__Field(HX_("linkMetadata",89,45,ae,7c),::hx::paccDynamic)) );
+HXDLIN( 306)		::Array< ::Dynamic> _hx_tmp10;
+HXDLIN( 306)		if (::hx::IsNotNull( tmp10 )) {
+HXLINE( 306)			_hx_tmp10 = tmp10;
+            		}
+            		else {
+HXLINE( 306)			_hx_tmp10 = ::Array_obj< ::Dynamic>::__new(0);
+            		}
+HXDLIN( 306)		this->linkMetadata = _hx_tmp10;
+HXLINE( 307)		this->stanza = ( ( ::borogove::Stanza)(params->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic)) );
             	}
 
 Dynamic ChatMessage_obj::__CreateEmpty() { return new ChatMessage_obj; }
@@ -276,183 +306,141 @@ bool ChatMessage_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String ChatMessage_obj::localId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_450_localId__fromC)
-HXDLIN( 450)		return this->localId;
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_478_localId__fromC)
+HXDLIN( 478)		return this->localId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,localId__fromC,return )
 
 ::String ChatMessage_obj::serverId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_450_serverId__fromC)
-HXDLIN( 450)		return this->serverId;
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_478_serverId__fromC)
+HXDLIN( 478)		return this->serverId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,serverId__fromC,return )
 
 ::String ChatMessage_obj::serverIdBy__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_450_serverIdBy__fromC)
-HXDLIN( 450)		return this->serverIdBy;
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_478_serverIdBy__fromC)
+HXDLIN( 478)		return this->serverIdBy;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,serverIdBy__fromC,return )
 
 int ChatMessage_obj::type__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_450_type__fromC)
-HXDLIN( 450)		return this->type;
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_478_type__fromC)
+HXDLIN( 478)		return this->type;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,type__fromC,return )
 
 ::String ChatMessage_obj::timestamp__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_450_timestamp__fromC)
-HXDLIN( 450)		return this->timestamp;
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_478_timestamp__fromC)
+HXDLIN( 478)		return this->timestamp;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,timestamp__fromC,return )
 
 ::String ChatMessage_obj::senderId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_450_senderId__fromC)
-HXDLIN( 450)		return this->senderId;
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_478_senderId__fromC)
+HXDLIN( 478)		return this->senderId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,senderId__fromC,return )
 
  ::borogove::ChatMessage ChatMessage_obj::replyToMessage__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_398_replyToMessage__fromC)
-HXDLIN( 398)		return this->replyToMessage;
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_426_replyToMessage__fromC)
+HXDLIN( 426)		return this->replyToMessage;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,replyToMessage__fromC,return )
 
 ::String ChatMessage_obj::threadId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_450_threadId__fromC)
-HXDLIN( 450)		return this->threadId;
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_478_threadId__fromC)
+HXDLIN( 478)		return this->threadId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,threadId__fromC,return )
 
 size_t ChatMessage_obj::attachments__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_424_attachments__fromC)
-HXDLIN( 424)		::Array< ::Dynamic> x = this->attachments;
-HXDLIN( 424)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 424)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 424)			::Array< ::Dynamic> x1 = x;
-HXDLIN( 424)			{
-HXDLIN( 424)				int _g = 0;
-HXDLIN( 424)				while((_g < x1->length)){
-HXDLIN( 424)					 ::borogove::ChatAttachment el = x1->__get(_g).StaticCast<  ::borogove::ChatAttachment >();
-HXDLIN( 424)					_g = (_g + 1);
-HXDLIN( 424)					{
-HXDLIN( 424)						 ::Dynamic haxeObject = el;
-HXDLIN( 424)						void* ptr = haxeObject.mPtr;
-HXDLIN( 424)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 424)						{
-HXDLIN( 424)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 424)							if (::hx::IsNull( store )) {
-HXDLIN( 424)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_452_attachments__fromC)
+HXDLIN( 452)		::Array< ::Dynamic> x = this->attachments;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			::Array< ::Dynamic> x1 = x;
+HXDLIN( 452)			{
+HXDLIN( 452)				int _g = 0;
+HXDLIN( 452)				while((_g < x1->length)){
+HXDLIN( 452)					 ::borogove::ChatAttachment el = x1->__get(_g).StaticCast<  ::borogove::ChatAttachment >();
+HXDLIN( 452)					_g = (_g + 1);
+HXDLIN( 452)					{
+HXDLIN( 452)						 ::Dynamic haxeObject = el;
+HXDLIN( 452)						void* ptr = haxeObject.mPtr;
+HXDLIN( 452)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 452)						{
+HXDLIN( 452)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 452)							if (::hx::IsNull( store )) {
+HXDLIN( 452)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
             									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 424)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 452)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             							}
             							else {
-HXDLIN( 424)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXDLIN( 452)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             							}
             						}
             					}
             				}
             			}
-HXDLIN( 424)			void** ptr1 = (void**)x1->getBase();
-HXDLIN( 424)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 424)			{
-HXDLIN( 424)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 424)				if (::hx::IsNull( store1 )) {
-HXDLIN( 424)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+HXDLIN( 452)			void** ptr1 = (void**)x1->getBase();
+HXDLIN( 452)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
+HXDLIN( 452)			{
+HXDLIN( 452)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN( 452)				if (::hx::IsNull( store1 )) {
+HXDLIN( 452)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),x1));
-HXDLIN( 424)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+HXDLIN( 452)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
             				}
             				else {
-HXDLIN( 424)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXDLIN( 452)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXDLIN( 424)			_hx_tmp->set_ref(ptr1);
+HXDLIN( 452)			_hx_tmp->set_ref(ptr1);
             		}
-HXDLIN( 424)		return ( (size_t)(x->length) );
+HXDLIN( 452)		return ( (size_t)(x->length) );
             	}
 
 
 size_t ChatMessage_obj::reactionKeys__fromC(const char*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_385_reactionKeys__fromC)
-HXDLIN( 385)		::Array< ::String > x = this->get_reactionKeys();
-HXDLIN( 385)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 385)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 385)			::Array< size_t > arr = ::Array_obj< size_t >::__new(x->length);
-HXDLIN( 385)			{
-HXDLIN( 385)				int _g_current = 0;
-HXDLIN( 385)				::Array< ::String > _g_array = x;
-HXDLIN( 385)				while((_g_current < _g_array->length)){
-HXDLIN( 385)					::String _g_value = _g_array->__get(_g_current);
-HXDLIN( 385)					_g_current = (_g_current + 1);
-HXDLIN( 385)					::String el = _g_value;
-HXDLIN( 385)					{
-HXDLIN( 385)						const char* cStrPtr = el.utf8_str();
-HXDLIN( 385)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 385)						{
-HXDLIN( 385)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 385)							if (::hx::IsNull( store )) {
-HXLINE(2243)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),el));
-HXLINE( 385)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 385)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-HXDLIN( 385)						const char* ptr = cStrPtr;
-HXDLIN( 385)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
-            					}
-            				}
-            			}
-HXDLIN( 385)			void** ptr1 = (void**)arr->getBase();
-HXDLIN( 385)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 385)			{
-HXDLIN( 385)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 385)				if (::hx::IsNull( store1 )) {
-HXLINE(2243)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),arr));
-HXLINE( 385)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 385)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 385)			_hx_tmp->set_ref(( (const char**)(ptr1) ));
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_413_reactionKeys__fromC)
+HXDLIN( 413)		::Array< ::String > x = this->get_reactionKeys();
+HXDLIN( 413)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 413)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 413)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(x));
             		}
-HXDLIN( 385)		return ( (size_t)(x->length) );
+HXDLIN( 413)		return ( (size_t)(x->length) );
             	}
 
 
 ::Array< ::String > ChatMessage_obj::get_reactionKeys(){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::haxe::ds::StringMap,_e) HXARGC(0)
             		 ::Dynamic _hx_run(){
-            			HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_164_get_reactionKeys)
-HXDLIN( 164)			return _e->keys();
+            			HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_192_get_reactionKeys)
+HXDLIN( 192)			return _e->keys();
             		}
             		HX_END_LOCAL_FUNC0(return)
 
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_164_get_reactionKeys)
-HXDLIN( 164)		 ::haxe::ds::StringMap _e = this->reactions;
-HXDLIN( 164)		return ::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_192_get_reactionKeys)
+HXDLIN( 192)		 ::haxe::ds::StringMap _e = this->reactions;
+HXDLIN( 192)		return ::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("iterator",ee,49,9a,93), ::Dynamic(new _hx_Closure_0(_e)))));
             	}
 
@@ -460,265 +448,263 @@ HXDLIN( 164)		return ::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,get_reactionKeys,return )
 
 ::Array< ::Dynamic> ChatMessage_obj::reactionDetails(::String reactionKey){
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_171_reactionDetails)
-HXDLIN( 171)		::Array< ::Dynamic> tmp = ( (::Array< ::Dynamic>)(this->reactions->get(reactionKey)) );
-HXDLIN( 171)		if (::hx::IsNotNull( tmp )) {
-HXDLIN( 171)			return tmp;
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_199_reactionDetails)
+HXDLIN( 199)		::Dynamic this1 = this->reactions;
+HXDLIN( 199)		::Array< ::Dynamic> tmp = ( (::Array< ::Dynamic>)(( ( ::haxe::ds::StringMap)(this1) )->get(::haxe::io::Bytes_obj::ofString(reactionKey,null())->toString())) );
+HXDLIN( 199)		if (::hx::IsNotNull( tmp )) {
+HXDLIN( 199)			return tmp;
             		}
             		else {
-HXDLIN( 171)			return ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 199)			return ::Array_obj< ::Dynamic>::__new(0);
             		}
-HXDLIN( 171)		return null();
+HXDLIN( 199)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessage_obj,reactionDetails,return )
 
 size_t ChatMessage_obj::reactionDetails__fromC(::String reactionKey,void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_335_reactionDetails__fromC)
-HXDLIN( 335)		::Array< ::Dynamic> out = this->reactionDetails(reactionKey);
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g = 0;
-HXDLIN( 335)				while((_g < out->length)){
-HXDLIN( 335)					 ::borogove::Reaction el = out->__get(_g).StaticCast<  ::borogove::Reaction >();
-HXDLIN( 335)					_g = (_g + 1);
-HXDLIN( 335)					{
-HXDLIN( 335)						 ::Dynamic haxeObject = el;
-HXDLIN( 335)						void* ptr = haxeObject.mPtr;
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXDLIN( 335)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)out->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXDLIN( 335)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),out));
-HXDLIN( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_363_reactionDetails__fromC)
+HXDLIN( 363)		::Array< ::Dynamic> out = this->reactionDetails(reactionKey);
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
-            	}
-
-
-::String ChatMessage_obj::text__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_450_text__fromC)
-HXDLIN( 450)		return this->text;
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,text__fromC,return )
-
 ::String ChatMessage_obj::lang__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_450_lang__fromC)
-HXDLIN( 450)		return this->lang;
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_478_lang__fromC)
+HXDLIN( 478)		return this->lang;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,lang__fromC,return )
 
 int ChatMessage_obj::direction__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_450_direction__fromC)
-HXDLIN( 450)		return this->direction;
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_478_direction__fromC)
+HXDLIN( 478)		return this->direction;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,direction__fromC,return )
 
 int ChatMessage_obj::status__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_450_status__fromC)
-HXDLIN( 450)		return this->status;
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_478_status__fromC)
+HXDLIN( 478)		return this->status;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,status__fromC,return )
 
 ::String ChatMessage_obj::statusText__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_450_statusText__fromC)
-HXDLIN( 450)		return this->statusText;
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_478_statusText__fromC)
+HXDLIN( 478)		return this->statusText;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,statusText__fromC,return )
 
 size_t ChatMessage_obj::versions__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_424_versions__fromC)
-HXDLIN( 424)		::Array< ::Dynamic> x = this->versions;
-HXDLIN( 424)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 424)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 424)			::Array< ::Dynamic> x1 = x;
-HXDLIN( 424)			{
-HXDLIN( 424)				int _g = 0;
-HXDLIN( 424)				while((_g < x1->length)){
-HXDLIN( 424)					 ::borogove::ChatMessage el = x1->__get(_g).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 424)					_g = (_g + 1);
-HXDLIN( 424)					{
-HXDLIN( 424)						 ::Dynamic haxeObject = el;
-HXDLIN( 424)						void* ptr = haxeObject.mPtr;
-HXDLIN( 424)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 424)						{
-HXDLIN( 424)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 424)							if (::hx::IsNull( store )) {
-HXDLIN( 424)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_452_versions__fromC)
+HXDLIN( 452)		::Array< ::Dynamic> x = this->versions;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			::Array< ::Dynamic> x1 = x;
+HXDLIN( 452)			{
+HXDLIN( 452)				int _g = 0;
+HXDLIN( 452)				while((_g < x1->length)){
+HXDLIN( 452)					 ::borogove::ChatMessage el = x1->__get(_g).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN( 452)					_g = (_g + 1);
+HXDLIN( 452)					{
+HXDLIN( 452)						 ::Dynamic haxeObject = el;
+HXDLIN( 452)						void* ptr = haxeObject.mPtr;
+HXDLIN( 452)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 452)						{
+HXDLIN( 452)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 452)							if (::hx::IsNull( store )) {
+HXDLIN( 452)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
             									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 424)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 452)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             							}
             							else {
-HXDLIN( 424)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXDLIN( 452)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             							}
             						}
             					}
             				}
             			}
-HXDLIN( 424)			void** ptr1 = (void**)x1->getBase();
-HXDLIN( 424)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 424)			{
-HXDLIN( 424)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 424)				if (::hx::IsNull( store1 )) {
-HXDLIN( 424)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+HXDLIN( 452)			void** ptr1 = (void**)x1->getBase();
+HXDLIN( 452)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
+HXDLIN( 452)			{
+HXDLIN( 452)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN( 452)				if (::hx::IsNull( store1 )) {
+HXDLIN( 452)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),x1));
-HXDLIN( 424)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+HXDLIN( 452)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
             				}
             				else {
-HXDLIN( 424)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXDLIN( 452)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXDLIN( 424)			_hx_tmp->set_ref(ptr1);
+HXDLIN( 452)			_hx_tmp->set_ref(ptr1);
             		}
-HXDLIN( 424)		return ( (size_t)(x->length) );
+HXDLIN( 452)		return ( (size_t)(x->length) );
             	}
 
 
  ::borogove::EncryptionInfo ChatMessage_obj::encryption__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_450_encryption__fromC)
-HXDLIN( 450)		return this->encryption;
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_478_encryption__fromC)
+HXDLIN( 478)		return this->encryption;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,encryption__fromC,return )
 
+size_t ChatMessage_obj::linkMetadata__fromC(void*** outPtr){
+            	HX_STACKFRAME(&_hx_pos_9b90dadd5b659bbe_452_linkMetadata__fromC)
+HXDLIN( 452)		::Array< ::Dynamic> x = this->linkMetadata;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			::Array< ::Dynamic> x1 = x;
+HXDLIN( 452)			{
+HXDLIN( 452)				int _g = 0;
+HXDLIN( 452)				while((_g < x1->length)){
+HXDLIN( 452)					 ::borogove::LinkMetadata el = x1->__get(_g).StaticCast<  ::borogove::LinkMetadata >();
+HXDLIN( 452)					_g = (_g + 1);
+HXDLIN( 452)					{
+HXDLIN( 452)						 ::Dynamic haxeObject = el;
+HXDLIN( 452)						void* ptr = haxeObject.mPtr;
+HXDLIN( 452)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 452)						{
+HXDLIN( 452)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 452)							if (::hx::IsNull( store )) {
+HXDLIN( 452)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
+HXDLIN( 452)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            							}
+            							else {
+HXDLIN( 452)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            							}
+            						}
+            					}
+            				}
+            			}
+HXDLIN( 452)			void** ptr1 = (void**)x1->getBase();
+HXDLIN( 452)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
+HXDLIN( 452)			{
+HXDLIN( 452)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN( 452)				if (::hx::IsNull( store1 )) {
+HXDLIN( 452)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            						->setFixed(1,HX_("value",71,7f,b8,31),x1));
+HXDLIN( 452)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+            				}
+            				else {
+HXDLIN( 452)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+            				}
+            			}
+HXDLIN( 452)			_hx_tmp->set_ref(ptr1);
+            		}
+HXDLIN( 452)		return ( (size_t)(x->length) );
+            	}
+
+
  ::borogove::ChatMessageBuilder ChatMessage_obj::reply(){
-            	HX_GC_STACKFRAME(&_hx_pos_20f00185d7354fd9_286_reply)
-HXLINE( 287)		 ::borogove::ChatMessageBuilder m =  ::borogove::ChatMessageBuilder_obj::__alloc( HX_CTX );
-HXLINE( 288)		m->type = this->type;
-HXLINE( 289)		::String tmp = this->threadId;
-HXDLIN( 289)		::String _hx_tmp;
-HXDLIN( 289)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 289)			_hx_tmp = tmp;
+            	HX_GC_STACKFRAME(&_hx_pos_20f00185d7354fd9_323_reply)
+HXLINE( 324)		 ::borogove::ChatMessageBuilder m =  ::borogove::ChatMessageBuilder_obj::__alloc( HX_CTX );
+HXLINE( 325)		m->type = this->type;
+HXLINE( 326)		::String tmp = this->threadId;
+HXDLIN( 326)		::String _hx_tmp;
+HXDLIN( 326)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 326)			_hx_tmp = tmp;
             		}
             		else {
-HXLINE( 289)			_hx_tmp = ::borogove::ID_obj::_hx_long();
+HXLINE( 326)			_hx_tmp = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
             		}
-HXDLIN( 289)		m->threadId = _hx_tmp;
-HXLINE( 290)		m->replyToMessage = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 291)		return m;
+HXDLIN( 326)		m->threadId = _hx_tmp;
+HXLINE( 327)		m->replyToMessage = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 328)		return m;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,reply,return )
 
 ::String ChatMessage_obj::getReplyId(){
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_295_getReplyId)
-HXLINE( 296)		if (::hx::IsNotNull( this->replyId )) {
-HXLINE( 296)			return this->replyId;
-            		}
-HXLINE( 297)		bool _hx_tmp;
-HXDLIN( 297)		if ((this->type != 2)) {
-HXLINE( 297)			_hx_tmp = (this->type == 3);
-            		}
-            		else {
-HXLINE( 297)			_hx_tmp = true;
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_332_getReplyId)
+HXLINE( 333)		if (::hx::IsNotNull( this->replyId )) {
+HXLINE( 333)			return this->replyId;
             		}
-HXDLIN( 297)		if (_hx_tmp) {
-HXLINE( 297)			return this->serverId;
+HXLINE( 334)		if ((this->type == 2)) {
+HXLINE( 334)			return this->serverId;
             		}
             		else {
-HXLINE( 297)			return this->localId;
+HXLINE( 334)			return this->localId;
             		}
-HXDLIN( 297)		return null();
+HXDLIN( 334)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,getReplyId,return )
 
  ::borogove::ChatMessage ChatMessage_obj::set_replyToMessage( ::borogove::ChatMessage m){
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_301_set_replyToMessage)
-HXLINE( 302)		 ::borogove::ChatMessage rtm = this->replyToMessage;
-HXLINE( 303)		if (::hx::IsNull( rtm )) {
-HXLINE( 303)			HX_STACK_DO_THROW(HX_("Cannot hydrate null replyToMessage",f1,d9,4b,bf));
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_338_set_replyToMessage)
+HXLINE( 339)		 ::borogove::ChatMessage rtm = this->replyToMessage;
+HXLINE( 340)		if (::hx::IsNull( rtm )) {
+HXLINE( 340)			HX_STACK_DO_THROW(HX_("Cannot hydrate null replyToMessage",f1,d9,4b,bf));
             		}
-HXLINE( 304)		bool _hx_tmp;
-HXDLIN( 304)		if (::hx::IsNotNull( rtm->serverId )) {
-HXLINE( 304)			_hx_tmp = (rtm->serverId != m->serverId);
+HXLINE( 341)		bool _hx_tmp;
+HXDLIN( 341)		if (::hx::IsNotNull( rtm->serverId )) {
+HXLINE( 341)			_hx_tmp = (rtm->serverId != m->serverId);
             		}
             		else {
-HXLINE( 304)			_hx_tmp = false;
+HXLINE( 341)			_hx_tmp = false;
             		}
-HXDLIN( 304)		if (_hx_tmp) {
-HXLINE( 304)			HX_STACK_DO_THROW(HX_("Hydrate serverId mismatch",43,6c,05,df));
+HXDLIN( 341)		if (_hx_tmp) {
+HXLINE( 341)			HX_STACK_DO_THROW(HX_("Hydrate serverId mismatch",43,6c,05,df));
             		}
-HXLINE( 305)		bool _hx_tmp1;
-HXDLIN( 305)		if (::hx::IsNotNull( rtm->localId )) {
-HXLINE( 305)			_hx_tmp1 = (rtm->localId != m->localId);
+HXLINE( 342)		bool _hx_tmp1;
+HXDLIN( 342)		if (::hx::IsNotNull( rtm->localId )) {
+HXLINE( 342)			_hx_tmp1 = (rtm->localId != m->localId);
             		}
             		else {
-HXLINE( 305)			_hx_tmp1 = false;
+HXLINE( 342)			_hx_tmp1 = false;
             		}
-HXDLIN( 305)		if (_hx_tmp1) {
-HXLINE( 305)			HX_STACK_DO_THROW(HX_("Hydrate localId mismatch",d5,ef,ca,42));
+HXDLIN( 342)		if (_hx_tmp1) {
+HXLINE( 342)			HX_STACK_DO_THROW(HX_("Hydrate localId mismatch",d5,ef,ca,42));
             		}
-HXLINE( 306)		return (this->replyToMessage = m);
+HXLINE( 343)		return (this->replyToMessage = m);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessage_obj,set_replyToMessage,return )
 
  ::haxe::ds::StringMap ChatMessage_obj::set_reactions( ::haxe::ds::StringMap r){
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_310_set_reactions)
-HXDLIN( 310)		 ::borogove::ChatMessage _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 311)		bool _hx_tmp;
-HXDLIN( 311)		if (::hx::IsNotNull( this->reactions )) {
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_347_set_reactions)
+HXDLIN( 347)		 ::borogove::ChatMessage _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 348)		bool _hx_tmp;
+HXDLIN( 348)		if (::hx::IsNotNull( this->reactions )) {
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::ChatMessage,_gthis) HXARGC(0)
             			 ::Dynamic _hx_run(){
-            				HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_311_set_reactions)
-HXLINE( 311)				return _gthis->reactions->keys();
+            				HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_348_set_reactions)
+HXLINE( 348)				return _gthis->reactions->keys();
             			}
             			HX_END_LOCAL_FUNC0(return)
 
-HXLINE( 311)			_hx_tmp = !(::Lambda_obj::empty( ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 348)			_hx_tmp = !(::Lambda_obj::empty( ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("iterator",ee,49,9a,93), ::Dynamic(new _hx_Closure_0(_gthis))))));
             		}
             		else {
-HXLINE( 311)			_hx_tmp = false;
+HXLINE( 348)			_hx_tmp = false;
             		}
-HXDLIN( 311)		if (_hx_tmp) {
-HXLINE( 311)			HX_STACK_DO_THROW(HX_("Reactions already hydrated",4f,72,b8,9d));
+HXDLIN( 348)		if (_hx_tmp) {
+HXLINE( 348)			HX_STACK_DO_THROW(HX_("Reactions already hydrated",4f,72,b8,9d));
             		}
-HXLINE( 312)		return (this->reactions = r);
+HXLINE( 349)		return (this->reactions = r);
             	}
 
 
@@ -727,486 +713,566 @@ HX_DEFINE_DYNAMIC_FUNC1(ChatMessage_obj,set_reactions,return )
 ::Array< ::Dynamic> ChatMessage_obj::inlineHashReferences(){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		bool _hx_run( ::borogove::Stanza p){
-            			HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_318_inlineHashReferences)
-HXLINE( 318)			if ((( (::String)(::Reflect_obj::field(p->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xhtml-im",c2,5d,b2,ce))) {
-HXLINE( 318)				return (p->name == HX_("html",6b,95,16,45));
+            			HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_355_inlineHashReferences)
+HXLINE( 355)			if ((( (::String)(::Reflect_obj::field(p->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xhtml-im",c2,5d,b2,ce))) {
+HXLINE( 355)				return (p->name == HX_("html",6b,95,16,45));
             			}
             			else {
-HXLINE( 318)				return false;
+HXLINE( 355)				return false;
             			}
-HXDLIN( 318)			return false;
+HXDLIN( 355)			return false;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_316_inlineHashReferences)
-HXLINE( 317)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 318)		 ::borogove::Stanza tmp = ( ( ::borogove::Stanza)(::Lambda_obj::find(this->payloads, ::Dynamic(new _hx_Closure_0()))) );
-HXDLIN( 318)		 ::borogove::Stanza htmlBody;
-HXDLIN( 318)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 318)			htmlBody = tmp->getChild(HX_("body",a2,7a,1b,41),HX_("http://www.w3.org/1999/xhtml",90,6d,f8,c8));
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_353_inlineHashReferences)
+HXLINE( 354)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 355)		 ::borogove::Stanza tmp = ( ( ::borogove::Stanza)(::Lambda_obj::find(this->payloads, ::Dynamic(new _hx_Closure_0()))) );
+HXDLIN( 355)		 ::borogove::Stanza htmlBody;
+HXDLIN( 355)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 355)			htmlBody = tmp->getChild(HX_("body",a2,7a,1b,41),HX_("http://www.w3.org/1999/xhtml",90,6d,f8,c8));
             		}
             		else {
-HXLINE( 318)			htmlBody = null();
+HXLINE( 355)			htmlBody = null();
             		}
-HXLINE( 319)		if (::hx::IsNotNull( htmlBody )) {
+HXLINE( 356)		if (::hx::IsNotNull( htmlBody )) {
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1,::Array< ::Dynamic>,result) HXARGC(1)
             			bool _hx_run( ::borogove::Stanza child){
-            				HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_320_inlineHashReferences)
-HXLINE( 321)				if ((child->name == HX_("img",03,0c,50,00))) {
-HXLINE( 322)					::String src = ( (::String)(::Reflect_obj::field(child->attr,HX_("src",e4,a6,57,00))) );
-HXLINE( 323)					if (::hx::IsNotNull( src )) {
-HXLINE( 324)						 ::borogove::Hash hash = ::borogove::Hash_obj::fromUri(src);
-HXLINE( 325)						if (::hx::IsNotNull( hash )) {
-HXLINE( 327)							result->push(hash);
+            				HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_357_inlineHashReferences)
+HXLINE( 358)				if ((child->name == HX_("img",03,0c,50,00))) {
+HXLINE( 359)					::String src = ( (::String)(::Reflect_obj::field(child->attr,HX_("src",e4,a6,57,00))) );
+HXLINE( 360)					if (::hx::IsNotNull( src )) {
+HXLINE( 361)						 ::borogove::Hash hash = ::borogove::Hash_obj::fromUri(src);
+HXLINE( 362)						if (::hx::IsNotNull( hash )) {
+HXLINE( 364)							result->push(hash);
             						}
             					}
-HXLINE( 330)					return true;
+HXLINE( 367)					return true;
             				}
-HXLINE( 332)				return false;
+HXLINE( 369)				return false;
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 320)			htmlBody->traverse( ::Dynamic(new _hx_Closure_1(result)));
+HXLINE( 357)			htmlBody->traverse( ::Dynamic(new _hx_Closure_1(result)));
             		}
-HXLINE( 336)		return result;
+HXLINE( 373)		return result;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,inlineHashReferences,return )
 
-::String ChatMessage_obj::html( ::borogove::Participant sender){
+::Array< ::Dynamic> ChatMessage_obj::htmlBody(){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		bool _hx_run( ::borogove::Stanza p){
-            			HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_347_html)
-HXLINE( 347)			if ((( (::String)(::Reflect_obj::field(p->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xhtml-im",c2,5d,b2,ce))) {
-HXLINE( 347)				return (p->name == HX_("html",6b,95,16,45));
+            			HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_377_htmlBody)
+HXLINE( 377)			if ((( (::String)(::Reflect_obj::field(p->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xhtml-im",c2,5d,b2,ce))) {
+HXLINE( 377)				return (p->name == HX_("html",6b,95,16,45));
             			}
             			else {
-HXLINE( 347)				return false;
+HXLINE( 377)				return false;
             			}
-HXDLIN( 347)			return false;
+HXDLIN( 377)			return false;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_346_html)
-HXLINE( 347)		 ::borogove::Stanza tmp = ( ( ::borogove::Stanza)(::Lambda_obj::find(this->payloads, ::Dynamic(new _hx_Closure_0()))) );
-HXDLIN( 347)		 ::borogove::Stanza htmlBody;
-HXDLIN( 347)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 347)			htmlBody = tmp->getChild(HX_("body",a2,7a,1b,41),HX_("http://www.w3.org/1999/xhtml",90,6d,f8,c8));
+            	HX_GC_STACKFRAME(&_hx_pos_20f00185d7354fd9_376_htmlBody)
+HXLINE( 377)		 ::borogove::Stanza tmp = ( ( ::borogove::Stanza)(::Lambda_obj::find(this->payloads, ::Dynamic(new _hx_Closure_0()))) );
+HXDLIN( 377)		 ::borogove::Stanza htmlBody;
+HXDLIN( 377)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 377)			htmlBody = tmp->getChild(HX_("body",a2,7a,1b,41),HX_("http://www.w3.org/1999/xhtml",90,6d,f8,c8));
             		}
             		else {
-HXLINE( 347)			htmlBody = null();
-            		}
-HXLINE( 348)		::String htmlSource = HX_("",00,00,00,00);
-HXLINE( 349)		::Array< bool > isAction = ::Array_obj< bool >::fromData( _hx_array_data_424f50e2_43,1);
-HXLINE( 350)		if (::hx::IsNotNull( htmlBody )) {
-HXLINE( 351)			::Array< ::Dynamic> _this = htmlBody->children;
-HXDLIN( 351)			::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN( 351)			{
-HXLINE( 351)				int _g = 0;
-HXDLIN( 351)				int _g1 = _this->length;
-HXDLIN( 351)				while((_g < _g1)){
-HXLINE( 351)					_g = (_g + 1);
-HXDLIN( 351)					int i = (_g - 1);
-HXDLIN( 351)					{
-HXLINE( 351)						 ::borogove::Node el = _hx_array_unsafe_get(_this,i);
-HXDLIN( 351)						if ((el->_hx_getIndex() == 0)) {
-            							HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Participant,sender,::Array< bool >,isAction) HXARGC(1)
-            							bool _hx_run( ::borogove::Stanza child){
-            								HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_351_html)
-HXLINE( 352)								if ((child->name == HX_("img",03,0c,50,00))) {
-HXLINE( 353)									::String src = ( (::String)(::Reflect_obj::field(child->attr,HX_("src",e4,a6,57,00))) );
-HXLINE( 354)									if (::hx::IsNotNull( src )) {
-HXLINE( 355)										 ::borogove::Hash hash = ::borogove::Hash_obj::fromUri(src);
-HXLINE( 356)										if (::hx::IsNotNull( hash )) {
-HXLINE( 357)											 ::Dynamic this1 = child->attr;
-HXDLIN( 357)											::Reflect_obj::setField(this1,HX_("src",e4,a6,57,00),hash->toUri());
-            										}
-            									}
-HXLINE( 360)									return true;
-            								}
-HXLINE( 362)								 ::borogove::Participant senderP = sender;
-HXLINE( 363)								bool this2;
-HXDLIN( 363)								if (::hx::IsNotNull( senderP )) {
-HXLINE( 363)									this2 = ::hx::IsNull( child->getFirstChild() );
-            								}
-            								else {
-HXLINE( 363)									this2 = false;
-            								}
-HXDLIN( 363)								if (this2) {
-HXLINE( 364)									::String txt = child->getText();
-HXLINE( 365)									if (::StringTools_obj::startsWith(txt,HX_("/me",47,09,24,00))) {
-HXLINE( 366)										isAction[0] = true;
-HXLINE( 367)										child->removeChildren(null(),null());
-HXLINE( 368)										::String senderP1 = senderP->displayName;
-HXDLIN( 368)										child->text((senderP1 + txt.substr(3,null())));
-            									}
-            								}
-HXLINE( 371)								return false;
-            							}
-            							HX_END_LOCAL_FUNC1(return)
-
-HXLINE( 351)							el->_hx_getObject(0).StaticCast<  ::borogove::Stanza >()->traverse( ::Dynamic(new _hx_Closure_1(sender,isAction)));
-            						}
-HXDLIN( 351)						 ::borogove::Node this1 = el;
-HXDLIN( 351)						::String inValue;
-HXDLIN( 351)						switch((int)(this1->_hx_getIndex())){
-            							case (int)0: {
-HXLINE( 351)								inValue = this1->_hx_getObject(0).StaticCast<  ::borogove::Stanza >()->serialize();
-            							}
-            							break;
-            							case (int)1: {
-HXLINE( 351)								inValue = ::borogove::_Util::Util_Fields__obj::xmlEscape(this1->_hx_getString(0));
-            							}
-            							break;
-            						}
-HXDLIN( 351)						result->__unsafe_set(i,inValue);
-            					}
-            				}
-            			}
-HXDLIN( 351)			htmlSource = result->join(HX_("",00,00,00,00));
+HXLINE( 377)			htmlBody = null();
+            		}
+HXLINE( 378)		if (::hx::IsNotNull( htmlBody )) {
+HXLINE( 379)			return htmlBody->children;
             		}
             		else {
-            			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(2)
+            			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(2)
             			int _hx_run( ::Dynamic x, ::Dynamic y){
-            				HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_387_html)
-HXLINE( 387)				return (( (int)(y->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)) ) - ( (int)(x->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)) ));
+            				HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_390_htmlBody)
+HXLINE( 390)				return (( (int)(y->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)) ) - ( (int)(x->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)) ));
             			}
             			HX_END_LOCAL_FUNC2(return)
 
-            			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_3) HXARGC(1)
+            			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(1)
             			bool _hx_run( ::borogove::Stanza p){
-            				HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_392_html)
-HXLINE( 392)				if ((( (::String)(::Reflect_obj::field(p->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:styling:0",48,d3,aa,fb))) {
-HXLINE( 392)					return (p->name == HX_("unstyled",2c,15,1a,18));
+            				HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_395_htmlBody)
+HXLINE( 395)				if ((( (::String)(::Reflect_obj::field(p->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:styling:0",48,d3,aa,fb))) {
+HXLINE( 395)					return (p->name == HX_("unstyled",2c,15,1a,18));
             				}
             				else {
-HXLINE( 392)					return false;
+HXLINE( 395)					return false;
             				}
-HXDLIN( 392)				return false;
+HXDLIN( 395)				return false;
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 374)			::String bodyText;
-HXDLIN( 374)			::String tmp1 = this->text;
-HXDLIN( 374)			if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 374)				bodyText = tmp1;
+HXLINE( 381)			::String bodyText;
+HXDLIN( 381)			::String tmp1 = this->text;
+HXDLIN( 381)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 381)				bodyText = tmp1;
             			}
             			else {
-HXLINE( 374)				bodyText = HX_("",00,00,00,00);
+HXLINE( 381)				bodyText = HX_("",00,00,00,00);
             			}
-HXLINE( 375)			bool _hx_tmp;
-HXDLIN( 375)			if (::hx::IsNotNull( sender )) {
-HXLINE( 375)				_hx_tmp = ::StringTools_obj::startsWith(bodyText,HX_("/me",47,09,24,00));
-            			}
-            			else {
-HXLINE( 375)				_hx_tmp = false;
-            			}
-HXDLIN( 375)			if (_hx_tmp) {
-HXLINE( 376)				isAction[0] = true;
-HXLINE( 377)				::String sender1 = sender->displayName;
-HXDLIN( 377)				bodyText = (sender1 + bodyText.substr(3,null()));
-            			}
-HXLINE( 379)			::Array< ::String > codepoints = ::borogove::StringUtil_obj::codepointArray(bodyText);
-HXLINE( 381)			::Array< ::Dynamic> _this1 = this->payloads;
-HXDLIN( 381)			::Array< ::Dynamic> _g2 = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 381)			{
-HXLINE( 381)				int _g3 = 0;
-HXDLIN( 381)				while((_g3 < _this1->length)){
-HXLINE( 381)					 ::borogove::Stanza v = _this1->__get(_g3).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 381)					_g3 = (_g3 + 1);
-HXLINE( 382)					bool fallbacks;
-HXDLIN( 382)					if ((( (::String)(::Reflect_obj::field(v->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:fallback:0",74,aa,56,9b))) {
-HXLINE( 383)						bool fallbacks1;
-HXDLIN( 383)						bool fallbacks2;
-HXDLIN( 383)						bool fallbacks3;
-HXDLIN( 383)						if ((( (::String)(::Reflect_obj::field(v->attr,HX_("for",09,c7,4d,00))) ) != HX_("jabber:x:oob",aa,8a,5f,ef))) {
-HXLINE( 383)							fallbacks3 = (( (::String)(::Reflect_obj::field(v->attr,HX_("for",09,c7,4d,00))) ) == HX_("urn:xmpp:sims:1",4f,1c,49,62));
+HXLINE( 382)			::Array< ::String > codepoints = ::borogove::StringUtil_obj::codepointArray(bodyText);
+HXLINE( 384)			::Array< ::Dynamic> _this = this->payloads;
+HXDLIN( 384)			::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 384)			{
+HXLINE( 384)				int _g1 = 0;
+HXDLIN( 384)				while((_g1 < _this->length)){
+HXLINE( 384)					 ::borogove::Stanza v = _this->__get(_g1).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 384)					_g1 = (_g1 + 1);
+HXLINE( 385)					bool fallbacks;
+HXDLIN( 385)					if ((( (::String)(::Reflect_obj::field(v->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:fallback:0",74,aa,56,9b))) {
+HXLINE( 386)						bool fallbacks1;
+HXDLIN( 386)						bool fallbacks2;
+HXDLIN( 386)						bool fallbacks3;
+HXDLIN( 386)						if ((( (::String)(::Reflect_obj::field(v->attr,HX_("for",09,c7,4d,00))) ) != HX_("jabber:x:oob",aa,8a,5f,ef))) {
+HXLINE( 386)							fallbacks3 = (( (::String)(::Reflect_obj::field(v->attr,HX_("for",09,c7,4d,00))) ) == HX_("urn:xmpp:sims:1",4f,1c,49,62));
             						}
             						else {
-HXLINE( 383)							fallbacks3 = true;
+HXLINE( 386)							fallbacks3 = true;
             						}
-HXDLIN( 383)						if (fallbacks3) {
-HXLINE( 383)							fallbacks2 = (this->attachments->length > 0);
+HXDLIN( 386)						if (fallbacks3) {
+HXLINE( 386)							fallbacks2 = (this->attachments->length > 0);
             						}
             						else {
-HXLINE( 383)							fallbacks2 = false;
+HXLINE( 386)							fallbacks2 = false;
             						}
-HXDLIN( 383)						if (!(fallbacks2)) {
-HXLINE( 384)							if (::hx::IsNotNull( this->replyToMessage )) {
-HXLINE( 383)								fallbacks1 = (( (::String)(::Reflect_obj::field(v->attr,HX_("for",09,c7,4d,00))) ) == HX_("urn:xmpp:reply:0",c4,d5,6f,90));
+HXDLIN( 386)						if (!(fallbacks2)) {
+HXLINE( 387)							if (::hx::IsNotNull( this->replyToMessage )) {
+HXLINE( 386)								fallbacks1 = (( (::String)(::Reflect_obj::field(v->attr,HX_("for",09,c7,4d,00))) ) == HX_("urn:xmpp:reply:0",c4,d5,6f,90));
             							}
             							else {
-HXLINE( 383)								fallbacks1 = false;
+HXLINE( 386)								fallbacks1 = false;
             							}
             						}
             						else {
-HXLINE( 383)							fallbacks1 = true;
+HXLINE( 386)							fallbacks1 = true;
             						}
-HXDLIN( 383)						if (!(fallbacks1)) {
-HXLINE( 382)							fallbacks = (( (::String)(::Reflect_obj::field(v->attr,HX_("for",09,c7,4d,00))) ) == HX_("http://jabber.org/protocol/address",c0,fd,09,ed));
+HXDLIN( 386)						if (!(fallbacks1)) {
+HXLINE( 385)							fallbacks = (( (::String)(::Reflect_obj::field(v->attr,HX_("for",09,c7,4d,00))) ) == HX_("http://jabber.org/protocol/address",c0,fd,09,ed));
             						}
             						else {
-HXLINE( 382)							fallbacks = true;
+HXLINE( 385)							fallbacks = true;
             						}
             					}
             					else {
-HXLINE( 382)						fallbacks = false;
+HXLINE( 385)						fallbacks = false;
             					}
-HXLINE( 381)					if (fallbacks) {
-HXLINE( 381)						_g2->push(v);
+HXLINE( 384)					if (fallbacks) {
+HXLINE( 384)						_g->push(v);
             					}
             				}
             			}
-HXDLIN( 381)			::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new(_g2->length);
-HXDLIN( 381)			{
-HXLINE( 381)				int _g4 = 0;
-HXDLIN( 381)				int _g5 = _g2->length;
-HXDLIN( 381)				while((_g4 < _g5)){
-HXLINE( 381)					_g4 = (_g4 + 1);
-HXDLIN( 381)					int i1 = (_g4 - 1);
-HXDLIN( 381)					{
-HXLINE( 381)						 ::borogove::Stanza inValue1 = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_g2,i1)) )->getChild(HX_("body",a2,7a,1b,41),null());
-HXDLIN( 381)						result1->__unsafe_set(i1,inValue1);
+HXDLIN( 384)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_g->length);
+HXDLIN( 384)			{
+HXLINE( 384)				int _g2 = 0;
+HXDLIN( 384)				int _g3 = _g->length;
+HXDLIN( 384)				while((_g2 < _g3)){
+HXLINE( 384)					_g2 = (_g2 + 1);
+HXDLIN( 384)					int i = (_g2 - 1);
+HXDLIN( 384)					{
+HXLINE( 384)						 ::borogove::Stanza inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_g,i)) )->getChild(HX_("body",a2,7a,1b,41),null());
+HXDLIN( 384)						result->__unsafe_set(i,inValue);
             					}
             				}
             			}
-HXDLIN( 381)			::Array< ::Dynamic> result2 = ::Array_obj< ::Dynamic>::__new(result1->length);
-HXDLIN( 381)			{
-HXLINE( 381)				int _g6 = 0;
-HXDLIN( 381)				int _g7 = result1->length;
-HXDLIN( 381)				while((_g6 < _g7)){
-HXLINE( 381)					_g6 = (_g6 + 1);
-HXDLIN( 381)					int i2 = (_g6 - 1);
-HXDLIN( 381)					{
-HXLINE( 386)						 ::borogove::Stanza b = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(result1,i2)) );
-HXLINE( 381)						 ::Dynamic inValue2;
-HXLINE( 386)						if (::hx::IsNull( b )) {
-HXLINE( 381)							inValue2 = null();
+HXDLIN( 384)			::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new(result->length);
+HXDLIN( 384)			{
+HXLINE( 384)				int _g4 = 0;
+HXDLIN( 384)				int _g5 = result->length;
+HXDLIN( 384)				while((_g4 < _g5)){
+HXLINE( 384)					_g4 = (_g4 + 1);
+HXDLIN( 384)					int i1 = (_g4 - 1);
+HXDLIN( 384)					{
+HXLINE( 389)						 ::borogove::Stanza b = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(result,i1)) );
+HXLINE( 384)						 ::Dynamic inValue1;
+HXLINE( 389)						if (::hx::IsNull( b )) {
+HXLINE( 384)							inValue1 = null();
             						}
             						else {
-HXLINE( 386)							int inValue3;
-HXDLIN( 386)							::String tmp2 = ( (::String)(::Reflect_obj::field(b->attr,HX_("start",62,74,0b,84))) );
-HXDLIN( 386)							::String tmp3;
-HXDLIN( 386)							if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 386)								tmp3 = tmp2;
+HXLINE( 389)							int inValue2;
+HXDLIN( 389)							::String tmp2 = ( (::String)(::Reflect_obj::field(b->attr,HX_("start",62,74,0b,84))) );
+HXDLIN( 389)							::String tmp3;
+HXDLIN( 389)							if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 389)								tmp3 = tmp2;
             							}
             							else {
-HXLINE( 386)								tmp3 = HX_("0",30,00,00,00);
+HXLINE( 389)								tmp3 = HX_("0",30,00,00,00);
             							}
-HXDLIN( 386)							 ::Dynamic tmp4 = ::Std_obj::parseInt(tmp3);
-HXDLIN( 386)							if (::hx::IsNotNull( tmp4 )) {
-HXLINE( 386)								inValue3 = ( (int)(tmp4) );
+HXDLIN( 389)							 ::Dynamic tmp4 = ::Std_obj::parseInt(tmp3);
+HXDLIN( 389)							if (::hx::IsNotNull( tmp4 )) {
+HXLINE( 389)								inValue2 = ( (int)(tmp4) );
             							}
             							else {
-HXLINE( 386)								inValue3 = 0;
+HXLINE( 389)								inValue2 = 0;
             							}
-HXDLIN( 386)							::String tmp5 = ( (::String)(::Reflect_obj::field(b->attr,HX_("end",db,03,4d,00))) );
-HXDLIN( 386)							::String tmp6;
-HXDLIN( 386)							if (::hx::IsNotNull( tmp5 )) {
-HXLINE( 386)								tmp6 = tmp5;
+HXDLIN( 389)							::String tmp5 = ( (::String)(::Reflect_obj::field(b->attr,HX_("end",db,03,4d,00))) );
+HXDLIN( 389)							::String tmp6;
+HXDLIN( 389)							if (::hx::IsNotNull( tmp5 )) {
+HXLINE( 389)								tmp6 = tmp5;
             							}
             							else {
-HXLINE( 386)								tmp6 = ::Std_obj::string(codepoints->length);
+HXLINE( 389)								tmp6 = ::Std_obj::string(codepoints->length);
             							}
-HXDLIN( 386)							 ::Dynamic tmp7 = ::Std_obj::parseInt(tmp6);
-HXDLIN( 386)							int inValue4;
-HXDLIN( 386)							if (::hx::IsNotNull( tmp7 )) {
-HXLINE( 386)								inValue4 = ( (int)(tmp7) );
+HXDLIN( 389)							 ::Dynamic tmp7 = ::Std_obj::parseInt(tmp6);
+HXDLIN( 389)							int inValue3;
+HXDLIN( 389)							if (::hx::IsNotNull( tmp7 )) {
+HXLINE( 389)								inValue3 = ( (int)(tmp7) );
             							}
             							else {
-HXLINE( 386)								inValue4 = codepoints->length;
+HXLINE( 389)								inValue3 = codepoints->length;
             							}
-HXLINE( 381)							inValue2 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            								->setFixed(0,HX_("start",62,74,0b,84),inValue3)
-            								->setFixed(1,HX_("end",db,03,4d,00),inValue4));
+HXLINE( 384)							inValue1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+            								->setFixed(0,HX_("start",62,74,0b,84),inValue2)
+            								->setFixed(1,HX_("end",db,03,4d,00),inValue3));
             						}
-HXDLIN( 381)						result2->__unsafe_set(i2,inValue2);
+HXDLIN( 384)						result1->__unsafe_set(i1,inValue1);
             					}
             				}
             			}
-HXDLIN( 381)			::Array< ::Dynamic> _g8 = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 381)			{
-HXLINE( 381)				int _g9 = 0;
-HXDLIN( 381)				while((_g9 < result2->length)){
-HXLINE( 381)					 ::Dynamic v1 = result2->__get(_g9);
-HXDLIN( 381)					_g9 = (_g9 + 1);
-HXDLIN( 381)					if (::hx::IsNotNull( v1 )) {
-HXLINE( 381)						_g8->push(v1);
+HXDLIN( 384)			::Array< ::Dynamic> _g6 = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 384)			{
+HXLINE( 384)				int _g7 = 0;
+HXDLIN( 384)				while((_g7 < result1->length)){
+HXLINE( 384)					 ::Dynamic v1 = result1->__get(_g7);
+HXDLIN( 384)					_g7 = (_g7 + 1);
+HXDLIN( 384)					if (::hx::IsNotNull( v1 )) {
+HXLINE( 384)						_g6->push(v1);
             					}
             				}
             			}
-HXLINE( 387)			_g8->sort( ::Dynamic(new _hx_Closure_2()));
-HXLINE( 388)			{
-HXLINE( 388)				int _g10 = 0;
-HXDLIN( 388)				while((_g10 < _g8->length)){
-HXLINE( 388)					 ::Dynamic fallback = _g8->__get(_g10);
-HXDLIN( 388)					_g10 = (_g10 + 1);
-HXLINE( 389)					codepoints->removeRange( ::Dynamic(fallback->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)),(( (int)(fallback->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) ) - ( (int)(fallback->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)) )));
+HXLINE( 390)			_g6->sort( ::Dynamic(new _hx_Closure_1()));
+HXLINE( 391)			{
+HXLINE( 391)				int _g8 = 0;
+HXDLIN( 391)				while((_g8 < _g6->length)){
+HXLINE( 391)					 ::Dynamic fallback = _g6->__get(_g8);
+HXDLIN( 391)					_g8 = (_g8 + 1);
+HXLINE( 392)					codepoints->removeRange( ::Dynamic(fallback->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)),(( (int)(fallback->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) ) - ( (int)(fallback->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)) )));
             				}
             			}
-HXLINE( 391)			::String body = codepoints->join(HX_("",00,00,00,00));
-HXLINE( 392)			if (::hx::IsNull( ::Lambda_obj::find(this->payloads, ::Dynamic(new _hx_Closure_3())) )) {
-HXLINE( 392)				::Array< ::Dynamic> _this2 = ::borogove::XEP0393_obj::parse(body);
-HXDLIN( 392)				::Array< ::String > result3 = ::Array_obj< ::String >::__new(_this2->length);
-HXDLIN( 392)				{
-HXLINE( 392)					int _g11 = 0;
-HXDLIN( 392)					int _g12 = _this2->length;
-HXDLIN( 392)					while((_g11 < _g12)){
-HXLINE( 392)						_g11 = (_g11 + 1);
-HXDLIN( 392)						int i3 = (_g11 - 1);
-HXDLIN( 392)						{
-HXLINE( 392)							::String inValue5 = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this2,i3)) )->toString();
-HXDLIN( 392)							result3->__unsafe_set(i3,inValue5);
+HXLINE( 394)			::String body = codepoints->join(HX_("",00,00,00,00));
+HXLINE( 395)			if (::hx::IsNull( ::Lambda_obj::find(this->payloads, ::Dynamic(new _hx_Closure_2())) )) {
+HXLINE( 396)				::Array< ::Dynamic> _this1 = ::borogove::XEP0393_obj::parse(body);
+HXDLIN( 396)				::Array< ::Dynamic> result2 = ::Array_obj< ::Dynamic>::__new(_this1->length);
+HXDLIN( 396)				{
+HXLINE( 396)					int _g9 = 0;
+HXDLIN( 396)					int _g10 = _this1->length;
+HXDLIN( 396)					while((_g9 < _g10)){
+HXLINE( 396)						_g9 = (_g9 + 1);
+HXDLIN( 396)						int i2 = (_g9 - 1);
+HXDLIN( 396)						{
+HXLINE( 396)							 ::borogove::Node inValue4 = ::borogove::Node_obj::Element(_hx_array_unsafe_get(_this1,i2));
+HXDLIN( 396)							result2->__unsafe_set(i2,inValue4);
             						}
             					}
             				}
-HXDLIN( 392)				htmlSource = result3->join(HX_("",00,00,00,00));
+HXDLIN( 396)				return result2;
             			}
             			else {
-HXLINE( 392)				htmlSource = ::StringTools_obj::htmlEscape(body,null());
+HXLINE( 398)				::Array< ::String > _this2 = body.split(HX_("\n\n",c0,08,00,00));
+HXDLIN( 398)				::Array< ::Dynamic> result3 = ::Array_obj< ::Dynamic>::__new(_this2->length);
+HXDLIN( 398)				{
+HXLINE( 398)					int _g11 = 0;
+HXDLIN( 398)					int _g12 = _this2->length;
+HXDLIN( 398)					while((_g11 < _g12)){
+HXLINE( 398)						_g11 = (_g11 + 1);
+HXDLIN( 398)						int i3 = (_g11 - 1);
+HXDLIN( 398)						{
+HXLINE( 399)							::Array< ::Dynamic> _g13 = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 399)							{
+HXLINE( 399)								 ::Dynamic x = ( (::String)(_hx_array_unsafe_get(_this2,i3)) ).split(HX_("\n",0a,00,00,00))->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 399)								while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 399)									 ::borogove::Node _hx_tmp = ::borogove::Node_obj::CData(( (::String)(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) ));
+HXDLIN( 399)									_g13->push(::Array_obj< ::Dynamic>::__new(2)->init(0,_hx_tmp)->init(1,::borogove::Node_obj::Element( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("br",d0,55,00,00),null()))));
+            								}
+            							}
+HXDLIN( 399)							::Array< ::Dynamic> _g14 = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 399)							{
+HXLINE( 399)								 ::Dynamic e = _g13->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 399)								while(( (bool)(e->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 399)									 ::Dynamic x1 = e->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 399)									while(( (bool)(x1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 399)										_g14->push(x1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+            									}
+            								}
+            							}
+HXLINE( 400)							_g14->pop().StaticCast<  ::borogove::Node >();
+HXLINE( 398)							 ::borogove::Node inValue5 = ::borogove::Node_obj::Element( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("p",70,00,00,00),null())->addChildNodes(_g14));
+HXDLIN( 398)							result3->__unsafe_set(i3,inValue5);
+            						}
+            					}
+            				}
+HXDLIN( 398)				return result3;
             			}
             		}
-HXLINE( 394)		if (isAction->__get(0)) {
-HXLINE( 394)			return ((HX_("<div class=\"action\">",04,0c,41,16) + htmlSource) + HX_("</div>",c0,53,a8,4f));
+HXLINE( 378)		return null();
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,htmlBody,return )
+
+ ::borogove::Html ChatMessage_obj::body( ::borogove::Member sender){
+            	HX_GC_STACKFRAME(&_hx_pos_20f00185d7354fd9_415_body)
+HXDLIN( 415)		return  ::borogove::Html_obj::__alloc( HX_CTX ,this->htmlBody(),sender);
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(ChatMessage_obj,body,return )
+
+::String ChatMessage_obj::subject(){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            		bool _hx_run( ::borogove::Stanza el){
+            			HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_422_subject)
+HXDLIN( 422)			return (el->name == HX_("subject",ac,01,88,29));
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_422_subject)
+HXDLIN( 422)		 ::borogove::Stanza tmp = ( ( ::borogove::Stanza)(::Lambda_obj::find(this->payloads, ::Dynamic(new _hx_Closure_0()))) );
+HXDLIN( 422)		if (::hx::IsNotNull( tmp )) {
+HXDLIN( 422)			return tmp->getText();
             		}
             		else {
-HXLINE( 394)			return htmlSource;
+HXDLIN( 422)			return null();
             		}
-HXDLIN( 394)		return null();
+HXDLIN( 422)		return null();
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC1(ChatMessage_obj,html,return )
+HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,subject,return )
 
 ::String ChatMessage_obj::chatId(){
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_401_chatId)
-HXDLIN( 401)		if (this->isIncoming()) {
-HXLINE( 402)			::Array< ::Dynamic> _this = this->replyTo;
-HXDLIN( 402)			::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN( 402)			{
-HXLINE( 402)				int _g = 0;
-HXDLIN( 402)				int _g1 = _this->length;
-HXDLIN( 402)				while((_g < _g1)){
-HXLINE( 402)					_g = (_g + 1);
-HXDLIN( 402)					int i = (_g - 1);
-HXDLIN( 402)					{
-HXLINE( 402)						::String inValue = ( ( ::borogove::JID)(_hx_array_unsafe_get(_this,i)) )->asBare()->asString();
-HXDLIN( 402)						result->__unsafe_set(i,inValue);
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_429_chatId)
+HXDLIN( 429)		if (this->isIncoming()) {
+HXLINE( 430)			::Array< ::Dynamic> _this = this->replyTo;
+HXDLIN( 430)			::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN( 430)			{
+HXLINE( 430)				int _g = 0;
+HXDLIN( 430)				int _g1 = _this->length;
+HXDLIN( 430)				while((_g < _g1)){
+HXLINE( 430)					_g = (_g + 1);
+HXDLIN( 430)					int i = (_g - 1);
+HXDLIN( 430)					{
+HXLINE( 430)						::String inValue = ( ( ::borogove::JID)(_hx_array_unsafe_get(_this,i)) )->asBare()->asString();
+HXDLIN( 430)						result->__unsafe_set(i,inValue);
             					}
             				}
             			}
-HXDLIN( 402)			return result->join(HX_("\n",0a,00,00,00));
+HXDLIN( 430)			return result->join(HX_("\n",0a,00,00,00));
             		}
             		else {
-HXLINE( 404)			::Array< ::Dynamic> _this1 = this->recipients;
-HXDLIN( 404)			::Array< ::String > result1 = ::Array_obj< ::String >::__new(_this1->length);
-HXDLIN( 404)			{
-HXLINE( 404)				int _g2 = 0;
-HXDLIN( 404)				int _g3 = _this1->length;
-HXDLIN( 404)				while((_g2 < _g3)){
-HXLINE( 404)					_g2 = (_g2 + 1);
-HXDLIN( 404)					int i1 = (_g2 - 1);
-HXDLIN( 404)					{
-HXLINE( 404)						::String inValue1 = ( ( ::borogove::JID)(_hx_array_unsafe_get(_this1,i1)) )->asString();
-HXDLIN( 404)						result1->__unsafe_set(i1,inValue1);
+HXLINE( 432)			::Array< ::Dynamic> _this1 = this->recipients;
+HXDLIN( 432)			::Array< ::String > result1 = ::Array_obj< ::String >::__new(_this1->length);
+HXDLIN( 432)			{
+HXLINE( 432)				int _g2 = 0;
+HXDLIN( 432)				int _g3 = _this1->length;
+HXDLIN( 432)				while((_g2 < _g3)){
+HXLINE( 432)					_g2 = (_g2 + 1);
+HXDLIN( 432)					int i1 = (_g2 - 1);
+HXDLIN( 432)					{
+HXLINE( 432)						::String inValue1 = ( ( ::borogove::JID)(_hx_array_unsafe_get(_this1,i1)) )->asString();
+HXDLIN( 432)						result1->__unsafe_set(i1,inValue1);
             					}
             				}
             			}
-HXDLIN( 404)			return result1->join(HX_("\n",0a,00,00,00));
+HXDLIN( 432)			return result1->join(HX_("\n",0a,00,00,00));
             		}
-HXLINE( 401)		return null();
+HXLINE( 429)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,chatId,return )
 
 ::String ChatMessage_obj::account(){
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_412_account)
-HXDLIN( 412)		::String tmp;
-HXDLIN( 412)		if (!(this->isIncoming())) {
-HXDLIN( 412)			 ::borogove::JID tmp1 = this->from;
-HXDLIN( 412)			 ::borogove::JID tmp2;
-HXDLIN( 412)			if (::hx::IsNotNull( tmp1 )) {
-HXDLIN( 412)				tmp2 = tmp1->asBare();
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_440_account)
+HXDLIN( 440)		::String tmp;
+HXDLIN( 440)		if (!(this->isIncoming())) {
+HXDLIN( 440)			 ::borogove::JID tmp1 = this->from;
+HXDLIN( 440)			 ::borogove::JID tmp2;
+HXDLIN( 440)			if (::hx::IsNotNull( tmp1 )) {
+HXDLIN( 440)				tmp2 = tmp1->asBare();
             			}
             			else {
-HXDLIN( 412)				tmp2 = null();
+HXDLIN( 440)				tmp2 = null();
             			}
-HXDLIN( 412)			if (::hx::IsNotNull( tmp2 )) {
-HXDLIN( 412)				tmp = tmp2->asString();
+HXDLIN( 440)			if (::hx::IsNotNull( tmp2 )) {
+HXDLIN( 440)				tmp = tmp2->asString();
             			}
             			else {
-HXDLIN( 412)				tmp = null();
+HXDLIN( 440)				tmp = null();
             			}
             		}
             		else {
-HXDLIN( 412)			 ::borogove::JID tmp3 = this->to;
-HXDLIN( 412)			 ::borogove::JID tmp4;
-HXDLIN( 412)			if (::hx::IsNotNull( tmp3 )) {
-HXDLIN( 412)				tmp4 = tmp3->asBare();
+HXDLIN( 440)			 ::borogove::JID tmp3 = this->to;
+HXDLIN( 440)			 ::borogove::JID tmp4;
+HXDLIN( 440)			if (::hx::IsNotNull( tmp3 )) {
+HXDLIN( 440)				tmp4 = tmp3->asBare();
             			}
             			else {
-HXDLIN( 412)				tmp4 = null();
+HXDLIN( 440)				tmp4 = null();
             			}
-HXDLIN( 412)			if (::hx::IsNotNull( tmp4 )) {
-HXDLIN( 412)				tmp = tmp4->asString();
+HXDLIN( 440)			if (::hx::IsNotNull( tmp4 )) {
+HXDLIN( 440)				tmp = tmp4->asString();
             			}
             			else {
-HXDLIN( 412)				tmp = null();
+HXDLIN( 440)				tmp = null();
             			}
             		}
-HXDLIN( 412)		if (::hx::IsNotNull( tmp )) {
-HXDLIN( 412)			return tmp;
+HXDLIN( 440)		if (::hx::IsNotNull( tmp )) {
+HXDLIN( 440)			return tmp;
             		}
             		else {
-HXDLIN( 412)			HX_STACK_DO_THROW(HX_("from or to is null",7f,19,89,e6));
+HXDLIN( 440)			HX_STACK_DO_THROW(HX_("from or to is null",7f,19,89,e6));
             		}
-HXDLIN( 412)		return null();
+HXDLIN( 440)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,account,return )
 
+ ::borogove::Member ChatMessage_obj::senderMemberStub(){
+            	HX_GC_STACKFRAME(&_hx_pos_20f00185d7354fd9_446_senderMemberStub)
+HXLINE( 447)		::String displayName;
+HXDLIN( 447)		::String tmp;
+HXDLIN( 447)		if ((this->type == 2)) {
+HXLINE( 447)			tmp = this->from->resource;
+            		}
+            		else {
+HXLINE( 447)			tmp = this->from->asString();
+            		}
+HXDLIN( 447)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 447)			displayName = tmp;
+            		}
+            		else {
+HXLINE( 447)			displayName = HX_(" ",20,00,00,00);
+            		}
+HXLINE( 448)		::String _hx_tmp = this->senderId;
+HXDLIN( 448)		return  ::borogove::Member_obj::__alloc( HX_CTX ,_hx_tmp,displayName,null(),!(this->isIncoming()),::Array_obj< ::Dynamic>::__new(0),this->from, ::haxe::ds::StringMap_obj::__alloc( HX_CTX ),null());
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,senderMemberStub,return )
+
+bool ChatMessage_obj::canReplace( ::borogove::ChatMessage other){
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_455_canReplace)
+HXLINE( 456)		bool _hx_tmp;
+HXDLIN( 456)		bool _hx_tmp1;
+HXDLIN( 456)		if (::hx::IsNotNull( other->serverId )) {
+HXLINE( 456)			_hx_tmp1 = (this->serverId == other->serverId);
+            		}
+            		else {
+HXLINE( 456)			_hx_tmp1 = false;
+            		}
+HXDLIN( 456)		if (_hx_tmp1) {
+HXLINE( 456)			_hx_tmp = (this->serverIdBy == other->serverIdBy);
+            		}
+            		else {
+HXLINE( 456)			_hx_tmp = false;
+            		}
+HXDLIN( 456)		if (!(_hx_tmp)) {
+HXLINE( 457)			if ((this->localId == other->localId)) {
+HXLINE( 458)				bool _hx_tmp2;
+HXDLIN( 458)				if (!(this->isIncoming())) {
+HXLINE( 458)					_hx_tmp2 = !(other->isIncoming());
+            				}
+            				else {
+HXLINE( 458)					_hx_tmp2 = false;
+            				}
+HXDLIN( 458)				if (!(_hx_tmp2)) {
+HXLINE( 458)					if ((this->senderId == other->senderId)) {
+HXLINE( 458)						return (this->versions->length > 0);
+            					}
+            					else {
+HXLINE( 458)						return false;
+            					}
+            				}
+            				else {
+HXLINE( 458)					return true;
+            				}
+            			}
+            			else {
+HXLINE( 457)				return false;
+            			}
+            		}
+            		else {
+HXLINE( 456)			return true;
+            		}
+HXDLIN( 456)		return false;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(ChatMessage_obj,canReplace,return )
+
 bool ChatMessage_obj::isIncoming(){
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_419_isIncoming)
-HXDLIN( 419)		return (this->direction == 0);
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_465_isIncoming)
+HXDLIN( 465)		return (this->direction == 0);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,isIncoming,return )
 
 ::String ChatMessage_obj::threadIcon(){
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_426_threadIcon)
-HXDLIN( 426)		if (::hx::IsNull( this->threadId )) {
-HXDLIN( 426)			return null();
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_472_threadIcon)
+HXDLIN( 472)		if (::hx::IsNull( this->threadId )) {
+HXDLIN( 472)			return null();
             		}
             		else {
-HXDLIN( 426)			return ::borogove::Identicon_obj::svg(this->threadId);
+HXDLIN( 472)			return ::borogove::Identicon_obj::svg(this->threadId);
             		}
-HXDLIN( 426)		return null();
+HXDLIN( 472)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,threadIcon,return )
 
+::String ChatMessage_obj::moderationReason(){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            		bool _hx_run( ::borogove::Stanza el){
+            			HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_479_moderationReason)
+HXLINE( 479)			return (( (::String)(::Reflect_obj::field(el->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:message-retract:1",16,5e,d8,d5));
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_478_moderationReason)
+HXLINE( 479)		 ::borogove::Stanza retracted = ( ( ::borogove::Stanza)(::Lambda_obj::find(this->payloads, ::Dynamic(new _hx_Closure_0()))) );
+HXLINE( 480)		if (::hx::IsNull( retracted )) {
+HXLINE( 480)			return null();
+            		}
+            		else {
+HXLINE( 480)			::String tmp = retracted->getChildText(HX_("reason",c4,0f,9d,fc),null());
+HXDLIN( 480)			if (::hx::IsNotNull( tmp )) {
+HXLINE( 480)				return tmp;
+            			}
+            			else {
+HXLINE( 480)				return HX_("moderated",41,37,3b,22);
+            			}
+            		}
+HXDLIN( 480)		return null();
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,moderationReason,return )
+
 ::String ChatMessage_obj::callStatus(){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		bool _hx_run( ::borogove::Stanza el){
-            			HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_433_callStatus)
-HXDLIN( 433)			return (( (::String)(::Reflect_obj::field(el->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
+            			HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_487_callStatus)
+HXDLIN( 487)			return (( (::String)(::Reflect_obj::field(el->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_433_callStatus)
-HXDLIN( 433)		 ::borogove::Stanza tmp = ( ( ::borogove::Stanza)(::Lambda_obj::find(this->payloads, ::Dynamic(new _hx_Closure_0()))) );
-HXDLIN( 433)		if (::hx::IsNotNull( tmp )) {
-HXDLIN( 433)			return tmp->name;
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_487_callStatus)
+HXDLIN( 487)		 ::borogove::Stanza tmp = ( ( ::borogove::Stanza)(::Lambda_obj::find(this->payloads, ::Dynamic(new _hx_Closure_0()))) );
+HXDLIN( 487)		if (::hx::IsNotNull( tmp )) {
+HXDLIN( 487)			return tmp->name;
             		}
             		else {
-HXDLIN( 433)			return null();
+HXDLIN( 487)			return null();
             		}
-HXDLIN( 433)		return null();
+HXDLIN( 487)		return null();
             	}
 
 
@@ -1215,363 +1281,367 @@ HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,callStatus,return )
 ::String ChatMessage_obj::callSid(){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		bool _hx_run( ::borogove::Stanza el){
-            			HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_440_callSid)
-HXDLIN( 440)			return (( (::String)(::Reflect_obj::field(el->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
+            			HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_494_callSid)
+HXDLIN( 494)			return (( (::String)(::Reflect_obj::field(el->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_440_callSid)
-HXDLIN( 440)		 ::borogove::Stanza tmp = ( ( ::borogove::Stanza)(::Lambda_obj::find(this->payloads, ::Dynamic(new _hx_Closure_0()))) );
-HXDLIN( 440)		 ::Dynamic tmp1;
-HXDLIN( 440)		if (::hx::IsNotNull( tmp )) {
-HXDLIN( 440)			tmp1 = tmp->attr;
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_494_callSid)
+HXDLIN( 494)		 ::borogove::Stanza tmp = ( ( ::borogove::Stanza)(::Lambda_obj::find(this->payloads, ::Dynamic(new _hx_Closure_0()))) );
+HXDLIN( 494)		 ::Dynamic tmp1;
+HXDLIN( 494)		if (::hx::IsNotNull( tmp )) {
+HXDLIN( 494)			tmp1 = tmp->attr;
             		}
             		else {
-HXDLIN( 440)			tmp1 = null();
+HXDLIN( 494)			tmp1 = null();
             		}
-HXDLIN( 440)		if (::hx::IsNotNull( tmp1 )) {
-HXDLIN( 440)			return ( (::String)(::Reflect_obj::field(tmp1,HX_("id",db,5b,00,00))) );
+HXDLIN( 494)		if (::hx::IsNotNull( tmp1 )) {
+HXDLIN( 494)			return ( (::String)(::Reflect_obj::field(tmp1,HX_("id",db,5b,00,00))) );
             		}
             		else {
-HXDLIN( 440)			return null();
+HXDLIN( 494)			return null();
             		}
-HXDLIN( 440)		return null();
+HXDLIN( 494)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,callSid,return )
 
 ::String ChatMessage_obj::callDuration(){
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_446_callDuration)
-HXLINE( 447)		if ((this->versions->length < 2)) {
-HXLINE( 447)			return null();
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_500_callDuration)
+HXLINE( 501)		if ((this->versions->length < 2)) {
+HXLINE( 501)			return null();
             		}
-HXLINE( 448)		::String startedStr = this->versions->__get((this->versions->length - 1)).StaticCast<  ::borogove::ChatMessage >()->timestamp;
-HXLINE( 450)		::String _g = this->callStatus();
-HXDLIN( 450)		if (::hx::IsNull( _g )) {
-HXLINE( 465)			return null();
+HXLINE( 502)		::String startedStr = this->versions->__get((this->versions->length - 1)).StaticCast<  ::borogove::ChatMessage >()->timestamp;
+HXLINE( 504)		::String _g = this->callStatus();
+HXDLIN( 504)		if (::hx::IsNull( _g )) {
+HXLINE( 519)			return null();
             		}
             		else {
-HXLINE( 450)			::String _hx_switch_0 = _g;
+HXLINE( 504)			::String _hx_switch_0 = _g;
             			if (  (_hx_switch_0==HX_("finish",53,40,7f,86)) ){
-HXLINE( 452)				::String endedStr = this->versions->__get(0).StaticCast<  ::borogove::ChatMessage >()->timestamp;
-HXLINE( 453)				bool _hx_tmp;
-HXDLIN( 453)				if (::hx::IsNotNull( startedStr )) {
-HXLINE( 453)					_hx_tmp = ::hx::IsNull( endedStr );
+HXLINE( 506)				::String endedStr = this->versions->__get(0).StaticCast<  ::borogove::ChatMessage >()->timestamp;
+HXLINE( 507)				bool _hx_tmp;
+HXDLIN( 507)				if (::hx::IsNotNull( startedStr )) {
+HXLINE( 507)					_hx_tmp = ::hx::IsNull( endedStr );
             				}
             				else {
-HXLINE( 453)					_hx_tmp = true;
+HXLINE( 507)					_hx_tmp = true;
             				}
-HXDLIN( 453)				if (_hx_tmp) {
-HXLINE( 453)					return null();
+HXDLIN( 507)				if (_hx_tmp) {
+HXLINE( 507)					return null();
             				}
-HXLINE( 454)				Float started = ::datetime::utils::DateTimeUtils_obj::fromString(startedStr);
-HXLINE( 457)				return ::datetime::utils::DateTimeIntervalUtils_obj::strftime(::datetime::_DateTimeInterval::DateTimeInterval_Impl__obj::create(started,((::datetime::utils::DateTimeUtils_obj::fromString(endedStr) - ((Float)62135596800.0)) + ((Float)62135596800.0))),HX_("%I:%S",44,2d,40,7e));
-HXLINE( 451)				goto _hx_goto_57;
+HXLINE( 508)				Float started = ::datetime::utils::DateTimeUtils_obj::fromString(startedStr);
+HXLINE( 511)				return ::datetime::utils::DateTimeIntervalUtils_obj::strftime(::datetime::_DateTimeInterval::DateTimeInterval_Impl__obj::create(started,((::datetime::utils::DateTimeUtils_obj::fromString(endedStr) - ((Float)62135596800.0)) + ((Float)62135596800.0))),HX_("%I:%S",44,2d,40,7e));
+HXLINE( 505)				goto _hx_goto_64;
             			}
             			if (  (_hx_switch_0==HX_("proceed",2e,96,4a,f1)) ){
-HXLINE( 459)				if (::hx::IsNull( startedStr )) {
-HXLINE( 459)					return null();
+HXLINE( 513)				if (::hx::IsNull( startedStr )) {
+HXLINE( 513)					return null();
             				}
-HXLINE( 460)				Float started1 = ::datetime::utils::DateTimeUtils_obj::fromString(startedStr);
-HXLINE( 463)				return ::datetime::utils::DateTimeIntervalUtils_obj::strftime(::datetime::_DateTimeInterval::DateTimeInterval_Impl__obj::create(started1,((( ::__hxcpp_date_now() + ((Float)62135596800.0)) - ((Float)62135596800.0)) + ((Float)62135596800.0))),HX_("%I:%S",44,2d,40,7e));
-HXLINE( 458)				goto _hx_goto_57;
+HXLINE( 514)				Float started1 = ::datetime::utils::DateTimeUtils_obj::fromString(startedStr);
+HXLINE( 517)				return ::datetime::utils::DateTimeIntervalUtils_obj::strftime(::datetime::_DateTimeInterval::DateTimeInterval_Impl__obj::create(started1,((( ::__hxcpp_date_now() + ((Float)62135596800.0)) - ((Float)62135596800.0)) + ((Float)62135596800.0))),HX_("%I:%S",44,2d,40,7e));
+HXLINE( 512)				goto _hx_goto_64;
             			}
             			/* default */{
-HXLINE( 465)				return null();
+HXLINE( 519)				return null();
             			}
-            			_hx_goto_57:;
+            			_hx_goto_64:;
             		}
-HXLINE( 450)		return null();
+HXLINE( 504)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,callDuration,return )
 
  ::borogove::Stanza ChatMessage_obj::asStanza(){
-            	HX_GC_STACKFRAME(&_hx_pos_20f00185d7354fd9_470_asStanza)
-HXDLIN( 470)		 ::borogove::ChatMessage _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 471)		if (::hx::IsNotNull( this->stanza )) {
-HXLINE( 471)			return this->stanza;
+            	HX_GC_STACKFRAME(&_hx_pos_20f00185d7354fd9_524_asStanza)
+HXDLIN( 524)		 ::borogove::ChatMessage _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 525)		if (::hx::IsNotNull( this->stanza )) {
+HXLINE( 525)			return this->stanza;
             		}
-HXLINE( 473)		::String body = this->text;
-HXLINE( 474)		::String attrs;
-HXDLIN( 474)		if ((this->type == 2)) {
-HXLINE( 474)			attrs = HX_("groupchat",97,1d,c8,e5);
+HXLINE( 527)		::String body = this->text;
+HXLINE( 528)		::String attrs;
+HXDLIN( 528)		if ((this->type == 2)) {
+HXLINE( 528)			attrs = HX_("groupchat",97,1d,c8,e5);
             		}
             		else {
-HXLINE( 474)			attrs = HX_("chat",d8,5e,bf,41);
+HXLINE( 528)			attrs = HX_("chat",d8,5e,bf,41);
             		}
-HXDLIN( 474)		 ::Dynamic attrs1 =  ::Dynamic(::hx::Anon_obj::Create(1)
+HXDLIN( 528)		 ::Dynamic attrs1 =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("type",ba,f2,08,4d),attrs));
-HXLINE( 475)		if (::hx::IsNotNull( this->from )) {
-HXLINE( 475)			::Reflect_obj::setField(attrs1,HX_("from",6a,a5,c2,43),this->from->asString());
+HXLINE( 529)		if (::hx::IsNotNull( this->from )) {
+HXLINE( 529)			::Reflect_obj::setField(attrs1,HX_("from",6a,a5,c2,43),this->from->asString());
             		}
-HXLINE( 476)		if (::hx::IsNotNull( this->to )) {
-HXLINE( 476)			::Reflect_obj::setField(attrs1,HX_("to",7b,65,00,00),this->to->asString());
+HXLINE( 530)		if (::hx::IsNotNull( this->to )) {
+HXLINE( 530)			::Reflect_obj::setField(attrs1,HX_("to",7b,65,00,00),this->to->asString());
             		}
-HXLINE( 477)		if (::hx::IsNotNull( this->localId )) {
-HXLINE( 477)			::Reflect_obj::setField(attrs1,HX_("id",db,5b,00,00),this->localId);
+HXLINE( 531)		if (::hx::IsNotNull( this->localId )) {
+HXLINE( 531)			::Reflect_obj::setField(attrs1,HX_("id",db,5b,00,00),this->localId);
             		}
-HXLINE( 478)		 ::borogove::Stanza stanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a),attrs1);
-HXLINE( 479)		bool _hx_tmp;
-HXDLIN( 479)		if ((this->versions->length > 0)) {
-HXLINE( 479)			_hx_tmp = ::hx::IsNotNull( this->versions->__get((this->versions->length - 1)).StaticCast<  ::borogove::ChatMessage >()->localId );
+HXLINE( 532)		 ::borogove::Stanza stanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a),attrs1);
+HXLINE( 533)		bool _hx_tmp;
+HXDLIN( 533)		if ((this->versions->length > 0)) {
+HXLINE( 533)			_hx_tmp = ::hx::IsNotNull( this->versions->__get((this->versions->length - 1)).StaticCast<  ::borogove::ChatMessage >()->localId );
             		}
             		else {
-HXLINE( 479)			_hx_tmp = false;
+HXLINE( 533)			_hx_tmp = false;
             		}
-HXDLIN( 479)		if (_hx_tmp) {
-HXLINE( 479)			stanza->tag(HX_("replace",34,48,28,ab), ::Dynamic(::hx::Anon_obj::Create(2)
+HXDLIN( 533)		if (_hx_tmp) {
+HXLINE( 533)			stanza->tag(HX_("replace",34,48,28,ab), ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("id",db,5b,00,00),this->versions->__get((this->versions->length - 1)).StaticCast<  ::borogove::ChatMessage >()->localId)
             				->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:message-correct:0",be,10,1b,b0))))->up();
             		}
-HXLINE( 480)		if (::hx::IsNotNull( this->threadId )) {
-HXLINE( 480)			stanza->textTag(HX_("thread",ca,7a,b9,8e),this->threadId,null());
+HXLINE( 534)		if (::hx::IsNotNull( this->threadId )) {
+HXLINE( 534)			stanza->textTag(HX_("thread",ca,7a,b9,8e),this->threadId,null());
             		}
-HXLINE( 481)		if ((this->recipients->length > 1)) {
-HXLINE( 482)			 ::borogove::Stanza addresses = stanza->tag(HX_("addresses",22,9f,12,8c), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 535)		if ((this->recipients->length > 1)) {
+HXLINE( 536)			 ::borogove::Stanza addresses = stanza->tag(HX_("addresses",22,9f,12,8c), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/address",c0,fd,09,ed))));
-HXLINE( 483)			{
-HXLINE( 483)				int _g = 0;
-HXDLIN( 483)				::Array< ::Dynamic> _g1 = this->recipients;
-HXDLIN( 483)				while((_g < _g1->length)){
-HXLINE( 483)					 ::borogove::JID recipient = _g1->__get(_g).StaticCast<  ::borogove::JID >();
-HXDLIN( 483)					_g = (_g + 1);
-HXLINE( 484)					addresses->tag(HX_("address",b4,71,0b,9d), ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE( 537)			{
+HXLINE( 537)				int _g = 0;
+HXDLIN( 537)				::Array< ::Dynamic> _g1 = this->recipients;
+HXDLIN( 537)				while((_g < _g1->length)){
+HXLINE( 537)					 ::borogove::JID recipient = _g1->__get(_g).StaticCast<  ::borogove::JID >();
+HXDLIN( 537)					_g = (_g + 1);
+HXLINE( 538)					addresses->tag(HX_("address",b4,71,0b,9d), ::Dynamic(::hx::Anon_obj::Create(3)
             						->setFixed(0,HX_("delivered",84,e0,1c,b2),HX_("true",4e,a7,03,4d))
             						->setFixed(1,HX_("jid",c5,ca,50,00),recipient->asString())
             						->setFixed(2,HX_("type",ba,f2,08,4d),HX_("to",7b,65,00,00))))->up();
             				}
             			}
-HXLINE( 486)			addresses->up();
+HXLINE( 540)			addresses->up();
             		}
             		else {
-HXLINE( 487)			bool _hx_tmp1;
-HXDLIN( 487)			if ((this->recipients->length == 1)) {
-HXLINE( 487)				_hx_tmp1 = ::hx::IsNull( this->to );
+HXLINE( 541)			bool _hx_tmp1;
+HXDLIN( 541)			if ((this->recipients->length == 1)) {
+HXLINE( 541)				_hx_tmp1 = ::hx::IsNull( this->to );
             			}
             			else {
-HXLINE( 487)				_hx_tmp1 = false;
+HXLINE( 541)				_hx_tmp1 = false;
             			}
-HXDLIN( 487)			if (_hx_tmp1) {
-HXLINE( 488)				::Reflect_obj::setField(attrs1,HX_("to",7b,65,00,00),this->recipients->__get(0).StaticCast<  ::borogove::JID >()->asString());
+HXDLIN( 541)			if (_hx_tmp1) {
+HXLINE( 542)				::Reflect_obj::setField(attrs1,HX_("to",7b,65,00,00),this->recipients->__get(0).StaticCast<  ::borogove::JID >()->asString());
             			}
             		}
-HXLINE( 491)		 ::borogove::ChatMessage replyToM = this->replyToMessage;
-HXLINE( 492)		if (::hx::IsNotNull( replyToM )) {
-HXLINE( 493)			::String replyId = replyToM->getReplyId();
-HXLINE( 494)			if (::hx::IsNotNull( body )) {
-HXLINE( 495)				::Array< ::String > lines;
-HXDLIN( 495)				::String tmp = replyToM->text;
-HXDLIN( 495)				::Array< ::String > tmp1;
-HXDLIN( 495)				if (::hx::IsNotNull( tmp )) {
-HXLINE( 495)					tmp1 = tmp.split(HX_("\n",0a,00,00,00));
+HXLINE( 545)		 ::borogove::ChatMessage replyToM = this->replyToMessage;
+HXLINE( 546)		if (::hx::IsNotNull( replyToM )) {
+HXLINE( 547)			::String replyId = replyToM->getReplyId();
+HXLINE( 548)			if (::hx::IsNotNull( body )) {
+HXLINE( 549)				::Array< ::String > lines;
+HXDLIN( 549)				::String tmp = replyToM->text;
+HXDLIN( 549)				::Array< ::String > tmp1;
+HXDLIN( 549)				if (::hx::IsNotNull( tmp )) {
+HXLINE( 549)					tmp1 = tmp.split(HX_("\n",0a,00,00,00));
             				}
             				else {
-HXLINE( 495)					tmp1 = null();
+HXLINE( 549)					tmp1 = null();
             				}
-HXDLIN( 495)				if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 495)					lines = tmp1;
+HXDLIN( 549)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 549)					lines = tmp1;
             				}
             				else {
-HXLINE( 495)					lines = ::Array_obj< ::String >::__new(0);
+HXLINE( 549)					lines = ::Array_obj< ::String >::__new(0);
             				}
-HXLINE( 496)				::String quoteText = HX_("",00,00,00,00);
-HXLINE( 497)				{
-HXLINE( 497)					int _g2 = 0;
-HXDLIN( 497)					while((_g2 < lines->length)){
-HXLINE( 497)						::String line = lines->__get(_g2);
-HXDLIN( 497)						_g2 = (_g2 + 1);
-HXLINE( 498)						if (!( ::EReg_obj::__alloc( HX_CTX ,HX_("^(?:> ?){3,}",7a,64,54,8e),HX_("",00,00,00,00))->match(line))) {
-HXLINE( 499)							if ((line.charAt(0) == HX_(">",3e,00,00,00))) {
-HXLINE( 500)								quoteText = (quoteText + ((HX_(">",3e,00,00,00) + line) + HX_("\n",0a,00,00,00)));
+HXLINE( 550)				::String quoteText = HX_("",00,00,00,00);
+HXLINE( 551)				{
+HXLINE( 551)					int _g2 = 0;
+HXDLIN( 551)					while((_g2 < lines->length)){
+HXLINE( 551)						::String line = lines->__get(_g2);
+HXDLIN( 551)						_g2 = (_g2 + 1);
+HXLINE( 552)						if (!( ::EReg_obj::__alloc( HX_CTX ,HX_("^(?:> ?){3,}",7a,64,54,8e),HX_("",00,00,00,00))->match(line))) {
+HXLINE( 553)							if ((line.charAt(0) == HX_(">",3e,00,00,00))) {
+HXLINE( 554)								quoteText = (quoteText + ((HX_(">",3e,00,00,00) + line) + HX_("\n",0a,00,00,00)));
             							}
             							else {
-HXLINE( 502)								quoteText = (quoteText + ((HX_("> ",22,36,00,00) + line) + HX_("\n",0a,00,00,00)));
+HXLINE( 556)								quoteText = (quoteText + ((HX_("> ",22,36,00,00) + line) + HX_("\n",0a,00,00,00)));
             							}
             						}
             					}
             				}
-HXLINE( 506)				if ((quoteText != HX_("",00,00,00,00))) {
-HXLINE( 506)					quoteText = (quoteText + HX_("\n",0a,00,00,00));
+HXLINE( 560)				if ((quoteText != HX_("",00,00,00,00))) {
+HXLINE( 560)					quoteText = (quoteText + HX_("\n",0a,00,00,00));
             				}
-HXLINE( 507)				::String reaction;
-HXDLIN( 507)				if (::borogove::EmojiUtil_obj::isEmoji(::StringTools_obj::trim(body))) {
-HXLINE( 507)					reaction = ::StringTools_obj::trim(body);
+HXLINE( 561)				::String reaction;
+HXDLIN( 561)				if (::borogove::EmojiUtil_obj::isEmoji(::StringTools_obj::trim(body))) {
+HXLINE( 561)					reaction = ::StringTools_obj::trim(::StringTools_obj::replace(body,HX_W(u"\ufe0f",fb86,00b5),HX_("",00,00,00,00)));
             				}
             				else {
-HXLINE( 507)					reaction = null();
+HXLINE( 561)					reaction = null();
             				}
-HXLINE( 508)				body = (quoteText + body);
-HXLINE( 509)				if (::hx::IsNotNull( replyId )) {
-HXLINE( 510)					::Array< ::String > codepoints = ::borogove::StringUtil_obj::codepointArray(quoteText);
-HXLINE( 511)					if (::hx::IsNotNull( reaction )) {
-HXLINE( 512)						 ::haxe::ds::StringMap addedReactions =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE( 513)						stanza->tag(HX_("reactions",aa,cc,95,e7), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 562)				body = (quoteText + body);
+HXLINE( 563)				if (::hx::IsNotNull( replyId )) {
+HXLINE( 564)					::Array< ::String > codepoints = ::borogove::StringUtil_obj::codepointArray(quoteText);
+HXLINE( 565)					if (::hx::IsNotNull( reaction )) {
+HXLINE( 566)						 ::haxe::ds::StringMap addedReactions =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 567)						stanza->tag(HX_("reactions",aa,cc,95,e7), ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("id",db,5b,00,00),replyId)
             							->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:reactions:0",44,fb,42,53))));
-HXLINE( 514)						stanza->textTag(HX_("reaction",a9,e7,b4,f6),reaction,null());
-HXLINE( 515)						addedReactions->set(reaction,true);
-HXLINE( 517)						{
-HXLINE( 517)							::Dynamic this1 = replyToM->reactions;
-HXDLIN( 517)							 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this1);
-HXDLIN( 517)							while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 517)								::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXDLIN( 517)								::Array< ::Dynamic> _g_value = ( (::Array< ::Dynamic>)(::haxe::IMap_obj::get(this1,key)) );
-HXLINE( 518)								bool _hx_tmp2;
-HXDLIN( 518)								 ::Dynamic tmp2 = addedReactions->get(key);
-HXDLIN( 518)								bool _hx_tmp3;
-HXDLIN( 518)								if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 518)									_hx_tmp3 = ( (bool)(tmp2) );
+HXLINE( 568)						stanza->textTag(HX_("reaction",a9,e7,b4,f6),reaction,null());
+HXLINE( 569)						addedReactions->set(reaction,true);
+HXLINE( 571)						{
+HXLINE( 571)							::Dynamic this1 = replyToM->reactions;
+HXDLIN( 571)							 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this1);
+HXDLIN( 571)							while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 571)								::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN( 571)								::Array< ::Dynamic> _g_value = ( (::Array< ::Dynamic>)(::haxe::IMap_obj::get(this1,key)) );
+HXLINE( 572)								bool _hx_tmp2;
+HXDLIN( 572)								 ::Dynamic tmp2 = addedReactions->get(key);
+HXDLIN( 572)								bool _hx_tmp3;
+HXDLIN( 572)								if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 572)									_hx_tmp3 = ( (bool)(tmp2) );
             								}
             								else {
-HXLINE( 518)									_hx_tmp3 = false;
+HXLINE( 572)									_hx_tmp3 = false;
             								}
-HXDLIN( 518)								if (!(_hx_tmp3)) {
+HXDLIN( 572)								if (!(_hx_tmp3)) {
             									HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::ChatMessage,_gthis) HXARGC(1)
             									bool _hx_run( ::borogove::Reaction r){
-            										HX_GC_STACKFRAME(&_hx_pos_20f00185d7354fd9_518_asStanza)
-HXLINE( 518)										return (r->senderId == _gthis->senderId);
+            										HX_GC_STACKFRAME(&_hx_pos_20f00185d7354fd9_572_asStanza)
+HXLINE( 572)										return (r->senderId == _gthis->senderId);
             									}
             									HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 518)									_hx_tmp2 = ::hx::IsNotNull( ::Lambda_obj::find(_g_value, ::Dynamic(new _hx_Closure_0(_gthis))) );
+HXLINE( 572)									_hx_tmp2 = ::hx::IsNotNull( ::Lambda_obj::find(_g_value, ::Dynamic(new _hx_Closure_0(_gthis))) );
             								}
             								else {
-HXLINE( 518)									_hx_tmp2 = false;
+HXLINE( 572)									_hx_tmp2 = false;
             								}
-HXDLIN( 518)								if (_hx_tmp2) {
-HXLINE( 519)									addedReactions->set(key,true);
-HXLINE( 520)									stanza->textTag(HX_("reaction",a9,e7,b4,f6),key,null());
+HXDLIN( 572)								if (_hx_tmp2) {
+HXLINE( 573)									addedReactions->set(key,true);
+HXLINE( 574)									stanza->textTag(HX_("reaction",a9,e7,b4,f6),key,null());
             								}
             							}
             						}
-HXLINE( 523)						stanza->up();
-HXLINE( 524)						stanza->tag(HX_("fallback",22,f0,9d,2a), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 577)						stanza->up();
+HXLINE( 578)						stanza->tag(HX_("fallback",22,f0,9d,2a), ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("for",09,c7,4d,00),HX_("urn:xmpp:reactions:0",44,fb,42,53))
             							->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:fallback:0",74,aa,56,9b))))->tag(HX_("body",a2,7a,1b,41),null())->up()->up();
             					}
-HXLINE( 527)					 ::borogove::Stanza _hx_tmp4 = stanza->tag(HX_("fallback",22,f0,9d,2a), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 581)					 ::borogove::Stanza _hx_tmp4 = stanza->tag(HX_("fallback",22,f0,9d,2a), ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("for",09,c7,4d,00),HX_("urn:xmpp:reply:0",c4,d5,6f,90))
             						->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:fallback:0",74,aa,56,9b))));
-HXDLIN( 527)					_hx_tmp4->tag(HX_("body",a2,7a,1b,41), ::Dynamic(::hx::Anon_obj::Create(2)
+HXDLIN( 581)					_hx_tmp4->tag(HX_("body",a2,7a,1b,41), ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("start",62,74,0b,84),HX_("0",30,00,00,00))
             						->setFixed(1,HX_("end",db,03,4d,00),::Std_obj::string(codepoints->length))))->up()->up();
             				}
             			}
-HXLINE( 531)			if (::hx::IsNotNull( replyId )) {
-HXLINE( 531)				 ::borogove::JID tmp3 = replyToM->from;
-HXDLIN( 531)				::String _hx_tmp5;
-HXDLIN( 531)				if (::hx::IsNotNull( tmp3 )) {
-HXLINE( 531)					_hx_tmp5 = tmp3->asString();
+HXLINE( 585)			if (::hx::IsNotNull( replyId )) {
+HXLINE( 585)				 ::borogove::JID tmp3 = replyToM->from;
+HXDLIN( 585)				::String _hx_tmp5;
+HXDLIN( 585)				if (::hx::IsNotNull( tmp3 )) {
+HXLINE( 585)					_hx_tmp5 = tmp3->asString();
             				}
             				else {
-HXLINE( 531)					_hx_tmp5 = null();
+HXLINE( 585)					_hx_tmp5 = null();
             				}
-HXDLIN( 531)				stanza->tag(HX_("reply",2a,09,c6,e6), ::Dynamic(::hx::Anon_obj::Create(3)
+HXDLIN( 585)				stanza->tag(HX_("reply",2a,09,c6,e6), ::Dynamic(::hx::Anon_obj::Create(3)
             					->setFixed(0,HX_("id",db,5b,00,00),replyId)
             					->setFixed(1,HX_("to",7b,65,00,00),_hx_tmp5)
             					->setFixed(2,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:reply:0",c4,d5,6f,90))))->up();
             			}
             		}
-HXLINE( 534)		{
-HXLINE( 534)			int _g3 = 0;
-HXDLIN( 534)			::Array< ::Dynamic> _g4 = this->attachments;
-HXDLIN( 534)			while((_g3 < _g4->length)){
-HXLINE( 534)				 ::borogove::ChatAttachment attachment = _g4->__get(_g3).StaticCast<  ::borogove::ChatAttachment >();
-HXDLIN( 534)				_g3 = (_g3 + 1);
-HXLINE( 535)				stanza->tag(HX_("reference",cb,07,c5,5a), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 588)		{
+HXLINE( 588)			int _g3 = 0;
+HXDLIN( 588)			::Array< ::Dynamic> _g4 = this->attachments;
+HXDLIN( 588)			while((_g3 < _g4->length)){
+HXLINE( 588)				 ::borogove::ChatAttachment attachment = _g4->__get(_g3).StaticCast<  ::borogove::ChatAttachment >();
+HXDLIN( 588)				_g3 = (_g3 + 1);
+HXLINE( 589)				stanza->tag(HX_("reference",cb,07,c5,5a), ::Dynamic(::hx::Anon_obj::Create(2)
             					->setFixed(0,HX_("type",ba,f2,08,4d),HX_("data",2a,56,63,42))
             					->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:reference:0",a5,00,10,5d))))->tag(HX_("media-sharing",33,1c,0a,3d), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:sims:1",4f,1c,49,62))));
-HXLINE( 539)				stanza->tag(HX_("file",7c,ce,bb,43), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 593)				stanza->tag(HX_("file",7c,ce,bb,43), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:jingle:apps:file-transfer:5",9c,81,0d,37))));
-HXLINE( 540)				if (::hx::IsNotNull( attachment->name )) {
-HXLINE( 540)					stanza->textTag(HX_("name",4b,72,ff,48),attachment->name,null());
+HXLINE( 594)				if (::hx::IsNotNull( attachment->name )) {
+HXLINE( 594)					stanza->textTag(HX_("name",4b,72,ff,48),attachment->name,null());
             				}
-HXLINE( 541)				stanza->textTag(HX_("media-type",03,ce,a4,7d),attachment->mime,null());
-HXLINE( 542)				if (::hx::IsNotNull( attachment->size )) {
-HXLINE( 542)					stanza->textTag(HX_("size",c1,a0,53,4c),::Std_obj::string(attachment->size),null());
+HXLINE( 595)				stanza->textTag(HX_("media-type",03,ce,a4,7d),attachment->mime,null());
+HXLINE( 596)				if (::hx::IsNotNull( attachment->size )) {
+HXLINE( 596)					stanza->textTag(HX_("size",c1,a0,53,4c),::Std_obj::string(attachment->size),null());
             				}
-HXLINE( 543)				{
-HXLINE( 543)					int _g5 = 0;
-HXDLIN( 543)					::Array< ::Dynamic> _g6 = attachment->hashes;
-HXDLIN( 543)					while((_g5 < _g6->length)){
-HXLINE( 543)						 ::borogove::Hash hash = _g6->__get(_g5).StaticCast<  ::borogove::Hash >();
-HXDLIN( 543)						_g5 = (_g5 + 1);
-HXLINE( 544)						::String _hx_tmp6 = ::haxe::crypto::Base64_obj::encode(::haxe::io::Bytes_obj::ofData(hash->hash),null());
-HXDLIN( 544)						stanza->textTag(HX_("hash",ce,2f,08,45),_hx_tmp6, ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 597)				{
+HXLINE( 597)					int _g5 = 0;
+HXDLIN( 597)					::Array< ::Dynamic> _g6 = attachment->hashes;
+HXDLIN( 597)					while((_g5 < _g6->length)){
+HXLINE( 597)						 ::borogove::Hash hash = _g6->__get(_g5).StaticCast<  ::borogove::Hash >();
+HXDLIN( 597)						_g5 = (_g5 + 1);
+HXLINE( 598)						::String _hx_tmp6 = ::haxe::crypto::Base64_obj::encode(::haxe::io::Bytes_obj::ofData(hash->hash),null());
+HXDLIN( 598)						stanza->textTag(HX_("hash",ce,2f,08,45),_hx_tmp6, ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("algo",d3,ff,6f,40),hash->algorithm)
             							->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:hashes:2",90,ad,87,c7))));
             					}
             				}
-HXLINE( 546)				stanza->up();
-HXLINE( 548)				stanza->tag(HX_("sources",38,0f,49,b9),null());
-HXLINE( 549)				{
-HXLINE( 549)					int _g7 = 0;
-HXDLIN( 549)					::Array< ::String > _g8 = attachment->uris;
-HXDLIN( 549)					while((_g7 < _g8->length)){
-HXLINE( 549)						::String uri = _g8->__get(_g7);
-HXDLIN( 549)						_g7 = (_g7 + 1);
-HXLINE( 550)						stanza->tag(HX_("reference",cb,07,c5,5a), ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE( 600)				stanza->up();
+HXLINE( 602)				stanza->tag(HX_("sources",38,0f,49,b9),null());
+HXLINE( 603)				{
+HXLINE( 603)					int _g7 = 0;
+HXDLIN( 603)					::Array< ::String > _g8 = attachment->uris;
+HXDLIN( 603)					while((_g7 < _g8->length)){
+HXLINE( 603)						::String uri = _g8->__get(_g7);
+HXDLIN( 603)						_g7 = (_g7 + 1);
+HXLINE( 604)						stanza->tag(HX_("reference",cb,07,c5,5a), ::Dynamic(::hx::Anon_obj::Create(3)
             							->setFixed(0,HX_("uri",6c,2b,59,00),uri)
             							->setFixed(1,HX_("type",ba,f2,08,4d),HX_("data",2a,56,63,42))
             							->setFixed(2,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:reference:0",a5,00,10,5d))))->up();
             					}
             				}
-HXLINE( 553)				stanza->up()->up()->up();
-HXLINE( 555)				if ((attachment->uris->length > 0)) {
-HXLINE( 556)					stanza->tag(HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 607)				stanza->up()->up()->up();
+HXLINE( 609)				if ((attachment->uris->length > 0)) {
+HXLINE( 610)					stanza->tag(HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("jabber:x:oob",aa,8a,5f,ef))))->textTag(HX_("url",6f,2b,59,00),attachment->uris->__get(0),null())->up();
-HXLINE( 557)					if (::hx::IsNull( body )) {
-HXLINE( 557)						body = HX_("",00,00,00,00);
+HXLINE( 611)					if (::hx::IsNull( body )) {
+HXLINE( 611)						body = HX_("",00,00,00,00);
             					}
-HXLINE( 559)					int start = ::borogove::StringUtil_obj::codepointArray(body)->length;
-HXLINE( 560)					int end = (start + attachment->uris->__get(0).length);
-HXLINE( 561)					if ((body != HX_("",00,00,00,00))) {
-HXLINE( 562)						body = (body + HX_("\n",0a,00,00,00));
-HXLINE( 563)						end = (end + 1);
+HXLINE( 613)					int start = ::borogove::StringUtil_obj::codepointArray(body)->length;
+HXLINE( 614)					int end = (start + attachment->uris->__get(0).length);
+HXLINE( 615)					if ((body != HX_("",00,00,00,00))) {
+HXLINE( 616)						body = (body + HX_("\n",0a,00,00,00));
+HXLINE( 617)						end = (end + 1);
             					}
-HXLINE( 565)					body = (body + attachment->uris->__get(0));
-HXLINE( 566)					 ::borogove::Stanza _hx_tmp7 = stanza->tag(HX_("fallback",22,f0,9d,2a), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 619)					body = (body + attachment->uris->__get(0));
+HXLINE( 620)					 ::borogove::Stanza _hx_tmp7 = stanza->tag(HX_("fallback",22,f0,9d,2a), ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("for",09,c7,4d,00),HX_("jabber:x:oob",aa,8a,5f,ef))
             						->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:fallback:0",74,aa,56,9b))));
-HXLINE( 568)					::String _hx_tmp8 = ::Std_obj::string(start);
-HXLINE( 566)					_hx_tmp7->tag(HX_("body",a2,7a,1b,41), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 622)					::String _hx_tmp8 = ::Std_obj::string(start);
+HXLINE( 620)					_hx_tmp7->tag(HX_("body",a2,7a,1b,41), ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("start",62,74,0b,84),_hx_tmp8)
             						->setFixed(1,HX_("end",db,03,4d,00),::Std_obj::string(end))))->up()->up();
             				}
             			}
             		}
-HXLINE( 571)		if (::hx::IsNotNull( body )) {
-HXLINE( 571)			stanza->textTag(HX_("body",a2,7a,1b,41),body,null());
+HXLINE( 625)		if (::hx::IsNotNull( body )) {
+HXLINE( 625)			stanza->textTag(HX_("body",a2,7a,1b,41),body,null());
             		}
-HXLINE( 572)		{
-HXLINE( 572)			int _g9 = 0;
-HXDLIN( 572)			::Array< ::Dynamic> _g10 = this->payloads;
-HXDLIN( 572)			while((_g9 < _g10->length)){
-HXLINE( 572)				 ::borogove::Stanza payload = _g10->__get(_g9).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 572)				_g9 = (_g9 + 1);
-HXLINE( 573)				stanza->addDirectChild(::borogove::Node_obj::Element(payload));
+HXLINE( 626)		{
+HXLINE( 626)			int _g9 = 0;
+HXDLIN( 626)			::Array< ::Dynamic> _g10 = this->payloads;
+HXDLIN( 626)			while((_g9 < _g10->length)){
+HXLINE( 626)				 ::borogove::Stanza payload = _g10->__get(_g9).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 626)				_g9 = (_g9 + 1);
+HXLINE( 627)				stanza->addDirectChild(::borogove::Node_obj::Element(payload));
             			}
             		}
-HXLINE( 575)		return stanza;
+HXLINE( 629)		if ((this->type == 0)) {
+HXLINE( 630)			stanza->tag(HX_("request",4f,df,84,44), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:receipts",d7,40,8f,8c))))->up();
+            		}
+HXLINE( 632)		return stanza;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessage_obj,asStanza,return )
 
  ::borogove::ChatMessage ChatMessage_obj::fromStanza( ::borogove::Stanza stanza, ::borogove::JID localJid, ::Dynamic addContext){
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_275_fromStanza)
-HXDLIN( 275)		 ::borogove::MessageStanza _g = ::borogove::Message_obj::fromStanza(stanza,localJid,addContext,null())->parsed;
-HXDLIN( 275)		if ((_g->_hx_getIndex() == 1)) {
-HXLINE( 277)			return _g->_hx_getObject(0).StaticCast<  ::borogove::ChatMessage >();
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_312_fromStanza)
+HXDLIN( 312)		 ::borogove::MessageStanza _g = ::borogove::Message_obj::fromStanza(stanza,localJid,addContext,null(),true)->parsed;
+HXDLIN( 312)		if ((_g->_hx_getIndex() == 1)) {
+HXLINE( 314)			return _g->_hx_getObject(0).StaticCast<  ::borogove::ChatMessage >();
             		}
             		else {
-HXLINE( 279)			return null();
+HXLINE( 316)			return null();
             		}
-HXLINE( 275)		return null();
+HXLINE( 312)		return null();
             	}
 
 
@@ -1602,6 +1672,7 @@ void ChatMessage_obj::__Mark(HX_MARK_PARAMS)
 	HX_MARK_MEMBER_NAME(serverId,"serverId");
 	HX_MARK_MEMBER_NAME(serverIdBy,"serverIdBy");
 	HX_MARK_MEMBER_NAME(type,"type");
+	HX_MARK_MEMBER_NAME(sortId,"sortId");
 	HX_MARK_MEMBER_NAME(syncPoint,"syncPoint");
 	HX_MARK_MEMBER_NAME(replyId,"replyId");
 	HX_MARK_MEMBER_NAME(timestamp,"timestamp");
@@ -1622,6 +1693,7 @@ void ChatMessage_obj::__Mark(HX_MARK_PARAMS)
 	HX_MARK_MEMBER_NAME(versions,"versions");
 	HX_MARK_MEMBER_NAME(payloads,"payloads");
 	HX_MARK_MEMBER_NAME(encryption,"encryption");
+	HX_MARK_MEMBER_NAME(linkMetadata,"linkMetadata");
 	HX_MARK_MEMBER_NAME(stanza,"stanza");
 	HX_MARK_END_CLASS();
 }
@@ -1632,6 +1704,7 @@ void ChatMessage_obj::__Visit(HX_VISIT_PARAMS)
 	HX_VISIT_MEMBER_NAME(serverId,"serverId");
 	HX_VISIT_MEMBER_NAME(serverIdBy,"serverIdBy");
 	HX_VISIT_MEMBER_NAME(type,"type");
+	HX_VISIT_MEMBER_NAME(sortId,"sortId");
 	HX_VISIT_MEMBER_NAME(syncPoint,"syncPoint");
 	HX_VISIT_MEMBER_NAME(replyId,"replyId");
 	HX_VISIT_MEMBER_NAME(timestamp,"timestamp");
@@ -1652,6 +1725,7 @@ void ChatMessage_obj::__Visit(HX_VISIT_PARAMS)
 	HX_VISIT_MEMBER_NAME(versions,"versions");
 	HX_VISIT_MEMBER_NAME(payloads,"payloads");
 	HX_VISIT_MEMBER_NAME(encryption,"encryption");
+	HX_VISIT_MEMBER_NAME(linkMetadata,"linkMetadata");
 	HX_VISIT_MEMBER_NAME(stanza,"stanza");
 }
 
@@ -1666,12 +1740,13 @@ void ChatMessage_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"from") ) { return ::hx::Val( from ); }
 		if (HX_FIELD_EQ(inName,"text") ) { return ::hx::Val( text ); }
 		if (HX_FIELD_EQ(inName,"lang") ) { return ::hx::Val( lang ); }
-		if (HX_FIELD_EQ(inName,"html") ) { return ::hx::Val( html_dyn() ); }
+		if (HX_FIELD_EQ(inName,"body") ) { return ::hx::Val( body_dyn() ); }
 		break;
 	case 5:
 		if (HX_FIELD_EQ(inName,"reply") ) { return ::hx::Val( reply_dyn() ); }
 		break;
 	case 6:
+		if (HX_FIELD_EQ(inName,"sortId") ) { return ::hx::Val( sortId ); }
 		if (HX_FIELD_EQ(inName,"status") ) { return ::hx::Val( status ); }
 		if (HX_FIELD_EQ(inName,"stanza") ) { return ::hx::Val( stanza ); }
 		if (HX_FIELD_EQ(inName,"chatId") ) { return ::hx::Val( chatId_dyn() ); }
@@ -1680,6 +1755,7 @@ void ChatMessage_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"localId") ) { return ::hx::Val( localId ); }
 		if (HX_FIELD_EQ(inName,"replyId") ) { return ::hx::Val( replyId ); }
 		if (HX_FIELD_EQ(inName,"replyTo") ) { return ::hx::Val( replyTo ); }
+		if (HX_FIELD_EQ(inName,"subject") ) { return ::hx::Val( subject_dyn() ); }
 		if (HX_FIELD_EQ(inName,"account") ) { return ::hx::Val( account_dyn() ); }
 		if (HX_FIELD_EQ(inName,"callSid") ) { return ::hx::Val( callSid_dyn() ); }
 		break;
@@ -1689,6 +1765,7 @@ void ChatMessage_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"threadId") ) { return ::hx::Val( threadId ); }
 		if (HX_FIELD_EQ(inName,"versions") ) { return ::hx::Val( versions ); }
 		if (HX_FIELD_EQ(inName,"payloads") ) { return ::hx::Val( payloads ); }
+		if (HX_FIELD_EQ(inName,"htmlBody") ) { return ::hx::Val( htmlBody_dyn() ); }
 		if (HX_FIELD_EQ(inName,"asStanza") ) { return ::hx::Val( asStanza_dyn() ); }
 		break;
 	case 9:
@@ -1703,6 +1780,7 @@ void ChatMessage_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"statusText") ) { return ::hx::Val( statusText ); }
 		if (HX_FIELD_EQ(inName,"encryption") ) { return ::hx::Val( encryption ); }
 		if (HX_FIELD_EQ(inName,"getReplyId") ) { return ::hx::Val( getReplyId_dyn() ); }
+		if (HX_FIELD_EQ(inName,"canReplace") ) { return ::hx::Val( canReplace_dyn() ); }
 		if (HX_FIELD_EQ(inName,"isIncoming") ) { return ::hx::Val( isIncoming_dyn() ); }
 		if (HX_FIELD_EQ(inName,"threadIcon") ) { return ::hx::Val( threadIcon_dyn() ); }
 		if (HX_FIELD_EQ(inName,"callStatus") ) { return ::hx::Val( callStatus_dyn() ); }
@@ -1710,11 +1788,11 @@ void ChatMessage_obj::__Visit(HX_VISIT_PARAMS)
 	case 11:
 		if (HX_FIELD_EQ(inName,"type__fromC") ) { return ::hx::Val( type__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"attachments") ) { return ::hx::Val( attachments ); }
-		if (HX_FIELD_EQ(inName,"text__fromC") ) { return ::hx::Val( text__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"lang__fromC") ) { return ::hx::Val( lang__fromC_dyn() ); }
 		break;
 	case 12:
 		if (HX_FIELD_EQ(inName,"reactionKeys") ) { if (inCallProp == ::hx::paccAlways) return ::hx::Val( get_reactionKeys() ); }
+		if (HX_FIELD_EQ(inName,"linkMetadata") ) { return ::hx::Val( linkMetadata ); }
 		if (HX_FIELD_EQ(inName,"callDuration") ) { return ::hx::Val( callDuration_dyn() ); }
 		break;
 	case 13:
@@ -1735,6 +1813,8 @@ void ChatMessage_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"timestamp__fromC") ) { return ::hx::Val( timestamp__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"get_reactionKeys") ) { return ::hx::Val( get_reactionKeys_dyn() ); }
 		if (HX_FIELD_EQ(inName,"direction__fromC") ) { return ::hx::Val( direction__fromC_dyn() ); }
+		if (HX_FIELD_EQ(inName,"senderMemberStub") ) { return ::hx::Val( senderMemberStub_dyn() ); }
+		if (HX_FIELD_EQ(inName,"moderationReason") ) { return ::hx::Val( moderationReason_dyn() ); }
 		break;
 	case 17:
 		if (HX_FIELD_EQ(inName,"serverIdBy__fromC") ) { return ::hx::Val( serverIdBy__fromC_dyn() ); }
@@ -1775,6 +1855,7 @@ bool ChatMessage_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::h
 		if (HX_FIELD_EQ(inName,"lang") ) { lang=inValue.Cast< ::String >(); return inValue; }
 		break;
 	case 6:
+		if (HX_FIELD_EQ(inName,"sortId") ) { sortId=inValue.Cast< ::String >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"status") ) { status=inValue.Cast< int >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"stanza") ) { stanza=inValue.Cast<  ::borogove::Stanza >(); return inValue; }
 		break;
@@ -1805,6 +1886,9 @@ bool ChatMessage_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::h
 	case 11:
 		if (HX_FIELD_EQ(inName,"attachments") ) { attachments=inValue.Cast< ::Array< ::Dynamic> >(); return inValue; }
 		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"linkMetadata") ) { linkMetadata=inValue.Cast< ::Array< ::Dynamic> >(); return inValue; }
+		break;
 	case 14:
 		if (HX_FIELD_EQ(inName,"replyToMessage") ) { replyToMessage=inValue.Cast<  ::borogove::ChatMessage >(); return inValue; }
 	}
@@ -1817,6 +1901,7 @@ void ChatMessage_obj::__GetFields(Array< ::String> &outFields)
 	outFields->push(HX_("serverId",7e,01,b2,e2));
 	outFields->push(HX_("serverIdBy",f5,16,54,74));
 	outFields->push(HX_("type",ba,f2,08,4d));
+	outFields->push(HX_("sortId",d9,7a,37,30));
 	outFields->push(HX_("syncPoint",f5,ff,94,98));
 	outFields->push(HX_("replyId",a5,67,3a,ab));
 	outFields->push(HX_("timestamp",d6,d4,ce,a5));
@@ -1838,6 +1923,7 @@ void ChatMessage_obj::__GetFields(Array< ::String> &outFields)
 	outFields->push(HX_("versions",5b,4e,b8,d6));
 	outFields->push(HX_("payloads",25,dd,d1,a1));
 	outFields->push(HX_("encryption",83,dc,39,4f));
+	outFields->push(HX_("linkMetadata",89,45,ae,7c));
 	outFields->push(HX_("stanza",f5,5d,f7,05));
 	super::__GetFields(outFields);
 };
@@ -1848,6 +1934,7 @@ static ::hx::StorageInfo ChatMessage_obj_sMemberStorageInfo[] = {
 	{::hx::fsString,(int)offsetof(ChatMessage_obj,serverId),HX_("serverId",7e,01,b2,e2)},
 	{::hx::fsString,(int)offsetof(ChatMessage_obj,serverIdBy),HX_("serverIdBy",f5,16,54,74)},
 	{::hx::fsInt,(int)offsetof(ChatMessage_obj,type),HX_("type",ba,f2,08,4d)},
+	{::hx::fsString,(int)offsetof(ChatMessage_obj,sortId),HX_("sortId",d9,7a,37,30)},
 	{::hx::fsBool,(int)offsetof(ChatMessage_obj,syncPoint),HX_("syncPoint",f5,ff,94,98)},
 	{::hx::fsString,(int)offsetof(ChatMessage_obj,replyId),HX_("replyId",a5,67,3a,ab)},
 	{::hx::fsString,(int)offsetof(ChatMessage_obj,timestamp),HX_("timestamp",d6,d4,ce,a5)},
@@ -1868,6 +1955,7 @@ static ::hx::StorageInfo ChatMessage_obj_sMemberStorageInfo[] = {
 	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(ChatMessage_obj,versions),HX_("versions",5b,4e,b8,d6)},
 	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(ChatMessage_obj,payloads),HX_("payloads",25,dd,d1,a1)},
 	{::hx::fsObject /*  ::borogove::EncryptionInfo */ ,(int)offsetof(ChatMessage_obj,encryption),HX_("encryption",83,dc,39,4f)},
+	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(ChatMessage_obj,linkMetadata),HX_("linkMetadata",89,45,ae,7c)},
 	{::hx::fsObject /*  ::borogove::Stanza */ ,(int)offsetof(ChatMessage_obj,stanza),HX_("stanza",f5,5d,f7,05)},
 	{ ::hx::fsUnknown, 0, null()}
 };
@@ -1883,6 +1971,7 @@ static ::String ChatMessage_obj_sMemberFields[] = {
 	HX_("serverIdBy__fromC",24,52,2e,02),
 	HX_("type",ba,f2,08,4d),
 	HX_("type__fromC",ff,a8,6c,93),
+	HX_("sortId",d9,7a,37,30),
 	HX_("syncPoint",f5,ff,94,98),
 	HX_("replyId",a5,67,3a,ab),
 	HX_("timestamp",d6,d4,ce,a5),
@@ -1902,7 +1991,6 @@ static ::String ChatMessage_obj_sMemberFields[] = {
 	HX_("get_reactionKeys",c6,6a,eb,75),
 	HX_("reactionDetails",19,54,bb,c7),
 	HX_("text",ad,cc,f9,4c),
-	HX_("text__fromC",6c,43,1b,7f),
 	HX_("lang",ee,05,ad,47),
 	HX_("lang__fromC",4b,24,00,52),
 	HX_("direction",3f,62,40,10),
@@ -1915,17 +2003,23 @@ static ::String ChatMessage_obj_sMemberFields[] = {
 	HX_("payloads",25,dd,d1,a1),
 	HX_("encryption",83,dc,39,4f),
 	HX_("encryption__fromC",56,7a,b6,09),
+	HX_("linkMetadata",89,45,ae,7c),
 	HX_("stanza",f5,5d,f7,05),
 	HX_("reply",2a,09,c6,e6),
 	HX_("getReplyId",af,ed,9b,fa),
 	HX_("set_replyToMessage",3f,e2,a9,1e),
 	HX_("set_reactions",8d,82,ff,ed),
 	HX_("inlineHashReferences",ef,73,63,1b),
-	HX_("html",6b,95,16,45),
+	HX_("htmlBody",ad,cd,59,04),
+	HX_("body",a2,7a,1b,41),
+	HX_("subject",ac,01,88,29),
 	HX_("chatId",d3,04,77,b7),
 	HX_("account",ad,fc,59,a1),
+	HX_("senderMemberStub",bd,98,6a,0d),
+	HX_("canReplace",04,9e,6b,56),
 	HX_("isIncoming",f0,52,c4,95),
 	HX_("threadIcon",63,bb,7b,41),
+	HX_("moderationReason",0a,b9,d3,97),
 	HX_("callStatus",70,be,2b,31),
 	HX_("callSid",10,f5,53,54),
 	HX_("callDuration",12,b2,d0,4c),
@@ -1965,8 +2059,8 @@ void ChatMessage_obj::__register()
 void ChatMessage_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_89_boot)
-HXDLIN(  89)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_20f00185d7354fd9_114_boot)
+HXDLIN( 114)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(21)
             				->setFixed(0,HX_("serverId__fromC",bb,ba,c0,81), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
@@ -1998,17 +2092,17 @@ HXDLIN(  89)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
             				->setFixed(14,HX_("versions__fromC",7e,73,e8,14), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(15,HX_("direction__fromC",1a,64,c6,4b), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(15,HX_("linkMetadata__fromC",10,de,bf,3a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(16,HX_("lang__fromC",4b,24,00,52), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(16,HX_("direction__fromC",1a,64,c6,4b), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(17,HX_("get_reactionKeys",c6,6a,eb,75), ::Dynamic(::hx::Anon_obj::Create(1)
-            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(18,HX_("reactionKeys__fromC",dc,e3,50,76), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(17,HX_("lang__fromC",4b,24,00,52), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(19,HX_("threadId__fromC",d4,d1,81,79), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(18,HX_("get_reactionKeys",c6,6a,eb,75), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(19,HX_("reactionKeys__fromC",dc,e3,50,76), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(20,HX_("text__fromC",6c,43,1b,7f), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(20,HX_("threadId__fromC",d4,d1,81,79), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null()))))));
             	}
 }
diff --git a/Sources/c_borogove/src/borogove/ChatMessageBuilder.cpp b/Sources/c_borogove/src/borogove/ChatMessageBuilder.cpp
index 9a83b5a..2678ac6 100644
--- a/Sources/c_borogove/src/borogove/ChatMessageBuilder.cpp
+++ b/Sources/c_borogove/src/borogove/ChatMessageBuilder.cpp
@@ -13,8 +13,8 @@
 #ifndef INCLUDED_Std
 #include <Std.h>
 #endif
-#ifndef INCLUDED__HaxeCBridge_Internal
-#include <_HaxeCBridge/Internal.h>
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
 #endif
 #ifndef INCLUDED_borogove_ChatAttachment
 #include <borogove/ChatAttachment.h>
@@ -34,24 +34,21 @@
 #ifndef INCLUDED_borogove_Hash
 #include <borogove/Hash.h>
 #endif
+#ifndef INCLUDED_borogove_Html
+#include <borogove/Html.h>
+#endif
 #ifndef INCLUDED_borogove_JID
 #include <borogove/JID.h>
 #endif
+#ifndef INCLUDED_borogove_LinkMetadata
+#include <borogove/LinkMetadata.h>
+#endif
 #ifndef INCLUDED_borogove_Node
 #include <borogove/Node.h>
 #endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
-#ifndef INCLUDED_borogove_XEP0393
-#include <borogove/XEP0393.h>
-#endif
-#ifndef INCLUDED_borogove__Util_Util_Fields_
-#include <borogove/_Util/Util_Fields_.h>
-#endif
-#ifndef INCLUDED_cpp_Int64Map
-#include <cpp/Int64Map.h>
-#endif
 #ifndef INCLUDED_haxe_IMap
 #include <haxe/IMap.h>
 #endif
@@ -64,94 +61,83 @@
 #ifndef INCLUDED_haxe_io_Bytes
 #include <haxe/io/Bytes.h>
 #endif
-#ifndef INCLUDED_htmlparser_HtmlAttribute
-#include <htmlparser/HtmlAttribute.h>
-#endif
-#ifndef INCLUDED_htmlparser_HtmlNode
-#include <htmlparser/HtmlNode.h>
-#endif
-#ifndef INCLUDED_htmlparser_HtmlNodeElement
-#include <htmlparser/HtmlNodeElement.h>
-#endif
-#ifndef INCLUDED_htmlparser_HtmlNodeText
-#include <htmlparser/HtmlNodeText.h>
-#endif
-#ifndef INCLUDED_htmlparser_HtmlParser
-#include <htmlparser/HtmlParser.h>
-#endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_c7017726c326afec_32_new,"borogove.ChatMessageBuilder","new",0xd3d5b3cb,"borogove.ChatMessageBuilder.new","borogove/ChatMessageBuilder.hx",32,0xd0295864)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_450_localId__fromC,"borogove.ChatMessageBuilder","localId__fromC",0x331bf588,"borogove.ChatMessageBuilder.localId__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_461_set_localId__fromC,"borogove.ChatMessageBuilder","set_localId__fromC",0x6345e745,"borogove.ChatMessageBuilder.set_localId__fromC","HaxeCBridge.hx",461,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_450_serverId__fromC,"borogove.ChatMessageBuilder","serverId__fromC",0xe97f92a6,"borogove.ChatMessageBuilder.serverId__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_461_set_serverId__fromC,"borogove.ChatMessageBuilder","set_serverId__fromC",0xde092649,"borogove.ChatMessageBuilder.set_serverId__fromC","HaxeCBridge.hx",461,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_450_serverIdBy__fromC,"borogove.ChatMessageBuilder","serverIdBy__fromC",0xf9433acf,"borogove.ChatMessageBuilder.serverIdBy__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_461_set_serverIdBy__fromC,"borogove.ChatMessageBuilder","set_serverIdBy__fromC",0x52133d32,"borogove.ChatMessageBuilder.set_serverIdBy__fromC","HaxeCBridge.hx",461,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_450_type__fromC,"borogove.ChatMessageBuilder","type__fromC",0x8af06f6a,"borogove.ChatMessageBuilder.type__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_461_set_type__fromC,"borogove.ChatMessageBuilder","set_type__fromC",0xb7d8b58d,"borogove.ChatMessageBuilder.set_type__fromC","HaxeCBridge.hx",461,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_450_timestamp__fromC,"borogove.ChatMessageBuilder","timestamp__fromC",0x36c99818,"borogove.ChatMessageBuilder.timestamp__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_461_set_timestamp__fromC,"borogove.ChatMessageBuilder","set_timestamp__fromC",0x3aa13315,"borogove.ChatMessageBuilder.set_timestamp__fromC","HaxeCBridge.hx",461,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_398_senderId__fromC,"borogove.ChatMessageBuilder","senderId__fromC",0x3307e774,"borogove.ChatMessageBuilder.senderId__fromC","HaxeCBridge.hx",398,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_409_set_senderId__fromC,"borogove.ChatMessageBuilder","set_senderId__fromC",0x27917b17,"borogove.ChatMessageBuilder.set_senderId__fromC","HaxeCBridge.hx",409,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_450_replyToMessage__fromC,"borogove.ChatMessageBuilder","replyToMessage__fromC",0x10667fe2,"borogove.ChatMessageBuilder.replyToMessage__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_461_set_replyToMessage__fromC,"borogove.ChatMessageBuilder","set_replyToMessage__fromC",0xdf0aefc5,"borogove.ChatMessageBuilder.set_replyToMessage__fromC","HaxeCBridge.hx",461,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_450_threadId__fromC,"borogove.ChatMessageBuilder","threadId__fromC",0xe140a9bf,"borogove.ChatMessageBuilder.threadId__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_461_set_threadId__fromC,"borogove.ChatMessageBuilder","set_threadId__fromC",0xd5ca3d62,"borogove.ChatMessageBuilder.set_threadId__fromC","HaxeCBridge.hx",461,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_385_attachments__fromC,"borogove.ChatMessageBuilder","attachments__fromC",0x0c2e843e,"borogove.ChatMessageBuilder.attachments__fromC","HaxeCBridge.hx",385,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_450_text__fromC,"borogove.ChatMessageBuilder","text__fromC",0x769f09d7,"borogove.ChatMessageBuilder.text__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_461_set_text__fromC,"borogove.ChatMessageBuilder","set_text__fromC",0xa3874ffa,"borogove.ChatMessageBuilder.set_text__fromC","HaxeCBridge.hx",461,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_450_lang__fromC,"borogove.ChatMessageBuilder","lang__fromC",0x4983eab6,"borogove.ChatMessageBuilder.lang__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_461_set_lang__fromC,"borogove.ChatMessageBuilder","set_lang__fromC",0x766c30d9,"borogove.ChatMessageBuilder.set_lang__fromC","HaxeCBridge.hx",461,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_450_direction__fromC,"borogove.ChatMessageBuilder","direction__fromC",0xab0479cf,"borogove.ChatMessageBuilder.direction__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_461_set_direction__fromC,"borogove.ChatMessageBuilder","set_direction__fromC",0xaedc14cc,"borogove.ChatMessageBuilder.set_direction__fromC","HaxeCBridge.hx",461,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_450_status__fromC,"borogove.ChatMessageBuilder","status__fromC",0x55f82ab2,"borogove.ChatMessageBuilder.status__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_461_set_status__fromC,"borogove.ChatMessageBuilder","set_status__fromC",0xc2187f95,"borogove.ChatMessageBuilder.set_status__fromC","HaxeCBridge.hx",461,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_450_statusText__fromC,"borogove.ChatMessageBuilder","statusText__fromC",0x8395a605,"borogove.ChatMessageBuilder.statusText__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_461_set_statusText__fromC,"borogove.ChatMessageBuilder","set_statusText__fromC",0xdc65a868,"borogove.ChatMessageBuilder.set_statusText__fromC","HaxeCBridge.hx",461,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_439_set_versions__fromC,"borogove.ChatMessageBuilder","set_versions__fromC",0x7130df0c,"borogove.ChatMessageBuilder.set_versions__fromC","HaxeCBridge.hx",439,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_424_versions__fromC,"borogove.ChatMessageBuilder","versions__fromC",0x7ca74b69,"borogove.ChatMessageBuilder.versions__fromC","HaxeCBridge.hx",424,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_450_encryption__fromC,"borogove.ChatMessageBuilder","encryption__fromC",0x00cb6301,"borogove.ChatMessageBuilder.encryption__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_461_set_encryption__fromC,"borogove.ChatMessageBuilder","set_encryption__fromC",0x599b6564,"borogove.ChatMessageBuilder.set_encryption__fromC","HaxeCBridge.hx",461,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_230_attachSims,"borogove.ChatMessageBuilder","attachSims",0x7e2cb3d6,"borogove.ChatMessageBuilder.attachSims","borogove/ChatMessageBuilder.hx",230,0xd0295864)
-HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_251_addAttachment,"borogove.ChatMessageBuilder","addAttachment",0xfc8ec88f,"borogove.ChatMessageBuilder.addAttachment","borogove/ChatMessageBuilder.hx",251,0xd0295864)
-HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_273_setHtml,"borogove.ChatMessageBuilder","setHtml",0xc42a4b18,"borogove.ChatMessageBuilder.setHtml","borogove/ChatMessageBuilder.hx",273,0xd0295864)
-HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_258_setHtml,"borogove.ChatMessageBuilder","setHtml",0xc42a4b18,"borogove.ChatMessageBuilder.setHtml","borogove/ChatMessageBuilder.hx",258,0xd0295864)
-HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_279_htmlToNode,"borogove.ChatMessageBuilder","htmlToNode",0xfe6b10dd,"borogove.ChatMessageBuilder.htmlToNode","borogove/ChatMessageBuilder.hx",279,0xd0295864)
-HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_302_chatId,"borogove.ChatMessageBuilder","chatId",0x9cbed648,"borogove.ChatMessageBuilder.chatId","borogove/ChatMessageBuilder.hx",302,0xd0295864)
-HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_313_get_senderId,"borogove.ChatMessageBuilder","get_senderId",0x3cf1aa2e,"borogove.ChatMessageBuilder.get_senderId","borogove/ChatMessageBuilder.hx",313,0xd0295864)
-HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_318_isIncoming,"borogove.ChatMessageBuilder","isIncoming",0x47aa82e5,"borogove.ChatMessageBuilder.isIncoming","borogove/ChatMessageBuilder.hx",318,0xd0295864)
-HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_326_build,"borogove.ChatMessageBuilder","build",0xdd3caf59,"borogove.ChatMessageBuilder.build","borogove/ChatMessageBuilder.hx",326,0xd0295864)
-HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_199_makeModerated,"borogove.ChatMessageBuilder","makeModerated",0xcfb6a69e,"borogove.ChatMessageBuilder.makeModerated","borogove/ChatMessageBuilder.hx",199,0xd0295864)
-HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_32_boot,"borogove.ChatMessageBuilder","boot",0x7f409e67,"borogove.ChatMessageBuilder.boot","borogove/ChatMessageBuilder.hx",32,0xd0295864)
+HX_DEFINE_STACK_FRAME(_hx_pos_c7017726c326afec_31_new,"borogove.ChatMessageBuilder","new",0xd3d5b3cb,"borogove.ChatMessageBuilder.new","borogove/ChatMessageBuilder.hx",31,0xd0295864)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_478_localId__fromC,"borogove.ChatMessageBuilder","localId__fromC",0x331bf588,"borogove.ChatMessageBuilder.localId__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_489_set_localId__fromC,"borogove.ChatMessageBuilder","set_localId__fromC",0x6345e745,"borogove.ChatMessageBuilder.set_localId__fromC","HaxeCBridge.hx",489,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_478_serverId__fromC,"borogove.ChatMessageBuilder","serverId__fromC",0xe97f92a6,"borogove.ChatMessageBuilder.serverId__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_489_set_serverId__fromC,"borogove.ChatMessageBuilder","set_serverId__fromC",0xde092649,"borogove.ChatMessageBuilder.set_serverId__fromC","HaxeCBridge.hx",489,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_478_serverIdBy__fromC,"borogove.ChatMessageBuilder","serverIdBy__fromC",0xf9433acf,"borogove.ChatMessageBuilder.serverIdBy__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_489_set_serverIdBy__fromC,"borogove.ChatMessageBuilder","set_serverIdBy__fromC",0x52133d32,"borogove.ChatMessageBuilder.set_serverIdBy__fromC","HaxeCBridge.hx",489,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_478_type__fromC,"borogove.ChatMessageBuilder","type__fromC",0x8af06f6a,"borogove.ChatMessageBuilder.type__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_489_set_type__fromC,"borogove.ChatMessageBuilder","set_type__fromC",0xb7d8b58d,"borogove.ChatMessageBuilder.set_type__fromC","HaxeCBridge.hx",489,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_478_timestamp__fromC,"borogove.ChatMessageBuilder","timestamp__fromC",0x36c99818,"borogove.ChatMessageBuilder.timestamp__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_489_set_timestamp__fromC,"borogove.ChatMessageBuilder","set_timestamp__fromC",0x3aa13315,"borogove.ChatMessageBuilder.set_timestamp__fromC","HaxeCBridge.hx",489,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_426_senderId__fromC,"borogove.ChatMessageBuilder","senderId__fromC",0x3307e774,"borogove.ChatMessageBuilder.senderId__fromC","HaxeCBridge.hx",426,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_437_set_senderId__fromC,"borogove.ChatMessageBuilder","set_senderId__fromC",0x27917b17,"borogove.ChatMessageBuilder.set_senderId__fromC","HaxeCBridge.hx",437,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_478_replyToMessage__fromC,"borogove.ChatMessageBuilder","replyToMessage__fromC",0x10667fe2,"borogove.ChatMessageBuilder.replyToMessage__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_489_set_replyToMessage__fromC,"borogove.ChatMessageBuilder","set_replyToMessage__fromC",0xdf0aefc5,"borogove.ChatMessageBuilder.set_replyToMessage__fromC","HaxeCBridge.hx",489,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_478_threadId__fromC,"borogove.ChatMessageBuilder","threadId__fromC",0xe140a9bf,"borogove.ChatMessageBuilder.threadId__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_489_set_threadId__fromC,"borogove.ChatMessageBuilder","set_threadId__fromC",0xd5ca3d62,"borogove.ChatMessageBuilder.set_threadId__fromC","HaxeCBridge.hx",489,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_413_attachments__fromC,"borogove.ChatMessageBuilder","attachments__fromC",0x0c2e843e,"borogove.ChatMessageBuilder.attachments__fromC","HaxeCBridge.hx",413,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_478_lang__fromC,"borogove.ChatMessageBuilder","lang__fromC",0x4983eab6,"borogove.ChatMessageBuilder.lang__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_489_set_lang__fromC,"borogove.ChatMessageBuilder","set_lang__fromC",0x766c30d9,"borogove.ChatMessageBuilder.set_lang__fromC","HaxeCBridge.hx",489,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_478_direction__fromC,"borogove.ChatMessageBuilder","direction__fromC",0xab0479cf,"borogove.ChatMessageBuilder.direction__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_489_set_direction__fromC,"borogove.ChatMessageBuilder","set_direction__fromC",0xaedc14cc,"borogove.ChatMessageBuilder.set_direction__fromC","HaxeCBridge.hx",489,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_478_status__fromC,"borogove.ChatMessageBuilder","status__fromC",0x55f82ab2,"borogove.ChatMessageBuilder.status__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_489_set_status__fromC,"borogove.ChatMessageBuilder","set_status__fromC",0xc2187f95,"borogove.ChatMessageBuilder.set_status__fromC","HaxeCBridge.hx",489,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_478_statusText__fromC,"borogove.ChatMessageBuilder","statusText__fromC",0x8395a605,"borogove.ChatMessageBuilder.statusText__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_489_set_statusText__fromC,"borogove.ChatMessageBuilder","set_statusText__fromC",0xdc65a868,"borogove.ChatMessageBuilder.set_statusText__fromC","HaxeCBridge.hx",489,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_467_set_versions__fromC,"borogove.ChatMessageBuilder","set_versions__fromC",0x7130df0c,"borogove.ChatMessageBuilder.set_versions__fromC","HaxeCBridge.hx",467,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_452_versions__fromC,"borogove.ChatMessageBuilder","versions__fromC",0x7ca74b69,"borogove.ChatMessageBuilder.versions__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_478_encryption__fromC,"borogove.ChatMessageBuilder","encryption__fromC",0x00cb6301,"borogove.ChatMessageBuilder.encryption__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_489_set_encryption__fromC,"borogove.ChatMessageBuilder","set_encryption__fromC",0x599b6564,"borogove.ChatMessageBuilder.set_encryption__fromC","HaxeCBridge.hx",489,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_467_set_linkMetadata__fromC,"borogove.ChatMessageBuilder","set_linkMetadata__fromC",0xfe00289e,"borogove.ChatMessageBuilder.set_linkMetadata__fromC","HaxeCBridge.hx",467,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e72a7715fb4723e4_452_linkMetadata__fromC,"borogove.ChatMessageBuilder","linkMetadata__fromC",0xcf60877b,"borogove.ChatMessageBuilder.linkMetadata__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_250_attachSims,"borogove.ChatMessageBuilder","attachSims",0x7e2cb3d6,"borogove.ChatMessageBuilder.attachSims","borogove/ChatMessageBuilder.hx",250,0xd0295864)
+HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_271_addAttachment,"borogove.ChatMessageBuilder","addAttachment",0xfc8ec88f,"borogove.ChatMessageBuilder.addAttachment","borogove/ChatMessageBuilder.hx",271,0xd0295864)
+HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_280_setBody,"borogove.ChatMessageBuilder","setBody",0xc02f304f,"borogove.ChatMessageBuilder.setBody","borogove/ChatMessageBuilder.hx",280,0xd0295864)
+HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_283_setBody,"borogove.ChatMessageBuilder","setBody",0xc02f304f,"borogove.ChatMessageBuilder.setBody","borogove/ChatMessageBuilder.hx",283,0xd0295864)
+HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_279_setBody,"borogove.ChatMessageBuilder","setBody",0xc02f304f,"borogove.ChatMessageBuilder.setBody","borogove/ChatMessageBuilder.hx",279,0xd0295864)
+HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_306_setSubject,"borogove.ChatMessageBuilder","setSubject",0x2e4d561f,"borogove.ChatMessageBuilder.setSubject","borogove/ChatMessageBuilder.hx",306,0xd0295864)
+HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_305_setSubject,"borogove.ChatMessageBuilder","setSubject",0x2e4d561f,"borogove.ChatMessageBuilder.setSubject","borogove/ChatMessageBuilder.hx",305,0xd0295864)
+HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_320_chatId,"borogove.ChatMessageBuilder","chatId",0x9cbed648,"borogove.ChatMessageBuilder.chatId","borogove/ChatMessageBuilder.hx",320,0xd0295864)
+HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_333_get_senderId,"borogove.ChatMessageBuilder","get_senderId",0x3cf1aa2e,"borogove.ChatMessageBuilder.get_senderId","borogove/ChatMessageBuilder.hx",333,0xd0295864)
+HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_338_isIncoming,"borogove.ChatMessageBuilder","isIncoming",0x47aa82e5,"borogove.ChatMessageBuilder.isIncoming","borogove/ChatMessageBuilder.hx",338,0xd0295864)
+HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_346_build,"borogove.ChatMessageBuilder","build",0xdd3caf59,"borogove.ChatMessageBuilder.build","borogove/ChatMessageBuilder.hx",346,0xd0295864)
+HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_218_makeModerated,"borogove.ChatMessageBuilder","makeModerated",0xcfb6a69e,"borogove.ChatMessageBuilder.makeModerated","borogove/ChatMessageBuilder.hx",218,0xd0295864)
+HX_LOCAL_STACK_FRAME(_hx_pos_c7017726c326afec_31_boot,"borogove.ChatMessageBuilder","boot",0x7f409e67,"borogove.ChatMessageBuilder.boot","borogove/ChatMessageBuilder.hx",31,0xd0295864)
 namespace borogove{
 
 void ChatMessageBuilder_obj::__construct(){
-            	HX_GC_STACKFRAME(&_hx_pos_c7017726c326afec_32_new)
-HXLINE( 144)		this->stanza = null();
-HXLINE( 132)		this->payloads = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 129)		this->versions = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 124)		this->statusText = null();
-HXLINE( 119)		this->status = 0;
-HXLINE( 114)		this->direction = 0;
-HXLINE( 109)		this->lang = null();
-HXLINE( 104)		this->text = null();
-HXLINE(  99)		this->reactions =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(  93)		this->attachments = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(  88)		this->threadId = null();
-HXLINE(  83)		this->replyToMessage = null();
-HXLINE(  78)		this->senderId = null();
-HXLINE(  73)		this->replyTo = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(  71)		this->recipients = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(  69)		this->sender = null();
-HXLINE(  67)		this->from = null();
-HXLINE(  65)		this->to = null();
-HXLINE(  62)		this->timestamp = null();
-HXLINE(  57)		this->replyId = null();
-HXLINE(  54)		this->syncPoint = false;
-HXLINE(  51)		this->type = 0;
-HXLINE(  46)		this->serverIdBy = null();
-HXLINE(  41)		this->serverId = null();
-HXLINE(  36)		this->localId = null();
+            	HX_GC_STACKFRAME(&_hx_pos_c7017726c326afec_31_new)
+HXLINE( 152)		this->stanza = null();
+HXLINE( 146)		this->linkMetadata = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 135)		this->payloads = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 132)		this->versions = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 127)		this->statusText = null();
+HXLINE( 122)		this->status = 0;
+HXLINE( 117)		this->direction = 1;
+HXLINE( 112)		this->lang = null();
+HXLINE( 107)		this->text = null();
+HXLINE( 101)		this->reactions =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(  95)		this->attachments = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  90)		this->threadId = null();
+HXLINE(  85)		this->replyToMessage = null();
+HXLINE(  80)		this->senderId = null();
+HXLINE(  75)		this->replyTo = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  73)		this->recipients = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  71)		this->sender = null();
+HXLINE(  69)		this->from = null();
+HXLINE(  67)		this->to = null();
+HXLINE(  64)		this->timestamp = null();
+HXLINE(  59)		this->replyId = null();
+HXLINE(  56)		this->syncPoint = false;
+HXLINE(  53)		this->type = 0;
+HXLINE(  48)		this->sortId = null();
+HXLINE(  45)		this->serverIdBy = null();
+HXLINE(  40)		this->serverId = null();
+HXLINE(  35)		this->localId = null();
             	}
 
 Dynamic ChatMessageBuilder_obj::__CreateEmpty() { return new ChatMessageBuilder_obj; }
@@ -170,456 +156,387 @@ bool ChatMessageBuilder_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String ChatMessageBuilder_obj::localId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_450_localId__fromC)
-HXDLIN( 450)		return this->localId;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_478_localId__fromC)
+HXDLIN( 478)		return this->localId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,localId__fromC,return )
 
 void ChatMessageBuilder_obj::set_localId__fromC(::String value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_461_set_localId__fromC)
-HXDLIN( 461)		this->localId = value;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_489_set_localId__fromC)
+HXDLIN( 489)		this->localId = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_localId__fromC,(void))
 
 ::String ChatMessageBuilder_obj::serverId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_450_serverId__fromC)
-HXDLIN( 450)		return this->serverId;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_478_serverId__fromC)
+HXDLIN( 478)		return this->serverId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,serverId__fromC,return )
 
 void ChatMessageBuilder_obj::set_serverId__fromC(::String value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_461_set_serverId__fromC)
-HXDLIN( 461)		this->serverId = value;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_489_set_serverId__fromC)
+HXDLIN( 489)		this->serverId = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_serverId__fromC,(void))
 
 ::String ChatMessageBuilder_obj::serverIdBy__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_450_serverIdBy__fromC)
-HXDLIN( 450)		return this->serverIdBy;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_478_serverIdBy__fromC)
+HXDLIN( 478)		return this->serverIdBy;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,serverIdBy__fromC,return )
 
 void ChatMessageBuilder_obj::set_serverIdBy__fromC(::String value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_461_set_serverIdBy__fromC)
-HXDLIN( 461)		this->serverIdBy = value;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_489_set_serverIdBy__fromC)
+HXDLIN( 489)		this->serverIdBy = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_serverIdBy__fromC,(void))
 
 int ChatMessageBuilder_obj::type__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_450_type__fromC)
-HXDLIN( 450)		return this->type;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_478_type__fromC)
+HXDLIN( 478)		return this->type;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,type__fromC,return )
 
 void ChatMessageBuilder_obj::set_type__fromC(int value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_461_set_type__fromC)
-HXDLIN( 461)		this->type = value;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_489_set_type__fromC)
+HXDLIN( 489)		this->type = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_type__fromC,(void))
 
 ::String ChatMessageBuilder_obj::timestamp__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_450_timestamp__fromC)
-HXDLIN( 450)		return this->timestamp;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_478_timestamp__fromC)
+HXDLIN( 478)		return this->timestamp;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,timestamp__fromC,return )
 
 void ChatMessageBuilder_obj::set_timestamp__fromC(::String value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_461_set_timestamp__fromC)
-HXDLIN( 461)		this->timestamp = value;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_489_set_timestamp__fromC)
+HXDLIN( 489)		this->timestamp = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_timestamp__fromC,(void))
 
 ::String ChatMessageBuilder_obj::senderId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_398_senderId__fromC)
-HXDLIN( 398)		return this->get_senderId();
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_426_senderId__fromC)
+HXDLIN( 426)		return this->get_senderId();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,senderId__fromC,return )
 
 void ChatMessageBuilder_obj::set_senderId__fromC(::String value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_409_set_senderId__fromC)
-HXDLIN( 409)		this->senderId = value;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_437_set_senderId__fromC)
+HXDLIN( 437)		this->senderId = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_senderId__fromC,(void))
 
  ::borogove::ChatMessage ChatMessageBuilder_obj::replyToMessage__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_450_replyToMessage__fromC)
-HXDLIN( 450)		return this->replyToMessage;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_478_replyToMessage__fromC)
+HXDLIN( 478)		return this->replyToMessage;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,replyToMessage__fromC,return )
 
 void ChatMessageBuilder_obj::set_replyToMessage__fromC( ::borogove::ChatMessage value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_461_set_replyToMessage__fromC)
-HXDLIN( 461)		this->replyToMessage = value;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_489_set_replyToMessage__fromC)
+HXDLIN( 489)		this->replyToMessage = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_replyToMessage__fromC,(void))
 
 ::String ChatMessageBuilder_obj::threadId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_450_threadId__fromC)
-HXDLIN( 450)		return this->threadId;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_478_threadId__fromC)
+HXDLIN( 478)		return this->threadId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,threadId__fromC,return )
 
 void ChatMessageBuilder_obj::set_threadId__fromC(::String value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_461_set_threadId__fromC)
-HXDLIN( 461)		this->threadId = value;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_489_set_threadId__fromC)
+HXDLIN( 489)		this->threadId = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_threadId__fromC,(void))
 
 size_t ChatMessageBuilder_obj::attachments__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_385_attachments__fromC)
-HXDLIN( 385)		::Array< ::Dynamic> x = this->attachments;
-HXDLIN( 385)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 385)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 385)			{
-HXDLIN( 385)				int _g = 0;
-HXDLIN( 385)				while((_g < x->length)){
-HXDLIN( 385)					 ::borogove::ChatAttachment el = x->__get(_g).StaticCast<  ::borogove::ChatAttachment >();
-HXDLIN( 385)					_g = (_g + 1);
-HXDLIN( 385)					{
-HXDLIN( 385)						 ::Dynamic haxeObject = el;
-HXDLIN( 385)						void* ptr = haxeObject.mPtr;
-HXDLIN( 385)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 385)						{
-HXDLIN( 385)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 385)							if (::hx::IsNull( store )) {
-HXDLIN( 385)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 385)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 385)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 385)			void** ptr1 = (void**)x->getBase();
-HXDLIN( 385)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 385)			{
-HXDLIN( 385)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 385)				if (::hx::IsNull( store1 )) {
-HXDLIN( 385)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),x));
-HXDLIN( 385)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 385)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 385)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_413_attachments__fromC)
+HXDLIN( 413)		::Array< ::Dynamic> x = this->attachments;
+HXDLIN( 413)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 413)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 413)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(x));
             		}
-HXDLIN( 385)		return ( (size_t)(x->length) );
+HXDLIN( 413)		return ( (size_t)(x->length) );
             	}
 
 
-::String ChatMessageBuilder_obj::text__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_450_text__fromC)
-HXDLIN( 450)		return this->text;
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,text__fromC,return )
-
-void ChatMessageBuilder_obj::set_text__fromC(::String value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_461_set_text__fromC)
-HXDLIN( 461)		this->text = value;
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_text__fromC,(void))
-
 ::String ChatMessageBuilder_obj::lang__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_450_lang__fromC)
-HXDLIN( 450)		return this->lang;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_478_lang__fromC)
+HXDLIN( 478)		return this->lang;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,lang__fromC,return )
 
 void ChatMessageBuilder_obj::set_lang__fromC(::String value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_461_set_lang__fromC)
-HXDLIN( 461)		this->lang = value;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_489_set_lang__fromC)
+HXDLIN( 489)		this->lang = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_lang__fromC,(void))
 
 int ChatMessageBuilder_obj::direction__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_450_direction__fromC)
-HXDLIN( 450)		return this->direction;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_478_direction__fromC)
+HXDLIN( 478)		return this->direction;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,direction__fromC,return )
 
 void ChatMessageBuilder_obj::set_direction__fromC(int value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_461_set_direction__fromC)
-HXDLIN( 461)		this->direction = value;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_489_set_direction__fromC)
+HXDLIN( 489)		this->direction = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_direction__fromC,(void))
 
 int ChatMessageBuilder_obj::status__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_450_status__fromC)
-HXDLIN( 450)		return this->status;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_478_status__fromC)
+HXDLIN( 478)		return this->status;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,status__fromC,return )
 
 void ChatMessageBuilder_obj::set_status__fromC(int value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_461_set_status__fromC)
-HXDLIN( 461)		this->status = value;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_489_set_status__fromC)
+HXDLIN( 489)		this->status = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_status__fromC,(void))
 
 ::String ChatMessageBuilder_obj::statusText__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_450_statusText__fromC)
-HXDLIN( 450)		return this->statusText;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_478_statusText__fromC)
+HXDLIN( 478)		return this->statusText;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,statusText__fromC,return )
 
 void ChatMessageBuilder_obj::set_statusText__fromC(::String value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_461_set_statusText__fromC)
-HXDLIN( 461)		this->statusText = value;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_489_set_statusText__fromC)
+HXDLIN( 489)		this->statusText = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_statusText__fromC,(void))
 
 void ChatMessageBuilder_obj::set_versions__fromC(::cpp::Pointer< void* > inPtr,size_t count){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_439_set_versions__fromC)
-HXDLIN( 439)		::cpp::Pointer<  ::borogove::ChatMessage > _this = inPtr->reinterpret();
-HXDLIN( 439)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new();
-HXDLIN( 439)		::cpp::Pointer<  ::borogove::ChatMessage > tmp = _this;
-HXDLIN( 439)		result->setUnmanagedData(tmp,( (int)(count) ));
-HXDLIN( 439)		this->versions = result->copy();
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_467_set_versions__fromC)
+HXDLIN( 467)		::cpp::Pointer<  ::borogove::ChatMessage > _this = inPtr->reinterpret();
+HXDLIN( 467)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new();
+HXDLIN( 467)		::cpp::Pointer<  ::borogove::ChatMessage > tmp = _this;
+HXDLIN( 467)		result->setUnmanagedData(tmp,( (int)(count) ));
+HXDLIN( 467)		this->versions = result->copy();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(ChatMessageBuilder_obj,set_versions__fromC,(void))
 
 size_t ChatMessageBuilder_obj::versions__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_424_versions__fromC)
-HXDLIN( 424)		::Array< ::Dynamic> x = this->versions;
-HXDLIN( 424)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 424)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 424)			{
-HXDLIN( 424)				int _g = 0;
-HXDLIN( 424)				while((_g < x->length)){
-HXDLIN( 424)					 ::borogove::ChatMessage el = x->__get(_g).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 424)					_g = (_g + 1);
-HXDLIN( 424)					{
-HXDLIN( 424)						 ::Dynamic haxeObject = el;
-HXDLIN( 424)						void* ptr = haxeObject.mPtr;
-HXDLIN( 424)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 424)						{
-HXDLIN( 424)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 424)							if (::hx::IsNull( store )) {
-HXDLIN( 424)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 424)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 424)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 424)			void** ptr1 = (void**)x->getBase();
-HXDLIN( 424)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 424)			{
-HXDLIN( 424)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 424)				if (::hx::IsNull( store1 )) {
-HXDLIN( 424)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),x));
-HXDLIN( 424)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 424)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 424)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_452_versions__fromC)
+HXDLIN( 452)		::Array< ::Dynamic> x = this->versions;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(x));
             		}
-HXDLIN( 424)		return ( (size_t)(x->length) );
+HXDLIN( 452)		return ( (size_t)(x->length) );
             	}
 
 
  ::borogove::EncryptionInfo ChatMessageBuilder_obj::encryption__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_450_encryption__fromC)
-HXDLIN( 450)		return this->encryption;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_478_encryption__fromC)
+HXDLIN( 478)		return this->encryption;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,encryption__fromC,return )
 
 void ChatMessageBuilder_obj::set_encryption__fromC( ::borogove::EncryptionInfo value){
-            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_461_set_encryption__fromC)
-HXDLIN( 461)		this->encryption = value;
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_489_set_encryption__fromC)
+HXDLIN( 489)		this->encryption = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,set_encryption__fromC,(void))
 
+void ChatMessageBuilder_obj::set_linkMetadata__fromC(::cpp::Pointer< void* > inPtr,size_t count){
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_467_set_linkMetadata__fromC)
+HXDLIN( 467)		::cpp::Pointer<  ::borogove::LinkMetadata > _this = inPtr->reinterpret();
+HXDLIN( 467)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new();
+HXDLIN( 467)		::cpp::Pointer<  ::borogove::LinkMetadata > tmp = _this;
+HXDLIN( 467)		result->setUnmanagedData(tmp,( (int)(count) ));
+HXDLIN( 467)		this->linkMetadata = result->copy();
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(ChatMessageBuilder_obj,set_linkMetadata__fromC,(void))
+
+size_t ChatMessageBuilder_obj::linkMetadata__fromC(void*** outPtr){
+            	HX_STACKFRAME(&_hx_pos_e72a7715fb4723e4_452_linkMetadata__fromC)
+HXDLIN( 452)		::Array< ::Dynamic> x = this->linkMetadata;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(x));
+            		}
+HXDLIN( 452)		return ( (size_t)(x->length) );
+            	}
+
+
 void ChatMessageBuilder_obj::attachSims( ::borogove::Stanza sims){
-            	HX_GC_STACKFRAME(&_hx_pos_c7017726c326afec_230_attachSims)
-HXLINE( 231)		::String mime = sims->findText(HX_("{urn:xmpp:jingle:apps:file-transfer:5}/media-type#",f7,02,ad,24));
-HXLINE( 232)		if (::hx::IsNull( mime )) {
-HXLINE( 232)			mime = sims->findText(HX_("{urn:xmpp:jingle:apps:file-transfer:3}/media-type#",39,5c,52,9f));
+            	HX_GC_STACKFRAME(&_hx_pos_c7017726c326afec_250_attachSims)
+HXLINE( 251)		::String mime = sims->findText(HX_("{urn:xmpp:jingle:apps:file-transfer:5}/media-type#",f7,02,ad,24));
+HXLINE( 252)		if (::hx::IsNull( mime )) {
+HXLINE( 252)			mime = sims->findText(HX_("{urn:xmpp:jingle:apps:file-transfer:3}/media-type#",39,5c,52,9f));
             		}
-HXLINE( 233)		if (::hx::IsNull( mime )) {
-HXLINE( 233)			mime = HX_("application/octet-stream",5d,f8,82,30);
+HXLINE( 253)		if (::hx::IsNull( mime )) {
+HXLINE( 253)			mime = HX_("application/octet-stream",5d,f8,82,30);
             		}
-HXLINE( 234)		::String name = sims->findText(HX_("{urn:xmpp:jingle:apps:file-transfer:5}/name#",6f,0a,d5,d2));
-HXLINE( 235)		if (::hx::IsNull( name )) {
-HXLINE( 235)			name = sims->findText(HX_("{urn:xmpp:jingle:apps:file-transfer:3}/name#",31,26,70,60));
+HXLINE( 254)		::String name = sims->findText(HX_("{urn:xmpp:jingle:apps:file-transfer:5}/name#",6f,0a,d5,d2));
+HXLINE( 255)		if (::hx::IsNull( name )) {
+HXLINE( 255)			name = sims->findText(HX_("{urn:xmpp:jingle:apps:file-transfer:3}/name#",31,26,70,60));
             		}
-HXLINE( 236)		::String size = sims->findText(HX_("{urn:xmpp:jingle:apps:file-transfer:5}/size#",39,83,29,b9));
-HXLINE( 237)		if (::hx::IsNull( size )) {
-HXLINE( 237)			size = sims->findText(HX_("{urn:xmpp:jingle:apps:file-transfer:3}/size#",fb,9e,c4,46));
+HXLINE( 256)		::String size = sims->findText(HX_("{urn:xmpp:jingle:apps:file-transfer:5}/size#",39,83,29,b9));
+HXLINE( 257)		if (::hx::IsNull( size )) {
+HXLINE( 257)			size = sims->findText(HX_("{urn:xmpp:jingle:apps:file-transfer:3}/size#",fb,9e,c4,46));
             		}
-HXLINE( 238)		::Array< ::Dynamic> _this;
-HXDLIN( 238)		 ::borogove::Stanza tmp;
-HXDLIN( 238)		 ::borogove::Stanza tmp1 = sims->getChild(HX_("file",7c,ce,bb,43),HX_("urn:xmpp:jingle:apps:file-transfer:5",9c,81,0d,37));
-HXDLIN( 238)		if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 238)			tmp = tmp1;
+HXLINE( 258)		::Array< ::Dynamic> _this;
+HXDLIN( 258)		 ::borogove::Stanza tmp;
+HXDLIN( 258)		 ::borogove::Stanza tmp1 = sims->getChild(HX_("file",7c,ce,bb,43),HX_("urn:xmpp:jingle:apps:file-transfer:5",9c,81,0d,37));
+HXDLIN( 258)		if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 258)			tmp = tmp1;
             		}
             		else {
-HXLINE( 238)			tmp = sims->getChild(HX_("file",7c,ce,bb,43),HX_("urn:xmpp:jingle:apps:file-transfer:3",9a,81,0d,37));
+HXLINE( 258)			tmp = sims->getChild(HX_("file",7c,ce,bb,43),HX_("urn:xmpp:jingle:apps:file-transfer:3",9a,81,0d,37));
             		}
-HXDLIN( 238)		::Array< ::Dynamic> tmp2;
-HXDLIN( 238)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 238)			tmp2 = tmp->allTags(HX_("hash",ce,2f,08,45),HX_("urn:xmpp:hashes:2",90,ad,87,c7));
+HXDLIN( 258)		::Array< ::Dynamic> tmp2;
+HXDLIN( 258)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 258)			tmp2 = tmp->allTags(HX_("hash",ce,2f,08,45),HX_("urn:xmpp:hashes:2",90,ad,87,c7));
             		}
             		else {
-HXLINE( 238)			tmp2 = null();
+HXLINE( 258)			tmp2 = null();
             		}
-HXDLIN( 238)		if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 238)			_this = tmp2;
+HXDLIN( 258)		if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 258)			_this = tmp2;
             		}
             		else {
-HXLINE( 238)			_this = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 258)			_this = ::Array_obj< ::Dynamic>::__new(0);
             		}
-HXDLIN( 238)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_this->length);
-HXDLIN( 238)		{
-HXLINE( 238)			int _g = 0;
-HXDLIN( 238)			int _g1 = _this->length;
-HXDLIN( 238)			while((_g < _g1)){
-HXLINE( 238)				_g = (_g + 1);
-HXDLIN( 238)				int i = (_g - 1);
-HXDLIN( 238)				{
-HXLINE( 239)					 ::borogove::Stanza hash = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) );
-HXDLIN( 239)					::String inValue;
-HXDLIN( 239)					::String tmp3 = ( (::String)(::Reflect_obj::field(hash->attr,HX_("algo",d3,ff,6f,40))) );
-HXDLIN( 239)					if (::hx::IsNotNull( tmp3 )) {
-HXLINE( 239)						inValue = tmp3;
+HXDLIN( 258)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_this->length);
+HXDLIN( 258)		{
+HXLINE( 258)			int _g = 0;
+HXDLIN( 258)			int _g1 = _this->length;
+HXDLIN( 258)			while((_g < _g1)){
+HXLINE( 258)				_g = (_g + 1);
+HXDLIN( 258)				int i = (_g - 1);
+HXDLIN( 258)				{
+HXLINE( 259)					 ::borogove::Stanza hash = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) );
+HXDLIN( 259)					::String inValue;
+HXDLIN( 259)					::String tmp3 = ( (::String)(::Reflect_obj::field(hash->attr,HX_("algo",d3,ff,6f,40))) );
+HXDLIN( 259)					if (::hx::IsNotNull( tmp3 )) {
+HXLINE( 259)						inValue = tmp3;
             					}
             					else {
-HXLINE( 239)						inValue = HX_("",00,00,00,00);
+HXLINE( 259)						inValue = HX_("",00,00,00,00);
             					}
-HXLINE( 238)					 ::borogove::Hash inValue1 =  ::borogove::Hash_obj::__alloc( HX_CTX ,inValue,::haxe::crypto::Base64_obj::decode(hash->getText(),null())->b);
-HXDLIN( 238)					result->__unsafe_set(i,inValue1);
+HXLINE( 258)					 ::borogove::Hash inValue1 =  ::borogove::Hash_obj::__alloc( HX_CTX ,inValue,::haxe::crypto::Base64_obj::decode(hash->getText(),null())->b);
+HXDLIN( 258)					result->__unsafe_set(i,inValue1);
             				}
             			}
             		}
-HXLINE( 240)		 ::borogove::Stanza sources = sims->getChild(HX_("sources",38,0f,49,b9),null());
-HXLINE( 241)		::Array< ::Dynamic> _this1;
-HXDLIN( 241)		::Array< ::Dynamic> tmp4;
-HXDLIN( 241)		if (::hx::IsNotNull( sources )) {
-HXLINE( 241)			tmp4 = sources->allTags(HX_("reference",cb,07,c5,5a),HX_("urn:xmpp:reference:0",a5,00,10,5d));
+HXLINE( 260)		 ::borogove::Stanza sources = sims->getChild(HX_("sources",38,0f,49,b9),null());
+HXLINE( 261)		::Array< ::Dynamic> _this1;
+HXDLIN( 261)		::Array< ::Dynamic> tmp4;
+HXDLIN( 261)		if (::hx::IsNotNull( sources )) {
+HXLINE( 261)			tmp4 = sources->allTags(HX_("reference",cb,07,c5,5a),HX_("urn:xmpp:reference:0",a5,00,10,5d));
             		}
             		else {
-HXLINE( 241)			tmp4 = null();
+HXLINE( 261)			tmp4 = null();
             		}
-HXDLIN( 241)		if (::hx::IsNotNull( tmp4 )) {
-HXLINE( 241)			_this1 = tmp4;
+HXDLIN( 261)		if (::hx::IsNotNull( tmp4 )) {
+HXLINE( 261)			_this1 = tmp4;
             		}
             		else {
-HXLINE( 241)			_this1 = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 261)			_this1 = ::Array_obj< ::Dynamic>::__new(0);
             		}
-HXDLIN( 241)		::Array< ::String > result1 = ::Array_obj< ::String >::__new(_this1->length);
-HXDLIN( 241)		{
-HXLINE( 241)			int _g2 = 0;
-HXDLIN( 241)			int _g3 = _this1->length;
-HXDLIN( 241)			while((_g2 < _g3)){
-HXLINE( 241)				_g2 = (_g2 + 1);
-HXDLIN( 241)				int i1 = (_g2 - 1);
-HXDLIN( 241)				{
-HXLINE( 241)					::String inValue2;
-HXDLIN( 241)					::String tmp5 = ( (::String)(::Reflect_obj::field(( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this1,i1)) )->attr,HX_("uri",6c,2b,59,00))) );
-HXDLIN( 241)					if (::hx::IsNotNull( tmp5 )) {
-HXLINE( 241)						inValue2 = tmp5;
+HXDLIN( 261)		::Array< ::String > result1 = ::Array_obj< ::String >::__new(_this1->length);
+HXDLIN( 261)		{
+HXLINE( 261)			int _g2 = 0;
+HXDLIN( 261)			int _g3 = _this1->length;
+HXDLIN( 261)			while((_g2 < _g3)){
+HXLINE( 261)				_g2 = (_g2 + 1);
+HXDLIN( 261)				int i1 = (_g2 - 1);
+HXDLIN( 261)				{
+HXLINE( 261)					::String inValue2;
+HXDLIN( 261)					::String tmp5 = ( (::String)(::Reflect_obj::field(( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this1,i1)) )->attr,HX_("uri",6c,2b,59,00))) );
+HXDLIN( 261)					if (::hx::IsNotNull( tmp5 )) {
+HXLINE( 261)						inValue2 = tmp5;
             					}
             					else {
-HXLINE( 241)						inValue2 = HX_("",00,00,00,00);
+HXLINE( 261)						inValue2 = HX_("",00,00,00,00);
             					}
-HXDLIN( 241)					result1->__unsafe_set(i1,inValue2);
+HXDLIN( 261)					result1->__unsafe_set(i1,inValue2);
             				}
             			}
             		}
-HXDLIN( 241)		::Array< ::String > _g4 = ::Array_obj< ::String >::__new(0);
-HXDLIN( 241)		{
-HXLINE( 241)			int _g5 = 0;
-HXDLIN( 241)			while((_g5 < result1->length)){
-HXLINE( 241)				::String v = result1->__get(_g5);
-HXDLIN( 241)				_g5 = (_g5 + 1);
-HXDLIN( 241)				if ((v != HX_("",00,00,00,00))) {
-HXLINE( 241)					_g4->push(v);
+HXDLIN( 261)		::Array< ::String > _g4 = ::Array_obj< ::String >::__new(0);
+HXDLIN( 261)		{
+HXLINE( 261)			int _g5 = 0;
+HXDLIN( 261)			while((_g5 < result1->length)){
+HXLINE( 261)				::String v = result1->__get(_g5);
+HXDLIN( 261)				_g5 = (_g5 + 1);
+HXDLIN( 261)				if ((v != HX_("",00,00,00,00))) {
+HXLINE( 261)					_g4->push(v);
             				}
             			}
             		}
-HXLINE( 242)		if ((_g4->length > 0)) {
-HXLINE( 242)			::Array< ::Dynamic> _hx_tmp = this->attachments;
-HXDLIN( 242)			 ::Dynamic _hx_tmp1;
-HXDLIN( 242)			if (::hx::IsNull( size )) {
-HXLINE( 242)				_hx_tmp1 = null();
+HXLINE( 262)		if ((_g4->length > 0)) {
+HXLINE( 262)			::Array< ::Dynamic> _hx_tmp = this->attachments;
+HXDLIN( 262)			 ::Dynamic _hx_tmp1;
+HXDLIN( 262)			if (::hx::IsNull( size )) {
+HXLINE( 262)				_hx_tmp1 = null();
             			}
             			else {
-HXLINE( 242)				_hx_tmp1 = ::Std_obj::parseInt(size);
+HXLINE( 262)				_hx_tmp1 = ::Std_obj::parseInt(size);
             			}
-HXDLIN( 242)			_hx_tmp->push( ::borogove::ChatAttachment_obj::__alloc( HX_CTX ,name,mime,_hx_tmp1,_g4,result));
+HXDLIN( 262)			_hx_tmp->push( ::borogove::ChatAttachment_obj::__alloc( HX_CTX ,name,mime,_hx_tmp1,_g4,result));
             		}
             	}
 
@@ -627,235 +544,240 @@ HXDLIN( 242)			_hx_tmp->push( ::borogove::ChatAttachment_obj::__alloc( HX_CTX ,n
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,attachSims,(void))
 
 void ChatMessageBuilder_obj::addAttachment( ::borogove::ChatAttachment attachment){
-            	HX_STACKFRAME(&_hx_pos_c7017726c326afec_251_addAttachment)
-HXDLIN( 251)		this->attachments->push(attachment);
+            	HX_STACKFRAME(&_hx_pos_c7017726c326afec_271_addAttachment)
+HXDLIN( 271)		this->attachments->push(attachment);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,addAttachment,(void))
 
-void ChatMessageBuilder_obj::setHtml(::String html){
+void ChatMessageBuilder_obj::setBody( ::borogove::Html html){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		bool _hx_run( ::borogove::Stanza p){
-            			HX_GC_STACKFRAME(&_hx_pos_c7017726c326afec_273_setHtml)
-HXLINE( 273)			if ((( (::String)(::Reflect_obj::field(p->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xhtml-im",c2,5d,b2,ce))) {
-HXLINE( 273)				return (p->name == HX_("html",6b,95,16,45));
+            			HX_STACKFRAME(&_hx_pos_c7017726c326afec_280_setBody)
+HXLINE( 280)			if ((( (::String)(::Reflect_obj::field(p->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xhtml-im",c2,5d,b2,ce))) {
+HXLINE( 280)				return (p->name == HX_("html",6b,95,16,45));
             			}
             			else {
-HXLINE( 273)				return false;
+HXLINE( 280)				return false;
             			}
-HXDLIN( 273)			return false;
+HXDLIN( 280)			return false;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_c7017726c326afec_258_setHtml)
-HXLINE( 259)		 ::borogove::Stanza htmlEl =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("html",6b,95,16,45), ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/xhtml-im",c2,5d,b2,ce))));
-HXLINE( 260)		 ::borogove::Stanza body =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("body",a2,7a,1b,41), ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://www.w3.org/1999/xhtml",90,6d,f8,c8))));
-HXLINE( 261)		htmlEl->addChild(body);
-HXLINE( 262)		::Array< ::Dynamic> nodes = ::htmlparser::HtmlParser_obj::run(html,true);
-HXLINE( 263)		{
-HXLINE( 263)			int _g = 0;
-HXDLIN( 263)			while((_g < nodes->length)){
-HXLINE( 263)				 ::htmlparser::HtmlNode node = nodes->__get(_g).StaticCast<  ::htmlparser::HtmlNode >();
-HXDLIN( 263)				_g = (_g + 1);
-HXLINE( 264)				 ::htmlparser::HtmlNodeElement el = ( ( ::htmlparser::HtmlNodeElement)(::borogove::_Util::Util_Fields__obj::downcast(node,::hx::ClassOf< ::htmlparser::HtmlNodeElement >())) );
-HXLINE( 265)				bool _hx_tmp;
-HXDLIN( 265)				if (::hx::IsNotNull( el )) {
-HXLINE( 265)					if ((el->name != HX_("html",6b,95,16,45))) {
-HXLINE( 265)						_hx_tmp = (el->name == HX_("body",a2,7a,1b,41));
-            					}
-            					else {
-HXLINE( 265)						_hx_tmp = true;
-            					}
-            				}
-            				else {
-HXLINE( 265)					_hx_tmp = false;
-            				}
-HXDLIN( 265)				if (_hx_tmp) {
-HXLINE( 266)					int _g1 = 0;
-HXDLIN( 266)					::Array< ::Dynamic> _g2 = el->nodes;
-HXDLIN( 266)					while((_g1 < _g2->length)){
-HXLINE( 266)						 ::htmlparser::HtmlNode inner = _g2->__get(_g1).StaticCast<  ::htmlparser::HtmlNode >();
-HXDLIN( 266)						_g1 = (_g1 + 1);
-HXLINE( 267)						body->addDirectChild(this->htmlToNode(inner));
-            					}
-            				}
-            				else {
-HXLINE( 270)					body->addDirectChild(this->htmlToNode(node));
-            				}
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
+            		bool _hx_run( ::borogove::Stanza p){
+            			HX_STACKFRAME(&_hx_pos_c7017726c326afec_283_setBody)
+HXLINE( 283)			if ((( (::String)(::Reflect_obj::field(p->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:styling:0",48,d3,aa,fb))) {
+HXLINE( 283)				return (p->name == HX_("unstyled",2c,15,1a,18));
+            			}
+            			else {
+HXLINE( 283)				return false;
             			}
+HXDLIN( 283)			return false;
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_GC_STACKFRAME(&_hx_pos_c7017726c326afec_279_setBody)
+HXLINE( 280)		int htmlIdx = ::Lambda_obj::findIndex(this->payloads, ::Dynamic(new _hx_Closure_0()));
+HXLINE( 281)		if ((htmlIdx >= 0)) {
+HXLINE( 281)			this->payloads->removeRange(htmlIdx,1);
+            		}
+HXLINE( 283)		int unstyledIdx = ::Lambda_obj::findIndex(this->payloads, ::Dynamic(new _hx_Closure_1()));
+HXLINE( 284)		if ((unstyledIdx >= 0)) {
+HXLINE( 284)			this->payloads->removeRange(unstyledIdx,1);
+            		}
+HXLINE( 286)		if (::hx::IsNull( html )) {
+HXLINE( 287)			this->text = null();
             		}
-HXLINE( 273)		int htmlIdx = ::Lambda_obj::findIndex(this->payloads, ::Dynamic(new _hx_Closure_0()));
-HXLINE( 274)		if ((htmlIdx >= 0)) {
-HXLINE( 274)			this->payloads->removeRange(htmlIdx,1);
+            		else {
+HXLINE( 289)			if (html->isPlainText()) {
+HXLINE( 290)				this->payloads->push( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("unstyled",2c,15,1a,18), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:styling:0",48,d3,aa,fb)))));
+            			}
+            			else {
+HXLINE( 292)				 ::borogove::Stanza htmlEl =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("html",6b,95,16,45), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/xhtml-im",c2,5d,b2,ce))));
+HXLINE( 293)				 ::borogove::Stanza body =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("body",a2,7a,1b,41), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://www.w3.org/1999/xhtml",90,6d,f8,c8))));
+HXLINE( 294)				htmlEl->addChild(body);
+HXLINE( 295)				body->addChildNodes(html->xml);
+HXLINE( 296)				this->payloads->push(htmlEl);
+            			}
+HXLINE( 298)			this->text = html->toPlainText();
             		}
-HXLINE( 275)		this->payloads->push(htmlEl);
-HXLINE( 276)		this->text = ::borogove::XEP0393_obj::render(body,null());
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,setHtml,(void))
+HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,setBody,(void))
 
- ::borogove::Node ChatMessageBuilder_obj::htmlToNode( ::htmlparser::HtmlNode node){
-            	HX_GC_STACKFRAME(&_hx_pos_c7017726c326afec_279_htmlToNode)
-HXLINE( 280)		 ::htmlparser::HtmlNodeText txt = ( ( ::htmlparser::HtmlNodeText)(::borogove::_Util::Util_Fields__obj::downcast(node,::hx::ClassOf< ::htmlparser::HtmlNodeText >())) );
-HXLINE( 281)		if (::hx::IsNotNull( txt )) {
-HXLINE( 282)			return ::borogove::Node_obj::CData(txt->toText());
+void ChatMessageBuilder_obj::setSubject(::String subject){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            		bool _hx_run( ::borogove::Stanza p){
+            			HX_STACKFRAME(&_hx_pos_c7017726c326afec_306_setSubject)
+HXLINE( 306)			return (p->name == HX_("subject",ac,01,88,29));
             		}
-HXLINE( 284)		 ::htmlparser::HtmlNodeElement el = ( ( ::htmlparser::HtmlNodeElement)(::borogove::_Util::Util_Fields__obj::downcast(node,::hx::ClassOf< ::htmlparser::HtmlNodeElement >())) );
-HXLINE( 285)		if (::hx::IsNotNull( el )) {
-HXLINE( 286)			 ::borogove::Stanza s =  ::borogove::Stanza_obj::__alloc( HX_CTX ,el->name, ::Dynamic(::hx::Anon_obj::Create(0)));
-HXLINE( 287)			{
-HXLINE( 287)				int _g = 0;
-HXDLIN( 287)				::Array< ::Dynamic> _g1 = el->attributes;
-HXDLIN( 287)				while((_g < _g1->length)){
-HXLINE( 287)					 ::htmlparser::HtmlAttribute attr = _g1->__get(_g).StaticCast<  ::htmlparser::HtmlAttribute >();
-HXDLIN( 287)					_g = (_g + 1);
-HXLINE( 288)					::Reflect_obj::setField(s->attr,attr->name,attr->value);
-            				}
-            			}
-HXLINE( 290)			{
-HXLINE( 290)				int _g2 = 0;
-HXDLIN( 290)				::Array< ::Dynamic> _g3 = el->nodes;
-HXDLIN( 290)				while((_g2 < _g3->length)){
-HXLINE( 290)					 ::htmlparser::HtmlNode child = _g3->__get(_g2).StaticCast<  ::htmlparser::HtmlNode >();
-HXDLIN( 290)					_g2 = (_g2 + 1);
-HXLINE( 291)					s->addDirectChild(this->htmlToNode(child));
-            				}
-            			}
-HXLINE( 293)			return ::borogove::Node_obj::Element(s);
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_GC_STACKFRAME(&_hx_pos_c7017726c326afec_305_setSubject)
+HXLINE( 306)		int subjectIdx = ::Lambda_obj::findIndex(this->payloads, ::Dynamic(new _hx_Closure_0()));
+HXLINE( 307)		if ((subjectIdx >= 0)) {
+HXLINE( 307)			this->payloads->removeRange(subjectIdx,1);
+            		}
+HXLINE( 309)		if (::hx::IsNull( subject )) {
+HXLINE( 309)			return;
             		}
-HXLINE( 295)		HX_STACK_DO_THROW(HX_("node was neither text nor element?",c3,dc,19,83));
-HXDLIN( 295)		return null();
+HXLINE( 311)		::Array< ::Dynamic> _hx_tmp = this->payloads;
+HXDLIN( 311)		_hx_tmp->push( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("subject",ac,01,88,29),null())->text(subject));
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,htmlToNode,return )
+HX_DEFINE_DYNAMIC_FUNC1(ChatMessageBuilder_obj,setSubject,(void))
 
 ::String ChatMessageBuilder_obj::chatId(){
-            	HX_STACKFRAME(&_hx_pos_c7017726c326afec_302_chatId)
-HXDLIN( 302)		if (this->isIncoming()) {
-HXLINE( 303)			::Array< ::Dynamic> _this = this->replyTo;
-HXDLIN( 303)			::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN( 303)			{
-HXLINE( 303)				int _g = 0;
-HXDLIN( 303)				int _g1 = _this->length;
-HXDLIN( 303)				while((_g < _g1)){
-HXLINE( 303)					_g = (_g + 1);
-HXDLIN( 303)					int i = (_g - 1);
-HXDLIN( 303)					{
-HXLINE( 303)						::String inValue = ( ( ::borogove::JID)(_hx_array_unsafe_get(_this,i)) )->asBare()->asString();
-HXDLIN( 303)						result->__unsafe_set(i,inValue);
+            	HX_STACKFRAME(&_hx_pos_c7017726c326afec_320_chatId)
+HXDLIN( 320)		if (this->isIncoming()) {
+HXLINE( 321)			::Array< ::Dynamic> _this = this->replyTo;
+HXDLIN( 321)			::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN( 321)			{
+HXLINE( 321)				int _g = 0;
+HXDLIN( 321)				int _g1 = _this->length;
+HXDLIN( 321)				while((_g < _g1)){
+HXLINE( 321)					_g = (_g + 1);
+HXDLIN( 321)					int i = (_g - 1);
+HXDLIN( 321)					{
+HXLINE( 321)						::String inValue = ( ( ::borogove::JID)(_hx_array_unsafe_get(_this,i)) )->asBare()->asString();
+HXDLIN( 321)						result->__unsafe_set(i,inValue);
             					}
             				}
             			}
-HXDLIN( 303)			return result->join(HX_("\n",0a,00,00,00));
+HXDLIN( 321)			return result->join(HX_("\n",0a,00,00,00));
             		}
             		else {
-HXLINE( 305)			::Array< ::Dynamic> _this1 = this->recipients;
-HXDLIN( 305)			::Array< ::String > result1 = ::Array_obj< ::String >::__new(_this1->length);
-HXDLIN( 305)			{
-HXLINE( 305)				int _g2 = 0;
-HXDLIN( 305)				int _g3 = _this1->length;
-HXDLIN( 305)				while((_g2 < _g3)){
-HXLINE( 305)					_g2 = (_g2 + 1);
-HXDLIN( 305)					int i1 = (_g2 - 1);
-HXDLIN( 305)					{
-HXLINE( 305)						::String inValue1 = ( ( ::borogove::JID)(_hx_array_unsafe_get(_this1,i1)) )->asString();
-HXDLIN( 305)						result1->__unsafe_set(i1,inValue1);
+HXLINE( 323)			::Array< ::Dynamic> _this1 = this->recipients;
+HXDLIN( 323)			::Array< ::String > result1 = ::Array_obj< ::String >::__new(_this1->length);
+HXDLIN( 323)			{
+HXLINE( 323)				int _g2 = 0;
+HXDLIN( 323)				int _g3 = _this1->length;
+HXDLIN( 323)				while((_g2 < _g3)){
+HXLINE( 323)					_g2 = (_g2 + 1);
+HXDLIN( 323)					int i1 = (_g2 - 1);
+HXDLIN( 323)					{
+HXLINE( 323)						::String inValue1 = ( ( ::borogove::JID)(_hx_array_unsafe_get(_this1,i1)) )->asString();
+HXDLIN( 323)						result1->__unsafe_set(i1,inValue1);
             					}
             				}
             			}
-HXDLIN( 305)			return result1->join(HX_("\n",0a,00,00,00));
+HXDLIN( 323)			return result1->join(HX_("\n",0a,00,00,00));
             		}
-HXLINE( 302)		return null();
+HXLINE( 320)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,chatId,return )
 
 ::String ChatMessageBuilder_obj::get_senderId(){
-            	HX_STACKFRAME(&_hx_pos_c7017726c326afec_313_get_senderId)
-HXDLIN( 313)		::String tmp = this->senderId;
-HXDLIN( 313)		::String tmp1;
-HXDLIN( 313)		if (::hx::IsNotNull( tmp )) {
-HXDLIN( 313)			tmp1 = tmp;
+            	HX_STACKFRAME(&_hx_pos_c7017726c326afec_333_get_senderId)
+HXDLIN( 333)		::String tmp = this->senderId;
+HXDLIN( 333)		if (::hx::IsNotNull( tmp )) {
+HXDLIN( 333)			return tmp;
             		}
             		else {
-HXDLIN( 313)			 ::borogove::JID tmp2 = this->sender;
-HXDLIN( 313)			if (::hx::IsNotNull( tmp2 )) {
-HXDLIN( 313)				tmp1 = tmp2->asString();
+HXDLIN( 333)			 ::borogove::JID tmp1 = this->sender;
+HXDLIN( 333)			if (::hx::IsNotNull( tmp1 )) {
+HXDLIN( 333)				return tmp1->asString();
             			}
             			else {
-HXDLIN( 313)				tmp1 = null();
+HXDLIN( 333)				return null();
             			}
             		}
-HXDLIN( 313)		if (::hx::IsNotNull( tmp1 )) {
-HXDLIN( 313)			return tmp1;
-            		}
-            		else {
-HXDLIN( 313)			HX_STACK_DO_THROW(HX_("sender is null",12,ab,5a,42));
-            		}
-HXDLIN( 313)		return null();
+HXDLIN( 333)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,get_senderId,return )
 
 bool ChatMessageBuilder_obj::isIncoming(){
-            	HX_STACKFRAME(&_hx_pos_c7017726c326afec_318_isIncoming)
-HXDLIN( 318)		return (this->direction == 0);
+            	HX_STACKFRAME(&_hx_pos_c7017726c326afec_338_isIncoming)
+HXDLIN( 338)		return (this->direction == 0);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,isIncoming,return )
 
  ::borogove::ChatMessage ChatMessageBuilder_obj::build(){
-            	HX_GC_STACKFRAME(&_hx_pos_c7017726c326afec_326_build)
-HXLINE( 327)		bool _hx_tmp;
-HXDLIN( 327)		if (::hx::IsNull( this->serverId )) {
-HXLINE( 327)			_hx_tmp = ::hx::IsNull( this->localId );
+            	HX_GC_STACKFRAME(&_hx_pos_c7017726c326afec_346_build)
+HXLINE( 347)		bool _hx_tmp;
+HXDLIN( 347)		if (::hx::IsNull( this->serverId )) {
+HXLINE( 347)			_hx_tmp = ::hx::IsNull( this->localId );
             		}
             		else {
-HXLINE( 327)			_hx_tmp = false;
+HXLINE( 347)			_hx_tmp = false;
             		}
-HXDLIN( 327)		if (_hx_tmp) {
-HXLINE( 327)			HX_STACK_DO_THROW(HX_("Cannot build a ChatMessage with no id",ff,b8,88,e6));
+HXDLIN( 347)		if (_hx_tmp) {
+HXLINE( 347)			HX_STACK_DO_THROW(HX_("Cannot build a ChatMessage with no id",ff,b8,88,e6));
             		}
-HXLINE( 328)		 ::borogove::JID to = this->to;
-HXLINE( 329)		if (::hx::IsNull( to )) {
-HXLINE( 329)			HX_STACK_DO_THROW(HX_("Cannot build a ChatMessage with no to",9f,c2,88,e6));
+HXLINE( 348)		 ::borogove::JID to;
+HXDLIN( 348)		 ::borogove::JID tmp = this->to;
+HXDLIN( 348)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 348)			to = tmp;
             		}
-HXLINE( 330)		 ::borogove::JID from = this->from;
-HXLINE( 331)		if (::hx::IsNull( from )) {
-HXLINE( 331)			HX_STACK_DO_THROW(HX_("Cannot build a ChatMessage with no from",8e,93,f7,22));
+            		else {
+HXLINE( 348)			if (this->isIncoming()) {
+HXLINE( 348)				to =  ::borogove::JID_obj::__alloc( HX_CTX ,null(),HX_("inbound.to.me.example.com",05,22,96,fc),null(),null());
+            			}
+            			else {
+HXLINE( 348)				to = null();
+            			}
             		}
-HXLINE( 332)		if (::hx::IsNull( this->sender )) {
-HXLINE( 332)			from->asBare();
+HXLINE( 349)		if (::hx::IsNull( to )) {
+HXLINE( 349)			HX_STACK_DO_THROW(HX_("Cannot build a ChatMessage with no to",9f,c2,88,e6));
             		}
-HXLINE( 334)		::String _hx_tmp1 = this->localId;
-HXLINE( 335)		::String _hx_tmp2 = this->serverId;
-HXLINE( 336)		::String _hx_tmp3 = this->serverIdBy;
-HXLINE( 337)		 ::Dynamic _hx_tmp4 = this->type;
-HXLINE( 338)		 ::Dynamic _hx_tmp5 = this->syncPoint;
-HXLINE( 339)		::String _hx_tmp6 = this->replyId;
-HXLINE( 340)		::String _hx_tmp7;
-HXDLIN( 340)		::String tmp = this->timestamp;
-HXDLIN( 340)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 340)			_hx_tmp7 = tmp;
+HXLINE( 350)		::String senderId = this->get_senderId();
+HXLINE( 351)		if (::hx::IsNull( senderId )) {
+HXLINE( 351)			HX_STACK_DO_THROW(HX_("Cannot builder a ChatMessage with no sender",0c,5e,21,85));
+            		}
+HXLINE( 352)		 ::borogove::JID from;
+HXDLIN( 352)		 ::borogove::JID tmp1 = this->from;
+HXDLIN( 352)		if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 352)			from = tmp1;
             		}
             		else {
-HXLINE( 340)			_hx_tmp7 = ::borogove::Date_obj::format(::Date_obj::now());
+HXLINE( 352)			if (::hx::IsNull( senderId )) {
+HXLINE( 352)				from = null();
+            			}
+            			else {
+HXLINE( 352)				from = ::borogove::JID_obj::parse(senderId);
+            			}
+            		}
+HXLINE( 353)		if (::hx::IsNull( from )) {
+HXLINE( 353)			HX_STACK_DO_THROW(HX_("Cannot build a ChatMessage with no from",8e,93,f7,22));
+            		}
+HXLINE( 354)		if (::hx::IsNull( this->sender )) {
+HXLINE( 354)			from->asBare();
+            		}
+HXLINE( 356)		::String _hx_tmp1 = this->localId;
+HXLINE( 357)		::String _hx_tmp2 = this->serverId;
+HXLINE( 358)		::String _hx_tmp3 = this->serverIdBy;
+HXLINE( 359)		::String _hx_tmp4 = this->sortId;
+HXLINE( 360)		 ::Dynamic _hx_tmp5 = this->type;
+HXLINE( 361)		 ::Dynamic _hx_tmp6 = this->syncPoint;
+HXLINE( 362)		::String _hx_tmp7 = this->replyId;
+HXLINE( 363)		::String tmp2 = this->timestamp;
+HXDLIN( 363)		::String _hx_tmp8;
+HXDLIN( 363)		if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 363)			_hx_tmp8 = tmp2;
             		}
-HXLINE( 333)		return  ::borogove::ChatMessage_obj::__alloc( HX_CTX , ::Dynamic(::hx::Anon_obj::Create(25)
+            		else {
+HXLINE( 363)			_hx_tmp8 = ::borogove::Date_obj::format(::Date_obj::now());
+            		}
+HXLINE( 355)		return  ::borogove::ChatMessage_obj::__alloc( HX_CTX , ::Dynamic(::hx::Anon_obj::Create(27)
             			->setFixed(0,HX_("recipients",7a,62,59,87),this->recipients)
-            			->setFixed(1,HX_("syncPoint",f5,ff,94,98),_hx_tmp5)
+            			->setFixed(1,HX_("syncPoint",f5,ff,94,98),_hx_tmp6)
             			->setFixed(2,HX_("payloads",25,dd,d1,a1),this->payloads)
-            			->setFixed(3,HX_("timestamp",d6,d4,ce,a5),_hx_tmp7)
+            			->setFixed(3,HX_("timestamp",d6,d4,ce,a5),_hx_tmp8)
             			->setFixed(4,HX_("replyToMessage",02,cf,60,a6),this->replyToMessage)
-            			->setFixed(5,HX_("replyId",a5,67,3a,ab),_hx_tmp6)
+            			->setFixed(5,HX_("replyId",a5,67,3a,ab),_hx_tmp7)
             			->setFixed(6,HX_("replyTo",45,71,3a,ab),this->replyTo)
             			->setFixed(7,HX_("statusText",ff,60,57,b1),this->statusText)
             			->setFixed(8,HX_("threadId",45,81,25,cc),this->threadId)
@@ -863,58 +785,61 @@ HXLINE( 333)		return  ::borogove::ChatMessage_obj::__alloc( HX_CTX , ::Dynamic(:
             			->setFixed(10,HX_("serverId",7e,01,b2,e2),_hx_tmp2)
             			->setFixed(11,HX_("attachments",30,df,33,e7),this->attachments)
             			->setFixed(12,HX_("reactions",aa,cc,95,e7),this->reactions)
-            			->setFixed(13,HX_("senderId",f0,1e,0e,ec),this->get_senderId())
+            			->setFixed(13,HX_("senderId",f0,1e,0e,ec),senderId)
             			->setFixed(14,HX_("to",7b,65,00,00),to)
             			->setFixed(15,HX_("stanza",f5,5d,f7,05),this->stanza)
             			->setFixed(16,HX_("status",32,e7,fb,05),this->status)
             			->setFixed(17,HX_("direction",3f,62,40,10),this->direction)
             			->setFixed(18,HX_("localId",26,7a,c6,2d),_hx_tmp1)
-            			->setFixed(19,HX_("from",6a,a5,c2,43),from)
-            			->setFixed(20,HX_("lang",ee,05,ad,47),this->lang)
-            			->setFixed(21,HX_("text",ad,cc,f9,4c),this->text)
-            			->setFixed(22,HX_("type",ba,f2,08,4d),_hx_tmp4)
-            			->setFixed(23,HX_("encryption",83,dc,39,4f),this->encryption)
-            			->setFixed(24,HX_("serverIdBy",f5,16,54,74),_hx_tmp3)));
+            			->setFixed(19,HX_("sortId",d9,7a,37,30),_hx_tmp4)
+            			->setFixed(20,HX_("from",6a,a5,c2,43),from)
+            			->setFixed(21,HX_("lang",ee,05,ad,47),this->lang)
+            			->setFixed(22,HX_("text",ad,cc,f9,4c),this->text)
+            			->setFixed(23,HX_("type",ba,f2,08,4d),_hx_tmp5)
+            			->setFixed(24,HX_("encryption",83,dc,39,4f),this->encryption)
+            			->setFixed(25,HX_("serverIdBy",f5,16,54,74),_hx_tmp3)
+            			->setFixed(26,HX_("linkMetadata",89,45,ae,7c),this->linkMetadata)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ChatMessageBuilder_obj,build,return )
 
  ::borogove::ChatMessage ChatMessageBuilder_obj::makeModerated( ::borogove::ChatMessage m,::String timestamp,::String moderatorId,::String reason){
-            	HX_GC_STACKFRAME(&_hx_pos_c7017726c326afec_199_makeModerated)
-HXLINE( 200)		 ::borogove::ChatMessageBuilder builder =  ::borogove::ChatMessageBuilder_obj::__alloc( HX_CTX );
-HXLINE( 201)		builder->localId = m->localId;
-HXLINE( 202)		builder->serverId = m->serverId;
-HXLINE( 203)		builder->serverIdBy = m->serverIdBy;
-HXLINE( 204)		builder->type = m->type;
-HXLINE( 205)		builder->syncPoint = m->syncPoint;
-HXLINE( 206)		builder->replyId = m->replyId;
-HXLINE( 207)		builder->timestamp = m->timestamp;
-HXLINE( 208)		builder->to = m->to;
-HXLINE( 209)		builder->from = m->from;
-HXLINE( 210)		builder->senderId = m->senderId;
-HXLINE( 211)		builder->recipients = ::Lambda_obj::array(m->recipients);
-HXLINE( 212)		builder->replyTo = ::Lambda_obj::array(m->replyTo);
-HXLINE( 213)		builder->replyToMessage = m->replyToMessage;
-HXLINE( 214)		builder->threadId = m->threadId;
-HXLINE( 215)		builder->reactions = m->reactions;
-HXLINE( 216)		builder->direction = m->direction;
-HXLINE( 217)		builder->status = m->status;
-HXLINE( 218)		 ::borogove::ChatMessage cleanedStub = builder->build();
-HXLINE( 219)		 ::borogove::Stanza payload =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("retracted",a0,7c,77,08), ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_GC_STACKFRAME(&_hx_pos_c7017726c326afec_218_makeModerated)
+HXLINE( 219)		 ::borogove::ChatMessageBuilder builder =  ::borogove::ChatMessageBuilder_obj::__alloc( HX_CTX );
+HXLINE( 220)		builder->localId = m->localId;
+HXLINE( 221)		builder->serverId = m->serverId;
+HXLINE( 222)		builder->serverIdBy = m->serverIdBy;
+HXLINE( 223)		builder->sortId = m->sortId;
+HXLINE( 224)		builder->type = m->type;
+HXLINE( 225)		builder->syncPoint = m->syncPoint;
+HXLINE( 226)		builder->replyId = m->replyId;
+HXLINE( 227)		builder->timestamp = m->timestamp;
+HXLINE( 228)		builder->to = m->to;
+HXLINE( 229)		builder->from = m->from;
+HXLINE( 230)		builder->senderId = m->senderId;
+HXLINE( 231)		builder->recipients = ::Lambda_obj::array(m->recipients);
+HXLINE( 232)		builder->replyTo = ::Lambda_obj::array(m->replyTo);
+HXLINE( 233)		builder->replyToMessage = m->replyToMessage;
+HXLINE( 234)		builder->threadId = m->threadId;
+HXLINE( 235)		builder->reactions = m->reactions;
+HXLINE( 236)		builder->direction = m->direction;
+HXLINE( 237)		builder->status = m->status;
+HXLINE( 238)		 ::borogove::ChatMessage cleanedStub = builder->build();
+HXLINE( 239)		 ::borogove::Stanza payload =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("retracted",a0,7c,77,08), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("stamp",03,70,0b,84),timestamp)
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:message-retract:1",16,5e,d8,d5))));
-HXLINE( 220)		if (::hx::IsNotNull( reason )) {
-HXLINE( 220)			payload->textTag(HX_("reason",c4,0f,9d,fc),reason,null());
+HXLINE( 240)		if (::hx::IsNotNull( reason )) {
+HXLINE( 240)			payload->textTag(HX_("reason",c4,0f,9d,fc),reason,null());
             		}
-HXLINE( 221)		payload->tag(HX_("moderated",41,37,3b,22), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 241)		payload->tag(HX_("moderated",41,37,3b,22), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("by",d7,55,00,00),moderatorId)
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:message-moderate:1",5c,30,1a,b9))))->up();
-HXLINE( 222)		builder->payloads->push(payload);
-HXLINE( 223)		builder->timestamp = timestamp;
-HXLINE( 224)		builder->versions = ::Array_obj< ::Dynamic>::__new(2)->init(0,builder->build())->init(1,cleanedStub);
-HXLINE( 225)		builder->timestamp = m->timestamp;
-HXLINE( 226)		return builder->build();
+HXLINE( 242)		builder->payloads->push(payload);
+HXLINE( 243)		builder->timestamp = timestamp;
+HXLINE( 244)		builder->versions = ::Array_obj< ::Dynamic>::__new(2)->init(0,builder->build())->init(1,cleanedStub);
+HXLINE( 245)		builder->timestamp = m->timestamp;
+HXLINE( 246)		return builder->build();
             	}
 
 
@@ -944,6 +869,7 @@ void ChatMessageBuilder_obj::__Mark(HX_MARK_PARAMS)
 	HX_MARK_MEMBER_NAME(localId,"localId");
 	HX_MARK_MEMBER_NAME(serverId,"serverId");
 	HX_MARK_MEMBER_NAME(serverIdBy,"serverIdBy");
+	HX_MARK_MEMBER_NAME(sortId,"sortId");
 	HX_MARK_MEMBER_NAME(type,"type");
 	HX_MARK_MEMBER_NAME(syncPoint,"syncPoint");
 	HX_MARK_MEMBER_NAME(replyId,"replyId");
@@ -966,6 +892,7 @@ void ChatMessageBuilder_obj::__Mark(HX_MARK_PARAMS)
 	HX_MARK_MEMBER_NAME(versions,"versions");
 	HX_MARK_MEMBER_NAME(payloads,"payloads");
 	HX_MARK_MEMBER_NAME(encryption,"encryption");
+	HX_MARK_MEMBER_NAME(linkMetadata,"linkMetadata");
 	HX_MARK_MEMBER_NAME(stanza,"stanza");
 	HX_MARK_END_CLASS();
 }
@@ -975,6 +902,7 @@ void ChatMessageBuilder_obj::__Visit(HX_VISIT_PARAMS)
 	HX_VISIT_MEMBER_NAME(localId,"localId");
 	HX_VISIT_MEMBER_NAME(serverId,"serverId");
 	HX_VISIT_MEMBER_NAME(serverIdBy,"serverIdBy");
+	HX_VISIT_MEMBER_NAME(sortId,"sortId");
 	HX_VISIT_MEMBER_NAME(type,"type");
 	HX_VISIT_MEMBER_NAME(syncPoint,"syncPoint");
 	HX_VISIT_MEMBER_NAME(replyId,"replyId");
@@ -997,6 +925,7 @@ void ChatMessageBuilder_obj::__Visit(HX_VISIT_PARAMS)
 	HX_VISIT_MEMBER_NAME(versions,"versions");
 	HX_VISIT_MEMBER_NAME(payloads,"payloads");
 	HX_VISIT_MEMBER_NAME(encryption,"encryption");
+	HX_VISIT_MEMBER_NAME(linkMetadata,"linkMetadata");
 	HX_VISIT_MEMBER_NAME(stanza,"stanza");
 }
 
@@ -1016,6 +945,7 @@ void ChatMessageBuilder_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"build") ) { return ::hx::Val( build_dyn() ); }
 		break;
 	case 6:
+		if (HX_FIELD_EQ(inName,"sortId") ) { return ::hx::Val( sortId ); }
 		if (HX_FIELD_EQ(inName,"sender") ) { return ::hx::Val( sender ); }
 		if (HX_FIELD_EQ(inName,"status") ) { return ::hx::Val( status ); }
 		if (HX_FIELD_EQ(inName,"stanza") ) { return ::hx::Val( stanza ); }
@@ -1025,7 +955,7 @@ void ChatMessageBuilder_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"localId") ) { return ::hx::Val( localId ); }
 		if (HX_FIELD_EQ(inName,"replyId") ) { return ::hx::Val( replyId ); }
 		if (HX_FIELD_EQ(inName,"replyTo") ) { return ::hx::Val( replyTo ); }
-		if (HX_FIELD_EQ(inName,"setHtml") ) { return ::hx::Val( setHtml_dyn() ); }
+		if (HX_FIELD_EQ(inName,"setBody") ) { return ::hx::Val( setBody_dyn() ); }
 		break;
 	case 8:
 		if (HX_FIELD_EQ(inName,"serverId") ) { return ::hx::Val( serverId ); }
@@ -1046,16 +976,16 @@ void ChatMessageBuilder_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"statusText") ) { return ::hx::Val( statusText ); }
 		if (HX_FIELD_EQ(inName,"encryption") ) { return ::hx::Val( encryption ); }
 		if (HX_FIELD_EQ(inName,"attachSims") ) { return ::hx::Val( attachSims_dyn() ); }
-		if (HX_FIELD_EQ(inName,"htmlToNode") ) { return ::hx::Val( htmlToNode_dyn() ); }
+		if (HX_FIELD_EQ(inName,"setSubject") ) { return ::hx::Val( setSubject_dyn() ); }
 		if (HX_FIELD_EQ(inName,"isIncoming") ) { return ::hx::Val( isIncoming_dyn() ); }
 		break;
 	case 11:
 		if (HX_FIELD_EQ(inName,"type__fromC") ) { return ::hx::Val( type__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"attachments") ) { return ::hx::Val( attachments ); }
-		if (HX_FIELD_EQ(inName,"text__fromC") ) { return ::hx::Val( text__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"lang__fromC") ) { return ::hx::Val( lang__fromC_dyn() ); }
 		break;
 	case 12:
+		if (HX_FIELD_EQ(inName,"linkMetadata") ) { return ::hx::Val( linkMetadata ); }
 		if (HX_FIELD_EQ(inName,"get_senderId") ) { return ::hx::Val( get_senderId_dyn() ); }
 		break;
 	case 13:
@@ -1071,7 +1001,6 @@ void ChatMessageBuilder_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"set_type__fromC") ) { return ::hx::Val( set_type__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"senderId__fromC") ) { return ::hx::Val( senderId__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"threadId__fromC") ) { return ::hx::Val( threadId__fromC_dyn() ); }
-		if (HX_FIELD_EQ(inName,"set_text__fromC") ) { return ::hx::Val( set_text__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"set_lang__fromC") ) { return ::hx::Val( set_lang__fromC_dyn() ); }
 		break;
 	case 16:
@@ -1103,6 +1032,9 @@ void ChatMessageBuilder_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"set_statusText__fromC") ) { return ::hx::Val( set_statusText__fromC_dyn() ); }
 		if (HX_FIELD_EQ(inName,"set_encryption__fromC") ) { return ::hx::Val( set_encryption__fromC_dyn() ); }
 		break;
+	case 23:
+		if (HX_FIELD_EQ(inName,"set_linkMetadata__fromC") ) { return ::hx::Val( set_linkMetadata__fromC_dyn() ); }
+		break;
 	case 25:
 		if (HX_FIELD_EQ(inName,"set_replyToMessage__fromC") ) { return ::hx::Val( set_replyToMessage__fromC_dyn() ); }
 	}
@@ -1131,6 +1063,7 @@ bool ChatMessageBuilder_obj::__GetStatic(const ::String &inName, Dynamic &outVal
 		if (HX_FIELD_EQ(inName,"lang") ) { lang=inValue.Cast< ::String >(); return inValue; }
 		break;
 	case 6:
+		if (HX_FIELD_EQ(inName,"sortId") ) { sortId=inValue.Cast< ::String >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"sender") ) { sender=inValue.Cast<  ::borogove::JID >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"status") ) { status=inValue.Cast< int >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"stanza") ) { stanza=inValue.Cast<  ::borogove::Stanza >(); return inValue; }
@@ -1162,6 +1095,9 @@ bool ChatMessageBuilder_obj::__GetStatic(const ::String &inName, Dynamic &outVal
 	case 11:
 		if (HX_FIELD_EQ(inName,"attachments") ) { attachments=inValue.Cast< ::Array< ::Dynamic> >(); return inValue; }
 		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"linkMetadata") ) { linkMetadata=inValue.Cast< ::Array< ::Dynamic> >(); return inValue; }
+		break;
 	case 14:
 		if (HX_FIELD_EQ(inName,"replyToMessage") ) { replyToMessage=inValue.Cast<  ::borogove::ChatMessage >(); return inValue; }
 	}
@@ -1173,6 +1109,7 @@ void ChatMessageBuilder_obj::__GetFields(Array< ::String> &outFields)
 	outFields->push(HX_("localId",26,7a,c6,2d));
 	outFields->push(HX_("serverId",7e,01,b2,e2));
 	outFields->push(HX_("serverIdBy",f5,16,54,74));
+	outFields->push(HX_("sortId",d9,7a,37,30));
 	outFields->push(HX_("type",ba,f2,08,4d));
 	outFields->push(HX_("syncPoint",f5,ff,94,98));
 	outFields->push(HX_("replyId",a5,67,3a,ab));
@@ -1195,6 +1132,7 @@ void ChatMessageBuilder_obj::__GetFields(Array< ::String> &outFields)
 	outFields->push(HX_("versions",5b,4e,b8,d6));
 	outFields->push(HX_("payloads",25,dd,d1,a1));
 	outFields->push(HX_("encryption",83,dc,39,4f));
+	outFields->push(HX_("linkMetadata",89,45,ae,7c));
 	outFields->push(HX_("stanza",f5,5d,f7,05));
 	super::__GetFields(outFields);
 };
@@ -1204,6 +1142,7 @@ static ::hx::StorageInfo ChatMessageBuilder_obj_sMemberStorageInfo[] = {
 	{::hx::fsString,(int)offsetof(ChatMessageBuilder_obj,localId),HX_("localId",26,7a,c6,2d)},
 	{::hx::fsString,(int)offsetof(ChatMessageBuilder_obj,serverId),HX_("serverId",7e,01,b2,e2)},
 	{::hx::fsString,(int)offsetof(ChatMessageBuilder_obj,serverIdBy),HX_("serverIdBy",f5,16,54,74)},
+	{::hx::fsString,(int)offsetof(ChatMessageBuilder_obj,sortId),HX_("sortId",d9,7a,37,30)},
 	{::hx::fsInt,(int)offsetof(ChatMessageBuilder_obj,type),HX_("type",ba,f2,08,4d)},
 	{::hx::fsBool,(int)offsetof(ChatMessageBuilder_obj,syncPoint),HX_("syncPoint",f5,ff,94,98)},
 	{::hx::fsString,(int)offsetof(ChatMessageBuilder_obj,replyId),HX_("replyId",a5,67,3a,ab)},
@@ -1226,6 +1165,7 @@ static ::hx::StorageInfo ChatMessageBuilder_obj_sMemberStorageInfo[] = {
 	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(ChatMessageBuilder_obj,versions),HX_("versions",5b,4e,b8,d6)},
 	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(ChatMessageBuilder_obj,payloads),HX_("payloads",25,dd,d1,a1)},
 	{::hx::fsObject /*  ::borogove::EncryptionInfo */ ,(int)offsetof(ChatMessageBuilder_obj,encryption),HX_("encryption",83,dc,39,4f)},
+	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(ChatMessageBuilder_obj,linkMetadata),HX_("linkMetadata",89,45,ae,7c)},
 	{::hx::fsObject /*  ::borogove::Stanza */ ,(int)offsetof(ChatMessageBuilder_obj,stanza),HX_("stanza",f5,5d,f7,05)},
 	{ ::hx::fsUnknown, 0, null()}
 };
@@ -1242,6 +1182,7 @@ static ::String ChatMessageBuilder_obj_sMemberFields[] = {
 	HX_("serverIdBy",f5,16,54,74),
 	HX_("serverIdBy__fromC",24,52,2e,02),
 	HX_("set_serverIdBy__fromC",07,23,e5,d4),
+	HX_("sortId",d9,7a,37,30),
 	HX_("type",ba,f2,08,4d),
 	HX_("type__fromC",ff,a8,6c,93),
 	HX_("set_type__fromC",a2,dd,19,50),
@@ -1267,8 +1208,6 @@ static ::String ChatMessageBuilder_obj_sMemberFields[] = {
 	HX_("attachments",30,df,33,e7),
 	HX_("reactions",aa,cc,95,e7),
 	HX_("text",ad,cc,f9,4c),
-	HX_("text__fromC",6c,43,1b,7f),
-	HX_("set_text__fromC",0f,78,c8,3b),
 	HX_("lang",ee,05,ad,47),
 	HX_("lang__fromC",4b,24,00,52),
 	HX_("set_lang__fromC",ee,58,ad,0e),
@@ -1287,11 +1226,13 @@ static ::String ChatMessageBuilder_obj_sMemberFields[] = {
 	HX_("encryption__fromC",56,7a,b6,09),
 	HX_("set_encryption__fromC",39,4b,6d,dc),
 	HX_("encryption",83,dc,39,4f),
+	HX_("set_linkMetadata__fromC",b3,ed,76,45),
+	HX_("linkMetadata",89,45,ae,7c),
 	HX_("stanza",f5,5d,f7,05),
 	HX_("attachSims",e1,83,46,cc),
 	HX_("addAttachment",64,51,bc,47),
-	HX_("setHtml",2d,d6,9a,0a),
-	HX_("htmlToNode",e8,e0,84,4c),
+	HX_("setBody",64,bb,9f,06),
+	HX_("setSubject",2a,26,67,7c),
 	HX_("chatId",d3,04,77,b7),
 	HX_("get_senderId",f9,d2,27,a1),
 	HX_("isIncoming",f0,52,c4,95),
@@ -1331,8 +1272,8 @@ void ChatMessageBuilder_obj::__register()
 void ChatMessageBuilder_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_c7017726c326afec_32_boot)
-HXDLIN(  32)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_c7017726c326afec_31_boot)
+HXDLIN(  31)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(32)
             				->setFixed(0,HX_("serverId__fromC",bb,ba,c0,81), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
@@ -1380,23 +1321,23 @@ HXDLIN(  32)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
             				->setFixed(22,HX_("set_direction__fromC",97,80,e8,36), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(23,HX_("set_text__fromC",0f,78,c8,3b), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(23,HX_("linkMetadata__fromC",10,de,bf,3a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
             				->setFixed(24,HX_("set_threadId__fromC",f7,93,29,41), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(25,HX_("set_serverId__fromC",de,7c,68,49), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(25,HX_("set_linkMetadata__fromC",b3,ed,76,45), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(26,HX_("direction__fromC",1a,64,c6,4b), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(26,HX_("set_serverId__fromC",de,7c,68,49), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(27,HX_("set_type__fromC",a2,dd,19,50), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(27,HX_("direction__fromC",1a,64,c6,4b), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(28,HX_("lang__fromC",4b,24,00,52), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(28,HX_("set_type__fromC",a2,dd,19,50), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(29,HX_("set_statusText__fromC",3d,8e,37,5f), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(29,HX_("lang__fromC",4b,24,00,52), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(30,HX_("threadId__fromC",d4,d1,81,79), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(30,HX_("set_statusText__fromC",3d,8e,37,5f), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(31,HX_("text__fromC",6c,43,1b,7f), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(31,HX_("threadId__fromC",d4,d1,81,79), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null()))))));
             	}
 }
diff --git a/Sources/c_borogove/src/borogove/Client.cpp b/Sources/c_borogove/src/borogove/Client.cpp
index c7cb5ad..4eb65ac 100644
--- a/Sources/c_borogove/src/borogove/Client.cpp
+++ b/Sources/c_borogove/src/borogove/Client.cpp
@@ -4,9 +4,6 @@
 #ifndef INCLUDED_Date
 #include <Date.h>
 #endif
-#ifndef INCLUDED_EReg
-#include <EReg.h>
-#endif
 #ifndef INCLUDED_Lambda
 #include <Lambda.h>
 #endif
@@ -19,18 +16,36 @@
 #ifndef INCLUDED_StringTools
 #include <StringTools.h>
 #endif
+#ifndef INCLUDED__FractionalIndexing_FractionalIndexing_Fields_
+#include <_FractionalIndexing/FractionalIndexing_Fields_.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_HaxeStringArray_Impl_
+#include <_HaxeCBridge/HaxeStringArray_Impl_.h>
+#endif
 #ifndef INCLUDED__HaxeCBridge_Internal
 #include <_HaxeCBridge/Internal.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_AttachmentSource
 #include <borogove/AttachmentSource.h>
 #endif
 #ifndef INCLUDED_borogove_AvailableChat
 #include <borogove/AvailableChat.h>
 #endif
+#ifndef INCLUDED_borogove_AvailableChatIterator
+#include <borogove/AvailableChatIterator.h>
+#endif
 #ifndef INCLUDED_borogove_Caps
 #include <borogove/Caps.h>
 #endif
+#ifndef INCLUDED_borogove_CapsRepo
+#include <borogove/CapsRepo.h>
+#endif
 #ifndef INCLUDED_borogove_Channel
 #include <borogove/Channel.h>
 #endif
@@ -73,9 +88,6 @@
 #ifndef INCLUDED_borogove_Hash
 #include <borogove/Hash.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
-#endif
 #ifndef INCLUDED_borogove_Identity
 #include <borogove/Identity.h>
 #endif
@@ -88,6 +100,12 @@
 #ifndef INCLUDED_borogove_JID
 #include <borogove/JID.h>
 #endif
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
+#endif
+#ifndef INCLUDED_borogove_MemberUpdate
+#include <borogove/MemberUpdate.h>
+#endif
 #ifndef INCLUDED_borogove_Message
 #include <borogove/Message.h>
 #endif
@@ -100,15 +118,9 @@
 #ifndef INCLUDED_borogove_ModerationAction
 #include <borogove/ModerationAction.h>
 #endif
-#ifndef INCLUDED_borogove_Participant
-#include <borogove/Participant.h>
-#endif
 #ifndef INCLUDED_borogove_Persistence
 #include <borogove/Persistence.h>
 #endif
-#ifndef INCLUDED_borogove_Presence
-#include <borogove/Presence.h>
-#endif
 #ifndef INCLUDED_borogove_Profile
 #include <borogove/Profile.h>
 #endif
@@ -130,6 +142,12 @@
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
+#ifndef INCLUDED_borogove_Status
+#include <borogove/Status.h>
+#endif
+#ifndef INCLUDED_borogove__Chat_Chat_Fields_
+#include <borogove/_Chat/Chat_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove__Util_Util_Fields_
 #include <borogove/_Util/Util_Fields_.h>
 #endif
@@ -214,6 +232,9 @@
 #ifndef INCLUDED_haxe_crypto_Base64
 #include <haxe/crypto/Base64.h>
 #endif
+#ifndef INCLUDED_haxe_crypto_Sha256
+#include <haxe/crypto/Sha256.h>
+#endif
 #ifndef INCLUDED_haxe_ds_Either
 #include <haxe/ds/Either.h>
 #endif
@@ -226,12 +247,6 @@
 #ifndef INCLUDED_haxe_io_Input
 #include <haxe/io/Input.h>
 #endif
-#ifndef INCLUDED_sha_Hash
-#include <sha/Hash.h>
-#endif
-#ifndef INCLUDED_sha_SHA256
-#include <sha/SHA256.h>
-#endif
 #ifndef INCLUDED_sys_io_File
 #include <sys/io/File.h>
 #endif
@@ -341,301 +356,310 @@
 #include <tink/streams/_Stream/Handler_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_141_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",141,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_145_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",145,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_151_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",151,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_156_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",156,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_167_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",167,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_161_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",161,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_177_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",177,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_171_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",171,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_181_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",181,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_214_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",214,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_267_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",267,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_270_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",270,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_297_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",297,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_312_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",312,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_335_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",335,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_355_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",355,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_153_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",153,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_157_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",157,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_163_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",163,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_168_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",168,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_179_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",179,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_173_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",173,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_189_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",189,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_183_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",183,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_193_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",193,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_226_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",226,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_279_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",279,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_282_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",282,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_309_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",309,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_324_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",324,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_347_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",347,0x8e157d85)
 HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_362_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",362,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_376_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",376,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_367_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",367,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_394_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",394,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_404_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",404,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_398_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",398,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_432_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",432,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_433_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",433,0x8e157d85)
-HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_59_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",59,0x8e157d85)
-static const ::String _hx_array_data_c0e6dc18_33[] = {
-	HX_("http://jabber.org/protocol/disco#info",cb,2b,7f,0b),HX_("http://jabber.org/protocol/caps",95,d0,90,e2),HX_("urn:xmpp:caps",3d,5a,a1,f4),HX_("urn:xmpp:avatar:metadata+notify",e0,89,c6,db),HX_("http://jabber.org/protocol/nick+notify",fd,dd,65,10),HX_("urn:xmpp:bookmarks:1+notify",dc,4b,f7,cc),HX_("urn:xmpp:mds:displayed:0+notify",17,ae,91,a8),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07),HX_("urn:xmpp:jingle:1",44,c4,fe,f7),HX_("urn:xmpp:jingle:apps:dtls:0",a8,cb,02,66),HX_("urn:xmpp:jingle:apps:rtp:1",ea,41,fe,5c),HX_("urn:xmpp:jingle:apps:rtp:audio",0f,8b,54,6c),HX_("urn:xmpp:jingle:apps:rtp:video",b4,26,d0,7b),HX_("urn:xmpp:jingle:transports:ice-udp:1",f3,67,4f,53),
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_368_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",368,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_374_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",374,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_402_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",402,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_412_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",412,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_406_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",406,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_438_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",438,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_439_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",439,0x8e157d85)
+HX_DEFINE_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_62_new,"borogove.Client","new",0x43de690a,"borogove.Client.new","borogove/Client.hx",62,0x8e157d85)
+static const ::String _hx_array_data_c0e6dc18_32[] = {
+	HX_("http://jabber.org/protocol/disco#info",cb,2b,7f,0b),HX_("http://jabber.org/protocol/caps",95,d0,90,e2),HX_("urn:xmpp:caps",3d,5a,a1,f4),HX_("urn:xmpp:receipts",d7,40,8f,8c),HX_("urn:xmpp:avatar:metadata+notify",e0,89,c6,db),HX_("http://jabber.org/protocol/nick+notify",fd,dd,65,10),HX_("http://jabber.org/protocol/activity+notify",51,ff,f6,c6),HX_("urn:xmpp:bookmarks:1+notify",dc,4b,f7,cc),HX_("urn:xmpp:mds:displayed:0+notify",17,ae,91,a8),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07),HX_("urn:xmpp:jingle:1",44,c4,fe,f7),HX_("urn:xmpp:jingle:apps:dtls:0",a8,cb,02,66),HX_("urn:xmpp:jingle:apps:rtp:1",ea,41,fe,5c),HX_("urn:xmpp:jingle:apps:rtp:audio",0f,8b,54,6c),HX_("urn:xmpp:jingle:apps:rtp:video",b4,26,d0,7b),HX_("urn:xmpp:jingle:transports:ice-udp:1",f3,67,4f,53),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_409_set_sendAvailable__fromC,"borogove.Client","set_sendAvailable__fromC",0xf96cb54b,"borogove.Client.set_sendAvailable__fromC","HaxeCBridge.hx",409,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_455_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",455,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_446_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",446,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_496_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",496,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_469_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",469,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_480_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",480,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_489_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",489,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_487_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",487,0x8e157d85)
-static const ::String _hx_array_data_c0e6dc18_47[] = {
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_437_set_sendAvailable__fromC,"borogove.Client","set_sendAvailable__fromC",0xf96cb54b,"borogove.Client.set_sendAvailable__fromC","HaxeCBridge.hx",437,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_474_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",474,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_463_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",463,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_527_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",527,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_495_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",495,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_490_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",490,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_509_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",509,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_519_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",519,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_516_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",516,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_610_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",610,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_638_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",638,0x8e157d85)
+static const ::String _hx_array_data_c0e6dc18_49[] = {
 	HX_("image/png",b5,cc,c1,16),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_597_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",597,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_606_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",606,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_601_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",601,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_632_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",632,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_634_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",634,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_638_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",638,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_663_start,"borogove.Client","start",0xb1ed0b8c,"borogove.Client.start","borogove/Client.hx",663,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_665_start,"borogove.Client","start",0xb1ed0b8c,"borogove.Client.start","borogove/Client.hx",665,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_666_start,"borogove.Client","start",0xb1ed0b8c,"borogove.Client.start","borogove/Client.hx",666,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_673_start,"borogove.Client","start",0xb1ed0b8c,"borogove.Client.start","borogove/Client.hx",673,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_664_start,"borogove.Client","start",0xb1ed0b8c,"borogove.Client.start","borogove/Client.hx",664,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_660_start,"borogove.Client","start",0xb1ed0b8c,"borogove.Client.start","borogove/Client.hx",660,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_696_startOffline,"borogove.Client","startOffline",0x284974b7,"borogove.Client.startOffline","borogove/Client.hx",696,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_706_startOffline,"borogove.Client","startOffline",0x284974b7,"borogove.Client.startOffline","borogove/Client.hx",706,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_713_startOffline,"borogove.Client","startOffline",0x284974b7,"borogove.Client.startOffline","borogove/Client.hx",713,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_691_startOffline,"borogove.Client","startOffline",0x284974b7,"borogove.Client.startOffline","borogove/Client.hx",691,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_337_startOffline__fromC,"borogove.Client","startOffline__fromC",0x928910a2,"borogove.Client.startOffline__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_736_logout,"borogove.Client","logout",0x53f1a420,"borogove.Client.logout","borogove/Client.hx",736,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_732_logout,"borogove.Client","logout",0x53f1a420,"borogove.Client.logout","borogove/Client.hx",732,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_748_usePassword,"borogove.Client","usePassword",0xeb0d7d2c,"borogove.Client.usePassword","borogove/Client.hx",748,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_757_accountId,"borogove.Client","accountId",0x0c21f612,"borogove.Client.accountId","borogove/Client.hx",757,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_766_displayName,"borogove.Client","displayName",0x79246457,"borogove.Client.displayName","borogove/Client.hx",766,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_776_setProfile,"borogove.Client","setProfile",0xd7209e3d,"borogove.Client.setProfile","borogove/Client.hx",776,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_775_setProfile,"borogove.Client","setProfile",0xd7209e3d,"borogove.Client.setProfile","borogove/Client.hx",775,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_787_setProfile,"borogove.Client","setProfile",0xd7209e3d,"borogove.Client.setProfile","borogove/Client.hx",787,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_809_updateDisplayName,"borogove.Client","updateDisplayName",0x8c586c4e,"borogove.Client.updateDisplayName","borogove/Client.hx",809,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_840_onConnected,"borogove.Client","onConnected",0x0d6c1854,"borogove.Client.onConnected","borogove/Client.hx",840,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_857_onConnected,"borogove.Client","onConnected",0x0d6c1854,"borogove.Client.onConnected","borogove/Client.hx",857,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_846_onConnected,"borogove.Client","onConnected",0x0d6c1854,"borogove.Client.onConnected","borogove/Client.hx",846,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_844_onConnected,"borogove.Client","onConnected",0x0d6c1854,"borogove.Client.onConnected","borogove/Client.hx",844,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_817_onConnected,"borogove.Client","onConnected",0x0d6c1854,"borogove.Client.onConnected","borogove/Client.hx",817,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_901_prepareAttachment,"borogove.Client","prepareAttachment",0x49481a74,"borogove.Client.prepareAttachment","borogove/Client.hx",901,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_904_prepareAttachment,"borogove.Client","prepareAttachment",0x49481a74,"borogove.Client.prepareAttachment","borogove/Client.hx",904,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_898_prepareAttachment,"borogove.Client","prepareAttachment",0x49481a74,"borogove.Client.prepareAttachment","borogove/Client.hx",898,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_897_prepareAttachment,"borogove.Client","prepareAttachment",0x49481a74,"borogove.Client.prepareAttachment","borogove/Client.hx",897,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_337_prepareAttachment__fromC,"borogove.Client","prepareAttachment__fromC",0x6b174c85,"borogove.Client.prepareAttachment__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_922_prepareAttachmentFor,"borogove.Client","prepareAttachmentFor",0x302664f5,"borogove.Client.prepareAttachmentFor","borogove/Client.hx",922,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_927_prepareAttachmentFor,"borogove.Client","prepareAttachmentFor",0x302664f5,"borogove.Client.prepareAttachmentFor","borogove/Client.hx",927,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_928_prepareAttachmentFor,"borogove.Client","prepareAttachmentFor",0x302664f5,"borogove.Client.prepareAttachmentFor","borogove/Client.hx",928,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_915_prepareAttachmentFor,"borogove.Client","prepareAttachmentFor",0x302664f5,"borogove.Client.prepareAttachmentFor","borogove/Client.hx",915,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_943_getChats,"borogove.Client","getChats",0x85446d3b,"borogove.Client.getChats","borogove/Client.hx",943,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_335_getChats__fromC,"borogove.Client","getChats__fromC",0x855ff09e,"borogove.Client.getChats__fromC","HaxeCBridge.hx",335,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_960_findAvailableChats,"borogove.Client","findAvailableChats",0x0a9648c1,"borogove.Client.findAvailableChats","borogove/Client.hx",960,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_962_findAvailableChats,"borogove.Client","findAvailableChats",0x0a9648c1,"borogove.Client.findAvailableChats","borogove/Client.hx",962,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_956_findAvailableChats,"borogove.Client","findAvailableChats",0x0a9648c1,"borogove.Client.findAvailableChats","borogove/Client.hx",956,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_952_findAvailableChats,"borogove.Client","findAvailableChats",0x0a9648c1,"borogove.Client.findAvailableChats","borogove/Client.hx",952,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1003_findAvailableChats,"borogove.Client","findAvailableChats",0x0a9648c1,"borogove.Client.findAvailableChats","borogove/Client.hx",1003,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1023_findAvailableChats,"borogove.Client","findAvailableChats",0x0a9648c1,"borogove.Client.findAvailableChats","borogove/Client.hx",1023,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1024_findAvailableChats,"borogove.Client","findAvailableChats",0x0a9648c1,"borogove.Client.findAvailableChats","borogove/Client.hx",1024,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1041_findAvailableChats,"borogove.Client","findAvailableChats",0x0a9648c1,"borogove.Client.findAvailableChats","borogove/Client.hx",1041,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_272_findAvailableChats__fromC,"borogove.Client","findAvailableChats__fromC",0xd43731d8,"borogove.Client.findAvailableChats__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_findAvailableChats__fromC,"borogove.Client","findAvailableChats__fromC",0xd43731d8,"borogove.Client.findAvailableChats__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1070_startChat,"borogove.Client","startChat",0xdd804c84,"borogove.Client.startChat","borogove/Client.hx",1070,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1105_getChat,"borogove.Client","getChat",0xaf174438,"borogove.Client.getChat","borogove/Client.hx",1105,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1111_moderateMessage,"borogove.Client","moderateMessage",0xdbd387ee,"borogove.Client.moderateMessage","borogove/Client.hx",1111,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1109_moderateMessage,"borogove.Client","moderateMessage",0xdbd387ee,"borogove.Client.moderateMessage","borogove/Client.hx",1109,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1126_getDirectChat,"borogove.Client","getDirectChat",0xe2d04c01,"borogove.Client.getDirectChat","borogove/Client.hx",1126,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1179_enablePush,"borogove.Client","enablePush",0x34a71a93,"borogove.Client.enablePush","borogove/Client.hx",1179,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_enablePush__fromC,"borogove.Client","enablePush__fromC",0x26b41e46,"borogove.Client.enablePush__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1211_updatePushIfEnabled,"borogove.Client","updatePushIfEnabled",0x94fc7dcb,"borogove.Client.updatePushIfEnabled","borogove/Client.hx",1211,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1223_addPasswordNeededListener,"borogove.Client","addPasswordNeededListener",0xe674476f,"borogove.Client.addPasswordNeededListener","borogove/Client.hx",1223,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1222_addPasswordNeededListener,"borogove.Client","addPasswordNeededListener",0xe674476f,"borogove.Client.addPasswordNeededListener","borogove/Client.hx",1222,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_272_addPasswordNeededListener__fromC,"borogove.Client","addPasswordNeededListener__fromC",0xcb7e84ea,"borogove.Client.addPasswordNeededListener__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addPasswordNeededListener__fromC,"borogove.Client","addPasswordNeededListener__fromC",0xcb7e84ea,"borogove.Client.addPasswordNeededListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1236_addStatusOnlineListener,"borogove.Client","addStatusOnlineListener",0xbe432964,"borogove.Client.addStatusOnlineListener","borogove/Client.hx",1236,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_261_addStatusOnlineListener__fromC,"borogove.Client","addStatusOnlineListener__fromC",0xbd04fb95,"borogove.Client.addStatusOnlineListener__fromC","HaxeCBridge.hx",261,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addStatusOnlineListener__fromC,"borogove.Client","addStatusOnlineListener__fromC",0xbd04fb95,"borogove.Client.addStatusOnlineListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1249_addStatusOfflineListener,"borogove.Client","addStatusOfflineListener",0xbdd8ce9a,"borogove.Client.addStatusOfflineListener","borogove/Client.hx",1249,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_261_addStatusOfflineListener__fromC,"borogove.Client","addStatusOfflineListener__fromC",0x9e42091f,"borogove.Client.addStatusOfflineListener__fromC","HaxeCBridge.hx",261,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addStatusOfflineListener__fromC,"borogove.Client","addStatusOfflineListener__fromC",0x9e42091f,"borogove.Client.addStatusOfflineListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1262_addConnectionFailedListener,"borogove.Client","addConnectionFailedListener",0xa4e943fa,"borogove.Client.addConnectionFailedListener","borogove/Client.hx",1262,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_261_addConnectionFailedListener__fromC,"borogove.Client","addConnectionFailedListener__fromC",0x3a44ffbf,"borogove.Client.addConnectionFailedListener__fromC","HaxeCBridge.hx",261,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addConnectionFailedListener__fromC,"borogove.Client","addConnectionFailedListener__fromC",0x3a44ffbf,"borogove.Client.addConnectionFailedListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1276_addTlsCheckListener,"borogove.Client","addTlsCheckListener",0x84ae154c,"borogove.Client.addTlsCheckListener","borogove/Client.hx",1276,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1275_addTlsCheckListener,"borogove.Client","addTlsCheckListener",0x84ae154c,"borogove.Client.addTlsCheckListener","borogove/Client.hx",1275,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_272_addTlsCheckListener__fromC,"borogove.Client","addTlsCheckListener__fromC",0x1c54dcad,"borogove.Client.addTlsCheckListener__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addTlsCheckListener__fromC,"borogove.Client","addTlsCheckListener__fromC",0x1c54dcad,"borogove.Client.addTlsCheckListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1306_addChatMessageListener,"borogove.Client","addChatMessageListener",0x08596558,"borogove.Client.addChatMessageListener","borogove/Client.hx",1306,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_272_addChatMessageListener__fromC,"borogove.Client","addChatMessageListener__fromC",0xa610e621,"borogove.Client.addChatMessageListener__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addChatMessageListener__fromC,"borogove.Client","addChatMessageListener__fromC",0xa610e621,"borogove.Client.addChatMessageListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1320_addSyncMessageListener,"borogove.Client","addSyncMessageListener",0xfdfc7535,"borogove.Client.addSyncMessageListener","borogove/Client.hx",1320,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_272_addSyncMessageListener__fromC,"borogove.Client","addSyncMessageListener__fromC",0x500a3be4,"borogove.Client.addSyncMessageListener__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addSyncMessageListener__fromC,"borogove.Client","addSyncMessageListener__fromC",0x500a3be4,"borogove.Client.addSyncMessageListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1336_addChatsUpdatedListener,"borogove.Client","addChatsUpdatedListener",0x9716ffdf,"borogove.Client.addChatsUpdatedListener","borogove/Client.hx",1336,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1346_addChatsUpdatedListener,"borogove.Client","addChatsUpdatedListener",0x9716ffdf,"borogove.Client.addChatsUpdatedListener","borogove/Client.hx",1346,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1352_addChatsUpdatedListener,"borogove.Client","addChatsUpdatedListener",0x9716ffdf,"borogove.Client.addChatsUpdatedListener","borogove/Client.hx",1352,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1350_addChatsUpdatedListener,"borogove.Client","addChatsUpdatedListener",0x9716ffdf,"borogove.Client.addChatsUpdatedListener","borogove/Client.hx",1350,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1332_addChatsUpdatedListener,"borogove.Client","addChatsUpdatedListener",0x9716ffdf,"borogove.Client.addChatsUpdatedListener","borogove/Client.hx",1332,0x8e157d85)
-static const Float _hx_array_data_c0e6dc18_168[] = {
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_662_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",662,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_671_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",671,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_666_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",666,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_708_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",708,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_710_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",710,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_714_processLiveMessage,"borogove.Client","processLiveMessage",0x7e93a8a2,"borogove.Client.processLiveMessage","borogove/Client.hx",714,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_739_start,"borogove.Client","start",0xb1ed0b8c,"borogove.Client.start","borogove/Client.hx",739,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_742_start,"borogove.Client","start",0xb1ed0b8c,"borogove.Client.start","borogove/Client.hx",742,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_743_start,"borogove.Client","start",0xb1ed0b8c,"borogove.Client.start","borogove/Client.hx",743,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_750_start,"borogove.Client","start",0xb1ed0b8c,"borogove.Client.start","borogove/Client.hx",750,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_740_start,"borogove.Client","start",0xb1ed0b8c,"borogove.Client.start","borogove/Client.hx",740,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_736_start,"borogove.Client","start",0xb1ed0b8c,"borogove.Client.start","borogove/Client.hx",736,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_774_startOffline,"borogove.Client","startOffline",0x284974b7,"borogove.Client.startOffline","borogove/Client.hx",774,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_778_startOffline,"borogove.Client","startOffline",0x284974b7,"borogove.Client.startOffline","borogove/Client.hx",778,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_787_startOffline,"borogove.Client","startOffline",0x284974b7,"borogove.Client.startOffline","borogove/Client.hx",787,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_786_startOffline,"borogove.Client","startOffline",0x284974b7,"borogove.Client.startOffline","borogove/Client.hx",786,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_795_startOffline,"borogove.Client","startOffline",0x284974b7,"borogove.Client.startOffline","borogove/Client.hx",795,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_769_startOffline,"borogove.Client","startOffline",0x284974b7,"borogove.Client.startOffline","borogove/Client.hx",769,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_365_startOffline__fromC,"borogove.Client","startOffline__fromC",0x928910a2,"borogove.Client.startOffline__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_818_logout,"borogove.Client","logout",0x53f1a420,"borogove.Client.logout","borogove/Client.hx",818,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_814_logout,"borogove.Client","logout",0x53f1a420,"borogove.Client.logout","borogove/Client.hx",814,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_830_usePassword,"borogove.Client","usePassword",0xeb0d7d2c,"borogove.Client.usePassword","borogove/Client.hx",830,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_839_accountId,"borogove.Client","accountId",0x0c21f612,"borogove.Client.accountId","borogove/Client.hx",839,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_848_displayName,"borogove.Client","displayName",0x79246457,"borogove.Client.displayName","borogove/Client.hx",848,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_858_setProfile,"borogove.Client","setProfile",0xd7209e3d,"borogove.Client.setProfile","borogove/Client.hx",858,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_857_setProfile,"borogove.Client","setProfile",0xd7209e3d,"borogove.Client.setProfile","borogove/Client.hx",857,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_869_setProfile,"borogove.Client","setProfile",0xd7209e3d,"borogove.Client.setProfile","borogove/Client.hx",869,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_899_setStatus,"borogove.Client","setStatus",0x4870d09e,"borogove.Client.setStatus","borogove/Client.hx",899,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_916_updateDisplayName,"borogove.Client","updateDisplayName",0x8c586c4e,"borogove.Client.updateDisplayName","borogove/Client.hx",916,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_957_onConnected,"borogove.Client","onConnected",0x0d6c1854,"borogove.Client.onConnected","borogove/Client.hx",957,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_974_onConnected,"borogove.Client","onConnected",0x0d6c1854,"borogove.Client.onConnected","borogove/Client.hx",974,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_963_onConnected,"borogove.Client","onConnected",0x0d6c1854,"borogove.Client.onConnected","borogove/Client.hx",963,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_961_onConnected,"borogove.Client","onConnected",0x0d6c1854,"borogove.Client.onConnected","borogove/Client.hx",961,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_924_onConnected,"borogove.Client","onConnected",0x0d6c1854,"borogove.Client.onConnected","borogove/Client.hx",924,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1018_prepareAttachment,"borogove.Client","prepareAttachment",0x49481a74,"borogove.Client.prepareAttachment","borogove/Client.hx",1018,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1021_prepareAttachment,"borogove.Client","prepareAttachment",0x49481a74,"borogove.Client.prepareAttachment","borogove/Client.hx",1021,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1015_prepareAttachment,"borogove.Client","prepareAttachment",0x49481a74,"borogove.Client.prepareAttachment","borogove/Client.hx",1015,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1014_prepareAttachment,"borogove.Client","prepareAttachment",0x49481a74,"borogove.Client.prepareAttachment","borogove/Client.hx",1014,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_365_prepareAttachment__fromC,"borogove.Client","prepareAttachment__fromC",0x6b174c85,"borogove.Client.prepareAttachment__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1039_prepareAttachmentFor,"borogove.Client","prepareAttachmentFor",0x302664f5,"borogove.Client.prepareAttachmentFor","borogove/Client.hx",1039,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1044_prepareAttachmentFor,"borogove.Client","prepareAttachmentFor",0x302664f5,"borogove.Client.prepareAttachmentFor","borogove/Client.hx",1044,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1045_prepareAttachmentFor,"borogove.Client","prepareAttachmentFor",0x302664f5,"borogove.Client.prepareAttachmentFor","borogove/Client.hx",1045,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1032_prepareAttachmentFor,"borogove.Client","prepareAttachmentFor",0x302664f5,"borogove.Client.prepareAttachmentFor","borogove/Client.hx",1032,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1060_getChats,"borogove.Client","getChats",0x85446d3b,"borogove.Client.getChats","borogove/Client.hx",1060,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_363_getChats__fromC,"borogove.Client","getChats__fromC",0x855ff09e,"borogove.Client.getChats__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1070_findAvailableChats,"borogove.Client","findAvailableChats",0x0a9648c1,"borogove.Client.findAvailableChats","borogove/Client.hx",1070,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1124_availableChatSources,"borogove.Client","availableChatSources",0x1292dc0d,"borogove.Client.availableChatSources","borogove/Client.hx",1124,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1076_availableChatSources,"borogove.Client","availableChatSources",0x1292dc0d,"borogove.Client.availableChatSources","borogove/Client.hx",1076,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1086_availableChatSources,"borogove.Client","availableChatSources",0x1292dc0d,"borogove.Client.availableChatSources","borogove/Client.hx",1086,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1087_availableChatSources,"borogove.Client","availableChatSources",0x1292dc0d,"borogove.Client.availableChatSources","borogove/Client.hx",1087,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1095_availableChatSources,"borogove.Client","availableChatSources",0x1292dc0d,"borogove.Client.availableChatSources","borogove/Client.hx",1095,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1100_availableChatSources,"borogove.Client","availableChatSources",0x1292dc0d,"borogove.Client.availableChatSources","borogove/Client.hx",1100,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1099_availableChatSources,"borogove.Client","availableChatSources",0x1292dc0d,"borogove.Client.availableChatSources","borogove/Client.hx",1099,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_365_availableChatSources__fromC,"borogove.Client","availableChatSources__fromC",0xf63ce00c,"borogove.Client.availableChatSources__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1139_startChat,"borogove.Client","startChat",0xdd804c84,"borogove.Client.startChat","borogove/Client.hx",1139,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1174_getChat,"borogove.Client","getChat",0xaf174438,"borogove.Client.getChat","borogove/Client.hx",1174,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1180_moderateMessage,"borogove.Client","moderateMessage",0xdbd387ee,"borogove.Client.moderateMessage","borogove/Client.hx",1180,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1178_moderateMessage,"borogove.Client","moderateMessage",0xdbd387ee,"borogove.Client.moderateMessage","borogove/Client.hx",1178,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1195_getDirectChat,"borogove.Client","getDirectChat",0xe2d04c01,"borogove.Client.getDirectChat","borogove/Client.hx",1195,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1256_enablePush,"borogove.Client","enablePush",0x34a71a93,"borogove.Client.enablePush","borogove/Client.hx",1256,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_354_enablePush__fromC,"borogove.Client","enablePush__fromC",0x26b41e46,"borogove.Client.enablePush__fromC","HaxeCBridge.hx",354,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1289_updatePushIfEnabled,"borogove.Client","updatePushIfEnabled",0x94fc7dcb,"borogove.Client.updatePushIfEnabled","borogove/Client.hx",1289,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1302_addPasswordNeededListener,"borogove.Client","addPasswordNeededListener",0xe674476f,"borogove.Client.addPasswordNeededListener","borogove/Client.hx",1302,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1301_addPasswordNeededListener,"borogove.Client","addPasswordNeededListener",0xe674476f,"borogove.Client.addPasswordNeededListener","borogove/Client.hx",1301,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_282_addPasswordNeededListener__fromC,"borogove.Client","addPasswordNeededListener__fromC",0xcb7e84ea,"borogove.Client.addPasswordNeededListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addPasswordNeededListener__fromC,"borogove.Client","addPasswordNeededListener__fromC",0xcb7e84ea,"borogove.Client.addPasswordNeededListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1316_addStatusOnlineListener,"borogove.Client","addStatusOnlineListener",0xbe432964,"borogove.Client.addStatusOnlineListener","borogove/Client.hx",1316,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_269_addStatusOnlineListener__fromC,"borogove.Client","addStatusOnlineListener__fromC",0xbd04fb95,"borogove.Client.addStatusOnlineListener__fromC","HaxeCBridge.hx",269,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addStatusOnlineListener__fromC,"borogove.Client","addStatusOnlineListener__fromC",0xbd04fb95,"borogove.Client.addStatusOnlineListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1330_addStatusOfflineListener,"borogove.Client","addStatusOfflineListener",0xbdd8ce9a,"borogove.Client.addStatusOfflineListener","borogove/Client.hx",1330,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_269_addStatusOfflineListener__fromC,"borogove.Client","addStatusOfflineListener__fromC",0x9e42091f,"borogove.Client.addStatusOfflineListener__fromC","HaxeCBridge.hx",269,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addStatusOfflineListener__fromC,"borogove.Client","addStatusOfflineListener__fromC",0x9e42091f,"borogove.Client.addStatusOfflineListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1344_addConnectionFailedListener,"borogove.Client","addConnectionFailedListener",0xa4e943fa,"borogove.Client.addConnectionFailedListener","borogove/Client.hx",1344,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_269_addConnectionFailedListener__fromC,"borogove.Client","addConnectionFailedListener__fromC",0x3a44ffbf,"borogove.Client.addConnectionFailedListener__fromC","HaxeCBridge.hx",269,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addConnectionFailedListener__fromC,"borogove.Client","addConnectionFailedListener__fromC",0x3a44ffbf,"borogove.Client.addConnectionFailedListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1359_addTlsCheckListener,"borogove.Client","addTlsCheckListener",0x84ae154c,"borogove.Client.addTlsCheckListener","borogove/Client.hx",1359,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1358_addTlsCheckListener,"borogove.Client","addTlsCheckListener",0x84ae154c,"borogove.Client.addTlsCheckListener","borogove/Client.hx",1358,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_282_addTlsCheckListener__fromC,"borogove.Client","addTlsCheckListener__fromC",0x1c54dcad,"borogove.Client.addTlsCheckListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addTlsCheckListener__fromC,"borogove.Client","addTlsCheckListener__fromC",0x1c54dcad,"borogove.Client.addTlsCheckListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1397_addChatMessageListener,"borogove.Client","addChatMessageListener",0x08596558,"borogove.Client.addChatMessageListener","borogove/Client.hx",1397,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_282_addChatMessageListener__fromC,"borogove.Client","addChatMessageListener__fromC",0xa610e621,"borogove.Client.addChatMessageListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addChatMessageListener__fromC,"borogove.Client","addChatMessageListener__fromC",0xa610e621,"borogove.Client.addChatMessageListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1412_addSyncMessageListener,"borogove.Client","addSyncMessageListener",0xfdfc7535,"borogove.Client.addSyncMessageListener","borogove/Client.hx",1412,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_282_addSyncMessageListener__fromC,"borogove.Client","addSyncMessageListener__fromC",0x500a3be4,"borogove.Client.addSyncMessageListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addSyncMessageListener__fromC,"borogove.Client","addSyncMessageListener__fromC",0x500a3be4,"borogove.Client.addSyncMessageListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1429_addChatsUpdatedListener,"borogove.Client","addChatsUpdatedListener",0x9716ffdf,"borogove.Client.addChatsUpdatedListener","borogove/Client.hx",1429,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1439_addChatsUpdatedListener,"borogove.Client","addChatsUpdatedListener",0x9716ffdf,"borogove.Client.addChatsUpdatedListener","borogove/Client.hx",1439,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1445_addChatsUpdatedListener,"borogove.Client","addChatsUpdatedListener",0x9716ffdf,"borogove.Client.addChatsUpdatedListener","borogove/Client.hx",1445,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1443_addChatsUpdatedListener,"borogove.Client","addChatsUpdatedListener",0x9716ffdf,"borogove.Client.addChatsUpdatedListener","borogove/Client.hx",1443,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1425_addChatsUpdatedListener,"borogove.Client","addChatsUpdatedListener",0x9716ffdf,"borogove.Client.addChatsUpdatedListener","borogove/Client.hx",1425,0x8e157d85)
+static const Float _hx_array_data_c0e6dc18_174[] = {
 	-1.0,
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_272_addChatsUpdatedListener__fromC,"borogove.Client","addChatsUpdatedListener__fromC",0x9b34ba7a,"borogove.Client.addChatsUpdatedListener__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addChatsUpdatedListener__fromC,"borogove.Client","addChatsUpdatedListener__fromC",0x9b34ba7a,"borogove.Client.addChatsUpdatedListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1369_addCallRingListener,"borogove.Client","addCallRingListener",0x113612ed,"borogove.Client.addCallRingListener","borogove/Client.hx",1369,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_272_addCallRingListener__fromC,"borogove.Client","addCallRingListener__fromC",0x1230452c,"borogove.Client.addCallRingListener__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addCallRingListener__fromC,"borogove.Client","addCallRingListener__fromC",0x1230452c,"borogove.Client.addCallRingListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1382_addCallRetractListener,"borogove.Client","addCallRetractListener",0x367d108c,"borogove.Client.addCallRetractListener","borogove/Client.hx",1382,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_272_addCallRetractListener__fromC,"borogove.Client","addCallRetractListener__fromC",0x22c7c96d,"borogove.Client.addCallRetractListener__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addCallRetractListener__fromC,"borogove.Client","addCallRetractListener__fromC",0x22c7c96d,"borogove.Client.addCallRetractListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1395_addCallRingingListener,"borogove.Client","addCallRingingListener",0x5f59e2bd,"borogove.Client.addCallRingingListener","borogove/Client.hx",1395,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_272_addCallRingingListener__fromC,"borogove.Client","addCallRingingListener__fromC",0x61b10f5c,"borogove.Client.addCallRingingListener__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addCallRingingListener__fromC,"borogove.Client","addCallRingingListener__fromC",0x61b10f5c,"borogove.Client.addCallRingingListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1408_addCallUpdateStatusListener,"borogove.Client","addCallUpdateStatusListener",0x64a47558,"borogove.Client.addCallUpdateStatusListener","borogove/Client.hx",1408,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_272_addCallUpdateStatusListener__fromC,"borogove.Client","addCallUpdateStatusListener__fromC",0x6047d621,"borogove.Client.addCallUpdateStatusListener__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addCallUpdateStatusListener__fromC,"borogove.Client","addCallUpdateStatusListener__fromC",0x6047d621,"borogove.Client.addCallUpdateStatusListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1423_addCallMediaListener,"borogove.Client","addCallMediaListener",0x7c3a52af,"borogove.Client.addCallMediaListener","borogove/Client.hx",1423,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_272_addCallMediaListener__fromC,"borogove.Client","addCallMediaListener__fromC",0x91fc61aa,"borogove.Client.addCallMediaListener__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addCallMediaListener__fromC,"borogove.Client","addCallMediaListener__fromC",0x91fc61aa,"borogove.Client.addCallMediaListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1437_addCallTrackListener,"borogove.Client","addCallTrackListener",0xf44a5b56,"borogove.Client.addCallTrackListener","borogove/Client.hx",1437,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_272_addCallTrackListener__fromC,"borogove.Client","addCallTrackListener__fromC",0x1f65cbe3,"borogove.Client.addCallTrackListener__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_339_addCallTrackListener__fromC,"borogove.Client","addCallTrackListener__fromC",0x1f65cbe3,"borogove.Client.addCallTrackListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1447_setInForeground,"borogove.Client","setInForeground",0x844deb74,"borogove.Client.setInForeground","borogove/Client.hx",1447,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1455_setNotInForeground,"borogove.Client","setNotInForeground",0xe4d7a7cf,"borogove.Client.setNotInForeground","borogove/Client.hx",1455,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1465_fetchMediaByHash,"borogove.Client","fetchMediaByHash",0x85d7c445,"borogove.Client.fetchMediaByHash","borogove/Client.hx",1465,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1461_fetchMediaByHash,"borogove.Client","fetchMediaByHash",0x85d7c445,"borogove.Client.fetchMediaByHash","borogove/Client.hx",1461,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1476_fetchMediaByHashOneCounterpart,"borogove.Client","fetchMediaByHashOneCounterpart",0x7939134e,"borogove.Client.fetchMediaByHashOneCounterpart","borogove/Client.hx",1476,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1481_fetchMediaByHashOneCounterpart,"borogove.Client","fetchMediaByHashOneCounterpart",0x7939134e,"borogove.Client.fetchMediaByHashOneCounterpart","borogove/Client.hx",1481,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1474_fetchMediaByHashOneCounterpart,"borogove.Client","fetchMediaByHashOneCounterpart",0x7939134e,"borogove.Client.fetchMediaByHashOneCounterpart","borogove/Client.hx",1474,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1485_fetchMediaByHashOneCounterpart,"borogove.Client","fetchMediaByHashOneCounterpart",0x7939134e,"borogove.Client.fetchMediaByHashOneCounterpart","borogove/Client.hx",1485,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1471_fetchMediaByHashOneCounterpart,"borogove.Client","fetchMediaByHashOneCounterpart",0x7939134e,"borogove.Client.fetchMediaByHashOneCounterpart","borogove/Client.hx",1471,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1468_fetchMediaByHashOneCounterpart,"borogove.Client","fetchMediaByHashOneCounterpart",0x7939134e,"borogove.Client.fetchMediaByHashOneCounterpart","borogove/Client.hx",1468,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1497_chatActivity,"borogove.Client","chatActivity",0xdc37e2dd,"borogove.Client.chatActivity","borogove/Client.hx",1497,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1490_chatActivity,"borogove.Client","chatActivity",0xdc37e2dd,"borogove.Client.chatActivity","borogove/Client.hx",1490,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1496_chatActivity,"borogove.Client","chatActivity",0xdc37e2dd,"borogove.Client.chatActivity","borogove/Client.hx",1496,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1508_sortChats,"borogove.Client","sortChats",0x30f4e687,"borogove.Client.sortChats","borogove/Client.hx",1508,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1507_sortChats,"borogove.Client","sortChats",0x30f4e687,"borogove.Client.sortChats","borogove/Client.hx",1507,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1520_storeMessages,"borogove.Client","storeMessages",0x6129c2f7,"borogove.Client.storeMessages","borogove/Client.hx",1520,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1525_sendQuery,"borogove.Client","sendQuery",0x0127bcca,"borogove.Client.sendQuery","borogove/Client.hx",1525,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1532_sendNextLazyQuery,"borogove.Client","sendNextLazyQuery",0x9ace2e43,"borogove.Client.sendNextLazyQuery","borogove/Client.hx",1532,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1530_sendNextLazyQuery,"borogove.Client","sendNextLazyQuery",0x9ace2e43,"borogove.Client.sendNextLazyQuery","borogove/Client.hx",1530,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1542_sendQueryLazy,"borogove.Client","sendQueryLazy",0xf72d265e,"borogove.Client.sendQueryLazy","borogove/Client.hx",1542,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1554_publishWithOptions,"borogove.Client","publishWithOptions",0x33815b3f,"borogove.Client.publishWithOptions","borogove/Client.hx",1554,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1564_publishWithOptions,"borogove.Client","publishWithOptions",0x33815b3f,"borogove.Client.publishWithOptions","borogove/Client.hx",1564,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1548_publishWithOptions,"borogove.Client","publishWithOptions",0x33815b3f,"borogove.Client.publishWithOptions","borogove/Client.hx",1548,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1576_sendStanza,"borogove.Client","sendStanza",0x3845b5f3,"borogove.Client.sendStanza","borogove/Client.hx",1576,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1583_sendPresence,"borogove.Client","sendPresence",0x8b6a25b9,"borogove.Client.sendPresence","borogove/Client.hx",1583,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1584_sendPresence,"borogove.Client","sendPresence",0x8b6a25b9,"borogove.Client.sendPresence","borogove/Client.hx",1584,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1595_getIceServers,"borogove.Client","getIceServers",0xa62741a5,"borogove.Client.getIceServers","borogove/Client.hx",1595,0x8e157d85)
-static const ::String _hx_array_data_c0e6dc18_227[] = {
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_282_addChatsUpdatedListener__fromC,"borogove.Client","addChatsUpdatedListener__fromC",0x9b34ba7a,"borogove.Client.addChatsUpdatedListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addChatsUpdatedListener__fromC,"borogove.Client","addChatsUpdatedListener__fromC",0x9b34ba7a,"borogove.Client.addChatsUpdatedListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1463_addCallRingListener,"borogove.Client","addCallRingListener",0x113612ed,"borogove.Client.addCallRingListener","borogove/Client.hx",1463,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_282_addCallRingListener__fromC,"borogove.Client","addCallRingListener__fromC",0x1230452c,"borogove.Client.addCallRingListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addCallRingListener__fromC,"borogove.Client","addCallRingListener__fromC",0x1230452c,"borogove.Client.addCallRingListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1477_addCallRetractListener,"borogove.Client","addCallRetractListener",0x367d108c,"borogove.Client.addCallRetractListener","borogove/Client.hx",1477,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_282_addCallRetractListener__fromC,"borogove.Client","addCallRetractListener__fromC",0x22c7c96d,"borogove.Client.addCallRetractListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addCallRetractListener__fromC,"borogove.Client","addCallRetractListener__fromC",0x22c7c96d,"borogove.Client.addCallRetractListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1491_addCallRingingListener,"borogove.Client","addCallRingingListener",0x5f59e2bd,"borogove.Client.addCallRingingListener","borogove/Client.hx",1491,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_282_addCallRingingListener__fromC,"borogove.Client","addCallRingingListener__fromC",0x61b10f5c,"borogove.Client.addCallRingingListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addCallRingingListener__fromC,"borogove.Client","addCallRingingListener__fromC",0x61b10f5c,"borogove.Client.addCallRingingListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1505_addCallUpdateStatusListener,"borogove.Client","addCallUpdateStatusListener",0x64a47558,"borogove.Client.addCallUpdateStatusListener","borogove/Client.hx",1505,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_282_addCallUpdateStatusListener__fromC,"borogove.Client","addCallUpdateStatusListener__fromC",0x6047d621,"borogove.Client.addCallUpdateStatusListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addCallUpdateStatusListener__fromC,"borogove.Client","addCallUpdateStatusListener__fromC",0x6047d621,"borogove.Client.addCallUpdateStatusListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1521_addCallMediaListener,"borogove.Client","addCallMediaListener",0x7c3a52af,"borogove.Client.addCallMediaListener","borogove/Client.hx",1521,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_282_addCallMediaListener__fromC,"borogove.Client","addCallMediaListener__fromC",0x91fc61aa,"borogove.Client.addCallMediaListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addCallMediaListener__fromC,"borogove.Client","addCallMediaListener__fromC",0x91fc61aa,"borogove.Client.addCallMediaListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1536_addCallTrackListener,"borogove.Client","addCallTrackListener",0xf44a5b56,"borogove.Client.addCallTrackListener","borogove/Client.hx",1536,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_282_addCallTrackListener__fromC,"borogove.Client","addCallTrackListener__fromC",0x1f65cbe3,"borogove.Client.addCallTrackListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_afe14372debdebc6_367_addCallTrackListener__fromC,"borogove.Client","addCallTrackListener__fromC",0x1f65cbe3,"borogove.Client.addCallTrackListener__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1546_setInForeground,"borogove.Client","setInForeground",0x844deb74,"borogove.Client.setInForeground","borogove/Client.hx",1546,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1554_setNotInForeground,"borogove.Client","setNotInForeground",0xe4d7a7cf,"borogove.Client.setNotInForeground","borogove/Client.hx",1554,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1564_fetchMediaByHash,"borogove.Client","fetchMediaByHash",0x85d7c445,"borogove.Client.fetchMediaByHash","borogove/Client.hx",1564,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1560_fetchMediaByHash,"borogove.Client","fetchMediaByHash",0x85d7c445,"borogove.Client.fetchMediaByHash","borogove/Client.hx",1560,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1575_fetchMediaByHashOneCounterpart,"borogove.Client","fetchMediaByHashOneCounterpart",0x7939134e,"borogove.Client.fetchMediaByHashOneCounterpart","borogove/Client.hx",1575,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1580_fetchMediaByHashOneCounterpart,"borogove.Client","fetchMediaByHashOneCounterpart",0x7939134e,"borogove.Client.fetchMediaByHashOneCounterpart","borogove/Client.hx",1580,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1573_fetchMediaByHashOneCounterpart,"borogove.Client","fetchMediaByHashOneCounterpart",0x7939134e,"borogove.Client.fetchMediaByHashOneCounterpart","borogove/Client.hx",1573,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1584_fetchMediaByHashOneCounterpart,"borogove.Client","fetchMediaByHashOneCounterpart",0x7939134e,"borogove.Client.fetchMediaByHashOneCounterpart","borogove/Client.hx",1584,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1570_fetchMediaByHashOneCounterpart,"borogove.Client","fetchMediaByHashOneCounterpart",0x7939134e,"borogove.Client.fetchMediaByHashOneCounterpart","borogove/Client.hx",1570,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1567_fetchMediaByHashOneCounterpart,"borogove.Client","fetchMediaByHashOneCounterpart",0x7939134e,"borogove.Client.fetchMediaByHashOneCounterpart","borogove/Client.hx",1567,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1596_chatActivity,"borogove.Client","chatActivity",0xdc37e2dd,"borogove.Client.chatActivity","borogove/Client.hx",1596,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1589_chatActivity,"borogove.Client","chatActivity",0xdc37e2dd,"borogove.Client.chatActivity","borogove/Client.hx",1589,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1595_chatActivity,"borogove.Client","chatActivity",0xdc37e2dd,"borogove.Client.chatActivity","borogove/Client.hx",1595,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1607_sortChats,"borogove.Client","sortChats",0x30f4e687,"borogove.Client.sortChats","borogove/Client.hx",1607,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1606_sortChats,"borogove.Client","sortChats",0x30f4e687,"borogove.Client.sortChats","borogove/Client.hx",1606,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1618_nextSortId,"borogove.Client","nextSortId",0x76615cc2,"borogove.Client.nextSortId","borogove/Client.hx",1618,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1626_storeMessageBuilder,"borogove.Client","storeMessageBuilder",0x1804807f,"borogove.Client.storeMessageBuilder","borogove/Client.hx",1626,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1624_storeMessageBuilder,"borogove.Client","storeMessageBuilder",0x1804807f,"borogove.Client.storeMessageBuilder","borogove/Client.hx",1624,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1631_storeMessages,"borogove.Client","storeMessages",0x6129c2f7,"borogove.Client.storeMessages","borogove/Client.hx",1631,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1636_sendQuery,"borogove.Client","sendQuery",0x0127bcca,"borogove.Client.sendQuery","borogove/Client.hx",1636,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1643_sendNextLazyQuery,"borogove.Client","sendNextLazyQuery",0x9ace2e43,"borogove.Client.sendNextLazyQuery","borogove/Client.hx",1643,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1641_sendNextLazyQuery,"borogove.Client","sendNextLazyQuery",0x9ace2e43,"borogove.Client.sendNextLazyQuery","borogove/Client.hx",1641,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1655_sendQueryLazy,"borogove.Client","sendQueryLazy",0xf72d265e,"borogove.Client.sendQueryLazy","borogove/Client.hx",1655,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1667_publishWithOptions,"borogove.Client","publishWithOptions",0x33815b3f,"borogove.Client.publishWithOptions","borogove/Client.hx",1667,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1677_publishWithOptions,"borogove.Client","publishWithOptions",0x33815b3f,"borogove.Client.publishWithOptions","borogove/Client.hx",1677,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1661_publishWithOptions,"borogove.Client","publishWithOptions",0x33815b3f,"borogove.Client.publishWithOptions","borogove/Client.hx",1661,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1689_sendStanza,"borogove.Client","sendStanza",0x3845b5f3,"borogove.Client.sendStanza","borogove/Client.hx",1689,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1695_sendPresence,"borogove.Client","sendPresence",0x8b6a25b9,"borogove.Client.sendPresence","borogove/Client.hx",1695,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1703_sendPresence,"borogove.Client","sendPresence",0x8b6a25b9,"borogove.Client.sendPresence","borogove/Client.hx",1703,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1710_getIceServers,"borogove.Client","getIceServers",0xa62741a5,"borogove.Client.getIceServers","borogove/Client.hx",1710,0x8e157d85)
+static const ::String _hx_array_data_c0e6dc18_234[] = {
 	HX_("stun",3a,f5,5b,4c),HX_("stuns",f9,9d,1a,84),HX_("turn",7d,eb,05,4d),HX_("turns",56,22,28,18),
 };
-static const ::String _hx_array_data_c0e6dc18_228[] = {
+static const ::String _hx_array_data_c0e6dc18_235[] = {
 	HX_("turn",7d,eb,05,4d),HX_("turns",56,22,28,18),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1593_getIceServers,"borogove.Client","getIceServers",0xa62741a5,"borogove.Client.getIceServers","borogove/Client.hx",1593,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1625_discoverServices,"borogove.Client","discoverServices",0xca86abfd,"borogove.Client.discoverServices","borogove/Client.hx",1625,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1628_discoverServices,"borogove.Client","discoverServices",0xca86abfd,"borogove.Client.discoverServices","borogove/Client.hx",1628,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1622_discoverServices,"borogove.Client","discoverServices",0xca86abfd,"borogove.Client.discoverServices","borogove/Client.hx",1622,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1637_notifyMessageHandlers,"borogove.Client","notifyMessageHandlers",0x88b574b1,"borogove.Client.notifyMessageHandlers","borogove/Client.hx",1637,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1644_notifySyncMessageHandlers,"borogove.Client","notifySyncMessageHandlers",0x1628e516,"borogove.Client.notifySyncMessageHandlers","borogove/Client.hx",1644,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1653_rosterGet,"borogove.Client","rosterGet",0x21c107f5,"borogove.Client.rosterGet","borogove/Client.hx",1653,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1651_rosterGet,"borogove.Client","rosterGet",0x21c107f5,"borogove.Client.rosterGet","borogove/Client.hx",1651,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1668_startChatWith,"borogove.Client","startChatWith",0x4c4c80aa,"borogove.Client.startChatWith","borogove/Client.hx",1668,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1666_startChatWith,"borogove.Client","startChatWith",0x4c4c80aa,"borogove.Client.startChatWith","borogove/Client.hx",1666,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1702_mucInvite,"borogove.Client","mucInvite",0xc0e2a44e,"borogove.Client.mucInvite","borogove/Client.hx",1702,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1704_mucInvite,"borogove.Client","mucInvite",0xc0e2a44e,"borogove.Client.mucInvite","borogove/Client.hx",1704,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1705_mucInvite,"borogove.Client","mucInvite",0xc0e2a44e,"borogove.Client.mucInvite","borogove/Client.hx",1705,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1727_serverBlocked,"borogove.Client","serverBlocked",0x86ce5793,"borogove.Client.serverBlocked","borogove/Client.hx",1727,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1736_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1736,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1743_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1743,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1750_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1750,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1752_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1752,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1762_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1762,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1770_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1770,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1781_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1781,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1733_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1733,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1796_sync,"borogove.Client","sync",0x221ab671,"borogove.Client.sync","borogove/Client.hx",1796,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1800_sync,"borogove.Client","sync",0x221ab671,"borogove.Client.sync","borogove/Client.hx",1800,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1805_onMAMJMI,"borogove.Client","onMAMJMI",0xf47696c2,"borogove.Client.onMAMJMI","borogove/Client.hx",1805,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1829_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1829,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1865_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1865,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1890_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1890,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1834_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1834,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1856_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1856,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1848_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1848,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1844_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1844,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1896_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1896,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1819_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1819,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1908_pingAllChannels,"borogove.Client","pingAllChannels",0x95268ee9,"borogove.Client.pingAllChannels","borogove/Client.hx",1908,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1915_joinAllChannels,"borogove.Client","joinAllChannels",0x16ca5071,"borogove.Client.joinAllChannels","borogove/Client.hx",1915,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1920_joinAllChannels,"borogove.Client","joinAllChannels",0x16ca5071,"borogove.Client.joinAllChannels","borogove/Client.hx",1920,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1924_joinAllChannels,"borogove.Client","joinAllChannels",0x16ca5071,"borogove.Client.joinAllChannels","borogove/Client.hx",1924,0x8e157d85)
-HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_59_boot,"borogove.Client","boot",0x16d68048,"borogove.Client.boot","borogove/Client.hx",59,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1708_getIceServers,"borogove.Client","getIceServers",0xa62741a5,"borogove.Client.getIceServers","borogove/Client.hx",1708,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1740_discoverServices,"borogove.Client","discoverServices",0xca86abfd,"borogove.Client.discoverServices","borogove/Client.hx",1740,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1743_discoverServices,"borogove.Client","discoverServices",0xca86abfd,"borogove.Client.discoverServices","borogove/Client.hx",1743,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1737_discoverServices,"borogove.Client","discoverServices",0xca86abfd,"borogove.Client.discoverServices","borogove/Client.hx",1737,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1752_notifyMessageHandlers,"borogove.Client","notifyMessageHandlers",0x88b574b1,"borogove.Client.notifyMessageHandlers","borogove/Client.hx",1752,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1767_notifySyncMessageHandlers,"borogove.Client","notifySyncMessageHandlers",0x1628e516,"borogove.Client.notifySyncMessageHandlers","borogove/Client.hx",1767,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1784_rosterGet,"borogove.Client","rosterGet",0x21c107f5,"borogove.Client.rosterGet","borogove/Client.hx",1784,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1782_rosterGet,"borogove.Client","rosterGet",0x21c107f5,"borogove.Client.rosterGet","borogove/Client.hx",1782,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1799_startChatWith,"borogove.Client","startChatWith",0x4c4c80aa,"borogove.Client.startChatWith","borogove/Client.hx",1799,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1797_startChatWith,"borogove.Client","startChatWith",0x4c4c80aa,"borogove.Client.startChatWith","borogove/Client.hx",1797,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1833_mucInvite,"borogove.Client","mucInvite",0xc0e2a44e,"borogove.Client.mucInvite","borogove/Client.hx",1833,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1835_mucInvite,"borogove.Client","mucInvite",0xc0e2a44e,"borogove.Client.mucInvite","borogove/Client.hx",1835,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1836_mucInvite,"borogove.Client","mucInvite",0xc0e2a44e,"borogove.Client.mucInvite","borogove/Client.hx",1836,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1858_serverBlocked,"borogove.Client","serverBlocked",0x86ce5793,"borogove.Client.serverBlocked","borogove/Client.hx",1858,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1867_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1867,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1874_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1874,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1881_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1881,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1883_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1883,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1893_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1893,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1901_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1901,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1912_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1912,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1864_bookmarksGet,"borogove.Client","bookmarksGet",0x13a4e3af,"borogove.Client.bookmarksGet","borogove/Client.hx",1864,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1927_checkForReceipts,"borogove.Client","checkForReceipts",0x18c46212,"borogove.Client.checkForReceipts","borogove/Client.hx",1927,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1936_checkForReceipts,"borogove.Client","checkForReceipts",0x18c46212,"borogove.Client.checkForReceipts","borogove/Client.hx",1936,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1941_sync,"borogove.Client","sync",0x221ab671,"borogove.Client.sync","borogove/Client.hx",1941,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1945_sync,"borogove.Client","sync",0x221ab671,"borogove.Client.sync","borogove/Client.hx",1945,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1950_onMAMJMI,"borogove.Client","onMAMJMI",0xf47696c2,"borogove.Client.onMAMJMI","borogove/Client.hx",1950,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1975_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1975,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_2013_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",2013,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_2039_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",2039,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1980_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1980,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_2002_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",2002,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1994_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1994,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1990_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1990,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_2045_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",2045,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_1964_doSync,"borogove.Client","doSync",0x13e60d1c,"borogove.Client.doSync","borogove/Client.hx",1964,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_2057_pingAllChannels,"borogove.Client","pingAllChannels",0x95268ee9,"borogove.Client.pingAllChannels","borogove/Client.hx",2057,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_2064_joinAllChannels,"borogove.Client","joinAllChannels",0x16ca5071,"borogove.Client.joinAllChannels","borogove/Client.hx",2064,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_2069_joinAllChannels,"borogove.Client","joinAllChannels",0x16ca5071,"borogove.Client.joinAllChannels","borogove/Client.hx",2069,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_2073_joinAllChannels,"borogove.Client","joinAllChannels",0x16ca5071,"borogove.Client.joinAllChannels","borogove/Client.hx",2073,0x8e157d85)
+HX_LOCAL_STACK_FRAME(_hx_pos_a492fd7f83fa2dd6_62_boot,"borogove.Client","boot",0x16d68048,"borogove.Client.boot","borogove/Client.hx",62,0x8e157d85)
 namespace borogove{
 
 void Client_obj::__construct(::String accountId,::Dynamic persistence){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_141_new)
-HXLINE( 141)			return _gthis->trigger(HX_("status/offline",c6,eb,eb,54), ::Dynamic(::hx::Anon_obj::Create(0)));
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_153_new)
+HXLINE( 153)			return _gthis->trigger(HX_("status/offline",c6,eb,eb,54), ::Dynamic(::hx::Anon_obj::Create(0)));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Client,_gthis,::Dynamic,persistence) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_145_new)
-HXLINE( 146)			_gthis->token = ( (::String)(data->__Field(HX_("token",f9,82,2b,14),::hx::paccDynamic)) );
-HXLINE( 147)			::Dynamic persistence1 = persistence;
-HXDLIN( 147)			::String _hx_tmp = _gthis->jid->asBare()->asString();
-HXDLIN( 147)			::String _hx_tmp1;
-HXDLIN( 147)			::String tmp = _gthis->stream->clientId;
-HXDLIN( 147)			if (::hx::IsNotNull( tmp )) {
-HXLINE( 147)				_hx_tmp1 = tmp;
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_157_new)
+HXLINE( 158)			_gthis->token = ( (::String)(data->__Field(HX_("token",f9,82,2b,14),::hx::paccDynamic)) );
+HXLINE( 159)			::Dynamic persistence1 = persistence;
+HXDLIN( 159)			::String _hx_tmp = _gthis->jid->asBare()->asString();
+HXDLIN( 159)			::String _hx_tmp1;
+HXDLIN( 159)			::String tmp = _gthis->stream->clientId;
+HXDLIN( 159)			if (::hx::IsNotNull( tmp )) {
+HXLINE( 159)				_hx_tmp1 = tmp;
             			}
             			else {
-HXLINE( 147)				_hx_tmp1 = _gthis->jid->resource;
+HXLINE( 159)				_hx_tmp1 = _gthis->jid->resource;
             			}
-HXDLIN( 147)			::String _hx_tmp2 = _gthis->displayName();
-HXDLIN( 147)			::borogove::Persistence_obj::storeLogin(persistence1,_hx_tmp,_hx_tmp1,_hx_tmp2,_gthis->token);
-HXLINE( 148)			return ::borogove::EventResult_obj::EventHandled_dyn();
+HXDLIN( 159)			::String _hx_tmp2 = _gthis->displayName();
+HXDLIN( 159)			::borogove::Persistence_obj::storeLogin(persistence1,_hx_tmp,_hx_tmp1,_hx_tmp2,_gthis->token);
+HXLINE( 160)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::borogove::Client,_gthis) HXARGC(1)
             		 ::borogove::EventResult _hx_run(::Array< ::Dynamic> data){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_151_new)
-HXLINE( 152)			::Array< ::Dynamic> it = _gthis->chats;
-HXDLIN( 152)			bool result = false;
-HXDLIN( 152)			{
-HXLINE( 152)				int _g = 0;
-HXDLIN( 152)				while((_g < it->length)){
-HXLINE( 152)					 ::borogove::Chat x = it->__get(_g).StaticCast<  ::borogove::Chat >();
-HXDLIN( 152)					_g = (_g + 1);
-HXDLIN( 152)					bool _hx_tmp;
-HXDLIN( 152)					if ((x->uiState != 2)) {
-HXLINE( 152)						_hx_tmp = x->syncing();
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_163_new)
+HXLINE( 164)			::Array< ::Dynamic> it = _gthis->chats;
+HXDLIN( 164)			bool result = false;
+HXDLIN( 164)			{
+HXLINE( 164)				int _g = 0;
+HXDLIN( 164)				while((_g < it->length)){
+HXLINE( 164)					 ::borogove::Chat x = it->__get(_g).StaticCast<  ::borogove::Chat >();
+HXDLIN( 164)					_g = (_g + 1);
+HXDLIN( 164)					bool _hx_tmp;
+HXDLIN( 164)					if ((x->uiState != 2)) {
+HXLINE( 164)						_hx_tmp = x->syncing();
             					}
             					else {
-HXLINE( 152)						_hx_tmp = false;
+HXLINE( 164)						_hx_tmp = false;
             					}
-HXDLIN( 152)					if (_hx_tmp) {
-HXLINE( 152)						result = true;
-HXDLIN( 152)						goto _hx_goto_0;
+HXDLIN( 164)					if (_hx_tmp) {
+HXLINE( 164)						result = true;
+HXDLIN( 164)						goto _hx_goto_0;
             					}
             				}
             				_hx_goto_0:;
             			}
-HXDLIN( 152)			_gthis->stream->emitSMupdates = !(result);
-HXLINE( 153)			return ::borogove::EventResult_obj::EventHandled_dyn();
+HXDLIN( 164)			_gthis->stream->emitSMupdates = !(result);
+HXLINE( 165)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_3, ::borogove::Client,_gthis,::Dynamic,persistence) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_156_new)
-HXLINE( 157)			::Dynamic persistence1 = persistence;
-HXDLIN( 157)			::String _hx_tmp = _gthis->accountId();
-HXDLIN( 157)			::Array< unsigned char > _hx_tmp1;
-HXDLIN( 157)			if (_gthis->stream->emitSMupdates) {
-HXLINE( 157)				_hx_tmp1 = ( (::Array< unsigned char >)(data->__Field(HX_("sm",9a,64,00,00),::hx::paccDynamic)) );
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_168_new)
+HXLINE( 169)			::Dynamic persistence1 = persistence;
+HXDLIN( 169)			::String _hx_tmp = _gthis->accountId();
+HXDLIN( 169)			::Array< unsigned char > _hx_tmp1;
+HXDLIN( 169)			if (_gthis->stream->emitSMupdates) {
+HXLINE( 169)				_hx_tmp1 = ( (::Array< unsigned char >)(data->__Field(HX_("sm",9a,64,00,00),::hx::paccDynamic)) );
             			}
             			else {
-HXLINE( 157)				_hx_tmp1 = null();
+HXLINE( 169)				_hx_tmp1 = null();
             			}
-HXDLIN( 157)			::borogove::Persistence_obj::storeStreamManagement(persistence1,_hx_tmp,_hx_tmp1);
-HXLINE( 158)			return ::borogove::EventResult_obj::EventHandled_dyn();
+HXDLIN( 169)			::borogove::Persistence_obj::storeStreamManagement(persistence1,_hx_tmp,_hx_tmp1,_gthis->sortId);
+HXLINE( 170)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
@@ -643,23 +667,23 @@ HXLINE( 158)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_4, ::borogove::Client,_gthis) HXARGC(1)
             			void _hx_run( ::borogove::ChatMessage m){
-            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_167_new)
-HXLINE( 167)				_gthis->notifyMessageHandlers(m,3);
+            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_179_new)
+HXLINE( 179)				_gthis->notifyMessageHandlers(m,3);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_5) HXARGC(1)
             			::Dynamic _hx_run( ::Dynamic _){
-            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_167_new)
-HXLINE( 167)				return null();
+            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_179_new)
+HXLINE( 179)				return null();
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_161_new)
-HXLINE( 162)			::Dynamic persistence1 = persistence;
-HXLINE( 163)			::String _hx_tmp = _gthis->accountId();
-HXLINE( 162)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::updateMessageStatus(persistence1,_hx_tmp, ::Dynamic(data->__Field(HX_("id",db,5b,00,00),::hx::paccDynamic)),1,null()), ::Dynamic(new _hx_Closure_4(_gthis)), ::Dynamic(new _hx_Closure_5()));
-HXLINE( 168)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_173_new)
+HXLINE( 174)			::Dynamic persistence1 = persistence;
+HXLINE( 175)			::String _hx_tmp = _gthis->accountId();
+HXLINE( 174)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::updateMessageStatus(persistence1,_hx_tmp, ::Dynamic(data->__Field(HX_("id",db,5b,00,00),::hx::paccDynamic)),1,null()), ::Dynamic(new _hx_Closure_4(_gthis)), ::Dynamic(new _hx_Closure_5()));
+HXLINE( 180)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
@@ -667,106 +691,106 @@ HXLINE( 168)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_7, ::borogove::Client,_gthis) HXARGC(1)
             			void _hx_run( ::borogove::ChatMessage m){
-            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_177_new)
-HXLINE( 177)				_gthis->notifyMessageHandlers(m,3);
+            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_189_new)
+HXLINE( 189)				_gthis->notifyMessageHandlers(m,3);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_8) HXARGC(1)
             			::Dynamic _hx_run( ::Dynamic _){
-            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_177_new)
-HXLINE( 177)				return null();
+            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_189_new)
+HXLINE( 189)				return null();
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_171_new)
-HXLINE( 172)			::Dynamic persistence1 = persistence;
-HXLINE( 173)			::String _hx_tmp = _gthis->accountId();
-HXLINE( 172)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::updateMessageStatus(persistence1,_hx_tmp, ::Dynamic(data->__Field(HX_("id",db,5b,00,00),::hx::paccDynamic)),3,null()), ::Dynamic(new _hx_Closure_7(_gthis)), ::Dynamic(new _hx_Closure_8()));
-HXLINE( 178)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_183_new)
+HXLINE( 184)			::Dynamic persistence1 = persistence;
+HXLINE( 185)			::String _hx_tmp = _gthis->accountId();
+HXLINE( 184)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::updateMessageStatus(persistence1,_hx_tmp, ::Dynamic(data->__Field(HX_("id",db,5b,00,00),::hx::paccDynamic)),3,null()), ::Dynamic(new _hx_Closure_7(_gthis)), ::Dynamic(new _hx_Closure_8()));
+HXLINE( 190)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_10, ::borogove::Client,_gthis) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic event){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_181_new)
-HXLINE( 182)			 ::borogove::Stanza stanza = ( ( ::borogove::Stanza)(event->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic)) );
-HXLINE( 184)			if (::hx::IsNotNull( stanza->getChild(HX_("result",dd,68,84,08),HX_("urn:xmpp:mam:2",f5,ef,8c,da)) )) {
-HXLINE( 186)				return ::borogove::EventResult_obj::EventUnhandled_dyn();
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_193_new)
+HXLINE( 194)			 ::borogove::Stanza stanza = ( ( ::borogove::Stanza)(event->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic)) );
+HXLINE( 196)			if (::hx::IsNotNull( stanza->getChild(HX_("result",dd,68,84,08),HX_("urn:xmpp:mam:2",f5,ef,8c,da)) )) {
+HXLINE( 198)				return ::borogove::EventResult_obj::EventUnhandled_dyn();
             			}
-HXLINE( 189)			 ::borogove::JID from;
-HXDLIN( 189)			if (::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
-HXLINE( 189)				from = null();
+HXLINE( 201)			 ::borogove::JID from;
+HXDLIN( 201)			if (::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
+HXLINE( 201)				from = null();
             			}
             			else {
-HXLINE( 189)				from = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
+HXLINE( 201)				from = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
             			}
-HXLINE( 190)			 ::borogove::Stanza fwd = null();
-HXLINE( 191)			bool _hx_tmp;
-HXDLIN( 191)			if (::hx::IsNotNull( from )) {
-HXLINE( 191)				::String _hx_tmp1 = from->asBare()->asString();
-HXDLIN( 191)				_hx_tmp = (_hx_tmp1 == _gthis->accountId());
+HXLINE( 202)			 ::borogove::Stanza fwd = null();
+HXLINE( 203)			bool _hx_tmp;
+HXDLIN( 203)			if (::hx::IsNotNull( from )) {
+HXLINE( 203)				::String _hx_tmp1 = from->asBare()->asString();
+HXDLIN( 203)				_hx_tmp = (_hx_tmp1 == _gthis->accountId());
             			}
             			else {
-HXLINE( 191)				_hx_tmp = false;
+HXLINE( 203)				_hx_tmp = false;
             			}
-HXDLIN( 191)			if (_hx_tmp) {
-HXLINE( 192)				 ::borogove::Stanza carbon = stanza->getChild(HX_("received",21,45,fd,e2),HX_("urn:xmpp:carbons:2",02,86,9e,df));
-HXLINE( 193)				if (::hx::IsNull( carbon )) {
-HXLINE( 193)					carbon = stanza->getChild(HX_("sent",58,8d,50,4c),HX_("urn:xmpp:carbons:2",02,86,9e,df));
+HXDLIN( 203)			if (_hx_tmp) {
+HXLINE( 204)				 ::borogove::Stanza carbon = stanza->getChild(HX_("received",21,45,fd,e2),HX_("urn:xmpp:carbons:2",02,86,9e,df));
+HXLINE( 205)				if (::hx::IsNull( carbon )) {
+HXLINE( 205)					carbon = stanza->getChild(HX_("sent",58,8d,50,4c),HX_("urn:xmpp:carbons:2",02,86,9e,df));
             				}
-HXLINE( 194)				if (::hx::IsNotNull( carbon )) {
-HXLINE( 195)					 ::borogove::Stanza tmp = carbon->getChild(HX_("forwarded",64,f5,9a,17),HX_("urn:xmpp:forward:0",1f,ec,b0,d1));
-HXDLIN( 195)					if (::hx::IsNotNull( tmp )) {
-HXLINE( 195)						fwd = tmp->getFirstChild();
+HXLINE( 206)				if (::hx::IsNotNull( carbon )) {
+HXLINE( 207)					 ::borogove::Stanza tmp = carbon->getChild(HX_("forwarded",64,f5,9a,17),HX_("urn:xmpp:forward:0",1f,ec,b0,d1));
+HXDLIN( 207)					if (::hx::IsNotNull( tmp )) {
+HXLINE( 207)						fwd = tmp->getFirstChild();
             					}
             					else {
-HXLINE( 195)						fwd = null();
+HXLINE( 207)						fwd = null();
             					}
             				}
             			}
-HXLINE( 209)			_gthis->processLiveMessage(stanza,fwd,null());
-HXLINE( 210)			return ::borogove::EventResult_obj::EventHandled_dyn();
+HXLINE( 221)			_gthis->processLiveMessage(stanza,fwd,null());
+HXLINE( 222)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_11, ::borogove::Client,_gthis) HXARGC(1)
             		 ::borogove::IqResult _hx_run( ::borogove::Stanza stanza){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_214_new)
-HXLINE( 215)			 ::borogove::JID from;
-HXDLIN( 215)			if (::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
-HXLINE( 215)				from = null();
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_226_new)
+HXLINE( 227)			 ::borogove::JID from;
+HXDLIN( 227)			if (::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
+HXLINE( 227)				from = null();
             			}
             			else {
-HXLINE( 215)				from = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
-            			}
-HXLINE( 216)			 ::borogove::Stanza jingle = stanza->getChild(HX_("jingle",31,27,eb,1f),HX_("urn:xmpp:jingle:1",44,c4,fe,f7));
-HXLINE( 217)			 ::borogove::Client _gthis1 = _gthis;
-HXDLIN( 217)			 ::borogove::DirectChat chat = _gthis1->getDirectChat(from->asBare()->asString(),null());
-HXLINE( 218)			::Dynamic this1 = chat->jingleSessions;
-HXDLIN( 218)			::Dynamic session = ( ( ::haxe::ds::StringMap)(this1) )->get(( (::String)(::Reflect_obj::field(jingle->attr,HX_("sid",0e,9f,57,00))) ));
-HXLINE( 220)			if ((( (::String)(::Reflect_obj::field(jingle->attr,HX_("action",b6,3b,46,16))) ) == HX_("session-initiate",70,2d,30,f7))) {
-HXLINE( 221)				if (::hx::IsNotNull( session )) {
-HXLINE( 222)					try {
+HXLINE( 227)				from = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
+            			}
+HXLINE( 228)			 ::borogove::Stanza jingle = stanza->getChild(HX_("jingle",31,27,eb,1f),HX_("urn:xmpp:jingle:1",44,c4,fe,f7));
+HXLINE( 229)			 ::borogove::Client _gthis1 = _gthis;
+HXDLIN( 229)			 ::borogove::DirectChat chat = _gthis1->getDirectChat(from->asBare()->asString(),null());
+HXLINE( 230)			::Dynamic this1 = chat->jingleSessions;
+HXDLIN( 230)			::Dynamic session = ( ( ::haxe::ds::StringMap)(this1) )->get(( (::String)(::Reflect_obj::field(jingle->attr,HX_("sid",0e,9f,57,00))) ));
+HXLINE( 232)			if ((( (::String)(::Reflect_obj::field(jingle->attr,HX_("action",b6,3b,46,16))) ) == HX_("session-initiate",70,2d,30,f7))) {
+HXLINE( 233)				if (::hx::IsNotNull( session )) {
+HXLINE( 234)					try {
             						HX_STACK_CATCHABLE( ::Dynamic, 0);
-HXLINE( 223)						::Dynamic this2 = chat->jingleSessions;
-HXDLIN( 223)						::String key = ::borogove::calls::Session_obj::get_sid(session);
-HXDLIN( 223)						( ( ::haxe::ds::StringMap)(this2) )->set(key,::borogove::calls::Session_obj::initiate(session,stanza));
+HXLINE( 235)						::Dynamic this2 = chat->jingleSessions;
+HXDLIN( 235)						::String key = ::borogove::calls::Session_obj::get_sid(session);
+HXDLIN( 235)						( ( ::haxe::ds::StringMap)(this2) )->set(key,::borogove::calls::Session_obj::initiate(session,stanza));
             					} catch( ::Dynamic _hx_e) {
             						if (_hx_e.IsClass<  ::Dynamic >() ){
             							HX_STACK_BEGIN_CATCH
             							 ::Dynamic _g = _hx_e;
-HXLINE( 224)							 ::haxe::Exception _g1 = ::haxe::Exception_obj::caught(_g);
-HXDLIN( 224)							{
-HXLINE( 225)								::haxe::Log_obj::trace(HX_("Bad session-inititate",c5,d7,64,3f), ::Dynamic(::hx::Anon_obj::Create(5)
+HXLINE( 236)							 ::haxe::Exception _g1 = ::haxe::Exception_obj::caught(_g);
+HXDLIN( 236)							{
+HXLINE( 237)								::haxe::Log_obj::trace(HX_("Bad session-inititate",c5,d7,64,3f), ::Dynamic(::hx::Anon_obj::Create(5)
             									->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Client",18,dc,e6,c0))
             									->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,_g1))
             									->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("new",60,d0,53,00))
             									->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Client.hx",85,7d,15,8e))
-            									->setFixed(4,HX_("lineNumber",dd,81,22,76),225)));
-HXLINE( 226)								{
-HXLINE( 226)									::Dynamic this3 = chat->jingleSessions;
-HXDLIN( 226)									( ( ::haxe::ds::StringMap)(this3) )->remove(::borogove::calls::Session_obj::get_sid(session));
+            									->setFixed(4,HX_("lineNumber",dd,81,22,76),237)));
+HXLINE( 238)								{
+HXLINE( 238)									::Dynamic this3 = chat->jingleSessions;
+HXDLIN( 238)									( ( ::haxe::ds::StringMap)(this3) )->remove(::borogove::calls::Session_obj::get_sid(session));
             								}
             							}
             						}
@@ -776,578 +800,625 @@ HXDLIN( 226)									( ( ::haxe::ds::StringMap)(this3) )->remove(::borogove::cal
             					}
             				}
             				else {
-HXLINE( 229)					 ::borogove::calls::InitiatedSession newSession = ::borogove::calls::InitiatedSession_obj::fromSessionInitiate(_gthis,stanza);
-HXLINE( 230)					{
-HXLINE( 230)						::Dynamic this4 = chat->jingleSessions;
-HXDLIN( 230)						( ( ::haxe::ds::StringMap)(this4) )->set(newSession->get_sid(),newSession);
+HXLINE( 241)					 ::borogove::calls::InitiatedSession newSession = ::borogove::calls::InitiatedSession_obj::fromSessionInitiate(_gthis,stanza);
+HXLINE( 242)					{
+HXLINE( 242)						::Dynamic this4 = chat->jingleSessions;
+HXDLIN( 242)						( ( ::haxe::ds::StringMap)(this4) )->set(newSession->get_sid(),newSession);
             					}
-HXLINE( 231)					_gthis->chatActivity(chat,null());
-HXLINE( 232)					newSession->ring();
+HXLINE( 243)					_gthis->chatActivity(chat,null());
+HXLINE( 244)					newSession->ring();
             				}
             			}
-HXLINE( 236)			bool _hx_tmp;
-HXDLIN( 236)			if (::hx::IsNotNull( session )) {
-HXLINE( 236)				_hx_tmp = (( (::String)(::Reflect_obj::field(jingle->attr,HX_("action",b6,3b,46,16))) ) == HX_("session-accept",5f,92,e7,a8));
+HXLINE( 248)			bool _hx_tmp;
+HXDLIN( 248)			if (::hx::IsNotNull( session )) {
+HXLINE( 248)				_hx_tmp = (( (::String)(::Reflect_obj::field(jingle->attr,HX_("action",b6,3b,46,16))) ) == HX_("session-accept",5f,92,e7,a8));
             			}
             			else {
-HXLINE( 236)				_hx_tmp = false;
+HXLINE( 248)				_hx_tmp = false;
             			}
-HXDLIN( 236)			if (_hx_tmp) {
-HXLINE( 237)				try {
+HXDLIN( 248)			if (_hx_tmp) {
+HXLINE( 249)				try {
             					HX_STACK_CATCHABLE( ::Dynamic, 0);
-HXLINE( 238)					::Dynamic this5 = chat->jingleSessions;
-HXDLIN( 238)					::String key1 = ::borogove::calls::Session_obj::get_sid(session);
-HXDLIN( 238)					( ( ::haxe::ds::StringMap)(this5) )->set(key1,::borogove::calls::Session_obj::initiate(session,stanza));
+HXLINE( 250)					::Dynamic this5 = chat->jingleSessions;
+HXDLIN( 250)					::String key1 = ::borogove::calls::Session_obj::get_sid(session);
+HXDLIN( 250)					( ( ::haxe::ds::StringMap)(this5) )->set(key1,::borogove::calls::Session_obj::initiate(session,stanza));
             				} catch( ::Dynamic _hx_e) {
             					if (_hx_e.IsClass<  ::Dynamic >() ){
             						HX_STACK_BEGIN_CATCH
             						 ::Dynamic _g2 = _hx_e;
-HXLINE( 239)						 ::haxe::Exception _g3 = ::haxe::Exception_obj::caught(_g2);
-HXLINE( 240)						::haxe::Log_obj::trace(HX_("session-accept failed",5e,a5,74,6b), ::Dynamic(::hx::Anon_obj::Create(5)
+HXLINE( 251)						 ::haxe::Exception _g3 = ::haxe::Exception_obj::caught(_g2);
+HXLINE( 252)						::haxe::Log_obj::trace(HX_("session-accept failed",5e,a5,74,6b), ::Dynamic(::hx::Anon_obj::Create(5)
             							->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Client",18,dc,e6,c0))
             							->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,_g3))
             							->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("new",60,d0,53,00))
             							->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Client.hx",85,7d,15,8e))
-            							->setFixed(4,HX_("lineNumber",dd,81,22,76),240)));
+            							->setFixed(4,HX_("lineNumber",dd,81,22,76),252)));
             					}
             					else {
             						HX_STACK_DO_THROW(_hx_e);
             					}
             				}
             			}
-HXLINE( 244)			bool _hx_tmp1;
-HXDLIN( 244)			if (::hx::IsNotNull( session )) {
-HXLINE( 244)				_hx_tmp1 = (( (::String)(::Reflect_obj::field(jingle->attr,HX_("action",b6,3b,46,16))) ) == HX_("session-terminate",6a,23,dc,12));
+HXLINE( 256)			bool _hx_tmp1;
+HXDLIN( 256)			if (::hx::IsNotNull( session )) {
+HXLINE( 256)				_hx_tmp1 = (( (::String)(::Reflect_obj::field(jingle->attr,HX_("action",b6,3b,46,16))) ) == HX_("session-terminate",6a,23,dc,12));
             			}
             			else {
-HXLINE( 244)				_hx_tmp1 = false;
+HXLINE( 256)				_hx_tmp1 = false;
             			}
-HXDLIN( 244)			if (_hx_tmp1) {
-HXLINE( 245)				::borogove::calls::Session_obj::terminate(session);
-HXLINE( 246)				{
-HXLINE( 246)					::Dynamic this6 = chat->jingleSessions;
-HXDLIN( 246)					( ( ::haxe::ds::StringMap)(this6) )->remove(( (::String)(::Reflect_obj::field(jingle->attr,HX_("sid",0e,9f,57,00))) ));
+HXDLIN( 256)			if (_hx_tmp1) {
+HXLINE( 257)				::borogove::calls::Session_obj::terminate(session);
+HXLINE( 258)				{
+HXLINE( 258)					::Dynamic this6 = chat->jingleSessions;
+HXDLIN( 258)					( ( ::haxe::ds::StringMap)(this6) )->remove(( (::String)(::Reflect_obj::field(jingle->attr,HX_("sid",0e,9f,57,00))) ));
             				}
             			}
-HXLINE( 249)			bool _hx_tmp2;
-HXDLIN( 249)			if (::hx::IsNotNull( session )) {
-HXLINE( 249)				_hx_tmp2 = (( (::String)(::Reflect_obj::field(jingle->attr,HX_("action",b6,3b,46,16))) ) == HX_("content-add",cd,a9,a1,10));
+HXLINE( 261)			bool _hx_tmp2;
+HXDLIN( 261)			if (::hx::IsNotNull( session )) {
+HXLINE( 261)				_hx_tmp2 = (( (::String)(::Reflect_obj::field(jingle->attr,HX_("action",b6,3b,46,16))) ) == HX_("content-add",cd,a9,a1,10));
             			}
             			else {
-HXLINE( 249)				_hx_tmp2 = false;
+HXLINE( 261)				_hx_tmp2 = false;
             			}
-HXDLIN( 249)			if (_hx_tmp2) {
-HXLINE( 250)				::borogove::calls::Session_obj::contentAdd(session,stanza);
+HXDLIN( 261)			if (_hx_tmp2) {
+HXLINE( 262)				::borogove::calls::Session_obj::contentAdd(session,stanza);
             			}
-HXLINE( 253)			bool _hx_tmp3;
-HXDLIN( 253)			if (::hx::IsNotNull( session )) {
-HXLINE( 253)				_hx_tmp3 = (( (::String)(::Reflect_obj::field(jingle->attr,HX_("action",b6,3b,46,16))) ) == HX_("content-accept",dc,ee,cb,f2));
+HXLINE( 265)			bool _hx_tmp3;
+HXDLIN( 265)			if (::hx::IsNotNull( session )) {
+HXLINE( 265)				_hx_tmp3 = (( (::String)(::Reflect_obj::field(jingle->attr,HX_("action",b6,3b,46,16))) ) == HX_("content-accept",dc,ee,cb,f2));
             			}
             			else {
-HXLINE( 253)				_hx_tmp3 = false;
+HXLINE( 265)				_hx_tmp3 = false;
             			}
-HXDLIN( 253)			if (_hx_tmp3) {
-HXLINE( 254)				::borogove::calls::Session_obj::contentAccept(session,stanza);
+HXDLIN( 265)			if (_hx_tmp3) {
+HXLINE( 266)				::borogove::calls::Session_obj::contentAccept(session,stanza);
             			}
-HXLINE( 257)			bool _hx_tmp4;
-HXDLIN( 257)			if (::hx::IsNotNull( session )) {
-HXLINE( 257)				_hx_tmp4 = (( (::String)(::Reflect_obj::field(jingle->attr,HX_("action",b6,3b,46,16))) ) == HX_("transport-info",d2,9e,05,1c));
+HXLINE( 269)			bool _hx_tmp4;
+HXDLIN( 269)			if (::hx::IsNotNull( session )) {
+HXLINE( 269)				_hx_tmp4 = (( (::String)(::Reflect_obj::field(jingle->attr,HX_("action",b6,3b,46,16))) ) == HX_("transport-info",d2,9e,05,1c));
             			}
             			else {
-HXLINE( 257)				_hx_tmp4 = false;
+HXLINE( 269)				_hx_tmp4 = false;
             			}
-HXDLIN( 257)			if (_hx_tmp4) {
-HXLINE( 258)				::borogove::calls::Session_obj::transportInfo(session,stanza);
+HXDLIN( 269)			if (_hx_tmp4) {
+HXLINE( 270)				::borogove::calls::Session_obj::transportInfo(session,stanza);
             			}
-HXLINE( 262)			return ::borogove::IqResult_obj::IqResult_dyn();
+HXLINE( 274)			return ::borogove::IqResult_obj::IqResult_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_12, ::borogove::Client,_gthis) HXARGC(1)
             		 ::borogove::IqResult _hx_run( ::borogove::Stanza stanza){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_267_new)
-HXLINE( 267)			return ::borogove::IqResult_obj::IqResultElement(_gthis->caps->discoReply());
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_279_new)
+HXLINE( 279)			return ::borogove::IqResult_obj::IqResultElement(_gthis->caps->discoReply());
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_13, ::borogove::Client,_gthis,::Dynamic,persistence) HXARGC(1)
             		 ::borogove::IqResult _hx_run( ::borogove::Stanza stanza){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_270_new)
-HXLINE( 272)			bool _hx_tmp;
-HXDLIN( 272)			if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
-HXLINE( 273)				::String _hx_tmp1 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
-HXLINE( 272)				_hx_tmp = (_hx_tmp1 != _gthis->jid->domain);
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_282_new)
+HXLINE( 284)			bool _hx_tmp;
+HXDLIN( 284)			if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
+HXLINE( 285)				::String _hx_tmp1 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
+HXLINE( 284)				_hx_tmp = (_hx_tmp1 != _gthis->jid->domain);
             			}
             			else {
-HXLINE( 272)				_hx_tmp = false;
-            			}
-HXLINE( 271)			if (_hx_tmp) {
-HXLINE( 275)				return ::borogove::IqResult_obj::IqNoResult_dyn();
-            			}
-HXLINE( 278)			 ::borogove::queries::RosterGet roster =  ::borogove::queries::RosterGet_obj::__alloc( HX_CTX ,null());
-HXLINE( 279)			roster->handleResponse(stanza);
-HXLINE( 280)			::Array< ::Dynamic> items = roster->getResult();
-HXLINE( 281)			if ((items->length == 0)) {
-HXLINE( 281)				return ::borogove::IqResult_obj::IqNoResult_dyn();
-            			}
-HXLINE( 283)			::Array< ::Dynamic> chatsToUpdate = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 284)			{
-HXLINE( 284)				int _g = 0;
-HXDLIN( 284)				while((_g < items->length)){
-HXLINE( 284)					 ::Dynamic item = items->__get(_g);
-HXDLIN( 284)					_g = (_g + 1);
-HXLINE( 285)					if (::hx::IsNotEq( item->__Field(HX_("subscription",1d,ff,00,36),::hx::paccDynamic),HX_("remove",44,9c,88,04) )) {
-HXLINE( 286)						 ::borogove::DirectChat chat = _gthis->getDirectChat(( (::String)(item->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) ),false);
-HXLINE( 287)						chat->updateFromRoster(item);
-HXLINE( 288)						chatsToUpdate->push(chat);
+HXLINE( 284)				_hx_tmp = false;
+            			}
+HXLINE( 283)			if (_hx_tmp) {
+HXLINE( 287)				return ::borogove::IqResult_obj::IqNoResult_dyn();
+            			}
+HXLINE( 290)			 ::borogove::queries::RosterGet roster =  ::borogove::queries::RosterGet_obj::__alloc( HX_CTX ,null());
+HXLINE( 291)			roster->handleResponse(stanza);
+HXLINE( 292)			::Array< ::Dynamic> items = roster->getResult();
+HXLINE( 293)			if ((items->length == 0)) {
+HXLINE( 293)				return ::borogove::IqResult_obj::IqNoResult_dyn();
+            			}
+HXLINE( 295)			::Array< ::Dynamic> chatsToUpdate = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 296)			{
+HXLINE( 296)				int _g = 0;
+HXDLIN( 296)				while((_g < items->length)){
+HXLINE( 296)					 ::Dynamic item = items->__get(_g);
+HXDLIN( 296)					_g = (_g + 1);
+HXLINE( 297)					if (::hx::IsNotEq( item->__Field(HX_("subscription",1d,ff,00,36),::hx::paccDynamic),HX_("remove",44,9c,88,04) )) {
+HXLINE( 298)						 ::borogove::DirectChat chat = _gthis->getDirectChat(( (::String)(item->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) ),false);
+HXLINE( 299)						chat->updateFromRoster(item);
+HXLINE( 300)						chatsToUpdate->push(chat);
             					}
             				}
             			}
-HXLINE( 291)			::Dynamic persistence1 = persistence;
-HXDLIN( 291)			::borogove::Persistence_obj::storeChats(persistence1,_gthis->accountId(),chatsToUpdate);
-HXLINE( 292)			_gthis->trigger(HX_("chats/update",3d,8e,1d,14),chatsToUpdate);
-HXLINE( 294)			return ::borogove::IqResult_obj::IqResult_dyn();
+HXLINE( 303)			::Dynamic persistence1 = persistence;
+HXDLIN( 303)			::borogove::Persistence_obj::storeChats(persistence1,_gthis->accountId(),chatsToUpdate);
+HXLINE( 304)			_gthis->trigger(HX_("chats/update",3d,8e,1d,14),chatsToUpdate);
+HXLINE( 306)			return ::borogove::IqResult_obj::IqResult_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_14, ::borogove::Client,_gthis) HXARGC(1)
             		 ::borogove::IqResult _hx_run( ::borogove::Stanza stanza){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_297_new)
-HXLINE( 299)			bool _hx_tmp;
-HXDLIN( 299)			if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
-HXLINE( 300)				::String _hx_tmp1 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
-HXLINE( 299)				_hx_tmp = (_hx_tmp1 != _gthis->jid->domain);
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_309_new)
+HXLINE( 311)			bool _hx_tmp;
+HXDLIN( 311)			if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
+HXLINE( 312)				::String _hx_tmp1 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
+HXLINE( 311)				_hx_tmp = (_hx_tmp1 != _gthis->jid->domain);
             			}
             			else {
-HXLINE( 299)				_hx_tmp = false;
+HXLINE( 311)				_hx_tmp = false;
             			}
-HXLINE( 298)			if (_hx_tmp) {
-HXLINE( 302)				return ::borogove::IqResult_obj::IqNoResult_dyn();
+HXLINE( 310)			if (_hx_tmp) {
+HXLINE( 314)				return ::borogove::IqResult_obj::IqNoResult_dyn();
             			}
-HXLINE( 305)			{
-HXLINE( 305)				int _g = 0;
-HXDLIN( 305)				::Array< ::Dynamic> _g1;
-HXDLIN( 305)				 ::borogove::Stanza tmp = stanza->getChild(HX_("block",4d,75,fc,b4),HX_("urn:xmpp:blocking",d1,a1,46,c3));
-HXDLIN( 305)				::Array< ::Dynamic> tmp1;
-HXDLIN( 305)				if (::hx::IsNotNull( tmp )) {
-HXLINE( 305)					tmp1 = tmp->allTags(HX_("item",13,c5,bf,45),null());
+HXLINE( 317)			{
+HXLINE( 317)				int _g = 0;
+HXDLIN( 317)				::Array< ::Dynamic> _g1;
+HXDLIN( 317)				 ::borogove::Stanza tmp = stanza->getChild(HX_("block",4d,75,fc,b4),HX_("urn:xmpp:blocking",d1,a1,46,c3));
+HXDLIN( 317)				::Array< ::Dynamic> tmp1;
+HXDLIN( 317)				if (::hx::IsNotNull( tmp )) {
+HXLINE( 317)					tmp1 = tmp->allTags(HX_("item",13,c5,bf,45),null());
             				}
             				else {
-HXLINE( 305)					tmp1 = null();
+HXLINE( 317)					tmp1 = null();
             				}
-HXDLIN( 305)				if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 305)					_g1 = tmp1;
+HXDLIN( 317)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 317)					_g1 = tmp1;
             				}
             				else {
-HXLINE( 305)					_g1 = ::Array_obj< ::Dynamic>::__new(0);
-            				}
-HXDLIN( 305)				while((_g < _g1->length)){
-HXLINE( 305)					 ::borogove::Stanza item = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 305)					_g = (_g + 1);
-HXLINE( 306)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(item->attr,HX_("jid",c5,ca,50,00))) ) )) {
-HXLINE( 306)						 ::borogove::Client _gthis1 = _gthis;
-HXDLIN( 306)						_gthis1->serverBlocked(( (::String)(::Reflect_obj::field(item->attr,HX_("jid",c5,ca,50,00))) ));
+HXLINE( 317)					_g1 = ::Array_obj< ::Dynamic>::__new(0);
+            				}
+HXDLIN( 317)				while((_g < _g1->length)){
+HXLINE( 317)					 ::borogove::Stanza item = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 317)					_g = (_g + 1);
+HXLINE( 318)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(item->attr,HX_("jid",c5,ca,50,00))) ) )) {
+HXLINE( 318)						 ::borogove::Client _gthis1 = _gthis;
+HXDLIN( 318)						_gthis1->serverBlocked(( (::String)(::Reflect_obj::field(item->attr,HX_("jid",c5,ca,50,00))) ));
             					}
             				}
             			}
-HXLINE( 309)			return ::borogove::IqResult_obj::IqResult_dyn();
+HXLINE( 321)			return ::borogove::IqResult_obj::IqResult_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_15, ::borogove::Client,_gthis) HXARGC(1)
             		 ::borogove::IqResult _hx_run( ::borogove::Stanza stanza){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_312_new)
-HXLINE( 314)			bool _hx_tmp;
-HXDLIN( 314)			if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
-HXLINE( 315)				::String _hx_tmp1 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
-HXLINE( 314)				_hx_tmp = (_hx_tmp1 != _gthis->jid->domain);
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_324_new)
+HXLINE( 326)			bool _hx_tmp;
+HXDLIN( 326)			if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
+HXLINE( 327)				::String _hx_tmp1 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
+HXLINE( 326)				_hx_tmp = (_hx_tmp1 != _gthis->jid->domain);
             			}
             			else {
-HXLINE( 314)				_hx_tmp = false;
+HXLINE( 326)				_hx_tmp = false;
             			}
-HXLINE( 313)			if (_hx_tmp) {
-HXLINE( 317)				return ::borogove::IqResult_obj::IqNoResult_dyn();
+HXLINE( 325)			if (_hx_tmp) {
+HXLINE( 329)				return ::borogove::IqResult_obj::IqNoResult_dyn();
             			}
-HXLINE( 320)			 ::borogove::Stanza tmp = stanza->getChild(HX_("unblock",54,6c,8d,b1),HX_("urn:xmpp:blocking",d1,a1,46,c3));
-HXDLIN( 320)			::Array< ::Dynamic> unblocks;
-HXDLIN( 320)			if (::hx::IsNotNull( tmp )) {
-HXLINE( 320)				unblocks = tmp->allTags(HX_("item",13,c5,bf,45),null());
+HXLINE( 332)			 ::borogove::Stanza tmp = stanza->getChild(HX_("unblock",54,6c,8d,b1),HX_("urn:xmpp:blocking",d1,a1,46,c3));
+HXDLIN( 332)			::Array< ::Dynamic> unblocks;
+HXDLIN( 332)			if (::hx::IsNotNull( tmp )) {
+HXLINE( 332)				unblocks = tmp->allTags(HX_("item",13,c5,bf,45),null());
             			}
             			else {
-HXLINE( 320)				unblocks = null();
+HXLINE( 332)				unblocks = null();
             			}
-HXLINE( 321)			if (::hx::IsNull( unblocks )) {
-HXLINE( 323)				int _g = 0;
-HXDLIN( 323)				::Array< ::Dynamic> _g1 = _gthis->chats;
-HXDLIN( 323)				while((_g < _g1->length)){
-HXLINE( 323)					 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
-HXDLIN( 323)					_g = (_g + 1);
-HXLINE( 324)					if (chat->isBlocked) {
-HXLINE( 324)						chat->unblock(false);
+HXLINE( 333)			if (::hx::IsNull( unblocks )) {
+HXLINE( 335)				int _g = 0;
+HXDLIN( 335)				::Array< ::Dynamic> _g1 = _gthis->chats;
+HXDLIN( 335)				while((_g < _g1->length)){
+HXLINE( 335)					 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
+HXDLIN( 335)					_g = (_g + 1);
+HXLINE( 336)					if (chat->isBlocked) {
+HXLINE( 336)						chat->unblock(false);
             					}
             				}
             			}
             			else {
-HXLINE( 327)				int _g2 = 0;
-HXDLIN( 327)				while((_g2 < unblocks->length)){
-HXLINE( 327)					 ::borogove::Stanza item = unblocks->__get(_g2).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 327)					_g2 = (_g2 + 1);
-HXLINE( 328)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(item->attr,HX_("jid",c5,ca,50,00))) ) )) {
-HXLINE( 328)						 ::borogove::Client _gthis1 = _gthis;
-HXDLIN( 328)						 ::borogove::Chat tmp1 = _gthis1->getChat(( (::String)(::Reflect_obj::field(item->attr,HX_("jid",c5,ca,50,00))) ));
-HXDLIN( 328)						if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 328)							tmp1->unblock(false);
+HXLINE( 339)				int _g2 = 0;
+HXDLIN( 339)				while((_g2 < unblocks->length)){
+HXLINE( 339)					 ::borogove::Stanza item = unblocks->__get(_g2).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 339)					_g2 = (_g2 + 1);
+HXLINE( 340)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(item->attr,HX_("jid",c5,ca,50,00))) ) )) {
+HXLINE( 340)						 ::borogove::Client _gthis1 = _gthis;
+HXDLIN( 340)						 ::borogove::Chat tmp1 = _gthis1->getChat(( (::String)(::Reflect_obj::field(item->attr,HX_("jid",c5,ca,50,00))) ));
+HXDLIN( 340)						if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 340)							tmp1->unblock(false);
             						}
             					}
             				}
             			}
-HXLINE( 332)			return ::borogove::IqResult_obj::IqResult_dyn();
+HXLINE( 344)			return ::borogove::IqResult_obj::IqResult_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_25, ::borogove::Client,_gthis,::Dynamic,persistence) HXARGC(1)
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_24, ::borogove::Client,_gthis,::Dynamic,persistence) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic event){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_335_new)
-HXLINE( 336)			 ::borogove::Stanza stanza = ( ( ::borogove::Stanza)(event->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic)) );
-HXLINE( 337)			 ::borogove::Stanza c = stanza->getChild(HX_("c",63,00,00,00),HX_("http://jabber.org/protocol/caps",95,d0,90,e2));
-HXLINE( 338)			bool _hx_tmp;
-HXDLIN( 338)			if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
-HXLINE( 338)				_hx_tmp = ::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) );
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_347_new)
+HXLINE( 348)			 ::borogove::Stanza stanza = ( ( ::borogove::Stanza)(event->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic)) );
+HXLINE( 349)			 ::borogove::Stanza presence = stanza;
+HXLINE( 351)			bool _hx_tmp;
+HXDLIN( 351)			if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
+HXLINE( 351)				_hx_tmp = ::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) );
             			}
             			else {
-HXLINE( 338)				_hx_tmp = false;
-            			}
-HXDLIN( 338)			if (_hx_tmp) {
-HXLINE( 339)				 ::borogove::JID from = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
-HXLINE( 340)				 ::borogove::Client _gthis1 = _gthis;
-HXDLIN( 340)				 ::borogove::Chat chat = _gthis1->getChat(from->asBare()->asString());
-HXLINE( 341)				if (::hx::IsNull( chat )) {
-HXLINE( 342)					 ::Dynamic _hx_tmp1 = ::haxe::Log_obj::trace;
-HXDLIN( 342)					::String _hx_tmp2 = (HX_("Presence for unknown JID: ",19,ed,d7,3f) + ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
-HXDLIN( 342)					_hx_tmp1(_hx_tmp2,::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),342,HX_("borogove.Client",18,dc,e6,c0),HX_("new",60,d0,53,00)));
-HXLINE( 343)					return ::borogove::EventResult_obj::EventUnhandled_dyn();
-            				}
-HXLINE( 346)				 ::borogove::Stanza mucUser = stanza->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
-HXLINE( 347)				::String avatarSha1Hex = stanza->findText(HX_("{vcard-temp:x:update}x/photo#",f6,a1,33,28));
-HXLINE( 348)				 ::borogove::Hash avatarSha1;
-HXDLIN( 348)				bool avatarSha11;
-HXDLIN( 348)				if (::hx::IsNotNull( avatarSha1Hex )) {
-HXLINE( 348)					avatarSha11 = (avatarSha1Hex == HX_("",00,00,00,00));
+HXLINE( 351)				_hx_tmp = false;
+            			}
+HXDLIN( 351)			if (_hx_tmp) {
+HXLINE( 352)				 ::borogove::JID from = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
+HXLINE( 353)				 ::borogove::Client _gthis1 = _gthis;
+HXDLIN( 353)				 ::borogove::Chat chat = _gthis1->getChat(from->asBare()->asString());
+HXLINE( 354)				if (::hx::IsNull( chat )) {
+HXLINE( 355)					 ::Dynamic _hx_tmp1 = ::haxe::Log_obj::trace;
+HXDLIN( 355)					::String _hx_tmp2 = (HX_("Presence for unknown JID: ",19,ed,d7,3f) + ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
+HXDLIN( 355)					_hx_tmp1(_hx_tmp2,::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),355,HX_("borogove.Client",18,dc,e6,c0),HX_("new",60,d0,53,00)));
+HXLINE( 356)					return ::borogove::EventResult_obj::EventUnhandled_dyn();
+            				}
+HXLINE( 359)				 ::borogove::Stanza c = presence->getChild(HX_("c",63,00,00,00),HX_("http://jabber.org/protocol/caps",95,d0,90,e2));
+HXDLIN( 359)				 ::Dynamic tmp;
+HXDLIN( 359)				if (::hx::IsNotNull( c )) {
+HXLINE( 359)					tmp = c->attr;
             				}
             				else {
-HXLINE( 348)					avatarSha11 = true;
+HXLINE( 359)					tmp = null();
             				}
-HXDLIN( 348)				if (avatarSha11) {
-HXLINE( 348)					avatarSha1 = null();
+HXDLIN( 359)				::String _hx_tmp3;
+HXDLIN( 359)				if (::hx::IsNotNull( tmp )) {
+HXLINE( 359)					_hx_tmp3 = ( (::String)(::Reflect_obj::field(tmp,HX_("ver",63,e2,59,00))) );
             				}
             				else {
-HXLINE( 348)					avatarSha1 = ::borogove::Hash_obj::fromHex(HX_("sha-1",90,a8,1c,7c),avatarSha1Hex);
+HXLINE( 359)					_hx_tmp3 = null();
             				}
-HXLINE( 350)				if (::hx::IsNull( c )) {
-HXLINE( 351)					 ::borogove::Chat chat1 = chat;
-HXDLIN( 351)					::String _hx_tmp3 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
-HXDLIN( 351)					chat1->setPresence(::borogove::JID_obj::parse(_hx_tmp3)->resource, ::borogove::Presence_obj::__alloc( HX_CTX ,null(),mucUser,avatarSha1));
-HXLINE( 352)					::Dynamic persistence1 = persistence;
-HXDLIN( 352)					::String _hx_tmp4 = _gthis->accountId();
-HXDLIN( 352)					::borogove::Persistence_obj::storeChats(persistence1,_hx_tmp4,::Array_obj< ::Dynamic>::__new(1)->init(0,chat));
-HXLINE( 353)					if (chat->livePresence()) {
-HXLINE( 353)						_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat));
-            					}
+HXDLIN( 359)				if (::hx::IsNull( _hx_tmp3 )) {
+HXLINE( 360)					 ::borogove::Chat chat1 = chat;
+HXDLIN( 360)					::String _hx_tmp4 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
+HXDLIN( 360)					chat1->setPresence(::borogove::JID_obj::parse(_hx_tmp4)->resource,stanza,false);
             				}
             				else {
-            					HX_BEGIN_LOCAL_FUNC_S6(::hx::LocalFunc,_hx_Closure_16, ::borogove::Client,_gthis, ::borogove::Hash,avatarSha1, ::borogove::Stanza,mucUser,::Dynamic,persistence, ::borogove::Chat,chat, ::borogove::Stanza,stanza) HXARGC(1)
+            					HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_16, ::borogove::Chat,chat, ::borogove::Stanza,stanza) HXARGC(1)
             					 ::borogove::Chat _hx_run( ::borogove::Caps caps){
-            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_355_new)
-HXLINE( 356)						 ::borogove::Chat chat1 = chat;
-HXDLIN( 356)						::String handleCaps = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
-HXDLIN( 356)						chat1->setPresence(::borogove::JID_obj::parse(handleCaps)->resource, ::borogove::Presence_obj::__alloc( HX_CTX ,caps,mucUser,avatarSha1));
-HXLINE( 357)						bool handleCaps1;
-HXDLIN( 357)						if (::hx::IsNotNull( mucUser )) {
-HXLINE( 357)							handleCaps1 = chat->livePresence();
-            						}
-            						else {
-HXLINE( 357)							handleCaps1 = true;
-            						}
-HXDLIN( 357)						if (handleCaps1) {
-HXLINE( 357)							::Dynamic persistence1 = persistence;
-HXDLIN( 357)							::String handleCaps2 = _gthis->accountId();
-HXDLIN( 357)							::borogove::Persistence_obj::storeChats(persistence1,handleCaps2,::Array_obj< ::Dynamic>::__new(1)->init(0,chat));
-            						}
-HXLINE( 358)						return chat;
+            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_362_new)
+HXLINE( 363)						 ::borogove::Chat chat1 = chat;
+HXDLIN( 363)						::String handleCaps = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
+HXDLIN( 363)						chat1->setPresence(::borogove::JID_obj::parse(handleCaps)->resource,stanza,false);
+HXLINE( 364)						return chat;
             					}
             					HX_END_LOCAL_FUNC1(return)
 
-            					HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_19, ::borogove::Client,_gthis,::Dynamic,persistence, ::Dynamic,handleCaps, ::borogove::Stanza,stanza, ::borogove::Stanza,c) HXARGC(1)
+            					HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_18, ::borogove::Client,_gthis, ::borogove::Stanza,presence, ::Dynamic,handleCaps, ::borogove::Stanza,stanza) HXARGC(1)
             					void _hx_run( ::borogove::Caps caps){
-            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_362_new)
-HXLINE( 362)						if (::hx::IsNull( caps )) {
-HXLINE( 363)							::Dynamic this1 = _gthis->pendingCaps;
-HXDLIN( 363)							::Array< ::Dynamic> pending = ( (::Array< ::Dynamic>)(( ( ::haxe::ds::StringMap)(this1) )->get(( (::String)(::Reflect_obj::field(c->attr,HX_("ver",63,e2,59,00))) ))) );
-HXLINE( 364)							if (::hx::IsNull( pending )) {
-            								HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_18, ::borogove::Client,_gthis,::Dynamic,persistence, ::borogove::queries::DiscoInfoGet,discoGet2, ::borogove::Stanza,c) HXARGC(0)
+            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_368_new)
+HXLINE( 368)						if (::hx::IsNull( caps )) {
+HXLINE( 369)							 ::borogove::Stanza c = presence->getChild(HX_("c",63,00,00,00),HX_("http://jabber.org/protocol/caps",95,d0,90,e2));
+HXDLIN( 369)							 ::Dynamic tmp;
+HXDLIN( 369)							if (::hx::IsNotNull( c )) {
+HXLINE( 369)								tmp = c->attr;
+            							}
+            							else {
+HXLINE( 369)								tmp = null();
+            							}
+HXDLIN( 369)							::String ver;
+HXDLIN( 369)							if (::hx::IsNotNull( tmp )) {
+HXLINE( 369)								ver = ( (::String)(::Reflect_obj::field(tmp,HX_("ver",63,e2,59,00))) );
+            							}
+            							else {
+HXLINE( 369)								ver = null();
+            							}
+HXLINE( 370)							::Array< ::Dynamic> pending = ( (::Array< ::Dynamic>)(_gthis->pendingCaps->get(ver)) );
+HXLINE( 371)							if (::hx::IsNull( pending )) {
+            								HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_17, ::borogove::Client,_gthis,::String,ver, ::borogove::queries::DiscoInfoGet,discoGet2) HXARGC(0)
             								void _hx_run(){
-            									HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_17, ::haxe::ds::StringMap,chatsToUpdate) HXARGC(0)
-            									 ::Dynamic _hx_run(){
-            										HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_376_new)
-HXLINE( 376)										return chatsToUpdate->iterator();
-            									}
-            									HX_END_LOCAL_FUNC0(return)
-
-            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_367_new)
-HXLINE( 368)									 ::haxe::ds::StringMap chatsToUpdate =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE( 369)									::Array< ::Dynamic> handlers;
-HXDLIN( 369)									::Dynamic this1 = _gthis->pendingCaps;
-HXDLIN( 369)									::Array< ::Dynamic> tmp = ( (::Array< ::Dynamic>)(( ( ::haxe::ds::StringMap)(this1) )->get(( (::String)(::Reflect_obj::field(c->attr,HX_("ver",63,e2,59,00))) ))) );
-HXDLIN( 369)									if (::hx::IsNotNull( tmp )) {
-HXLINE( 369)										handlers = tmp;
+            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_374_new)
+HXLINE( 376)									::Array< ::Dynamic> handlers;
+HXDLIN( 376)									::Array< ::Dynamic> tmp = ( (::Array< ::Dynamic>)(_gthis->pendingCaps->get(ver)) );
+HXDLIN( 376)									if (::hx::IsNotNull( tmp )) {
+HXLINE( 376)										handlers = tmp;
             									}
             									else {
-HXLINE( 369)										handlers = ::Array_obj< ::Dynamic>::__new(0);
-            									}
-HXLINE( 370)									{
-HXLINE( 370)										::Dynamic this2 = _gthis->pendingCaps;
-HXDLIN( 370)										( ( ::haxe::ds::StringMap)(this2) )->remove(( (::String)(::Reflect_obj::field(c->attr,HX_("ver",63,e2,59,00))) ));
-            									}
-HXLINE( 371)									if (::hx::IsNotNull( discoGet2->getResult() )) {
-HXLINE( 371)										::Dynamic persistence1 = persistence;
-HXDLIN( 371)										::borogove::Persistence_obj::storeCaps(persistence1,discoGet2->getResult());
+HXLINE( 376)										handlers = ::Array_obj< ::Dynamic>::__new(0);
             									}
-HXLINE( 372)									{
-HXLINE( 372)										int _g = 0;
-HXDLIN( 372)										while((_g < handlers->length)){
-HXLINE( 372)											 ::Dynamic handler = handlers->__get(_g);
-HXDLIN( 372)											_g = (_g + 1);
-HXLINE( 373)											 ::borogove::Chat c1 = ( ( ::borogove::Chat)(handler(discoGet2->getResult())) );
-HXLINE( 374)											if (c1->livePresence()) {
-HXLINE( 374)												chatsToUpdate->set(c1->chatId,c1);
+HXLINE( 377)									_gthis->pendingCaps->remove(ver);
+HXLINE( 378)									if (::hx::IsNotNull( discoGet2->getResult() )) {
+HXLINE( 379)										 ::borogove::CapsRepo _gthis1 = _gthis->capsRepo;
+HXDLIN( 379)										 ::borogove::Caps cachedCaps = _gthis1->add(discoGet2->getResult(),null());
+HXLINE( 380)										{
+HXLINE( 380)											int _g = 0;
+HXDLIN( 380)											while((_g < handlers->length)){
+HXLINE( 380)												 ::Dynamic handler = handlers->__get(_g);
+HXDLIN( 380)												_g = (_g + 1);
+HXLINE( 381)												handler(cachedCaps);
             											}
             										}
             									}
-HXLINE( 376)									 ::borogove::Client _gthis1 = _gthis;
-HXDLIN( 376)									_gthis1->trigger(HX_("chats/update",3d,8e,1d,14),::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
-            										->setFixed(0,HX_("iterator",ee,49,9a,93), ::Dynamic(new _hx_Closure_17(chatsToUpdate))))));
             								}
             								HX_END_LOCAL_FUNC0((void))
 
-HXLINE( 365)								{
-HXLINE( 365)									::Dynamic this2 = _gthis->pendingCaps;
-HXDLIN( 365)									::String key = ( (::String)(::Reflect_obj::field(c->attr,HX_("ver",63,e2,59,00))) );
-HXDLIN( 365)									( ( ::haxe::ds::StringMap)(this2) )->set(key,::Array_obj< ::Dynamic>::__new(1)->init(0,handleCaps));
+HXLINE( 372)								_gthis->pendingCaps->set(ver,::Array_obj< ::Dynamic>::__new(1)->init(0,handleCaps));
+HXLINE( 373)								::String discoGet = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
+HXDLIN( 373)								 ::borogove::Stanza c1 = presence->getChild(HX_("c",63,00,00,00),HX_("http://jabber.org/protocol/caps",95,d0,90,e2));
+HXDLIN( 373)								 ::Dynamic tmp1;
+HXDLIN( 373)								if (::hx::IsNotNull( c1 )) {
+HXLINE( 373)									tmp1 = c1->attr;
             								}
-HXLINE( 366)								::String discoGet = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
-HXDLIN( 366)								::String discoGet1 = (( (::String)(::Reflect_obj::field(c->attr,HX_("node",02,0a,0a,49))) ) + HX_("#",23,00,00,00));
-HXDLIN( 366)								 ::borogove::queries::DiscoInfoGet discoGet2 =  ::borogove::queries::DiscoInfoGet_obj::__alloc( HX_CTX ,discoGet,(discoGet1 + ( (::String)(::Reflect_obj::field(c->attr,HX_("ver",63,e2,59,00))) )));
-HXLINE( 367)								discoGet2->onFinished( ::Dynamic(new _hx_Closure_18(_gthis,persistence,discoGet2,c)));
-HXLINE( 378)								_gthis->sendQuery(discoGet2);
+            								else {
+HXLINE( 373)									tmp1 = null();
+            								}
+HXDLIN( 373)								::String discoGet1;
+HXDLIN( 373)								if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 373)									discoGet1 = ( (::String)(::Reflect_obj::field(tmp1,HX_("node",02,0a,0a,49))) );
+            								}
+            								else {
+HXLINE( 373)									discoGet1 = null();
+            								}
+HXDLIN( 373)								 ::borogove::queries::DiscoInfoGet discoGet2 =  ::borogove::queries::DiscoInfoGet_obj::__alloc( HX_CTX ,discoGet,((discoGet1 + HX_("#",23,00,00,00)) + ver));
+HXLINE( 374)								discoGet2->onFinished( ::Dynamic(new _hx_Closure_17(_gthis,ver,discoGet2)));
+HXLINE( 385)								_gthis->sendQuery(discoGet2);
             							}
             							else {
-HXLINE( 380)								pending->push(handleCaps);
+HXLINE( 387)								pending->push(handleCaps);
             							}
             						}
             						else {
-HXLINE( 383)							handleCaps(caps);
+HXLINE( 390)							handleCaps(caps);
             						}
             					}
             					HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 355)					 ::Dynamic handleCaps =  ::Dynamic(new _hx_Closure_16(_gthis,avatarSha1,mucUser,persistence,chat,stanza));
-HXLINE( 361)					::Dynamic persistence2 = persistence;
-HXDLIN( 361)					::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getCaps(persistence2,( (::String)(::Reflect_obj::field(c->attr,HX_("ver",63,e2,59,00))) )), ::Dynamic(new _hx_Closure_19(_gthis,persistence,handleCaps,stanza,c)),null());
+HXLINE( 362)					 ::Dynamic handleCaps =  ::Dynamic(new _hx_Closure_16(chat,stanza));
+HXLINE( 367)					::thenshim::_Promise::Promise_Impl__obj::then(_gthis->capsRepo->getAsync(presence), ::Dynamic(new _hx_Closure_18(_gthis,presence,handleCaps,stanza)),null());
+            				}
+HXLINE( 394)				 ::borogove::Channel channel = ( ( ::borogove::Channel)(::Std_obj::downcast(chat,::hx::ClassOf< ::borogove::Channel >())) );
+HXLINE( 395)				::String avatarSha1Hex = presence->findText(HX_("{vcard-temp:x:update}x/photo#",f6,a1,33,28));
+HXDLIN( 395)				 ::borogove::Hash avatarSha1;
+HXDLIN( 395)				bool avatarSha11;
+HXDLIN( 395)				if (::hx::IsNotNull( avatarSha1Hex )) {
+HXLINE( 395)					avatarSha11 = (avatarSha1Hex == HX_("",00,00,00,00));
+            				}
+            				else {
+HXLINE( 395)					avatarSha11 = true;
+            				}
+HXDLIN( 395)				if (avatarSha11) {
+HXLINE( 395)					avatarSha1 = null();
+            				}
+            				else {
+HXLINE( 395)					avatarSha1 = ::borogove::Hash_obj::fromHex(HX_("sha-1",90,a8,1c,7c),avatarSha1Hex);
             				}
-HXLINE( 388)				bool _hx_tmp5;
-HXDLIN( 388)				bool _hx_tmp6;
-HXDLIN( 388)				if (::hx::IsNotNull( ::Std_obj::downcast(chat,::hx::ClassOf< ::borogove::Channel >()) )) {
-HXLINE( 388)					_hx_tmp6 = ::hx::IsNotNull( avatarSha1 );
+HXLINE( 396)				bool _hx_tmp5;
+HXDLIN( 396)				bool _hx_tmp6;
+HXDLIN( 396)				if (::hx::IsNotNull( channel )) {
+HXLINE( 396)					_hx_tmp6 = ::hx::IsNotNull( avatarSha1 );
             				}
             				else {
-HXLINE( 388)					_hx_tmp6 = false;
+HXLINE( 396)					_hx_tmp6 = false;
             				}
-HXDLIN( 388)				if (_hx_tmp6) {
-HXLINE( 388)					_hx_tmp5 = ::hx::IsNull( _gthis->brokenAvatars->get(avatarSha1Hex) );
+HXDLIN( 396)				if (_hx_tmp6) {
+HXLINE( 396)					::Dynamic this1 = _gthis->brokenAvatars;
+HXDLIN( 396)					_hx_tmp5 = ::hx::IsNull( ( ( ::haxe::ds::StringMap)(this1) )->get(avatarSha1->toHex()) );
             				}
             				else {
-HXLINE( 388)					_hx_tmp5 = false;
+HXLINE( 396)					_hx_tmp5 = false;
             				}
-HXDLIN( 388)				if (_hx_tmp5) {
-            					HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_22, ::borogove::Client,_gthis,::String,avatarSha1Hex, ::borogove::JID,from,::Dynamic,persistence, ::borogove::Chat,chat) HXARGC(1)
+HXDLIN( 396)				if (_hx_tmp5) {
+            					HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_21, ::borogove::Client,_gthis, ::borogove::Hash,avatarSha1, ::borogove::JID,from,::Dynamic,persistence, ::borogove::Chat,chat) HXARGC(1)
             					void _hx_run(bool has){
-            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_394_new)
-HXLINE( 394)						if (has) {
-HXLINE( 395)							if (chat->livePresence()) {
-HXLINE( 395)								_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat));
+            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_402_new)
+HXLINE( 402)						if (has) {
+HXLINE( 403)							if (chat->livePresence()) {
+HXLINE( 403)								_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat));
             							}
             						}
             						else {
-            							HX_BEGIN_LOCAL_FUNC_S6(::hx::LocalFunc,_hx_Closure_21, ::borogove::Client,_gthis,::String,avatarSha1Hex, ::borogove::queries::VcardTempGet,vcardGet, ::borogove::JID,from,::Dynamic,persistence, ::borogove::Chat,chat) HXARGC(0)
+            							HX_BEGIN_LOCAL_FUNC_S6(::hx::LocalFunc,_hx_Closure_20, ::borogove::Client,_gthis, ::borogove::Hash,avatarSha1, ::borogove::queries::VcardTempGet,vcardGet, ::borogove::JID,from,::Dynamic,persistence, ::borogove::Chat,chat) HXARGC(0)
             							void _hx_run(){
-            								HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_20, ::borogove::Client,_gthis, ::borogove::Chat,chat) HXARGC(1)
+            								HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_19, ::borogove::Client,_gthis, ::borogove::Chat,chat) HXARGC(1)
             								 ::borogove::EventResult _hx_run(bool _){
-            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_404_new)
-HXLINE( 404)									return _gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat));
+            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_412_new)
+HXLINE( 412)									return _gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat));
             								}
             								HX_END_LOCAL_FUNC1(return)
 
-            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_398_new)
-HXLINE( 399)								 ::Dynamic vcard = vcardGet->getResult();
-HXLINE( 400)								if (::hx::IsNull( vcard->__Field(HX_("photo",b2,c8,f3,c1),::hx::paccDynamic) )) {
-HXLINE( 401)									_gthis->brokenAvatars->set(avatarSha1Hex,from);
-HXLINE( 402)									return;
+            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_406_new)
+HXLINE( 407)								 ::Dynamic vcard = vcardGet->getResult();
+HXLINE( 408)								if (::hx::IsNull( vcard->__Field(HX_("photo",b2,c8,f3,c1),::hx::paccDynamic) )) {
+HXLINE( 409)									{
+HXLINE( 409)										::Dynamic this1 = _gthis->brokenAvatars;
+HXDLIN( 409)										::String k = avatarSha1->toHex();
+HXDLIN( 409)										( ( ::haxe::ds::StringMap)(this1) )->set(k,from);
+            									}
+HXLINE( 410)									return;
+            								}
+HXLINE( 412)								::String tmp = ( (::String)( ::Dynamic(vcard->__Field(HX_("photo",b2,c8,f3,c1),::hx::paccDynamic))->__Field(HX_("mime",b4,4d,5c,48),::hx::paccDynamic)) );
+HXDLIN( 412)								::String _hx_tmp;
+HXDLIN( 412)								if (::hx::IsNotNull( tmp )) {
+HXLINE( 412)									_hx_tmp = tmp;
+            								}
+            								else {
+HXLINE( 412)									_hx_tmp = HX_("image/png",b5,cc,c1,16);
             								}
-HXLINE( 404)								::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMedia(persistence, ::Dynamic( ::Dynamic(vcard->__Field(HX_("photo",b2,c8,f3,c1),::hx::paccDynamic))->__Field(HX_("mime",b4,4d,5c,48),::hx::paccDynamic)),( ( ::haxe::io::Bytes)( ::Dynamic(vcard->__Field(HX_("photo",b2,c8,f3,c1),::hx::paccDynamic))->__Field(HX_("data",2a,56,63,42),::hx::paccDynamic)) )->b), ::Dynamic(new _hx_Closure_20(_gthis,chat)),null());
+HXDLIN( 412)								::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMedia(persistence,_hx_tmp,( ( ::haxe::io::Bytes)( ::Dynamic(vcard->__Field(HX_("photo",b2,c8,f3,c1),::hx::paccDynamic))->__Field(HX_("data",2a,56,63,42),::hx::paccDynamic)) )->b), ::Dynamic(new _hx_Closure_19(_gthis,chat)),null());
             							}
             							HX_END_LOCAL_FUNC0((void))
 
-HXLINE( 397)							 ::borogove::queries::VcardTempGet vcardGet =  ::borogove::queries::VcardTempGet_obj::__alloc( HX_CTX ,from);
-HXLINE( 398)							vcardGet->onFinished( ::Dynamic(new _hx_Closure_21(_gthis,avatarSha1Hex,vcardGet,from,persistence,chat)));
-HXLINE( 408)							_gthis->sendQueryLazy(vcardGet);
+HXLINE( 405)							 ::borogove::queries::VcardTempGet vcardGet =  ::borogove::queries::VcardTempGet_obj::__alloc( HX_CTX ,from);
+HXLINE( 406)							vcardGet->onFinished( ::Dynamic(new _hx_Closure_20(_gthis,avatarSha1,vcardGet,from,persistence,chat)));
+HXLINE( 416)							_gthis->sendQueryLazy(vcardGet);
             						}
             					}
             					HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 389)					if (from->isBare()) {
-HXLINE( 390)						chat->setAvatarSha1(avatarSha1->hash);
-HXLINE( 391)						::Dynamic persistence3 = persistence;
-HXDLIN( 391)						::String _hx_tmp7 = _gthis->accountId();
-HXDLIN( 391)						::borogove::Persistence_obj::storeChats(persistence3,_hx_tmp7,::Array_obj< ::Dynamic>::__new(1)->init(0,chat));
+HXLINE( 397)					if (from->isBare()) {
+HXLINE( 398)						chat->setAvatarSha1(avatarSha1->hash);
+HXLINE( 399)						::Dynamic persistence1 = persistence;
+HXDLIN( 399)						::String _hx_tmp7 = _gthis->accountId();
+HXDLIN( 399)						::borogove::Persistence_obj::storeChats(persistence1,_hx_tmp7,::Array_obj< ::Dynamic>::__new(1)->init(0,chat));
             					}
-HXLINE( 393)					::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::hasMedia(persistence,HX_("sha-1",90,a8,1c,7c),avatarSha1->hash), ::Dynamic(new _hx_Closure_22(_gthis,avatarSha1Hex,from,persistence,chat)),null());
+HXLINE( 401)					::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::hasMedia(persistence,HX_("sha-1",90,a8,1c,7c),avatarSha1->hash), ::Dynamic(new _hx_Closure_21(_gthis,avatarSha1,from,persistence,chat)),null());
             				}
-HXLINE( 412)				return ::borogove::EventResult_obj::EventHandled_dyn();
+HXLINE( 420)				return ::borogove::EventResult_obj::EventHandled_dyn();
             			}
-HXLINE( 415)			bool _hx_tmp8;
-HXDLIN( 415)			if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
-HXLINE( 415)				_hx_tmp8 = (( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) == HX_("unavailable",50,e0,29,fd));
+HXLINE( 423)			bool _hx_tmp8;
+HXDLIN( 423)			if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
+HXLINE( 423)				_hx_tmp8 = (( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) == HX_("unavailable",50,e0,29,fd));
             			}
             			else {
-HXLINE( 415)				_hx_tmp8 = false;
-            			}
-HXDLIN( 415)			if (_hx_tmp8) {
-HXLINE( 416)				 ::borogove::Client _gthis2 = _gthis;
-HXDLIN( 416)				 ::borogove::Chat chat2 = _gthis2->getChat(::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ))->asBare()->asString());
-HXLINE( 417)				if (::hx::IsNull( chat2 )) {
-HXLINE( 418)					 ::Dynamic _hx_tmp9 = ::haxe::Log_obj::trace;
-HXDLIN( 418)					::String _hx_tmp10 = (HX_("Presence for unknown JID: ",19,ed,d7,3f) + ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
-HXDLIN( 418)					_hx_tmp9(_hx_tmp10,::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),418,HX_("borogove.Client",18,dc,e6,c0),HX_("new",60,d0,53,00)));
-HXLINE( 419)					return ::borogove::EventResult_obj::EventUnhandled_dyn();
-            				}
-HXLINE( 422)				chat2->removePresence(::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ))->resource);
-HXLINE( 423)				::Dynamic persistence4 = persistence;
-HXDLIN( 423)				::borogove::Persistence_obj::storeChats(persistence4,_gthis->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat2));
-HXLINE( 424)				_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat2));
-            			}
-HXLINE( 427)			bool _hx_tmp11;
-HXDLIN( 427)			if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
-HXLINE( 427)				_hx_tmp11 = (( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) == HX_("subscribe",4a,0b,18,19));
+HXLINE( 423)				_hx_tmp8 = false;
+            			}
+HXDLIN( 423)			if (_hx_tmp8) {
+HXLINE( 424)				 ::borogove::Client _gthis2 = _gthis;
+HXDLIN( 424)				 ::borogove::Chat chat2 = _gthis2->getChat(::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ))->asBare()->asString());
+HXLINE( 425)				if (::hx::IsNull( chat2 )) {
+HXLINE( 426)					 ::Dynamic _hx_tmp9 = ::haxe::Log_obj::trace;
+HXDLIN( 426)					::String _hx_tmp10 = (HX_("Presence for unknown JID: ",19,ed,d7,3f) + ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
+HXDLIN( 426)					_hx_tmp9(_hx_tmp10,::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),426,HX_("borogove.Client",18,dc,e6,c0),HX_("new",60,d0,53,00)));
+HXLINE( 427)					return ::borogove::EventResult_obj::EventUnhandled_dyn();
+            				}
+HXLINE( 429)				::String _hx_tmp11 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
+HXDLIN( 429)				chat2->setPresence(::borogove::JID_obj::parse(_hx_tmp11)->resource,stanza,false);
+HXLINE( 430)				_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat2));
+            			}
+HXLINE( 433)			bool _hx_tmp12;
+HXDLIN( 433)			if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
+HXLINE( 433)				_hx_tmp12 = (( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) == HX_("subscribe",4a,0b,18,19));
             			}
             			else {
-HXLINE( 427)				_hx_tmp11 = false;
-            			}
-HXDLIN( 427)			if (_hx_tmp11) {
-HXLINE( 428)				 ::borogove::JID from1 = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
-HXLINE( 429)				 ::borogove::Client _gthis3 = _gthis;
-HXDLIN( 429)				 ::borogove::Chat chat3 = _gthis3->getChat(from1->asBare()->asString());
-HXLINE( 430)				::String nick = stanza->getChildText(HX_("nick",a3,7b,05,49),HX_("http://jabber.org/protocol/nick",17,30,dc,e9));
-HXLINE( 431)				if (::hx::IsNull( chat3 )) {
-            					HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_23) HXARGC(1)
+HXLINE( 433)				_hx_tmp12 = false;
+            			}
+HXDLIN( 433)			if (_hx_tmp12) {
+HXLINE( 434)				 ::borogove::JID from1 = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
+HXLINE( 435)				 ::borogove::Client _gthis3 = _gthis;
+HXDLIN( 435)				 ::borogove::Chat chat3 = _gthis3->getChat(from1->asBare()->asString());
+HXLINE( 436)				::String nick = stanza->getChildText(HX_("nick",a3,7b,05,49),HX_("http://jabber.org/protocol/nick",17,30,dc,e9));
+HXLINE( 437)				if (::hx::IsNull( chat3 )) {
+            					HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_22) HXARGC(1)
             					int _hx_run( ::borogove::Caps _){
-            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_432_new)
-HXLINE( 432)						return 3;
+            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_438_new)
+HXLINE( 438)						return 3;
             					}
             					HX_END_LOCAL_FUNC1(return)
 
-            					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_24,::String,nick) HXARGC(1)
+            					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_23,::String,nick) HXARGC(1)
             					void _hx_run( ::borogove::Chat chat){
-            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_433_new)
-HXLINE( 433)						bool _hx_tmp;
-HXDLIN( 433)						if ((chat->displayName == chat->chatId)) {
-HXLINE( 433)							_hx_tmp = ::hx::IsNotNull( nick );
+            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_439_new)
+HXLINE( 439)						bool _hx_tmp;
+HXDLIN( 439)						if ((chat->displayName == chat->chatId)) {
+HXLINE( 439)							_hx_tmp = ::hx::IsNotNull( nick );
             						}
             						else {
-HXLINE( 433)							_hx_tmp = false;
+HXLINE( 439)							_hx_tmp = false;
             						}
-HXDLIN( 433)						if (_hx_tmp) {
-HXLINE( 433)							chat->displayName = nick;
+HXDLIN( 439)						if (_hx_tmp) {
+HXLINE( 439)							chat->displayName = nick;
             						}
             					}
             					HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 432)					 ::borogove::Client _gthis4 = _gthis;
-HXDLIN( 432)					_gthis4->startChatWith(from1->asBare()->asString(), ::Dynamic(new _hx_Closure_23()), ::Dynamic(new _hx_Closure_24(nick)));
+HXLINE( 438)					 ::borogove::Client _gthis4 = _gthis;
+HXDLIN( 438)					_gthis4->startChatWith(from1->asBare()->asString(), ::Dynamic(new _hx_Closure_22()), ::Dynamic(new _hx_Closure_23(nick)));
             				}
             				else {
-HXLINE( 435)					if ((chat3->uiState == 2)) {
-HXLINE( 436)						chat3->uiState = 3;
-HXLINE( 437)						bool _hx_tmp12;
-HXDLIN( 437)						if ((chat3->displayName == chat3->chatId)) {
-HXLINE( 437)							_hx_tmp12 = ::hx::IsNotNull( nick );
+HXLINE( 441)					if ((chat3->uiState == 2)) {
+HXLINE( 442)						chat3->uiState = 3;
+HXLINE( 443)						bool _hx_tmp13;
+HXDLIN( 443)						if ((chat3->displayName == chat3->chatId)) {
+HXLINE( 443)							_hx_tmp13 = ::hx::IsNotNull( nick );
             						}
             						else {
-HXLINE( 437)							_hx_tmp12 = false;
+HXLINE( 443)							_hx_tmp13 = false;
             						}
-HXDLIN( 437)						if (_hx_tmp12) {
-HXLINE( 437)							chat3->displayName = nick;
+HXDLIN( 443)						if (_hx_tmp13) {
+HXLINE( 443)							chat3->displayName = nick;
             						}
             					}
             				}
             			}
-HXLINE( 441)			return ::borogove::EventResult_obj::EventUnhandled_dyn();
+HXLINE( 447)			bool _hx_tmp14;
+HXDLIN( 447)			if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
+HXLINE( 447)				_hx_tmp14 = (( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73));
+            			}
+            			else {
+HXLINE( 447)				_hx_tmp14 = false;
+            			}
+HXDLIN( 447)			if (_hx_tmp14) {
+HXLINE( 448)				 ::borogove::JID from2 = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
+HXLINE( 449)				 ::borogove::Client _gthis5 = _gthis;
+HXLINE( 450)				 ::borogove::Channel channel1 = ( ( ::borogove::Channel)(::Std_obj::downcast(_gthis5->getChat(from2->asBare()->asString()),::hx::ClassOf< ::borogove::Channel >())) );
+HXLINE( 451)				bool _hx_tmp15;
+HXDLIN( 451)				if (::hx::IsNotNull( channel1 )) {
+HXLINE( 451)					::String _hx_tmp16 = from2->asString();
+HXDLIN( 451)					_hx_tmp15 = (_hx_tmp16 == channel1->getFullJid()->asString());
+            				}
+            				else {
+HXLINE( 451)					_hx_tmp15 = false;
+            				}
+HXDLIN( 451)				if (_hx_tmp15) {
+HXLINE( 452)					::haxe::Log_obj::trace(HX_("Join failed",13,b3,f3,d3), ::Dynamic(::hx::Anon_obj::Create(5)
+            						->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Client",18,dc,e6,c0))
+            						->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(2)->init(0,channel1->chatId)->init(1,stanza))
+            						->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("new",60,d0,53,00))
+            						->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Client.hx",85,7d,15,8e))
+            						->setFixed(4,HX_("lineNumber",dd,81,22,76),452)));
+HXLINE( 453)					channel1->joinFailed = stanza;
+HXLINE( 454)					_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,channel1));
+            				}
+            			}
+HXLINE( 458)			return ::borogove::EventResult_obj::EventUnhandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_59_new)
-HXLINE(1529)		this->queriesToSend = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1528)		this->lazyQueryTimer = null();
-HXLINE(1166)		this->enabledPushData = null();
-HXLINE( 114)		this->inSync = false;
-HXLINE( 102)		this->encryptionPolicy =  ::borogove::EncryptionPolicy_obj::__alloc( HX_CTX ,true,true,true);
-HXLINE( 100)		this->brokenAvatars =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(  99)		this->pendingCaps =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(  98)		this->fastCount = null();
-HXLINE(  97)		this->token = null();
-HXLINE(  96)		this->fastMechanism = null();
-HXLINE(  69)		this->caps =  ::borogove::Caps_obj::__alloc( HX_CTX ,HX_("https://borogove.dev",57,2d,84,ed),::Array_obj< ::Dynamic>::__new(0),::Array_obj< ::String >::fromData( _hx_array_data_c0e6dc18_33,14),::Array_obj< ::Dynamic>::__new(0),null());
-HXLINE(  67)		this->chats = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(  63)		this->sendAvailable = true;
-HXLINE( 122)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 123)		bool _hx_tmp;
-HXDLIN( 123)		if (::hx::IsNotNull( accountId )) {
-HXLINE( 123)			_hx_tmp = (accountId == HX_("",00,00,00,00));
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_62_new)
+HXLINE(1640)		this->queriesToSend = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1639)		this->lazyQueryTimer = null();
+HXLINE(1243)		this->enabledPushData = null();
+HXLINE( 125)		this->firstSync = true;
+HXLINE( 124)		this->inSync = false;
+HXLINE( 112)		this->encryptionPolicy =  ::borogove::EncryptionPolicy_obj::__alloc( HX_CTX ,true,true,true);
+HXLINE( 110)		this->brokenAvatars =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 109)		this->pendingCaps =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 108)		this->sortId = HX_("a ",9f,54,00,00);
+HXLINE( 107)		this->fastCount = null();
+HXLINE( 106)		this->token = null();
+HXLINE( 105)		this->fastMechanism = null();
+HXLINE(  76)		this->caps =  ::borogove::Caps_obj::__alloc( HX_CTX ,HX_("https://borogove.dev",57,2d,84,ed),::Array_obj< ::Dynamic>::__new(0),::Array_obj< ::String >::fromData( _hx_array_data_c0e6dc18_32,16),::Array_obj< ::Dynamic>::__new(0),null());
+HXLINE(  72)		this->chats = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  67)		this->sendAvailable = true;
+HXLINE( 133)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 134)		bool _hx_tmp;
+HXDLIN( 134)		if (::hx::IsNotNull( accountId )) {
+HXLINE( 134)			_hx_tmp = (accountId == HX_("",00,00,00,00));
             		}
             		else {
-HXLINE( 123)			_hx_tmp = true;
+HXLINE( 134)			_hx_tmp = true;
             		}
-HXDLIN( 123)		if (_hx_tmp) {
-HXLINE( 124)			HX_STACK_DO_THROW(HX_("accountId cannot be empty",f5,9e,fd,03));
+HXDLIN( 134)		if (_hx_tmp) {
+HXLINE( 135)			HX_STACK_DO_THROW(HX_("accountId cannot be empty",f5,9e,fd,03));
             		}
-HXLINE( 128)		 ::sys::thread::EventLoop mainLoop = ::sys::thread::_Thread::Thread_Impl__obj::get_events(::sys::thread::_Thread::HaxeThread_obj::current());
-HXLINE( 130)		::hx::TCast<  ::thenshim::fallback::FallbackPromiseFactory >::cast(::thenshim::_Promise::Promise_Impl__obj::factory)->scheduler->addNext = mainLoop->run_dyn();
-HXLINE( 132)		super::__construct();
-HXLINE( 133)		this->jid = ::borogove::JID_obj::parse(accountId);
-HXLINE( 134)		::String tmp = this->jid->node;
-HXDLIN( 134)		::String _hx_tmp1;
-HXDLIN( 134)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 134)			_hx_tmp1 = tmp;
+HXLINE( 139)		 ::sys::thread::EventLoop mainLoop = ::sys::thread::_Thread::Thread_Impl__obj::get_events(::sys::thread::_Thread::HaxeThread_obj::current());
+HXLINE( 141)		::hx::TCast<  ::thenshim::fallback::FallbackPromiseFactory >::cast(::thenshim::_Promise::Promise_Impl__obj::factory)->scheduler->addNext = mainLoop->run_dyn();
+HXLINE( 143)		super::__construct();
+HXLINE( 144)		this->capsRepo =  ::borogove::CapsRepo_obj::__alloc( HX_CTX ,persistence);
+HXLINE( 145)		this->jid = ::borogove::JID_obj::parse(accountId);
+HXLINE( 146)		::String tmp = this->jid->node;
+HXDLIN( 146)		::String _hx_tmp1;
+HXDLIN( 146)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 146)			_hx_tmp1 = tmp;
             		}
             		else {
-HXLINE( 134)			_hx_tmp1 = this->jid->asString();
-            		}
-HXDLIN( 134)		this->_displayName = _hx_tmp1;
-HXLINE( 135)		this->persistence = persistence;
-HXLINE( 139)		this->stream =  ::borogove::streams::XmppStropheStream_obj::__alloc( HX_CTX );
-HXLINE( 140)		this->stream->on(HX_("status/online",10,05,0e,d2),this->onConnected_dyn());
-HXLINE( 141)		this->stream->on(HX_("status/offline",c6,eb,eb,54), ::Dynamic(new _hx_Closure_0(_gthis)));
-HXLINE( 145)		this->stream->on(HX_("fast-token",48,5f,c2,26), ::Dynamic(new _hx_Closure_1(_gthis,persistence)));
-HXLINE( 151)		this->on(HX_("chats/update",3d,8e,1d,14), ::Dynamic(new _hx_Closure_2(_gthis)));
-HXLINE( 156)		this->stream->on(HX_("sm/update",1e,16,63,46), ::Dynamic(new _hx_Closure_3(_gthis,persistence)));
-HXLINE( 161)		this->stream->on(HX_("sm/ack",14,b2,12,dd), ::Dynamic(new _hx_Closure_6(_gthis,persistence)));
-HXLINE( 171)		this->stream->on(HX_("sm/fail",b3,aa,95,96), ::Dynamic(new _hx_Closure_9(_gthis,persistence)));
-HXLINE( 181)		this->stream->on(HX_("message",c7,35,11,9a), ::Dynamic(new _hx_Closure_10(_gthis)));
-HXLINE( 214)		this->stream->onIq(::borogove::IqRequestType_obj::Set_dyn(),HX_("jingle",31,27,eb,1f),HX_("urn:xmpp:jingle:1",44,c4,fe,f7), ::Dynamic(new _hx_Closure_11(_gthis)));
-HXLINE( 266)		this->stream->onIq(::borogove::IqRequestType_obj::Get_dyn(),HX_("query",08,8b,ea,5d),HX_("http://jabber.org/protocol/disco#info",cb,2b,7f,0b), ::Dynamic(new _hx_Closure_12(_gthis)));
-HXLINE( 270)		this->stream->onIq(::borogove::IqRequestType_obj::Set_dyn(),HX_("query",08,8b,ea,5d),HX_("jabber:iq:roster",47,76,6e,06), ::Dynamic(new _hx_Closure_13(_gthis,persistence)));
-HXLINE( 297)		this->stream->onIq(::borogove::IqRequestType_obj::Set_dyn(),HX_("block",4d,75,fc,b4),HX_("urn:xmpp:blocking",d1,a1,46,c3), ::Dynamic(new _hx_Closure_14(_gthis)));
-HXLINE( 312)		this->stream->onIq(::borogove::IqRequestType_obj::Set_dyn(),HX_("unblock",54,6c,8d,b1),HX_("urn:xmpp:blocking",d1,a1,46,c3), ::Dynamic(new _hx_Closure_15(_gthis)));
-HXLINE( 335)		this->stream->on(HX_("presence",3b,52,d7,66), ::Dynamic(new _hx_Closure_25(_gthis,persistence)));
+HXLINE( 146)			_hx_tmp1 = this->jid->asString();
+            		}
+HXDLIN( 146)		this->_displayName = _hx_tmp1;
+HXLINE( 147)		this->persistence = persistence;
+HXLINE( 151)		this->stream =  ::borogove::streams::XmppStropheStream_obj::__alloc( HX_CTX );
+HXLINE( 152)		this->stream->on(HX_("status/online",10,05,0e,d2),this->onConnected_dyn());
+HXLINE( 153)		this->stream->on(HX_("status/offline",c6,eb,eb,54), ::Dynamic(new _hx_Closure_0(_gthis)));
+HXLINE( 157)		this->stream->on(HX_("fast-token",48,5f,c2,26), ::Dynamic(new _hx_Closure_1(_gthis,persistence)));
+HXLINE( 163)		this->on(HX_("chats/update",3d,8e,1d,14), ::Dynamic(new _hx_Closure_2(_gthis)));
+HXLINE( 168)		this->stream->on(HX_("sm/update",1e,16,63,46), ::Dynamic(new _hx_Closure_3(_gthis,persistence)));
+HXLINE( 173)		this->stream->on(HX_("sm/ack",14,b2,12,dd), ::Dynamic(new _hx_Closure_6(_gthis,persistence)));
+HXLINE( 183)		this->stream->on(HX_("sm/fail",b3,aa,95,96), ::Dynamic(new _hx_Closure_9(_gthis,persistence)));
+HXLINE( 193)		this->stream->on(HX_("message",c7,35,11,9a), ::Dynamic(new _hx_Closure_10(_gthis)));
+HXLINE( 226)		this->stream->onIq(::borogove::IqRequestType_obj::Set_dyn(),HX_("jingle",31,27,eb,1f),HX_("urn:xmpp:jingle:1",44,c4,fe,f7), ::Dynamic(new _hx_Closure_11(_gthis)));
+HXLINE( 278)		this->stream->onIq(::borogove::IqRequestType_obj::Get_dyn(),HX_("query",08,8b,ea,5d),HX_("http://jabber.org/protocol/disco#info",cb,2b,7f,0b), ::Dynamic(new _hx_Closure_12(_gthis)));
+HXLINE( 282)		this->stream->onIq(::borogove::IqRequestType_obj::Set_dyn(),HX_("query",08,8b,ea,5d),HX_("jabber:iq:roster",47,76,6e,06), ::Dynamic(new _hx_Closure_13(_gthis,persistence)));
+HXLINE( 309)		this->stream->onIq(::borogove::IqRequestType_obj::Set_dyn(),HX_("block",4d,75,fc,b4),HX_("urn:xmpp:blocking",d1,a1,46,c3), ::Dynamic(new _hx_Closure_14(_gthis)));
+HXLINE( 324)		this->stream->onIq(::borogove::IqRequestType_obj::Set_dyn(),HX_("unblock",54,6c,8d,b1),HX_("urn:xmpp:blocking",d1,a1,46,c3), ::Dynamic(new _hx_Closure_15(_gthis)));
+HXLINE( 347)		this->stream->on(HX_("presence",3b,52,d7,66), ::Dynamic(new _hx_Closure_24(_gthis,persistence)));
             	}
 
 Dynamic Client_obj::__CreateEmpty() { return new Client_obj; }
@@ -1370,308 +1441,349 @@ bool Client_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 void Client_obj::set_sendAvailable__fromC(bool value){
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_409_set_sendAvailable__fromC)
-HXDLIN( 409)		this->sendAvailable = value;
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_437_set_sendAvailable__fromC)
+HXDLIN( 437)		this->sendAvailable = value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Client_obj,set_sendAvailable__fromC,(void))
 
 void Client_obj::processLiveMessage( ::borogove::Stanza stanza, ::borogove::Stanza fwd, ::borogove::EncryptionInfo encryptionInfo){
-            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis) HXARGC(2)
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis,::Array< ::Dynamic>,newChat) HXARGC(2)
             		 ::borogove::ChatMessageBuilder _hx_run( ::borogove::ChatMessageBuilder builder, ::borogove::Stanza stanza){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_455_processLiveMessage)
-HXLINE( 456)			 ::borogove::Client _gthis1 = _gthis;
-HXDLIN( 456)			 ::borogove::Chat chat = _gthis1->getChat(builder->chatId());
-HXLINE( 457)			bool message;
-HXDLIN( 457)			if (::hx::IsNull( chat )) {
-HXLINE( 457)				message = (( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) != HX_("groupchat",97,1d,c8,e5));
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_474_processLiveMessage)
+HXLINE( 475)			 ::borogove::Client _gthis1 = _gthis;
+HXDLIN( 475)			 ::borogove::Chat chat = _gthis1->getChat(builder->chatId());
+HXLINE( 476)			bool isNewChat = ::hx::IsNull( chat );
+HXLINE( 477)			bool message;
+HXDLIN( 477)			if (::hx::IsNull( chat )) {
+HXLINE( 477)				message = (( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) != HX_("groupchat",97,1d,c8,e5));
             			}
             			else {
-HXLINE( 457)				message = false;
+HXLINE( 477)				message = false;
+            			}
+HXDLIN( 477)			if (message) {
+HXLINE( 477)				 ::borogove::Client _gthis2 = _gthis;
+HXDLIN( 477)				chat = _gthis2->getDirectChat(builder->chatId(),false);
             			}
-HXDLIN( 457)			if (message) {
-HXLINE( 457)				 ::borogove::Client _gthis2 = _gthis;
-HXDLIN( 457)				chat = _gthis2->getDirectChat(builder->chatId(),null());
+HXLINE( 478)			if (isNewChat) {
+HXLINE( 478)				newChat[0] = chat;
             			}
-HXLINE( 458)			if (::hx::IsNull( chat )) {
-HXLINE( 458)				return builder;
+HXLINE( 479)			if (::hx::IsNull( chat )) {
+HXLINE( 479)				return builder;
             			}
-HXLINE( 459)			return chat->prepareIncomingMessage(builder,stanza);
+HXLINE( 480)			return chat->prepareIncomingMessage(builder,stanza);
             		}
             		HX_END_LOCAL_FUNC2(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_446_processLiveMessage)
-HXDLIN( 446)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 447)		 ::borogove::JID from;
-HXDLIN( 447)		if (::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
-HXLINE( 447)			from = null();
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_463_processLiveMessage)
+HXDLIN( 463)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 464)		 ::borogove::JID from;
+HXDLIN( 464)		if (::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
+HXLINE( 464)			from = null();
             		}
             		else {
-HXLINE( 447)			from = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
+HXLINE( 464)			from = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
             		}
-HXLINE( 449)		bool _hx_tmp;
-HXDLIN( 449)		if ((( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
-HXLINE( 449)			_hx_tmp = ::hx::IsNotNull( from );
+HXLINE( 466)		bool _hx_tmp;
+HXDLIN( 466)		if ((( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
+HXLINE( 466)			_hx_tmp = ::hx::IsNotNull( from );
             		}
             		else {
-HXLINE( 449)			_hx_tmp = false;
+HXLINE( 466)			_hx_tmp = false;
             		}
-HXDLIN( 449)		if (_hx_tmp) {
-HXLINE( 451)			 ::borogove::Channel channel = ( ( ::borogove::Channel)(::Std_obj::downcast(this->getChat(from->asBare()->asString()),::hx::ClassOf< ::borogove::Channel >())) );
-HXLINE( 452)			if (::hx::IsNotNull( channel )) {
-HXLINE( 452)				channel->selfPing(true);
+HXDLIN( 466)		if (_hx_tmp) {
+HXLINE( 468)			 ::borogove::Channel channel = ( ( ::borogove::Channel)(::Std_obj::downcast(this->getChat(from->asBare()->asString()),::hx::ClassOf< ::borogove::Channel >())) );
+HXLINE( 469)			if (::hx::IsNotNull( channel )) {
+HXLINE( 469)				channel->selfPing(true);
             			}
             		}
-HXLINE( 455)		 ::borogove::Message message = ::borogove::Message_obj::fromStanza(stanza,this->jid, ::Dynamic(new _hx_Closure_0(_gthis)),encryptionInfo);
-HXLINE( 462)		{
-HXLINE( 462)			 ::borogove::MessageStanza _g = message->parsed;
-HXDLIN( 462)			switch((int)(_g->_hx_getIndex())){
+HXLINE( 472)		::Array< ::Dynamic> newChat = ::Array_obj< ::Dynamic>::__new(1)->init(0,null());
+HXLINE( 474)		 ::borogove::Message message = ::borogove::Message_obj::fromStanza(stanza,this->jid, ::Dynamic(new _hx_Closure_0(_gthis,newChat)),encryptionInfo,null());
+HXLINE( 483)		{
+HXLINE( 483)			 ::borogove::MessageStanza _g = message->parsed;
+HXDLIN( 483)			switch((int)(_g->_hx_getIndex())){
             				case (int)0: {
             					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::Client,_gthis) HXARGC(1)
             					void _hx_run( ::borogove::ChatMessage m){
-            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_496_processLiveMessage)
-HXLINE( 496)						_gthis->notifyMessageHandlers(m,3);
+            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_527_processLiveMessage)
+HXLINE( 527)						_gthis->notifyMessageHandlers(m,3);
             					}
             					HX_END_LOCAL_FUNC1((void))
 
             					HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(1)
             					::Dynamic _hx_run( ::Dynamic _){
-            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_496_processLiveMessage)
-HXLINE( 496)						return null();
+            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_527_processLiveMessage)
+HXLINE( 527)						return null();
             					}
             					HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 491)					::Dynamic _hx_tmp1 = this->persistence;
-HXLINE( 492)					::String _hx_tmp2 = this->accountId();
-HXLINE( 491)					::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::updateMessageStatus(_hx_tmp1,_hx_tmp2,_g->_hx_getString(0),3,_g->_hx_getObject(1).StaticCast<  ::borogove::Stanza >()->getErrorText()), ::Dynamic(new _hx_Closure_1(_gthis)), ::Dynamic(new _hx_Closure_2()));
+HXLINE( 522)					::Dynamic _hx_tmp1 = this->persistence;
+HXLINE( 523)					::String _hx_tmp2 = this->accountId();
+HXLINE( 522)					::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::updateMessageStatus(_hx_tmp1,_hx_tmp2,_g->_hx_getString(0),3,_g->_hx_getObject(1).StaticCast<  ::borogove::Stanza >()->getErrorText()), ::Dynamic(new _hx_Closure_1(_gthis)), ::Dynamic(new _hx_Closure_2()));
+HXLINE( 528)					if (::hx::IsNotNull( newChat->__get(0).StaticCast<  ::borogove::Chat >() )) {
+HXLINE( 528)						this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,newChat->__get(0).StaticCast<  ::borogove::Chat >()));
+            					}
             				}
             				break;
             				case (int)1: {
-HXLINE( 463)					 ::borogove::ChatMessage _g1 = _g->_hx_getObject(0).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 463)					{
-HXLINE( 464)						{
-HXLINE( 464)							int _g2 = 0;
-HXDLIN( 464)							::Array< ::Dynamic> _g3 = _g1->inlineHashReferences();
-HXDLIN( 464)							while((_g2 < _g3->length)){
-HXLINE( 464)								 ::borogove::Hash hash = _g3->__get(_g2).StaticCast<  ::borogove::Hash >();
-HXDLIN( 464)								_g2 = (_g2 + 1);
-HXLINE( 465)								this->fetchMediaByHash(::Array_obj< ::Dynamic>::__new(1)->init(0,hash),::Array_obj< ::Dynamic>::__new(1)->init(0,_g1->from));
+HXLINE( 484)					 ::borogove::ChatMessage _g1 = _g->_hx_getObject(0).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN( 484)					{
+HXLINE( 485)						{
+HXLINE( 485)							int _g2 = 0;
+HXDLIN( 485)							::Array< ::Dynamic> _g3 = _g1->inlineHashReferences();
+HXDLIN( 485)							while((_g2 < _g3->length)){
+HXLINE( 485)								 ::borogove::Hash hash = _g3->__get(_g2).StaticCast<  ::borogove::Hash >();
+HXDLIN( 485)								_g2 = (_g2 + 1);
+HXLINE( 486)								this->fetchMediaByHash(::Array_obj< ::Dynamic>::__new(1)->init(0,hash),::Array_obj< ::Dynamic>::__new(1)->init(0,_g1->from));
             							}
             						}
-HXLINE( 467)						 ::borogove::Chat chat = this->getChat(_g1->chatId());
-HXLINE( 468)						if (::hx::IsNotNull( chat )) {
-            							HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_3, ::borogove::Client,_gthis, ::borogove::Chat,chat) HXARGC(1)
-            							void _hx_run( ::borogove::ChatMessage chatMessage){
-            								HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_469_processLiveMessage)
-HXLINE( 470)								int updateChat;
-HXDLIN( 470)								if ((chatMessage->versions->length > 1)) {
-HXLINE( 470)									updateChat = 1;
+HXLINE( 488)						 ::borogove::Chat chat = this->getChat(_g1->chatId());
+HXLINE( 489)						if (::hx::IsNotNull( chat )) {
+            							HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_4, ::borogove::Client,_gthis, ::borogove::Chat,chat,::Array< ::Dynamic>,newChat) HXARGC(1)
+            							::Dynamic _hx_run( ::borogove::ChatMessage chatMessage){
+            								HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_3,int,eventType, ::borogove::Client,_gthis, ::borogove::Chat,chat, ::borogove::ChatMessage,chatMessage,::Array< ::Dynamic>,newChat) HXARGC(1)
+            								void _hx_run( ::Dynamic _){
+            									HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_495_processLiveMessage)
+HXLINE( 496)									_gthis->notifyMessageHandlers(chatMessage,eventType);
+HXLINE( 498)									if ((eventType == 0)) {
+HXLINE( 499)										 ::borogove::Chat chat1 = chat;
+HXDLIN( 499)										int updateChat;
+HXDLIN( 499)										if (chatMessage->isIncoming()) {
+HXLINE( 499)											updateChat = (chat->unreadCount() + 1);
+            										}
+            										else {
+HXLINE( 499)											updateChat = 0;
+            										}
+HXDLIN( 499)										chat1->setUnreadCount(updateChat);
+HXLINE( 500)										_gthis->chatActivity(chat,null());
+            									}
+            									else {
+HXLINE( 501)										if (::hx::IsNotNull( newChat->__get(0).StaticCast<  ::borogove::Chat >() )) {
+HXLINE( 502)											_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,newChat->__get(0).StaticCast<  ::borogove::Chat >()));
+            										}
+            									}
+            								}
+            								HX_END_LOCAL_FUNC1((void))
+
+            								HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_490_processLiveMessage)
+HXLINE( 491)								int eventType;
+HXDLIN( 491)								if ((chatMessage->versions->length > 1)) {
+HXLINE( 491)									eventType = 1;
             								}
             								else {
-HXLINE( 470)									updateChat = 0;
+HXLINE( 491)									eventType = 0;
             								}
-HXDLIN( 470)								_gthis->notifyMessageHandlers(chatMessage,updateChat);
-HXLINE( 471)								bool updateChat1;
-HXDLIN( 471)								bool updateChat2;
-HXDLIN( 471)								if ((chatMessage->versions->length >= 1)) {
-HXLINE( 471)									::String updateChat3 = chat->lastMessageId();
-HXDLIN( 471)									updateChat2 = (updateChat3 == chatMessage->serverId);
+HXLINE( 492)								::Dynamic updateChat;
+HXDLIN( 492)								bool updateChat1;
+HXDLIN( 492)								bool updateChat2;
+HXDLIN( 492)								if (::hx::IsNotNull( chat->lastMessage )) {
+HXLINE( 492)									updateChat2 = (eventType == 0);
             								}
             								else {
-HXLINE( 471)									updateChat2 = true;
+HXLINE( 492)									updateChat2 = true;
             								}
-HXDLIN( 471)								if (!(updateChat2)) {
-HXLINE( 471)									::String updateChat4 = chat->lastMessageId();
-HXDLIN( 471)									updateChat1 = (updateChat4 == chatMessage->localId);
+HXDLIN( 492)								if (!(updateChat2)) {
+HXLINE( 492)									updateChat1 = chatMessage->canReplace(chat->lastMessage);
             								}
             								else {
-HXLINE( 471)									updateChat1 = true;
+HXLINE( 492)									updateChat1 = true;
             								}
-HXDLIN( 471)								if (updateChat1) {
-HXLINE( 472)									chat->setLastMessage(chatMessage);
-HXLINE( 473)									if ((chatMessage->versions->length < 1)) {
-HXLINE( 473)										 ::borogove::Chat chat1 = chat;
-HXDLIN( 473)										int updateChat5;
-HXDLIN( 473)										if (chatMessage->isIncoming()) {
-HXLINE( 473)											updateChat5 = (chat->unreadCount() + 1);
-            										}
-            										else {
-HXLINE( 473)											updateChat5 = 0;
-            										}
-HXDLIN( 473)										chat1->setUnreadCount(updateChat5);
-            									}
-HXLINE( 474)									_gthis->chatActivity(chat,null());
+HXDLIN( 492)								if (updateChat1) {
+HXLINE( 492)									updateChat = chat->setLastMessage(chatMessage);
+            								}
+            								else {
+HXLINE( 492)									updateChat = ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             								}
+HXDLIN( 492)								return ::thenshim::_Promise::Promise_Impl__obj::then(updateChat, ::Dynamic(new _hx_Closure_3(eventType,_gthis,chat,chatMessage,newChat)),null());
             							}
-            							HX_END_LOCAL_FUNC1((void))
+            							HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 469)							 ::Dynamic updateChat =  ::Dynamic(new _hx_Closure_3(_gthis,chat));
-HXLINE( 477)							if (::hx::IsNull( _g1->serverId )) {
-HXLINE( 478)								updateChat(_g1);
+HXLINE( 490)							 ::Dynamic updateChat =  ::Dynamic(new _hx_Closure_4(_gthis,chat,newChat));
+HXLINE( 506)							if (::hx::IsNull( _g1->serverId )) {
+HXLINE( 507)								updateChat(_g1);
             							}
             							else {
-            								HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_4, ::Dynamic,updateChat) HXARGC(1)
-            								void _hx_run(::Array< ::Dynamic> stored){
-            									HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_480_processLiveMessage)
-HXLINE( 480)									updateChat(stored->__get(0).StaticCast<  ::borogove::ChatMessage >());
+            								HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_5, ::Dynamic,updateChat) HXARGC(1)
+            								::Dynamic _hx_run(::Array< ::Dynamic> stored){
+            									HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_509_processLiveMessage)
+HXLINE( 509)									return updateChat(stored->__get(0).StaticCast<  ::borogove::ChatMessage >());
             								}
-            								HX_END_LOCAL_FUNC1((void))
+            								HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 480)								::thenshim::_Promise::Promise_Impl__obj::then(this->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,_g1)), ::Dynamic(new _hx_Closure_4(updateChat)),null());
+HXLINE( 509)								::thenshim::_Promise::Promise_Impl__obj::then(this->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,_g1)), ::Dynamic(new _hx_Closure_5(updateChat)),null());
             							}
             						}
             					}
             				}
             				break;
             				case (int)2: {
-            					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_5, ::borogove::Client,_gthis) HXARGC(1)
+HXLINE( 532)					 ::borogove::Chat tmp = this->getChat(message->chatId);
+HXDLIN( 532)					if (::hx::IsNotNull( tmp )) {
+HXLINE( 532)						tmp->setThreadSubject(message->threadId,_g->_hx_getString(0));
+            					}
+            				}
+            				break;
+            				case (int)3: {
+            					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_6, ::borogove::Client,_gthis) HXARGC(1)
             					void _hx_run( ::borogove::ChatMessage stored){
-            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_489_processLiveMessage)
-HXLINE( 489)						if (::hx::IsNotNull( stored )) {
-HXLINE( 489)							_gthis->notifyMessageHandlers(stored,1);
+            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_519_processLiveMessage)
+HXLINE( 519)						if (::hx::IsNotNull( stored )) {
+HXLINE( 519)							_gthis->notifyMessageHandlers(stored,1);
             						}
             					}
             					HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 489)					::thenshim::_Promise::Promise_Impl__obj::then(this->moderateMessage(_g->_hx_getObject(0).StaticCast<  ::borogove::ModerationAction >()), ::Dynamic(new _hx_Closure_5(_gthis)),null());
+HXLINE( 519)					::thenshim::_Promise::Promise_Impl__obj::then(this->moderateMessage(_g->_hx_getObject(0).StaticCast<  ::borogove::ModerationAction >()), ::Dynamic(new _hx_Closure_6(_gthis)),null());
+HXLINE( 520)					if (::hx::IsNotNull( newChat->__get(0).StaticCast<  ::borogove::Chat >() )) {
+HXLINE( 520)						this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,newChat->__get(0).StaticCast<  ::borogove::Chat >()));
+            					}
             				}
             				break;
-            				case (int)3: {
-HXLINE( 483)					 ::borogove::ReactionUpdate _g4 = _g->_hx_getObject(0).StaticCast<  ::borogove::ReactionUpdate >();
-HXDLIN( 483)					{
-            						HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_6, ::borogove::Client,_gthis) HXARGC(1)
+            				case (int)4: {
+HXLINE( 512)					 ::borogove::ReactionUpdate _g4 = _g->_hx_getObject(0).StaticCast<  ::borogove::ReactionUpdate >();
+HXDLIN( 512)					{
+            						HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_7, ::borogove::Client,_gthis) HXARGC(1)
             						void _hx_run( ::borogove::ChatMessage stored){
-            							HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_487_processLiveMessage)
-HXLINE( 487)							if (::hx::IsNotNull( stored )) {
-HXLINE( 487)								_gthis->notifyMessageHandlers(stored,2);
+            							HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_516_processLiveMessage)
+HXLINE( 516)							if (::hx::IsNotNull( stored )) {
+HXLINE( 516)								_gthis->notifyMessageHandlers(stored,2);
             							}
             						}
             						HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 484)						{
-HXLINE( 484)							int _g5 = 0;
-HXDLIN( 484)							::Array< ::Dynamic> _g6 = _g4->inlineHashReferences();
-HXDLIN( 484)							while((_g5 < _g6->length)){
-HXLINE( 484)								 ::borogove::Hash hash1 = _g6->__get(_g5).StaticCast<  ::borogove::Hash >();
-HXDLIN( 484)								_g5 = (_g5 + 1);
-HXLINE( 485)								this->fetchMediaByHash(::Array_obj< ::Dynamic>::__new(1)->init(0,hash1),::Array_obj< ::Dynamic>::__new(1)->init(0,from));
+HXLINE( 513)						{
+HXLINE( 513)							int _g5 = 0;
+HXDLIN( 513)							::Array< ::Dynamic> _g6 = _g4->inlineHashReferences();
+HXDLIN( 513)							while((_g5 < _g6->length)){
+HXLINE( 513)								 ::borogove::Hash hash1 = _g6->__get(_g5).StaticCast<  ::borogove::Hash >();
+HXDLIN( 513)								_g5 = (_g5 + 1);
+HXLINE( 514)								this->fetchMediaByHash(::Array_obj< ::Dynamic>::__new(1)->init(0,hash1),::Array_obj< ::Dynamic>::__new(1)->init(0,from));
             							}
             						}
-HXLINE( 487)						::Dynamic _hx_tmp3 = this->persistence;
-HXDLIN( 487)						::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_hx_tmp3,this->accountId(),_g4), ::Dynamic(new _hx_Closure_6(_gthis)),null());
+HXLINE( 516)						::Dynamic _hx_tmp3 = this->persistence;
+HXDLIN( 516)						::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_hx_tmp3,this->accountId(),_g4), ::Dynamic(new _hx_Closure_7(_gthis)),null());
+HXLINE( 517)						if (::hx::IsNotNull( newChat->__get(0).StaticCast<  ::borogove::Chat >() )) {
+HXLINE( 517)							this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,newChat->__get(0).StaticCast<  ::borogove::Chat >()));
+            						}
             					}
             				}
             				break;
-            				case (int)4: {
-HXLINE( 498)					::String message1 = message->chatId;
-HXDLIN( 498)					 ::borogove::Chat _hx_tmp4 = this->getChat(message->chatId);
-HXDLIN( 498)					this->mucInvite(message1,_hx_tmp4,message->senderId,message->threadId,_g->_hx_getString(0),_g->_hx_getString(1),_g->_hx_getString(2),_g->_hx_getString(3));
+            				case (int)5: {
+HXLINE( 530)					::String message1 = message->chatId;
+HXDLIN( 530)					 ::borogove::Chat _hx_tmp4 = this->getChat(message->chatId);
+HXDLIN( 530)					this->mucInvite(message1,_hx_tmp4,message->senderId,message->threadId,_g->_hx_getString(0),_g->_hx_getString(1),_g->_hx_getString(2),_g->_hx_getString(3));
             				}
             				break;
             				default:{
-HXLINE( 501)					 ::Dynamic _hx_tmp5 = ::haxe::Log_obj::trace;
-HXDLIN( 501)					::String _hx_tmp6 = (HX_("Ignoring non-chat message: ",f6,a5,6f,ca) + stanza->toString());
-HXDLIN( 501)					_hx_tmp5(_hx_tmp6,::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),501,HX_("borogove.Client",18,dc,e6,c0),HX_("processLiveMessage",0c,f2,77,58)));
+HXLINE( 535)					 ::Dynamic _hx_tmp5 = ::haxe::Log_obj::trace;
+HXDLIN( 535)					::String _hx_tmp6 = (HX_("Ignoring non-chat message: ",f6,a5,6f,ca) + stanza->toString());
+HXDLIN( 535)					_hx_tmp5(_hx_tmp6,::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),535,HX_("borogove.Client",18,dc,e6,c0),HX_("processLiveMessage",0c,f2,77,58)));
+HXLINE( 536)					if (::hx::IsNotNull( newChat->__get(0).StaticCast<  ::borogove::Chat >() )) {
+HXLINE( 536)						this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,newChat->__get(0).StaticCast<  ::borogove::Chat >()));
+            					}
             				}
             			}
             		}
-HXLINE( 505)		 ::borogove::Stanza jmiP = stanza->getChild(HX_("propose",fe,fe,e9,f9),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
-HXLINE( 506)		bool _hx_tmp7;
-HXDLIN( 506)		if (::hx::IsNotNull( jmiP )) {
-HXLINE( 506)			_hx_tmp7 = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(jmiP->attr,HX_("id",db,5b,00,00))) ) );
+HXLINE( 539)		if ((( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
+HXLINE( 539)			return;
+            		}
+HXLINE( 542)		 ::borogove::Stanza jmiP = stanza->getChild(HX_("propose",fe,fe,e9,f9),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
+HXLINE( 543)		bool _hx_tmp7;
+HXDLIN( 543)		if (::hx::IsNotNull( jmiP )) {
+HXLINE( 543)			_hx_tmp7 = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(jmiP->attr,HX_("id",db,5b,00,00))) ) );
             		}
             		else {
-HXLINE( 506)			_hx_tmp7 = false;
+HXLINE( 543)			_hx_tmp7 = false;
             		}
-HXDLIN( 506)		if (_hx_tmp7) {
-HXLINE( 507)			 ::borogove::calls::IncomingProposedSession session =  ::borogove::calls::IncomingProposedSession_obj::__alloc( HX_CTX ,::hx::ObjectPtr<OBJ_>(this),from,( (::String)(::Reflect_obj::field(jmiP->attr,HX_("id",db,5b,00,00))) ));
-HXLINE( 508)			 ::borogove::DirectChat chat1 = this->getDirectChat(from->asBare()->asString(),null());
-HXLINE( 509)			::Dynamic this1 = chat1->jingleSessions;
-HXDLIN( 509)			if (!(( ( ::haxe::ds::StringMap)(this1) )->exists(session->get_sid()))) {
-HXLINE( 510)				{
-HXLINE( 510)					::Dynamic this2 = chat1->jingleSessions;
-HXDLIN( 510)					( ( ::haxe::ds::StringMap)(this2) )->set(session->get_sid(),session);
+HXDLIN( 543)		if (_hx_tmp7) {
+HXLINE( 544)			 ::borogove::calls::IncomingProposedSession session =  ::borogove::calls::IncomingProposedSession_obj::__alloc( HX_CTX ,::hx::ObjectPtr<OBJ_>(this),from,( (::String)(::Reflect_obj::field(jmiP->attr,HX_("id",db,5b,00,00))) ));
+HXLINE( 545)			 ::borogove::DirectChat chat1 = this->getDirectChat(from->asBare()->asString(),null());
+HXLINE( 546)			::Dynamic this1 = chat1->jingleSessions;
+HXDLIN( 546)			if (!(( ( ::haxe::ds::StringMap)(this1) )->exists(session->get_sid()))) {
+HXLINE( 547)				{
+HXLINE( 547)					::Dynamic this2 = chat1->jingleSessions;
+HXDLIN( 547)					( ( ::haxe::ds::StringMap)(this2) )->set(session->get_sid(),session);
             				}
-HXLINE( 511)				this->chatActivity(chat1,null());
-HXLINE( 512)				session->ring();
+HXLINE( 548)				this->chatActivity(chat1,null());
+HXLINE( 549)				session->ring();
             			}
             		}
-HXLINE( 516)		 ::borogove::Stanza jmiR = stanza->getChild(HX_("retract",01,e2,b9,fc),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
-HXLINE( 517)		bool _hx_tmp8;
-HXDLIN( 517)		if (::hx::IsNotNull( jmiR )) {
-HXLINE( 517)			_hx_tmp8 = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(jmiR->attr,HX_("id",db,5b,00,00))) ) );
+HXLINE( 553)		 ::borogove::Stanza jmiR = stanza->getChild(HX_("retract",01,e2,b9,fc),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
+HXLINE( 554)		bool _hx_tmp8;
+HXDLIN( 554)		if (::hx::IsNotNull( jmiR )) {
+HXLINE( 554)			_hx_tmp8 = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(jmiR->attr,HX_("id",db,5b,00,00))) ) );
             		}
             		else {
-HXLINE( 517)			_hx_tmp8 = false;
+HXLINE( 554)			_hx_tmp8 = false;
             		}
-HXDLIN( 517)		if (_hx_tmp8) {
-HXLINE( 518)			 ::borogove::DirectChat chat2 = this->getDirectChat(from->asBare()->asString(),null());
-HXLINE( 519)			::Dynamic this3 = chat2->jingleSessions;
-HXDLIN( 519)			::Dynamic session1 = ( ( ::haxe::ds::StringMap)(this3) )->get(( (::String)(::Reflect_obj::field(jmiR->attr,HX_("id",db,5b,00,00))) ));
-HXLINE( 520)			if (::hx::IsNotNull( session1 )) {
-HXLINE( 521)				::borogove::calls::Session_obj::retract(session1);
-HXLINE( 522)				{
-HXLINE( 522)					::Dynamic this4 = chat2->jingleSessions;
-HXDLIN( 522)					( ( ::haxe::ds::StringMap)(this4) )->remove(::borogove::calls::Session_obj::get_sid(session1));
+HXDLIN( 554)		if (_hx_tmp8) {
+HXLINE( 555)			 ::borogove::DirectChat chat2 = this->getDirectChat(from->asBare()->asString(),null());
+HXLINE( 556)			::Dynamic this3 = chat2->jingleSessions;
+HXDLIN( 556)			::Dynamic session1 = ( ( ::haxe::ds::StringMap)(this3) )->get(( (::String)(::Reflect_obj::field(jmiR->attr,HX_("id",db,5b,00,00))) ));
+HXLINE( 557)			if (::hx::IsNotNull( session1 )) {
+HXLINE( 558)				::borogove::calls::Session_obj::retract(session1);
+HXLINE( 559)				{
+HXLINE( 559)					::Dynamic this4 = chat2->jingleSessions;
+HXDLIN( 559)					( ( ::haxe::ds::StringMap)(this4) )->remove(::borogove::calls::Session_obj::get_sid(session1));
             				}
             			}
             		}
-HXLINE( 527)		 ::borogove::Stanza jmiProFwd;
-HXDLIN( 527)		if (::hx::IsNotNull( fwd )) {
-HXLINE( 527)			jmiProFwd = fwd->getChild(HX_("proceed",2e,96,4a,f1),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
+HXLINE( 564)		 ::borogove::Stanza jmiProFwd;
+HXDLIN( 564)		if (::hx::IsNotNull( fwd )) {
+HXLINE( 564)			jmiProFwd = fwd->getChild(HX_("proceed",2e,96,4a,f1),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
             		}
             		else {
-HXLINE( 527)			jmiProFwd = null();
+HXLINE( 564)			jmiProFwd = null();
             		}
-HXLINE( 528)		bool _hx_tmp9;
-HXDLIN( 528)		if (::hx::IsNotNull( jmiProFwd )) {
-HXLINE( 528)			_hx_tmp9 = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(jmiProFwd->attr,HX_("id",db,5b,00,00))) ) );
+HXLINE( 565)		bool _hx_tmp9;
+HXDLIN( 565)		if (::hx::IsNotNull( jmiProFwd )) {
+HXLINE( 565)			_hx_tmp9 = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(jmiProFwd->attr,HX_("id",db,5b,00,00))) ) );
             		}
             		else {
-HXLINE( 528)			_hx_tmp9 = false;
+HXLINE( 565)			_hx_tmp9 = false;
             		}
-HXDLIN( 528)		if (_hx_tmp9) {
-HXLINE( 529)			 ::borogove::DirectChat chat3 = this->getDirectChat(::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(fwd->attr,HX_("to",7b,65,00,00))) ))->asBare()->asString(),null());
-HXLINE( 530)			::Dynamic this5 = chat3->jingleSessions;
-HXDLIN( 530)			::Dynamic session2 = ( ( ::haxe::ds::StringMap)(this5) )->get(( (::String)(::Reflect_obj::field(jmiProFwd->attr,HX_("id",db,5b,00,00))) ));
-HXLINE( 531)			if (::hx::IsNotNull( session2 )) {
-HXLINE( 532)				::borogove::calls::Session_obj::retract(session2);
-HXLINE( 533)				{
-HXLINE( 533)					::Dynamic this6 = chat3->jingleSessions;
-HXDLIN( 533)					( ( ::haxe::ds::StringMap)(this6) )->remove(::borogove::calls::Session_obj::get_sid(session2));
+HXDLIN( 565)		if (_hx_tmp9) {
+HXLINE( 566)			 ::borogove::DirectChat chat3 = this->getDirectChat(::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(fwd->attr,HX_("to",7b,65,00,00))) ))->asBare()->asString(),null());
+HXLINE( 567)			::Dynamic this5 = chat3->jingleSessions;
+HXDLIN( 567)			::Dynamic session2 = ( ( ::haxe::ds::StringMap)(this5) )->get(( (::String)(::Reflect_obj::field(jmiProFwd->attr,HX_("id",db,5b,00,00))) ));
+HXLINE( 568)			if (::hx::IsNotNull( session2 )) {
+HXLINE( 569)				::borogove::calls::Session_obj::retract(session2);
+HXLINE( 570)				{
+HXLINE( 570)					::Dynamic this6 = chat3->jingleSessions;
+HXDLIN( 570)					( ( ::haxe::ds::StringMap)(this6) )->remove(::borogove::calls::Session_obj::get_sid(session2));
             				}
             			}
             		}
-HXLINE( 537)		 ::borogove::Stanza jmiPro = stanza->getChild(HX_("proceed",2e,96,4a,f1),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
-HXLINE( 538)		bool _hx_tmp10;
-HXDLIN( 538)		if (::hx::IsNotNull( jmiPro )) {
-HXLINE( 538)			_hx_tmp10 = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(jmiPro->attr,HX_("id",db,5b,00,00))) ) );
+HXLINE( 574)		 ::borogove::Stanza jmiPro = stanza->getChild(HX_("proceed",2e,96,4a,f1),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
+HXLINE( 575)		bool _hx_tmp10;
+HXDLIN( 575)		if (::hx::IsNotNull( jmiPro )) {
+HXLINE( 575)			_hx_tmp10 = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(jmiPro->attr,HX_("id",db,5b,00,00))) ) );
             		}
             		else {
-HXLINE( 538)			_hx_tmp10 = false;
-            		}
-HXDLIN( 538)		if (_hx_tmp10) {
-HXLINE( 539)			 ::borogove::DirectChat chat4 = this->getDirectChat(from->asBare()->asString(),null());
-HXLINE( 540)			::Dynamic this7 = chat4->jingleSessions;
-HXDLIN( 540)			::Dynamic session3 = ( ( ::haxe::ds::StringMap)(this7) )->get(( (::String)(::Reflect_obj::field(jmiPro->attr,HX_("id",db,5b,00,00))) ));
-HXLINE( 541)			if (::hx::IsNotNull( session3 )) {
-HXLINE( 542)				try {
+HXLINE( 575)			_hx_tmp10 = false;
+            		}
+HXDLIN( 575)		if (_hx_tmp10) {
+HXLINE( 576)			 ::borogove::DirectChat chat4 = this->getDirectChat(from->asBare()->asString(),null());
+HXLINE( 577)			::Dynamic this7 = chat4->jingleSessions;
+HXDLIN( 577)			::Dynamic session3 = ( ( ::haxe::ds::StringMap)(this7) )->get(( (::String)(::Reflect_obj::field(jmiPro->attr,HX_("id",db,5b,00,00))) ));
+HXLINE( 578)			if (::hx::IsNotNull( session3 )) {
+HXLINE( 579)				try {
             					HX_STACK_CATCHABLE( ::Dynamic, 0);
-HXLINE( 543)					::Dynamic this8 = chat4->jingleSessions;
-HXDLIN( 543)					::String key = ::borogove::calls::Session_obj::get_sid(session3);
-HXDLIN( 543)					( ( ::haxe::ds::StringMap)(this8) )->set(key,::borogove::calls::Session_obj::initiate(session3,stanza));
+HXLINE( 580)					::Dynamic this8 = chat4->jingleSessions;
+HXDLIN( 580)					::String key = ::borogove::calls::Session_obj::get_sid(session3);
+HXDLIN( 580)					( ( ::haxe::ds::StringMap)(this8) )->set(key,::borogove::calls::Session_obj::initiate(session3,stanza));
             				} catch( ::Dynamic _hx_e) {
             					if (_hx_e.IsClass<  ::Dynamic >() ){
             						HX_STACK_BEGIN_CATCH
             						 ::Dynamic _g7 = _hx_e;
-HXLINE( 544)						 ::haxe::Exception _g8 = ::haxe::Exception_obj::caught(_g7);
-HXLINE( 545)						::haxe::Log_obj::trace(HX_("JMI proceed failed",29,32,fb,3c), ::Dynamic(::hx::Anon_obj::Create(5)
+HXLINE( 581)						 ::haxe::Exception _g8 = ::haxe::Exception_obj::caught(_g7);
+HXLINE( 582)						::haxe::Log_obj::trace(HX_("JMI proceed failed",29,32,fb,3c), ::Dynamic(::hx::Anon_obj::Create(5)
             							->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Client",18,dc,e6,c0))
             							->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,_g8))
             							->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("processLiveMessage",0c,f2,77,58))
             							->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Client.hx",85,7d,15,8e))
-            							->setFixed(4,HX_("lineNumber",dd,81,22,76),545)));
+            							->setFixed(4,HX_("lineNumber",dd,81,22,76),582)));
             					}
             					else {
             						HX_STACK_DO_THROW(_hx_e);
@@ -1679,289 +1791,446 @@ HXLINE( 545)						::haxe::Log_obj::trace(HX_("JMI proceed failed",29,32,fb,3c),
             				}
             			}
             		}
-HXLINE( 550)		 ::borogove::Stanza jmiRej = stanza->getChild(HX_("reject",5f,51,85,02),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
-HXLINE( 551)		bool _hx_tmp11;
-HXDLIN( 551)		if (::hx::IsNotNull( jmiRej )) {
-HXLINE( 551)			_hx_tmp11 = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(jmiRej->attr,HX_("id",db,5b,00,00))) ) );
+HXLINE( 587)		 ::borogove::Stanza jmiRej = stanza->getChild(HX_("reject",5f,51,85,02),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
+HXLINE( 588)		bool _hx_tmp11;
+HXDLIN( 588)		if (::hx::IsNotNull( jmiRej )) {
+HXLINE( 588)			_hx_tmp11 = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(jmiRej->attr,HX_("id",db,5b,00,00))) ) );
             		}
             		else {
-HXLINE( 551)			_hx_tmp11 = false;
+HXLINE( 588)			_hx_tmp11 = false;
             		}
-HXDLIN( 551)		if (_hx_tmp11) {
-HXLINE( 552)			 ::borogove::DirectChat chat5 = this->getDirectChat(from->asBare()->asString(),null());
-HXLINE( 553)			::Dynamic this9 = chat5->jingleSessions;
-HXDLIN( 553)			::Dynamic session4 = ( ( ::haxe::ds::StringMap)(this9) )->get(( (::String)(::Reflect_obj::field(jmiRej->attr,HX_("id",db,5b,00,00))) ));
-HXLINE( 554)			if (::hx::IsNotNull( session4 )) {
-HXLINE( 555)				::borogove::calls::Session_obj::retract(session4);
-HXLINE( 556)				{
-HXLINE( 556)					::Dynamic this10 = chat5->jingleSessions;
-HXDLIN( 556)					( ( ::haxe::ds::StringMap)(this10) )->remove(::borogove::calls::Session_obj::get_sid(session4));
+HXDLIN( 588)		if (_hx_tmp11) {
+HXLINE( 589)			 ::borogove::DirectChat chat5 = this->getDirectChat(from->asBare()->asString(),null());
+HXLINE( 590)			::Dynamic this9 = chat5->jingleSessions;
+HXDLIN( 590)			::Dynamic session4 = ( ( ::haxe::ds::StringMap)(this9) )->get(( (::String)(::Reflect_obj::field(jmiRej->attr,HX_("id",db,5b,00,00))) ));
+HXLINE( 591)			if (::hx::IsNotNull( session4 )) {
+HXLINE( 592)				::borogove::calls::Session_obj::retract(session4);
+HXLINE( 593)				{
+HXLINE( 593)					::Dynamic this10 = chat5->jingleSessions;
+HXDLIN( 593)					( ( ::haxe::ds::StringMap)(this10) )->remove(::borogove::calls::Session_obj::get_sid(session4));
             				}
             			}
             		}
-HXLINE( 561)		if ((( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) != HX_("error",c8,cb,29,73))) {
-HXLINE( 562)			 ::borogove::Stanza chatState = stanza->getChild(null(),HX_("http://jabber.org/protocol/chatstates",8e,6d,41,6d));
-HXLINE( 563)			 ::Dynamic userState;
-HXDLIN( 563)			::String _g9;
-HXDLIN( 563)			if (::hx::IsNotNull( chatState )) {
-HXLINE( 563)				_g9 = chatState->name;
+HXLINE( 598)		 ::borogove::Chat chat6 = this->getChat(from->asBare()->asString());
+HXLINE( 599)		 ::borogove::Stanza chatState = stanza->getChild(null(),HX_("http://jabber.org/protocol/chatstates",8e,6d,41,6d));
+HXLINE( 600)		 ::Dynamic userState;
+HXDLIN( 600)		::String _g9;
+HXDLIN( 600)		if (::hx::IsNotNull( chatState )) {
+HXLINE( 600)			_g9 = chatState->name;
+            		}
+            		else {
+HXLINE( 600)			_g9 = null();
+            		}
+HXDLIN( 600)		if (::hx::IsNull( _g9 )) {
+HXLINE( 600)			userState = null();
+            		}
+            		else {
+HXLINE( 600)			::String _hx_switch_0 = _g9;
+            			if (  (_hx_switch_0==HX_("active",c6,41,46,16)) ){
+HXLINE( 600)				userState = 2;
+HXDLIN( 600)				goto _hx_goto_36;
+            			}
+            			if (  (_hx_switch_0==HX_("composing",cf,0a,a5,12)) ){
+HXLINE( 600)				userState = 3;
+HXDLIN( 600)				goto _hx_goto_36;
+            			}
+            			if (  (_hx_switch_0==HX_("gone",5f,94,69,44)) ){
+HXLINE( 600)				userState = 0;
+HXDLIN( 600)				goto _hx_goto_36;
+            			}
+            			if (  (_hx_switch_0==HX_("inactive",6b,17,30,6a)) ){
+HXLINE( 600)				userState = 1;
+HXDLIN( 600)				goto _hx_goto_36;
+            			}
+            			if (  (_hx_switch_0==HX_("paused",ae,40,84,ef)) ){
+HXLINE( 600)				userState = 4;
+HXDLIN( 600)				goto _hx_goto_36;
+            			}
+            			/* default */{
+HXLINE( 600)				userState = null();
+            			}
+            			_hx_goto_36:;
+            		}
+HXLINE( 608)		if (::hx::IsNotNull( userState )) {
+HXLINE( 609)			if (::hx::IsNull( chat6 )) {
+            				HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_8, ::Dynamic,userState, ::borogove::Message,message, ::borogove::Client,_gthis) HXARGC(1)
+            				void _hx_run(::Array< ::Dynamic> members){
+            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_610_processLiveMessage)
+HXLINE( 611)					bool _hx_tmp;
+HXDLIN( 611)					if ((members->length > 0)) {
+HXLINE( 611)						_hx_tmp = members->__get(0).StaticCast<  ::borogove::Member >()->isSelf;
+            					}
+            					else {
+HXLINE( 611)						_hx_tmp = false;
+            					}
+HXDLIN( 611)					if (_hx_tmp) {
+HXLINE( 611)						return;
+            					}
+HXLINE( 613)					_gthis->trigger(HX_("chat-state/update",5c,7b,51,96), ::Dynamic(::hx::Anon_obj::Create(2)
+            						->setFixed(0,HX_("message",c7,35,11,9a),message)
+            						->setFixed(1,HX_("userState",c6,23,de,2d),userState)));
+            				}
+            				HX_END_LOCAL_FUNC1((void))
+
+HXLINE( 610)				::thenshim::_Promise::Promise_Impl__obj::then(chat6->getMemberDetails(::Array_obj< ::String >::__new(1)->init(0,message->senderId)), ::Dynamic(new _hx_Closure_8(userState,message,_gthis)),null());
             			}
-            			else {
-HXLINE( 563)				_g9 = null();
+            		}
+HXLINE( 618)		::String memberUpdates = this->accountId();
+HXDLIN( 618)		::Array< ::Dynamic> memberUpdates1 = ::borogove::MemberUpdate_obj::extractUpdates(memberUpdates,chat6,stanza);
+HXLINE( 619)		if ((memberUpdates1->length > 0)) {
+            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_9, ::borogove::Chat,chat6) HXARGC(1)
+            			void _hx_run(::Array< ::Dynamic> members){
+            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_638_processLiveMessage)
+HXLINE( 638)				if ((members->length > 0)) {
+HXLINE( 638)					chat6->trigger(HX_("members/update",bf,63,66,64),members);
+            				}
             			}
-HXDLIN( 563)			if (::hx::IsNull( _g9 )) {
-HXLINE( 563)				userState = null();
+            			HX_END_LOCAL_FUNC1((void))
+
+HXLINE( 620)			::haxe::Log_obj::trace(HX_("YYZZXX memberUpdates",90,f4,a1,1b), ::Dynamic(::hx::Anon_obj::Create(5)
+            				->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Client",18,dc,e6,c0))
+            				->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(2)->init(0,chat6->chatId)->init(1,memberUpdates1->length))
+            				->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("processLiveMessage",0c,f2,77,58))
+            				->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Client.hx",85,7d,15,8e))
+            				->setFixed(4,HX_("lineNumber",dd,81,22,76),620)));
+HXLINE( 621)			 ::borogove::Channel channel1 = ( ( ::borogove::Channel)(::borogove::_Util::Util_Fields__obj::downcast(chat6,::hx::ClassOf< ::borogove::Channel >())) );
+HXLINE( 622)			 ::borogove::Stanza mucUser = stanza->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
+HXLINE( 623)			bool isFullList = false;
+HXLINE( 624)			bool _hx_tmp12;
+HXDLIN( 624)			if (::hx::IsNotNull( channel1 )) {
+HXLINE( 624)				_hx_tmp12 = ::hx::IsNotNull( mucUser );
             			}
             			else {
-HXLINE( 563)				::String _hx_switch_0 = _g9;
-            				if (  (_hx_switch_0==HX_("active",c6,41,46,16)) ){
-HXLINE( 563)					userState = 2;
-HXDLIN( 563)					goto _hx_goto_37;
+HXLINE( 624)				_hx_tmp12 = false;
+            			}
+HXDLIN( 624)			if (_hx_tmp12) {
+HXLINE( 625)				 ::borogove::Stanza mav = mucUser->getChild(HX_("mav",a2,0a,53,00),HX_("urn:xmpp:muc:affiliations:1",75,28,1f,fe));
+HXLINE( 626)				bool _hx_tmp13;
+HXDLIN( 626)				if (::hx::IsNotNull( mav )) {
+HXLINE( 626)					_hx_tmp13 = ::hx::IsNull( ( (::String)(::Reflect_obj::field(mav->attr,HX_("since",ba,eb,cf,7c))) ) );
             				}
-            				if (  (_hx_switch_0==HX_("composing",cf,0a,a5,12)) ){
-HXLINE( 563)					userState = 3;
-HXDLIN( 563)					goto _hx_goto_37;
+            				else {
+HXLINE( 626)					_hx_tmp13 = false;
             				}
-            				if (  (_hx_switch_0==HX_("gone",5f,94,69,44)) ){
-HXLINE( 563)					userState = 0;
-HXDLIN( 563)					goto _hx_goto_37;
+HXDLIN( 626)				if (_hx_tmp13) {
+HXLINE( 627)					isFullList = true;
             				}
-            				if (  (_hx_switch_0==HX_("inactive",6b,17,30,6a)) ){
-HXLINE( 563)					userState = 1;
-HXDLIN( 563)					goto _hx_goto_37;
+            				else {
+HXLINE( 628)					bool _hx_tmp14;
+HXDLIN( 628)					if (::hx::IsNotNull( mav )) {
+HXLINE( 628)						::String _hx_tmp15 = ( (::String)(::Reflect_obj::field(mav->attr,HX_("since",ba,eb,cf,7c))) );
+HXDLIN( 628)						_hx_tmp14 = (_hx_tmp15 != channel1->mavUntil);
+            					}
+            					else {
+HXLINE( 628)						_hx_tmp14 = false;
+            					}
+HXDLIN( 628)					if (_hx_tmp14) {
+HXLINE( 629)						::haxe::Log_obj::trace(HX_("MAV update with unknown previous version",e6,80,1b,7e), ::Dynamic(::hx::Anon_obj::Create(5)
+            							->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Client",18,dc,e6,c0))
+            							->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(2)->init(0,channel1->mavUntil)->init(1,stanza))
+            							->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("processLiveMessage",0c,f2,77,58))
+            							->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Client.hx",85,7d,15,8e))
+            							->setFixed(4,HX_("lineNumber",dd,81,22,76),629)));
+            					}
             				}
-            				if (  (_hx_switch_0==HX_("paused",ae,40,84,ef)) ){
-HXLINE( 563)					userState = 4;
-HXDLIN( 563)					goto _hx_goto_37;
+HXLINE( 631)				::String channel2 = channel1->mavUntil;
+HXDLIN( 631)				 ::Dynamic tmp1;
+HXDLIN( 631)				if (::hx::IsNotNull( mav )) {
+HXLINE( 631)					tmp1 = mav->attr;
             				}
-            				/* default */{
-HXLINE( 563)					userState = null();
+            				else {
+HXLINE( 631)					tmp1 = null();
             				}
-            				_hx_goto_37:;
-            			}
-HXLINE( 571)			if (::hx::IsNotNull( userState )) {
-HXLINE( 572)				 ::borogove::Chat chat6 = this->getChat(from->asBare()->asString());
-HXLINE( 573)				bool _hx_tmp12;
-HXDLIN( 573)				if (::hx::IsNotNull( chat6 )) {
-HXLINE( 573)					_hx_tmp12 = !(chat6->getParticipantDetails(message->senderId)->isSelf);
+HXDLIN( 631)				::String _hx_tmp16;
+HXDLIN( 631)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 631)					_hx_tmp16 = ( (::String)(::Reflect_obj::field(tmp1,HX_("until",9e,b8,ef,a6))) );
             				}
             				else {
-HXLINE( 573)					_hx_tmp12 = true;
+HXLINE( 631)					_hx_tmp16 = null();
             				}
-HXDLIN( 573)				if (_hx_tmp12) {
-HXLINE( 574)					this->trigger(HX_("chat-state/update",5c,7b,51,96), ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("message",c7,35,11,9a),message)
-            						->setFixed(1,HX_("userState",c6,23,de,2d),userState)));
+HXDLIN( 631)				if ((channel2 != _hx_tmp16)) {
+HXLINE( 632)					 ::Dynamic tmp2;
+HXDLIN( 632)					if (::hx::IsNotNull( mav )) {
+HXLINE( 632)						tmp2 = mav->attr;
+            					}
+            					else {
+HXLINE( 632)						tmp2 = null();
+            					}
+HXDLIN( 632)					::String _hx_tmp17;
+HXDLIN( 632)					if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 632)						_hx_tmp17 = ( (::String)(::Reflect_obj::field(tmp2,HX_("until",9e,b8,ef,a6))) );
+            					}
+            					else {
+HXLINE( 632)						_hx_tmp17 = null();
+            					}
+HXDLIN( 632)					channel1->mavUntil = _hx_tmp17;
+HXLINE( 633)					::Dynamic _hx_tmp18 = this->persistence;
+HXDLIN( 633)					::borogove::Persistence_obj::storeChats(_hx_tmp18,this->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,channel1));
             				}
             			}
+HXLINE( 637)			::Dynamic _hx_tmp19 = this->persistence;
+HXDLIN( 637)			::String _hx_tmp20 = this->accountId();
+HXDLIN( 637)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMemberUpdates(_hx_tmp19,_hx_tmp20,chat6,memberUpdates1,isFullList), ::Dynamic(new _hx_Closure_9(chat6)),null());
             		}
-HXLINE( 579)		 ::borogove::PubsubEvent pubsubEvent = ::borogove::PubsubEvent_obj::fromStanza(stanza);
-HXLINE( 580)		bool _hx_tmp13;
-HXDLIN( 580)		bool _hx_tmp14;
-HXDLIN( 580)		bool _hx_tmp15;
-HXDLIN( 580)		if (::hx::IsNotNull( pubsubEvent )) {
-HXLINE( 580)			_hx_tmp15 = ::hx::IsNotNull( pubsubEvent->getFrom() );
+HXLINE( 642)		this->checkForReceipts(stanza);
+HXLINE( 644)		 ::borogove::PubsubEvent pubsubEvent = ::borogove::PubsubEvent_obj::fromStanza(stanza);
+HXLINE( 645)		bool _hx_tmp21;
+HXDLIN( 645)		bool _hx_tmp22;
+HXDLIN( 645)		bool _hx_tmp23;
+HXDLIN( 645)		if (::hx::IsNotNull( pubsubEvent )) {
+HXLINE( 645)			_hx_tmp23 = ::hx::IsNotNull( pubsubEvent->getFrom() );
             		}
             		else {
-HXLINE( 580)			_hx_tmp15 = false;
+HXLINE( 645)			_hx_tmp23 = false;
             		}
-HXDLIN( 580)		if (_hx_tmp15) {
-HXLINE( 580)			_hx_tmp14 = (pubsubEvent->getNode() == HX_("urn:xmpp:avatar:metadata",d4,65,1a,ee));
+HXDLIN( 645)		if (_hx_tmp23) {
+HXLINE( 645)			_hx_tmp22 = (pubsubEvent->getNode() == HX_("urn:xmpp:avatar:metadata",d4,65,1a,ee));
             		}
             		else {
-HXLINE( 580)			_hx_tmp14 = false;
+HXLINE( 645)			_hx_tmp22 = false;
             		}
-HXDLIN( 580)		if (_hx_tmp14) {
-HXLINE( 580)			_hx_tmp13 = (pubsubEvent->getItems()->length > 0);
+HXDLIN( 645)		if (_hx_tmp22) {
+HXLINE( 645)			_hx_tmp21 = (pubsubEvent->getItems()->length > 0);
             		}
             		else {
-HXLINE( 580)			_hx_tmp13 = false;
+HXLINE( 645)			_hx_tmp21 = false;
             		}
-HXDLIN( 580)		if (_hx_tmp13) {
-HXLINE( 581)			 ::borogove::Stanza item = pubsubEvent->getItems()->__get(0).StaticCast<  ::borogove::Stanza >();
-HXLINE( 582)			::String avatarSha1Hex = ( (::String)(::Reflect_obj::field(pubsubEvent->getItems()->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("id",db,5b,00,00))) );
-HXLINE( 583)			 ::borogove::Hash tmp = ::borogove::Hash_obj::fromHex(HX_("sha-1",90,a8,1c,7c),avatarSha1Hex);
-HXDLIN( 583)			::Array< unsigned char > avatarSha1;
-HXDLIN( 583)			if (::hx::IsNotNull( tmp )) {
-HXLINE( 583)				avatarSha1 = tmp->hash;
+HXDLIN( 645)		if (_hx_tmp21) {
+HXLINE( 646)			 ::borogove::Stanza item = pubsubEvent->getItems()->__get(0).StaticCast<  ::borogove::Stanza >();
+HXLINE( 647)			::String avatarSha1Hex = ( (::String)(::Reflect_obj::field(pubsubEvent->getItems()->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("id",db,5b,00,00))) );
+HXLINE( 648)			 ::borogove::Hash tmp3 = ::borogove::Hash_obj::fromHex(HX_("sha-1",90,a8,1c,7c),avatarSha1Hex);
+HXDLIN( 648)			::Array< unsigned char > avatarSha1;
+HXDLIN( 648)			if (::hx::IsNotNull( tmp3 )) {
+HXLINE( 648)				avatarSha1 = tmp3->hash;
             			}
             			else {
-HXLINE( 583)				avatarSha1 = null();
+HXLINE( 648)				avatarSha1 = null();
             			}
-HXLINE( 584)			 ::borogove::Stanza metadata = item->getChild(HX_("metadata",6f,e7,19,40),HX_("urn:xmpp:avatar:metadata",d4,65,1a,ee));
-HXLINE( 585)			::Array< ::String > mime = ::Array_obj< ::String >::fromData( _hx_array_data_c0e6dc18_47,1);
-HXLINE( 586)			if (::hx::IsNotNull( metadata )) {
-HXLINE( 587)				 ::borogove::Stanza info = metadata->getChild(HX_("info",6e,38,bb,45),null());
-HXLINE( 588)				bool _hx_tmp16;
-HXDLIN( 588)				if (::hx::IsNotNull( info )) {
-HXLINE( 588)					_hx_tmp16 = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(info->attr,HX_("type",ba,f2,08,4d))) ) );
+HXLINE( 649)			 ::borogove::Stanza metadata = item->getChild(HX_("metadata",6f,e7,19,40),HX_("urn:xmpp:avatar:metadata",d4,65,1a,ee));
+HXLINE( 650)			::Array< ::String > mime = ::Array_obj< ::String >::fromData( _hx_array_data_c0e6dc18_49,1);
+HXLINE( 651)			if (::hx::IsNotNull( metadata )) {
+HXLINE( 652)				 ::borogove::Stanza info = metadata->getChild(HX_("info",6e,38,bb,45),null());
+HXLINE( 653)				bool _hx_tmp24;
+HXDLIN( 653)				if (::hx::IsNotNull( info )) {
+HXLINE( 653)					_hx_tmp24 = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(info->attr,HX_("type",ba,f2,08,4d))) ) );
             				}
             				else {
-HXLINE( 588)					_hx_tmp16 = false;
+HXLINE( 653)					_hx_tmp24 = false;
             				}
-HXDLIN( 588)				if (_hx_tmp16) {
-HXLINE( 589)					mime[0] = ( (::String)(::Reflect_obj::field(info->attr,HX_("type",ba,f2,08,4d))) );
+HXDLIN( 653)				if (_hx_tmp24) {
+HXLINE( 654)					mime[0] = ( (::String)(::Reflect_obj::field(info->attr,HX_("type",ba,f2,08,4d))) );
             				}
             			}
-HXLINE( 592)			if (::hx::IsNotNull( avatarSha1 )) {
-            				HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_9, ::borogove::Client,_gthis,::Array< ::String >,mime,::String,avatarSha1Hex, ::borogove::PubsubEvent,pubsubEvent, ::borogove::DirectChat,chat7) HXARGC(1)
+HXLINE( 657)			if (::hx::IsNotNull( avatarSha1 )) {
+            				HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_12, ::borogove::Client,_gthis,::Array< ::String >,mime,::String,avatarSha1Hex, ::borogove::PubsubEvent,pubsubEvent, ::borogove::DirectChat,chat7) HXARGC(1)
             				void _hx_run(bool has){
-            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_597_processLiveMessage)
-HXLINE( 597)					if (has) {
-HXLINE( 598)						_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat7));
+            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_662_processLiveMessage)
+HXLINE( 662)					if (has) {
+HXLINE( 663)						_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat7));
             					}
             					else {
-            						HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_8, ::borogove::Client,_gthis,::Array< ::String >,mime, ::borogove::DirectChat,chat7, ::borogove::queries::PubsubGet,pubsubGet1) HXARGC(0)
+            						HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_11, ::borogove::Client,_gthis,::Array< ::String >,mime, ::borogove::DirectChat,chat7, ::borogove::queries::PubsubGet,pubsubGet1) HXARGC(0)
             						void _hx_run(){
-            							HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_7, ::borogove::Client,_gthis, ::borogove::DirectChat,chat7) HXARGC(1)
+            							HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_10, ::borogove::Client,_gthis, ::borogove::DirectChat,chat7) HXARGC(1)
             							 ::borogove::EventResult _hx_run(bool _){
-            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_606_processLiveMessage)
-HXLINE( 606)								return _gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat7));
+            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_671_processLiveMessage)
+HXLINE( 671)								return _gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat7));
             							}
             							HX_END_LOCAL_FUNC1(return)
 
-            							HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_601_processLiveMessage)
-HXLINE( 602)							 ::borogove::Stanza item = pubsubGet1->getResult()->__get(0).StaticCast<  ::borogove::Stanza >();
-HXLINE( 603)							if (::hx::IsNull( item )) {
-HXLINE( 603)								return;
+            							HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_666_processLiveMessage)
+HXLINE( 667)							 ::borogove::Stanza item = pubsubGet1->getResult()->__get(0).StaticCast<  ::borogove::Stanza >();
+HXLINE( 668)							if (::hx::IsNull( item )) {
+HXLINE( 668)								return;
             							}
-HXLINE( 604)							 ::borogove::Stanza dataNode = item->getChild(HX_("data",2a,56,63,42),HX_("urn:xmpp:avatar:data",0f,7e,01,4e));
-HXLINE( 605)							if (::hx::IsNull( dataNode )) {
-HXLINE( 605)								return;
+HXLINE( 669)							 ::borogove::Stanza dataNode = item->getChild(HX_("data",2a,56,63,42),HX_("urn:xmpp:avatar:data",0f,7e,01,4e));
+HXLINE( 670)							if (::hx::IsNull( dataNode )) {
+HXLINE( 670)								return;
             							}
-HXLINE( 606)							::Dynamic _gthis1 = _gthis->persistence;
-HXDLIN( 606)							::String mime1 = mime->__get(0);
-HXDLIN( 606)							::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMedia(_gthis1,mime1,::haxe::crypto::Base64_obj::decode(::StringTools_obj::replace(dataNode->getText(),HX_("\n",0a,00,00,00),HX_("",00,00,00,00)),null())->b), ::Dynamic(new _hx_Closure_7(_gthis,chat7)),null());
+HXLINE( 671)							::Dynamic _gthis1 = _gthis->persistence;
+HXDLIN( 671)							::String mime1 = mime->__get(0);
+HXDLIN( 671)							::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMedia(_gthis1,mime1,::haxe::crypto::Base64_obj::decode(::StringTools_obj::replace(dataNode->getText(),HX_("\n",0a,00,00,00),HX_("",00,00,00,00)),null())->b), ::Dynamic(new _hx_Closure_10(_gthis,chat7)),null());
             						}
             						HX_END_LOCAL_FUNC0((void))
 
-HXLINE( 600)						::String pubsubGet = pubsubEvent->getFrom();
-HXDLIN( 600)						 ::borogove::queries::PubsubGet pubsubGet1 =  ::borogove::queries::PubsubGet_obj::__alloc( HX_CTX ,pubsubGet,HX_("urn:xmpp:avatar:data",0f,7e,01,4e),avatarSha1Hex);
-HXLINE( 601)						pubsubGet1->onFinished( ::Dynamic(new _hx_Closure_8(_gthis,mime,chat7,pubsubGet1)));
-HXLINE( 610)						_gthis->sendQueryLazy(pubsubGet1);
+HXLINE( 665)						::String pubsubGet = pubsubEvent->getFrom();
+HXDLIN( 665)						 ::borogove::queries::PubsubGet pubsubGet1 =  ::borogove::queries::PubsubGet_obj::__alloc( HX_CTX ,pubsubGet,HX_("urn:xmpp:avatar:data",0f,7e,01,4e),avatarSha1Hex);
+HXLINE( 666)						pubsubGet1->onFinished( ::Dynamic(new _hx_Closure_11(_gthis,mime,chat7,pubsubGet1)));
+HXLINE( 675)						_gthis->sendQueryLazy(pubsubGet1);
             					}
             				}
             				HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 593)				 ::borogove::DirectChat chat7 = this->getDirectChat(::borogove::JID_obj::parse(pubsubEvent->getFrom())->asBare()->asString(),false);
-HXLINE( 594)				chat7->setAvatarSha1(avatarSha1);
-HXLINE( 595)				::Dynamic _hx_tmp17 = this->persistence;
-HXDLIN( 595)				::String _hx_tmp18 = this->accountId();
-HXDLIN( 595)				::borogove::Persistence_obj::storeChats(_hx_tmp17,_hx_tmp18,::Array_obj< ::Dynamic>::__new(1)->init(0,chat7));
-HXLINE( 596)				::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::hasMedia(this->persistence,HX_("sha-1",90,a8,1c,7c),avatarSha1), ::Dynamic(new _hx_Closure_9(_gthis,mime,avatarSha1Hex,pubsubEvent,chat7)),null());
+HXLINE( 658)				 ::borogove::DirectChat chat7 = this->getDirectChat(::borogove::JID_obj::parse(pubsubEvent->getFrom())->asBare()->asString(),false);
+HXLINE( 659)				chat7->setAvatarSha1(avatarSha1);
+HXLINE( 660)				::Dynamic _hx_tmp25 = this->persistence;
+HXDLIN( 660)				::String _hx_tmp26 = this->accountId();
+HXDLIN( 660)				::borogove::Persistence_obj::storeChats(_hx_tmp25,_hx_tmp26,::Array_obj< ::Dynamic>::__new(1)->init(0,chat7));
+HXLINE( 661)				::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::hasMedia(this->persistence,HX_("sha-1",90,a8,1c,7c),avatarSha1), ::Dynamic(new _hx_Closure_12(_gthis,mime,avatarSha1Hex,pubsubEvent,chat7)),null());
             			}
             		}
-HXLINE( 616)		 ::Dynamic _hx_tmp19 = ::haxe::Log_obj::trace;
-HXDLIN( 616)		::String _hx_tmp20 = (HX_("pubsubEvent ",09,6a,9f,e2) + ::Std_obj::string(::hx::IsNotNull( pubsubEvent )));
-HXDLIN( 616)		_hx_tmp19(_hx_tmp20,::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),616,HX_("borogove.Client",18,dc,e6,c0),HX_("processLiveMessage",0c,f2,77,58)));
-HXLINE( 617)		bool _hx_tmp21;
-HXDLIN( 617)		if (::hx::IsNotNull( pubsubEvent )) {
-HXLINE( 617)			_hx_tmp21 = ::hx::IsNotNull( pubsubEvent->getFrom() );
+HXLINE( 681)		 ::Dynamic _hx_tmp27 = ::haxe::Log_obj::trace;
+HXDLIN( 681)		::String _hx_tmp28 = (HX_("pubsubEvent ",09,6a,9f,e2) + ::Std_obj::string(::hx::IsNotNull( pubsubEvent )));
+HXDLIN( 681)		_hx_tmp27(_hx_tmp28,::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),681,HX_("borogove.Client",18,dc,e6,c0),HX_("processLiveMessage",0c,f2,77,58)));
+HXLINE( 682)		bool _hx_tmp29;
+HXDLIN( 682)		if (::hx::IsNotNull( pubsubEvent )) {
+HXLINE( 682)			_hx_tmp29 = ::hx::IsNotNull( pubsubEvent->getFrom() );
             		}
             		else {
-HXLINE( 617)			_hx_tmp21 = false;
-            		}
-HXDLIN( 617)		if (_hx_tmp21) {
-HXLINE( 619)			::String isOwnAccount = ::borogove::JID_obj::parse(pubsubEvent->getFrom())->asBare()->asString();
-HXDLIN( 619)			bool isOwnAccount1 = (isOwnAccount == this->accountId());
-HXLINE( 620)			::String pubsubNode = pubsubEvent->getNode();
-HXLINE( 622)			bool _hx_tmp22;
-HXDLIN( 622)			bool _hx_tmp23;
-HXDLIN( 622)			if (isOwnAccount1) {
-HXLINE( 622)				_hx_tmp23 = (pubsubNode == HX_("http://jabber.org/protocol/nick",17,30,dc,e9));
+HXLINE( 682)			_hx_tmp29 = false;
+            		}
+HXDLIN( 682)		if (_hx_tmp29) {
+HXLINE( 683)			 ::borogove::JID fromBare = ::borogove::JID_obj::parse(pubsubEvent->getFrom())->asBare();
+HXLINE( 684)			::String isOwnAccount = fromBare->asString();
+HXDLIN( 684)			bool isOwnAccount1 = (isOwnAccount == this->accountId());
+HXLINE( 685)			::String pubsubNode = pubsubEvent->getNode();
+HXLINE( 686)			 ::borogove::Chat chat8 = this->getChat(fromBare->asString());
+HXLINE( 688)			bool _hx_tmp30;
+HXDLIN( 688)			bool _hx_tmp31;
+HXDLIN( 688)			if (isOwnAccount1) {
+HXLINE( 688)				_hx_tmp31 = (pubsubNode == HX_("http://jabber.org/protocol/nick",17,30,dc,e9));
+            			}
+            			else {
+HXLINE( 688)				_hx_tmp31 = false;
+            			}
+HXDLIN( 688)			if (_hx_tmp31) {
+HXLINE( 688)				_hx_tmp30 = (pubsubEvent->getItems()->length > 0);
             			}
             			else {
-HXLINE( 622)				_hx_tmp23 = false;
+HXLINE( 688)				_hx_tmp30 = false;
+            			}
+HXDLIN( 688)			if (_hx_tmp30) {
+HXLINE( 689)				this->updateDisplayName(pubsubEvent->getItems()->__get(0).StaticCast<  ::borogove::Stanza >()->getChildText(HX_("nick",a3,7b,05,49),HX_("http://jabber.org/protocol/nick",17,30,dc,e9)));
             			}
-HXDLIN( 622)			if (_hx_tmp23) {
-HXLINE( 622)				_hx_tmp22 = (pubsubEvent->getItems()->length > 0);
+HXLINE( 692)			bool _hx_tmp32;
+HXDLIN( 692)			bool _hx_tmp33;
+HXDLIN( 692)			if (::hx::IsNotNull( chat8 )) {
+HXLINE( 692)				_hx_tmp33 = (pubsubNode == HX_("http://jabber.org/protocol/activity",43,2c,6e,94));
             			}
             			else {
-HXLINE( 622)				_hx_tmp22 = false;
+HXLINE( 692)				_hx_tmp33 = false;
             			}
-HXDLIN( 622)			if (_hx_tmp22) {
-HXLINE( 623)				this->updateDisplayName(pubsubEvent->getItems()->__get(0).StaticCast<  ::borogove::Stanza >()->getChildText(HX_("nick",a3,7b,05,49),HX_("http://jabber.org/protocol/nick",17,30,dc,e9)));
+HXDLIN( 692)			if (_hx_tmp33) {
+HXLINE( 692)				_hx_tmp32 = (pubsubEvent->getItems()->length > 0);
+            			}
+            			else {
+HXLINE( 692)				_hx_tmp32 = false;
+            			}
+HXDLIN( 692)			if (_hx_tmp32) {
+HXLINE( 693)				 ::borogove::Stanza activity = pubsubEvent->getItems()->__get(0).StaticCast<  ::borogove::Stanza >()->getChild(HX_("activity",cf,2d,b2,e5),HX_("http://jabber.org/protocol/activity",43,2c,6e,94));
+HXLINE( 694)				if (::hx::IsNotNull( activity )) {
+HXLINE( 695)					::String _hx_tmp34;
+HXDLIN( 695)					 ::borogove::Stanza tmp4 = activity->getChild(HX_("undefined",90,3e,0a,9d),null());
+HXDLIN( 695)					::String tmp5;
+HXDLIN( 695)					if (::hx::IsNotNull( tmp4 )) {
+HXLINE( 695)						tmp5 = tmp4->getChildText(HX_("emoji",86,6f,d9,6f),HX_("https://ns.borogove.dev/",0d,36,29,bd));
+            					}
+            					else {
+HXLINE( 695)						tmp5 = null();
+            					}
+HXDLIN( 695)					if (::hx::IsNotNull( tmp5 )) {
+HXLINE( 695)						_hx_tmp34 = tmp5;
+            					}
+            					else {
+HXLINE( 695)						_hx_tmp34 = HX_("",00,00,00,00);
+            					}
+HXDLIN( 695)					::String tmp6 = activity->getChildText(HX_("text",ad,cc,f9,4c),null());
+HXDLIN( 695)					::String _hx_tmp35;
+HXDLIN( 695)					if (::hx::IsNotNull( tmp6 )) {
+HXLINE( 695)						_hx_tmp35 = tmp6;
+            					}
+            					else {
+HXLINE( 695)						_hx_tmp35 = HX_("",00,00,00,00);
+            					}
+HXDLIN( 695)					chat8->status =  ::borogove::Status_obj::__alloc( HX_CTX ,_hx_tmp34,_hx_tmp35);
+HXLINE( 696)					::Dynamic _hx_tmp36 = this->persistence;
+HXDLIN( 696)					::borogove::Persistence_obj::storeChats(_hx_tmp36,this->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat8));
+HXLINE( 697)					this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat8));
+HXLINE( 698)					if (isOwnAccount1) {
+HXLINE( 698)						this->sendPresence(null(),null());
+            					}
+            				}
             			}
-HXLINE( 626)			bool _hx_tmp24;
-HXDLIN( 626)			bool _hx_tmp25;
-HXDLIN( 626)			if (isOwnAccount1) {
-HXLINE( 626)				_hx_tmp25 = (pubsubNode == HX_("urn:xmpp:mds:displayed:0",bd,60,cc,fb));
+HXLINE( 702)			bool _hx_tmp37;
+HXDLIN( 702)			bool _hx_tmp38;
+HXDLIN( 702)			if (isOwnAccount1) {
+HXLINE( 702)				_hx_tmp38 = (pubsubNode == HX_("urn:xmpp:mds:displayed:0",bd,60,cc,fb));
             			}
             			else {
-HXLINE( 626)				_hx_tmp25 = false;
+HXLINE( 702)				_hx_tmp38 = false;
             			}
-HXDLIN( 626)			if (_hx_tmp25) {
-HXLINE( 626)				_hx_tmp24 = (pubsubEvent->getItems()->length > 0);
+HXDLIN( 702)			if (_hx_tmp38) {
+HXLINE( 702)				_hx_tmp37 = (pubsubEvent->getItems()->length > 0);
             			}
             			else {
-HXLINE( 626)				_hx_tmp24 = false;
-            			}
-HXDLIN( 626)			if (_hx_tmp24) {
-HXLINE( 627)				int _g10 = 0;
-HXDLIN( 627)				::Array< ::Dynamic> _g11 = pubsubEvent->getItems();
-HXDLIN( 627)				while((_g10 < _g11->length)){
-HXLINE( 627)					 ::borogove::Stanza item1 = _g11->__get(_g10).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 627)					_g10 = (_g10 + 1);
-HXLINE( 628)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(item1->attr,HX_("id",db,5b,00,00))) ) )) {
-HXLINE( 629)						 ::borogove::Stanza tmp1 = item1->getChild(HX_("displayed",21,17,db,c1),HX_("urn:xmpp:mds:displayed:0",bd,60,cc,fb));
-HXDLIN( 629)						 ::borogove::Stanza upTo;
-HXDLIN( 629)						if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 629)							upTo = tmp1->getChild(HX_("stanza-id",73,8a,54,e9),HX_("urn:xmpp:sid:0",a8,4b,37,54));
+HXLINE( 702)				_hx_tmp37 = false;
+            			}
+HXDLIN( 702)			if (_hx_tmp37) {
+HXLINE( 703)				int _g10 = 0;
+HXDLIN( 703)				::Array< ::Dynamic> _g11 = pubsubEvent->getItems();
+HXDLIN( 703)				while((_g10 < _g11->length)){
+HXLINE( 703)					 ::borogove::Stanza item1 = _g11->__get(_g10).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 703)					_g10 = (_g10 + 1);
+HXLINE( 704)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(item1->attr,HX_("id",db,5b,00,00))) ) )) {
+HXLINE( 705)						 ::borogove::Stanza tmp7 = item1->getChild(HX_("displayed",21,17,db,c1),HX_("urn:xmpp:mds:displayed:0",bd,60,cc,fb));
+HXDLIN( 705)						 ::borogove::Stanza upTo;
+HXDLIN( 705)						if (::hx::IsNotNull( tmp7 )) {
+HXLINE( 705)							upTo = tmp7->getChild(HX_("stanza-id",73,8a,54,e9),HX_("urn:xmpp:sid:0",a8,4b,37,54));
             						}
             						else {
-HXLINE( 629)							upTo = null();
+HXLINE( 705)							upTo = null();
             						}
-HXLINE( 630)						 ::borogove::Chat chat8 = this->getChat(( (::String)(::Reflect_obj::field(item1->attr,HX_("id",db,5b,00,00))) ));
-HXLINE( 631)						if (::hx::IsNull( chat8 )) {
-            							HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_10) HXARGC(1)
+HXLINE( 706)						 ::borogove::Chat chat9 = this->getChat(( (::String)(::Reflect_obj::field(item1->attr,HX_("id",db,5b,00,00))) ));
+HXLINE( 707)						if (::hx::IsNull( chat9 )) {
+            							HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_13) HXARGC(1)
             							int _hx_run( ::borogove::Caps _){
-            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_632_processLiveMessage)
-HXLINE( 632)								return 2;
+            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_708_processLiveMessage)
+HXLINE( 708)								return 2;
             							}
             							HX_END_LOCAL_FUNC1(return)
 
-            							HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_11, ::borogove::Stanza,upTo) HXARGC(1)
+            							HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_14, ::borogove::Stanza,upTo) HXARGC(1)
             							void _hx_run( ::borogove::Chat chat){
-            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_632_processLiveMessage)
-HXLINE( 632)								::String _hx_tmp = ( (::String)(::Reflect_obj::field(upTo->attr,HX_("id",db,5b,00,00))) );
-HXDLIN( 632)								chat->markReadUpToId(_hx_tmp,( (::String)(::Reflect_obj::field(upTo->attr,HX_("by",d7,55,00,00))) ));
+            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_708_processLiveMessage)
+HXLINE( 708)								::String _hx_tmp = ( (::String)(::Reflect_obj::field(upTo->attr,HX_("id",db,5b,00,00))) );
+HXDLIN( 708)								chat->markReadUpToId(_hx_tmp,( (::String)(::Reflect_obj::field(upTo->attr,HX_("by",d7,55,00,00))) ),null());
             							}
             							HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 632)							this->startChatWith(( (::String)(::Reflect_obj::field(item1->attr,HX_("id",db,5b,00,00))) ), ::Dynamic(new _hx_Closure_10()), ::Dynamic(new _hx_Closure_11(upTo)));
+HXLINE( 708)							this->startChatWith(( (::String)(::Reflect_obj::field(item1->attr,HX_("id",db,5b,00,00))) ), ::Dynamic(new _hx_Closure_13()), ::Dynamic(new _hx_Closure_14(upTo)));
             						}
             						else {
-            							HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_12, ::borogove::Chat,chat8, ::borogove::Client,_gthis) HXARGC(1)
+            							HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_15, ::borogove::Client,_gthis, ::borogove::Chat,chat9) HXARGC(1)
             							void _hx_run( ::Dynamic _){
-            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_634_processLiveMessage)
-HXLINE( 635)								::Dynamic _gthis1 = _gthis->persistence;
-HXDLIN( 635)								::String _hx_tmp = _gthis->accountId();
-HXDLIN( 635)								::borogove::Persistence_obj::storeChats(_gthis1,_hx_tmp,::Array_obj< ::Dynamic>::__new(1)->init(0,chat8));
-HXLINE( 636)								_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat8));
+            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_710_processLiveMessage)
+HXLINE( 711)								::Dynamic _gthis1 = _gthis->persistence;
+HXDLIN( 711)								::String _hx_tmp = _gthis->accountId();
+HXDLIN( 711)								::borogove::Persistence_obj::storeChats(_gthis1,_hx_tmp,::Array_obj< ::Dynamic>::__new(1)->init(0,chat9));
+HXLINE( 712)								_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat9));
             							}
             							HX_END_LOCAL_FUNC1((void))
 
-            							HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_13) HXARGC(1)
+            							HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_16) HXARGC(1)
             							::Dynamic _hx_run( ::Dynamic e){
-            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_638_processLiveMessage)
-HXLINE( 638)								if (::hx::IsNotNull( e )) {
-HXLINE( 638)									return ::thenshim::_Promise::Promise_Impl__obj::reject(e);
+            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_714_processLiveMessage)
+HXLINE( 714)								if (::hx::IsNotNull( e )) {
+HXLINE( 714)									return ::thenshim::_Promise::Promise_Impl__obj::reject(e);
             								}
             								else {
-HXLINE( 638)									return null();
+HXLINE( 714)									return null();
             								}
-HXDLIN( 638)								return null();
+HXDLIN( 714)								return null();
             							}
             							HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 634)							 ::borogove::Chat chat9 = chat8;
-HXDLIN( 634)							::String _hx_tmp26 = ( (::String)(::Reflect_obj::field(upTo->attr,HX_("id",db,5b,00,00))) );
-HXDLIN( 634)							::thenshim::_Promise::Promise_Impl__obj::then(chat9->markReadUpToId(_hx_tmp26,( (::String)(::Reflect_obj::field(upTo->attr,HX_("by",d7,55,00,00))) )), ::Dynamic(new _hx_Closure_12(chat8,_gthis)), ::Dynamic(new _hx_Closure_13()));
+HXLINE( 710)							 ::borogove::Chat chat10 = chat9;
+HXDLIN( 710)							::String _hx_tmp39 = ( (::String)(::Reflect_obj::field(upTo->attr,HX_("id",db,5b,00,00))) );
+HXDLIN( 710)							::thenshim::_Promise::Promise_Impl__obj::then(chat10->markReadUpToId(_hx_tmp39,( (::String)(::Reflect_obj::field(upTo->attr,HX_("by",d7,55,00,00))) ),null()), ::Dynamic(new _hx_Closure_15(_gthis,chat9)), ::Dynamic(new _hx_Closure_16()));
             						}
             					}
             				}
             			}
-HXLINE( 643)			::haxe::Log_obj::trace((HX_("pubsubNode == ",a5,37,1e,6c) + pubsubNode),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),643,HX_("borogove.Client",18,dc,e6,c0),HX_("processLiveMessage",0c,f2,77,58)));
+HXLINE( 719)			::haxe::Log_obj::trace((HX_("pubsubNode == ",a5,37,1e,6c) + pubsubNode),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),719,HX_("borogove.Client",18,dc,e6,c0),HX_("processLiveMessage",0c,f2,77,58)));
             		}
             	}
 
@@ -1971,98 +2240,102 @@ HX_DEFINE_DYNAMIC_FUNC3(Client_obj,processLiveMessage,(void))
 void Client_obj::start(){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis) HXARGC(1)
             		::Dynamic _hx_run(bool _){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_663_start)
-HXLINE( 663)			::Dynamic _gthis1 = _gthis->persistence;
-HXDLIN( 663)			return ::borogove::Persistence_obj::getStreamManagement(_gthis1,_gthis->accountId());
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_739_start)
+HXLINE( 739)			::Dynamic _gthis1 = _gthis->persistence;
+HXDLIN( 739)			return ::borogove::Persistence_obj::getStreamManagement(_gthis1,_gthis->accountId());
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_4, ::borogove::Client,_gthis) HXARGC(1)
-            		void _hx_run(::Array< unsigned char > sm){
+            		void _hx_run( ::Dynamic data){
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::borogove::Client,_gthis) HXARGC(1)
             			 ::borogove::EventResult _hx_run( ::Dynamic data){
-            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_665_start)
-HXLINE( 666)				 ::Dynamic tmp = data->__Field(HX_("mechanisms",fa,b0,9e,80),::hx::paccDynamic);
-HXDLIN( 666)				 ::Dynamic tmp1;
-HXDLIN( 666)				if (::hx::IsNotNull( tmp )) {
+            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_742_start)
+HXLINE( 743)				::Array< ::Dynamic> tmp = ( (::Array< ::Dynamic>)(data->__Field(HX_("mechanisms",fa,b0,9e,80),::hx::paccDynamic)) );
+HXDLIN( 743)				 ::Dynamic tmp1;
+HXDLIN( 743)				if (::hx::IsNotNull( tmp )) {
             					HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
-            					 ::Dynamic _hx_run( ::Dynamic mech){
-            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_666_start)
-HXLINE( 666)						return  ::Dynamic(mech->__Field(HX_("canFast",cc,aa,0d,62),::hx::paccDynamic));
+            					bool _hx_run( ::Dynamic mech){
+            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_743_start)
+HXLINE( 743)						return ( (bool)(mech->__Field(HX_("canFast",cc,aa,0d,62),::hx::paccDynamic)) );
             					}
             					HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 666)					tmp1 = tmp->__Field(HX_("find",39,d0,bb,43),::hx::paccDynamic)( ::Dynamic(new _hx_Closure_1()));
+HXLINE( 743)					tmp1 = ::Lambda_obj::find(tmp, ::Dynamic(new _hx_Closure_1()));
             				}
             				else {
-HXLINE( 666)					tmp1 = null();
+HXLINE( 743)					tmp1 = null();
             				}
-HXDLIN( 666)				::String _hx_tmp;
-HXDLIN( 666)				if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 666)					_hx_tmp = ( (::String)(tmp1->__Field(HX_("name",4b,72,ff,48),::hx::paccDynamic)) );
+HXDLIN( 743)				::String _hx_tmp;
+HXDLIN( 743)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 743)					_hx_tmp = ( (::String)(tmp1->__Field(HX_("name",4b,72,ff,48),::hx::paccDynamic)) );
             				}
             				else {
-HXLINE( 666)					_hx_tmp = null();
+HXLINE( 743)					_hx_tmp = null();
             				}
-HXDLIN( 666)				_gthis->fastMechanism = _hx_tmp;
-HXLINE( 667)				bool _hx_tmp1;
-HXDLIN( 667)				if (::hx::IsNotNull( _gthis->token )) {
-HXLINE( 667)					if (::hx::IsNull( _gthis->fastMechanism )) {
-HXLINE( 667)						_hx_tmp1 = ::hx::IsNotNull( data->__Field(HX_("mechanimsms",cb,6a,49,06),::hx::paccDynamic) );
+HXDLIN( 743)				_gthis->fastMechanism = _hx_tmp;
+HXLINE( 744)				bool _hx_tmp1;
+HXDLIN( 744)				if (::hx::IsNotNull( _gthis->token )) {
+HXLINE( 744)					if (::hx::IsNull( _gthis->fastMechanism )) {
+HXLINE( 744)						_hx_tmp1 = ::hx::IsNotNull( data->__Field(HX_("mechanisms",fa,b0,9e,80),::hx::paccDynamic) );
             					}
             					else {
-HXLINE( 667)						_hx_tmp1 = false;
+HXLINE( 744)						_hx_tmp1 = false;
             					}
             				}
             				else {
-HXLINE( 667)					_hx_tmp1 = true;
+HXLINE( 744)					_hx_tmp1 = true;
             				}
-HXDLIN( 667)				if (_hx_tmp1) {
-HXLINE( 668)					 ::borogove::Client _gthis1 = _gthis;
-HXDLIN( 668)					return _gthis1->trigger(HX_("auth/password-needed",80,f0,74,49), ::Dynamic(::hx::Anon_obj::Create(1)
+HXDLIN( 744)				if (_hx_tmp1) {
+HXLINE( 745)					 ::borogove::Client _gthis1 = _gthis;
+HXDLIN( 745)					return _gthis1->trigger(HX_("auth/password-needed",80,f0,74,49), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("accountId",e8,81,54,29),_gthis->accountId())));
             				}
             				else {
-HXLINE( 670)					return _gthis->stream->trigger(HX_("auth/password",e2,5d,98,00), ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE( 747)					return _gthis->stream->trigger(HX_("auth/password",e2,5d,98,00), ::Dynamic(::hx::Anon_obj::Create(3)
             						->setFixed(0,HX_("fastCount",93,fc,67,a5),_gthis->fastCount)
             						->setFixed(1,HX_("mechanism",59,fd,7e,2e),_gthis->fastMechanism)
             						->setFixed(2,HX_("password",1b,23,d0,48),_gthis->token)));
             				}
-HXLINE( 667)				return null();
+HXLINE( 744)				return null();
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_3, ::borogove::Client,_gthis,::Array< unsigned char >,sm) HXARGC(1)
+            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_3, ::borogove::Client,_gthis) HXARGC(1)
             			 ::borogove::EventResult _hx_run( ::Dynamic data){
-            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_673_start)
-HXLINE( 674)				if (::hx::IsNotNull( _gthis->token )) {
-HXLINE( 675)					_gthis->token = null();
-HXLINE( 676)					 ::borogove::GenericStream _gthis1 = _gthis->stream;
-HXDLIN( 676)					::String _hx_tmp = _gthis->jid->asString();
-HXDLIN( 676)					_gthis1->connect(_hx_tmp,sm);
+            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_750_start)
+HXLINE( 751)				if (::hx::IsNotNull( _gthis->token )) {
+HXLINE( 752)					_gthis->token = null();
+HXLINE( 753)					 ::borogove::GenericStream _gthis1 = _gthis->stream;
+HXDLIN( 753)					::String _hx_tmp = _gthis->jid->asString();
+HXDLIN( 753)					_gthis1->connect(_hx_tmp,( (::Array< unsigned char >)(data->__Field(HX_("sm",9a,64,00,00),::hx::paccDynamic)) ));
             				}
             				else {
-HXLINE( 678)					 ::borogove::GenericStream _gthis2 = _gthis->stream;
-HXDLIN( 678)					::String _hx_tmp1 = _gthis->jid->asString();
-HXDLIN( 678)					_gthis2->connect(_hx_tmp1,sm);
+HXLINE( 755)					 ::borogove::GenericStream _gthis2 = _gthis->stream;
+HXDLIN( 755)					::String _hx_tmp1 = _gthis->jid->asString();
+HXDLIN( 755)					_gthis2->connect(_hx_tmp1,( (::Array< unsigned char >)(data->__Field(HX_("sm",9a,64,00,00),::hx::paccDynamic)) ));
             				}
-HXLINE( 680)				return ::borogove::EventResult_obj::EventHandled_dyn();
+HXLINE( 757)				return ::borogove::EventResult_obj::EventHandled_dyn();
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_664_start)
-HXLINE( 665)			_gthis->stream->on(HX_("auth/password-needed",80,f0,74,49), ::Dynamic(new _hx_Closure_2(_gthis)));
-HXLINE( 673)			_gthis->stream->on(HX_("auth/fail",25,45,e9,d1), ::Dynamic(new _hx_Closure_3(_gthis,sm)));
-HXLINE( 682)			 ::borogove::GenericStream _gthis1 = _gthis->stream;
-HXDLIN( 682)			::String _hx_tmp = _gthis->jid->asString();
-HXDLIN( 682)			_gthis1->connect(_hx_tmp,sm);
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_740_start)
+HXLINE( 741)			if (::hx::IsGreater( data->__Field(HX_("sortId",d9,7a,37,30),::hx::paccDynamic),_gthis->sortId )) {
+HXLINE( 741)				_gthis->sortId = ( (::String)(data->__Field(HX_("sortId",d9,7a,37,30),::hx::paccDynamic)) );
+            			}
+HXLINE( 742)			_gthis->stream->on(HX_("auth/password-needed",80,f0,74,49), ::Dynamic(new _hx_Closure_2(_gthis)));
+HXLINE( 750)			_gthis->stream->on(HX_("auth/fail",25,45,e9,d1), ::Dynamic(new _hx_Closure_3(_gthis)));
+HXLINE( 759)			_gthis->firstSync = true;
+HXLINE( 760)			 ::borogove::GenericStream _gthis1 = _gthis->stream;
+HXDLIN( 760)			::String _hx_tmp = _gthis->jid->asString();
+HXDLIN( 760)			_gthis1->connect(_hx_tmp,( (::Array< unsigned char >)(data->__Field(HX_("sm",9a,64,00,00),::hx::paccDynamic)) ));
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_660_start)
-HXDLIN( 660)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 661)		this->stream->emitSMupdates = false;
-HXLINE( 662)		::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->startOffline(), ::Dynamic(new _hx_Closure_0(_gthis)),null()), ::Dynamic(new _hx_Closure_4(_gthis)),null());
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_736_start)
+HXDLIN( 736)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 737)		this->stream->emitSMupdates = false;
+HXLINE( 738)		::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->startOffline(), ::Dynamic(new _hx_Closure_0(_gthis)),null()), ::Dynamic(new _hx_Closure_4(_gthis)),null());
             	}
 
 
@@ -2070,111 +2343,142 @@ HX_DEFINE_DYNAMIC_FUNC0(Client_obj,start,(void))
 
 ::Dynamic Client_obj::startOffline(){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis) HXARGC(1)
-            		::Dynamic _hx_run( ::Dynamic login){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_696_startOffline)
-HXLINE( 697)			_gthis->token = ( (::String)(login->__Field(HX_("token",f9,82,2b,14),::hx::paccDynamic)) );
-HXLINE( 698)			_gthis->fastCount = login->__Field(HX_("fastCount",93,fc,67,a5),::hx::paccDynamic);
-HXLINE( 699)			::String tmp = ( (::String)(login->__Field(HX_("clientId",06,73,8f,15),::hx::paccDynamic)) );
-HXDLIN( 699)			::String _hx_tmp;
-HXDLIN( 699)			if (::hx::IsNotNull( tmp )) {
-HXLINE( 699)				_hx_tmp = tmp;
+            		::Dynamic _hx_run( ::borogove::ChatMessage point){
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_774_startOffline)
+HXLINE( 775)			::String _hx_tmp;
+HXDLIN( 775)			if (::hx::IsNotNull( point )) {
+HXLINE( 775)				_hx_tmp = point->sortId;
             			}
             			else {
-HXLINE( 699)				_hx_tmp = ::borogove::ID_obj::_hx_long();
+HXLINE( 775)				_hx_tmp = null();
+            			}
+HXDLIN( 775)			if (::hx::IsNotNull( _hx_tmp )) {
+HXLINE( 775)				_gthis->sortId = point->sortId;
             			}
-HXDLIN( 699)			_gthis->stream->clientId = _hx_tmp;
-HXLINE( 700)			_gthis->jid = _gthis->jid->withResource(_gthis->stream->clientId);
-HXLINE( 701)			bool _hx_tmp1;
-HXDLIN( 701)			if (!(_gthis->updateDisplayName(( (::String)(login->__Field(HX_("displayName",ad,11,f2,30),::hx::paccDynamic)) )))) {
-HXLINE( 701)				_hx_tmp1 = ::hx::IsNull( login->__Field(HX_("clientId",06,73,8f,15),::hx::paccDynamic) );
+HXLINE( 777)			::Dynamic _gthis1 = _gthis->persistence;
+HXDLIN( 777)			return ::borogove::Persistence_obj::getLogin(_gthis1,_gthis->accountId());
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::Client,_gthis) HXARGC(1)
+            		::Dynamic _hx_run( ::Dynamic login){
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_778_startOffline)
+HXLINE( 779)			_gthis->token = ( (::String)(login->__Field(HX_("token",f9,82,2b,14),::hx::paccDynamic)) );
+HXLINE( 780)			_gthis->fastCount = login->__Field(HX_("fastCount",93,fc,67,a5),::hx::paccDynamic);
+HXLINE( 781)			::String tmp = ( (::String)(login->__Field(HX_("clientId",06,73,8f,15),::hx::paccDynamic)) );
+HXDLIN( 781)			::String _hx_tmp;
+HXDLIN( 781)			if (::hx::IsNotNull( tmp )) {
+HXLINE( 781)				_hx_tmp = tmp;
             			}
             			else {
-HXLINE( 701)				_hx_tmp1 = false;
+HXLINE( 781)				_hx_tmp = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
             			}
-HXDLIN( 701)			if (_hx_tmp1) {
-HXLINE( 702)				::Dynamic _gthis1 = _gthis->persistence;
-HXDLIN( 702)				::String _hx_tmp2 = _gthis->jid->asBare()->asString();
-HXDLIN( 702)				::String _gthis2 = _gthis->stream->clientId;
-HXDLIN( 702)				::borogove::Persistence_obj::storeLogin(_gthis1,_hx_tmp2,_gthis2,_gthis->displayName(),null());
+HXDLIN( 781)			_gthis->stream->clientId = _hx_tmp;
+HXLINE( 782)			_gthis->jid = _gthis->jid->withResource(_gthis->stream->clientId);
+HXLINE( 783)			::String tmp1 = ( (::String)(login->__Field(HX_("displayName",ad,11,f2,30),::hx::paccDynamic)) );
+HXDLIN( 783)			::String _hx_tmp1;
+HXDLIN( 783)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 783)				_hx_tmp1 = tmp1;
             			}
-HXLINE( 705)			::Dynamic _gthis3 = _gthis->persistence;
-HXDLIN( 705)			return ::borogove::Persistence_obj::getChats(_gthis3,_gthis->accountId());
+            			else {
+HXLINE( 783)				_hx_tmp1 = _gthis->_displayName;
+            			}
+HXDLIN( 783)			_gthis->_displayName = _hx_tmp1;
+HXLINE( 785)			::Dynamic _gthis1 = _gthis->persistence;
+HXDLIN( 785)			return ::borogove::Persistence_obj::getChats(_gthis1,_gthis->accountId());
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::Client,_gthis) HXARGC(1)
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_3, ::borogove::Client,_gthis) HXARGC(1)
             		::Dynamic _hx_run(::Array< ::Dynamic> protoChats){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_706_startOffline)
-HXLINE( 707)			 ::borogove::SerializedChat oneProtoChat = null();
-HXLINE( 708)			while(true){
-HXLINE( 708)				oneProtoChat = protoChats->pop().StaticCast<  ::borogove::SerializedChat >();
-HXDLIN( 708)				if (!(::hx::IsNotNull( oneProtoChat ))) {
-HXLINE( 708)					goto _hx_goto_61;
-            				}
-HXLINE( 709)				::Array< ::Dynamic> _gthis1 = _gthis->chats;
-HXDLIN( 709)				_gthis1->push(oneProtoChat->toChat(_gthis,_gthis->stream,_gthis->persistence));
-            			}
-            			_hx_goto_61:;
-HXLINE( 711)			 ::borogove::Client _gthis2 = _gthis;
-HXDLIN( 711)			_gthis2->getDirectChat(_gthis->accountId(),null());
-HXLINE( 712)			::Dynamic _gthis3 = _gthis->persistence;
-HXDLIN( 712)			::String _hx_tmp = _gthis->accountId();
-HXDLIN( 712)			return ::borogove::Persistence_obj::getChatsUnreadDetails(_gthis3,_hx_tmp,_gthis->chats);
+            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::borogove::Client,_gthis) HXARGC(2)
+            			int _hx_run( ::borogove::SerializedChat a, ::borogove::SerializedChat b){
+            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_787_startOffline)
+HXLINE( 787)				::String a1 = a->chatId;
+HXDLIN( 787)				if ((a1 == _gthis->accountId())) {
+HXLINE( 787)					return 1;
+            				}
+            				else {
+HXLINE( 787)					return 0;
+            				}
+HXDLIN( 787)				return 0;
+            			}
+            			HX_END_LOCAL_FUNC2(return)
+
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_786_startOffline)
+HXLINE( 787)			protoChats->sort( ::Dynamic(new _hx_Closure_2(_gthis)));
+HXLINE( 788)			 ::borogove::SerializedChat oneProtoChat = null();
+HXLINE( 789)			while(true){
+HXLINE( 789)				oneProtoChat = protoChats->pop().StaticCast<  ::borogove::SerializedChat >();
+HXDLIN( 789)				if (!(::hx::IsNotNull( oneProtoChat ))) {
+HXLINE( 789)					goto _hx_goto_63;
+            				}
+HXLINE( 790)				::Array< ::Dynamic> _gthis1 = _gthis->chats;
+HXDLIN( 790)				_gthis1->push(oneProtoChat->toChat(_gthis,_gthis->stream,_gthis->persistence));
+            			}
+            			_hx_goto_63:;
+HXLINE( 792)			 ::borogove::Client _gthis2 = _gthis;
+HXDLIN( 792)			_gthis2->getDirectChat(_gthis->accountId(),null());
+HXLINE( 793)			 ::borogove::Client _gthis3 = _gthis;
+HXDLIN( 793)			_gthis3->getDirectChat(::borogove::JID_obj::parse(_gthis->accountId())->domain,null());
+HXLINE( 794)			::Dynamic _gthis4 = _gthis->persistence;
+HXDLIN( 794)			::String _hx_tmp = _gthis->accountId();
+HXDLIN( 794)			return ::borogove::Persistence_obj::getChatsUnreadDetails(_gthis4,_hx_tmp,_gthis->chats);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::borogove::Client,_gthis) HXARGC(1)
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_4, ::borogove::Client,_gthis) HXARGC(1)
             		bool _hx_run(::Array< ::Dynamic> details){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_713_startOffline)
-HXLINE( 714)			{
-HXLINE( 714)				int _g = 0;
-HXDLIN( 714)				while((_g < details->length)){
-HXLINE( 714)					 ::Dynamic detail = details->__get(_g);
-HXDLIN( 714)					_g = (_g + 1);
-HXLINE( 715)					 ::borogove::Chat chat = _gthis->getChat(( (::String)(detail->__Field(HX_("chatId",d3,04,77,b7),::hx::paccDynamic)) ));
-HXLINE( 716)					if (::hx::IsNotNull( chat )) {
-HXLINE( 717)						chat->setLastMessage(( ( ::borogove::ChatMessage)(detail->__Field(HX_("message",c7,35,11,9a),::hx::paccDynamic)) ));
-HXLINE( 718)						chat->setUnreadCount(( (int)(detail->__Field(HX_("unreadCount",20,18,f1,a0),::hx::paccDynamic)) ));
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_795_startOffline)
+HXLINE( 796)			{
+HXLINE( 796)				int _g = 0;
+HXDLIN( 796)				while((_g < details->length)){
+HXLINE( 796)					 ::Dynamic detail = details->__get(_g);
+HXDLIN( 796)					_g = (_g + 1);
+HXLINE( 797)					 ::borogove::Chat chat = _gthis->getChat(( (::String)(detail->__Field(HX_("chatId",d3,04,77,b7),::hx::paccDynamic)) ));
+HXLINE( 798)					if (::hx::IsNotNull( chat )) {
+HXLINE( 799)						chat->setLastMessage(( ( ::borogove::ChatMessage)(detail->__Field(HX_("message",c7,35,11,9a),::hx::paccDynamic)) ));
+HXLINE( 800)						chat->setUnreadCount(( (int)(detail->__Field(HX_("unreadCount",20,18,f1,a0),::hx::paccDynamic)) ));
             					}
             				}
             			}
-HXLINE( 721)			_gthis->sortChats();
-HXLINE( 722)			_gthis->trigger(HX_("chats/update",3d,8e,1d,14),_gthis->chats);
-HXLINE( 723)			return true;
+HXLINE( 803)			_gthis->sortChats();
+HXLINE( 804)			_gthis->trigger(HX_("chats/update",3d,8e,1d,14),_gthis->chats);
+HXLINE( 805)			return true;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_691_startOffline)
-HXDLIN( 691)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 694)		__hxcpp_collect(true);
-HXLINE( 696)		::Dynamic _hx_tmp = this->persistence;
-HXDLIN( 696)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getLogin(_hx_tmp,this->accountId()), ::Dynamic(new _hx_Closure_0(_gthis)),null()), ::Dynamic(new _hx_Closure_1(_gthis)),null()), ::Dynamic(new _hx_Closure_2(_gthis)),null());
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_769_startOffline)
+HXDLIN( 769)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 772)		__hxcpp_collect(true);
+HXLINE( 774)		::Dynamic _hx_tmp = this->persistence;
+HXDLIN( 774)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::syncPoint(_hx_tmp,this->accountId(),null()), ::Dynamic(new _hx_Closure_0(_gthis)),null()), ::Dynamic(new _hx_Closure_1(_gthis)),null()), ::Dynamic(new _hx_Closure_3(_gthis)),null()), ::Dynamic(new _hx_Closure_4(_gthis)),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Client_obj,startOffline,return )
 
 void Client_obj::startOffline__fromC(::cpp::Function< void  (bool,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_337_startOffline__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			this->startOffline();
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_365_startOffline__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->startOffline();
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(bool v){
-            				HX_STACKFRAME(&_hx_pos_afe14372debdebc6_337_startOffline__fromC)
-HXDLIN( 337)				handler(v,handler__context);
+            				HX_STACKFRAME(&_hx_pos_afe14372debdebc6_365_startOffline__fromC)
+HXDLIN( 365)				handler(v,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_afe14372debdebc6_337_startOffline__fromC)
-HXDLIN( 337)				handler(false,handler__context);
+            				HX_STACKFRAME(&_hx_pos_afe14372debdebc6_365_startOffline__fromC)
+HXDLIN( 365)				handler(false,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->startOffline(), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->startOffline(), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
@@ -2182,26 +2486,26 @@ HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->startOffline(
 void Client_obj::logout(bool completely){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis) HXARGC(0)
             		void _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_736_logout)
-HXLINE( 736)			_gthis->stream->disconnect();
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_818_logout)
+HXLINE( 818)			_gthis->stream->disconnect();
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_732_logout)
-HXDLIN( 732)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 733)		::Dynamic _hx_tmp = this->persistence;
-HXDLIN( 733)		::borogove::Persistence_obj::removeAccount(_hx_tmp,this->accountId(),completely);
-HXLINE( 734)		 ::borogove::queries::Push2Disable disable =  ::borogove::queries::Push2Disable_obj::__alloc( HX_CTX ,this->jid->asBare()->asString());
-HXLINE( 735)		disable->onFinished( ::Dynamic(new _hx_Closure_0(_gthis)));
-HXLINE( 738)		this->sendQuery(disable);
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_814_logout)
+HXDLIN( 814)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 815)		::Dynamic _hx_tmp = this->persistence;
+HXDLIN( 815)		::borogove::Persistence_obj::removeAccount(_hx_tmp,this->accountId(),completely);
+HXLINE( 816)		 ::borogove::queries::Push2Disable disable =  ::borogove::queries::Push2Disable_obj::__alloc( HX_CTX ,this->jid->asBare()->asString());
+HXLINE( 817)		disable->onFinished( ::Dynamic(new _hx_Closure_0(_gthis)));
+HXLINE( 820)		this->sendQuery(disable);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Client_obj,logout,(void))
 
 void Client_obj::usePassword(::String password){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_748_usePassword)
-HXDLIN( 748)		this->stream->trigger(HX_("auth/password",e2,5d,98,00), ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_830_usePassword)
+HXDLIN( 830)		this->stream->trigger(HX_("auth/password",e2,5d,98,00), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("requestToken",2a,35,fd,af),this->fastMechanism)
             			->setFixed(1,HX_("password",1b,23,d0,48),password)));
             	}
@@ -2210,16 +2514,16 @@ HXDLIN( 748)		this->stream->trigger(HX_("auth/password",e2,5d,98,00), ::Dynamic(
 HX_DEFINE_DYNAMIC_FUNC1(Client_obj,usePassword,(void))
 
 ::String Client_obj::accountId(){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_757_accountId)
-HXDLIN( 757)		return this->jid->asBare()->asString();
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_839_accountId)
+HXDLIN( 839)		return this->jid->asBare()->asString();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Client_obj,accountId,return )
 
 ::String Client_obj::displayName(){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_766_displayName)
-HXDLIN( 766)		return this->_displayName;
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_848_displayName)
+HXDLIN( 848)		return this->_displayName;
             	}
 
 
@@ -2228,59 +2532,59 @@ HX_DEFINE_DYNAMIC_FUNC0(Client_obj,displayName,return )
 void Client_obj::setProfile( ::borogove::ProfileBuilder profile,bool publicAccess){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		bool _hx_run( ::borogove::ProfileItem item){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_776_setProfile)
-HXLINE( 776)			return (item->key == HX_("fn",48,59,00,00));
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_858_setProfile)
+HXLINE( 858)			return (item->key == HX_("fn",48,59,00,00));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_775_setProfile)
-HXLINE( 776)		 ::borogove::ProfileItem fn = ( ( ::borogove::ProfileItem)(::Lambda_obj::find(profile->build()->items, ::Dynamic(new _hx_Closure_0()))) );
-HXLINE( 777)		if (::hx::IsNotNull( fn )) {
-HXLINE( 778)			::String fnText = fn->text()->__get(0);
-HXLINE( 779)			bool _hx_tmp;
-HXDLIN( 779)			bool _hx_tmp1;
-HXDLIN( 779)			if (::hx::IsNotNull( fnText )) {
-HXLINE( 779)				_hx_tmp1 = (fnText != HX_("",00,00,00,00));
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_857_setProfile)
+HXLINE( 858)		 ::borogove::ProfileItem fn = ( ( ::borogove::ProfileItem)(::Lambda_obj::find(profile->build()->items, ::Dynamic(new _hx_Closure_0()))) );
+HXLINE( 859)		if (::hx::IsNotNull( fn )) {
+HXLINE( 860)			::String fnText = fn->text()->__get(0);
+HXLINE( 861)			bool _hx_tmp;
+HXDLIN( 861)			bool _hx_tmp1;
+HXDLIN( 861)			if (::hx::IsNotNull( fnText )) {
+HXLINE( 861)				_hx_tmp1 = (fnText != HX_("",00,00,00,00));
             			}
             			else {
-HXLINE( 779)				_hx_tmp1 = false;
+HXLINE( 861)				_hx_tmp1 = false;
             			}
-HXDLIN( 779)			if (_hx_tmp1) {
-HXLINE( 779)				_hx_tmp = (fnText != this->displayName());
+HXDLIN( 861)			if (_hx_tmp1) {
+HXLINE( 861)				_hx_tmp = (fnText != this->displayName());
             			}
             			else {
-HXLINE( 779)				_hx_tmp = false;
+HXLINE( 861)				_hx_tmp = false;
             			}
-HXDLIN( 779)			if (_hx_tmp) {
+HXDLIN( 861)			if (_hx_tmp) {
             				HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             				void _hx_run( ::borogove::Stanza response){
-            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_787_setProfile)
+            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_869_setProfile)
             				}
             				HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 780)				 ::borogove::GenericStream _hx_tmp2 = this->stream;
-HXDLIN( 780)				_hx_tmp2->sendIq( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 862)				 ::borogove::GenericStream _hx_tmp2 = this->stream;
+HXDLIN( 862)				_hx_tmp2->sendIq( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("pubsub",e3,da,f8,66), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/pubsub",57,94,3c,f2))))->tag(HX_("publish",8f,21,1d,ae), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("node",02,0a,0a,49),HX_("http://jabber.org/protocol/nick",17,30,dc,e9))))->tag(HX_("item",13,c5,bf,45),null())->textTag(HX_("nick",a3,7b,05,49),fnText, ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/nick",17,30,dc,e9))))->up()->up()->up(), ::Dynamic(new _hx_Closure_1()));
             			}
             		}
-HXLINE( 793)		 ::borogove::Stanza _hx_tmp3 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 875)		 ::borogove::Stanza _hx_tmp3 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("pubsub",e3,da,f8,66), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/pubsub",57,94,3c,f2))))->tag(HX_("publish",8f,21,1d,ae), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("node",02,0a,0a,49),HX_("urn:xmpp:vcard4",4a,89,04,19))));
-HXDLIN( 793)		 ::borogove::Stanza _hx_tmp4 = _hx_tmp3->tag(HX_("item",13,c5,bf,45), ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("id",db,5b,00,00),::borogove::ID_obj::_hx_long())));
-HXDLIN( 793)		 ::borogove::Stanza _hx_tmp5 = _hx_tmp4->addChild(profile->buildStanza());
-HXLINE( 805)		::String _hx_tmp6;
-HXDLIN( 805)		if (publicAccess) {
-HXLINE( 805)			_hx_tmp6 = HX_("open",ca,03,b4,49);
+HXDLIN( 875)		 ::borogove::Stanza _hx_tmp4 = _hx_tmp3->tag(HX_("item",13,c5,bf,45), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("id",db,5b,00,00),::_UUIDv7::UUIDv7_Fields__obj::uuidv7())));
+HXDLIN( 875)		 ::borogove::Stanza _hx_tmp5 = _hx_tmp4->addChild(profile->buildStanza());
+HXLINE( 887)		::String _hx_tmp6;
+HXDLIN( 887)		if (publicAccess) {
+HXLINE( 887)			_hx_tmp6 = HX_("open",ca,03,b4,49);
             		}
             		else {
-HXLINE( 805)			_hx_tmp6 = HX_("presence",3b,52,d7,66);
+HXLINE( 887)			_hx_tmp6 = HX_("presence",3b,52,d7,66);
             		}
-HXLINE( 792)		this->publishWithOptions(_hx_tmp5, ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 874)		this->publishWithOptions(_hx_tmp5, ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("type",ba,f2,08,4d),HX_("submit",18,58,06,9a))
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("jabber:x:data",c2,e1,e9,7c))))->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("var",e7,de,59,00),HX_("FORM_TYPE",d5,96,c9,5a))
@@ -2296,39 +2600,75 @@ HXLINE( 792)		this->publishWithOptions(_hx_tmp5, ::borogove::Stanza_obj::__alloc
 
 HX_DEFINE_DYNAMIC_FUNC2(Client_obj,setProfile,(void))
 
+void Client_obj::setStatus( ::borogove::Status status,::hx::Null< int >  __o_expires,::hx::Null< bool >  __o_publicAccess){
+            		int expires = __o_expires.Default(86400);
+            		bool publicAccess = __o_publicAccess.Default(false);
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_899_setStatus)
+HXLINE( 900)		 ::borogove::Stanza _hx_tmp =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("pubsub",e3,da,f8,66), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/pubsub",57,94,3c,f2))))->tag(HX_("publish",8f,21,1d,ae), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("node",02,0a,0a,49),HX_("http://jabber.org/protocol/activity",43,2c,6e,94))));
+HXDLIN( 900)		 ::borogove::Stanza _hx_tmp1 = _hx_tmp->tag(HX_("item",13,c5,bf,45), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("id",db,5b,00,00),::_UUIDv7::UUIDv7_Fields__obj::uuidv7())));
+HXDLIN( 900)		 ::borogove::Stanza _hx_tmp2 = _hx_tmp1->addChild(status->toStanza());
+HXLINE( 905)		 ::borogove::Stanza _hx_tmp3 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+            			->setFixed(0,HX_("type",ba,f2,08,4d),HX_("submit",18,58,06,9a))
+            			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("jabber:x:data",c2,e1,e9,7c))))->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(2)
+            			->setFixed(0,HX_("var",e7,de,59,00),HX_("FORM_TYPE",d5,96,c9,5a))
+            			->setFixed(1,HX_("type",ba,f2,08,4d),HX_("hidden",6a,ff,95,4c))))->textTag(HX_("value",71,7f,b8,31),HX_("http://jabber.org/protocol/pubsub#publish-options",f4,9c,72,50),null())->up()->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("var",e7,de,59,00),HX_("pubsub#type",9a,0e,c3,59))))->textTag(HX_("value",71,7f,b8,31),HX_("http://jabber.org/protocol/activity",43,2c,6e,94),null())->up()->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("var",e7,de,59,00),HX_("pubsub#deliver_payloads",df,36,1b,95))))->textTag(HX_("value",71,7f,b8,31),HX_("true",4e,a7,03,4d),null())->up()->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("var",e7,de,59,00),HX_("pubsub#persist_items",75,44,6b,ad))))->textTag(HX_("value",71,7f,b8,31),HX_("true",4e,a7,03,4d),null())->up()->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("var",e7,de,59,00),HX_("pubsub#max_items",05,69,9f,7c))))->textTag(HX_("value",71,7f,b8,31),HX_("1",31,00,00,00),null())->up()->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("var",e7,de,59,00),HX_("pubsub#item_expire",eb,88,54,80))));
+HXLINE( 911)		::String _hx_tmp4 = ::Std_obj::string(expires);
+HXLINE( 912)		::String _hx_tmp5;
+HXDLIN( 912)		if (publicAccess) {
+HXLINE( 912)			_hx_tmp5 = HX_("open",ca,03,b4,49);
+            		}
+            		else {
+HXLINE( 912)			_hx_tmp5 = HX_("presence",3b,52,d7,66);
+            		}
+HXLINE( 899)		this->publishWithOptions(_hx_tmp2,_hx_tmp3->textTag(HX_("value",71,7f,b8,31),_hx_tmp4,null())->up()->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("var",e7,de,59,00),HX_("pubsub#access_model",6e,cf,ac,1d))))->textTag(HX_("value",71,7f,b8,31),_hx_tmp5,null())->up());
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC3(Client_obj,setStatus,(void))
+
 bool Client_obj::updateDisplayName(::String fn){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_809_updateDisplayName)
-HXLINE( 810)		bool _hx_tmp;
-HXDLIN( 810)		bool _hx_tmp1;
-HXDLIN( 810)		if (::hx::IsNotNull( fn )) {
-HXLINE( 810)			_hx_tmp1 = (fn == HX_("",00,00,00,00));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_916_updateDisplayName)
+HXLINE( 917)		bool _hx_tmp;
+HXDLIN( 917)		bool _hx_tmp1;
+HXDLIN( 917)		if (::hx::IsNotNull( fn )) {
+HXLINE( 917)			_hx_tmp1 = (fn == HX_("",00,00,00,00));
             		}
             		else {
-HXLINE( 810)			_hx_tmp1 = true;
+HXLINE( 917)			_hx_tmp1 = true;
             		}
-HXDLIN( 810)		if (!(_hx_tmp1)) {
-HXLINE( 810)			_hx_tmp = (fn == this->displayName());
+HXDLIN( 917)		if (!(_hx_tmp1)) {
+HXLINE( 917)			_hx_tmp = (fn == this->displayName());
             		}
             		else {
-HXLINE( 810)			_hx_tmp = true;
+HXLINE( 917)			_hx_tmp = true;
             		}
-HXDLIN( 810)		if (_hx_tmp) {
-HXLINE( 810)			return false;
+HXDLIN( 917)		if (_hx_tmp) {
+HXLINE( 917)			return false;
             		}
-HXLINE( 811)		this->_displayName = fn;
-HXLINE( 812)		::Dynamic _hx_tmp2 = this->persistence;
-HXDLIN( 812)		::String _hx_tmp3 = this->jid->asBare()->asString();
-HXDLIN( 812)		::String tmp = this->stream->clientId;
-HXDLIN( 812)		::String _hx_tmp4;
-HXDLIN( 812)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 812)			_hx_tmp4 = tmp;
+HXLINE( 918)		this->_displayName = fn;
+HXLINE( 919)		::Dynamic _hx_tmp2 = this->persistence;
+HXDLIN( 919)		::String _hx_tmp3 = this->jid->asBare()->asString();
+HXDLIN( 919)		::String tmp = this->stream->clientId;
+HXDLIN( 919)		::String _hx_tmp4;
+HXDLIN( 919)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 919)			_hx_tmp4 = tmp;
             		}
             		else {
-HXLINE( 812)			_hx_tmp4 = this->jid->resource;
+HXLINE( 919)			_hx_tmp4 = this->jid->resource;
             		}
-HXDLIN( 812)		::borogove::Persistence_obj::storeLogin(_hx_tmp2,_hx_tmp3,_hx_tmp4,fn,null());
-HXLINE( 813)		this->pingAllChannels(false);
-HXLINE( 814)		return true;
+HXDLIN( 919)		::borogove::Persistence_obj::storeLogin(_hx_tmp2,_hx_tmp3,_hx_tmp4,fn,null());
+HXLINE( 920)		this->pingAllChannels(false);
+HXLINE( 921)		return true;
             	}
 
 
@@ -2337,11 +2677,11 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,updateDisplayName,return )
  ::borogove::EventResult Client_obj::onConnected( ::Dynamic data){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis) HXARGC(2)
             		void _hx_run( ::Dynamic service, ::borogove::Caps caps){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_840_onConnected)
-HXLINE( 840)			::Dynamic _gthis1 = _gthis->persistence;
-HXDLIN( 840)			::String _hx_tmp = _gthis->accountId();
-HXDLIN( 840)			::String _hx_tmp1 = ( ( ::borogove::JID)(service->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) )->asString();
-HXDLIN( 840)			::borogove::Persistence_obj::storeService(_gthis1,_hx_tmp,_hx_tmp1, ::Dynamic(service->__Field(HX_("name",4b,72,ff,48),::hx::paccDynamic)), ::Dynamic(service->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic)),caps);
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_957_onConnected)
+HXLINE( 957)			::Dynamic _gthis1 = _gthis->persistence;
+HXDLIN( 957)			::String _hx_tmp = _gthis->accountId();
+HXDLIN( 957)			::String _hx_tmp1 = ( ( ::borogove::JID)(service->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) )->asString();
+HXDLIN( 957)			::borogove::Persistence_obj::storeService(_gthis1,_hx_tmp,_hx_tmp1, ::Dynamic(service->__Field(HX_("name",4b,72,ff,48),::hx::paccDynamic)), ::Dynamic(service->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic)),caps);
             		}
             		HX_END_LOCAL_FUNC2((void))
 
@@ -2351,125 +2691,153 @@ HXDLIN( 840)			::borogove::Persistence_obj::storeService(_gthis1,_hx_tmp,_hx_tmp
             			void _hx_run(bool syncFinished){
             				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::Client,_gthis) HXARGC(1)
             				void _hx_run(::Array< ::Dynamic> details){
-            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_857_onConnected)
-HXLINE( 858)					{
-HXLINE( 858)						int _g = 0;
-HXDLIN( 858)						while((_g < details->length)){
-HXLINE( 858)							 ::Dynamic detail = details->__get(_g);
-HXDLIN( 858)							_g = (_g + 1);
-HXLINE( 859)							 ::borogove::Chat chat;
-HXDLIN( 859)							 ::borogove::Chat tmp = _gthis->getChat(( (::String)(detail->__Field(HX_("chatId",d3,04,77,b7),::hx::paccDynamic)) ));
-HXDLIN( 859)							if (::hx::IsNotNull( tmp )) {
-HXLINE( 859)								chat = tmp;
+            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_974_onConnected)
+HXLINE( 975)					{
+HXLINE( 975)						int _g = 0;
+HXDLIN( 975)						while((_g < details->length)){
+HXLINE( 975)							 ::Dynamic detail = details->__get(_g);
+HXDLIN( 975)							_g = (_g + 1);
+HXLINE( 976)							 ::borogove::Chat chat;
+HXDLIN( 976)							 ::borogove::Chat tmp = _gthis->getChat(( (::String)(detail->__Field(HX_("chatId",d3,04,77,b7),::hx::paccDynamic)) ));
+HXDLIN( 976)							if (::hx::IsNotNull( tmp )) {
+HXLINE( 976)								chat = tmp;
             							}
             							else {
-HXLINE( 859)								chat = _gthis->getDirectChat(( (::String)(detail->__Field(HX_("chatId",d3,04,77,b7),::hx::paccDynamic)) ),false);
+HXLINE( 976)								chat = _gthis->getDirectChat(( (::String)(detail->__Field(HX_("chatId",d3,04,77,b7),::hx::paccDynamic)) ),false);
             							}
-HXLINE( 860)							::String initialLastId = chat->lastMessageId();
-HXLINE( 861)							if (::hx::IsNotNull( detail->__Field(HX_("message",c7,35,11,9a),::hx::paccDynamic) )) {
-HXLINE( 861)								chat->setLastMessage(( ( ::borogove::ChatMessage)(detail->__Field(HX_("message",c7,35,11,9a),::hx::paccDynamic)) ));
+HXLINE( 977)							 ::borogove::ChatMessage initialLast = chat->lastMessage;
+HXLINE( 978)							if (::hx::IsNotNull( detail->__Field(HX_("message",c7,35,11,9a),::hx::paccDynamic) )) {
+HXLINE( 978)								chat->setLastMessage(( ( ::borogove::ChatMessage)(detail->__Field(HX_("message",c7,35,11,9a),::hx::paccDynamic)) ));
             							}
-HXLINE( 862)							chat->setUnreadCount(( (int)(detail->__Field(HX_("unreadCount",20,18,f1,a0),::hx::paccDynamic)) ));
-HXLINE( 863)							bool _hx_tmp;
-HXDLIN( 863)							if (::hx::IsGreater( detail->__Field(HX_("unreadCount",20,18,f1,a0),::hx::paccDynamic),0 )) {
-HXLINE( 863)								_hx_tmp = (initialLastId != chat->lastMessageId());
+HXLINE( 979)							chat->setUnreadCount(( (int)(detail->__Field(HX_("unreadCount",20,18,f1,a0),::hx::paccDynamic)) ));
+HXLINE( 980)							bool _hx_tmp;
+HXDLIN( 980)							bool _hx_tmp1;
+HXDLIN( 980)							if (::hx::IsGreater( detail->__Field(HX_("unreadCount",20,18,f1,a0),::hx::paccDynamic),0 )) {
+HXLINE( 980)								_hx_tmp1 = ::hx::IsNotNull( initialLast );
             							}
             							else {
-HXLINE( 863)								_hx_tmp = false;
+HXLINE( 980)								_hx_tmp1 = false;
             							}
-HXDLIN( 863)							if (_hx_tmp) {
-HXLINE( 864)								_gthis->chatActivity(chat,false);
+HXDLIN( 980)							if (_hx_tmp1) {
+HXLINE( 980)								_hx_tmp = !(initialLast->canReplace(chat->lastMessage));
+            							}
+            							else {
+HXLINE( 980)								_hx_tmp = false;
+            							}
+HXDLIN( 980)							if (_hx_tmp) {
+HXLINE( 981)								_gthis->chatActivity(chat,false);
             							}
             						}
             					}
-HXLINE( 867)					_gthis->sortChats();
-HXLINE( 868)					_gthis->trigger(HX_("chats/update",3d,8e,1d,14),_gthis->chats);
-HXLINE( 870)					if (_gthis->sendAvailable) {
-HXLINE( 872)						 ::borogove::Client _gthis1 = _gthis;
-HXLINE( 873)						::String _hx_tmp1 = ::borogove::ID_obj::_hx_short();
-HXLINE( 872)						_gthis1->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
-            							->setFixed(0,HX_("id",db,5b,00,00),_hx_tmp1)
+HXLINE( 984)					_gthis->sortChats();
+HXLINE( 985)					_gthis->trigger(HX_("chats/update",3d,8e,1d,14),_gthis->chats);
+HXLINE( 987)					if (_gthis->sendAvailable) {
+HXLINE( 989)						 ::borogove::Client _gthis1 = _gthis;
+HXLINE( 990)						::String _hx_tmp2 = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXLINE( 989)						_gthis1->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+            							->setFixed(0,HX_("id",db,5b,00,00),_hx_tmp2)
             							->setFixed(1,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("enable",83,ae,87,f8), ::Dynamic(::hx::Anon_obj::Create(1)
             							->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:carbons:2",02,86,9e,df))))->up());
-HXLINE( 877)						_gthis->sendPresence(null(),null());
-HXLINE( 878)						_gthis->joinAllChannels();
+HXLINE( 994)						_gthis->sendPresence(null(),null());
+HXLINE( 995)						_gthis->joinAllChannels();
             					}
-HXLINE( 880)					_gthis->trigger(HX_("status/online",10,05,0e,d2), ::Dynamic(::hx::Anon_obj::Create(0)));
-HXLINE( 881)					::haxe::Log_obj::trace(HX_("SYNC: done",c3,a6,82,dd),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),881,HX_("borogove.Client",18,dc,e6,c0),HX_("onConnected",aa,c5,39,c5)));
+HXLINE( 997)					_gthis->trigger(HX_("status/online",10,05,0e,d2), ::Dynamic(::hx::Anon_obj::Create(0)));
+HXLINE( 998)					::haxe::Log_obj::trace(HX_("SYNC: done",c3,a6,82,dd),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),998,HX_("borogove.Client",18,dc,e6,c0),HX_("onConnected",aa,c5,39,c5)));
             				}
             				HX_END_LOCAL_FUNC1((void))
 
-            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_846_onConnected)
-HXLINE( 847)				if (!(syncFinished)) {
-HXLINE( 848)					::haxe::Log_obj::trace(HX_("SYNC: failed",3e,4e,5e,fa),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),848,HX_("borogove.Client",18,dc,e6,c0),HX_("onConnected",aa,c5,39,c5)));
-HXLINE( 849)					_gthis->inSync = false;
-HXLINE( 850)					_gthis->stream->disconnect();
-HXLINE( 852)					return;
+            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_963_onConnected)
+HXLINE( 964)				if (!(syncFinished)) {
+HXLINE( 965)					::haxe::Log_obj::trace(HX_("SYNC: failed",3e,4e,5e,fa),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),965,HX_("borogove.Client",18,dc,e6,c0),HX_("onConnected",aa,c5,39,c5)));
+HXLINE( 966)					_gthis->inSync = false;
+HXLINE( 967)					_gthis->stream->disconnect();
+HXLINE( 969)					return;
             				}
-HXLINE( 855)				::haxe::Log_obj::trace(HX_("SYNC: details",21,c5,8e,ac),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),855,HX_("borogove.Client",18,dc,e6,c0),HX_("onConnected",aa,c5,39,c5)));
-HXLINE( 856)				_gthis->inSync = true;
-HXLINE( 857)				::Dynamic _gthis1 = _gthis->persistence;
-HXDLIN( 857)				::String _hx_tmp = _gthis->accountId();
-HXDLIN( 857)				::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getChatsUnreadDetails(_gthis1,_hx_tmp,_gthis->chats), ::Dynamic(new _hx_Closure_1(_gthis)),null());
+HXLINE( 972)				::haxe::Log_obj::trace(HX_("SYNC: details",21,c5,8e,ac),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),972,HX_("borogove.Client",18,dc,e6,c0),HX_("onConnected",aa,c5,39,c5)));
+HXLINE( 973)				_gthis->inSync = true;
+HXLINE( 974)				::Dynamic _gthis1 = _gthis->persistence;
+HXDLIN( 974)				::String _hx_tmp = _gthis->accountId();
+HXDLIN( 974)				::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getChatsUnreadDetails(_gthis1,_hx_tmp,_gthis->chats), ::Dynamic(new _hx_Closure_1(_gthis)),null());
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_844_onConnected)
-HXLINE( 845)			::haxe::Log_obj::trace(HX_("SYNC: MAM",58,33,e1,36),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),845,HX_("borogove.Client",18,dc,e6,c0),HX_("onConnected",aa,c5,39,c5)));
-HXLINE( 846)			_gthis->sync( ::Dynamic(new _hx_Closure_2(_gthis)));
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_961_onConnected)
+HXLINE( 962)			::haxe::Log_obj::trace(HX_("SYNC: MAM",58,33,e1,36),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),962,HX_("borogove.Client",18,dc,e6,c0),HX_("onConnected",aa,c5,39,c5)));
+HXLINE( 963)			_gthis->sync( ::Dynamic(new _hx_Closure_2(_gthis)));
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_817_onConnected)
-HXDLIN( 817)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 818)		bool _hx_tmp;
-HXDLIN( 818)		if (::hx::IsNotNull( data )) {
-HXLINE( 818)			_hx_tmp = ::hx::IsNotNull( data->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic) );
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_924_onConnected)
+HXDLIN( 924)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 925)		bool _hx_tmp;
+HXDLIN( 925)		if (::hx::IsNotNull( data )) {
+HXLINE( 925)			_hx_tmp = ::hx::IsNotNull( data->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic) );
             		}
             		else {
-HXLINE( 818)			_hx_tmp = false;
+HXLINE( 925)			_hx_tmp = false;
             		}
-HXDLIN( 818)		if (_hx_tmp) {
-HXLINE( 819)			this->jid = ::borogove::JID_obj::parse(( (::String)(data->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) ));
-HXLINE( 820)			bool _hx_tmp1;
-HXDLIN( 820)			if (::hx::IsNull( this->stream->clientId )) {
-HXLINE( 820)				_hx_tmp1 = !(this->jid->isBare());
+HXDLIN( 925)		if (_hx_tmp) {
+HXLINE( 926)			this->jid = ::borogove::JID_obj::parse(( (::String)(data->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) ));
+HXLINE( 927)			bool _hx_tmp1;
+HXDLIN( 927)			if (::hx::IsNull( this->stream->clientId )) {
+HXLINE( 927)				_hx_tmp1 = !(this->jid->isBare());
             			}
             			else {
-HXLINE( 820)				_hx_tmp1 = false;
-            			}
-HXDLIN( 820)			if (_hx_tmp1) {
-HXLINE( 820)				::Dynamic _hx_tmp2 = this->persistence;
-HXDLIN( 820)				::String _hx_tmp3 = this->jid->asBare()->asString();
-HXDLIN( 820)				::String _hx_tmp4 = this->jid->resource;
-HXDLIN( 820)				::borogove::Persistence_obj::storeLogin(_hx_tmp2,_hx_tmp3,_hx_tmp4,this->displayName(),null());
-            			}
-            		}
-HXLINE( 823)		if (( (bool)(data->__Field(HX_("resumed",17,0e,58,6b),::hx::paccDynamic)) )) {
-HXLINE( 824)			this->inSync = true;
-HXLINE( 825)			{
-HXLINE( 825)				int _g = 0;
-HXDLIN( 825)				::Array< ::Dynamic> _g1 = this->getChats();
-HXDLIN( 825)				while((_g < _g1->length)){
-HXLINE( 825)					 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
-HXDLIN( 825)					_g = (_g + 1);
-HXLINE( 826)					 ::borogove::Channel channel = ( ( ::borogove::Channel)(::Std_obj::downcast(chat,::hx::ClassOf< ::borogove::Channel >())) );
-HXLINE( 827)					if (::hx::IsNotNull( channel )) {
-HXLINE( 828)						channel->inSync = true;
-            					}
-            				}
-            			}
-HXLINE( 832)			this->stream->emitSMupdates = true;
-HXLINE( 833)			this->trigger(HX_("status/online",10,05,0e,d2), ::Dynamic(::hx::Anon_obj::Create(0)));
-HXLINE( 834)			this->trigger(HX_("chats/update",3d,8e,1d,14),this->chats);
-HXLINE( 835)			return ::borogove::EventResult_obj::EventHandled_dyn();
-            		}
-HXLINE( 839)		this->discoverServices( ::borogove::JID_obj::__alloc( HX_CTX ,null(),this->jid->domain,null(),null()),null(), ::Dynamic(new _hx_Closure_0(_gthis)));
-HXLINE( 842)		this->rosterGet();
-HXLINE( 843)		::haxe::Log_obj::trace(HX_("SYNC: bookmarks",1c,91,b3,0d),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),843,HX_("borogove.Client",18,dc,e6,c0),HX_("onConnected",aa,c5,39,c5)));
-HXLINE( 844)		this->bookmarksGet( ::Dynamic(new _hx_Closure_3(_gthis)));
-HXLINE( 886)		this->trigger(HX_("session-started",0a,96,19,bc), ::Dynamic(::hx::Anon_obj::Create(0)));
-HXLINE( 888)		return ::borogove::EventResult_obj::EventHandled_dyn();
+HXLINE( 927)				_hx_tmp1 = false;
+            			}
+HXDLIN( 927)			if (_hx_tmp1) {
+HXLINE( 927)				::Dynamic _hx_tmp2 = this->persistence;
+HXDLIN( 927)				::String _hx_tmp3 = this->jid->asBare()->asString();
+HXDLIN( 927)				::String _hx_tmp4;
+HXDLIN( 927)				::String tmp = this->stream->clientId;
+HXDLIN( 927)				if (::hx::IsNotNull( tmp )) {
+HXLINE( 927)					_hx_tmp4 = tmp;
+            				}
+            				else {
+HXLINE( 927)					_hx_tmp4 = this->jid->resource;
+            				}
+HXDLIN( 927)				::borogove::Persistence_obj::storeLogin(_hx_tmp2,_hx_tmp3,_hx_tmp4,this->displayName(),null());
+            			}
+            		}
+HXLINE( 930)		if (( (bool)(data->__Field(HX_("resumed",17,0e,58,6b),::hx::paccDynamic)) )) {
+HXLINE( 931)			this->inSync = true;
+HXLINE( 932)			if (this->firstSync) {
+HXLINE( 935)				int _g = 0;
+HXDLIN( 935)				::Array< ::Dynamic> _g1 = this->getChats();
+HXDLIN( 935)				while((_g < _g1->length)){
+HXLINE( 935)					 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
+HXDLIN( 935)					_g = (_g + 1);
+HXLINE( 936)					 ::borogove::Channel channel = ( ( ::borogove::Channel)(::Std_obj::downcast(chat,::hx::ClassOf< ::borogove::Channel >())) );
+HXLINE( 937)					if (::hx::IsNotNull( channel )) {
+HXLINE( 938)						channel->inSync = true;
+            					}
+            				}
+            			}
+HXLINE( 943)			this->stream->emitSMupdates = true;
+HXLINE( 944)			this->trigger(HX_("status/online",10,05,0e,d2), ::Dynamic(::hx::Anon_obj::Create(0)));
+HXLINE( 945)			this->trigger(HX_("chats/update",3d,8e,1d,14),this->chats);
+HXLINE( 946)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            		}
+HXLINE( 950)		::Dynamic _hx_tmp5 = this->persistence;
+HXDLIN( 950)		::borogove::Persistence_obj::clearMemberPresence(_hx_tmp5,this->accountId(),null());
+HXLINE( 951)		{
+HXLINE( 951)			int _g2 = 0;
+HXDLIN( 951)			::Array< ::Dynamic> _g3 = this->chats;
+HXDLIN( 951)			while((_g2 < _g3->length)){
+HXLINE( 951)				 ::borogove::Chat chat1 = _g3->__get(_g2).StaticCast<  ::borogove::Chat >();
+HXDLIN( 951)				_g2 = (_g2 + 1);
+HXLINE( 952)				 ::borogove::DirectChat directChat = ( ( ::borogove::DirectChat)(::borogove::_Util::Util_Fields__obj::downcast(chat1,::hx::ClassOf< ::borogove::DirectChat >())) );
+HXLINE( 953)				if (::hx::IsNotNull( directChat )) {
+HXLINE( 953)					directChat->presence->clear();
+            				}
+            			}
+            		}
+HXLINE( 956)		this->discoverServices( ::borogove::JID_obj::__alloc( HX_CTX ,null(),this->jid->domain,null(),null()),null(), ::Dynamic(new _hx_Closure_0(_gthis)));
+HXLINE( 959)		this->rosterGet();
+HXLINE( 960)		::haxe::Log_obj::trace(HX_("SYNC: bookmarks",1c,91,b3,0d),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),960,HX_("borogove.Client",18,dc,e6,c0),HX_("onConnected",aa,c5,39,c5)));
+HXLINE( 961)		this->bookmarksGet( ::Dynamic(new _hx_Closure_3(_gthis)));
+HXLINE(1003)		this->trigger(HX_("session-started",0a,96,19,bc), ::Dynamic(::hx::Anon_obj::Create(0)));
+HXLINE(1005)		return ::borogove::EventResult_obj::EventHandled_dyn();
             	}
 
 
@@ -2478,110 +2846,110 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,onConnected,return )
 ::Dynamic Client_obj::prepareAttachment( ::borogove::AttachmentSource source){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_3, ::borogove::AttachmentSource,source, ::borogove::Client,_gthis) HXARGC(1)
             		::Dynamic _hx_run(::Array< ::Dynamic> services){
-            			HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_2, ::borogove::Client,_gthis, ::borogove::AttachmentSource,source,::Array< ::Dynamic>,services, ::sha::SHA256,sha256) HXARGC(2)
+            			HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_2, ::borogove::Client,_gthis, ::borogove::AttachmentSource,source,::Array< ::Dynamic>,services, ::haxe::crypto::Sha256,sha256) HXARGC(2)
             			void _hx_run( ::Dynamic resolve, ::Dynamic reject){
-            				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::sha::SHA256,sha256) HXARGC(1)
+            				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::haxe::crypto::Sha256,sha256) HXARGC(1)
             				 ::tink::streams::Handled _hx_run(::Dynamic chunk){
-            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_901_prepareAttachment)
-HXLINE( 902)					 ::sha::SHA256 sha2561 = sha256;
-HXDLIN( 902)					sha2561->update(::tink::chunk::ChunkObject_obj::toBytes(chunk));
-HXLINE( 903)					return ::tink::streams::Handled_obj::Resume_dyn();
+            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1018_prepareAttachment)
+HXLINE(1019)					 ::haxe::crypto::Sha256 sha2561 = sha256;
+HXDLIN(1019)					sha2561->update(::tink::chunk::ChunkObject_obj::toBytes(chunk));
+HXLINE(1020)					return ::tink::streams::Handled_obj::Resume_dyn();
             				}
             				HX_END_LOCAL_FUNC1(return)
 
-            				HX_BEGIN_LOCAL_FUNC_S6(::hx::LocalFunc,_hx_Closure_1, ::borogove::AttachmentSource,source, ::borogove::Client,_gthis, ::Dynamic,resolve, ::Dynamic,reject,::Array< ::Dynamic>,services, ::sha::SHA256,sha256) HXARGC(1)
+            				HX_BEGIN_LOCAL_FUNC_S6(::hx::LocalFunc,_hx_Closure_1, ::borogove::AttachmentSource,source, ::borogove::Client,_gthis, ::Dynamic,resolve, ::Dynamic,reject,::Array< ::Dynamic>,services, ::haxe::crypto::Sha256,sha256) HXARGC(1)
             				void _hx_run( ::tink::streams::Conclusion o){
-            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_904_prepareAttachment)
-HXLINE( 904)					if ((o->_hx_getIndex() == 3)) {
-HXLINE( 906)						 ::borogove::Client _gthis1 = _gthis;
-HXDLIN( 906)						 ::borogove::AttachmentSource source1 = source;
-HXDLIN( 906)						::Array< ::Dynamic> services1 = services;
-HXDLIN( 906)						::Array< unsigned char > _hx_tmp = sha256->digest()->b;
-HXDLIN( 906)						_gthis1->prepareAttachmentFor(source1,services1,::Array_obj< ::Dynamic>::__new(1)->init(0, ::borogove::Hash_obj::__alloc( HX_CTX ,HX_("sha-256",32,dd,04,3b),_hx_tmp)),resolve);
+            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1021_prepareAttachment)
+HXLINE(1021)					if ((o->_hx_getIndex() == 3)) {
+HXLINE(1023)						 ::borogove::Client _gthis1 = _gthis;
+HXDLIN(1023)						 ::borogove::AttachmentSource source1 = source;
+HXDLIN(1023)						::Array< ::Dynamic> services1 = services;
+HXDLIN(1023)						::Array< unsigned char > _hx_tmp = sha256->digest()->b;
+HXDLIN(1023)						_gthis1->prepareAttachmentFor(source1,services1,::Array_obj< ::Dynamic>::__new(1)->init(0, ::borogove::Hash_obj::__alloc( HX_CTX ,HX_("sha-256",32,dd,04,3b),_hx_tmp)),resolve);
             					}
             					else {
-HXLINE( 908)						::haxe::Log_obj::trace(HX_("Error computing attachment hash",07,33,1d,57), ::Dynamic(::hx::Anon_obj::Create(5)
+HXLINE(1025)						::haxe::Log_obj::trace(HX_("Error computing attachment hash",07,33,1d,57), ::Dynamic(::hx::Anon_obj::Create(5)
             							->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Client",18,dc,e6,c0))
             							->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,o))
             							->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("prepareAttachment",4a,6c,4b,52))
             							->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Client.hx",85,7d,15,8e))
-            							->setFixed(4,HX_("lineNumber",dd,81,22,76),908)));
-HXLINE( 909)						reject(o);
+            							->setFixed(4,HX_("lineNumber",dd,81,22,76),1025)));
+HXLINE(1026)						reject(o);
             					}
             				}
             				HX_END_LOCAL_FUNC1((void))
 
-            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_901_prepareAttachment)
-HXLINE( 901)				::String name = source->name;
-HXDLIN( 901)				 ::haxe::io::Input input = ::sys::io::File_obj::read(source->path,null());
-HXDLIN( 901)				 ::Dynamic options = null();
-HXDLIN( 901)				options =  ::Dynamic(::hx::Anon_obj::Create(0));
-HXDLIN( 901)				::Dynamic this1 = ::tink::io::_Worker::Worker_Impl__obj::ensure( ::Dynamic(options->__Field(HX_("worker",7e,30,9e,c9),::hx::paccDynamic)));
-HXDLIN( 901)				 ::Dynamic _g = options->__Field(HX_("chunkSize",ce,cd,77,9f),::hx::paccDynamic);
-HXDLIN( 901)				int this2;
-HXDLIN( 901)				if (::hx::IsNull( _g )) {
-HXLINE( 901)					this2 = 65536;
+            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1018_prepareAttachment)
+HXLINE(1018)				::String name = source->name;
+HXDLIN(1018)				 ::haxe::io::Input input = ::sys::io::File_obj::read(source->path,null());
+HXDLIN(1018)				 ::Dynamic options = null();
+HXDLIN(1018)				options =  ::Dynamic(::hx::Anon_obj::Create(0));
+HXDLIN(1018)				::Dynamic this1 = ::tink::io::_Worker::Worker_Impl__obj::ensure( ::Dynamic(options->__Field(HX_("worker",7e,30,9e,c9),::hx::paccDynamic)));
+HXDLIN(1018)				 ::Dynamic _g = options->__Field(HX_("chunkSize",ce,cd,77,9f),::hx::paccDynamic);
+HXDLIN(1018)				int this2;
+HXDLIN(1018)				if (::hx::IsNull( _g )) {
+HXLINE(1018)					this2 = 65536;
             				}
             				else {
-HXLINE( 901)					this2 = ( (int)(_g) );
+HXLINE(1018)					this2 = ( (int)(_g) );
             				}
-HXDLIN( 901)				::Dynamic this3 = ::tink::io::_Source::Source_Impl__obj::chunked( ::tink::io::std::InputSource_obj::__alloc( HX_CTX ,name,input,this1,::haxe::io::Bytes_obj::alloc(this2),0));
-HXDLIN( 901)				::tink::streams::StreamObject_obj::forEach(this3,::tink::streams::_Stream::Handler_Impl__obj::ofSafeSync( ::Dynamic(new _hx_Closure_0(sha256))))->handle( ::Dynamic(new _hx_Closure_1(source,_gthis,resolve,reject,services,sha256)));
+HXDLIN(1018)				::Dynamic this3 = ::tink::io::_Source::Source_Impl__obj::chunked( ::tink::io::std::InputSource_obj::__alloc( HX_CTX ,name,input,this1,::haxe::io::Bytes_obj::alloc(this2),0));
+HXDLIN(1018)				::tink::streams::StreamObject_obj::forEach(this3,::tink::streams::_Stream::Handler_Impl__obj::ofSafeSync( ::Dynamic(new _hx_Closure_0(sha256))))->handle( ::Dynamic(new _hx_Closure_1(source,_gthis,resolve,reject,services,sha256)));
             			}
             			HX_END_LOCAL_FUNC2((void))
 
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_898_prepareAttachment)
-HXLINE( 899)			 ::sha::SHA256 sha256 =  ::sha::SHA256_obj::__alloc( HX_CTX );
-HXLINE( 900)			return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_2(_gthis,source,services,sha256)));
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1015_prepareAttachment)
+HXLINE(1016)			 ::haxe::crypto::Sha256 sha256 =  ::haxe::crypto::Sha256_obj::__alloc( HX_CTX );
+HXLINE(1017)			return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_2(_gthis,source,services,sha256)));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_897_prepareAttachment)
-HXDLIN( 897)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 898)		::Dynamic _hx_tmp = this->persistence;
-HXDLIN( 898)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::findServicesWithFeature(_hx_tmp,this->accountId(),HX_("urn:xmpp:http:upload:0",0d,db,46,68)), ::Dynamic(new _hx_Closure_3(source,_gthis)),null());
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1014_prepareAttachment)
+HXDLIN(1014)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1015)		::Dynamic _hx_tmp = this->persistence;
+HXDLIN(1015)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::findServicesWithFeature(_hx_tmp,this->accountId(),HX_("urn:xmpp:http:upload:0",0d,db,46,68)), ::Dynamic(new _hx_Closure_3(source,_gthis)),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Client_obj,prepareAttachment,return )
 
 void Client_obj::prepareAttachment__fromC( ::borogove::AttachmentSource source,::cpp::Function< void  (void*,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_337_prepareAttachment__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			this->prepareAttachment(source);
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_365_prepareAttachment__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->prepareAttachment(source);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::borogove::ChatAttachment v){
-            				HX_STACKFRAME(&_hx_pos_afe14372debdebc6_337_prepareAttachment__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void*,void*) > handler1 = handler;
-HXLINE( 314)				 ::Dynamic haxeObject = v;
-HXDLIN( 314)				void* ptr = haxeObject.mPtr;
-HXDLIN( 314)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 314)				{
-HXLINE( 314)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 314)					if (::hx::IsNull( store )) {
-HXLINE( 314)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            				HX_STACKFRAME(&_hx_pos_afe14372debdebc6_365_prepareAttachment__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 314)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             					}
             					else {
-HXLINE( 314)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             					}
             				}
-HXLINE( 337)				handler1(ptr,handler__context);
+HXLINE( 365)				handler1(ptr,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_afe14372debdebc6_337_prepareAttachment__fromC)
-HXDLIN( 337)				handler(null(),handler__context);
+            				HX_STACKFRAME(&_hx_pos_afe14372debdebc6_365_prepareAttachment__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->prepareAttachment(source), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->prepareAttachment(source), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
@@ -2589,70 +2957,70 @@ HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->prepareAttach
 void Client_obj::prepareAttachmentFor( ::borogove::AttachmentSource source,::Array< ::Dynamic> services,::Array< ::Dynamic> hashes, ::Dynamic callback){
             		HX_BEGIN_LOCAL_FUNC_S6(::hx::LocalFunc,_hx_Closure_2, ::borogove::AttachmentSource,source, ::borogove::Client,_gthis,::Array< ::Dynamic>,hashes,::Array< ::Dynamic>,services, ::borogove::queries::HttpUploadSlot,httpUploadSlot, ::Dynamic,callback) HXARGC(0)
             		void _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_922_prepareAttachmentFor)
-HXLINE( 923)			 ::Dynamic slot = httpUploadSlot->getResult();
-HXLINE( 924)			if (::hx::IsNull( slot )) {
-HXLINE( 925)				 ::borogove::Client _gthis1 = _gthis;
-HXDLIN( 925)				 ::borogove::AttachmentSource source1 = source;
-HXDLIN( 925)				::Array< ::Dynamic> _hx_tmp = services->slice(1,null());
-HXDLIN( 925)				_gthis1->prepareAttachmentFor(source1,_hx_tmp,hashes,callback);
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1039_prepareAttachmentFor)
+HXLINE(1040)			 ::Dynamic slot = httpUploadSlot->getResult();
+HXLINE(1041)			if (::hx::IsNull( slot )) {
+HXLINE(1042)				 ::borogove::Client _gthis1 = _gthis;
+HXDLIN(1042)				 ::borogove::AttachmentSource source1 = source;
+HXDLIN(1042)				::Array< ::Dynamic> _hx_tmp = services->slice(1,null());
+HXDLIN(1042)				_gthis1->prepareAttachmentFor(source1,_hx_tmp,hashes,callback);
             			}
             			else {
             				HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             				::Dynamic _hx_run( ::tink::core::TypedError e){
-            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_927_prepareAttachmentFor)
-HXLINE( 927)					::haxe::Log_obj::trace(HX_("WUT",76,4e,42,00), ::Dynamic(::hx::Anon_obj::Create(5)
+            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1044_prepareAttachmentFor)
+HXLINE(1044)					::haxe::Log_obj::trace(HX_("prepareAttachmentFor ERROR",a7,5d,62,48), ::Dynamic(::hx::Anon_obj::Create(5)
             						->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Client",18,dc,e6,c0))
             						->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,e))
             						->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("prepareAttachmentFor",df,5c,bf,82))
             						->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Client.hx",85,7d,15,8e))
-            						->setFixed(4,HX_("lineNumber",dd,81,22,76),927)));
-HXDLIN( 927)					HX_STACK_DO_THROW(e);
-HXDLIN( 927)					return null();
+            						->setFixed(4,HX_("lineNumber",dd,81,22,76),1044)));
+HXDLIN(1044)					HX_STACK_DO_THROW(e);
+HXDLIN(1044)					return null();
             				}
             				HX_END_LOCAL_FUNC1(return)
 
             				HX_BEGIN_LOCAL_FUNC_S6(::hx::LocalFunc,_hx_Closure_1, ::borogove::Client,_gthis, ::Dynamic,slot, ::borogove::AttachmentSource,source,::Array< ::Dynamic>,hashes,::Array< ::Dynamic>,services, ::Dynamic,callback) HXARGC(1)
             				void _hx_run( ::tink::core::Outcome o){
-            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_928_prepareAttachmentFor)
-HXLINE( 928)					if ((o->_hx_getIndex() == 0)) {
-HXLINE( 929)						if ((( ( ::tink::http::ResponseHeaderBase)(( ( ::tink::http::Message)(o->_hx_getObject(0)) )->header) )->statusCode == 201)) {
-HXLINE( 930)							callback( ::borogove::ChatAttachment_obj::__alloc( HX_CTX ,source->name,source->type,source->size,::Array_obj< ::String >::__new(1)->init(0, ::Dynamic(slot->__Field(HX_("get",96,80,4e,00),::hx::paccDynamic))),hashes));
+            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1045_prepareAttachmentFor)
+HXLINE(1045)					if ((o->_hx_getIndex() == 0)) {
+HXLINE(1046)						if ((( ( ::tink::http::ResponseHeaderBase)(( ( ::tink::http::Message)(o->_hx_getObject(0)) )->header) )->statusCode == 201)) {
+HXLINE(1047)							callback( ::borogove::ChatAttachment_obj::__alloc( HX_CTX ,source->name,source->type,source->size,::Array_obj< ::String >::__new(1)->init(0, ::Dynamic(slot->__Field(HX_("get",96,80,4e,00),::hx::paccDynamic))),hashes));
             						}
             						else {
-HXLINE( 932)							 ::borogove::Client _gthis1 = _gthis;
-HXDLIN( 932)							 ::borogove::AttachmentSource source1 = source;
-HXDLIN( 932)							::Array< ::Dynamic> _hx_tmp = services->slice(1,null());
-HXDLIN( 932)							_gthis1->prepareAttachmentFor(source1,_hx_tmp,hashes,callback);
+HXLINE(1049)							 ::borogove::Client _gthis1 = _gthis;
+HXDLIN(1049)							 ::borogove::AttachmentSource source1 = source;
+HXDLIN(1049)							::Array< ::Dynamic> _hx_tmp = services->slice(1,null());
+HXDLIN(1049)							_gthis1->prepareAttachmentFor(source1,_hx_tmp,hashes,callback);
             						}
             					}
             					else {
-HXLINE( 932)						 ::borogove::Client _gthis2 = _gthis;
-HXDLIN( 932)						 ::borogove::AttachmentSource source2 = source;
-HXDLIN( 932)						::Array< ::Dynamic> _hx_tmp1 = services->slice(1,null());
-HXDLIN( 932)						_gthis2->prepareAttachmentFor(source2,_hx_tmp1,hashes,callback);
+HXLINE(1049)						 ::borogove::Client _gthis2 = _gthis;
+HXDLIN(1049)						 ::borogove::AttachmentSource source2 = source;
+HXDLIN(1049)						::Array< ::Dynamic> _hx_tmp1 = services->slice(1,null());
+HXDLIN(1049)						_gthis2->prepareAttachmentFor(source2,_hx_tmp1,hashes,callback);
             					}
             				}
             				HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 927)				 ::Dynamic url = ::tink::_Url::Url_Impl__obj::fromString(( (::String)(slot->__Field(HX_("put",cf,62,55,00),::hx::paccDynamic)) ));
-HXDLIN( 927)				::Array< ::Dynamic> slot1 = ( (::Array< ::Dynamic>)(slot->__Field(HX_("putHeaders",37,9f,1e,a4),::hx::paccDynamic)) );
-HXDLIN( 927)				::String options = HX_("Content-Length",fa,f8,b6,65).toLowerCase();
-HXDLIN( 927)				::Array< ::Dynamic> options1 = slot1->concat(::Array_obj< ::Dynamic>::__new(1)->init(0, ::tink::http::HeaderField_obj::__alloc( HX_CTX ,options,::tink::http::_Header::HeaderValue_Impl__obj::ofInt(source->size))));
-HXDLIN( 927)				::String name = source->name;
-HXDLIN( 927)				 ::haxe::io::Input input = ::sys::io::File_obj::read(source->path,null());
-HXDLIN( 927)				 ::Dynamic options2 = null();
-HXDLIN( 927)				options2 =  ::Dynamic(::hx::Anon_obj::Create(0));
-HXDLIN( 927)				::Dynamic options3 = ::tink::io::_Worker::Worker_Impl__obj::ensure( ::Dynamic(options2->__Field(HX_("worker",7e,30,9e,c9),::hx::paccDynamic)));
-HXDLIN( 927)				 ::Dynamic _g = options2->__Field(HX_("chunkSize",ce,cd,77,9f),::hx::paccDynamic);
-HXDLIN( 927)				int options4;
-HXDLIN( 927)				if (::hx::IsNull( _g )) {
-HXLINE( 927)					options4 = 65536;
+HXLINE(1044)				 ::Dynamic url = ::tink::_Url::Url_Impl__obj::fromString(( (::String)(slot->__Field(HX_("put",cf,62,55,00),::hx::paccDynamic)) ));
+HXDLIN(1044)				::Array< ::Dynamic> slot1 = ( (::Array< ::Dynamic>)(slot->__Field(HX_("putHeaders",37,9f,1e,a4),::hx::paccDynamic)) );
+HXDLIN(1044)				::String options = HX_("Content-Length",fa,f8,b6,65).toLowerCase();
+HXDLIN(1044)				::Array< ::Dynamic> options1 = slot1->concat(::Array_obj< ::Dynamic>::__new(1)->init(0, ::tink::http::HeaderField_obj::__alloc( HX_CTX ,options,::tink::http::_Header::HeaderValue_Impl__obj::ofInt(source->size))));
+HXDLIN(1044)				::String name = source->name;
+HXDLIN(1044)				 ::haxe::io::Input input = ::sys::io::File_obj::read(source->path,null());
+HXDLIN(1044)				 ::Dynamic options2 = null();
+HXDLIN(1044)				options2 =  ::Dynamic(::hx::Anon_obj::Create(0));
+HXDLIN(1044)				::Dynamic options3 = ::tink::io::_Worker::Worker_Impl__obj::ensure( ::Dynamic(options2->__Field(HX_("worker",7e,30,9e,c9),::hx::paccDynamic)));
+HXDLIN(1044)				 ::Dynamic _g = options2->__Field(HX_("chunkSize",ce,cd,77,9f),::hx::paccDynamic);
+HXDLIN(1044)				int options4;
+HXDLIN(1044)				if (::hx::IsNull( _g )) {
+HXLINE(1044)					options4 = 65536;
             				}
             				else {
-HXLINE( 927)					options4 = ( (int)(_g) );
+HXLINE(1044)					options4 = ( (int)(_g) );
             				}
-HXDLIN( 927)				::tink::http::_Fetch::FetchResponse_Impl__obj::all(::tink::http::Fetch_obj::fetch(url, ::Dynamic(::hx::Anon_obj::Create(3)
+HXDLIN(1044)				::tink::http::_Fetch::FetchResponse_Impl__obj::all(::tink::http::Fetch_obj::fetch(url, ::Dynamic(::hx::Anon_obj::Create(3)
             					->setFixed(0,HX_("method",e1,f6,5a,09),HX_("PUT",af,fe,3c,00))
             					->setFixed(1,HX_("body",a2,7a,1b,41),::tink::io::RealSourceTools_obj::idealize( ::tink::io::std::InputSource_obj::__alloc( HX_CTX ,name,input,options3,::haxe::io::Bytes_obj::alloc(options4),0), ::Dynamic(new _hx_Closure_0())))
             					->setFixed(2,HX_("headers",46,52,08,63),options1))))->handle( ::Dynamic(new _hx_Closure_1(_gthis,slot,source,hashes,services,callback)));
@@ -2660,641 +3028,396 @@ HXDLIN( 927)				::tink::http::_Fetch::FetchResponse_Impl__obj::all(::tink::http:
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_915_prepareAttachmentFor)
-HXDLIN( 915)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 916)		if ((services->length < 1)) {
-HXLINE( 917)			::haxe::Log_obj::trace(HX_("No HTTP upload service found",d1,5a,61,46),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),917,HX_("borogove.Client",18,dc,e6,c0),HX_("prepareAttachmentFor",df,5c,bf,82)));
-HXLINE( 918)			callback(null());
-HXLINE( 919)			return;
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1032_prepareAttachmentFor)
+HXDLIN(1032)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1033)		if ((services->length < 1)) {
+HXLINE(1034)			::haxe::Log_obj::trace(HX_("No HTTP upload service found",d1,5a,61,46),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),1034,HX_("borogove.Client",18,dc,e6,c0),HX_("prepareAttachmentFor",df,5c,bf,82)));
+HXLINE(1035)			callback(null());
+HXLINE(1036)			return;
             		}
-HXLINE( 921)		 ::borogove::queries::HttpUploadSlot httpUploadSlot =  ::borogove::queries::HttpUploadSlot_obj::__alloc( HX_CTX ,( (::String)(services->__get(0)->__Field(HX_("serviceId",70,93,d4,bc),::hx::paccDynamic)) ),source->name,source->size,source->type,hashes);
-HXLINE( 922)		httpUploadSlot->onFinished( ::Dynamic(new _hx_Closure_2(source,_gthis,hashes,services,httpUploadSlot,callback)));
-HXLINE( 936)		this->sendQuery(httpUploadSlot);
+HXLINE(1038)		 ::borogove::queries::HttpUploadSlot httpUploadSlot =  ::borogove::queries::HttpUploadSlot_obj::__alloc( HX_CTX ,( (::String)(services->__get(0)->__Field(HX_("serviceId",70,93,d4,bc),::hx::paccDynamic)) ),source->name,source->size,source->type,hashes);
+HXLINE(1039)		httpUploadSlot->onFinished( ::Dynamic(new _hx_Closure_2(source,_gthis,hashes,services,httpUploadSlot,callback)));
+HXLINE(1053)		this->sendQuery(httpUploadSlot);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC4(Client_obj,prepareAttachmentFor,(void))
 
 ::Array< ::Dynamic> Client_obj::getChats(){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_943_getChats)
-HXDLIN( 943)		::Array< ::Dynamic> _this = this->chats;
-HXDLIN( 943)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 943)		{
-HXDLIN( 943)			int _g1 = 0;
-HXDLIN( 943)			while((_g1 < _this->length)){
-HXDLIN( 943)				 ::borogove::Chat v = _this->__get(_g1).StaticCast<  ::borogove::Chat >();
-HXDLIN( 943)				_g1 = (_g1 + 1);
-HXDLIN( 943)				if ((v->uiState != 2)) {
-HXDLIN( 943)					_g->push(v);
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1060_getChats)
+HXDLIN(1060)		::Array< ::Dynamic> _this = this->chats;
+HXDLIN(1060)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN(1060)		{
+HXDLIN(1060)			int _g1 = 0;
+HXDLIN(1060)			while((_g1 < _this->length)){
+HXDLIN(1060)				 ::borogove::Chat v = _this->__get(_g1).StaticCast<  ::borogove::Chat >();
+HXDLIN(1060)				_g1 = (_g1 + 1);
+HXDLIN(1060)				if ((v->uiState != 2)) {
+HXDLIN(1060)					_g->push(v);
             				}
             			}
             		}
-HXDLIN( 943)		return _g;
+HXDLIN(1060)		return _g;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Client_obj,getChats,return )
 
 size_t Client_obj::getChats__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_335_getChats__fromC)
-HXDLIN( 335)		::Array< ::Dynamic> out = this->getChats();
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g = 0;
-HXDLIN( 335)				while((_g < out->length)){
-HXDLIN( 335)					 ::borogove::Chat el = out->__get(_g).StaticCast<  ::borogove::Chat >();
-HXDLIN( 335)					_g = (_g + 1);
-HXDLIN( 335)					{
-HXDLIN( 335)						 ::Dynamic haxeObject = el;
-HXDLIN( 335)						void* ptr = haxeObject.mPtr;
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXDLIN( 335)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)out->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXDLIN( 335)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),out));
-HXDLIN( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_363_getChats__fromC)
+HXDLIN( 363)		::Array< ::Dynamic> out = this->getChats();
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
-void Client_obj::findAvailableChats(::String q, ::Dynamic callback){
-            		HX_BEGIN_LOCAL_FUNC_S6(::hx::LocalFunc,_hx_Closure_2, ::borogove::Client,_gthis,::String,q,::Array< ::Dynamic>,callback1,::Array< ::Dynamic>,results,::String,query, ::haxe::ds::StringMap,haveJid) HXARGC(2)
-            		void _hx_run( ::borogove::JID jid, ::Dynamic __o_prepend){
-            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::Array< ::Dynamic>,results,bool,prepend) HXARGC(1)
-            			void _hx_run( ::borogove::AvailableChat item){
-            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_960_findAvailableChats)
-HXLINE( 960)				if (prepend) {
-HXLINE( 960)					results->unshift(item);
-            				}
-            				else {
-HXLINE( 960)					results->push(item);
-            				}
-            			}
-            			HX_END_LOCAL_FUNC1((void))
-
-            			HX_BEGIN_LOCAL_FUNC_S8(::hx::LocalFunc,_hx_Closure_1,::String,q, ::borogove::Client,_gthis,::Array< ::Dynamic>,callback1,::Array< ::Dynamic>,results, ::Dynamic,add,::String,query, ::borogove::queries::DiscoInfoGet,discoGet, ::borogove::JID,jid) HXARGC(0)
-            			void _hx_run(){
-            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_962_findAvailableChats)
-HXLINE( 963)				 ::borogove::Caps resultCaps = discoGet->getResult();
-HXLINE( 964)				if (::hx::IsNull( resultCaps )) {
-HXLINE( 965)					 ::borogove::Stanza tmp = discoGet->responseStanza;
-HXDLIN( 965)					 ::borogove::Stanza tmp1;
-HXDLIN( 965)					if (::hx::IsNotNull( tmp )) {
-HXLINE( 965)						tmp1 = tmp->getChild(HX_("error",c8,cb,29,73),null());
-            					}
-            					else {
-HXLINE( 965)						tmp1 = null();
-            					}
-HXDLIN( 965)					 ::borogove::Stanza err;
-HXDLIN( 965)					if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 965)						err = tmp1->getChild(null(),HX_("urn:ietf:params:xml:ns:xmpp-stanzas",27,f2,3d,30));
-            					}
-            					else {
-HXLINE( 965)						err = null();
-            					}
-HXLINE( 966)					bool checkAndAdd;
-HXDLIN( 966)					bool checkAndAdd1;
-HXDLIN( 966)					if (::hx::IsNotNull( err )) {
-HXLINE( 966)						::String checkAndAdd2;
-HXDLIN( 966)						if (::hx::IsNotNull( err )) {
-HXLINE( 966)							checkAndAdd2 = err->name;
-            						}
-            						else {
-HXLINE( 966)							checkAndAdd2 = null();
-            						}
-HXDLIN( 966)						checkAndAdd1 = (checkAndAdd2 == HX_("service-unavailable",f8,3c,11,1c));
-            					}
-            					else {
-HXLINE( 966)						checkAndAdd1 = true;
-            					}
-HXDLIN( 966)					if (!(checkAndAdd1)) {
-HXLINE( 966)						::String checkAndAdd3;
-HXDLIN( 966)						if (::hx::IsNotNull( err )) {
-HXLINE( 966)							checkAndAdd3 = err->name;
-            						}
-            						else {
-HXLINE( 966)							checkAndAdd3 = null();
-            						}
-HXDLIN( 966)						checkAndAdd = (checkAndAdd3 == HX_("feature-not-implemented",71,20,2e,96));
-            					}
-            					else {
-HXLINE( 966)						checkAndAdd = true;
-            					}
-HXDLIN( 966)					if (checkAndAdd) {
-HXLINE( 967)						 ::Dynamic add1 = add;
-HXDLIN( 967)						::String checkAndAdd4 = jid->asString();
-HXDLIN( 967)						::String checkAndAdd5;
-HXDLIN( 967)						if (::hx::IsNull( jid->node )) {
-HXLINE( 967)							checkAndAdd5 = query;
-            						}
-            						else {
-HXLINE( 967)							checkAndAdd5 = jid->node;
-            						}
-HXDLIN( 967)						::String checkAndAdd6 = jid->asString();
-HXDLIN( 967)						add1( ::borogove::AvailableChat_obj::__alloc( HX_CTX ,checkAndAdd4,checkAndAdd5,checkAndAdd6, ::borogove::Caps_obj::__alloc( HX_CTX ,HX_("",00,00,00,00),::Array_obj< ::Dynamic>::__new(0),::Array_obj< ::String >::__new(0),::Array_obj< ::Dynamic>::__new(0),null())));
-            					}
-            				}
-            				else {
-HXLINE( 970)					::borogove::Persistence_obj::storeCaps(_gthis->persistence,resultCaps);
-HXLINE( 971)					 ::borogove::Identity identity = resultCaps->identities->__get(0).StaticCast<  ::borogove::Identity >();
-HXLINE( 972)					::String displayName;
-HXDLIN( 972)					::String tmp2;
-HXDLIN( 972)					if (::hx::IsNotNull( identity )) {
-HXLINE( 972)						tmp2 = identity->name;
-            					}
-            					else {
-HXLINE( 972)						tmp2 = null();
-            					}
-HXDLIN( 972)					if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 972)						displayName = tmp2;
-            					}
-            					else {
-HXLINE( 972)						displayName = query;
-            					}
-HXLINE( 973)					::String note = jid->asString();
-HXDLIN( 973)					::String note1;
-HXDLIN( 973)					if (::hx::IsNull( identity )) {
-HXLINE( 973)						note1 = HX_("",00,00,00,00);
-            					}
-            					else {
-HXLINE( 973)						note1 = ((HX_(" (",08,1c,00,00) + identity->type) + HX_(")",29,00,00,00));
-            					}
-HXLINE( 974)					 ::Dynamic add2 = add;
-HXDLIN( 974)					add2( ::borogove::AvailableChat_obj::__alloc( HX_CTX ,jid->asString(),displayName,(note + note1),resultCaps));
-            				}
-HXLINE( 976)				bool checkAndAdd7;
-HXDLIN( 976)				if (::hx::IsNotNull( callback1->__get(0) )) {
-HXLINE( 976)					checkAndAdd7 = ( (bool)(callback1->__get(0)(q,results)) );
-            				}
-            				else {
-HXLINE( 976)					checkAndAdd7 = false;
-            				}
-HXDLIN( 976)				if (checkAndAdd7) {
-HXLINE( 976)					callback1[0] = null();
-            				}
-            			}
-            			HX_END_LOCAL_FUNC0((void))
-
-            		bool prepend = __o_prepend.Default(false);
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_956_findAvailableChats)
-HXLINE( 957)			::String key = jid->asString();
-HXDLIN( 957)			if (haveJid->get_bool(key)) {
-HXLINE( 957)				return;
-            			}
-HXLINE( 958)			{
-HXLINE( 958)				::String k = jid->asString();
-HXDLIN( 958)				haveJid->set(k,true);
-            			}
-HXLINE( 960)			 ::Dynamic add =  ::Dynamic(new _hx_Closure_0(results,prepend));
-HXLINE( 961)			 ::borogove::queries::DiscoInfoGet discoGet =  ::borogove::queries::DiscoInfoGet_obj::__alloc( HX_CTX ,jid->asString(),null());
-HXLINE( 962)			discoGet->onFinished( ::Dynamic(new _hx_Closure_1(q,_gthis,callback1,results,add,query,discoGet,jid)));
-HXLINE( 978)			_gthis->sendQuery(discoGet);
-            		}
-            		HX_END_LOCAL_FUNC2((void))
-
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_952_findAvailableChats)
-HXDLIN( 952)		::Array< ::Dynamic> callback1 = ::Array_obj< ::Dynamic>::__new(1)->init(0,callback);
-HXDLIN( 952)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 953)		 ::haxe::ds::StringMap haveJid =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE( 954)		::Array< ::Dynamic> results = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 955)		::String query = ::StringTools_obj::trim(q);
-HXLINE( 956)		 ::Dynamic checkAndAdd =  ::Dynamic(new _hx_Closure_2(_gthis,q,callback1,results,query,haveJid));
-HXLINE( 980)		 ::EReg vcard_regex =  ::EReg_obj::__alloc( HX_CTX ,HX_("\nIMPP[^:]*:xmpp:(.+)\n",e5,d9,ac,c6),HX_("",00,00,00,00));
-HXLINE( 981)		 ::borogove::JID jid;
-HXDLIN( 981)		if (::StringTools_obj::startsWith(query,HX_("xmpp:",65,3c,77,60))) {
-HXLINE( 982)			::Array< ::String > parts = query.substr(5,null()).split(HX_("?",3f,00,00,00));
-HXLINE( 981)			jid = ::borogove::JID_obj::parse(::borogove::_Util::Util_Fields__obj::uriDecode(parts->__get(0)));
-            		}
-            		else {
-HXLINE( 984)			bool jid1;
-HXDLIN( 984)			if (::StringTools_obj::startsWith(query,HX_("BEGIN:VCARD",75,85,ee,6a))) {
-HXLINE( 984)				jid1 = vcard_regex->match(query);
-            			}
-            			else {
-HXLINE( 984)				jid1 = false;
-            			}
-HXDLIN( 984)			if (jid1) {
-HXLINE( 985)				::Array< ::String > parts1 = vcard_regex->matched(1).split(HX_("?",3f,00,00,00));
-HXLINE( 981)				jid = ::borogove::JID_obj::parse(::borogove::_Util::Util_Fields__obj::uriDecode(parts1->__get(0)));
-            			}
-            			else {
-HXLINE( 987)				if (::StringTools_obj::startsWith(query,HX_("https://",cf,b4,ae,3e))) {
-HXLINE( 988)					::Array< ::String > hashParts = query.split(HX_("#",23,00,00,00));
-HXLINE( 989)					if ((hashParts->length > 1)) {
-HXLINE( 981)						jid = ::borogove::JID_obj::parse(::borogove::_Util::Util_Fields__obj::uriDecode(hashParts->__get(1)));
-            					}
-            					else {
-HXLINE( 992)						::Array< ::String > pathParts = hashParts->__get(0).split(HX_("/",2f,00,00,00));
-HXLINE( 981)						jid = ::borogove::JID_obj::parse(::borogove::_Util::Util_Fields__obj::uriDecode(pathParts->__get((pathParts->length - 1))));
-            					}
-            				}
-            				else {
-HXLINE( 981)					jid = ::borogove::JID_obj::parse(query);
-            				}
-            			}
-            		}
-HXLINE( 998)		if (jid->isValid()) {
-HXLINE( 999)			checkAndAdd(jid,true);
-            		}
-HXLINE(1002)		if (::StringTools_obj::startsWith(query,HX_("https://",cf,b4,ae,3e))) {
-            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_3, ::Dynamic,checkAndAdd) HXARGC(1)
-            			void _hx_run(::String xmppUri){
-            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1003_findAvailableChats)
-HXLINE(1004)				::Array< ::String > parts = xmppUri.substr(5,null()).split(HX_("?",3f,00,00,00));
-HXLINE(1005)				 ::borogove::JID jid = ::borogove::JID_obj::parse(::borogove::_Util::Util_Fields__obj::uriDecode(parts->__get(0)));
-HXLINE(1006)				if (jid->isValid()) {
-HXLINE(1006)					checkAndAdd(jid,true);
-            				}
-            			}
-            			HX_END_LOCAL_FUNC1((void))
-
-HXLINE(1003)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::_Util::Util_Fields__obj::xmppLinkHeader(query), ::Dynamic(new _hx_Closure_3(checkAndAdd)),null());
-            		}
-HXLINE(1010)		{
-HXLINE(1010)			int _g = 0;
-HXDLIN(1010)			::Array< ::Dynamic> _g1 = this->chats;
-HXDLIN(1010)			while((_g < _g1->length)){
-HXLINE(1010)				 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
-HXDLIN(1010)				_g = (_g + 1);
-HXLINE(1011)				::String chat1 = chat->chatId;
-HXDLIN(1011)				if ((chat1 != jid->asBare()->asString())) {
-HXLINE(1012)					bool _hx_tmp;
-HXDLIN(1012)					::String s = chat->chatId;
-HXDLIN(1012)					if ((s.indexOf(query.toLowerCase(),null()) == -1)) {
-HXLINE(1012)						::String s1 = chat->getDisplayName().toLowerCase();
-HXDLIN(1012)						_hx_tmp = (s1.indexOf(query.toLowerCase(),null()) != -1);
-            					}
-            					else {
-HXLINE(1012)						_hx_tmp = true;
-            					}
-HXDLIN(1012)					if (_hx_tmp) {
-HXLINE(1013)						 ::borogove::Channel channel = ( ( ::borogove::Channel)(::borogove::_Util::Util_Fields__obj::downcast(chat,::hx::ClassOf< ::borogove::Channel >())) );
-HXLINE(1014)						::Array< ::Dynamic> results1 = results;
-HXDLIN(1014)						::String chat2 = chat->chatId;
-HXDLIN(1014)						::String _hx_tmp1 = chat->getDisplayName();
-HXDLIN(1014)						::String chat3 = chat->chatId;
-HXDLIN(1014)						 ::borogove::Caps _hx_tmp2;
-HXDLIN(1014)						bool _hx_tmp3;
-HXDLIN(1014)						if (::hx::IsNotNull( channel )) {
-HXLINE(1014)							_hx_tmp3 = ::hx::IsNull( channel->disco );
-            						}
-            						else {
-HXLINE(1014)							_hx_tmp3 = true;
-            						}
-HXDLIN(1014)						if (_hx_tmp3) {
-HXLINE(1014)							_hx_tmp2 =  ::borogove::Caps_obj::__alloc( HX_CTX ,HX_("",00,00,00,00),::Array_obj< ::Dynamic>::__new(0),::Array_obj< ::String >::__new(0),::Array_obj< ::Dynamic>::__new(0),null());
-            						}
-            						else {
-HXLINE(1014)							_hx_tmp2 = channel->disco;
-            						}
-HXDLIN(1014)						results1->push( ::borogove::AvailableChat_obj::__alloc( HX_CTX ,chat2,_hx_tmp1,chat3,_hx_tmp2));
-            					}
-            				}
-HXLINE(1017)				if (chat->isTrusted()) {
-HXLINE(1018)					 ::haxe::ds::StringMap resources =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(1019)					{
-HXLINE(1019)						int _g2 = 0;
-HXDLIN(1019)						::Array< ::String > _g3 = ::borogove::Caps_obj::withIdentity(chat->getCaps(),HX_("gateway",04,40,59,91),null());
-HXDLIN(1019)						while((_g2 < _g3->length)){
-HXLINE(1019)							::String resource = _g3->__get(_g2);
-HXDLIN(1019)							_g2 = (_g2 + 1);
-HXLINE(1021)							::Array< ::Dynamic> identities;
-HXDLIN(1021)							 ::borogove::Caps tmp = chat->getResourceCaps(resource);
-HXDLIN(1021)							::Array< ::Dynamic> tmp1;
-HXDLIN(1021)							if (::hx::IsNotNull( tmp )) {
-HXLINE(1021)								tmp1 = tmp->identities;
-            							}
-            							else {
-HXLINE(1021)								tmp1 = null();
-            							}
-HXDLIN(1021)							if (::hx::IsNotNull( tmp1 )) {
-HXLINE(1021)								identities = tmp1;
-            							}
-            							else {
-HXLINE(1021)								identities = ::Array_obj< ::Dynamic>::__new(0);
-            							}
-HXLINE(1023)							bool _hx_tmp4;
-HXDLIN(1023)							bool _hx_tmp5;
-HXDLIN(1023)							if ((chat->chatId.indexOf(HX_("@",40,00,00,00),null()) >= 0)) {
-            								HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_4) HXARGC(1)
-            								bool _hx_run( ::borogove::Identity i){
-            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1023_findAvailableChats)
-HXLINE(1023)									return (i->category == HX_("conference",1c,2b,83,41));
-            								}
-            								HX_END_LOCAL_FUNC1(return)
-
-HXLINE(1023)								_hx_tmp5 = ::hx::IsNull( ::Lambda_obj::find(identities, ::Dynamic(new _hx_Closure_4())) );
-            							}
-            							else {
-HXLINE(1023)								_hx_tmp5 = true;
-            							}
-HXDLIN(1023)							if (_hx_tmp5) {
-            								HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_5) HXARGC(1)
-            								bool _hx_run( ::borogove::Identity i){
-            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1024_findAvailableChats)
-HXLINE(1024)									return (i->category == HX_("client",4b,ca,4f,0a));
-            								}
-            								HX_END_LOCAL_FUNC1(return)
-
-HXLINE(1023)								_hx_tmp4 = ::hx::IsNull( ::Lambda_obj::find(identities, ::Dynamic(new _hx_Closure_5())) );
-            							}
-            							else {
-HXLINE(1023)								_hx_tmp4 = false;
-            							}
-HXLINE(1022)							if (_hx_tmp4) {
-HXLINE(1026)								resources->set(resource,true);
-            							}
-            						}
+ ::borogove::AvailableChatIterator Client_obj::findAvailableChats(::String q){
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1070_findAvailableChats)
+HXDLIN(1070)		return  ::borogove::AvailableChatIterator_obj::__alloc( HX_CTX ,q,::hx::ObjectPtr<OBJ_>(this),this->persistence);
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(Client_obj,findAvailableChats,return )
+
+::Dynamic Client_obj::availableChatSources(){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_6) HXARGC(1)
+            		::Array< ::String > _hx_run(::Array< ::String > ss){
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1124_availableChatSources)
+HXLINE(1125)			 ::haxe::ds::StringMap found =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(1126)			::Array< ::String > _g = ::Array_obj< ::String >::__new(0);
+HXDLIN(1126)			{
+HXLINE(1126)				int _g1 = 0;
+HXDLIN(1126)				while((_g1 < ss->length)){
+HXLINE(1126)					::String v = ss->__get(_g1);
+HXDLIN(1126)					_g1 = (_g1 + 1);
+HXLINE(1127)					bool didFind;
+HXDLIN(1127)					 ::Dynamic tmp = found->get(v);
+HXDLIN(1127)					if (::hx::IsNotNull( tmp )) {
+HXLINE(1127)						didFind = ( (bool)(tmp) );
             					}
-HXLINE(1033)					bool _hx_tmp6;
-HXDLIN(1033)					if (!(this->sendAvailable)) {
-HXLINE(1033)						_hx_tmp6 = ::borogove::JID_obj::parse(chat->chatId)->isDomain();
+            					else {
+HXLINE(1127)						didFind = false;
+            					}
+HXLINE(1128)					found->set(v,true);
+HXLINE(1126)					bool _hx_tmp;
+HXLINE(1129)					if ((v != HX_("",00,00,00,00))) {
+HXLINE(1126)						_hx_tmp = !(didFind);
             					}
             					else {
-HXLINE(1033)						_hx_tmp6 = false;
+HXLINE(1126)						_hx_tmp = false;
             					}
-HXDLIN(1033)					if (_hx_tmp6) {
-HXLINE(1034)						::String k = null();
-HXDLIN(1034)						resources->set(k,true);
+HXDLIN(1126)					if (_hx_tmp) {
+HXLINE(1126)						_g->push(v);
             					}
-HXLINE(1036)					{
-HXLINE(1036)						 ::Dynamic resource1 = resources->keys();
-HXDLIN(1036)						while(( (bool)(resource1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-            							HX_BEGIN_LOCAL_FUNC_S6(::hx::LocalFunc,_hx_Closure_6, ::borogove::queries::JabberIqGatewayGet,jigGet1,::String,query, ::borogove::JID,bareJid, ::borogove::Chat,chat,::String,resource2, ::Dynamic,checkAndAdd) HXARGC(0)
-            							void _hx_run(){
-            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1041_findAvailableChats)
-HXLINE(1041)								if (::hx::IsNull( jigGet1->getResult() )) {
-HXLINE(1042)									 ::borogove::Caps caps = chat->getResourceCaps(resource2);
-HXLINE(1043)									bool _hx_tmp;
-HXDLIN(1043)									if (bareJid->isDomain()) {
-HXLINE(1043)										_hx_tmp = caps->features->contains(HX_("jid\\20escaping",73,c5,d2,4a));
+            				}
+            			}
+HXDLIN(1126)			return _g;
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1076_availableChatSources)
+HXDLIN(1076)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1077)		::Array< ::Dynamic> sources = ::Array_obj< ::Dynamic>::__new(1)->init(0,::thenshim::_Promise::Promise_Impl__obj::resolve(HX_("Name",6b,9e,d8,33)));
+HXLINE(1079)		{
+HXLINE(1079)			int _g = 0;
+HXDLIN(1079)			::Array< ::Dynamic> _g1 = this->chats;
+HXDLIN(1079)			while((_g < _g1->length)){
+HXLINE(1079)				 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
+HXDLIN(1079)				_g = (_g + 1);
+HXLINE(1080)				if (chat->isTrusted()) {
+HXLINE(1081)					 ::haxe::ds::StringMap resources =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(1082)					{
+HXLINE(1082)						 ::Dynamic _g2 = ::borogove::Caps_obj::withIdentity(chat->getCaps(),HX_("gateway",04,40,59,91),null());
+HXDLIN(1082)						while(( (bool)(_g2->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(1082)							 ::Dynamic _g3 = _g2->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
+HXDLIN(1082)							::String resource = ( (::String)(_g3->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic)) );
+HXDLIN(1082)							 ::borogove::Caps caps = ( ( ::borogove::Caps)(_g3->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)) );
+HXDLIN(1082)							{
+HXLINE(1084)								::Array< ::Dynamic> identities = caps->identities;
+HXLINE(1086)								bool _hx_tmp;
+HXDLIN(1086)								bool _hx_tmp1;
+HXDLIN(1086)								if ((chat->chatId.indexOf(HX_("@",40,00,00,00),null()) >= 0)) {
+            									HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            									bool _hx_run( ::borogove::Identity i){
+            										HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1086_availableChatSources)
+HXLINE(1086)										return (i->category == HX_("conference",1c,2b,83,41));
             									}
-            									else {
-HXLINE(1043)										_hx_tmp = false;
+            									HX_END_LOCAL_FUNC1(return)
+
+HXLINE(1086)									_hx_tmp1 = ::hx::IsNull( ::Lambda_obj::find(identities, ::Dynamic(new _hx_Closure_0())) );
+            								}
+            								else {
+HXLINE(1086)									_hx_tmp1 = true;
+            								}
+HXDLIN(1086)								if (_hx_tmp1) {
+            									HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
+            									bool _hx_run( ::borogove::Identity i){
+            										HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1087_availableChatSources)
+HXLINE(1087)										return (i->category == HX_("client",4b,ca,4f,0a));
             									}
-HXDLIN(1043)									if (_hx_tmp) {
-HXLINE(1044)										 ::Dynamic checkAndAdd1 = checkAndAdd;
-HXDLIN(1044)										checkAndAdd1( ::borogove::JID_obj::__alloc( HX_CTX ,query,bareJid->domain,null(),null()),null());
+            									HX_END_LOCAL_FUNC1(return)
+
+HXLINE(1086)									_hx_tmp = ::hx::IsNull( ::Lambda_obj::find(identities, ::Dynamic(new _hx_Closure_1())) );
+            								}
+            								else {
+HXLINE(1086)									_hx_tmp = false;
+            								}
+HXLINE(1085)								if (_hx_tmp) {
+HXLINE(1089)									::String _hx_tmp2;
+HXDLIN(1089)									if (::hx::IsNull( resource )) {
+HXLINE(1089)										_hx_tmp2 = ::borogove::_Chat::Chat_Fields__obj::nullSentinel;
             									}
             									else {
-HXLINE(1045)										if (bareJid->isDomain()) {
-HXLINE(1046)											 ::Dynamic checkAndAdd2 = checkAndAdd;
-HXDLIN(1046)											::String _hx_tmp1 = ::StringTools_obj::replace(query,HX_("@",40,00,00,00),HX_("%",25,00,00,00));
-HXDLIN(1046)											checkAndAdd2( ::borogove::JID_obj::__alloc( HX_CTX ,_hx_tmp1,bareJid->domain,null(),null()),null());
-            										}
+HXLINE(1089)										_hx_tmp2 = resource;
             									}
+HXDLIN(1089)									resources->set(_hx_tmp2,caps);
             								}
-            								else {
-HXLINE(1049)									 ::haxe::ds::Either _g = jigGet1->getResult();
-HXDLIN(1049)									switch((int)(_g->_hx_getIndex())){
-            										case (int)0: {
-HXLINE(1050)											return;
+            							}
+            						}
+            					}
+HXLINE(1092)					bool _hx_tmp3;
+HXDLIN(1092)					bool _hx_tmp4;
+HXDLIN(1092)					if (!(resources->exists(::borogove::_Chat::Chat_Fields__obj::nullSentinel))) {
+HXLINE(1092)						_hx_tmp4 = !(this->sendAvailable);
+            					}
+            					else {
+HXLINE(1092)						_hx_tmp4 = false;
+            					}
+HXDLIN(1092)					if (_hx_tmp4) {
+HXLINE(1092)						_hx_tmp3 = ::borogove::JID_obj::parse(chat->chatId)->isDomain();
+            					}
+            					else {
+HXLINE(1092)						_hx_tmp3 = false;
+            					}
+HXDLIN(1092)					if (_hx_tmp3) {
+HXLINE(1093)						resources->set(::borogove::_Chat::Chat_Fields__obj::nullSentinel,::borogove::CapsRepo_obj::empty);
+            					}
+HXLINE(1095)					{
+            						HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2,::Array< ::Dynamic>,iter_keys) HXARGC(0)
+            						bool _hx_run(){
+            							HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1095_availableChatSources)
+HXLINE(1095)							return ( (bool)(iter_keys->__get(0)->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) );
+            						}
+            						HX_END_LOCAL_FUNC0(return)
+
+            						HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_3,::Array< ::Dynamic>,iter_map,::Array< ::Dynamic>,iter_keys) HXARGC(0)
+            						 ::Dynamic _hx_run(){
+            							HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1095_availableChatSources)
+HXLINE(1095)							::String key = ( (::String)(iter_keys->__get(0)->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN(1095)							 ::Dynamic v =  ::Dynamic(::hx::Anon_obj::Create(2)
+            								->setFixed(0,HX_("key",9f,89,51,00),key)
+            								->setFixed(1,HX_("value",71,7f,b8,31),( ( ::borogove::Caps)(::haxe::IMap_obj::get(iter_map->__get(0),key)) )));
+HXDLIN(1095)							if (::hx::IsEq( v->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic),::borogove::_Chat::Chat_Fields__obj::nullSentinel )) {
+HXLINE(1095)								return  ::Dynamic(::hx::Anon_obj::Create(2)
+            									->setFixed(0,HX_("key",9f,89,51,00),null())
+            									->setFixed(1,HX_("value",71,7f,b8,31), ::Dynamic(v->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic))));
+            							}
+            							else {
+HXLINE(1095)								return v;
+            							}
+HXDLIN(1095)							return null();
+            						}
+            						HX_END_LOCAL_FUNC0(return)
+
+HXLINE(1095)						::Array< ::Dynamic> iter_map = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN(1095)						::Array< ::Dynamic> iter_keys = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN(1095)						::Dynamic map = resources;
+HXDLIN(1095)						iter_map[0] = map;
+HXDLIN(1095)						iter_keys[0] = ::haxe::IMap_obj::keys(map);
+HXDLIN(1095)						 ::Dynamic _g_hasNext =  ::Dynamic(new _hx_Closure_2(iter_keys));
+HXDLIN(1095)						 ::Dynamic _g_next =  ::Dynamic(new _hx_Closure_3(iter_map,iter_keys));
+HXDLIN(1095)						while(( (bool)(_g_hasNext()) )){
+HXLINE(1095)							 ::Dynamic _g4 = _g_next();
+HXDLIN(1095)							::String resource1 = ( (::String)(_g4->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic)) );
+HXDLIN(1095)							 ::borogove::Caps caps1 = ( ( ::borogove::Caps)(_g4->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)) );
+HXDLIN(1095)							{
+            								HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_5, ::borogove::Client,_gthis, ::borogove::Caps,caps1, ::borogove::queries::JabberIqGatewayGet,jigGet) HXARGC(2)
+            								void _hx_run( ::Dynamic resolve, ::Dynamic reject){
+            									HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_4, ::borogove::Caps,caps1, ::Dynamic,resolve, ::borogove::queries::JabberIqGatewayGet,jigGet) HXARGC(0)
+            									void _hx_run(){
+            										HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1100_availableChatSources)
+HXLINE(1101)										 ::haxe::ds::Either result = jigGet->getResult();
+HXLINE(1102)										if (::hx::IsNull( result )) {
+HXLINE(1103)											 ::borogove::Identity identity = caps1->identities->__get(0).StaticCast<  ::borogove::Identity >();
+HXLINE(1104)											if (::hx::IsNull( identity )) {
+HXLINE(1105)												resolve(HX_("",00,00,00,00));
+            											}
+            											else {
+HXLINE(1107)												resolve(identity->type);
+            											}
             										}
-            										break;
-            										case (int)1: {
-HXLINE(1052)											 ::Dynamic checkAndAdd3 = checkAndAdd;
-HXDLIN(1052)											checkAndAdd3(::borogove::JID_obj::parse(( (::String)(_g->_hx_getObject(0)) )),null());
+            										else {
+HXLINE(1110)											switch((int)(result->_hx_getIndex())){
+            												case (int)0: {
+HXLINE(1111)													resolve(HX_("",00,00,00,00));
+            												}
+            												break;
+            												case (int)1: {
+HXLINE(1112)													resolve(result->_hx_getObject(0));
+            												}
+            												break;
+            											}
             										}
-            										break;
             									}
+            									HX_END_LOCAL_FUNC0((void))
+
+            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1099_availableChatSources)
+HXLINE(1100)									jigGet->onFinished( ::Dynamic(new _hx_Closure_4(caps1,resolve,jigGet)));
+HXLINE(1116)									_gthis->sendQuery(jigGet);
             								}
-            							}
-            							HX_END_LOCAL_FUNC0((void))
+            								HX_END_LOCAL_FUNC2((void))
 
-HXLINE(1036)							::String resource2 = ( (::String)(resource1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXLINE(1037)							 ::borogove::JID bareJid = ::borogove::JID_obj::parse(chat->chatId);
-HXLINE(1038)							::String bareJid1 = bareJid->node;
-HXDLIN(1038)							::String bareJid2 = bareJid->domain;
-HXDLIN(1038)							::String fullJid;
-HXDLIN(1038)							bool fullJid1;
-HXDLIN(1038)							if (bareJid->isDomain()) {
-HXLINE(1038)								fullJid1 = (resource2 == HX_("",00,00,00,00));
-            							}
-            							else {
-HXLINE(1038)								fullJid1 = false;
-            							}
-HXDLIN(1038)							if (fullJid1) {
-HXLINE(1038)								fullJid = null();
-            							}
-            							else {
-HXLINE(1038)								fullJid = resource2;
+HXLINE(1096)								 ::borogove::JID bareJid = ::borogove::JID_obj::parse(chat->chatId);
+HXLINE(1097)								::String bareJid1 = bareJid->node;
+HXDLIN(1097)								::String bareJid2 = bareJid->domain;
+HXDLIN(1097)								::String fullJid;
+HXDLIN(1097)								bool fullJid1;
+HXDLIN(1097)								if (bareJid->isDomain()) {
+HXLINE(1097)									fullJid1 = (resource1 == HX_("",00,00,00,00));
+            								}
+            								else {
+HXLINE(1097)									fullJid1 = false;
+            								}
+HXDLIN(1097)								if (fullJid1) {
+HXLINE(1097)									fullJid = null();
+            								}
+            								else {
+HXLINE(1097)									fullJid = resource1;
+            								}
+HXLINE(1098)								 ::borogove::queries::JabberIqGatewayGet jigGet =  ::borogove::queries::JabberIqGatewayGet_obj::__alloc( HX_CTX , ::borogove::JID_obj::__alloc( HX_CTX ,bareJid1,bareJid2,fullJid,null())->asString(),null());
+HXLINE(1099)								sources->push(::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_5(_gthis,caps1,jigGet))));
             							}
-HXLINE(1039)							::String jigGet =  ::borogove::JID_obj::__alloc( HX_CTX ,bareJid1,bareJid2,fullJid,null())->asString();
-HXDLIN(1039)							 ::borogove::queries::JabberIqGatewayGet jigGet1 =  ::borogove::queries::JabberIqGatewayGet_obj::__alloc( HX_CTX ,jigGet,query);
-HXLINE(1040)							jigGet1->onFinished( ::Dynamic(new _hx_Closure_6(jigGet1,query,bareJid,chat,resource2,checkAndAdd)));
-HXLINE(1056)							this->sendQuery(jigGet1);
             						}
             					}
             				}
             			}
             		}
-HXLINE(1060)		bool _hx_tmp7;
-HXDLIN(1060)		if (!(jid->isValid())) {
-HXLINE(1060)			_hx_tmp7 = (results->length > 0);
-            		}
-            		else {
-HXLINE(1060)			_hx_tmp7 = false;
-            		}
-HXDLIN(1060)		if (_hx_tmp7) {
-HXLINE(1061)			bool _hx_tmp8;
-HXDLIN(1061)			if (::hx::IsNotNull( callback1->__get(0) )) {
-HXLINE(1061)				_hx_tmp8 = ( (bool)(callback1->__get(0)(q,results)) );
-            			}
-            			else {
-HXLINE(1061)				_hx_tmp8 = false;
-            			}
-HXDLIN(1061)			if (_hx_tmp8) {
-HXLINE(1061)				callback1[0] = null();
-            			}
-            		}
+HXLINE(1122)		sources->push(::thenshim::_Promise::Promise_Impl__obj::resolve(HX_("ID",db,3f,00,00)));
+HXLINE(1123)		sources->push(::thenshim::_Promise::Promise_Impl__obj::resolve(HX_("URI",4c,c7,40,00)));
+HXLINE(1124)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(sources), ::Dynamic(new _hx_Closure_6()),null());
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Client_obj,findAvailableChats,(void))
+HX_DEFINE_DYNAMIC_FUNC0(Client_obj,availableChatSources,return )
 
-void Client_obj::findAvailableChats__fromC(::String q,::cpp::Function< bool  (const char*,void**,size_t,void*) > callback,void* callback__context){
-            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,void*,callback__context,::cpp::Function< bool  (const char* HX_COMMA void** HX_COMMA size_t HX_COMMA void*) >,callback) HXARGC(2)
-            		bool _hx_run(::String a0,::Array< ::Dynamic> a1){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_272_findAvailableChats__fromC)
-HXLINE( 247)			const char* cStrPtr = a0.utf8_str();
-HXDLIN( 247)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 247)			{
-HXLINE( 247)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 247)				if (::hx::IsNull( store )) {
-HXLINE( 247)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),a0));
-HXDLIN( 247)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            				}
-            				else {
-HXLINE( 247)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 247)			const char* x0 = cStrPtr;
-HXLINE( 243)			{
-HXLINE( 243)				int _g = 0;
-HXDLIN( 243)				while((_g < a1->length)){
-HXLINE( 243)					 ::borogove::AvailableChat el = a1->__get(_g).StaticCast<  ::borogove::AvailableChat >();
-HXDLIN( 243)					_g = (_g + 1);
-HXDLIN( 243)					{
-HXLINE( 243)						 ::Dynamic haxeObject = el;
-HXDLIN( 243)						void* ptr = haxeObject.mPtr;
-HXDLIN( 243)						::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 243)						{
-HXLINE( 243)							 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 243)							if (::hx::IsNull( store1 )) {
-HXLINE( 243)								store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 243)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            							}
-            							else {
-HXLINE( 243)								::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
+void Client_obj::availableChatSources__fromC(::cpp::Function< void  (const char**,size_t,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_365_availableChatSources__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->availableChatSources();
+            		}
+            		else {
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (const char** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run(::Array< ::String > v){
+            				HX_STACKFRAME(&_hx_pos_afe14372debdebc6_365_availableChatSources__fromC)
+HXDLIN( 365)				::cpp::Function< void  (const char**,size_t,void*) > handler1 = handler;
+HXDLIN( 365)				handler1(::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(v),( (size_t)(v->length) ),handler__context);
             			}
-HXDLIN( 243)			void** ptr1 = (void**)a1->getBase();
-HXDLIN( 243)			::cpp::Int64 ptrInt642 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 243)			{
-HXLINE( 243)				 ::Dynamic store2 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt642);
-HXDLIN( 243)				if (::hx::IsNull( store2 )) {
-HXLINE( 243)					store2 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),a1));
-HXDLIN( 243)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt642,store2);
-            				}
-            				else {
-HXLINE( 243)					::hx::FieldRef((store2).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
+            			HX_END_LOCAL_FUNC1((void))
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (const char** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::Dynamic e){
+            				HX_STACKFRAME(&_hx_pos_afe14372debdebc6_365_availableChatSources__fromC)
+HXDLIN( 365)				handler(null(),( (size_t)(0) ),handler__context);
             			}
-HXDLIN( 243)			int xl1 = a1->length;
-HXLINE( 269)			return callback(x0,ptr1,( (size_t)(xl1) ),callback__context);
-            		}
-            		HX_END_LOCAL_FUNC2(return)
+            			HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_findAvailableChats__fromC)
-HXDLIN( 339)		this->findAvailableChats(q, ::Dynamic(new _hx_Closure_0(callback__context,callback)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->availableChatSources(), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+            		}
             	}
 
 
  ::borogove::Chat Client_obj::startChat( ::borogove::AvailableChat availableChat){
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1070_startChat)
-HXLINE(1071)		 ::borogove::Chat existingChat = this->getChat(availableChat->chatId);
-HXLINE(1072)		if (::hx::IsNotNull( existingChat )) {
-HXLINE(1073)			 ::borogove::Channel channel = ( ( ::borogove::Channel)(::Std_obj::downcast(existingChat,::hx::ClassOf< ::borogove::Channel >())) );
-HXLINE(1074)			bool _hx_tmp;
-HXDLIN(1074)			bool _hx_tmp1;
-HXDLIN(1074)			if (::hx::IsNull( channel )) {
-HXLINE(1074)				_hx_tmp1 = availableChat->isChannel();
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1139_startChat)
+HXLINE(1140)		 ::borogove::Chat existingChat = this->getChat(availableChat->chatId);
+HXLINE(1141)		if (::hx::IsNotNull( existingChat )) {
+HXLINE(1142)			 ::borogove::Channel channel = ( ( ::borogove::Channel)(::Std_obj::downcast(existingChat,::hx::ClassOf< ::borogove::Channel >())) );
+HXLINE(1143)			bool _hx_tmp;
+HXDLIN(1143)			bool _hx_tmp1;
+HXDLIN(1143)			if (::hx::IsNull( channel )) {
+HXLINE(1143)				_hx_tmp1 = availableChat->isChannel();
             			}
             			else {
-HXLINE(1074)				_hx_tmp1 = false;
+HXLINE(1143)				_hx_tmp1 = false;
             			}
-HXDLIN(1074)			if (!(_hx_tmp1)) {
-HXLINE(1074)				if (::hx::IsNotNull( channel )) {
-HXLINE(1074)					_hx_tmp = !(availableChat->isChannel());
+HXDLIN(1143)			if (!(_hx_tmp1)) {
+HXLINE(1143)				if (::hx::IsNotNull( channel )) {
+HXLINE(1143)					_hx_tmp = !(availableChat->isChannel());
             				}
             				else {
-HXLINE(1074)					_hx_tmp = false;
+HXLINE(1143)					_hx_tmp = false;
             				}
             			}
             			else {
-HXLINE(1074)				_hx_tmp = true;
-            			}
-HXDLIN(1074)			if (_hx_tmp) {
-HXLINE(1075)				::Array< ::Dynamic> _this = this->chats;
-HXDLIN(1075)				::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN(1075)				{
-HXLINE(1075)					int _g1 = 0;
-HXDLIN(1075)					while((_g1 < _this->length)){
-HXLINE(1075)						 ::borogove::Chat v = _this->__get(_g1).StaticCast<  ::borogove::Chat >();
-HXDLIN(1075)						_g1 = (_g1 + 1);
-HXDLIN(1075)						if ((v->chatId != availableChat->chatId)) {
-HXLINE(1075)							_g->push(v);
+HXLINE(1143)				_hx_tmp = true;
+            			}
+HXDLIN(1143)			if (_hx_tmp) {
+HXLINE(1144)				::Array< ::Dynamic> _this = this->chats;
+HXDLIN(1144)				::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN(1144)				{
+HXLINE(1144)					int _g1 = 0;
+HXDLIN(1144)					while((_g1 < _this->length)){
+HXLINE(1144)						 ::borogove::Chat v = _this->__get(_g1).StaticCast<  ::borogove::Chat >();
+HXDLIN(1144)						_g1 = (_g1 + 1);
+HXDLIN(1144)						if ((v->chatId != availableChat->chatId)) {
+HXLINE(1144)							_g->push(v);
             						}
             					}
             				}
-HXDLIN(1075)				this->chats = _g;
+HXDLIN(1144)				this->chats = _g;
             			}
             			else {
-HXLINE(1077)				if ((existingChat->uiState == 2)) {
-HXLINE(1077)					existingChat->uiState = 1;
+HXLINE(1146)				if ((existingChat->uiState == 2)) {
+HXLINE(1146)					existingChat->uiState = 1;
             				}
-HXLINE(1078)				if (::hx::IsNotNull( channel )) {
-HXLINE(1078)					channel->selfPing(true);
+HXLINE(1147)				if (::hx::IsNotNull( channel )) {
+HXLINE(1147)					channel->selfPing(true);
             				}
-HXLINE(1079)				::Dynamic _hx_tmp2 = this->persistence;
-HXDLIN(1079)				::borogove::Persistence_obj::storeChats(_hx_tmp2,this->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,existingChat));
-HXLINE(1080)				this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,existingChat));
-HXLINE(1081)				return existingChat;
+HXLINE(1148)				::Dynamic _hx_tmp2 = this->persistence;
+HXDLIN(1148)				::borogove::Persistence_obj::storeChats(_hx_tmp2,this->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,existingChat));
+HXLINE(1149)				this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,existingChat));
+HXLINE(1150)				return existingChat;
             			}
             		}
-HXLINE(1085)		 ::borogove::Chat chat;
-HXDLIN(1085)		if (availableChat->isChannel()) {
-HXLINE(1086)			 ::borogove::Channel channel1 =  ::borogove::Channel_obj::__alloc( HX_CTX ,::hx::ObjectPtr<OBJ_>(this),this->stream,this->persistence,availableChat->chatId,1,false,null(),null(),null(),availableChat->caps);
-HXLINE(1087)			channel1->setupNotifications();
-HXLINE(1088)			this->chats->unshift(channel1);
-HXLINE(1089)			channel1->selfPing(false);
-HXLINE(1085)			chat = channel1;
+HXLINE(1154)		 ::borogove::Chat chat;
+HXDLIN(1154)		if (availableChat->isChannel()) {
+HXLINE(1155)			 ::borogove::Channel channel1 =  ::borogove::Channel_obj::__alloc( HX_CTX ,::hx::ObjectPtr<OBJ_>(this),this->stream,this->persistence,availableChat->chatId,1,false,false,null(),null(),null(),availableChat->caps);
+HXLINE(1156)			channel1->setupNotifications();
+HXLINE(1157)			this->chats->unshift(channel1);
+HXLINE(1158)			channel1->selfPing(false);
+HXLINE(1154)			chat = channel1;
             		}
             		else {
-HXLINE(1085)			chat = this->getDirectChat(availableChat->chatId,false);
+HXLINE(1154)			chat = this->getDirectChat(availableChat->chatId,false);
             		}
-HXLINE(1094)		::Dynamic _hx_tmp3 = this->persistence;
-HXDLIN(1094)		::borogove::Persistence_obj::storeChats(_hx_tmp3,this->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat));
-HXLINE(1095)		this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat));
-HXLINE(1096)		return chat;
+HXLINE(1163)		::Dynamic _hx_tmp3 = this->persistence;
+HXDLIN(1163)		::borogove::Persistence_obj::storeChats(_hx_tmp3,this->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat));
+HXLINE(1164)		this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat));
+HXLINE(1165)		return chat;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Client_obj,startChat,return )
 
  ::borogove::Chat Client_obj::getChat(::String chatId){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1105_getChat)
-HXDLIN(1105)		::Array< ::Dynamic> it = this->chats;
-HXDLIN(1105)		 ::borogove::Chat result = null();
-HXDLIN(1105)		{
-HXDLIN(1105)			int _g = 0;
-HXDLIN(1105)			while((_g < it->length)){
-HXDLIN(1105)				 ::borogove::Chat v = it->__get(_g).StaticCast<  ::borogove::Chat >();
-HXDLIN(1105)				_g = (_g + 1);
-HXDLIN(1105)				if ((v->chatId == chatId)) {
-HXDLIN(1105)					result = v;
-HXDLIN(1105)					goto _hx_goto_118;
-            				}
-            			}
-            			_hx_goto_118:;
-            		}
-HXDLIN(1105)		return result;
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1174_getChat)
+HXDLIN(1174)		::Array< ::Dynamic> it = this->chats;
+HXDLIN(1174)		 ::borogove::Chat result = null();
+HXDLIN(1174)		{
+HXDLIN(1174)			int _g = 0;
+HXDLIN(1174)			while((_g < it->length)){
+HXDLIN(1174)				 ::borogove::Chat v = it->__get(_g).StaticCast<  ::borogove::Chat >();
+HXDLIN(1174)				_g = (_g + 1);
+HXDLIN(1174)				if ((v->chatId == chatId)) {
+HXDLIN(1174)					result = v;
+HXDLIN(1174)					goto _hx_goto_125;
+            				}
+            			}
+            			_hx_goto_125:;
+            		}
+HXDLIN(1174)		return result;
             	}
 
 
@@ -3305,45 +3428,45 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,getChat,return )
             		void _hx_run( ::Dynamic resolve, ::Dynamic reject){
             			HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis, ::borogove::ModerationAction,action, ::Dynamic,resolve) HXARGC(1)
             			void _hx_run( ::borogove::ChatMessage moderateMessage){
-            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1111_moderateMessage)
-HXLINE(1112)				if (::hx::IsNull( moderateMessage )) {
-HXLINE(1112)					resolve(null());
-HXDLIN(1112)					return;
-            				}
-HXLINE(1113)				{
-HXLINE(1113)					int _g = 0;
-HXDLIN(1113)					::Array< ::Dynamic> _g1 = moderateMessage->attachments;
-HXDLIN(1113)					while((_g < _g1->length)){
-HXLINE(1113)						 ::borogove::ChatAttachment attachment = _g1->__get(_g).StaticCast<  ::borogove::ChatAttachment >();
-HXDLIN(1113)						_g = (_g + 1);
-HXLINE(1114)						{
-HXLINE(1114)							int _g2 = 0;
-HXDLIN(1114)							::Array< ::Dynamic> _g3 = attachment->hashes;
-HXDLIN(1114)							while((_g2 < _g3->length)){
-HXLINE(1114)								 ::borogove::Hash hash = _g3->__get(_g2).StaticCast<  ::borogove::Hash >();
-HXDLIN(1114)								_g2 = (_g2 + 1);
-HXLINE(1115)								::borogove::Persistence_obj::removeMedia(_gthis->persistence,hash->algorithm,hash->hash);
+            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1180_moderateMessage)
+HXLINE(1181)				if (::hx::IsNull( moderateMessage )) {
+HXLINE(1181)					resolve(null());
+HXDLIN(1181)					return;
+            				}
+HXLINE(1182)				{
+HXLINE(1182)					int _g = 0;
+HXDLIN(1182)					::Array< ::Dynamic> _g1 = moderateMessage->attachments;
+HXDLIN(1182)					while((_g < _g1->length)){
+HXLINE(1182)						 ::borogove::ChatAttachment attachment = _g1->__get(_g).StaticCast<  ::borogove::ChatAttachment >();
+HXDLIN(1182)						_g = (_g + 1);
+HXLINE(1183)						{
+HXLINE(1183)							int _g2 = 0;
+HXDLIN(1183)							::Array< ::Dynamic> _g3 = attachment->hashes;
+HXDLIN(1183)							while((_g2 < _g3->length)){
+HXLINE(1183)								 ::borogove::Hash hash = _g3->__get(_g2).StaticCast<  ::borogove::Hash >();
+HXDLIN(1183)								_g2 = (_g2 + 1);
+HXLINE(1184)								::borogove::Persistence_obj::removeMedia(_gthis->persistence,hash->algorithm,hash->hash);
             							}
             						}
             					}
             				}
-HXLINE(1118)				moderateMessage = ::borogove::ChatMessageBuilder_obj::makeModerated(moderateMessage,action->timestamp,action->moderatorId,action->reason);
-HXLINE(1119)				::Dynamic _gthis1 = _gthis->persistence;
-HXDLIN(1119)				::borogove::Persistence_obj::updateMessage(_gthis1,_gthis->accountId(),moderateMessage);
-HXLINE(1120)				resolve(moderateMessage);
+HXLINE(1187)				moderateMessage = ::borogove::ChatMessageBuilder_obj::makeModerated(moderateMessage,action->timestamp,action->moderatorId,action->reason);
+HXLINE(1188)				::Dynamic _gthis1 = _gthis->persistence;
+HXDLIN(1188)				::borogove::Persistence_obj::updateMessage(_gthis1,_gthis->accountId(),moderateMessage);
+HXLINE(1189)				resolve(moderateMessage);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1111_moderateMessage)
-HXLINE(1111)			::Dynamic _gthis1 = _gthis->persistence;
-HXDLIN(1111)			::String _hx_tmp = _gthis->accountId();
-HXDLIN(1111)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessage(_gthis1,_hx_tmp,action->chatId,action->moderateServerId,null()), ::Dynamic(new _hx_Closure_0(_gthis,action,resolve)),null());
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1180_moderateMessage)
+HXLINE(1180)			::Dynamic _gthis1 = _gthis->persistence;
+HXDLIN(1180)			::String _hx_tmp = _gthis->accountId();
+HXDLIN(1180)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessage(_gthis1,_hx_tmp,action->chatId,action->moderateServerId,null()), ::Dynamic(new _hx_Closure_0(_gthis,action,resolve)),null());
             		}
             		HX_END_LOCAL_FUNC2((void))
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1109_moderateMessage)
-HXDLIN(1109)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1110)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(_gthis,action)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1178_moderateMessage)
+HXDLIN(1178)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1179)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(_gthis,action)));
             	}
 
 
@@ -3351,186 +3474,194 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,moderateMessage,return )
 
  ::borogove::DirectChat Client_obj::getDirectChat(::String chatId,::hx::Null< bool >  __o_triggerIfNew){
             		bool triggerIfNew = __o_triggerIfNew.Default(true);
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1126_getDirectChat)
-HXLINE(1127)		{
-HXLINE(1127)			int _g = 0;
-HXDLIN(1127)			::Array< ::Dynamic> _g1 = this->chats;
-HXDLIN(1127)			while((_g < _g1->length)){
-HXLINE(1127)				 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
-HXDLIN(1127)				_g = (_g + 1);
-HXLINE(1128)				bool _hx_tmp;
-HXDLIN(1128)				if (::Std_obj::isOfType(chat,::hx::ClassOf< ::borogove::DirectChat >())) {
-HXLINE(1128)					_hx_tmp = (chat->chatId == chatId);
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1195_getDirectChat)
+HXLINE(1196)		{
+HXLINE(1196)			int _g = 0;
+HXDLIN(1196)			::Array< ::Dynamic> _g1 = this->chats;
+HXDLIN(1196)			while((_g < _g1->length)){
+HXLINE(1196)				 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
+HXDLIN(1196)				_g = (_g + 1);
+HXLINE(1197)				bool _hx_tmp;
+HXDLIN(1197)				if (::Std_obj::isOfType(chat,::hx::ClassOf< ::borogove::DirectChat >())) {
+HXLINE(1197)					_hx_tmp = (chat->chatId == chatId);
             				}
             				else {
-HXLINE(1128)					_hx_tmp = false;
+HXLINE(1197)					_hx_tmp = false;
             				}
-HXDLIN(1128)				if (_hx_tmp) {
-HXLINE(1129)					return ( ( ::borogove::DirectChat)(::Std_obj::downcast(chat,::hx::ClassOf< ::borogove::DirectChat >())) );
+HXDLIN(1197)				if (_hx_tmp) {
+HXLINE(1198)					return ( ( ::borogove::DirectChat)(::Std_obj::downcast(chat,::hx::ClassOf< ::borogove::DirectChat >())) );
             				}
             			}
             		}
-HXLINE(1132)		 ::borogove::DirectChat chat1 =  ::borogove::DirectChat_obj::__alloc( HX_CTX ,::hx::ObjectPtr<OBJ_>(this),this->stream,this->persistence,chatId,null(),null(),null(),null(),null(),null());
-HXLINE(1133)		::Dynamic _hx_tmp1 = this->persistence;
-HXDLIN(1133)		::borogove::Persistence_obj::storeChats(_hx_tmp1,this->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat1));
-HXLINE(1134)		this->chats->unshift(chat1);
-HXLINE(1135)		if (triggerIfNew) {
-HXLINE(1135)			this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat1));
-            		}
-HXLINE(1136)		return chat1;
+HXLINE(1201)		 ::borogove::DirectChat chat1 =  ::borogove::DirectChat_obj::__alloc( HX_CTX ,::hx::ObjectPtr<OBJ_>(this),this->stream,this->persistence,chatId,null(),null(),null(),null(),null(),null(),null());
+HXLINE(1202)		::Dynamic _hx_tmp1 = this->persistence;
+HXDLIN(1202)		::borogove::Persistence_obj::storeChats(_hx_tmp1,this->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat1));
+HXLINE(1203)		this->chats->push(chat1);
+HXLINE(1204)		this->chatActivity(chat1,triggerIfNew);
+HXLINE(1205)		return chat1;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Client_obj,getDirectChat,return )
 
 void Client_obj::enablePush(::String push_service,::String endpoint,::Array< unsigned char > p256dh,::Array< unsigned char > auth,int grace,::Array< unsigned char > vapid_private_pkcs8,::Array< ::String > claims){
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1179_enablePush)
-HXLINE(1180)		::Array< ::String > _hx_tmp;
-HXDLIN(1180)		if (::hx::IsNotNull( claims )) {
-HXLINE(1180)			_hx_tmp = claims;
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1256_enablePush)
+HXLINE(1257)		bool _hx_tmp;
+HXDLIN(1257)		if (::hx::IsNotNull( vapid_private_pkcs8 )) {
+HXLINE(1257)			_hx_tmp = (::haxe::io::Bytes_obj::ofData(vapid_private_pkcs8)->length == 0);
+            		}
+            		else {
+HXLINE(1257)			_hx_tmp = false;
+            		}
+HXDLIN(1257)		if (_hx_tmp) {
+HXLINE(1257)			vapid_private_pkcs8 = null();
+            		}
+HXLINE(1258)		::Array< ::String > _hx_tmp1;
+HXDLIN(1258)		if (::hx::IsNotNull( claims )) {
+HXLINE(1258)			_hx_tmp1 = claims;
             		}
             		else {
-HXLINE(1180)			_hx_tmp = ::Array_obj< ::String >::__new(0);
+HXLINE(1258)			_hx_tmp1 = ::Array_obj< ::String >::__new(0);
             		}
-HXDLIN(1180)		this->enabledPushData =  ::Dynamic(::hx::Anon_obj::Create(7)
+HXDLIN(1258)		this->enabledPushData =  ::Dynamic(::hx::Anon_obj::Create(7)
             			->setFixed(0,HX_("grace",f8,03,ea,99),grace)
             			->setFixed(1,HX_("p256dh",e7,0a,33,b5),p256dh)
             			->setFixed(2,HX_("push_service",90,f1,d2,f8),push_service)
             			->setFixed(3,HX_("vapid_private_pkcs8",32,d7,0a,03),vapid_private_pkcs8)
-            			->setFixed(4,HX_("claims",77,1d,09,05),_hx_tmp)
+            			->setFixed(4,HX_("claims",77,1d,09,05),_hx_tmp1)
             			->setFixed(5,HX_("endpoint",95,d6,5f,31),endpoint)
             			->setFixed(6,HX_("auth",68,df,76,40),auth));
-HXLINE(1182)		::Array< ::Dynamic> filters = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1183)		{
-HXLINE(1183)			int _g = 0;
-HXDLIN(1183)			::Array< ::Dynamic> _g1 = this->chats;
-HXDLIN(1183)			while((_g < _g1->length)){
-HXLINE(1183)				 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
-HXDLIN(1183)				_g = (_g + 1);
-HXLINE(1184)				if (chat->notificationsFiltered()) {
-HXLINE(1185)					::String chat1 = chat->chatId;
-HXDLIN(1185)					bool _hx_tmp1 = chat->notifyMention();
-HXDLIN(1185)					filters->push( ::Dynamic(::hx::Anon_obj::Create(3)
-            						->setFixed(0,HX_("mention",ea,9e,bf,b9),_hx_tmp1)
+HXLINE(1260)		::Array< ::Dynamic> filters = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1261)		{
+HXLINE(1261)			int _g = 0;
+HXDLIN(1261)			::Array< ::Dynamic> _g1 = this->chats;
+HXDLIN(1261)			while((_g < _g1->length)){
+HXLINE(1261)				 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
+HXDLIN(1261)				_g = (_g + 1);
+HXLINE(1262)				if (chat->notificationsFiltered()) {
+HXLINE(1263)					::String chat1 = chat->chatId;
+HXDLIN(1263)					bool _hx_tmp2 = chat->notifyMention();
+HXDLIN(1263)					filters->push( ::Dynamic(::hx::Anon_obj::Create(3)
+            						->setFixed(0,HX_("mention",ea,9e,bf,b9),_hx_tmp2)
             						->setFixed(1,HX_("reply",2a,09,c6,e6),chat->notifyReply())
             						->setFixed(2,HX_("jid",c5,ca,50,00),chat1)));
             				}
             			}
             		}
-HXLINE(1189)		 ::haxe::ds::StringMap _g2 =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXDLIN(1189)		_g2->set(HX_("aud",f0,00,4a,00),( (::Array< ::String >)(::tink::_Url::Url_Impl__obj::parse(endpoint,null())->__Field(HX_("hosts",0b,ac,62,2b),::hx::paccDynamic)) )->__get(0));
-HXLINE(1190)		{
-HXLINE(1190)			int _g3 = 0;
-HXDLIN(1190)			::Array< ::String > _g4;
-HXDLIN(1190)			if (::hx::IsNotNull( claims )) {
-HXLINE(1190)				_g4 = claims;
+HXLINE(1267)		 ::haxe::ds::StringMap _g2 =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXDLIN(1267)		_g2->set(HX_("aud",f0,00,4a,00),( (::Array< ::String >)(::tink::_Url::Url_Impl__obj::parse(endpoint,null())->__Field(HX_("hosts",0b,ac,62,2b),::hx::paccDynamic)) )->__get(0));
+HXLINE(1268)		{
+HXLINE(1268)			int _g3 = 0;
+HXDLIN(1268)			::Array< ::String > _g4;
+HXDLIN(1268)			if (::hx::IsNotNull( claims )) {
+HXLINE(1268)				_g4 = claims;
             			}
             			else {
-HXLINE(1190)				_g4 = ::Array_obj< ::String >::__new(0);
+HXLINE(1268)				_g4 = ::Array_obj< ::String >::__new(0);
             			}
-HXDLIN(1190)			int _g5 = _g4->length;
-HXDLIN(1190)			while((_g3 < _g5)){
-HXLINE(1190)				_g3 = (_g3 + 1);
-HXDLIN(1190)				int i = (_g3 - 1);
-HXLINE(1191)				if ((::hx::Mod(i,2) == 0)) {
-HXLINE(1192)					_g2->set(claims->__get(i),claims->__get((i + 1)));
+HXDLIN(1268)			int _g5 = _g4->length;
+HXDLIN(1268)			while((_g3 < _g5)){
+HXLINE(1268)				_g3 = (_g3 + 1);
+HXDLIN(1268)				int i = (_g3 - 1);
+HXLINE(1269)				if ((::hx::Mod(i,2) == 0)) {
+HXLINE(1270)					_g2->set(claims->__get(i),claims->__get((i + 1)));
             				}
             			}
             		}
-HXLINE(1197)		::String _hx_tmp2 = this->jid->asBare()->asString();
-HXLINE(1202)		::String _hx_tmp3;
-HXDLIN(1202)		if (::hx::IsNull( vapid_private_pkcs8 )) {
-HXLINE(1202)			_hx_tmp3 = null();
+HXLINE(1275)		::String _hx_tmp3 = this->jid->asBare()->asString();
+HXLINE(1280)		::String _hx_tmp4;
+HXDLIN(1280)		if (::hx::IsNull( vapid_private_pkcs8 )) {
+HXLINE(1280)			_hx_tmp4 = null();
             		}
             		else {
-HXLINE(1202)			_hx_tmp3 = HX_("ES256",65,db,a8,f1);
+HXLINE(1280)			_hx_tmp4 = HX_("ES256",65,db,a8,f1);
             		}
-HXLINE(1203)		 ::haxe::io::Bytes _hx_tmp4;
-HXDLIN(1203)		if (::hx::IsNull( vapid_private_pkcs8 )) {
-HXLINE(1203)			_hx_tmp4 = null();
+HXLINE(1281)		 ::haxe::io::Bytes _hx_tmp5;
+HXDLIN(1281)		if (::hx::IsNull( vapid_private_pkcs8 )) {
+HXLINE(1281)			_hx_tmp5 = null();
             		}
             		else {
-HXLINE(1203)			_hx_tmp4 = ::haxe::io::Bytes_obj::ofData(vapid_private_pkcs8);
+HXLINE(1281)			_hx_tmp5 = ::haxe::io::Bytes_obj::ofData(vapid_private_pkcs8);
             		}
-HXLINE(1196)		this->sendQuery( ::borogove::queries::Push2Enable_obj::__alloc( HX_CTX ,_hx_tmp2,push_service,endpoint,::haxe::io::Bytes_obj::ofData(p256dh),::haxe::io::Bytes_obj::ofData(auth),_hx_tmp3,_hx_tmp4,_g2,grace,filters));
+HXLINE(1274)		this->sendQuery( ::borogove::queries::Push2Enable_obj::__alloc( HX_CTX ,_hx_tmp3,push_service,endpoint,::haxe::io::Bytes_obj::ofData(p256dh),::haxe::io::Bytes_obj::ofData(auth),_hx_tmp4,_hx_tmp5,_g2,grace,filters));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC7(Client_obj,enablePush,(void))
 
 void Client_obj::enablePush__fromC(::String push_service,::String endpoint,::cpp::Pointer< unsigned char > p256dh,size_t p256dh__len,::cpp::Pointer< unsigned char > auth,size_t auth__len,int grace,::cpp::Pointer< unsigned char > vapid_private_pkcs8,size_t vapid_private_pkcs8__len,::cpp::Pointer< const char* > claims,size_t claims__len){
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_enablePush__fromC)
-HXLINE( 282)		::Array< unsigned char > _hx_tmp;
-HXDLIN( 282)		if (::hx::IsNull( p256dh )) {
-HXLINE( 282)			_hx_tmp = null();
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_354_enablePush__fromC)
+HXLINE( 302)		::Array< unsigned char > _hx_tmp;
+HXDLIN( 302)		if (::hx::IsNull( p256dh )) {
+HXLINE( 302)			_hx_tmp = ::Array_obj< unsigned char >::__new(0);
             		}
             		else {
-HXLINE( 282)			::cpp::Pointer< unsigned char > _this = p256dh->reinterpret();
-HXDLIN( 282)			::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
-HXDLIN( 282)			::cpp::Pointer< unsigned char > tmp = _this;
-HXDLIN( 282)			result->setUnmanagedData(tmp,( (int)(p256dh__len) ));
-HXDLIN( 282)			_hx_tmp = result->copy();
+HXLINE( 302)			::cpp::Pointer< unsigned char > _this = p256dh->reinterpret();
+HXDLIN( 302)			::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)			::cpp::Pointer< unsigned char > tmp = _this;
+HXDLIN( 302)			result->setUnmanagedData(tmp,( (int)(p256dh__len) ));
+HXDLIN( 302)			_hx_tmp = result->copy();
             		}
-HXDLIN( 282)		::Array< unsigned char > _hx_tmp1;
-HXDLIN( 282)		if (::hx::IsNull( auth )) {
-HXLINE( 282)			_hx_tmp1 = null();
+HXDLIN( 302)		::Array< unsigned char > _hx_tmp1;
+HXDLIN( 302)		if (::hx::IsNull( auth )) {
+HXLINE( 302)			_hx_tmp1 = ::Array_obj< unsigned char >::__new(0);
             		}
             		else {
-HXLINE( 282)			::cpp::Pointer< unsigned char > _this1 = auth->reinterpret();
-HXDLIN( 282)			::Array< unsigned char > result1 = ::Array_obj< unsigned char >::__new();
-HXDLIN( 282)			::cpp::Pointer< unsigned char > tmp1 = _this1;
-HXDLIN( 282)			result1->setUnmanagedData(tmp1,( (int)(auth__len) ));
-HXDLIN( 282)			_hx_tmp1 = result1->copy();
+HXLINE( 302)			::cpp::Pointer< unsigned char > _this1 = auth->reinterpret();
+HXDLIN( 302)			::Array< unsigned char > result1 = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)			::cpp::Pointer< unsigned char > tmp1 = _this1;
+HXDLIN( 302)			result1->setUnmanagedData(tmp1,( (int)(auth__len) ));
+HXDLIN( 302)			_hx_tmp1 = result1->copy();
             		}
-HXDLIN( 282)		::Array< unsigned char > _hx_tmp2;
-HXDLIN( 282)		if (::hx::IsNull( vapid_private_pkcs8 )) {
-HXLINE( 282)			_hx_tmp2 = null();
+HXDLIN( 302)		::Array< unsigned char > _hx_tmp2;
+HXDLIN( 302)		if (::hx::IsNull( vapid_private_pkcs8 )) {
+HXLINE( 302)			_hx_tmp2 = ::Array_obj< unsigned char >::__new(0);
             		}
             		else {
-HXLINE( 282)			::cpp::Pointer< unsigned char > _this2 = vapid_private_pkcs8->reinterpret();
-HXDLIN( 282)			::Array< unsigned char > result2 = ::Array_obj< unsigned char >::__new();
-HXDLIN( 282)			::cpp::Pointer< unsigned char > tmp2 = _this2;
-HXDLIN( 282)			result2->setUnmanagedData(tmp2,( (int)(vapid_private_pkcs8__len) ));
-HXDLIN( 282)			_hx_tmp2 = result2->copy();
+HXLINE( 302)			::cpp::Pointer< unsigned char > _this2 = vapid_private_pkcs8->reinterpret();
+HXDLIN( 302)			::Array< unsigned char > result2 = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)			::cpp::Pointer< unsigned char > tmp2 = _this2;
+HXDLIN( 302)			result2->setUnmanagedData(tmp2,( (int)(vapid_private_pkcs8__len) ));
+HXDLIN( 302)			_hx_tmp2 = result2->copy();
             		}
-HXLINE( 280)		::Array< ::String > _hx_tmp3;
-HXDLIN( 280)		if (::hx::IsNull( claims )) {
-HXLINE( 280)			_hx_tmp3 = null();
+HXLINE( 300)		::Array< ::String > _hx_tmp3;
+HXDLIN( 300)		if (::hx::IsNull( claims )) {
+HXLINE( 300)			_hx_tmp3 = ::Array_obj< ::String >::__new(0);
             		}
             		else {
-HXLINE( 280)			::cpp::Pointer< ::cpp::Pointer< char > > _this3 = claims->reinterpret();
-HXDLIN( 280)			::Array< ::cpp::Pointer< char > > result3 = ::Array_obj< ::cpp::Pointer< char > >::__new();
-HXDLIN( 280)			::cpp::Pointer< ::cpp::Pointer< char > > tmp3 = _this3;
-HXDLIN( 280)			result3->setUnmanagedData(tmp3,( (int)(claims__len) ));
-HXDLIN( 280)			 ::Dynamic f = ::cpp::_NativeString::NativeString_Impl__obj::fromPointer_dyn();
-HXDLIN( 280)			::Array< ::String > result4 = ::Array_obj< ::String >::__new(result3->length);
-HXDLIN( 280)			{
-HXLINE( 280)				int _g = 0;
-HXDLIN( 280)				int _g1 = result3->length;
-HXDLIN( 280)				while((_g < _g1)){
-HXLINE( 280)					_g = (_g + 1);
-HXDLIN( 280)					int i = (_g - 1);
-HXDLIN( 280)					{
-HXLINE( 280)						::cpp::Pointer< char > tmp4 = _hx_array_unsafe_get(result3,i);
-HXDLIN( 280)						::String inValue = ( (::String)(f(tmp4)) );
-HXDLIN( 280)						result4->__unsafe_set(i,inValue);
-            					}
-            				}
-            			}
-HXDLIN( 280)			_hx_tmp3 = result4->copy();
-            		}
-HXLINE( 339)		this->enablePush(push_service,endpoint,_hx_tmp,_hx_tmp1,grace,_hx_tmp2,_hx_tmp3);
+HXLINE( 300)			::cpp::Pointer< ::cpp::Pointer< char > > _this3 = claims->reinterpret();
+HXDLIN( 300)			::Array< ::cpp::Pointer< char > > result3 = ::Array_obj< ::cpp::Pointer< char > >::__new();
+HXDLIN( 300)			::cpp::Pointer< ::cpp::Pointer< char > > tmp3 = _this3;
+HXDLIN( 300)			result3->setUnmanagedData(tmp3,( (int)(claims__len) ));
+HXDLIN( 300)			 ::Dynamic f = ::cpp::_NativeString::NativeString_Impl__obj::fromPointer_dyn();
+HXDLIN( 300)			::Array< ::String > result4 = ::Array_obj< ::String >::__new(result3->length);
+HXDLIN( 300)			{
+HXLINE( 300)				int _g = 0;
+HXDLIN( 300)				int _g1 = result3->length;
+HXDLIN( 300)				while((_g < _g1)){
+HXLINE( 300)					_g = (_g + 1);
+HXDLIN( 300)					int i = (_g - 1);
+HXDLIN( 300)					{
+HXLINE( 300)						::cpp::Pointer< char > tmp4 = _hx_array_unsafe_get(result3,i);
+HXDLIN( 300)						::String inValue = ( (::String)(f(tmp4)) );
+HXDLIN( 300)						result4->__unsafe_set(i,inValue);
+            					}
+            				}
+            			}
+HXDLIN( 300)			_hx_tmp3 = result4->copy();
+            		}
+HXLINE( 354)		this->enablePush(push_service,endpoint,_hx_tmp,_hx_tmp1,grace,_hx_tmp2,_hx_tmp3);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC11(Client_obj,enablePush__fromC,(void))
 
 void Client_obj::updatePushIfEnabled(){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1211_updatePushIfEnabled)
-HXLINE(1212)		if (::hx::IsNull( this->enabledPushData )) {
-HXLINE(1212)			return;
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1289_updatePushIfEnabled)
+HXLINE(1290)		if (::hx::IsNull( this->enabledPushData )) {
+HXLINE(1290)			return;
             		}
-HXLINE(1213)		this->enablePush(( (::String)(this->enabledPushData->__Field(HX_("push_service",90,f1,d2,f8),::hx::paccDynamic)) ),( (::String)(this->enabledPushData->__Field(HX_("endpoint",95,d6,5f,31),::hx::paccDynamic)) ),( (::Array< unsigned char >)(this->enabledPushData->__Field(HX_("p256dh",e7,0a,33,b5),::hx::paccDynamic)) ),( (::Array< unsigned char >)(this->enabledPushData->__Field(HX_("auth",68,df,76,40),::hx::paccDynamic)) ),( (int)(this->enabledPushData->__Field(HX_("grace",f8,03,ea,99),::hx::paccDynamic)) ),( (::Array< unsigned char >)(this->enabledPushData->__Field(HX_("vapid_private_pkcs8",32,d7,0a,03),::hx::paccDynamic)) ),( (::Array< ::String >)(this->enabledPushData->__Field(HX_("claims",77,1d,09,05),::hx::paccDynamic)) ));
+HXLINE(1291)		this->enablePush(( (::String)(this->enabledPushData->__Field(HX_("push_service",90,f1,d2,f8),::hx::paccDynamic)) ),( (::String)(this->enabledPushData->__Field(HX_("endpoint",95,d6,5f,31),::hx::paccDynamic)) ),( (::Array< unsigned char >)(this->enabledPushData->__Field(HX_("p256dh",e7,0a,33,b5),::hx::paccDynamic)) ),( (::Array< unsigned char >)(this->enabledPushData->__Field(HX_("auth",68,df,76,40),::hx::paccDynamic)) ),( (int)(this->enabledPushData->__Field(HX_("grace",f8,03,ea,99),::hx::paccDynamic)) ),( (::Array< unsigned char >)(this->enabledPushData->__Field(HX_("vapid_private_pkcs8",32,d7,0a,03),::hx::paccDynamic)) ),( (::Array< ::String >)(this->enabledPushData->__Field(HX_("claims",77,1d,09,05),::hx::paccDynamic)) ));
             	}
 
 
@@ -3539,15 +3670,15 @@ HX_DEFINE_DYNAMIC_FUNC0(Client_obj,updatePushIfEnabled,(void))
 int Client_obj::addPasswordNeededListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis, ::Dynamic,handler) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1223_addPasswordNeededListener)
-HXLINE(1224)			handler(_gthis);
-HXLINE(1225)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1302_addPasswordNeededListener)
+HXLINE(1303)			handler(_gthis);
+HXLINE(1304)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1222_addPasswordNeededListener)
-HXDLIN(1222)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1223)		return this->on(HX_("auth/password-needed",80,f0,74,49), ::Dynamic(new _hx_Closure_0(_gthis,handler)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1301_addPasswordNeededListener)
+HXDLIN(1301)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1302)		return this->on(HX_("auth/password-needed",80,f0,74,49), ::Dynamic(new _hx_Closure_0(_gthis,handler)));
             	}
 
 
@@ -3556,42 +3687,42 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addPasswordNeededListener,return )
 int Client_obj::addPasswordNeededListener__fromC(::cpp::Function< void  (void*,void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             		void _hx_run( ::borogove::Client a0){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_272_addPasswordNeededListener__fromC)
-HXLINE( 251)			 ::Dynamic haxeObject = a0;
-HXDLIN( 251)			void* ptr = haxeObject.mPtr;
-HXDLIN( 251)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 251)			{
-HXLINE( 251)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 251)				if (::hx::IsNull( store )) {
-HXLINE( 251)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_282_addPasswordNeededListener__fromC)
+HXLINE( 259)			 ::Dynamic haxeObject = a0;
+HXDLIN( 259)			void* ptr = haxeObject.mPtr;
+HXDLIN( 259)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 259)			{
+HXLINE( 259)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 259)				if (::hx::IsNull( store )) {
+HXLINE( 259)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 251)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 259)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             				}
             				else {
-HXLINE( 251)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 259)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXLINE( 261)			handler(ptr,handler__context);
+HXLINE( 269)			handler(ptr,handler__context);
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addPasswordNeededListener__fromC)
-HXDLIN( 339)		return this->addPasswordNeededListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addPasswordNeededListener__fromC)
+HXDLIN( 367)		return this->addPasswordNeededListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 int Client_obj::addStatusOnlineListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,handler) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1236_addStatusOnlineListener)
-HXLINE(1237)			handler();
-HXLINE(1238)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1316_addStatusOnlineListener)
+HXLINE(1317)			handler();
+HXLINE(1318)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1236_addStatusOnlineListener)
-HXDLIN(1236)		return this->on(HX_("status/online",10,05,0e,d2), ::Dynamic(new _hx_Closure_0(handler)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1316_addStatusOnlineListener)
+HXDLIN(1316)		return this->on(HX_("status/online",10,05,0e,d2), ::Dynamic(new _hx_Closure_0(handler)));
             	}
 
 
@@ -3600,27 +3731,27 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addStatusOnlineListener,return )
 int Client_obj::addStatusOnlineListener__fromC(::cpp::Function< void  (void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void*) >,handler,void*,handler__context) HXARGC(0)
             		void _hx_run(){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_261_addStatusOnlineListener__fromC)
-HXLINE( 261)			handler(handler__context);
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_269_addStatusOnlineListener__fromC)
+HXLINE( 269)			handler(handler__context);
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addStatusOnlineListener__fromC)
-HXDLIN( 339)		return this->addStatusOnlineListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addStatusOnlineListener__fromC)
+HXDLIN( 367)		return this->addStatusOnlineListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 int Client_obj::addStatusOfflineListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,handler) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1249_addStatusOfflineListener)
-HXLINE(1250)			handler();
-HXLINE(1251)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1330_addStatusOfflineListener)
+HXLINE(1331)			handler();
+HXLINE(1332)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1249_addStatusOfflineListener)
-HXDLIN(1249)		return this->on(HX_("status/offline",c6,eb,eb,54), ::Dynamic(new _hx_Closure_0(handler)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1330_addStatusOfflineListener)
+HXDLIN(1330)		return this->on(HX_("status/offline",c6,eb,eb,54), ::Dynamic(new _hx_Closure_0(handler)));
             	}
 
 
@@ -3629,27 +3760,27 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addStatusOfflineListener,return )
 int Client_obj::addStatusOfflineListener__fromC(::cpp::Function< void  (void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void*) >,handler,void*,handler__context) HXARGC(0)
             		void _hx_run(){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_261_addStatusOfflineListener__fromC)
-HXLINE( 261)			handler(handler__context);
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_269_addStatusOfflineListener__fromC)
+HXLINE( 269)			handler(handler__context);
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addStatusOfflineListener__fromC)
-HXDLIN( 339)		return this->addStatusOfflineListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addStatusOfflineListener__fromC)
+HXDLIN( 367)		return this->addStatusOfflineListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 int Client_obj::addConnectionFailedListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,handler) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1262_addConnectionFailedListener)
-HXLINE(1263)			handler();
-HXLINE(1264)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1344_addConnectionFailedListener)
+HXLINE(1345)			handler();
+HXLINE(1346)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1262_addConnectionFailedListener)
-HXDLIN(1262)		return this->stream->on(HX_("status/error",eb,19,84,6f), ::Dynamic(new _hx_Closure_0(handler)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1344_addConnectionFailedListener)
+HXDLIN(1344)		return this->stream->on(HX_("status/error",eb,19,84,6f), ::Dynamic(new _hx_Closure_0(handler)));
             	}
 
 
@@ -3658,26 +3789,26 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addConnectionFailedListener,return )
 int Client_obj::addConnectionFailedListener__fromC(::cpp::Function< void  (void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void*) >,handler,void*,handler__context) HXARGC(0)
             		void _hx_run(){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_261_addConnectionFailedListener__fromC)
-HXLINE( 261)			handler(handler__context);
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_269_addConnectionFailedListener__fromC)
+HXLINE( 269)			handler(handler__context);
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addConnectionFailedListener__fromC)
-HXDLIN( 339)		return this->addConnectionFailedListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addConnectionFailedListener__fromC)
+HXDLIN( 367)		return this->addConnectionFailedListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 int Client_obj::addTlsCheckListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,handler) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1276_addTlsCheckListener)
-HXLINE(1276)			return ::borogove::EventResult_obj::EventValue(handler( ::Dynamic(data->__Field(HX_("pem",d8,54,55,00),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("dnsNames",5f,19,aa,5a),::hx::paccDynamic))));
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1359_addTlsCheckListener)
+HXLINE(1359)			return ::borogove::EventResult_obj::EventValue(handler( ::Dynamic(data->__Field(HX_("pem",d8,54,55,00),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("dnsNames",5f,19,aa,5a),::hx::paccDynamic))));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1275_addTlsCheckListener)
-HXDLIN(1275)		return this->stream->on(HX_("tls/check",74,a0,4c,75), ::Dynamic(new _hx_Closure_0(handler)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1358_addTlsCheckListener)
+HXDLIN(1358)		return this->stream->on(HX_("tls/check",74,a0,4c,75), ::Dynamic(new _hx_Closure_0(handler)));
             	}
 
 
@@ -3686,85 +3817,56 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addTlsCheckListener,return )
 int Client_obj::addTlsCheckListener__fromC(::cpp::Function< bool  (const char*,const char**,size_t,void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< bool  (const char* HX_COMMA const char** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(2)
             		bool _hx_run(::String a0,::Array< ::String > a1){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_272_addTlsCheckListener__fromC)
-HXLINE( 247)			const char* cStrPtr = a0.utf8_str();
-HXDLIN( 247)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 247)			{
-HXLINE( 247)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 247)				if (::hx::IsNull( store )) {
-HXLINE(2243)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_282_addTlsCheckListener__fromC)
+HXLINE( 255)			const char* cStrPtr = a0.utf8_str();
+HXDLIN( 255)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
+HXDLIN( 255)			{
+HXLINE( 255)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 255)				if (::hx::IsNull( store )) {
+HXLINE( 255)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),a0));
-HXLINE( 247)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 255)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             				}
             				else {
-HXLINE( 247)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 247)			const char* x0 = cStrPtr;
-HXLINE( 243)			::Array< size_t > arr = ::Array_obj< size_t >::__new(a1->length);
-HXDLIN( 243)			{
-HXLINE( 243)				int _g_current = 0;
-HXDLIN( 243)				::Array< ::String > _g_array = a1;
-HXDLIN( 243)				while((_g_current < _g_array->length)){
-HXLINE( 243)					::String _g_value = _g_array->__get(_g_current);
-HXDLIN( 243)					_g_current = (_g_current + 1);
-HXDLIN( 243)					::String el = _g_value;
-HXDLIN( 243)					{
-HXLINE( 243)						const char* cStrPtr1 = el.utf8_str();
-HXDLIN( 243)						::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(cStrPtr1);
-HXDLIN( 243)						{
-HXLINE( 243)							 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 243)							if (::hx::IsNull( store1 )) {
-HXLINE(2243)								store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),el));
-HXLINE( 243)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            							}
-            							else {
-HXLINE( 243)								::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-HXDLIN( 243)						const char* ptr = cStrPtr1;
-HXDLIN( 243)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
-            					}
+HXLINE( 255)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXDLIN( 243)			void** ptr1 = (void**)arr->getBase();
-HXDLIN( 243)			::cpp::Int64 ptrInt642 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 243)			{
-HXLINE( 243)				 ::Dynamic store2 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt642);
-HXDLIN( 243)				if (::hx::IsNull( store2 )) {
-HXLINE(2243)					store2 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),arr));
-HXLINE( 243)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt642,store2);
-            				}
-            				else {
-HXLINE( 243)					::hx::FieldRef((store2).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
+HXLINE( 251)			const char** x1 = ::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(a1);
+HXDLIN( 251)			int xl1;
+HXDLIN( 251)			 ::Dynamic tmp;
+HXDLIN( 251)			if (::hx::IsNotNull( a1 )) {
+HXLINE( 251)				tmp = a1->length;
             			}
-HXDLIN( 243)			int xl1 = a1->length;
-HXLINE( 269)			return handler(x0,( (const char**)(ptr1) ),( (size_t)(xl1) ),handler__context);
+            			else {
+HXLINE( 251)				tmp = null();
+            			}
+HXDLIN( 251)			if (::hx::IsNotNull( tmp )) {
+HXLINE( 251)				xl1 = ( (int)(tmp) );
+            			}
+            			else {
+HXLINE( 251)				xl1 = -1;
+            			}
+HXLINE( 279)			return handler(cStrPtr,x1,( (size_t)(xl1) ),handler__context);
             		}
             		HX_END_LOCAL_FUNC2(return)
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addTlsCheckListener__fromC)
-HXDLIN( 339)		return this->addTlsCheckListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addTlsCheckListener__fromC)
+HXDLIN( 367)		return this->addTlsCheckListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 int Client_obj::addChatMessageListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,handler) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1306_addChatMessageListener)
-HXLINE(1307)			handler( ::Dynamic(data->__Field(HX_("message",c7,35,11,9a),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("event",1a,c8,c4,75),::hx::paccDynamic)));
-HXLINE(1308)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1397_addChatMessageListener)
+HXLINE(1398)			handler( ::Dynamic(data->__Field(HX_("message",c7,35,11,9a),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("event",1a,c8,c4,75),::hx::paccDynamic)));
+HXLINE(1399)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1306_addChatMessageListener)
-HXDLIN(1306)		return this->on(HX_("message/new",d8,fc,71,67), ::Dynamic(new _hx_Closure_0(handler)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1397_addChatMessageListener)
+HXDLIN(1397)		return this->on(HX_("message/new",d8,fc,71,67), ::Dynamic(new _hx_Closure_0(handler)));
             	}
 
 
@@ -3773,42 +3875,42 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addChatMessageListener,return )
 int Client_obj::addChatMessageListener__fromC(::cpp::Function< void  (void*,int,void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA int HX_COMMA void*) >,handler,void*,handler__context) HXARGC(2)
             		void _hx_run( ::borogove::ChatMessage a0,int a1){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_272_addChatMessageListener__fromC)
-HXLINE( 251)			 ::Dynamic haxeObject = a0;
-HXDLIN( 251)			void* ptr = haxeObject.mPtr;
-HXDLIN( 251)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 251)			{
-HXLINE( 251)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 251)				if (::hx::IsNull( store )) {
-HXLINE( 251)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_282_addChatMessageListener__fromC)
+HXLINE( 259)			 ::Dynamic haxeObject = a0;
+HXDLIN( 259)			void* ptr = haxeObject.mPtr;
+HXDLIN( 259)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 259)			{
+HXLINE( 259)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 259)				if (::hx::IsNull( store )) {
+HXLINE( 259)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 251)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 259)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             				}
             				else {
-HXLINE( 251)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 259)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXLINE( 261)			handler(ptr,a1,handler__context);
+HXLINE( 269)			handler(ptr,a1,handler__context);
             		}
             		HX_END_LOCAL_FUNC2((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addChatMessageListener__fromC)
-HXDLIN( 339)		return this->addChatMessageListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addChatMessageListener__fromC)
+HXDLIN( 367)		return this->addChatMessageListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 int Client_obj::addSyncMessageListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,handler) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::borogove::ChatMessage data){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1320_addSyncMessageListener)
-HXLINE(1321)			handler(data);
-HXLINE(1322)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1412_addSyncMessageListener)
+HXLINE(1413)			handler(data);
+HXLINE(1414)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1320_addSyncMessageListener)
-HXDLIN(1320)		return this->on(HX_("message/sync",e3,76,a8,1f), ::Dynamic(new _hx_Closure_0(handler)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1412_addSyncMessageListener)
+HXDLIN(1412)		return this->on(HX_("message/sync",e3,76,a8,1f), ::Dynamic(new _hx_Closure_0(handler)));
             	}
 
 
@@ -3817,102 +3919,102 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addSyncMessageListener,return )
 int Client_obj::addSyncMessageListener__fromC(::cpp::Function< void  (void*,void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             		void _hx_run( ::borogove::ChatMessage a0){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_272_addSyncMessageListener__fromC)
-HXLINE( 251)			 ::Dynamic haxeObject = a0;
-HXDLIN( 251)			void* ptr = haxeObject.mPtr;
-HXDLIN( 251)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 251)			{
-HXLINE( 251)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 251)				if (::hx::IsNull( store )) {
-HXLINE( 251)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_282_addSyncMessageListener__fromC)
+HXLINE( 259)			 ::Dynamic haxeObject = a0;
+HXDLIN( 259)			void* ptr = haxeObject.mPtr;
+HXDLIN( 259)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 259)			{
+HXLINE( 259)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 259)				if (::hx::IsNull( store )) {
+HXLINE( 259)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 251)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 259)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             				}
             				else {
-HXLINE( 251)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 259)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXLINE( 261)			handler(ptr,handler__context);
+HXLINE( 269)			handler(ptr,handler__context);
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addSyncMessageListener__fromC)
-HXDLIN( 339)		return this->addSyncMessageListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addSyncMessageListener__fromC)
+HXDLIN( 367)		return this->addSyncMessageListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 int Client_obj::addChatsUpdatedListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_3, ::haxe::ds::StringMap,updateChatBuffer,::Array< ::Dynamic>,updateChatTimer, ::Dynamic,handler,::Array< Float >,lastCall) HXARGC(1)
             		 ::borogove::EventResult _hx_run(::Array< ::Dynamic> data){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1336_addChatsUpdatedListener)
-HXLINE(1337)			Float now = ( ::__time_stamp() * ( (Float)(1000) ));
-HXLINE(1338)			if (::hx::IsNotNull( updateChatTimer->__get(0).StaticCast<  ::haxe::Timer >() )) {
-HXLINE(1339)				updateChatTimer->__get(0).StaticCast<  ::haxe::Timer >()->stop();
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1429_addChatsUpdatedListener)
+HXLINE(1430)			Float now = ( ::__time_stamp() * ( (Float)(1000) ));
+HXLINE(1431)			if (::hx::IsNotNull( updateChatTimer->__get(0).StaticCast<  ::haxe::Timer >() )) {
+HXLINE(1432)				updateChatTimer->__get(0).StaticCast<  ::haxe::Timer >()->stop();
             			}
-HXLINE(1341)			{
-HXLINE(1341)				int _g = 0;
-HXDLIN(1341)				while((_g < data->length)){
-HXLINE(1341)					 ::borogove::Chat chat = data->__get(_g).StaticCast<  ::borogove::Chat >();
-HXDLIN(1341)					_g = (_g + 1);
-HXLINE(1342)					updateChatBuffer->set(chat->chatId,chat);
+HXLINE(1434)			{
+HXLINE(1434)				int _g = 0;
+HXDLIN(1434)				while((_g < data->length)){
+HXLINE(1434)					 ::borogove::Chat chat = data->__get(_g).StaticCast<  ::borogove::Chat >();
+HXDLIN(1434)					_g = (_g + 1);
+HXLINE(1435)					updateChatBuffer->set(chat->chatId,chat);
             				}
             			}
-HXLINE(1344)			bool _hx_tmp;
-HXDLIN(1344)			if (!((lastCall->__get(0) < 0))) {
-HXLINE(1344)				_hx_tmp = ((now - lastCall->__get(0)) >= 500);
+HXLINE(1437)			bool _hx_tmp;
+HXDLIN(1437)			if (!((lastCall->__get(0) < 0))) {
+HXLINE(1437)				_hx_tmp = ((now - lastCall->__get(0)) >= 500);
             			}
             			else {
-HXLINE(1344)				_hx_tmp = true;
+HXLINE(1437)				_hx_tmp = true;
             			}
-HXDLIN(1344)			if (_hx_tmp) {
+HXDLIN(1437)			if (_hx_tmp) {
             				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::haxe::ds::StringMap,_e) HXARGC(0)
             				 ::Dynamic _hx_run(){
-            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1346_addChatsUpdatedListener)
-HXLINE(1346)					return _e->iterator();
+            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1439_addChatsUpdatedListener)
+HXLINE(1439)					return _e->iterator();
             				}
             				HX_END_LOCAL_FUNC0(return)
 
-HXLINE(1345)				lastCall[0] = now;
-HXLINE(1346)				 ::Dynamic handler1 = handler;
-HXDLIN(1346)				 ::haxe::ds::StringMap _e = updateChatBuffer;
-HXDLIN(1346)				handler1(::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1438)				lastCall[0] = now;
+HXLINE(1439)				 ::Dynamic handler1 = handler;
+HXDLIN(1439)				 ::haxe::ds::StringMap _e = updateChatBuffer;
+HXDLIN(1439)				handler1(::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("iterator",ee,49,9a,93), ::Dynamic(new _hx_Closure_0(_e))))));
-HXLINE(1347)				updateChatTimer[0] = null();
-HXLINE(1348)				updateChatBuffer->clear();
+HXLINE(1440)				updateChatTimer[0] = null();
+HXLINE(1441)				updateChatBuffer->clear();
             			}
             			else {
             				HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_2, ::haxe::ds::StringMap,updateChatBuffer,::Array< ::Dynamic>,updateChatTimer, ::Dynamic,handler,::Array< Float >,lastCall) HXARGC(0)
             				void _hx_run(){
             					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::haxe::ds::StringMap,_e) HXARGC(0)
             					 ::Dynamic _hx_run(){
-            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1352_addChatsUpdatedListener)
-HXLINE(1352)						return _e->iterator();
+            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1445_addChatsUpdatedListener)
+HXLINE(1445)						return _e->iterator();
             					}
             					HX_END_LOCAL_FUNC0(return)
 
-            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1350_addChatsUpdatedListener)
-HXLINE(1351)					lastCall[0] = ( ::__time_stamp() * ( (Float)(1000) ));
-HXLINE(1352)					 ::Dynamic handler1 = handler;
-HXDLIN(1352)					 ::haxe::ds::StringMap _e = updateChatBuffer;
-HXDLIN(1352)					handler1(::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
+            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1443_addChatsUpdatedListener)
+HXLINE(1444)					lastCall[0] = ( ::__time_stamp() * ( (Float)(1000) ));
+HXLINE(1445)					 ::Dynamic handler1 = handler;
+HXDLIN(1445)					 ::haxe::ds::StringMap _e = updateChatBuffer;
+HXDLIN(1445)					handler1(::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("iterator",ee,49,9a,93), ::Dynamic(new _hx_Closure_1(_e))))));
-HXLINE(1353)					updateChatTimer[0] = null();
-HXLINE(1354)					updateChatBuffer->clear();
+HXLINE(1446)					updateChatTimer[0] = null();
+HXLINE(1447)					updateChatBuffer->clear();
             				}
             				HX_END_LOCAL_FUNC0((void))
 
-HXLINE(1350)				updateChatTimer[0] = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_2(updateChatBuffer,updateChatTimer,handler,lastCall)),500);
+HXLINE(1443)				updateChatTimer[0] = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_2(updateChatBuffer,updateChatTimer,handler,lastCall)),500);
             			}
-HXLINE(1357)			return ::borogove::EventResult_obj::EventHandled_dyn();
+HXLINE(1450)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1332_addChatsUpdatedListener)
-HXLINE(1333)		 ::haxe::ds::StringMap updateChatBuffer =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(1334)		::Array< Float > lastCall = ::Array_obj< Float >::fromData( _hx_array_data_c0e6dc18_168,1);
-HXLINE(1335)		::Array< ::Dynamic> updateChatTimer = ::Array_obj< ::Dynamic>::__new(1)->init(0,null());
-HXLINE(1336)		return this->on(HX_("chats/update",3d,8e,1d,14), ::Dynamic(new _hx_Closure_3(updateChatBuffer,updateChatTimer,handler,lastCall)));
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1425_addChatsUpdatedListener)
+HXLINE(1426)		 ::haxe::ds::StringMap updateChatBuffer =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(1427)		::Array< Float > lastCall = ::Array_obj< Float >::fromData( _hx_array_data_c0e6dc18_174,1);
+HXLINE(1428)		::Array< ::Dynamic> updateChatTimer = ::Array_obj< ::Dynamic>::__new(1)->init(0,null());
+HXLINE(1429)		return this->on(HX_("chats/update",3d,8e,1d,14), ::Dynamic(new _hx_Closure_3(updateChatBuffer,updateChatTimer,handler,lastCall)));
             	}
 
 
@@ -3921,66 +4023,42 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addChatsUpdatedListener,return )
 int Client_obj::addChatsUpdatedListener__fromC(::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             		void _hx_run(::Array< ::Dynamic> a0){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_272_addChatsUpdatedListener__fromC)
-HXLINE( 243)			{
-HXLINE( 243)				int _g = 0;
-HXDLIN( 243)				while((_g < a0->length)){
-HXLINE( 243)					 ::borogove::Chat el = a0->__get(_g).StaticCast<  ::borogove::Chat >();
-HXDLIN( 243)					_g = (_g + 1);
-HXDLIN( 243)					{
-HXLINE( 243)						 ::Dynamic haxeObject = el;
-HXDLIN( 243)						void* ptr = haxeObject.mPtr;
-HXDLIN( 243)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 243)						{
-HXLINE( 243)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 243)							if (::hx::IsNull( store )) {
-HXLINE( 243)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 243)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXLINE( 243)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_282_addChatsUpdatedListener__fromC)
+HXLINE( 251)			void** x0 = ::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(a0);
+HXDLIN( 251)			int xl0;
+HXDLIN( 251)			 ::Dynamic tmp;
+HXDLIN( 251)			if (::hx::IsNotNull( a0 )) {
+HXLINE( 251)				tmp = a0->length;
             			}
-HXDLIN( 243)			void** ptr1 = (void**)a0->getBase();
-HXDLIN( 243)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 243)			{
-HXLINE( 243)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 243)				if (::hx::IsNull( store1 )) {
-HXLINE( 243)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),a0));
-HXDLIN( 243)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXLINE( 243)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
+            			else {
+HXLINE( 251)				tmp = null();
+            			}
+HXDLIN( 251)			if (::hx::IsNotNull( tmp )) {
+HXLINE( 251)				xl0 = ( (int)(tmp) );
+            			}
+            			else {
+HXLINE( 251)				xl0 = -1;
             			}
-HXDLIN( 243)			int xl0 = a0->length;
-HXLINE( 261)			handler(ptr1,( (size_t)(xl0) ),handler__context);
+HXLINE( 269)			handler(x0,( (size_t)(xl0) ),handler__context);
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addChatsUpdatedListener__fromC)
-HXDLIN( 339)		return this->addChatsUpdatedListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addChatsUpdatedListener__fromC)
+HXDLIN( 367)		return this->addChatsUpdatedListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 int Client_obj::addCallRingListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,handler) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1369_addCallRingListener)
-HXLINE(1370)			handler( ::Dynamic(data->__Field(HX_("session",56,17,98,93),::hx::paccDynamic)));
-HXLINE(1371)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1463_addCallRingListener)
+HXLINE(1464)			handler( ::Dynamic(data->__Field(HX_("session",56,17,98,93),::hx::paccDynamic)));
+HXLINE(1465)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1369_addCallRingListener)
-HXDLIN(1369)		return this->on(HX_("call/ring",01,8e,91,54), ::Dynamic(new _hx_Closure_0(handler)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1463_addCallRingListener)
+HXDLIN(1463)		return this->on(HX_("call/ring",01,8e,91,54), ::Dynamic(new _hx_Closure_0(handler)));
             	}
 
 
@@ -3989,42 +4067,42 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addCallRingListener,return )
 int Client_obj::addCallRingListener__fromC(::cpp::Function< void  (void*,void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             		void _hx_run(::Dynamic a0){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_272_addCallRingListener__fromC)
-HXLINE( 251)			 ::Dynamic haxeObject = a0;
-HXDLIN( 251)			void* ptr = haxeObject.mPtr;
-HXDLIN( 251)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 251)			{
-HXLINE( 251)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 251)				if (::hx::IsNull( store )) {
-HXLINE( 251)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_282_addCallRingListener__fromC)
+HXLINE( 259)			 ::Dynamic haxeObject = a0;
+HXDLIN( 259)			void* ptr = haxeObject.mPtr;
+HXDLIN( 259)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 259)			{
+HXLINE( 259)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 259)				if (::hx::IsNull( store )) {
+HXLINE( 259)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 251)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 259)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             				}
             				else {
-HXLINE( 251)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 259)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXLINE( 261)			handler(ptr,handler__context);
+HXLINE( 269)			handler(ptr,handler__context);
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addCallRingListener__fromC)
-HXDLIN( 339)		return this->addCallRingListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addCallRingListener__fromC)
+HXDLIN( 367)		return this->addCallRingListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 int Client_obj::addCallRetractListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,handler) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1382_addCallRetractListener)
-HXLINE(1383)			handler( ::Dynamic(data->__Field(HX_("chatId",d3,04,77,b7),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("sid",0e,9f,57,00),::hx::paccDynamic)));
-HXLINE(1384)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1477_addCallRetractListener)
+HXLINE(1478)			handler( ::Dynamic(data->__Field(HX_("chatId",d3,04,77,b7),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("sid",0e,9f,57,00),::hx::paccDynamic)));
+HXLINE(1479)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1382_addCallRetractListener)
-HXDLIN(1382)		return this->on(HX_("call/retract",50,bc,8d,db), ::Dynamic(new _hx_Closure_0(handler)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1477_addCallRetractListener)
+HXDLIN(1477)		return this->on(HX_("call/retract",50,bc,8d,db), ::Dynamic(new _hx_Closure_0(handler)));
             	}
 
 
@@ -4033,55 +4111,55 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addCallRetractListener,return )
 int Client_obj::addCallRetractListener__fromC(::cpp::Function< void  (const char*,const char*,void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (const char* HX_COMMA const char* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(2)
             		void _hx_run(::String a0,::String a1){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_272_addCallRetractListener__fromC)
-HXLINE( 247)			const char* cStrPtr = a0.utf8_str();
-HXDLIN( 247)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 247)			{
-HXLINE( 247)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 247)				if (::hx::IsNull( store )) {
-HXLINE( 247)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_282_addCallRetractListener__fromC)
+HXLINE( 255)			const char* cStrPtr = a0.utf8_str();
+HXDLIN( 255)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
+HXDLIN( 255)			{
+HXLINE( 255)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 255)				if (::hx::IsNull( store )) {
+HXLINE( 255)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),a0));
-HXDLIN( 247)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 255)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             				}
             				else {
-HXLINE( 247)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 255)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXDLIN( 247)			const char* cStrPtr1 = a1.utf8_str();
-HXDLIN( 247)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(cStrPtr1);
-HXDLIN( 247)			{
-HXLINE( 247)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 247)				if (::hx::IsNull( store1 )) {
-HXLINE( 247)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+HXDLIN( 255)			const char* cStrPtr1 = a1.utf8_str();
+HXDLIN( 255)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(cStrPtr1);
+HXDLIN( 255)			{
+HXLINE( 255)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN( 255)				if (::hx::IsNull( store1 )) {
+HXLINE( 255)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),a1));
-HXDLIN( 247)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+HXDLIN( 255)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
             				}
             				else {
-HXLINE( 247)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 255)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXLINE( 261)			handler(cStrPtr,cStrPtr1,handler__context);
+HXLINE( 269)			handler(cStrPtr,cStrPtr1,handler__context);
             		}
             		HX_END_LOCAL_FUNC2((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addCallRetractListener__fromC)
-HXDLIN( 339)		return this->addCallRetractListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addCallRetractListener__fromC)
+HXDLIN( 367)		return this->addCallRetractListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 int Client_obj::addCallRingingListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,handler) HXARGC(1)
             		 ::borogove::EventResult _hx_run(::Dynamic data){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1395_addCallRingingListener)
-HXLINE(1396)			handler(data);
-HXLINE(1397)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1491_addCallRingingListener)
+HXLINE(1492)			handler(data);
+HXLINE(1493)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1395_addCallRingingListener)
-HXDLIN(1395)		return this->on(HX_("call/ringing",81,75,54,f9), ::Dynamic(new _hx_Closure_0(handler)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1491_addCallRingingListener)
+HXDLIN(1491)		return this->on(HX_("call/ringing",81,75,54,f9), ::Dynamic(new _hx_Closure_0(handler)));
             	}
 
 
@@ -4090,42 +4168,42 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addCallRingingListener,return )
 int Client_obj::addCallRingingListener__fromC(::cpp::Function< void  (void*,void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             		void _hx_run(::Dynamic a0){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_272_addCallRingingListener__fromC)
-HXLINE( 251)			 ::Dynamic haxeObject = a0;
-HXDLIN( 251)			void* ptr = haxeObject.mPtr;
-HXDLIN( 251)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 251)			{
-HXLINE( 251)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 251)				if (::hx::IsNull( store )) {
-HXLINE( 251)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_282_addCallRingingListener__fromC)
+HXLINE( 259)			 ::Dynamic haxeObject = a0;
+HXDLIN( 259)			void* ptr = haxeObject.mPtr;
+HXDLIN( 259)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 259)			{
+HXLINE( 259)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 259)				if (::hx::IsNull( store )) {
+HXLINE( 259)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 251)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 259)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             				}
             				else {
-HXLINE( 251)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 259)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXLINE( 261)			handler(ptr,handler__context);
+HXLINE( 269)			handler(ptr,handler__context);
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addCallRingingListener__fromC)
-HXDLIN( 339)		return this->addCallRingingListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addCallRingingListener__fromC)
+HXDLIN( 367)		return this->addCallRingingListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 int Client_obj::addCallUpdateStatusListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,handler) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1408_addCallUpdateStatusListener)
-HXLINE(1409)			handler( ::Dynamic(data->__Field(HX_("session",56,17,98,93),::hx::paccDynamic)));
-HXLINE(1410)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1505_addCallUpdateStatusListener)
+HXLINE(1506)			handler( ::Dynamic(data->__Field(HX_("session",56,17,98,93),::hx::paccDynamic)));
+HXLINE(1507)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1408_addCallUpdateStatusListener)
-HXDLIN(1408)		return this->on(HX_("call/updateStatus",6c,f5,e6,ec), ::Dynamic(new _hx_Closure_0(handler)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1505_addCallUpdateStatusListener)
+HXDLIN(1505)		return this->on(HX_("call/updateStatus",6c,f5,e6,ec), ::Dynamic(new _hx_Closure_0(handler)));
             	}
 
 
@@ -4134,42 +4212,42 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addCallUpdateStatusListener,return )
 int Client_obj::addCallUpdateStatusListener__fromC(::cpp::Function< void  (void*,void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             		void _hx_run( ::borogove::calls::InitiatedSession a0){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_272_addCallUpdateStatusListener__fromC)
-HXLINE( 251)			 ::Dynamic haxeObject = a0;
-HXDLIN( 251)			void* ptr = haxeObject.mPtr;
-HXDLIN( 251)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 251)			{
-HXLINE( 251)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 251)				if (::hx::IsNull( store )) {
-HXLINE( 251)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_282_addCallUpdateStatusListener__fromC)
+HXLINE( 259)			 ::Dynamic haxeObject = a0;
+HXDLIN( 259)			void* ptr = haxeObject.mPtr;
+HXDLIN( 259)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 259)			{
+HXLINE( 259)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 259)				if (::hx::IsNull( store )) {
+HXLINE( 259)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 251)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 259)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             				}
             				else {
-HXLINE( 251)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 259)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXLINE( 261)			handler(ptr,handler__context);
+HXLINE( 269)			handler(ptr,handler__context);
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addCallUpdateStatusListener__fromC)
-HXDLIN( 339)		return this->addCallUpdateStatusListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addCallUpdateStatusListener__fromC)
+HXDLIN( 367)		return this->addCallUpdateStatusListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 int Client_obj::addCallMediaListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,handler) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1423_addCallMediaListener)
-HXLINE(1424)			handler( ::Dynamic(data->__Field(HX_("session",56,17,98,93),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("audio",d6,78,80,27),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("video",7b,14,fc,36),::hx::paccDynamic)));
-HXLINE(1425)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1521_addCallMediaListener)
+HXLINE(1522)			handler( ::Dynamic(data->__Field(HX_("session",56,17,98,93),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("audio",d6,78,80,27),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("video",7b,14,fc,36),::hx::paccDynamic)));
+HXLINE(1523)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1423_addCallMediaListener)
-HXDLIN(1423)		return this->on(HX_("call/media",73,5d,1d,c7), ::Dynamic(new _hx_Closure_0(handler)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1521_addCallMediaListener)
+HXDLIN(1521)		return this->on(HX_("call/media",73,5d,1d,c7), ::Dynamic(new _hx_Closure_0(handler)));
             	}
 
 
@@ -4178,42 +4256,42 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addCallMediaListener,return )
 int Client_obj::addCallMediaListener__fromC(::cpp::Function< void  (void*,bool,bool,void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA bool HX_COMMA bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(3)
             		void _hx_run( ::borogove::calls::InitiatedSession a0,bool a1,bool a2){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_272_addCallMediaListener__fromC)
-HXLINE( 251)			 ::Dynamic haxeObject = a0;
-HXDLIN( 251)			void* ptr = haxeObject.mPtr;
-HXDLIN( 251)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 251)			{
-HXLINE( 251)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 251)				if (::hx::IsNull( store )) {
-HXLINE( 251)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_282_addCallMediaListener__fromC)
+HXLINE( 259)			 ::Dynamic haxeObject = a0;
+HXDLIN( 259)			void* ptr = haxeObject.mPtr;
+HXDLIN( 259)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 259)			{
+HXLINE( 259)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 259)				if (::hx::IsNull( store )) {
+HXLINE( 259)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 251)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 259)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             				}
             				else {
-HXLINE( 251)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 259)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXLINE( 261)			handler(ptr,a1,a2,handler__context);
+HXLINE( 269)			handler(ptr,a1,a2,handler__context);
             		}
             		HX_END_LOCAL_FUNC3((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addCallMediaListener__fromC)
-HXDLIN( 339)		return this->addCallMediaListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addCallMediaListener__fromC)
+HXDLIN( 367)		return this->addCallMediaListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 int Client_obj::addCallTrackListener( ::Dynamic handler){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,handler) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic data){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1437_addCallTrackListener)
-HXLINE(1438)			handler( ::Dynamic(data->__Field(HX_("session",56,17,98,93),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("streams",f3,db,44,f6),::hx::paccDynamic)));
-HXLINE(1439)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1536_addCallTrackListener)
+HXLINE(1537)			handler( ::Dynamic(data->__Field(HX_("session",56,17,98,93),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)), ::Dynamic(data->__Field(HX_("streams",f3,db,44,f6),::hx::paccDynamic)));
+HXLINE(1538)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1437_addCallTrackListener)
-HXDLIN(1437)		return this->on(HX_("call/track",1a,e7,80,d7), ::Dynamic(new _hx_Closure_0(handler)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1536_addCallTrackListener)
+HXDLIN(1536)		return this->on(HX_("call/track",1a,e7,80,d7), ::Dynamic(new _hx_Closure_0(handler)));
             	}
 
 
@@ -4222,93 +4300,67 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,addCallTrackListener,return )
 int Client_obj::addCallTrackListener__fromC(::cpp::Function< void  (void*,void*,void**,size_t,void*) > handler,void* handler__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void* HX_COMMA void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(3)
             		void _hx_run( ::borogove::calls::InitiatedSession a0, ::borogove::calls::MediaStreamTrack a1,::Array< ::Dynamic> a2){
-            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_272_addCallTrackListener__fromC)
-HXLINE( 251)			 ::Dynamic haxeObject = a0;
-HXDLIN( 251)			void* ptr = haxeObject.mPtr;
-HXDLIN( 251)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 251)			{
-HXLINE( 251)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 251)				if (::hx::IsNull( store )) {
-HXLINE( 251)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            			HX_STACKFRAME(&_hx_pos_afe14372debdebc6_282_addCallTrackListener__fromC)
+HXLINE( 259)			 ::Dynamic haxeObject = a0;
+HXDLIN( 259)			void* ptr = haxeObject.mPtr;
+HXDLIN( 259)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 259)			{
+HXLINE( 259)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 259)				if (::hx::IsNull( store )) {
+HXLINE( 259)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 251)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 259)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             				}
             				else {
-HXLINE( 251)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 259)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXDLIN( 251)			void* x0 = ptr;
-HXDLIN( 251)			 ::Dynamic haxeObject1 = a1;
-HXDLIN( 251)			void* ptr1 = haxeObject1.mPtr;
-HXDLIN( 251)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 251)			{
-HXLINE( 251)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 251)				if (::hx::IsNull( store1 )) {
-HXLINE( 251)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+HXDLIN( 259)			 ::Dynamic haxeObject1 = a1;
+HXDLIN( 259)			void* ptr1 = haxeObject1.mPtr;
+HXDLIN( 259)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
+HXDLIN( 259)			{
+HXLINE( 259)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN( 259)				if (::hx::IsNull( store1 )) {
+HXLINE( 259)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),haxeObject1));
-HXDLIN( 251)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+HXDLIN( 259)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
             				}
             				else {
-HXLINE( 251)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 251)			void* x1 = ptr1;
-HXLINE( 243)			{
-HXLINE( 243)				int _g = 0;
-HXDLIN( 243)				while((_g < a2->length)){
-HXLINE( 243)					 ::borogove::calls::MediaStream el = a2->__get(_g).StaticCast<  ::borogove::calls::MediaStream >();
-HXDLIN( 243)					_g = (_g + 1);
-HXDLIN( 243)					{
-HXLINE( 243)						 ::Dynamic haxeObject2 = el;
-HXDLIN( 243)						void* ptr2 = haxeObject2.mPtr;
-HXDLIN( 243)						::cpp::Int64 ptrInt642 = reinterpret_cast<int64_t>(ptr2);
-HXDLIN( 243)						{
-HXLINE( 243)							 ::Dynamic store2 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt642);
-HXDLIN( 243)							if (::hx::IsNull( store2 )) {
-HXLINE( 243)								store2 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject2));
-HXDLIN( 243)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt642,store2);
-            							}
-            							else {
-HXLINE( 243)								::hx::FieldRef((store2).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
+HXLINE( 259)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXDLIN( 243)			void** ptr3 = (void**)a2->getBase();
-HXDLIN( 243)			::cpp::Int64 ptrInt643 = reinterpret_cast<int64_t>(ptr3);
-HXDLIN( 243)			{
-HXLINE( 243)				 ::Dynamic store3 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt643);
-HXDLIN( 243)				if (::hx::IsNull( store3 )) {
-HXLINE( 243)					store3 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),a2));
-HXDLIN( 243)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt643,store3);
-            				}
-            				else {
-HXLINE( 243)					::hx::FieldRef((store3).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
+HXLINE( 251)			void** x2 = ::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(a2);
+HXDLIN( 251)			int xl2;
+HXDLIN( 251)			 ::Dynamic tmp;
+HXDLIN( 251)			if (::hx::IsNotNull( a2 )) {
+HXLINE( 251)				tmp = a2->length;
+            			}
+            			else {
+HXLINE( 251)				tmp = null();
+            			}
+HXDLIN( 251)			if (::hx::IsNotNull( tmp )) {
+HXLINE( 251)				xl2 = ( (int)(tmp) );
             			}
-HXDLIN( 243)			int xl2 = a2->length;
-HXLINE( 261)			handler(x0,x1,ptr3,( (size_t)(xl2) ),handler__context);
+            			else {
+HXLINE( 251)				xl2 = -1;
+            			}
+HXLINE( 269)			handler(ptr,ptr1,x2,( (size_t)(xl2) ),handler__context);
             		}
             		HX_END_LOCAL_FUNC3((void))
 
-            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_339_addCallTrackListener__fromC)
-HXDLIN( 339)		return this->addCallTrackListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
+            	HX_STACKFRAME(&_hx_pos_afe14372debdebc6_367_addCallTrackListener__fromC)
+HXDLIN( 367)		return this->addCallTrackListener( ::Dynamic(new _hx_Closure_0(handler,handler__context)));
             	}
 
 
 void Client_obj::setInForeground(){
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1447_setInForeground)
-HXLINE(1448)		if (!(this->stream->csi)) {
-HXLINE(1448)			return;
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1546_setInForeground)
+HXLINE(1547)		if (!(this->stream->csi)) {
+HXLINE(1547)			return;
             		}
-HXLINE(1449)		this->stream->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("active",c6,41,46,16), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1548)		this->stream->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("active",c6,41,46,16), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:csi:0",13,f1,6d,24)))));
             	}
 
@@ -4316,11 +4368,11 @@ HXLINE(1449)		this->stream->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX
 HX_DEFINE_DYNAMIC_FUNC0(Client_obj,setInForeground,(void))
 
 void Client_obj::setNotInForeground(){
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1455_setNotInForeground)
-HXLINE(1456)		if (!(this->stream->csi)) {
-HXLINE(1456)			return;
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1554_setNotInForeground)
+HXLINE(1555)		if (!(this->stream->csi)) {
+HXLINE(1555)			return;
             		}
-HXLINE(1457)		this->stream->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("inactive",6b,17,30,6a), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1556)		this->stream->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("inactive",6b,17,30,6a), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:csi:0",13,f1,6d,24)))));
             	}
 
@@ -4330,33 +4382,33 @@ HX_DEFINE_DYNAMIC_FUNC0(Client_obj,setNotInForeground,(void))
 ::Dynamic Client_obj::fetchMediaByHash(::Array< ::Dynamic> hashes,::Array< ::Dynamic> counterparts){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		 ::Dynamic _hx_run( ::Dynamic x){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1465_fetchMediaByHash)
-HXLINE(1465)			return x;
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1564_fetchMediaByHash)
+HXLINE(1564)			return x;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_1, ::borogove::Client,_gthis,::Array< ::Dynamic>,hashes,::Array< ::Dynamic>,counterparts) HXARGC(1)
             		::Dynamic _hx_run( ::Dynamic _){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1465_fetchMediaByHash)
-HXLINE(1465)			 ::borogove::Client _gthis1 = _gthis;
-HXDLIN(1465)			::Array< ::Dynamic> hashes1 = hashes;
-HXDLIN(1465)			return _gthis1->fetchMediaByHash(hashes1,counterparts->slice(1,null()));
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1564_fetchMediaByHash)
+HXLINE(1564)			 ::borogove::Client _gthis1 = _gthis;
+HXDLIN(1564)			::Array< ::Dynamic> hashes1 = hashes;
+HXDLIN(1564)			return _gthis1->fetchMediaByHash(hashes1,counterparts->slice(1,null()));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1461_fetchMediaByHash)
-HXDLIN(1461)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1464)		bool _hx_tmp;
-HXDLIN(1464)		if ((hashes->length >= 1)) {
-HXLINE(1464)			_hx_tmp = (counterparts->length < 1);
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1560_fetchMediaByHash)
+HXDLIN(1560)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1563)		bool _hx_tmp;
+HXDLIN(1563)		if ((hashes->length >= 1)) {
+HXLINE(1563)			_hx_tmp = (counterparts->length < 1);
             		}
             		else {
-HXLINE(1464)			_hx_tmp = true;
+HXLINE(1563)			_hx_tmp = true;
             		}
-HXDLIN(1464)		if (_hx_tmp) {
-HXLINE(1464)			return ::thenshim::_Promise::Promise_Impl__obj::reject(HX_("no counterparts left",64,15,a4,38));
+HXDLIN(1563)		if (_hx_tmp) {
+HXLINE(1563)			return ::thenshim::_Promise::Promise_Impl__obj::reject(HX_("no counterparts left",64,15,a4,38));
             		}
-HXLINE(1465)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->fetchMediaByHashOneCounterpart(hashes,counterparts->__get(0).StaticCast<  ::borogove::JID >()), ::Dynamic(new _hx_Closure_0()), ::Dynamic(new _hx_Closure_1(_gthis,hashes,counterparts)));
+HXLINE(1564)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->fetchMediaByHashOneCounterpart(hashes,counterparts->__get(0).StaticCast<  ::borogove::JID >()), ::Dynamic(new _hx_Closure_0()), ::Dynamic(new _hx_Closure_1(_gthis,hashes,counterparts)));
             	}
 
 
@@ -4369,62 +4421,62 @@ HX_DEFINE_DYNAMIC_FUNC2(Client_obj,fetchMediaByHash,return )
             			void _hx_run( ::Dynamic resolve, ::Dynamic reject){
             				HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_1, ::borogove::Client,_gthis, ::Dynamic,resolve, ::Dynamic,reject, ::borogove::queries::BoB,q1) HXARGC(0)
             				void _hx_run(){
-            					HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1476_fetchMediaByHashOneCounterpart)
-HXLINE(1477)					 ::Dynamic r = q1->getResult();
-HXLINE(1478)					if (::hx::IsNull( r )) {
-HXLINE(1479)						reject(HX_("bad or no result from BoB query",ad,e0,04,ee));
+            					HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1575_fetchMediaByHashOneCounterpart)
+HXLINE(1576)					 ::Dynamic r = q1->getResult();
+HXLINE(1577)					if (::hx::IsNull( r )) {
+HXLINE(1578)						reject(HX_("bad or no result from BoB query",ad,e0,04,ee));
             					}
             					else {
             						HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,resolve) HXARGC(1)
             						void _hx_run(bool _){
-            							HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1481_fetchMediaByHashOneCounterpart)
-HXLINE(1481)							resolve(null());
+            							HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1580_fetchMediaByHashOneCounterpart)
+HXLINE(1580)							resolve(null());
             						}
             						HX_END_LOCAL_FUNC1((void))
 
-HXLINE(1481)						::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMedia(_gthis->persistence, ::Dynamic(r->__Field(HX_("type",ba,f2,08,4d),::hx::paccDynamic)),( ( ::haxe::io::Bytes)(r->__Field(HX_("bytes",6b,08,98,bd),::hx::paccDynamic)) )->b), ::Dynamic(new _hx_Closure_0(resolve)),null());
+HXLINE(1580)						::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMedia(_gthis->persistence, ::Dynamic(r->__Field(HX_("type",ba,f2,08,4d),::hx::paccDynamic)),( ( ::haxe::io::Bytes)(r->__Field(HX_("bytes",6b,08,98,bd),::hx::paccDynamic)) )->b), ::Dynamic(new _hx_Closure_0(resolve)),null());
             					}
             				}
             				HX_END_LOCAL_FUNC0((void))
 
-            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1474_fetchMediaByHashOneCounterpart)
-HXLINE(1475)				::String q = counterpart->asString();
-HXDLIN(1475)				 ::borogove::queries::BoB q1 = ::borogove::queries::BoB_obj::forHash(q,hashes->__get(0).StaticCast<  ::borogove::Hash >());
-HXLINE(1476)				q1->onFinished( ::Dynamic(new _hx_Closure_1(_gthis,resolve,reject,q1)));
-HXLINE(1484)				_gthis->sendQueryLazy(q1);
+            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1573_fetchMediaByHashOneCounterpart)
+HXLINE(1574)				::String q = counterpart->asString();
+HXDLIN(1574)				 ::borogove::queries::BoB q1 = ::borogove::queries::BoB_obj::forHash(q,hashes->__get(0).StaticCast<  ::borogove::Hash >());
+HXLINE(1575)				q1->onFinished( ::Dynamic(new _hx_Closure_1(_gthis,resolve,reject,q1)));
+HXLINE(1583)				_gthis->sendQueryLazy(q1);
             			}
             			HX_END_LOCAL_FUNC2((void))
 
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_3) HXARGC(1)
             			 ::Dynamic _hx_run( ::Dynamic x){
-            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1485_fetchMediaByHashOneCounterpart)
-HXLINE(1485)				return x;
+            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1584_fetchMediaByHashOneCounterpart)
+HXLINE(1584)				return x;
             			}
             			HX_END_LOCAL_FUNC1(return)
 
             			HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_4, ::borogove::JID,counterpart, ::borogove::Client,_gthis,::Array< ::Dynamic>,hashes) HXARGC(1)
             			::Dynamic _hx_run( ::Dynamic _){
-            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1485_fetchMediaByHashOneCounterpart)
-HXLINE(1485)				 ::borogove::Client _gthis1 = _gthis;
-HXDLIN(1485)				::Array< ::Dynamic> _hx_tmp = hashes->slice(1,null());
-HXDLIN(1485)				return _gthis1->fetchMediaByHashOneCounterpart(_hx_tmp,counterpart);
+            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1584_fetchMediaByHashOneCounterpart)
+HXLINE(1584)				 ::borogove::Client _gthis1 = _gthis;
+HXDLIN(1584)				::Array< ::Dynamic> _hx_tmp = hashes->slice(1,null());
+HXDLIN(1584)				return _gthis1->fetchMediaByHashOneCounterpart(_hx_tmp,counterpart);
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1471_fetchMediaByHashOneCounterpart)
-HXLINE(1472)			if (has) {
-HXLINE(1472)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1570_fetchMediaByHashOneCounterpart)
+HXLINE(1571)			if (has) {
+HXLINE(1571)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             			}
-HXLINE(1474)			return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_2(counterpart,_gthis,hashes))), ::Dynamic(new _hx_Closure_3()), ::Dynamic(new _hx_Closure_4(counterpart,_gthis,hashes)));
+HXLINE(1573)			return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_2(counterpart,_gthis,hashes))), ::Dynamic(new _hx_Closure_3()), ::Dynamic(new _hx_Closure_4(counterpart,_gthis,hashes)));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1468_fetchMediaByHashOneCounterpart)
-HXDLIN(1468)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1469)		if ((hashes->length < 1)) {
-HXLINE(1469)			return ::thenshim::_Promise::Promise_Impl__obj::reject(HX_("no hashes left",8c,68,e6,69));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1567_fetchMediaByHashOneCounterpart)
+HXDLIN(1567)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1568)		if ((hashes->length < 1)) {
+HXLINE(1568)			return ::thenshim::_Promise::Promise_Impl__obj::reject(HX_("no hashes left",8c,68,e6,69));
             		}
-HXLINE(1471)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::hasMedia(this->persistence,hashes->__get(0).StaticCast<  ::borogove::Hash >()->algorithm,hashes->__get(0).StaticCast<  ::borogove::Hash >()->hash), ::Dynamic(new _hx_Closure_5(counterpart,_gthis,hashes)),null());
+HXLINE(1570)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::hasMedia(this->persistence,hashes->__get(0).StaticCast<  ::borogove::Hash >()->algorithm,hashes->__get(0).StaticCast<  ::borogove::Hash >()->hash), ::Dynamic(new _hx_Closure_5(counterpart,_gthis,hashes)),null());
             	}
 
 
@@ -4433,50 +4485,50 @@ HX_DEFINE_DYNAMIC_FUNC2(Client_obj,fetchMediaByHashOneCounterpart,return )
 void Client_obj::chatActivity( ::borogove::Chat chat,::hx::Null< bool >  __o_trigger){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::Chat,chat) HXARGC(1)
             		bool _hx_run( ::borogove::Chat c){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1497_chatActivity)
-HXLINE(1497)			return (c->chatId == chat->chatId);
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1596_chatActivity)
+HXLINE(1596)			return (c->chatId == chat->chatId);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		bool trigger = __o_trigger.Default(true);
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1490_chatActivity)
-HXLINE(1491)		if (chat->isBlocked) {
-HXLINE(1491)			return;
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1589_chatActivity)
+HXLINE(1590)		if (chat->isBlocked) {
+HXLINE(1590)			return;
             		}
-HXLINE(1492)		if ((chat->uiState == 2)) {
-HXLINE(1493)			chat->uiState = 1;
-HXLINE(1494)			::Dynamic _hx_tmp = this->persistence;
-HXDLIN(1494)			::String _hx_tmp1 = this->accountId();
-HXDLIN(1494)			::borogove::Persistence_obj::storeChats(_hx_tmp,_hx_tmp1,::Array_obj< ::Dynamic>::__new(1)->init(0,chat));
+HXLINE(1591)		if ((chat->uiState == 2)) {
+HXLINE(1592)			chat->uiState = 1;
+HXLINE(1593)			::Dynamic _hx_tmp = this->persistence;
+HXDLIN(1593)			::String _hx_tmp1 = this->accountId();
+HXDLIN(1593)			::borogove::Persistence_obj::storeChats(_hx_tmp,_hx_tmp1,::Array_obj< ::Dynamic>::__new(1)->init(0,chat));
             		}
-HXLINE(1496)		int pinnedCount;
-HXDLIN(1496)		if ((chat->uiState == 0)) {
-HXLINE(1496)			pinnedCount = 0;
+HXLINE(1595)		int pinnedCount;
+HXDLIN(1595)		if ((chat->uiState == 0)) {
+HXLINE(1595)			pinnedCount = 0;
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(2)
             			int _hx_run( ::borogove::Chat item,int result){
-            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1496_chatActivity)
-HXLINE(1496)				int pinnedCount;
-HXDLIN(1496)				if ((item->uiState == 0)) {
-HXLINE(1496)					pinnedCount = 1;
+            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1595_chatActivity)
+HXLINE(1595)				int pinnedCount;
+HXDLIN(1595)				if ((item->uiState == 0)) {
+HXLINE(1595)					pinnedCount = 1;
             				}
             				else {
-HXLINE(1496)					pinnedCount = 0;
+HXLINE(1595)					pinnedCount = 0;
             				}
-HXDLIN(1496)				return (result + pinnedCount);
+HXDLIN(1595)				return (result + pinnedCount);
             			}
             			HX_END_LOCAL_FUNC2(return)
 
-HXLINE(1496)			pinnedCount = ( (int)(::Lambda_obj::fold(this->chats, ::Dynamic(new _hx_Closure_0()),0)) );
+HXLINE(1595)			pinnedCount = ( (int)(::Lambda_obj::fold(this->chats, ::Dynamic(new _hx_Closure_0()),0)) );
             		}
-HXLINE(1497)		int idx = ::Lambda_obj::findIndex(this->chats, ::Dynamic(new _hx_Closure_1(chat)));
-HXLINE(1498)		if ((idx > pinnedCount)) {
-HXLINE(1499)			this->chats->removeRange(idx,1);
-HXLINE(1500)			this->chats->insert(pinnedCount,chat);
+HXLINE(1596)		int idx = ::Lambda_obj::findIndex(this->chats, ::Dynamic(new _hx_Closure_1(chat)));
+HXLINE(1597)		if ((idx > pinnedCount)) {
+HXLINE(1598)			this->chats->removeRange(idx,1);
+HXLINE(1599)			this->chats->insert(pinnedCount,chat);
             		}
-HXLINE(1502)		if (trigger) {
-HXLINE(1502)			this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat));
+HXLINE(1601)		if (trigger) {
+HXLINE(1601)			this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat));
             		}
             	}
 
@@ -4486,72 +4538,99 @@ HX_DEFINE_DYNAMIC_FUNC2(Client_obj,chatActivity,(void))
 void Client_obj::sortChats(){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(2)
             		int _hx_run( ::borogove::Chat a, ::borogove::Chat b){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1508_sortChats)
-HXLINE(1508)			if ((a->uiState == b->uiState)) {
-HXLINE(1509)				 ::borogove::ChatMessage tmp = a->lastMessage;
-HXDLIN(1509)				::String tmp1;
-HXDLIN(1509)				if (::hx::IsNotNull( tmp )) {
-HXLINE(1509)					tmp1 = tmp->timestamp;
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1607_sortChats)
+HXLINE(1607)			if ((a->uiState == b->uiState)) {
+HXLINE(1608)				 ::borogove::ChatMessage tmp = a->lastMessage;
+HXDLIN(1608)				::String tmp1;
+HXDLIN(1608)				if (::hx::IsNotNull( tmp )) {
+HXLINE(1608)					tmp1 = tmp->timestamp;
             				}
             				else {
-HXLINE(1509)					tmp1 = null();
+HXLINE(1608)					tmp1 = null();
             				}
-HXDLIN(1509)				::String tcompare;
-HXDLIN(1509)				if (::hx::IsNotNull( tmp1 )) {
-HXLINE(1509)					tcompare = tmp1;
+HXDLIN(1608)				::String tcompare;
+HXDLIN(1608)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE(1608)					tcompare = tmp1;
             				}
             				else {
-HXLINE(1509)					tcompare = HX_("0",30,00,00,00);
+HXLINE(1608)					tcompare = HX_("0",30,00,00,00);
             				}
-HXDLIN(1509)				 ::borogove::ChatMessage tmp2 = b->lastMessage;
-HXDLIN(1509)				::String tmp3;
-HXDLIN(1509)				if (::hx::IsNotNull( tmp2 )) {
-HXLINE(1509)					tmp3 = tmp2->timestamp;
+HXDLIN(1608)				 ::borogove::ChatMessage tmp2 = b->lastMessage;
+HXDLIN(1608)				::String tmp3;
+HXDLIN(1608)				if (::hx::IsNotNull( tmp2 )) {
+HXLINE(1608)					tmp3 = tmp2->timestamp;
             				}
             				else {
-HXLINE(1509)					tmp3 = null();
+HXLINE(1608)					tmp3 = null();
             				}
-HXDLIN(1509)				::String tcompare1;
-HXDLIN(1509)				if (::hx::IsNotNull( tmp3 )) {
-HXLINE(1509)					tcompare1 = tmp3;
+HXDLIN(1608)				::String tcompare1;
+HXDLIN(1608)				if (::hx::IsNotNull( tmp3 )) {
+HXLINE(1608)					tcompare1 = tmp3;
             				}
             				else {
-HXLINE(1509)					tcompare1 = HX_("0",30,00,00,00);
+HXLINE(1608)					tcompare1 = HX_("0",30,00,00,00);
             				}
-HXDLIN(1509)				int tcompare2 = -(::Reflect_obj::compare(tcompare,tcompare1));
-HXLINE(1510)				if ((tcompare2 != 0)) {
-HXLINE(1510)					return tcompare2;
+HXDLIN(1608)				int tcompare2 = -(::Reflect_obj::compare(tcompare,tcompare1));
+HXLINE(1609)				if ((tcompare2 != 0)) {
+HXLINE(1609)					return tcompare2;
             				}
-HXLINE(1511)				::String _hx_tmp = a->getDisplayName();
-HXDLIN(1511)				return ::Reflect_obj::compare(_hx_tmp,b->getDisplayName());
+HXLINE(1610)				::String _hx_tmp = a->getDisplayName();
+HXDLIN(1610)				return ::Reflect_obj::compare(_hx_tmp,b->getDisplayName());
             			}
             			else {
-HXLINE(1513)				return ::Reflect_obj::compare(a->uiState,b->uiState);
+HXLINE(1612)				return ::Reflect_obj::compare(a->uiState,b->uiState);
             			}
-HXLINE(1508)			return 0;
+HXLINE(1607)			return 0;
             		}
             		HX_END_LOCAL_FUNC2(return)
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1507_sortChats)
-HXDLIN(1507)		this->chats->sort( ::Dynamic(new _hx_Closure_0()));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1606_sortChats)
+HXDLIN(1606)		this->chats->sort( ::Dynamic(new _hx_Closure_0()));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Client_obj,sortChats,(void))
 
+::String Client_obj::nextSortId(){
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1618_nextSortId)
+HXLINE(1619)		this->sortId = ::_FractionalIndexing::FractionalIndexing_Fields__obj::between(this->sortId,null(),HX_(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",6f,61,48,0a));
+HXLINE(1620)		return this->sortId;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Client_obj,nextSortId,return )
+
+::Dynamic Client_obj::storeMessageBuilder( ::borogove::ChatMessageBuilder builder){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            		 ::borogove::ChatMessage _hx_run(::Array< ::Dynamic> result){
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1626_storeMessageBuilder)
+HXLINE(1626)			return result->__get(0).StaticCast<  ::borogove::ChatMessage >();
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1624_storeMessageBuilder)
+HXLINE(1625)		if (::hx::IsNull( builder->sortId )) {
+HXLINE(1625)			builder->sortId = this->nextSortId();
+            		}
+HXLINE(1626)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,builder->build())), ::Dynamic(new _hx_Closure_0()),null());
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(Client_obj,storeMessageBuilder,return )
+
 ::Dynamic Client_obj::storeMessages(::Array< ::Dynamic> messages){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1520_storeMessages)
-HXDLIN(1520)		::Dynamic _hx_tmp = this->persistence;
-HXDLIN(1520)		return ::borogove::Persistence_obj::storeMessages(_hx_tmp,this->accountId(),messages);
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1631_storeMessages)
+HXDLIN(1631)		::Dynamic _hx_tmp = this->persistence;
+HXDLIN(1631)		return ::borogove::Persistence_obj::storeMessages(_hx_tmp,this->accountId(),messages);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Client_obj,storeMessages,return )
 
 void Client_obj::sendQuery( ::borogove::queries::GenericQuery query){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1525_sendQuery)
-HXDLIN(1525)		 ::borogove::GenericStream _hx_tmp = this->stream;
-HXDLIN(1525)		_hx_tmp->sendIq(query->getQueryStanza(),query->handleResponse_dyn());
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1636_sendQuery)
+HXDLIN(1636)		 ::borogove::GenericStream _hx_tmp = this->stream;
+HXDLIN(1636)		_hx_tmp->sendIq(query->getQueryStanza(),query->handleResponse_dyn());
             	}
 
 
@@ -4560,33 +4639,91 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,sendQuery,(void))
 void Client_obj::sendNextLazyQuery(){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis) HXARGC(0)
             		void _hx_run(){
-            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1532_sendNextLazyQuery)
-HXLINE(1533)			 ::borogove::queries::GenericQuery query = _gthis->queriesToSend->shift().StaticCast<  ::borogove::queries::GenericQuery >();
-HXLINE(1534)			if (::hx::IsNotNull( query )) {
-HXLINE(1534)				_gthis->sendQuery(query);
+            			HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1643_sendNextLazyQuery)
+HXLINE(1644)			{
+HXLINE(1644)				{
+HXLINE(1645)					 ::borogove::queries::GenericQuery query = _gthis->queriesToSend->shift().StaticCast<  ::borogove::queries::GenericQuery >();
+HXLINE(1646)					if (::hx::IsNotNull( query )) {
+HXLINE(1646)						_gthis->sendQuery(query);
+            					}
+            				}
+HXLINE(1644)				{
+HXLINE(1645)					 ::borogove::queries::GenericQuery query1 = _gthis->queriesToSend->shift().StaticCast<  ::borogove::queries::GenericQuery >();
+HXLINE(1646)					if (::hx::IsNotNull( query1 )) {
+HXLINE(1646)						_gthis->sendQuery(query1);
+            					}
+            				}
+HXLINE(1644)				{
+HXLINE(1645)					 ::borogove::queries::GenericQuery query2 = _gthis->queriesToSend->shift().StaticCast<  ::borogove::queries::GenericQuery >();
+HXLINE(1646)					if (::hx::IsNotNull( query2 )) {
+HXLINE(1646)						_gthis->sendQuery(query2);
+            					}
+            				}
+HXLINE(1644)				{
+HXLINE(1645)					 ::borogove::queries::GenericQuery query3 = _gthis->queriesToSend->shift().StaticCast<  ::borogove::queries::GenericQuery >();
+HXLINE(1646)					if (::hx::IsNotNull( query3 )) {
+HXLINE(1646)						_gthis->sendQuery(query3);
+            					}
+            				}
+HXLINE(1644)				{
+HXLINE(1645)					 ::borogove::queries::GenericQuery query4 = _gthis->queriesToSend->shift().StaticCast<  ::borogove::queries::GenericQuery >();
+HXLINE(1646)					if (::hx::IsNotNull( query4 )) {
+HXLINE(1646)						_gthis->sendQuery(query4);
+            					}
+            				}
+HXLINE(1644)				{
+HXLINE(1645)					 ::borogove::queries::GenericQuery query5 = _gthis->queriesToSend->shift().StaticCast<  ::borogove::queries::GenericQuery >();
+HXLINE(1646)					if (::hx::IsNotNull( query5 )) {
+HXLINE(1646)						_gthis->sendQuery(query5);
+            					}
+            				}
+HXLINE(1644)				{
+HXLINE(1645)					 ::borogove::queries::GenericQuery query6 = _gthis->queriesToSend->shift().StaticCast<  ::borogove::queries::GenericQuery >();
+HXLINE(1646)					if (::hx::IsNotNull( query6 )) {
+HXLINE(1646)						_gthis->sendQuery(query6);
+            					}
+            				}
+HXLINE(1644)				{
+HXLINE(1645)					 ::borogove::queries::GenericQuery query7 = _gthis->queriesToSend->shift().StaticCast<  ::borogove::queries::GenericQuery >();
+HXLINE(1646)					if (::hx::IsNotNull( query7 )) {
+HXLINE(1646)						_gthis->sendQuery(query7);
+            					}
+            				}
+HXLINE(1644)				{
+HXLINE(1645)					 ::borogove::queries::GenericQuery query8 = _gthis->queriesToSend->shift().StaticCast<  ::borogove::queries::GenericQuery >();
+HXLINE(1646)					if (::hx::IsNotNull( query8 )) {
+HXLINE(1646)						_gthis->sendQuery(query8);
+            					}
+            				}
+HXLINE(1644)				{
+HXLINE(1645)					 ::borogove::queries::GenericQuery query9 = _gthis->queriesToSend->shift().StaticCast<  ::borogove::queries::GenericQuery >();
+HXLINE(1646)					if (::hx::IsNotNull( query9 )) {
+HXLINE(1646)						_gthis->sendQuery(query9);
+            					}
+            				}
             			}
-HXLINE(1536)			_gthis->lazyQueryTimer = null();
-HXLINE(1537)			if ((_gthis->queriesToSend->length > 0)) {
-HXLINE(1537)				_gthis->sendNextLazyQuery();
+HXLINE(1649)			_gthis->lazyQueryTimer = null();
+HXLINE(1650)			if ((_gthis->queriesToSend->length > 0)) {
+HXLINE(1650)				_gthis->sendNextLazyQuery();
             			}
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1530_sendNextLazyQuery)
-HXDLIN(1530)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1531)		if (::hx::IsNotNull( this->lazyQueryTimer )) {
-HXLINE(1531)			return;
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1641_sendNextLazyQuery)
+HXDLIN(1641)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1642)		if (::hx::IsNotNull( this->lazyQueryTimer )) {
+HXLINE(1642)			return;
             		}
-HXLINE(1532)		this->lazyQueryTimer = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_0(_gthis)),2000);
+HXLINE(1643)		this->lazyQueryTimer = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_0(_gthis)),2000);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Client_obj,sendNextLazyQuery,(void))
 
 void Client_obj::sendQueryLazy( ::borogove::queries::GenericQuery query){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1542_sendQueryLazy)
-HXLINE(1543)		this->queriesToSend->push(query);
-HXLINE(1544)		this->sendNextLazyQuery();
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1655_sendQueryLazy)
+HXLINE(1656)		this->queriesToSend->push(query);
+HXLINE(1657)		this->sendNextLazyQuery();
             	}
 
 
@@ -4595,88 +4732,114 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,sendQueryLazy,(void))
 void Client_obj::publishWithOptions( ::borogove::Stanza stanza, ::borogove::Stanza options){
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_1, ::borogove::Client,_gthis, ::borogove::Stanza,options, ::borogove::Stanza,stanza) HXARGC(1)
             		void _hx_run( ::borogove::Stanza response){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1554_publishWithOptions)
-HXLINE(1554)			if ((( (::String)(::Reflect_obj::field(response->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
-HXLINE(1555)				 ::borogove::Stanza tmp = response->getChild(HX_("error",c8,cb,29,73),null());
-HXDLIN(1555)				 ::borogove::Stanza preconditionError;
-HXDLIN(1555)				if (::hx::IsNotNull( tmp )) {
-HXLINE(1555)					preconditionError = tmp->getChild(HX_("precondition-not-met",2d,db,78,db),HX_("http://jabber.org/protocol/pubsub#errors",97,74,3a,a8));
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1667_publishWithOptions)
+HXLINE(1667)			if ((( (::String)(::Reflect_obj::field(response->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
+HXLINE(1668)				 ::borogove::Stanza tmp = response->getChild(HX_("error",c8,cb,29,73),null());
+HXDLIN(1668)				 ::borogove::Stanza preconditionError;
+HXDLIN(1668)				if (::hx::IsNotNull( tmp )) {
+HXLINE(1668)					preconditionError = tmp->getChild(HX_("precondition-not-met",2d,db,78,db),HX_("http://jabber.org/protocol/pubsub#errors",97,74,3a,a8));
             				}
             				else {
-HXLINE(1555)					preconditionError = null();
+HXLINE(1668)					preconditionError = null();
             				}
-HXLINE(1556)				if (::hx::IsNotNull( preconditionError )) {
+HXLINE(1669)				if (::hx::IsNotNull( preconditionError )) {
             					HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis, ::borogove::Stanza,options, ::borogove::Stanza,stanza) HXARGC(1)
             					void _hx_run( ::borogove::Stanza response){
-            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1564_publishWithOptions)
-HXLINE(1564)						if ((( (::String)(::Reflect_obj::field(response->attr,HX_("type",ba,f2,08,4d))) ) == HX_("result",dd,68,84,08))) {
-HXLINE(1565)							_gthis->publishWithOptions(stanza,options);
+            						HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1677_publishWithOptions)
+HXLINE(1677)						if ((( (::String)(::Reflect_obj::field(response->attr,HX_("type",ba,f2,08,4d))) ) == HX_("result",dd,68,84,08))) {
+HXLINE(1678)							_gthis->publishWithOptions(stanza,options);
             						}
             					}
             					HX_END_LOCAL_FUNC1((void))
 
-HXLINE(1558)					 ::borogove::GenericStream _gthis1 = _gthis->stream;
-HXLINE(1559)					 ::borogove::Stanza _hx_tmp =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1671)					 ::borogove::GenericStream _gthis1 = _gthis->stream;
+HXLINE(1672)					 ::borogove::Stanza _hx_tmp =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("pubsub",e3,da,f8,66), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/pubsub#owner",c7,28,a3,08))));
-HXLINE(1561)					::String _hx_tmp1 = stanza->findText(HX_("{http://jabber.org/protocol/pubsub}pubsub/publish@node",5e,1b,df,ac));
-HXLINE(1558)					_gthis1->sendIq(_hx_tmp->tag(HX_("configure",e6,f9,5b,c0), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1674)					::String _hx_tmp1 = stanza->findText(HX_("{http://jabber.org/protocol/pubsub}pubsub/publish@node",5e,1b,df,ac));
+HXLINE(1671)					_gthis1->sendIq(_hx_tmp->tag(HX_("configure",e6,f9,5b,c0), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("node",02,0a,0a,49),_hx_tmp1)))->addChild(options), ::Dynamic(new _hx_Closure_0(_gthis,options,stanza)));
             				}
             			}
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1548_publishWithOptions)
-HXDLIN(1548)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1549)		 ::borogove::Stanza clone = stanza->clone();
-HXLINE(1550)		clone->findChild(HX_("{http://jabber.org/protocol/pubsub}pubsub/publish",64,a4,8d,39))->tag(HX_("publish-options",60,0b,5c,74),null())->addChild(options);
-HXLINE(1551)		this->stream->sendIq(clone, ::Dynamic(new _hx_Closure_1(_gthis,options,stanza)));
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1661_publishWithOptions)
+HXDLIN(1661)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1662)		 ::borogove::Stanza clone = stanza->clone();
+HXLINE(1663)		clone->findChild(HX_("{http://jabber.org/protocol/pubsub}pubsub/publish",64,a4,8d,39))->tag(HX_("publish-options",60,0b,5c,74),null())->addChild(options);
+HXLINE(1664)		this->stream->sendIq(clone, ::Dynamic(new _hx_Closure_1(_gthis,options,stanza)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Client_obj,publishWithOptions,(void))
 
 void Client_obj::sendStanza( ::borogove::Stanza stanza){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1576_sendStanza)
-HXLINE(1577)		if (::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("id",db,5b,00,00))) ) )) {
-HXLINE(1577)			 ::Dynamic this1 = stanza->attr;
-HXDLIN(1577)			::Reflect_obj::setField(this1,HX_("id",db,5b,00,00),::borogove::ID_obj::_hx_long());
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1689_sendStanza)
+HXLINE(1690)		if (::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("id",db,5b,00,00))) ) )) {
+HXLINE(1690)			 ::Dynamic this1 = stanza->attr;
+HXDLIN(1690)			::Reflect_obj::setField(this1,HX_("id",db,5b,00,00),::_UUIDv7::UUIDv7_Fields__obj::uuidv7());
             		}
-HXLINE(1578)		this->stream->sendStanza(stanza);
+HXLINE(1691)		this->stream->sendStanza(stanza);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Client_obj,sendStanza,(void))
 
 void Client_obj::sendPresence(::String to, ::Dynamic augment){
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1583_sendPresence)
-HXLINE(1584)		 ::Dynamic _hx_tmp;
-HXDLIN(1584)		if (::hx::IsNotNull( augment )) {
-HXLINE(1584)			_hx_tmp = augment;
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1695_sendPresence)
+HXLINE(1696)		 ::Dynamic stanza;
+HXDLIN(1696)		if (::hx::IsNull( to )) {
+HXLINE(1696)			stanza =  ::Dynamic(::hx::Anon_obj::Create(0));
+            		}
+            		else {
+HXLINE(1696)			stanza =  ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(0,HX_("to",7b,65,00,00),to));
+            		}
+HXDLIN(1696)		 ::borogove::Stanza stanza1 = this->caps->addC( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("presence",3b,52,d7,66),stanza));
+HXLINE(1697)		::String stanza2 = this->displayName();
+HXLINE(1696)		 ::borogove::Stanza stanza3 = stanza1->textTag(HX_("nick",a3,7b,05,49),stanza2, ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/nick",17,30,dc,e9))));
+HXLINE(1699)		 ::borogove::Chat tmp = this->getChat(this->accountId());
+HXDLIN(1699)		 ::borogove::Status status;
+HXDLIN(1699)		if (::hx::IsNotNull( tmp )) {
+HXLINE(1699)			status = tmp->status;
+            		}
+            		else {
+HXLINE(1699)			status = null();
+            		}
+HXLINE(1700)		::String statusText;
+HXDLIN(1700)		::String tmp1;
+HXDLIN(1700)		if (::hx::IsNotNull( status )) {
+HXLINE(1700)			tmp1 = status->toString();
+            		}
+            		else {
+HXLINE(1700)			tmp1 = null();
+            		}
+HXDLIN(1700)		if (::hx::IsNotNull( tmp1 )) {
+HXLINE(1700)			statusText = tmp1;
+            		}
+            		else {
+HXLINE(1700)			statusText = HX_("",00,00,00,00);
+            		}
+HXLINE(1701)		if ((statusText != HX_("",00,00,00,00))) {
+HXLINE(1701)			stanza3->textTag(HX_("status",32,e7,fb,05),statusText,null());
+            		}
+HXLINE(1703)		 ::Dynamic _hx_tmp;
+HXDLIN(1703)		if (::hx::IsNotNull( augment )) {
+HXLINE(1703)			_hx_tmp = augment;
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             			 ::borogove::Stanza _hx_run( ::borogove::Stanza s){
-            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1584_sendPresence)
-HXLINE(1584)				return s;
+            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1703_sendPresence)
+HXLINE(1703)				return s;
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1584)			_hx_tmp =  ::Dynamic(new _hx_Closure_0());
-            		}
-HXLINE(1585)		 ::Dynamic _hx_tmp1;
-HXDLIN(1585)		if (::hx::IsNull( to )) {
-HXLINE(1585)			_hx_tmp1 =  ::Dynamic(::hx::Anon_obj::Create(0));
-            		}
-            		else {
-HXLINE(1585)			_hx_tmp1 =  ::Dynamic(::hx::Anon_obj::Create(1)
-            				->setFixed(0,HX_("to",7b,65,00,00),to));
+HXLINE(1703)			_hx_tmp =  ::Dynamic(new _hx_Closure_0());
             		}
-HXDLIN(1585)		 ::borogove::Stanza _hx_tmp2 = this->caps->addC( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("presence",3b,52,d7,66),_hx_tmp1));
-HXLINE(1586)		::String _hx_tmp3 = this->displayName();
-HXLINE(1583)		this->sendStanza(( ( ::borogove::Stanza)(_hx_tmp(_hx_tmp2->textTag(HX_("nick",a3,7b,05,49),_hx_tmp3, ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/nick",17,30,dc,e9)))))) ));
+HXDLIN(1703)		this->sendStanza(( ( ::borogove::Stanza)(_hx_tmp(stanza3)) ));
             	}
 
 
@@ -4685,89 +4848,89 @@ HX_DEFINE_DYNAMIC_FUNC2(Client_obj,sendPresence,(void))
 void Client_obj::getIceServers( ::Dynamic callback){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::queries::ExtDiscoGet,extDiscoGet, ::Dynamic,callback) HXARGC(0)
             		void _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1595_getIceServers)
-HXLINE(1596)			 ::haxe::ds::StringMap didUrl =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(1597)			::Array< ::Dynamic> servers = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1598)			{
-HXLINE(1598)				int _g = 0;
-HXDLIN(1598)				::Array< ::Dynamic> _g1;
-HXDLIN(1598)				::Array< ::Dynamic> tmp = extDiscoGet->getResult();
-HXDLIN(1598)				if (::hx::IsNotNull( tmp )) {
-HXLINE(1598)					_g1 = tmp;
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1710_getIceServers)
+HXLINE(1711)			 ::haxe::ds::StringMap didUrl =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(1712)			::Array< ::Dynamic> servers = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1713)			{
+HXLINE(1713)				int _g = 0;
+HXDLIN(1713)				::Array< ::Dynamic> _g1;
+HXDLIN(1713)				::Array< ::Dynamic> tmp = extDiscoGet->getResult();
+HXDLIN(1713)				if (::hx::IsNotNull( tmp )) {
+HXLINE(1713)					_g1 = tmp;
             				}
             				else {
-HXLINE(1598)					_g1 = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1713)					_g1 = ::Array_obj< ::Dynamic>::__new(0);
             				}
-HXDLIN(1598)				while((_g < _g1->length)){
-HXLINE(1598)					 ::borogove::Stanza service = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
-HXDLIN(1598)					_g = (_g + 1);
-HXLINE(1599)					if (!(::Array_obj< ::String >::fromData( _hx_array_data_c0e6dc18_227,4)->contains(( (::String)(::Reflect_obj::field(service->attr,HX_("type",ba,f2,08,4d))) )))) {
-HXLINE(1599)						continue;
+HXDLIN(1713)				while((_g < _g1->length)){
+HXLINE(1713)					 ::borogove::Stanza service = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN(1713)					_g = (_g + 1);
+HXLINE(1714)					if (!(::Array_obj< ::String >::fromData( _hx_array_data_c0e6dc18_234,4)->contains(( (::String)(::Reflect_obj::field(service->attr,HX_("type",ba,f2,08,4d))) )))) {
+HXLINE(1714)						continue;
             					}
-HXLINE(1600)					::String host = ( (::String)(::Reflect_obj::field(service->attr,HX_("host",68,cf,12,45))) );
-HXLINE(1601)					bool _hx_tmp;
-HXDLIN(1601)					if (::hx::IsNotNull( host )) {
-HXLINE(1601)						_hx_tmp = (host == HX_("",00,00,00,00));
+HXLINE(1715)					::String host = ( (::String)(::Reflect_obj::field(service->attr,HX_("host",68,cf,12,45))) );
+HXLINE(1716)					bool _hx_tmp;
+HXDLIN(1716)					if (::hx::IsNotNull( host )) {
+HXLINE(1716)						_hx_tmp = (host == HX_("",00,00,00,00));
             					}
             					else {
-HXLINE(1601)						_hx_tmp = true;
+HXLINE(1716)						_hx_tmp = true;
             					}
-HXDLIN(1601)					if (_hx_tmp) {
-HXLINE(1601)						continue;
+HXDLIN(1716)					if (_hx_tmp) {
+HXLINE(1716)						continue;
             					}
-HXLINE(1602)					 ::Dynamic port = ::Std_obj::parseInt(( (::String)(::Reflect_obj::field(service->attr,HX_("port",81,83,5c,4a))) ));
-HXLINE(1603)					bool _hx_tmp1;
-HXDLIN(1603)					bool _hx_tmp2;
-HXDLIN(1603)					if (::hx::IsNotNull( port )) {
-HXLINE(1603)						_hx_tmp2 = ::hx::IsLess( port,1 );
+HXLINE(1717)					 ::Dynamic port = ::Std_obj::parseInt(( (::String)(::Reflect_obj::field(service->attr,HX_("port",81,83,5c,4a))) ));
+HXLINE(1718)					bool _hx_tmp1;
+HXDLIN(1718)					bool _hx_tmp2;
+HXDLIN(1718)					if (::hx::IsNotNull( port )) {
+HXLINE(1718)						_hx_tmp2 = ::hx::IsLess( port,1 );
             					}
             					else {
-HXLINE(1603)						_hx_tmp2 = true;
+HXLINE(1718)						_hx_tmp2 = true;
             					}
-HXDLIN(1603)					if (!(_hx_tmp2)) {
-HXLINE(1603)						_hx_tmp1 = ::hx::IsGreater( port,65535 );
+HXDLIN(1718)					if (!(_hx_tmp2)) {
+HXLINE(1718)						_hx_tmp1 = ::hx::IsGreater( port,65535 );
             					}
             					else {
-HXLINE(1603)						_hx_tmp1 = true;
+HXLINE(1718)						_hx_tmp1 = true;
             					}
-HXDLIN(1603)					if (_hx_tmp1) {
-HXLINE(1603)						continue;
+HXDLIN(1718)					if (_hx_tmp1) {
+HXLINE(1718)						continue;
             					}
-HXLINE(1604)					bool isTurn = ::Array_obj< ::String >::fromData( _hx_array_data_c0e6dc18_228,2)->contains(( (::String)(::Reflect_obj::field(service->attr,HX_("type",ba,f2,08,4d))) ));
-HXLINE(1605)					::String url = (( (::String)(::Reflect_obj::field(service->attr,HX_("type",ba,f2,08,4d))) ) + HX_(":",3a,00,00,00));
-HXDLIN(1605)					::String url1;
-HXDLIN(1605)					if ((host.indexOf(HX_(":",3a,00,00,00),null()) >= 0)) {
-HXLINE(1605)						url1 = ((HX_("[",5b,00,00,00) + host) + HX_("]",5d,00,00,00));
+HXLINE(1719)					bool isTurn = ::Array_obj< ::String >::fromData( _hx_array_data_c0e6dc18_235,2)->contains(( (::String)(::Reflect_obj::field(service->attr,HX_("type",ba,f2,08,4d))) ));
+HXLINE(1720)					::String url = (( (::String)(::Reflect_obj::field(service->attr,HX_("type",ba,f2,08,4d))) ) + HX_(":",3a,00,00,00));
+HXDLIN(1720)					::String url1;
+HXDLIN(1720)					if ((host.indexOf(HX_(":",3a,00,00,00),null()) >= 0)) {
+HXLINE(1720)						url1 = ((HX_("[",5b,00,00,00) + host) + HX_("]",5d,00,00,00));
             					}
             					else {
-HXLINE(1605)						url1 = host;
+HXLINE(1720)						url1 = host;
             					}
-HXDLIN(1605)					::String url2;
-HXDLIN(1605)					if (isTurn) {
-HXLINE(1605)						url2 = (HX_("?transport=",73,c9,f2,13) + ( (::String)(::Reflect_obj::field(service->attr,HX_("transport",a9,4f,2f,4c))) ));
+HXDLIN(1720)					::String url2;
+HXDLIN(1720)					if (isTurn) {
+HXLINE(1720)						url2 = (HX_("?transport=",73,c9,f2,13) + ( (::String)(::Reflect_obj::field(service->attr,HX_("transport",a9,4f,2f,4c))) ));
             					}
             					else {
-HXLINE(1605)						url2 = HX_("",00,00,00,00);
+HXLINE(1720)						url2 = HX_("",00,00,00,00);
             					}
-HXDLIN(1605)					::String url3 = ((((url + url1) + HX_(":",3a,00,00,00)) + port) + url2);
-HXLINE(1606)					if (!(didUrl->exists(url3))) {
-HXLINE(1608)						::String _hx_tmp3 = ( (::String)(::Reflect_obj::field(service->attr,HX_("username",16,86,eb,20))) );
-HXLINE(1607)						servers->push( ::Dynamic(::hx::Anon_obj::Create(3)
+HXDLIN(1720)					::String url3 = ((((url + url1) + HX_(":",3a,00,00,00)) + port) + url2);
+HXLINE(1721)					if (!(didUrl->exists(url3))) {
+HXLINE(1723)						::String _hx_tmp3 = ( (::String)(::Reflect_obj::field(service->attr,HX_("username",16,86,eb,20))) );
+HXLINE(1722)						servers->push( ::Dynamic(::hx::Anon_obj::Create(3)
             							->setFixed(0,HX_("credential",d7,89,b2,20),( (::String)(::Reflect_obj::field(service->attr,HX_("password",1b,23,d0,48))) ))
             							->setFixed(1,HX_("username",16,86,eb,20),_hx_tmp3)
             							->setFixed(2,HX_("urls",24,d6,ac,4d),::Array_obj< ::String >::__new(1)->init(0,url3))));
-HXLINE(1612)						didUrl->set(url3,true);
+HXLINE(1727)						didUrl->set(url3,true);
             					}
             				}
             			}
-HXLINE(1615)			callback(servers);
+HXLINE(1730)			callback(servers);
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1593_getIceServers)
-HXLINE(1594)		 ::borogove::queries::ExtDiscoGet extDiscoGet =  ::borogove::queries::ExtDiscoGet_obj::__alloc( HX_CTX ,this->jid->domain);
-HXLINE(1595)		extDiscoGet->onFinished( ::Dynamic(new _hx_Closure_0(extDiscoGet,callback)));
-HXLINE(1617)		this->sendQuery(extDiscoGet);
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1708_getIceServers)
+HXLINE(1709)		 ::borogove::queries::ExtDiscoGet extDiscoGet =  ::borogove::queries::ExtDiscoGet_obj::__alloc( HX_CTX ,this->jid->domain);
+HXLINE(1710)		extDiscoGet->onFinished( ::Dynamic(new _hx_Closure_0(extDiscoGet,callback)));
+HXLINE(1732)		this->sendQuery(extDiscoGet);
             	}
 
 
@@ -4776,68 +4939,104 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,getIceServers,(void))
 void Client_obj::discoverServices( ::borogove::JID target,::String node, ::Dynamic callback){
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_1, ::borogove::Client,_gthis, ::Dynamic,callback, ::borogove::queries::DiscoItemsGet,itemsGet) HXARGC(0)
             		void _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1625_discoverServices)
-HXLINE(1625)			int _g = 0;
-HXDLIN(1625)			::Array< ::Dynamic> _g1;
-HXDLIN(1625)			::Array< ::Dynamic> tmp = itemsGet->getResult();
-HXDLIN(1625)			if (::hx::IsNotNull( tmp )) {
-HXLINE(1625)				_g1 = tmp;
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1740_discoverServices)
+HXLINE(1740)			int _g = 0;
+HXDLIN(1740)			::Array< ::Dynamic> _g1;
+HXDLIN(1740)			::Array< ::Dynamic> tmp = itemsGet->getResult();
+HXDLIN(1740)			if (::hx::IsNotNull( tmp )) {
+HXLINE(1740)				_g1 = tmp;
             			}
             			else {
-HXLINE(1625)				_g1 = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1740)				_g1 = ::Array_obj< ::Dynamic>::__new(0);
             			}
-HXDLIN(1625)			while((_g < _g1->length)){
+HXDLIN(1740)			while((_g < _g1->length)){
             				HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::queries::DiscoInfoGet,infoGet1, ::Dynamic,item, ::Dynamic,callback) HXARGC(0)
             				void _hx_run(){
-            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1628_discoverServices)
-HXLINE(1628)					 ::Dynamic callback1 = callback;
-HXDLIN(1628)					 ::Dynamic item1 = item;
-HXDLIN(1628)					 ::borogove::Caps tmp = infoGet1->getResult();
-HXDLIN(1628)					 ::borogove::Caps _hx_tmp;
-HXDLIN(1628)					if (::hx::IsNotNull( tmp )) {
-HXLINE(1628)						_hx_tmp = tmp;
+            					HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1743_discoverServices)
+HXLINE(1743)					 ::Dynamic callback1 = callback;
+HXDLIN(1743)					 ::Dynamic item1 = item;
+HXDLIN(1743)					 ::borogove::Caps tmp = infoGet1->getResult();
+HXDLIN(1743)					 ::borogove::Caps _hx_tmp;
+HXDLIN(1743)					if (::hx::IsNotNull( tmp )) {
+HXLINE(1743)						_hx_tmp = tmp;
             					}
             					else {
-HXLINE(1628)						_hx_tmp =  ::borogove::Caps_obj::__alloc( HX_CTX ,HX_("",00,00,00,00),::Array_obj< ::Dynamic>::__new(0),::Array_obj< ::String >::__new(0),::Array_obj< ::Dynamic>::__new(0),null());
+HXLINE(1743)						_hx_tmp = ::borogove::CapsRepo_obj::empty;
             					}
-HXDLIN(1628)					callback1(item1,_hx_tmp);
+HXDLIN(1743)					callback1(item1,_hx_tmp);
             				}
             				HX_END_LOCAL_FUNC0((void))
 
-HXLINE(1625)				 ::Dynamic item = _g1->__get(_g);
-HXDLIN(1625)				_g = (_g + 1);
-HXLINE(1626)				::String infoGet = ( ( ::borogove::JID)(item->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) )->asString();
-HXDLIN(1626)				 ::borogove::queries::DiscoInfoGet infoGet1 =  ::borogove::queries::DiscoInfoGet_obj::__alloc( HX_CTX ,infoGet,( (::String)(item->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic)) ));
-HXLINE(1627)				infoGet1->onFinished( ::Dynamic(new _hx_Closure_0(infoGet1,item,callback)));
-HXLINE(1630)				_gthis->sendQuery(infoGet1);
+HXLINE(1740)				 ::Dynamic item = _g1->__get(_g);
+HXDLIN(1740)				_g = (_g + 1);
+HXLINE(1741)				::String infoGet = ( ( ::borogove::JID)(item->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) )->asString();
+HXDLIN(1741)				 ::borogove::queries::DiscoInfoGet infoGet1 =  ::borogove::queries::DiscoInfoGet_obj::__alloc( HX_CTX ,infoGet,( (::String)(item->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic)) ));
+HXLINE(1742)				infoGet1->onFinished( ::Dynamic(new _hx_Closure_0(infoGet1,item,callback)));
+HXLINE(1745)				_gthis->sendQuery(infoGet1);
             			}
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1622_discoverServices)
-HXDLIN(1622)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1623)		 ::borogove::queries::DiscoItemsGet itemsGet =  ::borogove::queries::DiscoItemsGet_obj::__alloc( HX_CTX ,target->asString(),node);
-HXLINE(1624)		itemsGet->onFinished( ::Dynamic(new _hx_Closure_1(_gthis,callback,itemsGet)));
-HXLINE(1633)		this->sendQuery(itemsGet);
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1737_discoverServices)
+HXDLIN(1737)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1738)		 ::borogove::queries::DiscoItemsGet itemsGet =  ::borogove::queries::DiscoItemsGet_obj::__alloc( HX_CTX ,target->asString(),node);
+HXLINE(1739)		itemsGet->onFinished( ::Dynamic(new _hx_Closure_1(_gthis,callback,itemsGet)));
+HXLINE(1748)		this->sendQuery(itemsGet);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC3(Client_obj,discoverServices,(void))
 
 void Client_obj::notifyMessageHandlers( ::borogove::ChatMessage message,int event){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1637_notifyMessageHandlers)
-HXLINE(1638)		 ::borogove::Chat chat = this->getChat(message->chatId());
-HXLINE(1639)		bool _hx_tmp;
-HXDLIN(1639)		if (::hx::IsNotNull( chat )) {
-HXLINE(1639)			_hx_tmp = chat->isBlocked;
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1752_notifyMessageHandlers)
+HXLINE(1753)		 ::borogove::Chat chat = this->getChat(message->chatId());
+HXLINE(1754)		bool _hx_tmp;
+HXDLIN(1754)		if (::hx::IsNotNull( chat )) {
+HXLINE(1754)			_hx_tmp = chat->isBlocked;
+            		}
+            		else {
+HXLINE(1754)			_hx_tmp = false;
+            		}
+HXDLIN(1754)		if (_hx_tmp) {
+HXLINE(1754)			return;
+            		}
+HXLINE(1756)		bool _hx_tmp1;
+HXDLIN(1756)		bool _hx_tmp2;
+HXDLIN(1756)		bool _hx_tmp3;
+HXDLIN(1756)		bool _hx_tmp4;
+HXDLIN(1756)		if ((event == 0)) {
+HXLINE(1756)			_hx_tmp4 = (message->type == 0);
+            		}
+            		else {
+HXLINE(1756)			_hx_tmp4 = false;
+            		}
+HXDLIN(1756)		if (_hx_tmp4) {
+HXLINE(1756)			_hx_tmp3 = ::hx::IsNotNull( message->localId );
+            		}
+            		else {
+HXLINE(1756)			_hx_tmp3 = false;
+            		}
+HXDLIN(1756)		if (_hx_tmp3) {
+HXLINE(1756)			_hx_tmp2 = ::hx::IsNotNull( chat );
+            		}
+            		else {
+HXLINE(1756)			_hx_tmp2 = false;
+            		}
+HXDLIN(1756)		if (_hx_tmp2) {
+HXLINE(1756)			_hx_tmp1 = chat->isTrusted();
             		}
             		else {
-HXLINE(1639)			_hx_tmp = false;
+HXLINE(1756)			_hx_tmp1 = false;
             		}
-HXDLIN(1639)		if (_hx_tmp) {
-HXLINE(1639)			return;
+HXDLIN(1756)		if (_hx_tmp1) {
+HXLINE(1758)			::String _hx_tmp5 = message->from->asString();
+HXLINE(1757)			this->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("to",7b,65,00,00),_hx_tmp5)
+            				->setFixed(1,HX_("type",ba,f2,08,4d),HX_("chat",d8,5e,bf,41))))->tag(HX_("received",21,45,fd,e2), ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("id",db,5b,00,00),message->localId)
+            				->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:receipts",d7,40,8f,8c)))));
             		}
-HXLINE(1640)		this->trigger(HX_("message/new",d8,fc,71,67), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE(1763)		this->trigger(HX_("message/new",d8,fc,71,67), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("message",c7,35,11,9a),message)
             			->setFixed(1,HX_("event",1a,c8,c4,75),event)));
             	}
@@ -4846,29 +5045,58 @@ HXLINE(1640)		this->trigger(HX_("message/new",d8,fc,71,67), ::Dynamic(::hx::Anon
 HX_DEFINE_DYNAMIC_FUNC2(Client_obj,notifyMessageHandlers,(void))
 
 void Client_obj::notifySyncMessageHandlers( ::borogove::ChatMessage message){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1644_notifySyncMessageHandlers)
-HXLINE(1645)		bool _hx_tmp;
-HXDLIN(1645)		if (::hx::IsNotNull( message )) {
-HXLINE(1645)			_hx_tmp = (message->versions->length > 1);
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1767_notifySyncMessageHandlers)
+HXLINE(1768)		bool _hx_tmp;
+HXDLIN(1768)		if (::hx::IsNotNull( message )) {
+HXLINE(1768)			_hx_tmp = (message->versions->length > 1);
+            		}
+            		else {
+HXLINE(1768)			_hx_tmp = true;
+            		}
+HXDLIN(1768)		if (_hx_tmp) {
+HXLINE(1768)			return;
+            		}
+HXLINE(1769)		 ::borogove::Chat chat = this->getChat(message->chatId());
+HXLINE(1770)		bool _hx_tmp1;
+HXDLIN(1770)		if (::hx::IsNotNull( chat )) {
+HXLINE(1770)			_hx_tmp1 = chat->isBlocked;
+            		}
+            		else {
+HXLINE(1770)			_hx_tmp1 = false;
+            		}
+HXDLIN(1770)		if (_hx_tmp1) {
+HXLINE(1770)			return;
+            		}
+HXLINE(1772)		bool _hx_tmp2;
+HXDLIN(1772)		bool _hx_tmp3;
+HXDLIN(1772)		bool _hx_tmp4;
+HXDLIN(1772)		if ((message->type == 0)) {
+HXLINE(1772)			_hx_tmp4 = ::hx::IsNotNull( message->localId );
             		}
             		else {
-HXLINE(1645)			_hx_tmp = true;
+HXLINE(1772)			_hx_tmp4 = false;
             		}
-HXDLIN(1645)		if (_hx_tmp) {
-HXLINE(1645)			return;
+HXDLIN(1772)		if (_hx_tmp4) {
+HXLINE(1772)			_hx_tmp3 = ::hx::IsNotNull( chat );
+            		}
+            		else {
+HXLINE(1772)			_hx_tmp3 = false;
             		}
-HXLINE(1646)		 ::borogove::Chat chat = this->getChat(message->chatId());
-HXLINE(1647)		bool _hx_tmp1;
-HXDLIN(1647)		if (::hx::IsNotNull( chat )) {
-HXLINE(1647)			_hx_tmp1 = chat->isBlocked;
+HXDLIN(1772)		if (_hx_tmp3) {
+HXLINE(1772)			_hx_tmp2 = chat->isTrusted();
             		}
             		else {
-HXLINE(1647)			_hx_tmp1 = false;
+HXLINE(1772)			_hx_tmp2 = false;
             		}
-HXDLIN(1647)		if (_hx_tmp1) {
-HXLINE(1647)			return;
+HXDLIN(1772)		if (_hx_tmp2) {
+HXLINE(1774)			::String _hx_tmp5 = message->from->asString();
+HXLINE(1773)			this->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("to",7b,65,00,00),_hx_tmp5)
+            				->setFixed(1,HX_("type",ba,f2,08,4d),HX_("chat",d8,5e,bf,41))))->tag(HX_("received",21,45,fd,e2), ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("id",db,5b,00,00),message->localId)
+            				->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:receipts",d7,40,8f,8c)))));
             		}
-HXLINE(1648)		this->trigger(HX_("message/sync",e3,76,a8,1f),message);
+HXLINE(1779)		this->trigger(HX_("message/sync",e3,76,a8,1f),message);
             	}
 
 
@@ -4877,30 +5105,30 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,notifySyncMessageHandlers,(void))
 void Client_obj::rosterGet(){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis, ::borogove::queries::RosterGet,rosterGet) HXARGC(0)
             		void _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1653_rosterGet)
-HXLINE(1654)			::Array< ::Dynamic> chatsToUpdate = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1655)			{
-HXLINE(1655)				int _g = 0;
-HXDLIN(1655)				::Array< ::Dynamic> _g1 = rosterGet->getResult();
-HXDLIN(1655)				while((_g < _g1->length)){
-HXLINE(1655)					 ::Dynamic item = _g1->__get(_g);
-HXDLIN(1655)					_g = (_g + 1);
-HXLINE(1656)					 ::borogove::DirectChat chat = _gthis->getDirectChat(( (::String)(item->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) ),false);
-HXLINE(1657)					chat->updateFromRoster(item);
-HXLINE(1658)					chatsToUpdate->push(chat);
-            				}
-            			}
-HXLINE(1660)			::Dynamic _gthis1 = _gthis->persistence;
-HXDLIN(1660)			::borogove::Persistence_obj::storeChats(_gthis1,_gthis->accountId(),chatsToUpdate);
-HXLINE(1661)			_gthis->trigger(HX_("chats/update",3d,8e,1d,14),chatsToUpdate);
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1784_rosterGet)
+HXLINE(1785)			::Array< ::Dynamic> chatsToUpdate = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1786)			{
+HXLINE(1786)				int _g = 0;
+HXDLIN(1786)				::Array< ::Dynamic> _g1 = rosterGet->getResult();
+HXDLIN(1786)				while((_g < _g1->length)){
+HXLINE(1786)					 ::Dynamic item = _g1->__get(_g);
+HXDLIN(1786)					_g = (_g + 1);
+HXLINE(1787)					 ::borogove::DirectChat chat = _gthis->getDirectChat(( (::String)(item->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) ),false);
+HXLINE(1788)					chat->updateFromRoster(item);
+HXLINE(1789)					chatsToUpdate->push(chat);
+            				}
+            			}
+HXLINE(1791)			::Dynamic _gthis1 = _gthis->persistence;
+HXDLIN(1791)			::borogove::Persistence_obj::storeChats(_gthis1,_gthis->accountId(),chatsToUpdate);
+HXLINE(1792)			_gthis->trigger(HX_("chats/update",3d,8e,1d,14),chatsToUpdate);
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1651_rosterGet)
-HXDLIN(1651)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1652)		 ::borogove::queries::RosterGet rosterGet =  ::borogove::queries::RosterGet_obj::__alloc( HX_CTX ,null());
-HXLINE(1653)		rosterGet->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,rosterGet)));
-HXLINE(1663)		this->sendQuery(rosterGet);
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1782_rosterGet)
+HXDLIN(1782)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1783)		 ::borogove::queries::RosterGet rosterGet =  ::borogove::queries::RosterGet_obj::__alloc( HX_CTX ,null());
+HXLINE(1784)		rosterGet->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,rosterGet)));
+HXLINE(1794)		this->sendQuery(rosterGet);
             	}
 
 
@@ -4909,184 +5137,184 @@ HX_DEFINE_DYNAMIC_FUNC0(Client_obj,rosterGet,(void))
 void Client_obj::startChatWith(::String jid, ::Dynamic handleCaps, ::Dynamic handleChat){
             		HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis, ::Dynamic,handleChat, ::Dynamic,handleCaps, ::borogove::queries::DiscoInfoGet,discoGet,::String,jid) HXARGC(0)
             		void _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1668_startChatWith)
-HXLINE(1669)			 ::borogove::Caps resultCaps = discoGet->getResult();
-HXLINE(1670)			int uiState = ( (int)(handleCaps(resultCaps)) );
-HXLINE(1671)			if (::hx::IsNull( resultCaps )) {
-HXLINE(1672)				 ::borogove::Stanza tmp = discoGet->responseStanza;
-HXDLIN(1672)				 ::borogove::Stanza tmp1;
-HXDLIN(1672)				if (::hx::IsNotNull( tmp )) {
-HXLINE(1672)					tmp1 = tmp->getChild(HX_("error",c8,cb,29,73),null());
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1799_startChatWith)
+HXLINE(1800)			 ::borogove::Caps resultCaps = discoGet->getResult();
+HXLINE(1801)			int uiState = ( (int)(handleCaps(resultCaps)) );
+HXLINE(1802)			if (::hx::IsNull( resultCaps )) {
+HXLINE(1803)				 ::borogove::Stanza tmp = discoGet->responseStanza;
+HXDLIN(1803)				 ::borogove::Stanza tmp1;
+HXDLIN(1803)				if (::hx::IsNotNull( tmp )) {
+HXLINE(1803)					tmp1 = tmp->getChild(HX_("error",c8,cb,29,73),null());
             				}
             				else {
-HXLINE(1672)					tmp1 = null();
+HXLINE(1803)					tmp1 = null();
             				}
-HXDLIN(1672)				 ::borogove::Stanza err;
-HXDLIN(1672)				if (::hx::IsNotNull( tmp1 )) {
-HXLINE(1672)					err = tmp1->getChild(null(),HX_("urn:ietf:params:xml:ns:xmpp-stanzas",27,f2,3d,30));
+HXDLIN(1803)				 ::borogove::Stanza err;
+HXDLIN(1803)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE(1803)					err = tmp1->getChild(null(),HX_("urn:ietf:params:xml:ns:xmpp-stanzas",27,f2,3d,30));
             				}
             				else {
-HXLINE(1672)					err = null();
-            				}
-HXLINE(1673)				bool _hx_tmp;
-HXDLIN(1673)				bool _hx_tmp1;
-HXDLIN(1673)				if (::hx::IsNotNull( err )) {
-HXLINE(1673)					::String _hx_tmp2;
-HXDLIN(1673)					if (::hx::IsNotNull( err )) {
-HXLINE(1673)						_hx_tmp2 = err->name;
+HXLINE(1803)					err = null();
+            				}
+HXLINE(1804)				bool _hx_tmp;
+HXDLIN(1804)				bool _hx_tmp1;
+HXDLIN(1804)				if (::hx::IsNotNull( err )) {
+HXLINE(1804)					::String _hx_tmp2;
+HXDLIN(1804)					if (::hx::IsNotNull( err )) {
+HXLINE(1804)						_hx_tmp2 = err->name;
             					}
             					else {
-HXLINE(1673)						_hx_tmp2 = null();
+HXLINE(1804)						_hx_tmp2 = null();
             					}
-HXDLIN(1673)					_hx_tmp1 = (_hx_tmp2 == HX_("service-unavailable",f8,3c,11,1c));
+HXDLIN(1804)					_hx_tmp1 = (_hx_tmp2 == HX_("service-unavailable",f8,3c,11,1c));
             				}
             				else {
-HXLINE(1673)					_hx_tmp1 = true;
+HXLINE(1804)					_hx_tmp1 = true;
             				}
-HXDLIN(1673)				if (!(_hx_tmp1)) {
-HXLINE(1673)					::String _hx_tmp3;
-HXDLIN(1673)					if (::hx::IsNotNull( err )) {
-HXLINE(1673)						_hx_tmp3 = err->name;
+HXDLIN(1804)				if (!(_hx_tmp1)) {
+HXLINE(1804)					::String _hx_tmp3;
+HXDLIN(1804)					if (::hx::IsNotNull( err )) {
+HXLINE(1804)						_hx_tmp3 = err->name;
             					}
             					else {
-HXLINE(1673)						_hx_tmp3 = null();
+HXLINE(1804)						_hx_tmp3 = null();
             					}
-HXDLIN(1673)					_hx_tmp = (_hx_tmp3 == HX_("feature-not-implemented",71,20,2e,96));
+HXDLIN(1804)					_hx_tmp = (_hx_tmp3 == HX_("feature-not-implemented",71,20,2e,96));
             				}
             				else {
-HXLINE(1673)					_hx_tmp = true;
+HXLINE(1804)					_hx_tmp = true;
             				}
-HXDLIN(1673)				if (_hx_tmp) {
-HXLINE(1674)					 ::borogove::DirectChat chat = _gthis->getDirectChat(jid,false);
-HXLINE(1675)					chat->uiState = uiState;
-HXLINE(1676)					handleChat(chat);
-HXLINE(1677)					::Dynamic _gthis1 = _gthis->persistence;
-HXDLIN(1677)					::borogove::Persistence_obj::storeChats(_gthis1,_gthis->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat));
-HXLINE(1678)					_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat));
+HXDLIN(1804)				if (_hx_tmp) {
+HXLINE(1805)					 ::borogove::DirectChat chat = _gthis->getDirectChat(jid,false);
+HXLINE(1806)					chat->uiState = uiState;
+HXLINE(1807)					handleChat(chat);
+HXLINE(1808)					::Dynamic _gthis1 = _gthis->persistence;
+HXDLIN(1808)					::borogove::Persistence_obj::storeChats(_gthis1,_gthis->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat));
+HXLINE(1809)					_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat));
             				}
             			}
             			else {
-HXLINE(1681)				::borogove::Persistence_obj::storeCaps(_gthis->persistence,resultCaps);
-HXLINE(1682)				if (resultCaps->isChannel(jid)) {
-HXLINE(1683)					 ::borogove::Channel chat1 =  ::borogove::Channel_obj::__alloc( HX_CTX ,_gthis,_gthis->stream,_gthis->persistence,jid,uiState,false,null(),null(),null(),resultCaps);
-HXLINE(1684)					chat1->setupNotifications();
-HXLINE(1685)					_gthis->chats->unshift(chat1);
-HXLINE(1686)					bool _hx_tmp4;
-HXDLIN(1686)					if (_gthis->inSync) {
-HXLINE(1686)						_hx_tmp4 = _gthis->sendAvailable;
+HXLINE(1812)				 ::borogove::Caps cachedCaps = _gthis->capsRepo->add(resultCaps,null());
+HXLINE(1813)				if (cachedCaps->isChannel(jid)) {
+HXLINE(1814)					 ::borogove::Channel chat1 =  ::borogove::Channel_obj::__alloc( HX_CTX ,_gthis,_gthis->stream,_gthis->persistence,jid,uiState,false,false,null(),null(),null(),cachedCaps);
+HXLINE(1815)					chat1->setupNotifications();
+HXLINE(1816)					_gthis->chats->unshift(chat1);
+HXLINE(1817)					bool _hx_tmp4;
+HXDLIN(1817)					if (_gthis->inSync) {
+HXLINE(1817)						_hx_tmp4 = _gthis->sendAvailable;
             					}
             					else {
-HXLINE(1686)						_hx_tmp4 = false;
+HXLINE(1817)						_hx_tmp4 = false;
             					}
-HXDLIN(1686)					if (_hx_tmp4) {
-HXLINE(1686)						chat1->selfPing(false);
+HXDLIN(1817)					if (_hx_tmp4) {
+HXLINE(1817)						chat1->selfPing(false);
             					}
-HXLINE(1687)					handleChat(chat1);
-HXLINE(1688)					::Dynamic _gthis2 = _gthis->persistence;
-HXDLIN(1688)					::borogove::Persistence_obj::storeChats(_gthis2,_gthis->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat1));
-HXLINE(1689)					_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat1));
+HXLINE(1818)					handleChat(chat1);
+HXLINE(1819)					::Dynamic _gthis2 = _gthis->persistence;
+HXDLIN(1819)					::borogove::Persistence_obj::storeChats(_gthis2,_gthis->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat1));
+HXLINE(1820)					_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat1));
             				}
             				else {
-HXLINE(1691)					 ::borogove::DirectChat chat2 = _gthis->getDirectChat(jid,false);
-HXLINE(1692)					chat2->uiState = uiState;
-HXLINE(1693)					handleChat(chat2);
-HXLINE(1694)					::Dynamic _gthis3 = _gthis->persistence;
-HXDLIN(1694)					::borogove::Persistence_obj::storeChats(_gthis3,_gthis->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat2));
-HXLINE(1695)					_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat2));
+HXLINE(1822)					 ::borogove::DirectChat chat2 = _gthis->getDirectChat(jid,false);
+HXLINE(1823)					chat2->uiState = uiState;
+HXLINE(1824)					handleChat(chat2);
+HXLINE(1825)					::Dynamic _gthis3 = _gthis->persistence;
+HXDLIN(1825)					::borogove::Persistence_obj::storeChats(_gthis3,_gthis->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat2));
+HXLINE(1826)					_gthis->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat2));
             				}
             			}
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1666_startChatWith)
-HXDLIN(1666)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1667)		 ::borogove::queries::DiscoInfoGet discoGet =  ::borogove::queries::DiscoInfoGet_obj::__alloc( HX_CTX ,jid,null());
-HXLINE(1668)		discoGet->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,handleChat,handleCaps,discoGet,jid)));
-HXLINE(1699)		this->sendQuery(discoGet);
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1797_startChatWith)
+HXDLIN(1797)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1798)		 ::borogove::queries::DiscoInfoGet discoGet =  ::borogove::queries::DiscoInfoGet_obj::__alloc( HX_CTX ,jid,null());
+HXLINE(1799)		discoGet->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,handleChat,handleCaps,discoGet,jid)));
+HXLINE(1830)		this->sendQuery(discoGet);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC3(Client_obj,startChatWith,(void))
 
 void Client_obj::mucInvite(::String chatId, ::borogove::Chat chat,::String senderId,::String threadId,::String serverId,::String serverIdBy,::String reason,::String password){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1702_mucInvite)
-HXDLIN(1702)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1703)		if (::hx::IsNull( chat )) {
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1833_mucInvite)
+HXDLIN(1833)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1834)		if (::hx::IsNull( chat )) {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             			int _hx_run( ::borogove::Caps _){
-            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1704_mucInvite)
-HXLINE(1704)				return 3;
+            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1835_mucInvite)
+HXLINE(1835)				return 3;
             			}
             			HX_END_LOCAL_FUNC1(return)
 
             			HX_BEGIN_LOCAL_FUNC_S8(::hx::LocalFunc,_hx_Closure_1, ::borogove::Client,_gthis,::String,serverId,::String,senderId,::String,chatId,::String,serverIdBy,::String,password,::String,reason,::String,threadId) HXARGC(1)
             			void _hx_run( ::borogove::Chat chat){
-            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1705_mucInvite)
-HXLINE(1705)				_gthis->mucInvite(chatId,chat,senderId,threadId,serverId,serverIdBy,reason,password);
+            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1836_mucInvite)
+HXLINE(1836)				_gthis->mucInvite(chatId,chat,senderId,threadId,serverId,serverIdBy,reason,password);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXLINE(1704)			this->startChatWith(chatId, ::Dynamic(new _hx_Closure_0()), ::Dynamic(new _hx_Closure_1(_gthis,serverId,senderId,chatId,serverIdBy,password,reason,threadId)));
-HXLINE(1707)			return;
+HXLINE(1835)			this->startChatWith(chatId, ::Dynamic(new _hx_Closure_0()), ::Dynamic(new _hx_Closure_1(_gthis,serverId,senderId,chatId,serverIdBy,password,reason,threadId)));
+HXLINE(1838)			return;
             		}
-HXLINE(1711)		bool _hx_tmp;
-HXDLIN(1711)		if ((chat->uiState != 2)) {
-HXLINE(1711)			_hx_tmp = (chat->uiState != 3);
+HXLINE(1842)		bool _hx_tmp;
+HXDLIN(1842)		if ((chat->uiState != 2)) {
+HXLINE(1842)			_hx_tmp = (chat->uiState != 3);
             		}
             		else {
-HXLINE(1711)			_hx_tmp = false;
+HXLINE(1842)			_hx_tmp = false;
             		}
-HXDLIN(1711)		if (_hx_tmp) {
-HXLINE(1711)			return;
+HXDLIN(1842)		if (_hx_tmp) {
+HXLINE(1842)			return;
             		}
-HXLINE(1713)		chat->extensions->removeChildren(HX_("invite",c9,f1,db,9f),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
-HXLINE(1714)		 ::borogove::Stanza inviteExt = chat->extensions->tag(HX_("invite",c9,f1,db,9f), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE(1844)		chat->extensions->removeChildren(HX_("invite",c9,f1,db,9f),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
+HXLINE(1845)		 ::borogove::Stanza inviteExt = chat->extensions->tag(HX_("invite",c9,f1,db,9f), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("from",6a,a5,c2,43),senderId)
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14))));
-HXLINE(1715)		if (::hx::IsNotNull( reason )) {
-HXLINE(1715)			inviteExt->textTag(HX_("reason",c4,0f,9d,fc),reason,null());
+HXLINE(1846)		if (::hx::IsNotNull( reason )) {
+HXLINE(1846)			inviteExt->textTag(HX_("reason",c4,0f,9d,fc),reason,null());
             		}
-HXLINE(1716)		if (::hx::IsNotNull( password )) {
-HXLINE(1716)			inviteExt->textTag(HX_("password",1b,23,d0,48),password,null());
+HXLINE(1847)		if (::hx::IsNotNull( password )) {
+HXLINE(1847)			inviteExt->textTag(HX_("password",1b,23,d0,48),password,null());
             		}
-HXLINE(1717)		if (::hx::IsNotNull( threadId )) {
-HXLINE(1717)			inviteExt->tag(HX_("continue",67,e0,c8,31), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1848)		if (::hx::IsNotNull( threadId )) {
+HXLINE(1848)			inviteExt->tag(HX_("continue",67,e0,c8,31), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("thread",ca,7a,b9,8e),threadId)))->up();
             		}
-HXLINE(1718)		bool _hx_tmp1;
-HXDLIN(1718)		if (::hx::IsNotNull( serverId )) {
-HXLINE(1718)			_hx_tmp1 = ::hx::IsNotNull( serverIdBy );
+HXLINE(1849)		bool _hx_tmp1;
+HXDLIN(1849)		if (::hx::IsNotNull( serverId )) {
+HXLINE(1849)			_hx_tmp1 = ::hx::IsNotNull( serverIdBy );
             		}
             		else {
-HXLINE(1718)			_hx_tmp1 = false;
+HXLINE(1849)			_hx_tmp1 = false;
             		}
-HXDLIN(1718)		if (_hx_tmp1) {
-HXLINE(1719)			inviteExt->tag(HX_("stanza-id",73,8a,54,e9), ::Dynamic(::hx::Anon_obj::Create(3)
+HXDLIN(1849)		if (_hx_tmp1) {
+HXLINE(1850)			inviteExt->tag(HX_("stanza-id",73,8a,54,e9), ::Dynamic(::hx::Anon_obj::Create(3)
             				->setFixed(0,HX_("by",d7,55,00,00),serverIdBy)
             				->setFixed(1,HX_("id",db,5b,00,00),serverId)
             				->setFixed(2,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:sid:0",a8,4b,37,54))))->up();
             		}
-HXLINE(1721)		inviteExt->up();
-HXLINE(1722)		chat->uiState = 3;
-HXLINE(1723)		this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat));
-HXLINE(1724)		::Dynamic _hx_tmp2 = this->persistence;
-HXDLIN(1724)		::borogove::Persistence_obj::storeChats(_hx_tmp2,this->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat));
+HXLINE(1852)		inviteExt->up();
+HXLINE(1853)		chat->uiState = 3;
+HXLINE(1854)		this->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,chat));
+HXLINE(1855)		::Dynamic _hx_tmp2 = this->persistence;
+HXDLIN(1855)		::borogove::Persistence_obj::storeChats(_hx_tmp2,this->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,chat));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC8(Client_obj,mucInvite,(void))
 
 void Client_obj::serverBlocked(::String blocked){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1727_serverBlocked)
-HXLINE(1728)		 ::borogove::Chat chat;
-HXDLIN(1728)		 ::borogove::Chat tmp = this->getChat(blocked);
-HXDLIN(1728)		if (::hx::IsNotNull( tmp )) {
-HXLINE(1728)			chat = tmp;
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1858_serverBlocked)
+HXLINE(1859)		 ::borogove::Chat chat;
+HXDLIN(1859)		 ::borogove::Chat tmp = this->getChat(blocked);
+HXDLIN(1859)		if (::hx::IsNotNull( tmp )) {
+HXLINE(1859)			chat = tmp;
             		}
             		else {
-HXLINE(1728)			chat = this->getDirectChat(blocked,false);
+HXLINE(1859)			chat = this->getDirectChat(blocked,false);
             		}
-HXLINE(1729)		chat->block(false,null(),false);
+HXLINE(1860)		chat->block(false,null(),false);
             	}
 
 
@@ -5095,201 +5323,236 @@ HX_DEFINE_DYNAMIC_FUNC1(Client_obj,serverBlocked,(void))
 void Client_obj::bookmarksGet( ::Dynamic callback){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis, ::borogove::queries::BlocklistGet,blockingGet) HXARGC(0)
             		void _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1736_bookmarksGet)
-HXLINE(1736)			int _g = 0;
-HXDLIN(1736)			::Array< ::String > _g1 = blockingGet->getResult();
-HXDLIN(1736)			while((_g < _g1->length)){
-HXLINE(1736)				::String blocked = _g1->__get(_g);
-HXDLIN(1736)				_g = (_g + 1);
-HXLINE(1737)				_gthis->serverBlocked(blocked);
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1867_bookmarksGet)
+HXLINE(1867)			int _g = 0;
+HXDLIN(1867)			::Array< ::String > _g1 = blockingGet->getResult();
+HXDLIN(1867)			while((_g < _g1->length)){
+HXLINE(1867)				::String blocked = _g1->__get(_g);
+HXDLIN(1867)				_g = (_g + 1);
+HXLINE(1868)				_gthis->serverBlocked(blocked);
             			}
             		}
             		HX_END_LOCAL_FUNC0((void))
 
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_5, ::borogove::Client,_gthis, ::borogove::queries::PubsubGet,mdsGet) HXARGC(0)
             		void _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1743_bookmarksGet)
-HXLINE(1744)			::Array< ::Dynamic> chatsToUpdate = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1745)			{
-HXLINE(1745)				int _g = 0;
-HXDLIN(1745)				::Array< ::Dynamic> _g1 = mdsGet->getResult();
-HXDLIN(1745)				while((_g < _g1->length)){
-HXLINE(1745)					 ::borogove::Stanza item = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
-HXDLIN(1745)					_g = (_g + 1);
-HXLINE(1746)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) ) )) {
-HXLINE(1747)						 ::borogove::Stanza tmp = item->getChild(HX_("displayed",21,17,db,c1),HX_("urn:xmpp:mds:displayed:0",bd,60,cc,fb));
-HXDLIN(1747)						 ::borogove::Stanza upTo;
-HXDLIN(1747)						if (::hx::IsNotNull( tmp )) {
-HXLINE(1747)							upTo = tmp->getChild(HX_("stanza-id",73,8a,54,e9),HX_("urn:xmpp:sid:0",a8,4b,37,54));
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1874_bookmarksGet)
+HXLINE(1875)			::Array< ::Dynamic> chatsToUpdate = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1876)			{
+HXLINE(1876)				int _g = 0;
+HXDLIN(1876)				::Array< ::Dynamic> _g1 = mdsGet->getResult();
+HXDLIN(1876)				while((_g < _g1->length)){
+HXLINE(1876)					 ::borogove::Stanza item = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN(1876)					_g = (_g + 1);
+HXLINE(1877)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) ) )) {
+HXLINE(1878)						 ::borogove::Stanza tmp = item->getChild(HX_("displayed",21,17,db,c1),HX_("urn:xmpp:mds:displayed:0",bd,60,cc,fb));
+HXDLIN(1878)						 ::borogove::Stanza upTo;
+HXDLIN(1878)						if (::hx::IsNotNull( tmp )) {
+HXLINE(1878)							upTo = tmp->getChild(HX_("stanza-id",73,8a,54,e9),HX_("urn:xmpp:sid:0",a8,4b,37,54));
             						}
             						else {
-HXLINE(1747)							upTo = null();
+HXLINE(1878)							upTo = null();
             						}
-HXLINE(1748)						 ::borogove::Client _gthis1 = _gthis;
-HXDLIN(1748)						 ::borogove::Chat chat = _gthis1->getChat(( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) ));
-HXLINE(1749)						if (::hx::IsNull( chat )) {
+HXLINE(1879)						 ::borogove::Client _gthis1 = _gthis;
+HXDLIN(1879)						 ::borogove::Chat chat = _gthis1->getChat(( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) ));
+HXLINE(1880)						if (::hx::IsNull( chat )) {
             							HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             							int _hx_run( ::borogove::Caps _){
-            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1750_bookmarksGet)
-HXLINE(1750)								return 2;
+            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1881_bookmarksGet)
+HXLINE(1881)								return 2;
             							}
             							HX_END_LOCAL_FUNC1(return)
 
             							HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::borogove::Stanza,upTo) HXARGC(1)
             							void _hx_run( ::borogove::Chat chat){
-            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1750_bookmarksGet)
-HXLINE(1750)								::String _hx_tmp = ( (::String)(::Reflect_obj::field(upTo->attr,HX_("id",db,5b,00,00))) );
-HXDLIN(1750)								chat->markReadUpToId(_hx_tmp,( (::String)(::Reflect_obj::field(upTo->attr,HX_("by",d7,55,00,00))) ));
+            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1881_bookmarksGet)
+HXLINE(1881)								::String _hx_tmp = ( (::String)(::Reflect_obj::field(upTo->attr,HX_("id",db,5b,00,00))) );
+HXDLIN(1881)								chat->markReadUpToId(_hx_tmp,( (::String)(::Reflect_obj::field(upTo->attr,HX_("by",d7,55,00,00))) ),null());
             							}
             							HX_END_LOCAL_FUNC1((void))
 
-HXLINE(1750)							 ::borogove::Client _gthis2 = _gthis;
-HXDLIN(1750)							_gthis2->startChatWith(( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) ), ::Dynamic(new _hx_Closure_1()), ::Dynamic(new _hx_Closure_2(upTo)));
+HXLINE(1881)							 ::borogove::Client _gthis2 = _gthis;
+HXDLIN(1881)							_gthis2->startChatWith(( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) ), ::Dynamic(new _hx_Closure_1()), ::Dynamic(new _hx_Closure_2(upTo)));
             						}
             						else {
             							HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_3) HXARGC(1)
             							::Dynamic _hx_run( ::Dynamic _){
-            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1752_bookmarksGet)
-HXLINE(1752)								return null();
+            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1883_bookmarksGet)
+HXLINE(1883)								return null();
             							}
             							HX_END_LOCAL_FUNC1(return)
 
             							HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_4) HXARGC(1)
             							::Dynamic _hx_run( ::Dynamic e){
-            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1752_bookmarksGet)
-HXLINE(1752)								if (::hx::IsNotNull( e )) {
-HXLINE(1752)									return ::thenshim::_Promise::Promise_Impl__obj::reject(e);
+            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1883_bookmarksGet)
+HXLINE(1883)								if (::hx::IsNotNull( e )) {
+HXLINE(1883)									return ::thenshim::_Promise::Promise_Impl__obj::reject(e);
             								}
             								else {
-HXLINE(1752)									return null();
+HXLINE(1883)									return null();
             								}
-HXDLIN(1752)								return null();
+HXDLIN(1883)								return null();
             							}
             							HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1752)							::String _hx_tmp = ( (::String)(::Reflect_obj::field(upTo->attr,HX_("id",db,5b,00,00))) );
-HXDLIN(1752)							::thenshim::_Promise::Promise_Impl__obj::then(chat->markReadUpToId(_hx_tmp,( (::String)(::Reflect_obj::field(upTo->attr,HX_("by",d7,55,00,00))) )), ::Dynamic(new _hx_Closure_3()), ::Dynamic(new _hx_Closure_4()));
-HXLINE(1753)							chatsToUpdate->push(chat);
+HXLINE(1883)							::String _hx_tmp = ( (::String)(::Reflect_obj::field(upTo->attr,HX_("id",db,5b,00,00))) );
+HXDLIN(1883)							::thenshim::_Promise::Promise_Impl__obj::then(chat->markReadUpToId(_hx_tmp,( (::String)(::Reflect_obj::field(upTo->attr,HX_("by",d7,55,00,00))) ),false), ::Dynamic(new _hx_Closure_3()), ::Dynamic(new _hx_Closure_4()));
+HXLINE(1884)							chatsToUpdate->push(chat);
             						}
             					}
             				}
             			}
-HXLINE(1757)			::Dynamic _gthis3 = _gthis->persistence;
-HXDLIN(1757)			::borogove::Persistence_obj::storeChats(_gthis3,_gthis->accountId(),chatsToUpdate);
+HXLINE(1888)			::Dynamic _gthis3 = _gthis->persistence;
+HXDLIN(1888)			::borogove::Persistence_obj::storeChats(_gthis3,_gthis->accountId(),chatsToUpdate);
             		}
             		HX_END_LOCAL_FUNC0((void))
 
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_8, ::borogove::Client,_gthis, ::borogove::queries::PubsubGet,pubsubGet, ::Dynamic,callback) HXARGC(0)
             		void _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1762_bookmarksGet)
-HXLINE(1763)			::Array< ::Dynamic> chatsToUpdate = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1764)			{
-HXLINE(1764)				int _g = 0;
-HXDLIN(1764)				::Array< ::Dynamic> _g1 = pubsubGet->getResult();
-HXDLIN(1764)				while((_g < _g1->length)){
-HXLINE(1764)					 ::borogove::Stanza item = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
-HXDLIN(1764)					_g = (_g + 1);
-HXLINE(1765)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) ) )) {
-HXLINE(1766)						 ::borogove::Client _gthis1 = _gthis;
-HXDLIN(1766)						 ::borogove::Chat chat = _gthis1->getChat(( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) ));
-HXLINE(1767)						if (::hx::IsNull( chat )) {
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1893_bookmarksGet)
+HXLINE(1894)			::Array< ::Dynamic> chatsToUpdate = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1895)			{
+HXLINE(1895)				int _g = 0;
+HXDLIN(1895)				::Array< ::Dynamic> _g1 = pubsubGet->getResult();
+HXDLIN(1895)				while((_g < _g1->length)){
+HXLINE(1895)					 ::borogove::Stanza item = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN(1895)					_g = (_g + 1);
+HXLINE(1896)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) ) )) {
+HXLINE(1897)						 ::borogove::Client _gthis1 = _gthis;
+HXDLIN(1897)						 ::borogove::Chat chat = _gthis1->getChat(( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) ));
+HXLINE(1898)						if (::hx::IsNull( chat )) {
             							HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_6, ::borogove::Stanza,item) HXARGC(1)
             							int _hx_run( ::borogove::Caps caps){
-            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1770_bookmarksGet)
-HXLINE(1771)								if (::hx::IsNull( caps )) {
-HXLINE(1771)									return 1;
+            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1901_bookmarksGet)
+HXLINE(1902)								if (::hx::IsNull( caps )) {
+HXLINE(1902)									return 1;
             								}
-HXLINE(1773)								 ::borogove::Identity identity = caps->identities->__get(0).StaticCast<  ::borogove::Identity >();
-HXLINE(1774)								 ::borogove::Stanza conf = item->getChild(HX_("conference",1c,2b,83,41),HX_("urn:xmpp:bookmarks:1",58,3c,53,7d));
-HXLINE(1775)								if (::hx::IsNull( ( (::String)(::Reflect_obj::field(conf->attr,HX_("name",4b,72,ff,48))) ) )) {
-HXLINE(1776)									::String value;
-HXDLIN(1776)									if (::hx::IsNotNull( identity )) {
-HXLINE(1776)										value = identity->name;
+HXLINE(1904)								 ::borogove::Identity identity = caps->identities->__get(0).StaticCast<  ::borogove::Identity >();
+HXLINE(1905)								 ::borogove::Stanza conf = item->getChild(HX_("conference",1c,2b,83,41),HX_("urn:xmpp:bookmarks:1",58,3c,53,7d));
+HXLINE(1906)								if (::hx::IsNull( ( (::String)(::Reflect_obj::field(conf->attr,HX_("name",4b,72,ff,48))) ) )) {
+HXLINE(1907)									::String value;
+HXDLIN(1907)									if (::hx::IsNotNull( identity )) {
+HXLINE(1907)										value = identity->name;
             									}
             									else {
-HXLINE(1776)										value = null();
+HXLINE(1907)										value = null();
             									}
-HXDLIN(1776)									::Reflect_obj::setField(conf->attr,HX_("name",4b,72,ff,48),value);
+HXDLIN(1907)									::Reflect_obj::setField(conf->attr,HX_("name",4b,72,ff,48),value);
             								}
-HXLINE(1778)								bool _hx_tmp;
-HXDLIN(1778)								bool _hx_tmp1;
-HXDLIN(1778)								if ((( (::String)(::Reflect_obj::field(conf->attr,HX_("autojoin",d9,f6,b1,3e))) ) != HX_("1",31,00,00,00))) {
-HXLINE(1778)									_hx_tmp1 = (( (::String)(::Reflect_obj::field(conf->attr,HX_("autojoin",d9,f6,b1,3e))) ) == HX_("true",4e,a7,03,4d));
+HXLINE(1909)								bool _hx_tmp;
+HXDLIN(1909)								bool _hx_tmp1;
+HXDLIN(1909)								if ((( (::String)(::Reflect_obj::field(conf->attr,HX_("autojoin",d9,f6,b1,3e))) ) != HX_("1",31,00,00,00))) {
+HXLINE(1909)									_hx_tmp1 = (( (::String)(::Reflect_obj::field(conf->attr,HX_("autojoin",d9,f6,b1,3e))) ) == HX_("true",4e,a7,03,4d));
             								}
             								else {
-HXLINE(1778)									_hx_tmp1 = true;
+HXLINE(1909)									_hx_tmp1 = true;
             								}
-HXDLIN(1778)								if (!(_hx_tmp1)) {
-HXLINE(1778)									_hx_tmp = !(caps->isChannel(( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) )));
+HXDLIN(1909)								if (!(_hx_tmp1)) {
+HXLINE(1909)									_hx_tmp = !(caps->isChannel(( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) )));
             								}
             								else {
-HXLINE(1778)									_hx_tmp = true;
+HXLINE(1909)									_hx_tmp = true;
             								}
-HXDLIN(1778)								if (_hx_tmp) {
-HXLINE(1778)									return 1;
+HXDLIN(1909)								if (_hx_tmp) {
+HXLINE(1909)									return 1;
             								}
             								else {
-HXLINE(1778)									return 2;
+HXLINE(1909)									return 2;
             								}
-HXDLIN(1778)								return null();
+HXDLIN(1909)								return null();
             							}
             							HX_END_LOCAL_FUNC1(return)
 
             							HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_7, ::borogove::Stanza,item) HXARGC(1)
             							void _hx_run( ::borogove::Chat chat){
-            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1781_bookmarksGet)
-HXLINE(1781)								chat->updateFromBookmark(item);
+            								HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1912_bookmarksGet)
+HXLINE(1912)								chat->updateFromBookmark(item);
             							}
             							HX_END_LOCAL_FUNC1((void))
 
-HXLINE(1768)							 ::borogove::Client _gthis2 = _gthis;
-HXDLIN(1768)							_gthis2->startChatWith(( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) ), ::Dynamic(new _hx_Closure_6(item)), ::Dynamic(new _hx_Closure_7(item)));
+HXLINE(1899)							 ::borogove::Client _gthis2 = _gthis;
+HXDLIN(1899)							_gthis2->startChatWith(( (::String)(::Reflect_obj::field(item->attr,HX_("id",db,5b,00,00))) ), ::Dynamic(new _hx_Closure_6(item)), ::Dynamic(new _hx_Closure_7(item)));
             						}
             						else {
-HXLINE(1785)							chat->updateFromBookmark(item);
-HXLINE(1786)							chatsToUpdate->push(chat);
+HXLINE(1916)							chat->updateFromBookmark(item);
+HXLINE(1917)							chatsToUpdate->push(chat);
             						}
             					}
             				}
             			}
-HXLINE(1790)			::Dynamic _gthis3 = _gthis->persistence;
-HXDLIN(1790)			::borogove::Persistence_obj::storeChats(_gthis3,_gthis->accountId(),chatsToUpdate);
-HXLINE(1791)			callback();
+HXLINE(1921)			::Dynamic _gthis3 = _gthis->persistence;
+HXDLIN(1921)			::borogove::Persistence_obj::storeChats(_gthis3,_gthis->accountId(),chatsToUpdate);
+HXLINE(1922)			callback();
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1733_bookmarksGet)
-HXDLIN(1733)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1734)		 ::borogove::queries::BlocklistGet blockingGet =  ::borogove::queries::BlocklistGet_obj::__alloc( HX_CTX );
-HXLINE(1735)		blockingGet->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,blockingGet)));
-HXLINE(1740)		this->sendQuery(blockingGet);
-HXLINE(1742)		 ::borogove::queries::PubsubGet mdsGet =  ::borogove::queries::PubsubGet_obj::__alloc( HX_CTX ,null(),HX_("urn:xmpp:mds:displayed:0",bd,60,cc,fb),null());
-HXLINE(1743)		mdsGet->onFinished( ::Dynamic(new _hx_Closure_5(_gthis,mdsGet)));
-HXLINE(1759)		this->sendQuery(mdsGet);
-HXLINE(1761)		 ::borogove::queries::PubsubGet pubsubGet =  ::borogove::queries::PubsubGet_obj::__alloc( HX_CTX ,null(),HX_("urn:xmpp:bookmarks:1",58,3c,53,7d),null());
-HXLINE(1762)		pubsubGet->onFinished( ::Dynamic(new _hx_Closure_8(_gthis,pubsubGet,callback)));
-HXLINE(1793)		this->sendQuery(pubsubGet);
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1864_bookmarksGet)
+HXDLIN(1864)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1865)		 ::borogove::queries::BlocklistGet blockingGet =  ::borogove::queries::BlocklistGet_obj::__alloc( HX_CTX );
+HXLINE(1866)		blockingGet->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,blockingGet)));
+HXLINE(1871)		this->sendQuery(blockingGet);
+HXLINE(1873)		 ::borogove::queries::PubsubGet mdsGet =  ::borogove::queries::PubsubGet_obj::__alloc( HX_CTX ,null(),HX_("urn:xmpp:mds:displayed:0",bd,60,cc,fb),null());
+HXLINE(1874)		mdsGet->onFinished( ::Dynamic(new _hx_Closure_5(_gthis,mdsGet)));
+HXLINE(1890)		this->sendQuery(mdsGet);
+HXLINE(1892)		 ::borogove::queries::PubsubGet pubsubGet =  ::borogove::queries::PubsubGet_obj::__alloc( HX_CTX ,null(),HX_("urn:xmpp:bookmarks:1",58,3c,53,7d),null());
+HXLINE(1893)		pubsubGet->onFinished( ::Dynamic(new _hx_Closure_8(_gthis,pubsubGet,callback)));
+HXLINE(1924)		this->sendQuery(pubsubGet);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Client_obj,bookmarksGet,(void))
 
+void Client_obj::checkForReceipts( ::borogove::Stanza stanza){
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1927_checkForReceipts)
+HXDLIN(1927)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1928)		{
+HXLINE(1928)			int _g = 0;
+HXDLIN(1928)			::Array< ::Dynamic> _g1 = stanza->allTags(HX_("received",21,45,fd,e2),HX_("urn:xmpp:receipts",d7,40,8f,8c));
+HXDLIN(1928)			while((_g < _g1->length)){
+HXLINE(1928)				 ::borogove::Stanza receipt = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN(1928)				_g = (_g + 1);
+HXLINE(1929)				::String id = ( (::String)(::Reflect_obj::field(receipt->attr,HX_("id",db,5b,00,00))) );
+HXLINE(1930)				if (::hx::IsNotNull( id )) {
+            					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis) HXARGC(1)
+            					void _hx_run( ::borogove::ChatMessage m){
+            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1936_checkForReceipts)
+HXLINE(1936)						_gthis->notifyMessageHandlers(m,3);
+            					}
+            					HX_END_LOCAL_FUNC1((void))
+
+            					HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
+            					::Dynamic _hx_run( ::Dynamic _){
+            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1936_checkForReceipts)
+HXLINE(1936)						return null();
+            					}
+            					HX_END_LOCAL_FUNC1(return)
+
+HXLINE(1931)					::Dynamic _hx_tmp = this->persistence;
+HXDLIN(1931)					::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::updateMessageStatus(_hx_tmp,this->accountId(),id,2,null()), ::Dynamic(new _hx_Closure_0(_gthis)), ::Dynamic(new _hx_Closure_1()));
+            				}
+            			}
+            		}
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(Client_obj,checkForReceipts,(void))
+
 void Client_obj::sync( ::Dynamic callback){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1796_sync)
-HXDLIN(1796)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1797)		if (::Std_obj::isOfType(this->persistence,::hx::ClassOf< ::borogove::persistence::Dummy >())) {
-HXLINE(1798)			callback(true);
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1941_sync)
+HXDLIN(1941)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1942)		if (::Std_obj::isOfType(this->persistence,::hx::ClassOf< ::borogove::persistence::Dummy >())) {
+HXLINE(1943)			callback(true);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::Client,_gthis, ::Dynamic,callback) HXARGC(1)
-            			void _hx_run(::String lastId){
-            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1800_sync)
-HXLINE(1800)				_gthis->doSync(callback,lastId);
+            			void _hx_run( ::borogove::ChatMessage point){
+            				HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1945_sync)
+HXLINE(1945)				_gthis->doSync(callback,point,null());
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXLINE(1800)			::Dynamic _hx_tmp = this->persistence;
-HXDLIN(1800)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::lastId(_hx_tmp,this->accountId(),null()), ::Dynamic(new _hx_Closure_0(_gthis,callback)),null());
+HXLINE(1945)			::Dynamic _hx_tmp = this->persistence;
+HXDLIN(1945)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::syncPoint(_hx_tmp,this->accountId(),null()), ::Dynamic(new _hx_Closure_0(_gthis,callback)),null());
             		}
             	}
 
@@ -5297,85 +5560,86 @@ HXDLIN(1800)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persist
 HX_DEFINE_DYNAMIC_FUNC1(Client_obj,sync,(void))
 
 void Client_obj::onMAMJMI(::String sid, ::borogove::Stanza stanza){
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1805_onMAMJMI)
-HXLINE(1806)		if (::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
-HXLINE(1806)			return;
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1950_onMAMJMI)
+HXLINE(1951)		if (::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ) )) {
+HXLINE(1951)			return;
             		}
-HXLINE(1807)		 ::borogove::JID from = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
-HXLINE(1808)		 ::borogove::DirectChat chat = this->getDirectChat(from->asBare()->asString(),null());
-HXLINE(1809)		if (chat->jingleSessions->exists(sid)) {
-HXLINE(1809)			return;
+HXLINE(1952)		 ::borogove::JID from = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
+HXLINE(1953)		 ::borogove::DirectChat chat = this->getDirectChat(from->asBare()->asString(),null());
+HXLINE(1954)		if (chat->jingleSessions->exists(sid)) {
+HXLINE(1954)			return;
             		}
-HXLINE(1811)		if (::hx::IsNull( stanza->getChild(HX_("propose",fe,fe,e9,f9),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07)) )) {
-HXLINE(1811)			return;
+HXLINE(1956)		if (::hx::IsNull( stanza->getChild(HX_("propose",fe,fe,e9,f9),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07)) )) {
+HXLINE(1956)			return;
             		}
-HXLINE(1812)		 ::borogove::calls::IncomingProposedSession session =  ::borogove::calls::IncomingProposedSession_obj::__alloc( HX_CTX ,::hx::ObjectPtr<OBJ_>(this),from,sid);
-HXLINE(1813)		{
-HXLINE(1813)			::Dynamic this1 = chat->jingleSessions;
-HXDLIN(1813)			( ( ::haxe::ds::StringMap)(this1) )->set(session->get_sid(),session);
+HXLINE(1957)		 ::borogove::calls::IncomingProposedSession session =  ::borogove::calls::IncomingProposedSession_obj::__alloc( HX_CTX ,::hx::ObjectPtr<OBJ_>(this),from,sid);
+HXLINE(1958)		{
+HXLINE(1958)			::Dynamic this1 = chat->jingleSessions;
+HXDLIN(1958)			( ( ::haxe::ds::StringMap)(this1) )->set(session->get_sid(),session);
             		}
-HXLINE(1814)		this->chatActivity(chat,null());
-HXLINE(1815)		session->ring();
+HXLINE(1959)		this->chatActivity(chat,null());
+HXLINE(1960)		session->ring();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Client_obj,onMAMJMI,(void))
 
-void Client_obj::doSync( ::Dynamic callback,::String lastId){
+void Client_obj::doSync( ::Dynamic callback, ::borogove::ChatMessage syncPoint,::String sortA){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(2)
             		 ::borogove::ChatMessageBuilder _hx_run( ::borogove::ChatMessageBuilder builder, ::borogove::Stanza stanza){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1829_doSync)
-HXLINE(1830)			builder->syncPoint = true;
-HXLINE(1831)			return builder;
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1975_doSync)
+HXLINE(1976)			builder->syncPoint = true;
+HXLINE(1977)			return builder;
             		}
             		HX_END_LOCAL_FUNC2(return)
 
-            		HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_8, ::borogove::Client,_gthis, ::haxe::ds::StringMap,chatIds, ::borogove::MessageSync,sync1, ::Dynamic,callback) HXARGC(1)
+            		HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_8, ::borogove::MessageSync,sync2, ::borogove::Client,_gthis, ::haxe::ds::StringMap,chatIds, ::Dynamic,callback) HXARGC(1)
             		void _hx_run( ::Dynamic messageList){
-            			HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_6, ::borogove::Client,_gthis, ::haxe::ds::StringMap,chatIds, ::borogove::MessageSync,sync1, ::Dynamic,callback) HXARGC(1)
+            			HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_6, ::borogove::MessageSync,sync2, ::borogove::Client,_gthis, ::haxe::ds::StringMap,chatIds, ::Dynamic,callback) HXARGC(1)
             			void _hx_run(::Array< ::Dynamic> results){
-            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1865_doSync)
-HXLINE(1866)				{
-HXLINE(1866)					int _g = 0;
-HXDLIN(1866)					while((_g < results->length)){
-HXLINE(1866)						::Array< ::Dynamic> messages = results->__get(_g).StaticCast< ::Array< ::Dynamic> >();
-HXDLIN(1866)						_g = (_g + 1);
-HXLINE(1867)						if (::hx::IsNotNull( messages )) {
-HXLINE(1868)							int _g1 = 0;
-HXDLIN(1868)							while((_g1 < messages->length)){
-HXLINE(1868)								 ::borogove::ChatMessage message = messages->__get(_g1).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN(1868)								_g1 = (_g1 + 1);
-HXLINE(1869)								_gthis->trigger(HX_("message/sync",e3,76,a8,1f),message);
+            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_2013_doSync)
+HXLINE(2014)				{
+HXLINE(2014)					int _g = 0;
+HXDLIN(2014)					while((_g < results->length)){
+HXLINE(2014)						::Array< ::Dynamic> messages = results->__get(_g).StaticCast< ::Array< ::Dynamic> >();
+HXDLIN(2014)						_g = (_g + 1);
+HXLINE(2015)						if (::hx::IsNotNull( messages )) {
+HXLINE(2016)							int _g1 = 0;
+HXDLIN(2016)							while((_g1 < messages->length)){
+HXLINE(2016)								 ::borogove::ChatMessage message = messages->__get(_g1).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN(2016)								_g1 = (_g1 + 1);
+HXLINE(2017)								_gthis->notifySyncMessageHandlers(message);
+HXLINE(2018)								_gthis->sortId = message->sortId;
             							}
             						}
             					}
             				}
-HXLINE(1874)				if (sync1->hasMore()) {
-HXLINE(1875)					sync1->fetchNext();
+HXLINE(2023)				if (sync2->hasMore()) {
+HXLINE(2024)					sync2->fetchNext();
             				}
             				else {
-HXLINE(1878)					{
-HXLINE(1878)						::Dynamic this1 = sync1->jmi;
-HXDLIN(1878)						 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this1);
-HXDLIN(1878)						while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE(1878)							::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXDLIN(1878)							 ::borogove::Stanza _g_value = ( ( ::borogove::Stanza)(::haxe::IMap_obj::get(this1,key)) );
-HXLINE(1879)							_gthis->onMAMJMI(key,_g_value);
+HXLINE(2027)					{
+HXLINE(2027)						::Dynamic this1 = sync2->jmi;
+HXDLIN(2027)						 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this1);
+HXDLIN(2027)						while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(2027)							::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN(2027)							 ::borogove::Stanza _g_value = ( ( ::borogove::Stanza)(::haxe::IMap_obj::get(this1,key)) );
+HXLINE(2028)							_gthis->onMAMJMI(key,_g_value);
             						}
             					}
-HXLINE(1882)					{
-HXLINE(1882)						::Dynamic map = chatIds;
-HXDLIN(1882)						 ::Dynamic _g_keys1 = ::haxe::IMap_obj::keys(map);
-HXDLIN(1882)						while(( (bool)(_g_keys1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE(1882)							::String key1 = ( (::String)(_g_keys1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXDLIN(1882)							::haxe::IMap_obj::get(map,key1);
-HXLINE(1885)							if (::hx::IsNull( _gthis->getChat(key1) )) {
-HXLINE(1885)								_gthis->getDirectChat(key1,null());
+HXLINE(2031)					{
+HXLINE(2031)						::Dynamic map = chatIds;
+HXDLIN(2031)						 ::Dynamic _g_keys1 = ::haxe::IMap_obj::keys(map);
+HXDLIN(2031)						while(( (bool)(_g_keys1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(2031)							::String key1 = ( (::String)(_g_keys1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN(2031)							::haxe::IMap_obj::get(map,key1);
+HXLINE(2034)							if (::hx::IsNull( _gthis->getChat(key1) )) {
+HXLINE(2034)								_gthis->getDirectChat(key1,null());
             							}
             						}
             					}
-HXLINE(1887)					if (::hx::IsNotNull( callback )) {
-HXLINE(1887)						callback(true);
+HXLINE(2036)					if (::hx::IsNotNull( callback )) {
+HXLINE(2036)						callback(true);
             					}
             				}
             			}
@@ -5383,104 +5647,108 @@ HXLINE(1887)						callback(true);
 
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_7, ::Dynamic,callback) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1890_doSync)
-HXLINE(1891)				 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN(1891)				::String _hx_tmp1;
-HXDLIN(1891)				if (::hx::IsNull( e )) {
-HXLINE(1891)					_hx_tmp1 = HX_("null",87,9e,0e,49);
+            				HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_2039_doSync)
+HXLINE(2040)				 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN(2040)				::String _hx_tmp1;
+HXDLIN(2040)				if (::hx::IsNull( e )) {
+HXLINE(2040)					_hx_tmp1 = HX_("null",87,9e,0e,49);
             				}
             				else {
-HXLINE(1891)					_hx_tmp1 = ::Std_obj::string(e);
+HXLINE(2040)					_hx_tmp1 = ::Std_obj::string(e);
             				}
-HXDLIN(1891)				_hx_tmp(HX_("SYNC: error",67,8e,34,8a), ::Dynamic(::hx::Anon_obj::Create(5)
+HXDLIN(2040)				_hx_tmp(HX_("SYNC: error",67,8e,34,8a), ::Dynamic(::hx::Anon_obj::Create(5)
             					->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Client",18,dc,e6,c0))
             					->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,_hx_tmp1))
             					->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("doSync",86,5f,63,1c))
             					->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Client.hx",85,7d,15,8e))
-            					->setFixed(4,HX_("lineNumber",dd,81,22,76),1891)));
-HXLINE(1892)				callback(false);
+            					->setFixed(4,HX_("lineNumber",dd,81,22,76),2040)));
+HXLINE(2041)				callback(false);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1834_doSync)
-HXLINE(1835)			::Array< ::Dynamic> promises = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1836)			::Array< ::Dynamic> chatMessages = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1837)			{
-HXLINE(1837)				int _g = 0;
-HXDLIN(1837)				::Array< ::Dynamic> _g1 = ( (::Array< ::Dynamic>)(messageList->__Field(HX_("messages",cc,d8,fd,34),::hx::paccDynamic)) );
-HXDLIN(1837)				while((_g < _g1->length)){
-HXLINE(1837)					 ::borogove::Message m = _g1->__get(_g).StaticCast<  ::borogove::Message >();
-HXDLIN(1837)					_g = (_g + 1);
-HXLINE(1838)					{
-HXLINE(1838)						 ::borogove::MessageStanza _g2 = m->parsed;
-HXDLIN(1838)						switch((int)(_g2->_hx_getIndex())){
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1980_doSync)
+HXLINE(1981)			::Array< ::Dynamic> promises = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1982)			::Array< ::Dynamic> chatMessages = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1983)			{
+HXLINE(1983)				int _g = 0;
+HXDLIN(1983)				::Array< ::Dynamic> _g1 = ( (::Array< ::Dynamic>)(messageList->__Field(HX_("messages",cc,d8,fd,34),::hx::paccDynamic)) );
+HXDLIN(1983)				while((_g < _g1->length)){
+HXLINE(1983)					 ::borogove::Message m = _g1->__get(_g).StaticCast<  ::borogove::Message >();
+HXDLIN(1983)					_g = (_g + 1);
+HXLINE(1984)					{
+HXLINE(1984)						 ::borogove::MessageStanza _g2 = m->parsed;
+HXDLIN(1984)						switch((int)(_g2->_hx_getIndex())){
             							case (int)0: {
             								HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             								::Array< ::Dynamic> _hx_run( ::borogove::ChatMessage m){
-            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1856_doSync)
-HXLINE(1856)									return ::Array_obj< ::Dynamic>::__new(1)->init(0,m);
+            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_2002_doSync)
+HXLINE(2002)									return ::Array_obj< ::Dynamic>::__new(1)->init(0,m);
             								}
             								HX_END_LOCAL_FUNC1(return)
 
             								HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(1)
             								::Array< ::Dynamic> _hx_run( ::Dynamic _){
-            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1856_doSync)
-HXLINE(1856)									return ::Array_obj< ::Dynamic>::__new(0);
+            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_2002_doSync)
+HXLINE(2002)									return ::Array_obj< ::Dynamic>::__new(0);
             								}
             								HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1851)								::Dynamic _gthis1 = _gthis->persistence;
-HXLINE(1852)								::String _hx_tmp = _gthis->accountId();
-HXLINE(1851)								promises->push(::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::updateMessageStatus(_gthis1,_hx_tmp,_g2->_hx_getString(0),3,_g2->_hx_getObject(1).StaticCast<  ::borogove::Stanza >()->getErrorText()), ::Dynamic(new _hx_Closure_1()), ::Dynamic(new _hx_Closure_2())));
+HXLINE(1997)								::Dynamic _gthis1 = _gthis->persistence;
+HXLINE(1998)								::String _hx_tmp = _gthis->accountId();
+HXLINE(1997)								promises->push(::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::updateMessageStatus(_gthis1,_hx_tmp,_g2->_hx_getString(0),3,_g2->_hx_getObject(1).StaticCast<  ::borogove::Stanza >()->getErrorText()), ::Dynamic(new _hx_Closure_1()), ::Dynamic(new _hx_Closure_2())));
             							}
             							break;
             							case (int)1: {
-HXLINE(1839)								 ::borogove::ChatMessage _g3 = _g2->_hx_getObject(0).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN(1839)								{
-HXLINE(1840)									chatMessages->push(_g3);
-HXLINE(1841)									if ((_g3->type == 0)) {
-HXLINE(1841)										::String k = _g3->chatId();
-HXDLIN(1841)										chatIds->set(k,true);
+HXLINE(1985)								 ::borogove::ChatMessage _g3 = _g2->_hx_getObject(0).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN(1985)								{
+HXLINE(1986)									chatMessages->push(_g3);
+HXLINE(1987)									if ((_g3->type == 0)) {
+HXLINE(1987)										::String k = _g3->chatId();
+HXDLIN(1987)										chatIds->set(k,true);
             									}
             								}
             							}
             							break;
-            							case (int)2: {
+            							case (int)3: {
             								HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_4, ::borogove::Client,_gthis, ::borogove::ModerationAction,action) HXARGC(2)
             								void _hx_run( ::Dynamic resolve, ::Dynamic reject){
             									HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_3, ::Dynamic,resolve) HXARGC(1)
             									void _hx_run( ::borogove::ChatMessage _){
-            										HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1848_doSync)
-HXLINE(1848)										resolve(null());
+            										HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1994_doSync)
+HXLINE(1994)										resolve(null());
             									}
             									HX_END_LOCAL_FUNC1((void))
 
-            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1848_doSync)
-HXLINE(1848)									::thenshim::_Promise::Promise_Impl__obj::then(_gthis->moderateMessage(action), ::Dynamic(new _hx_Closure_3(resolve)),null());
+            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1994_doSync)
+HXLINE(1994)									::thenshim::_Promise::Promise_Impl__obj::then(_gthis->moderateMessage(action), ::Dynamic(new _hx_Closure_3(resolve)),null());
             								}
             								HX_END_LOCAL_FUNC2((void))
 
-HXLINE(1846)								 ::borogove::ModerationAction action = _g2->_hx_getObject(0).StaticCast<  ::borogove::ModerationAction >();
-HXLINE(1847)								promises->push(::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_4(_gthis,action))));
+HXLINE(1992)								 ::borogove::ModerationAction action = _g2->_hx_getObject(0).StaticCast<  ::borogove::ModerationAction >();
+HXLINE(1993)								promises->push(::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_4(_gthis,action))));
             							}
             							break;
-            							case (int)3: {
+            							case (int)4: {
             								HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_5) HXARGC(1)
             								::Dynamic _hx_run( ::borogove::ChatMessage _){
-            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1844_doSync)
-HXLINE(1844)									return null();
+            									HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1990_doSync)
+HXLINE(1990)									return null();
             								}
             								HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1844)								::Dynamic _gthis2 = _gthis->persistence;
-HXLINE(1843)								promises->push(::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_gthis2,_gthis->accountId(),_g2->_hx_getObject(0).StaticCast<  ::borogove::ReactionUpdate >()), ::Dynamic(new _hx_Closure_5()),null()));
+HXLINE(1990)								::Dynamic _gthis2 = _gthis->persistence;
+HXLINE(1989)								promises->push(::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_gthis2,_gthis->accountId(),_g2->_hx_getObject(0).StaticCast<  ::borogove::ReactionUpdate >()), ::Dynamic(new _hx_Closure_5()),null()));
             							}
             							break;
-            							case (int)4: {
-HXLINE(1858)								 ::borogove::Client _gthis3 = _gthis;
-HXDLIN(1858)								::String m1 = m->chatId;
-HXDLIN(1858)								 ::borogove::Chat _hx_tmp1 = _gthis->getChat(m->chatId);
-HXDLIN(1858)								_gthis3->mucInvite(m1,_hx_tmp1,m->senderId,m->threadId,_g2->_hx_getString(0),_g2->_hx_getString(1),_g2->_hx_getString(2),_g2->_hx_getString(3));
+            							case (int)5: {
+HXLINE(2004)								 ::borogove::Client _gthis3 = _gthis;
+HXDLIN(2004)								::String m1 = m->chatId;
+HXDLIN(2004)								 ::borogove::Chat _hx_tmp1 = _gthis->getChat(m->chatId);
+HXDLIN(2004)								_gthis3->mucInvite(m1,_hx_tmp1,m->senderId,m->threadId,_g2->_hx_getString(0),_g2->_hx_getString(1),_g2->_hx_getString(2),_g2->_hx_getString(3));
+            							}
+            							break;
+            							case (int)6: {
+HXLINE(2006)								_gthis->checkForReceipts(_g2->_hx_getObject(0).StaticCast<  ::borogove::Stanza >());
             							}
             							break;
             							default:{
@@ -5489,82 +5757,92 @@ HXDLIN(1858)								_gthis3->mucInvite(m1,_hx_tmp1,m->senderId,m->threadId,_g2->
             					}
             				}
             			}
-HXLINE(1863)			::Dynamic _gthis4 = _gthis->persistence;
-HXDLIN(1863)			promises->push(::borogove::Persistence_obj::storeMessages(_gthis4,_gthis->accountId(),chatMessages));
-HXLINE(1864)			::haxe::Log_obj::trace(HX_("SYNC: MAM page wait for writes",ad,4c,95,21),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),1864,HX_("borogove.Client",18,dc,e6,c0),HX_("doSync",86,5f,63,1c)));
-HXLINE(1865)			::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(promises), ::Dynamic(new _hx_Closure_6(_gthis,chatIds,sync1,callback)), ::Dynamic(new _hx_Closure_7(callback)));
+HXLINE(2011)			promises->push(_gthis->storeMessages(chatMessages));
+HXLINE(2012)			::haxe::Log_obj::trace(HX_("SYNC: MAM page wait for writes",ad,4c,95,21),::hx::SourceInfo(HX_("borogove/Client.hx",85,7d,15,8e),2012,HX_("borogove.Client",18,dc,e6,c0),HX_("doSync",86,5f,63,1c)));
+HXLINE(2013)			::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(promises), ::Dynamic(new _hx_Closure_6(sync2,_gthis,chatIds,callback)), ::Dynamic(new _hx_Closure_7(callback)));
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_9, ::borogove::Client,_gthis,::String,lastId, ::Dynamic,callback) HXARGC(1)
+            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_9, ::borogove::Client,_gthis, ::borogove::ChatMessage,syncPoint, ::Dynamic,callback) HXARGC(1)
             		void _hx_run( ::borogove::Stanza stanza){
-            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1896_doSync)
-HXLINE(1896)			if (::hx::IsNotNull( lastId )) {
-HXLINE(1898)				_gthis->doSync(callback,null());
+            			HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_2045_doSync)
+HXLINE(2045)			if (::hx::IsNotNull( syncPoint )) {
+HXLINE(2047)				_gthis->doSync(callback,null(),syncPoint->sortId);
             			}
             			else {
-HXLINE(1900)				::haxe::Log_obj::trace(HX_("SYNC: error",67,8e,34,8a), ::Dynamic(::hx::Anon_obj::Create(5)
+HXLINE(2049)				::haxe::Log_obj::trace(HX_("SYNC: error",67,8e,34,8a), ::Dynamic(::hx::Anon_obj::Create(5)
             					->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Client",18,dc,e6,c0))
             					->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,stanza))
             					->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("doSync",86,5f,63,1c))
             					->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Client.hx",85,7d,15,8e))
-            					->setFixed(4,HX_("lineNumber",dd,81,22,76),1900)));
-HXLINE(1901)				if (::hx::IsNotNull( callback )) {
-HXLINE(1901)					callback(false);
+            					->setFixed(4,HX_("lineNumber",dd,81,22,76),2049)));
+HXLINE(2050)				if (::hx::IsNotNull( callback )) {
+HXLINE(2050)					callback(false);
             				}
             			}
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1819_doSync)
-HXDLIN(1819)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1820)		::String thirtyDaysAgo = ::borogove::Date_obj::format(::Date_obj::fromTime((::Date_obj::now()->getTime() + ((Float)-2592000000.))));
-HXLINE(1826)		 ::Dynamic sync;
-HXDLIN(1826)		if (::hx::IsNull( lastId )) {
-HXLINE(1826)			sync =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_GC_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1964_doSync)
+HXDLIN(1964)		 ::borogove::Client _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1965)		::String thirtyDaysAgo = ::borogove::Date_obj::format(::Date_obj::fromTime((::Date_obj::now()->getTime() + ((Float)-2592000000.))));
+HXLINE(1971)		 ::Dynamic sync;
+HXDLIN(1971)		if (::hx::IsNull( syncPoint )) {
+HXLINE(1971)			sync =  ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("startTime",8f,45,f0,05),thirtyDaysAgo));
             		}
             		else {
-HXLINE(1826)			sync =  ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1971)			sync =  ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("page",4f,da,51,4a), ::Dynamic(::hx::Anon_obj::Create(1)
-            					->setFixed(0,HX_("after",1c,66,a2,1d),lastId))));
-            		}
-HXLINE(1823)		 ::borogove::MessageSync sync1 =  ::borogove::MessageSync_obj::__alloc( HX_CTX ,::hx::ObjectPtr<OBJ_>(this),this->stream,sync,null());
-HXLINE(1828)		sync1->setNewestPageFirst(false);
-HXLINE(1829)		sync1->addContext( ::Dynamic(new _hx_Closure_0()));
-HXLINE(1833)		 ::haxe::ds::StringMap chatIds =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(1834)		sync1->onMessages( ::Dynamic(new _hx_Closure_8(_gthis,chatIds,sync1,callback)));
-HXLINE(1895)		sync1->onError( ::Dynamic(new _hx_Closure_9(_gthis,lastId,callback)));
-HXLINE(1904)		sync1->fetchNext();
+            					->setFixed(0,HX_("after",1c,66,a2,1d),syncPoint->serverId))));
+            		}
+HXLINE(1972)		::String sync1;
+HXDLIN(1972)		if (::hx::IsNotNull( sortA )) {
+HXLINE(1972)			sync1 = sortA;
+            		}
+            		else {
+HXLINE(1972)			if (::hx::IsNotNull( syncPoint )) {
+HXLINE(1972)				sync1 = syncPoint->sortId;
+            			}
+            			else {
+HXLINE(1972)				sync1 = null();
+            			}
+            		}
+HXLINE(1968)		 ::borogove::MessageSync sync2 =  ::borogove::MessageSync_obj::__alloc( HX_CTX ,::hx::ObjectPtr<OBJ_>(this),this->stream,sync,sync1,null(),null());
+HXLINE(1975)		sync2->addContext( ::Dynamic(new _hx_Closure_0()));
+HXLINE(1979)		 ::haxe::ds::StringMap chatIds =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(1980)		sync2->onMessages( ::Dynamic(new _hx_Closure_8(sync2,_gthis,chatIds,callback)));
+HXLINE(2044)		sync2->onError( ::Dynamic(new _hx_Closure_9(_gthis,syncPoint,callback)));
+HXLINE(2053)		sync2->fetchNext();
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Client_obj,doSync,(void))
+HX_DEFINE_DYNAMIC_FUNC3(Client_obj,doSync,(void))
 
 void Client_obj::pingAllChannels(bool refresh){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1908_pingAllChannels)
-HXDLIN(1908)		int _g = 0;
-HXDLIN(1908)		::Array< ::Dynamic> _g1 = this->getChats();
-HXDLIN(1908)		while((_g < _g1->length)){
-HXDLIN(1908)			 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
-HXDLIN(1908)			_g = (_g + 1);
-HXLINE(1909)			 ::borogove::Channel channel = ( ( ::borogove::Channel)(::Std_obj::downcast(chat,::hx::ClassOf< ::borogove::Channel >())) );
-HXLINE(1910)			if (::hx::IsNotNull( channel )) {
-HXLINE(1910)				bool _hx_tmp;
-HXDLIN(1910)				if (!(refresh)) {
-HXLINE(1910)					 ::borogove::Caps _hx_tmp1;
-HXDLIN(1910)					if (::hx::IsNotNull( channel )) {
-HXLINE(1910)						_hx_tmp1 = channel->disco;
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_2057_pingAllChannels)
+HXDLIN(2057)		int _g = 0;
+HXDLIN(2057)		::Array< ::Dynamic> _g1 = this->getChats();
+HXDLIN(2057)		while((_g < _g1->length)){
+HXDLIN(2057)			 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
+HXDLIN(2057)			_g = (_g + 1);
+HXLINE(2058)			 ::borogove::Channel channel = ( ( ::borogove::Channel)(::Std_obj::downcast(chat,::hx::ClassOf< ::borogove::Channel >())) );
+HXLINE(2059)			if (::hx::IsNotNull( channel )) {
+HXLINE(2059)				bool _hx_tmp;
+HXDLIN(2059)				if (!(refresh)) {
+HXLINE(2059)					 ::borogove::Caps _hx_tmp1;
+HXDLIN(2059)					if (::hx::IsNotNull( channel )) {
+HXLINE(2059)						_hx_tmp1 = channel->disco;
             					}
             					else {
-HXLINE(1910)						_hx_tmp1 = null();
+HXLINE(2059)						_hx_tmp1 = null();
             					}
-HXDLIN(1910)					_hx_tmp = ::hx::IsNull( _hx_tmp1 );
+HXDLIN(2059)					_hx_tmp = ::hx::IsNull( _hx_tmp1 );
             				}
             				else {
-HXLINE(1910)					_hx_tmp = true;
+HXLINE(2059)					_hx_tmp = true;
             				}
-HXDLIN(1910)				channel->selfPing(_hx_tmp);
+HXDLIN(2059)				channel->selfPing(_hx_tmp);
             			}
             		}
             	}
@@ -5573,34 +5851,34 @@ HXDLIN(1910)				channel->selfPing(_hx_tmp);
 HX_DEFINE_DYNAMIC_FUNC1(Client_obj,pingAllChannels,(void))
 
 void Client_obj::joinAllChannels(){
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1915_joinAllChannels)
-HXDLIN(1915)		int _g = 0;
-HXDLIN(1915)		::Array< ::Dynamic> _g1 = this->getChats();
-HXDLIN(1915)		while((_g < _g1->length)){
-HXDLIN(1915)			 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
-HXDLIN(1915)			_g = (_g + 1);
-HXLINE(1916)			 ::borogove::Channel channel = ( ( ::borogove::Channel)(::Std_obj::downcast(chat,::hx::ClassOf< ::borogove::Channel >())) );
-HXLINE(1917)			if (::hx::IsNotNull( channel )) {
-HXLINE(1918)				if ((channel->disco->identities->length < 1)) {
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_2064_joinAllChannels)
+HXDLIN(2064)		int _g = 0;
+HXDLIN(2064)		::Array< ::Dynamic> _g1 = this->getChats();
+HXDLIN(2064)		while((_g < _g1->length)){
+HXDLIN(2064)			 ::borogove::Chat chat = _g1->__get(_g).StaticCast<  ::borogove::Chat >();
+HXDLIN(2064)			_g = (_g + 1);
+HXLINE(2065)			 ::borogove::Channel channel = ( ( ::borogove::Channel)(::Std_obj::downcast(chat,::hx::ClassOf< ::borogove::Channel >())) );
+HXLINE(2066)			if (::hx::IsNotNull( channel )) {
+HXLINE(2067)				if ((channel->disco->identities->length < 1)) {
             					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::Channel,channel) HXARGC(0)
             					void _hx_run(){
-            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1920_joinAllChannels)
-HXLINE(1920)						channel->join();
+            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_2069_joinAllChannels)
+HXLINE(2069)						channel->join();
             					}
             					HX_END_LOCAL_FUNC0((void))
 
-HXLINE(1919)					channel->refreshDisco( ::Dynamic(new _hx_Closure_0(channel)));
+HXLINE(2068)					channel->refreshDisco( ::Dynamic(new _hx_Closure_0(channel)));
             				}
             				else {
             					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::Channel,channel) HXARGC(0)
             					void _hx_run(){
-            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_1924_joinAllChannels)
-HXLINE(1924)						channel->refreshDisco(null());
+            						HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_2073_joinAllChannels)
+HXLINE(2073)						channel->refreshDisco(null());
             					}
             					HX_END_LOCAL_FUNC0((void))
 
-HXLINE(1923)					channel->join();
-HXLINE(1924)					::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_1(channel)),30000);
+HXLINE(2072)					channel->join();
+HXLINE(2073)					::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_1(channel)),30000);
             				}
             			}
             		}
@@ -5635,15 +5913,18 @@ void Client_obj::__Mark(HX_MARK_PARAMS)
 	HX_MARK_MEMBER_NAME(jid,"jid");
 	HX_MARK_MEMBER_NAME(chats,"chats");
 	HX_MARK_MEMBER_NAME(persistence,"persistence");
+	HX_MARK_MEMBER_NAME(capsRepo,"capsRepo");
 	HX_MARK_MEMBER_NAME(caps,"caps");
 	HX_MARK_MEMBER_NAME(_displayName,"_displayName");
 	HX_MARK_MEMBER_NAME(fastMechanism,"fastMechanism");
 	HX_MARK_MEMBER_NAME(token,"token");
 	HX_MARK_MEMBER_NAME(fastCount,"fastCount");
+	HX_MARK_MEMBER_NAME(sortId,"sortId");
 	HX_MARK_MEMBER_NAME(pendingCaps,"pendingCaps");
 	HX_MARK_MEMBER_NAME(brokenAvatars,"brokenAvatars");
 	HX_MARK_MEMBER_NAME(encryptionPolicy,"encryptionPolicy");
 	HX_MARK_MEMBER_NAME(inSync,"inSync");
+	HX_MARK_MEMBER_NAME(firstSync,"firstSync");
 	HX_MARK_MEMBER_NAME(enabledPushData,"enabledPushData");
 	HX_MARK_MEMBER_NAME(lazyQueryTimer,"lazyQueryTimer");
 	HX_MARK_MEMBER_NAME(queriesToSend,"queriesToSend");
@@ -5658,15 +5939,18 @@ void Client_obj::__Visit(HX_VISIT_PARAMS)
 	HX_VISIT_MEMBER_NAME(jid,"jid");
 	HX_VISIT_MEMBER_NAME(chats,"chats");
 	HX_VISIT_MEMBER_NAME(persistence,"persistence");
+	HX_VISIT_MEMBER_NAME(capsRepo,"capsRepo");
 	HX_VISIT_MEMBER_NAME(caps,"caps");
 	HX_VISIT_MEMBER_NAME(_displayName,"_displayName");
 	HX_VISIT_MEMBER_NAME(fastMechanism,"fastMechanism");
 	HX_VISIT_MEMBER_NAME(token,"token");
 	HX_VISIT_MEMBER_NAME(fastCount,"fastCount");
+	HX_VISIT_MEMBER_NAME(sortId,"sortId");
 	HX_VISIT_MEMBER_NAME(pendingCaps,"pendingCaps");
 	HX_VISIT_MEMBER_NAME(brokenAvatars,"brokenAvatars");
 	HX_VISIT_MEMBER_NAME(encryptionPolicy,"encryptionPolicy");
 	HX_VISIT_MEMBER_NAME(inSync,"inSync");
+	HX_VISIT_MEMBER_NAME(firstSync,"firstSync");
 	HX_VISIT_MEMBER_NAME(enabledPushData,"enabledPushData");
 	HX_VISIT_MEMBER_NAME(lazyQueryTimer,"lazyQueryTimer");
 	HX_VISIT_MEMBER_NAME(queriesToSend,"queriesToSend");
@@ -5690,6 +5974,7 @@ void Client_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 6:
 		if (HX_FIELD_EQ(inName,"stream") ) { return ::hx::Val( stream ); }
+		if (HX_FIELD_EQ(inName,"sortId") ) { return ::hx::Val( sortId ); }
 		if (HX_FIELD_EQ(inName,"inSync") ) { return ::hx::Val( inSync ); }
 		if (HX_FIELD_EQ(inName,"logout") ) { return ::hx::Val( logout_dyn() ); }
 		if (HX_FIELD_EQ(inName,"doSync") ) { return ::hx::Val( doSync_dyn() ); }
@@ -5698,12 +5983,15 @@ void Client_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"getChat") ) { return ::hx::Val( getChat_dyn() ); }
 		break;
 	case 8:
+		if (HX_FIELD_EQ(inName,"capsRepo") ) { return ::hx::Val( capsRepo ); }
 		if (HX_FIELD_EQ(inName,"getChats") ) { return ::hx::Val( getChats_dyn() ); }
 		if (HX_FIELD_EQ(inName,"onMAMJMI") ) { return ::hx::Val( onMAMJMI_dyn() ); }
 		break;
 	case 9:
 		if (HX_FIELD_EQ(inName,"fastCount") ) { return ::hx::Val( fastCount ); }
+		if (HX_FIELD_EQ(inName,"firstSync") ) { return ::hx::Val( firstSync ); }
 		if (HX_FIELD_EQ(inName,"accountId") ) { return ::hx::Val( accountId_dyn() ); }
+		if (HX_FIELD_EQ(inName,"setStatus") ) { return ::hx::Val( setStatus_dyn() ); }
 		if (HX_FIELD_EQ(inName,"startChat") ) { return ::hx::Val( startChat_dyn() ); }
 		if (HX_FIELD_EQ(inName,"sortChats") ) { return ::hx::Val( sortChats_dyn() ); }
 		if (HX_FIELD_EQ(inName,"sendQuery") ) { return ::hx::Val( sendQuery_dyn() ); }
@@ -5713,6 +6001,7 @@ void Client_obj::__Visit(HX_VISIT_PARAMS)
 	case 10:
 		if (HX_FIELD_EQ(inName,"setProfile") ) { return ::hx::Val( setProfile_dyn() ); }
 		if (HX_FIELD_EQ(inName,"enablePush") ) { return ::hx::Val( enablePush_dyn() ); }
+		if (HX_FIELD_EQ(inName,"nextSortId") ) { return ::hx::Val( nextSortId_dyn() ); }
 		if (HX_FIELD_EQ(inName,"sendStanza") ) { return ::hx::Val( sendStanza_dyn() ); }
 		break;
 	case 11:
@@ -5755,6 +6044,7 @@ void Client_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"encryptionPolicy") ) { return ::hx::Val( encryptionPolicy ); }
 		if (HX_FIELD_EQ(inName,"fetchMediaByHash") ) { return ::hx::Val( fetchMediaByHash_dyn() ); }
 		if (HX_FIELD_EQ(inName,"discoverServices") ) { return ::hx::Val( discoverServices_dyn() ); }
+		if (HX_FIELD_EQ(inName,"checkForReceipts") ) { return ::hx::Val( checkForReceipts_dyn() ); }
 		break;
 	case 17:
 		if (HX_FIELD_EQ(inName,"updateDisplayName") ) { return ::hx::Val( updateDisplayName_dyn() ); }
@@ -5772,9 +6062,11 @@ void Client_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"updatePushIfEnabled") ) { return ::hx::Val( updatePushIfEnabled_dyn() ); }
 		if (HX_FIELD_EQ(inName,"addTlsCheckListener") ) { return ::hx::Val( addTlsCheckListener_dyn() ); }
 		if (HX_FIELD_EQ(inName,"addCallRingListener") ) { return ::hx::Val( addCallRingListener_dyn() ); }
+		if (HX_FIELD_EQ(inName,"storeMessageBuilder") ) { return ::hx::Val( storeMessageBuilder_dyn() ); }
 		break;
 	case 20:
 		if (HX_FIELD_EQ(inName,"prepareAttachmentFor") ) { return ::hx::Val( prepareAttachmentFor_dyn() ); }
+		if (HX_FIELD_EQ(inName,"availableChatSources") ) { return ::hx::Val( availableChatSources_dyn() ); }
 		if (HX_FIELD_EQ(inName,"addCallMediaListener") ) { return ::hx::Val( addCallMediaListener_dyn() ); }
 		if (HX_FIELD_EQ(inName,"addCallTrackListener") ) { return ::hx::Val( addCallTrackListener_dyn() ); }
 		break;
@@ -5824,10 +6116,15 @@ void Client_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 6:
 		if (HX_FIELD_EQ(inName,"stream") ) { stream=inValue.Cast<  ::borogove::GenericStream >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"sortId") ) { sortId=inValue.Cast< ::String >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"inSync") ) { inSync=inValue.Cast< bool >(); return inValue; }
 		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"capsRepo") ) { capsRepo=inValue.Cast<  ::borogove::CapsRepo >(); return inValue; }
+		break;
 	case 9:
 		if (HX_FIELD_EQ(inName,"fastCount") ) { fastCount=inValue.Cast<  ::Dynamic >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"firstSync") ) { firstSync=inValue.Cast< bool >(); return inValue; }
 		break;
 	case 11:
 		if (HX_FIELD_EQ(inName,"persistence") ) { persistence=inValue.Cast< ::Dynamic >(); return inValue; }
@@ -5861,15 +6158,18 @@ void Client_obj::__GetFields(Array< ::String> &outFields)
 	outFields->push(HX_("jid",c5,ca,50,00));
 	outFields->push(HX_("chats",9b,9e,b3,45));
 	outFields->push(HX_("persistence",5f,17,c4,f6));
+	outFields->push(HX_("capsRepo",33,c5,b1,15));
 	outFields->push(HX_("caps",21,1c,ba,41));
 	outFields->push(HX_("_displayName",ae,bf,fb,96));
 	outFields->push(HX_("fastMechanism",1d,e7,34,8a));
 	outFields->push(HX_("token",f9,82,2b,14));
 	outFields->push(HX_("fastCount",93,fc,67,a5));
+	outFields->push(HX_("sortId",d9,7a,37,30));
 	outFields->push(HX_("pendingCaps",18,58,88,be));
 	outFields->push(HX_("brokenAvatars",65,ac,4f,eb));
 	outFields->push(HX_("encryptionPolicy",d5,f0,3c,e7));
 	outFields->push(HX_("inSync",e0,98,c5,88));
+	outFields->push(HX_("firstSync",ab,36,2e,03));
 	outFields->push(HX_("enabledPushData",c5,32,81,93));
 	outFields->push(HX_("lazyQueryTimer",31,55,56,27));
 	outFields->push(HX_("queriesToSend",69,0e,0c,ca));
@@ -5883,15 +6183,18 @@ static ::hx::StorageInfo Client_obj_sMemberStorageInfo[] = {
 	{::hx::fsObject /*  ::borogove::JID */ ,(int)offsetof(Client_obj,jid),HX_("jid",c5,ca,50,00)},
 	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(Client_obj,chats),HX_("chats",9b,9e,b3,45)},
 	{::hx::fsObject /* ::Dynamic */ ,(int)offsetof(Client_obj,persistence),HX_("persistence",5f,17,c4,f6)},
+	{::hx::fsObject /*  ::borogove::CapsRepo */ ,(int)offsetof(Client_obj,capsRepo),HX_("capsRepo",33,c5,b1,15)},
 	{::hx::fsObject /*  ::borogove::Caps */ ,(int)offsetof(Client_obj,caps),HX_("caps",21,1c,ba,41)},
 	{::hx::fsString,(int)offsetof(Client_obj,_displayName),HX_("_displayName",ae,bf,fb,96)},
 	{::hx::fsString,(int)offsetof(Client_obj,fastMechanism),HX_("fastMechanism",1d,e7,34,8a)},
 	{::hx::fsString,(int)offsetof(Client_obj,token),HX_("token",f9,82,2b,14)},
 	{::hx::fsObject /*  ::Dynamic */ ,(int)offsetof(Client_obj,fastCount),HX_("fastCount",93,fc,67,a5)},
+	{::hx::fsString,(int)offsetof(Client_obj,sortId),HX_("sortId",d9,7a,37,30)},
 	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(Client_obj,pendingCaps),HX_("pendingCaps",18,58,88,be)},
 	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(Client_obj,brokenAvatars),HX_("brokenAvatars",65,ac,4f,eb)},
 	{::hx::fsObject /*  ::borogove::EncryptionPolicy */ ,(int)offsetof(Client_obj,encryptionPolicy),HX_("encryptionPolicy",d5,f0,3c,e7)},
 	{::hx::fsBool,(int)offsetof(Client_obj,inSync),HX_("inSync",e0,98,c5,88)},
+	{::hx::fsBool,(int)offsetof(Client_obj,firstSync),HX_("firstSync",ab,36,2e,03)},
 	{::hx::fsObject /*  ::Dynamic */ ,(int)offsetof(Client_obj,enabledPushData),HX_("enabledPushData",c5,32,81,93)},
 	{::hx::fsObject /*  ::haxe::Timer */ ,(int)offsetof(Client_obj,lazyQueryTimer),HX_("lazyQueryTimer",31,55,56,27)},
 	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(Client_obj,queriesToSend),HX_("queriesToSend",69,0e,0c,ca)},
@@ -5907,15 +6210,18 @@ static ::String Client_obj_sMemberFields[] = {
 	HX_("jid",c5,ca,50,00),
 	HX_("chats",9b,9e,b3,45),
 	HX_("persistence",5f,17,c4,f6),
+	HX_("capsRepo",33,c5,b1,15),
 	HX_("caps",21,1c,ba,41),
 	HX_("_displayName",ae,bf,fb,96),
 	HX_("fastMechanism",1d,e7,34,8a),
 	HX_("token",f9,82,2b,14),
 	HX_("fastCount",93,fc,67,a5),
+	HX_("sortId",d9,7a,37,30),
 	HX_("pendingCaps",18,58,88,be),
 	HX_("brokenAvatars",65,ac,4f,eb),
 	HX_("encryptionPolicy",d5,f0,3c,e7),
 	HX_("inSync",e0,98,c5,88),
+	HX_("firstSync",ab,36,2e,03),
 	HX_("processLiveMessage",0c,f2,77,58),
 	HX_("start",62,74,0b,84),
 	HX_("startOffline",a1,72,73,44),
@@ -5924,12 +6230,14 @@ static ::String Client_obj_sMemberFields[] = {
 	HX_("accountId",e8,81,54,29),
 	HX_("displayName",ad,11,f2,30),
 	HX_("setProfile",a7,6d,28,46),
+	HX_("setStatus",74,5c,a3,65),
 	HX_("updateDisplayName",24,be,5b,95),
 	HX_("onConnected",aa,c5,39,c5),
 	HX_("prepareAttachment",4a,6c,4b,52),
 	HX_("prepareAttachmentFor",df,5c,bf,82),
 	HX_("getChats",25,ae,8a,a5),
 	HX_("findAvailableChats",2b,92,7a,e4),
+	HX_("availableChatSources",f7,d3,2b,65),
 	HX_("startChat",5a,d8,b2,fa),
 	HX_("getChat",8e,0e,42,14),
 	HX_("moderateMessage",44,98,f1,d4),
@@ -5958,6 +6266,8 @@ static ::String Client_obj_sMemberFields[] = {
 	HX_("fetchMediaByHashOneCounterpart",b8,d3,9a,5e),
 	HX_("chatActivity",c7,e0,61,f8),
 	HX_("sortChats",5d,72,27,4e),
+	HX_("nextSortId",2c,2c,69,e5),
+	HX_("storeMessageBuilder",d5,73,e0,e5),
 	HX_("storeMessages",cd,f1,bd,e9),
 	HX_("sendQuery",a0,48,5a,1e),
 	HX_("lazyQueryTimer",31,55,56,27),
@@ -5976,6 +6286,7 @@ static ::String Client_obj_sMemberFields[] = {
 	HX_("mucInvite",24,30,15,de),
 	HX_("serverBlocked",69,86,62,0f),
 	HX_("bookmarksGet",99,e1,ce,2f),
+	HX_("checkForReceipts",fc,9c,f4,19),
 	HX_("sync",5b,ba,5f,4c),
 	HX_("onMAMJMI",ac,d7,bc,14),
 	HX_("doSync",86,5f,63,1c),
@@ -6011,8 +6322,8 @@ void Client_obj::__register()
 void Client_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_59_boot)
-HXDLIN(  59)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_a492fd7f83fa2dd6_62_boot)
+HXDLIN(  62)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(39)
             				->setFixed(0,HX_("addChatsUpdatedListener__fromC",e4,7a,96,80), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
@@ -6020,24 +6331,24 @@ HXDLIN(  59)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
             				->setFixed(2,HX_("addCallRingingListener__fromC",32,ca,d2,99), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(3,HX_("prepareAttachment__fromC",6f,81,bb,9e), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(3,HX_("availableChatSources__fromC",62,19,dd,9a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(4,HX_("addCallRingListener__fromC",96,08,fb,9e), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(4,HX_("prepareAttachment__fromC",6f,81,bb,9e), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(5,HX_("addStatusOnlineListener__fromC",ff,bb,66,a2), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(5,HX_("addCallRingListener__fromC",96,08,fb,9e), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(6,HX_("enablePush",fd,e9,ae,a3), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(6,HX_("addStatusOnlineListener__fromC",ff,bb,66,a2), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(7,HX_("enablePush",fd,e9,ae,a3), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(7,HX_("getChats",25,ae,8a,a5), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(8,HX_("getChats",25,ae,8a,a5), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(8,HX_("addTlsCheckListener__fromC",17,a0,1f,a9), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(9,HX_("addTlsCheckListener__fromC",17,a0,1f,a9), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(9,HX_("addCallTrackListener__fromC",39,05,06,c4), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(10,HX_("addCallTrackListener__fromC",39,05,06,c4), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(10,HX_("addCallMediaListener",99,4a,d3,ce), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(11,HX_("addCallMediaListener",99,4a,d3,ce), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(11,HX_("findAvailableChats__fromC",ae,49,41,d0), ::Dynamic(::hx::Anon_obj::Create(1)
-            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
             				->setFixed(12,HX_("addChatsUpdatedListener",35,56,de,d1), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
             				->setFixed(13,HX_("addConnectionFailedListener__fromC",29,3d,00,dc), ::Dynamic(::hx::Anon_obj::Create(1)
@@ -6050,44 +6361,44 @@ HXDLIN(  59)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
             				->setFixed(17,HX_("addSyncMessageListener",9f,bb,b2,e2), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(18,HX_("findAvailableChats",2b,92,7a,e4), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(18,HX_("addChatMessageListener",c2,ab,0f,ed), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(19,HX_("addChatMessageListener",c2,ab,0f,ed), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(19,HX_("addStatusOfflineListener",84,03,7d,f1), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(20,HX_("addStatusOfflineListener",84,03,7d,f1), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(20,HX_("addStatusOnlineListener",ba,7f,0a,f9), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(21,HX_("addStatusOnlineListener",ba,7f,0a,f9), ::Dynamic(::hx::Anon_obj::Create(1)
-            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(22,HX_("addCallUpdateStatusListener__fromC",8b,13,03,02), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(21,HX_("addCallUpdateStatusListener__fromC",8b,13,03,02), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(23,HX_("addCallUpdateStatusListener",ae,ae,44,09), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(22,HX_("addCallUpdateStatusListener",ae,ae,44,09), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(24,HX_("addCallRetractListener",f6,56,33,1b), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(23,HX_("addCallRetractListener",f6,56,33,1b), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(25,HX_("addPasswordNeededListener__fromC",d4,b3,20,1d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(24,HX_("addPasswordNeededListener__fromC",d4,b3,20,1d), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(26,HX_("set_sendAvailable__fromC",35,ea,10,2d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(25,HX_("set_sendAvailable__fromC",35,ea,10,2d), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(27,HX_("enablePush__fromC",1c,70,b7,2f), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(26,HX_("enablePush__fromC",1c,70,b7,2f), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(28,HX_("addCallMediaListener__fromC",00,9b,9c,36), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(27,HX_("addCallMediaListener__fromC",00,9b,9c,36), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(29,HX_("addCallRingingListener",27,29,10,44), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(28,HX_("addCallRingingListener",27,29,10,44), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(30,HX_("startOffline",a1,72,73,44), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(29,HX_("startOffline",a1,72,73,44), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(31,HX_("addCallTrackListener",40,53,e3,46), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(30,HX_("addCallTrackListener",40,53,e3,46), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(32,HX_("addConnectionFailedListener",50,7d,89,49), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(31,HX_("addConnectionFailedListener",50,7d,89,49), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(33,HX_("prepareAttachment",4a,6c,4b,52), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(32,HX_("prepareAttachment",4a,6c,4b,52), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(34,HX_("addTlsCheckListener",a2,08,8a,52), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(33,HX_("addTlsCheckListener",a2,08,8a,52), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(35,HX_("addCallRetractListener__fromC",43,84,e9,5a), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(34,HX_("addCallRetractListener__fromC",43,84,e9,5a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(36,HX_("startOffline__fromC",f8,03,65,60), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(35,HX_("startOffline__fromC",f8,03,65,60), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(36,HX_("availableChatSources",f7,d3,2b,65), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
             				->setFixed(37,HX_("addStatusOfflineListener__fromC",75,a5,68,6e), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
             				->setFixed(38,HX_("getChats__fromC",f4,00,7e,7e), ::Dynamic(::hx::Anon_obj::Create(1)
diff --git a/Sources/c_borogove/src/borogove/Command.cpp b/Sources/c_borogove/src/borogove/Command.cpp
index 68f0951..881e779 100644
--- a/Sources/c_borogove/src/borogove/Command.cpp
+++ b/Sources/c_borogove/src/borogove/Command.cpp
@@ -44,27 +44,27 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_3f7d50174e74345f_26_new,"borogove.Command","new",0xdf975ad0,"borogove.Command.new","borogove/Command.hx",26,0xeb7c59e1)
-HX_LOCAL_STACK_FRAME(_hx_pos_ccb272382c704ccf_450_name__fromC,"borogove.Command","name__fromC",0xd4e227fe,"borogove.Command.name__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3f7d50174e74345f_37_execute,"borogove.Command","execute",0xd1be8ca5,"borogove.Command.execute","borogove/Command.hx",37,0xeb7c59e1)
-HX_LOCAL_STACK_FRAME(_hx_pos_ccb272382c704ccf_337_execute__fromC,"borogove.Command","execute__fromC",0xe6daf274,"borogove.Command.execute__fromC","HaxeCBridge.hx",337,0xa18550d8)
+HX_DEFINE_STACK_FRAME(_hx_pos_3f7d50174e74345f_29_new,"borogove.Command","new",0xdf975ad0,"borogove.Command.new","borogove/Command.hx",29,0xeb7c59e1)
+HX_LOCAL_STACK_FRAME(_hx_pos_ccb272382c704ccf_478_name__fromC,"borogove.Command","name__fromC",0xd4e227fe,"borogove.Command.name__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3f7d50174e74345f_40_execute,"borogove.Command","execute",0xd1be8ca5,"borogove.Command.execute","borogove/Command.hx",40,0xeb7c59e1)
+HX_LOCAL_STACK_FRAME(_hx_pos_ccb272382c704ccf_365_execute__fromC,"borogove.Command","execute__fromC",0xe6daf274,"borogove.Command.execute__fromC","HaxeCBridge.hx",365,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_3f7d50174e74345f_19_boot,"borogove.Command","boot",0xbcf11bc2,"borogove.Command.boot","borogove/Command.hx",19,0xeb7c59e1)
 namespace borogove{
 
 void Command_obj::__construct( ::borogove::Client client, ::Dynamic params){
-            	HX_STACKFRAME(&_hx_pos_3f7d50174e74345f_26_new)
-HXLINE(  27)		this->jid = ( ( ::borogove::JID)(params->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) );
-HXLINE(  28)		this->node = ( (::String)(params->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic)) );
-HXLINE(  29)		::String tmp = ( (::String)(params->__Field(HX_("name",4b,72,ff,48),::hx::paccDynamic)) );
-HXDLIN(  29)		::String _hx_tmp;
-HXDLIN(  29)		if (::hx::IsNotNull( tmp )) {
-HXLINE(  29)			_hx_tmp = tmp;
+            	HX_STACKFRAME(&_hx_pos_3f7d50174e74345f_29_new)
+HXLINE(  30)		this->jid = ( ( ::borogove::JID)(params->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) );
+HXLINE(  31)		this->node = ( (::String)(params->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic)) );
+HXLINE(  32)		::String tmp = ( (::String)(params->__Field(HX_("name",4b,72,ff,48),::hx::paccDynamic)) );
+HXDLIN(  32)		::String _hx_tmp;
+HXDLIN(  32)		if (::hx::IsNotNull( tmp )) {
+HXLINE(  32)			_hx_tmp = tmp;
             		}
             		else {
-HXLINE(  29)			_hx_tmp = ( (::String)(params->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic)) );
+HXLINE(  32)			_hx_tmp = ( (::String)(params->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic)) );
             		}
-HXDLIN(  29)		this->name = _hx_tmp;
-HXLINE(  30)		this->client = client;
+HXDLIN(  32)		this->name = _hx_tmp;
+HXLINE(  33)		this->client = client;
             	}
 
 Dynamic Command_obj::__CreateEmpty() { return new Command_obj; }
@@ -83,58 +83,58 @@ bool Command_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String Command_obj::name__fromC(){
-            	HX_STACKFRAME(&_hx_pos_ccb272382c704ccf_450_name__fromC)
-HXDLIN( 450)		return this->name;
+            	HX_STACKFRAME(&_hx_pos_ccb272382c704ccf_478_name__fromC)
+HXDLIN( 478)		return this->name;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Command_obj,name__fromC,return )
 
 ::Dynamic Command_obj::execute(){
-            	HX_GC_STACKFRAME(&_hx_pos_3f7d50174e74345f_37_execute)
-HXDLIN(  37)		return  ::borogove::CommandSession_obj::__alloc( HX_CTX ,HX_("executing",b2,2a,0f,b1),null(),::Array_obj< ::Dynamic>::__new(0),::Array_obj< ::Dynamic>::__new(0),::hx::ObjectPtr<OBJ_>(this))->execute(null(),null(),null());
+            	HX_GC_STACKFRAME(&_hx_pos_3f7d50174e74345f_40_execute)
+HXDLIN(  40)		return  ::borogove::CommandSession_obj::__alloc( HX_CTX ,HX_("executing",b2,2a,0f,b1),null(),::Array_obj< ::Dynamic>::__new(0),::Array_obj< ::Dynamic>::__new(0),::hx::ObjectPtr<OBJ_>(this))->execute(null(),null(),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Command_obj,execute,return )
 
 void Command_obj::execute__fromC(::cpp::Function< void  (void*,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_ccb272382c704ccf_337_execute__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			this->execute();
+            	HX_STACKFRAME(&_hx_pos_ccb272382c704ccf_365_execute__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->execute();
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::borogove::CommandSession v){
-            				HX_STACKFRAME(&_hx_pos_ccb272382c704ccf_337_execute__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void*,void*) > handler1 = handler;
-HXLINE( 314)				 ::Dynamic haxeObject = v;
-HXDLIN( 314)				void* ptr = haxeObject.mPtr;
-HXDLIN( 314)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 314)				{
-HXLINE( 314)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 314)					if (::hx::IsNull( store )) {
-HXLINE( 314)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            				HX_STACKFRAME(&_hx_pos_ccb272382c704ccf_365_execute__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 314)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             					}
             					else {
-HXLINE( 314)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             					}
             				}
-HXLINE( 337)				handler1(ptr,handler__context);
+HXLINE( 365)				handler1(ptr,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_ccb272382c704ccf_337_execute__fromC)
-HXDLIN( 337)				handler(null(),handler__context);
+            				HX_STACKFRAME(&_hx_pos_ccb272382c704ccf_365_execute__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->execute(), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->execute(), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
diff --git a/Sources/c_borogove/src/borogove/CommandSession.cpp b/Sources/c_borogove/src/borogove/CommandSession.cpp
index d3d24de..0bb01e2 100644
--- a/Sources/c_borogove/src/borogove/CommandSession.cpp
+++ b/Sources/c_borogove/src/borogove/CommandSession.cpp
@@ -1,6 +1,9 @@
 // Generated by Haxe 4.3.3
 #include <hxcpp.h>
 
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
+#endif
 #ifndef INCLUDED__HaxeCBridge_Internal
 #include <_HaxeCBridge/Internal.h>
 #endif
@@ -59,44 +62,44 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_393ae15da757fdff_55_new,"borogove.CommandSession","new",0xed10110a,"borogove.CommandSession.new","borogove/Command.hx",55,0xeb7c59e1)
-HX_LOCAL_STACK_FRAME(_hx_pos_6429c0fb54981d0a_450_name__fromC,"borogove.CommandSession","name__fromC",0x85b2a838,"borogove.CommandSession.name__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_6429c0fb54981d0a_450_status__fromC,"borogove.CommandSession","status__fromC",0x7f652cb1,"borogove.CommandSession.status__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_6429c0fb54981d0a_424_actions__fromC,"borogove.CommandSession","actions__fromC",0x22fa21b2,"borogove.CommandSession.actions__fromC","HaxeCBridge.hx",424,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_6429c0fb54981d0a_424_forms__fromC,"borogove.CommandSession","forms__fromC",0x926e53c0,"borogove.CommandSession.forms__fromC","HaxeCBridge.hx",424,0xa18550d8)
+HX_DEFINE_STACK_FRAME(_hx_pos_393ae15da757fdff_70_new,"borogove.CommandSession","new",0xed10110a,"borogove.CommandSession.new","borogove/Command.hx",70,0xeb7c59e1)
+HX_LOCAL_STACK_FRAME(_hx_pos_6429c0fb54981d0a_478_name__fromC,"borogove.CommandSession","name__fromC",0x85b2a838,"borogove.CommandSession.name__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_6429c0fb54981d0a_478_status__fromC,"borogove.CommandSession","status__fromC",0x7f652cb1,"borogove.CommandSession.status__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_6429c0fb54981d0a_452_actions__fromC,"borogove.CommandSession","actions__fromC",0x22fa21b2,"borogove.CommandSession.actions__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_6429c0fb54981d0a_452_forms__fromC,"borogove.CommandSession","forms__fromC",0x926e53c0,"borogove.CommandSession.forms__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_393ae15da757fdff_129_execute,"borogove.CommandSession","execute",0x4e07e7df,"borogove.CommandSession.execute","borogove/Command.hx",129,0xeb7c59e1)
+HX_LOCAL_STACK_FRAME(_hx_pos_393ae15da757fdff_126_execute,"borogove.CommandSession","execute",0x4e07e7df,"borogove.CommandSession.execute","borogove/Command.hx",126,0xeb7c59e1)
 HX_LOCAL_STACK_FRAME(_hx_pos_393ae15da757fdff_106_execute,"borogove.CommandSession","execute",0x4e07e7df,"borogove.CommandSession.execute","borogove/Command.hx",106,0xeb7c59e1)
-HX_LOCAL_STACK_FRAME(_hx_pos_393ae15da757fdff_103_execute,"borogove.CommandSession","execute",0x4e07e7df,"borogove.CommandSession.execute","borogove/Command.hx",103,0xeb7c59e1)
-HX_LOCAL_STACK_FRAME(_hx_pos_393ae15da757fdff_83_execute,"borogove.CommandSession","execute",0x4e07e7df,"borogove.CommandSession.execute","borogove/Command.hx",83,0xeb7c59e1)
-static const ::String _hx_array_data_36248418_10[] = {
+static const ::String _hx_array_data_36248418_8[] = {
 	HX_("prev",f3,be,5e,4a),HX_("next",f3,84,02,49),HX_("complete",b9,00,c8,7f),HX_("execute",35,0a,0d,cc),HX_("cancel",7a,ed,33,b8),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_6429c0fb54981d0a_337_execute__fromC,"borogove.CommandSession","execute__fromC",0x59b0d27a,"borogove.CommandSession.execute__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_393ae15da757fdff_46_boot,"borogove.CommandSession","boot",0x7917d848,"borogove.CommandSession.boot","borogove/Command.hx",46,0xeb7c59e1)
+HX_LOCAL_STACK_FRAME(_hx_pos_6429c0fb54981d0a_365_execute__fromC,"borogove.CommandSession","execute__fromC",0x59b0d27a,"borogove.CommandSession.execute__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_393ae15da757fdff_49_boot,"borogove.CommandSession","boot",0x7917d848,"borogove.CommandSession.boot","borogove/Command.hx",49,0xeb7c59e1)
 namespace borogove{
 
 void CommandSession_obj::__construct(::String status,::String sessionid,::Array< ::Dynamic> actions,::Array< ::Dynamic> forms, ::borogove::Command command){
-            	HX_STACKFRAME(&_hx_pos_393ae15da757fdff_55_new)
-HXLINE(  56)		::String _hx_tmp;
-HXDLIN(  56)		 ::borogove::Form tmp = forms->__get(0).StaticCast<  ::borogove::Form >();
-HXDLIN(  56)		::String _hx_tmp1;
-HXDLIN(  56)		if (::hx::IsNotNull( tmp )) {
-HXLINE(  56)			_hx_tmp1 = tmp->title();
+            	HX_STACKFRAME(&_hx_pos_393ae15da757fdff_70_new)
+HXLINE(  71)		::String _hx_tmp;
+HXDLIN(  71)		 ::borogove::Form tmp = forms->__get(0).StaticCast<  ::borogove::Form >();
+HXDLIN(  71)		::String _hx_tmp1;
+HXDLIN(  71)		if (::hx::IsNotNull( tmp )) {
+HXLINE(  71)			_hx_tmp1 = tmp->title();
             		}
             		else {
-HXLINE(  56)			_hx_tmp1 = null();
+HXLINE(  71)			_hx_tmp1 = null();
             		}
-HXDLIN(  56)		if (::hx::IsNotNull( _hx_tmp1 )) {
-HXLINE(  56)			_hx_tmp = forms->__get(0).StaticCast<  ::borogove::Form >()->title();
+HXDLIN(  71)		if (::hx::IsNotNull( _hx_tmp1 )) {
+HXLINE(  71)			_hx_tmp = forms->__get(0).StaticCast<  ::borogove::Form >()->title();
             		}
             		else {
-HXLINE(  56)			_hx_tmp = command->name;
+HXLINE(  71)			_hx_tmp = command->name;
             		}
-HXDLIN(  56)		this->name = _hx_tmp;
-HXLINE(  57)		this->status = status;
-HXLINE(  58)		this->sessionid = sessionid;
-HXLINE(  59)		this->actions = actions;
-HXLINE(  60)		this->forms = forms;
-HXLINE(  61)		this->command = command;
+HXDLIN(  71)		this->name = _hx_tmp;
+HXLINE(  72)		this->status = status;
+HXLINE(  73)		this->sessionid = sessionid;
+HXLINE(  74)		this->actions = actions;
+HXLINE(  75)		this->forms = forms;
+HXLINE(  76)		this->command = command;
             	}
 
 Dynamic CommandSession_obj::__CreateEmpty() { return new CommandSession_obj; }
@@ -115,116 +118,40 @@ bool CommandSession_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String CommandSession_obj::name__fromC(){
-            	HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_450_name__fromC)
-HXDLIN( 450)		return this->name;
+            	HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_478_name__fromC)
+HXDLIN( 478)		return this->name;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(CommandSession_obj,name__fromC,return )
 
 ::String CommandSession_obj::status__fromC(){
-            	HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_450_status__fromC)
-HXDLIN( 450)		return this->status;
+            	HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_478_status__fromC)
+HXDLIN( 478)		return this->status;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(CommandSession_obj,status__fromC,return )
 
 size_t CommandSession_obj::actions__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_424_actions__fromC)
-HXDLIN( 424)		::Array< ::Dynamic> x = this->actions;
-HXDLIN( 424)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 424)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 424)			{
-HXDLIN( 424)				int _g = 0;
-HXDLIN( 424)				while((_g < x->length)){
-HXDLIN( 424)					 ::borogove::FormOption el = x->__get(_g).StaticCast<  ::borogove::FormOption >();
-HXDLIN( 424)					_g = (_g + 1);
-HXDLIN( 424)					{
-HXDLIN( 424)						 ::Dynamic haxeObject = el;
-HXDLIN( 424)						void* ptr = haxeObject.mPtr;
-HXDLIN( 424)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 424)						{
-HXDLIN( 424)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 424)							if (::hx::IsNull( store )) {
-HXDLIN( 424)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 424)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 424)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 424)			void** ptr1 = (void**)x->getBase();
-HXDLIN( 424)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 424)			{
-HXDLIN( 424)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 424)				if (::hx::IsNull( store1 )) {
-HXDLIN( 424)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),x));
-HXDLIN( 424)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 424)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 424)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_452_actions__fromC)
+HXDLIN( 452)		::Array< ::Dynamic> x = this->actions;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(x));
             		}
-HXDLIN( 424)		return ( (size_t)(x->length) );
+HXDLIN( 452)		return ( (size_t)(x->length) );
             	}
 
 
 size_t CommandSession_obj::forms__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_424_forms__fromC)
-HXDLIN( 424)		::Array< ::Dynamic> x = this->forms;
-HXDLIN( 424)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 424)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 424)			{
-HXDLIN( 424)				int _g = 0;
-HXDLIN( 424)				while((_g < x->length)){
-HXDLIN( 424)					 ::borogove::Form el = x->__get(_g).StaticCast<  ::borogove::Form >();
-HXDLIN( 424)					_g = (_g + 1);
-HXDLIN( 424)					{
-HXDLIN( 424)						 ::Dynamic haxeObject = el;
-HXDLIN( 424)						void* ptr = haxeObject.mPtr;
-HXDLIN( 424)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 424)						{
-HXDLIN( 424)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 424)							if (::hx::IsNull( store )) {
-HXDLIN( 424)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 424)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 424)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 424)			void** ptr1 = (void**)x->getBase();
-HXDLIN( 424)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 424)			{
-HXDLIN( 424)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 424)				if (::hx::IsNull( store1 )) {
-HXDLIN( 424)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),x));
-HXDLIN( 424)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 424)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 424)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_452_forms__fromC)
+HXDLIN( 452)		::Array< ::Dynamic> x = this->forms;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(x));
             		}
-HXDLIN( 424)		return ( (size_t)(x->length) );
+HXDLIN( 452)		return ( (size_t)(x->length) );
             	}
 
 
@@ -233,82 +160,82 @@ HXDLIN( 424)		return ( (size_t)(x->length) );
             		void _hx_run( ::Dynamic resolve, ::Dynamic reject){
             			HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_0, ::borogove::CommandSession,_gthis, ::Dynamic,resolve, ::Dynamic,reject, ::borogove::queries::CommandExecute,exe1) HXARGC(0)
             			void _hx_run(){
-            				HX_GC_STACKFRAME(&_hx_pos_393ae15da757fdff_106_execute)
-HXLINE( 106)				if (::hx::IsNull( exe1->getResult(_gthis->command) )) {
-HXLINE( 107)					reject(exe1->responseStanza);
+            				HX_GC_STACKFRAME(&_hx_pos_393ae15da757fdff_129_execute)
+HXLINE( 129)				if (::hx::IsNull( exe1->getResult(_gthis->command) )) {
+HXLINE( 130)					reject(exe1->responseStanza);
             				}
             				else {
-HXLINE( 109)					 ::Dynamic resolve1 = resolve;
-HXDLIN( 109)					resolve1(exe1->getResult(_gthis->command));
+HXLINE( 132)					 ::Dynamic resolve1 = resolve;
+HXDLIN( 132)					resolve1(exe1->getResult(_gthis->command));
             				}
             			}
             			HX_END_LOCAL_FUNC0((void))
 
-            			HX_GC_STACKFRAME(&_hx_pos_393ae15da757fdff_103_execute)
-HXLINE( 104)			::String exe = _gthis->command->jid->asString();
-HXDLIN( 104)			 ::borogove::queries::CommandExecute exe1 =  ::borogove::queries::CommandExecute_obj::__alloc( HX_CTX ,exe,_gthis->command->node,action1->__get(0),_gthis->sessionid,toSubmit->__get(0).StaticCast<  ::borogove::Stanza >());
-HXLINE( 105)			exe1->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,resolve,reject,exe1)));
-HXLINE( 112)			_gthis->command->client->sendQuery(exe1);
+            			HX_GC_STACKFRAME(&_hx_pos_393ae15da757fdff_126_execute)
+HXLINE( 127)			::String exe = _gthis->command->jid->asString();
+HXDLIN( 127)			 ::borogove::queries::CommandExecute exe1 =  ::borogove::queries::CommandExecute_obj::__alloc( HX_CTX ,exe,_gthis->command->node,action1->__get(0),_gthis->sessionid,toSubmit->__get(0).StaticCast<  ::borogove::Stanza >());
+HXLINE( 128)			exe1->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,resolve,reject,exe1)));
+HXLINE( 135)			_gthis->command->client->sendQuery(exe1);
             		}
             		HX_END_LOCAL_FUNC2((void))
 
             		int formIdx = __o_formIdx.Default(0);
-            	HX_GC_STACKFRAME(&_hx_pos_393ae15da757fdff_83_execute)
-HXDLIN(  83)		::Array< ::String > action1 = ::Array_obj< ::String >::__new(1)->init(0,action);
-HXDLIN(  83)		 ::borogove::CommandSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(  84)		bool extendedAction;
-HXDLIN(  84)		if (::hx::IsNotNull( action1->__get(0) )) {
-HXLINE(  84)			extendedAction = !(::Array_obj< ::String >::fromData( _hx_array_data_36248418_10,5)->contains(action1->__get(0)));
+            	HX_GC_STACKFRAME(&_hx_pos_393ae15da757fdff_106_execute)
+HXDLIN( 106)		::Array< ::String > action1 = ::Array_obj< ::String >::__new(1)->init(0,action);
+HXDLIN( 106)		 ::borogove::CommandSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 107)		bool extendedAction;
+HXDLIN( 107)		if (::hx::IsNotNull( action1->__get(0) )) {
+HXLINE( 107)			extendedAction = !(::Array_obj< ::String >::fromData( _hx_array_data_36248418_8,5)->contains(action1->__get(0)));
             		}
             		else {
-HXLINE(  84)			extendedAction = false;
+HXLINE( 107)			extendedAction = false;
             		}
-HXLINE(  85)		::Array< ::Dynamic> toSubmit = ::Array_obj< ::Dynamic>::__new(1)->init(0,null());
-HXLINE(  86)		bool _hx_tmp;
-HXDLIN(  86)		if (::hx::IsNull( data )) {
-HXLINE(  86)			_hx_tmp = extendedAction;
+HXLINE( 108)		::Array< ::Dynamic> toSubmit = ::Array_obj< ::Dynamic>::__new(1)->init(0,null());
+HXLINE( 109)		bool _hx_tmp;
+HXDLIN( 109)		if (::hx::IsNull( data )) {
+HXLINE( 109)			_hx_tmp = extendedAction;
             		}
             		else {
-HXLINE(  86)			_hx_tmp = true;
+HXLINE( 109)			_hx_tmp = true;
             		}
-HXDLIN(  86)		if (_hx_tmp) {
-HXLINE(  87)			toSubmit[0] = this->forms->__get(formIdx).StaticCast<  ::borogove::Form >()->submit(data);
-HXLINE(  88)			bool _hx_tmp1;
-HXDLIN(  88)			bool _hx_tmp2;
-HXDLIN(  88)			if (::hx::IsNull( toSubmit->__get(0).StaticCast<  ::borogove::Stanza >() )) {
-HXLINE(  88)				_hx_tmp2 = (action1->__get(0) != HX_("cancel",7a,ed,33,b8));
+HXDLIN( 109)		if (_hx_tmp) {
+HXLINE( 110)			toSubmit[0] = this->forms->__get(formIdx).StaticCast<  ::borogove::Form >()->submit(data);
+HXLINE( 111)			bool _hx_tmp1;
+HXDLIN( 111)			bool _hx_tmp2;
+HXDLIN( 111)			if (::hx::IsNull( toSubmit->__get(0).StaticCast<  ::borogove::Stanza >() )) {
+HXLINE( 111)				_hx_tmp2 = (action1->__get(0) != HX_("cancel",7a,ed,33,b8));
             			}
             			else {
-HXLINE(  88)				_hx_tmp2 = false;
+HXLINE( 111)				_hx_tmp2 = false;
             			}
-HXDLIN(  88)			if (_hx_tmp2) {
-HXLINE(  88)				_hx_tmp1 = (action1->__get(0) != HX_("prev",f3,be,5e,4a));
+HXDLIN( 111)			if (_hx_tmp2) {
+HXLINE( 111)				_hx_tmp1 = (action1->__get(0) != HX_("prev",f3,be,5e,4a));
             			}
             			else {
-HXLINE(  88)				_hx_tmp1 = false;
+HXLINE( 111)				_hx_tmp1 = false;
             			}
-HXDLIN(  88)			if (_hx_tmp1) {
-HXLINE(  88)				return ::thenshim::_Promise::Promise_Impl__obj::reject(HX_("Invalid submission",75,fd,11,31));
+HXDLIN( 111)			if (_hx_tmp1) {
+HXLINE( 111)				return ::thenshim::_Promise::Promise_Impl__obj::reject(HX_("Invalid submission",75,fd,11,31));
             			}
             		}
-HXLINE(  91)		if (extendedAction) {
-HXLINE(  92)			if (::hx::IsNull( toSubmit->__get(0).StaticCast<  ::borogove::Stanza >() )) {
-HXLINE(  92)				toSubmit[0] =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 114)		if (extendedAction) {
+HXLINE( 115)			if (::hx::IsNull( toSubmit->__get(0).StaticCast<  ::borogove::Stanza >() )) {
+HXLINE( 115)				toSubmit[0] =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
             					->setFixed(0,HX_("type",ba,f2,08,4d),HX_("submit",18,58,06,9a))
             					->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("jabber:x:data",c2,e1,e9,7c))));
             			}
-HXLINE(  94)			 ::borogove::Stanza fld = ::borogove::_DataForm::DataForm_Impl__obj::field(toSubmit->__get(0).StaticCast<  ::borogove::Stanza >(),HX_("http://jabber.org/protocol/commands#actions",76,e9,80,16));
-HXLINE(  95)			if (::hx::IsNull( fld )) {
-HXLINE(  96)				 ::borogove::Stanza _hx_tmp3 = toSubmit->__get(0).StaticCast<  ::borogove::Stanza >()->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 117)			 ::borogove::Stanza fld = ::borogove::_DataForm::DataForm_Impl__obj::field(toSubmit->__get(0).StaticCast<  ::borogove::Stanza >(),HX_("http://jabber.org/protocol/commands#actions",76,e9,80,16));
+HXLINE( 118)			if (::hx::IsNull( fld )) {
+HXLINE( 119)				 ::borogove::Stanza _hx_tmp3 = toSubmit->__get(0).StaticCast<  ::borogove::Stanza >()->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("var",e7,de,59,00),HX_("http://jabber.org/protocol/commands#actions",76,e9,80,16))));
-HXDLIN(  96)				_hx_tmp3->textTag(HX_("value",71,7f,b8,31),action1->__get(0),null())->up();
+HXDLIN( 119)				_hx_tmp3->textTag(HX_("value",71,7f,b8,31),action1->__get(0),null())->up();
             			}
             			else {
-HXLINE(  98)				::borogove::_DataForm::Field_Impl__obj::set_value(fld,::Array_obj< ::String >::__new(1)->init(0,action1->__get(0)));
+HXLINE( 121)				::borogove::_DataForm::Field_Impl__obj::set_value(fld,::Array_obj< ::String >::__new(1)->init(0,action1->__get(0)));
             			}
-HXLINE( 100)			action1[0] = null();
+HXLINE( 123)			action1[0] = null();
             		}
-HXLINE( 103)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(_gthis,toSubmit,action1)));
+HXLINE( 126)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(_gthis,toSubmit,action1)));
             	}
 
 
@@ -316,42 +243,42 @@ HX_DEFINE_DYNAMIC_FUNC3(CommandSession_obj,execute,return )
 
 void CommandSession_obj::execute__fromC(::String action, ::borogove::FormSubmitBuilder data,::hx::Null< int >  __o_formIdx,::cpp::Function< void  (void*,void*) > handler,void* handler__context){
             		int formIdx = __o_formIdx.Default(0);
-            	HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_337_execute__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			this->execute(action,data,formIdx);
+            	HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_365_execute__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->execute(action,data,formIdx);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::borogove::CommandSession v){
-            				HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_337_execute__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void*,void*) > handler1 = handler;
-HXLINE( 314)				 ::Dynamic haxeObject = v;
-HXDLIN( 314)				void* ptr = haxeObject.mPtr;
-HXDLIN( 314)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 314)				{
-HXLINE( 314)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 314)					if (::hx::IsNull( store )) {
-HXLINE( 314)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            				HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_365_execute__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 314)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             					}
             					else {
-HXLINE( 314)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             					}
             				}
-HXLINE( 337)				handler1(ptr,handler__context);
+HXLINE( 365)				handler1(ptr,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_337_execute__fromC)
-HXDLIN( 337)				handler(null(),handler__context);
+            				HX_STACKFRAME(&_hx_pos_6429c0fb54981d0a_365_execute__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->execute(action,data,formIdx), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->execute(action,data,formIdx), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
@@ -511,8 +438,8 @@ void CommandSession_obj::__register()
 void CommandSession_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_393ae15da757fdff_46_boot)
-HXDLIN(  46)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_393ae15da757fdff_49_boot)
+HXDLIN(  49)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(6)
             				->setFixed(0,HX_("actions__fromC",1c,96,af,89), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
diff --git a/Sources/c_borogove/src/borogove/Config.cpp b/Sources/c_borogove/src/borogove/Config.cpp
index 3d598f7..307f28b 100644
--- a/Sources/c_borogove/src/borogove/Config.cpp
+++ b/Sources/c_borogove/src/borogove/Config.cpp
@@ -5,8 +5,8 @@
 #include <borogove/Config.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_06cb0b4de69e0443_450_relativeHashUri__fromC,"borogove.Config","relativeHashUri__fromC",0xac6e85e6,"borogove.Config.relativeHashUri__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_06cb0b4de69e0443_461_set_relativeHashUri__fromC,"borogove.Config","set_relativeHashUri__fromC",0x1a4009a3,"borogove.Config.set_relativeHashUri__fromC","HaxeCBridge.hx",461,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_06cb0b4de69e0443_478_relativeHashUri__fromC,"borogove.Config","relativeHashUri__fromC",0xac6e85e6,"borogove.Config.relativeHashUri__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_06cb0b4de69e0443_489_set_relativeHashUri__fromC,"borogove.Config","set_relativeHashUri__fromC",0x1a4009a3,"borogove.Config.set_relativeHashUri__fromC","HaxeCBridge.hx",489,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_c2167d2bad2b2046_29_enableConstrainedMemoryMode,"borogove.Config","enableConstrainedMemoryMode",0xf4274718,"borogove.Config.enableConstrainedMemoryMode","borogove/Config.hx",29,0x865ad56e)
 HX_LOCAL_STACK_FRAME(_hx_pos_c2167d2bad2b2046_13_boot,"borogove.Config","boot",0xad106471,"borogove.Config.boot","borogove/Config.hx",13,0x865ad56e)
 HX_LOCAL_STACK_FRAME(_hx_pos_c2167d2bad2b2046_20_boot,"borogove.Config","boot",0xad106471,"borogove.Config.boot","borogove/Config.hx",20,0x865ad56e)
@@ -33,16 +33,16 @@ bool Config_obj::_hx_isInstanceOf(int inClassId) {
 bool Config_obj::relativeHashUri;
 
 bool Config_obj::relativeHashUri__fromC(){
-            	HX_STACKFRAME(&_hx_pos_06cb0b4de69e0443_450_relativeHashUri__fromC)
-HXDLIN( 450)		return ::borogove::Config_obj::relativeHashUri;
+            	HX_STACKFRAME(&_hx_pos_06cb0b4de69e0443_478_relativeHashUri__fromC)
+HXDLIN( 478)		return ::borogove::Config_obj::relativeHashUri;
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC0(Config_obj,relativeHashUri__fromC,return )
 
 void Config_obj::set_relativeHashUri__fromC(bool value){
-            	HX_STACKFRAME(&_hx_pos_06cb0b4de69e0443_461_set_relativeHashUri__fromC)
-HXDLIN( 461)		::borogove::Config_obj::relativeHashUri = value;
+            	HX_STACKFRAME(&_hx_pos_06cb0b4de69e0443_489_set_relativeHashUri__fromC)
+HXDLIN( 489)		::borogove::Config_obj::relativeHashUri = value;
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/CustomEmojiReaction.cpp b/Sources/c_borogove/src/borogove/CustomEmojiReaction.cpp
index 644a264..aa63310 100644
--- a/Sources/c_borogove/src/borogove/CustomEmojiReaction.cpp
+++ b/Sources/c_borogove/src/borogove/CustomEmojiReaction.cpp
@@ -11,17 +11,17 @@
 #include <borogove/Reaction.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_1234d3fa119c5de7_81_new,"borogove.CustomEmojiReaction","new",0x64ef9663,"borogove.CustomEmojiReaction.new","borogove/Reaction.hx",81,0xa2017f67)
-HX_LOCAL_STACK_FRAME(_hx_pos_e46c6e7afc257d99_450_uri__fromC,"borogove.CustomEmojiReaction","uri__fromC",0x9cc71aea,"borogove.CustomEmojiReaction.uri__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_1234d3fa119c5de7_99_render,"borogove.CustomEmojiReaction","render",0x15a90933,"borogove.CustomEmojiReaction.render","borogove/Reaction.hx",99,0xa2017f67)
-HX_LOCAL_STACK_FRAME(_hx_pos_1234d3fa119c5de7_94_custom,"borogove.CustomEmojiReaction","custom",0x5012258e,"borogove.CustomEmojiReaction.custom","borogove/Reaction.hx",94,0xa2017f67)
-HX_LOCAL_STACK_FRAME(_hx_pos_1234d3fa119c5de7_77_boot,"borogove.CustomEmojiReaction","boot",0xe4cd00cf,"borogove.CustomEmojiReaction.boot","borogove/Reaction.hx",77,0xa2017f67)
+HX_DEFINE_STACK_FRAME(_hx_pos_1234d3fa119c5de7_89_new,"borogove.CustomEmojiReaction","new",0x64ef9663,"borogove.CustomEmojiReaction.new","borogove/Reaction.hx",89,0xa2017f67)
+HX_LOCAL_STACK_FRAME(_hx_pos_e46c6e7afc257d99_478_uri__fromC,"borogove.CustomEmojiReaction","uri__fromC",0x9cc71aea,"borogove.CustomEmojiReaction.uri__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_1234d3fa119c5de7_107_render,"borogove.CustomEmojiReaction","render",0x15a90933,"borogove.CustomEmojiReaction.render","borogove/Reaction.hx",107,0xa2017f67)
+HX_LOCAL_STACK_FRAME(_hx_pos_1234d3fa119c5de7_102_custom,"borogove.CustomEmojiReaction","custom",0x5012258e,"borogove.CustomEmojiReaction.custom","borogove/Reaction.hx",102,0xa2017f67)
+HX_LOCAL_STACK_FRAME(_hx_pos_1234d3fa119c5de7_82_boot,"borogove.CustomEmojiReaction","boot",0xe4cd00cf,"borogove.CustomEmojiReaction.boot","borogove/Reaction.hx",82,0xa2017f67)
 namespace borogove{
 
 void CustomEmojiReaction_obj::__construct(::String senderId,::String timestamp,::String text,::String uri,::String envelopeId){
-            	HX_STACKFRAME(&_hx_pos_1234d3fa119c5de7_81_new)
-HXLINE(  82)		super::__construct(senderId,timestamp,text,envelopeId,uri);
-HXLINE(  83)		this->uri = uri;
+            	HX_STACKFRAME(&_hx_pos_1234d3fa119c5de7_89_new)
+HXLINE(  90)		super::__construct(senderId,timestamp,text,envelopeId,uri);
+HXLINE(  91)		this->uri = uri;
             	}
 
 Dynamic CustomEmojiReaction_obj::__CreateEmpty() { return new CustomEmojiReaction_obj; }
@@ -44,38 +44,38 @@ bool CustomEmojiReaction_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String CustomEmojiReaction_obj::uri__fromC(){
-            	HX_STACKFRAME(&_hx_pos_e46c6e7afc257d99_450_uri__fromC)
-HXDLIN( 450)		return this->uri;
+            	HX_STACKFRAME(&_hx_pos_e46c6e7afc257d99_478_uri__fromC)
+HXDLIN( 478)		return this->uri;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(CustomEmojiReaction_obj,uri__fromC,return )
 
 ::String CustomEmojiReaction_obj::render( ::Dynamic forText, ::Dynamic forImage){
-            	HX_STACKFRAME(&_hx_pos_1234d3fa119c5de7_99_render)
-HXLINE( 103)		 ::borogove::Hash hash = ::borogove::Hash_obj::fromUri(this->uri);
-HXLINE( 104)		::String _hx_tmp = this->text;
-HXDLIN( 104)		::String tmp;
-HXDLIN( 104)		if (::hx::IsNotNull( hash )) {
-HXLINE( 104)			tmp = hash->toUri();
+            	HX_STACKFRAME(&_hx_pos_1234d3fa119c5de7_107_render)
+HXLINE( 118)		 ::borogove::Hash hash = ::borogove::Hash_obj::fromUri(this->uri);
+HXLINE( 119)		::String _hx_tmp = this->text;
+HXDLIN( 119)		::String tmp;
+HXDLIN( 119)		if (::hx::IsNotNull( hash )) {
+HXLINE( 119)			tmp = hash->toUri();
             		}
             		else {
-HXLINE( 104)			tmp = null();
+HXLINE( 119)			tmp = null();
             		}
-HXDLIN( 104)		::String _hx_tmp1;
-HXDLIN( 104)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 104)			_hx_tmp1 = tmp;
+HXDLIN( 119)		::String _hx_tmp1;
+HXDLIN( 119)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 119)			_hx_tmp1 = tmp;
             		}
             		else {
-HXLINE( 104)			_hx_tmp1 = this->uri;
+HXLINE( 119)			_hx_tmp1 = this->uri;
             		}
-HXDLIN( 104)		return ( (::String)(forImage(_hx_tmp,_hx_tmp1)) );
+HXDLIN( 119)		return ( (::String)(forImage(_hx_tmp,_hx_tmp1)) );
             	}
 
 
  ::borogove::CustomEmojiReaction CustomEmojiReaction_obj::custom(::String text,::String uri){
-            	HX_GC_STACKFRAME(&_hx_pos_1234d3fa119c5de7_94_custom)
-HXDLIN(  94)		return  ::borogove::CustomEmojiReaction_obj::__alloc( HX_CTX ,HX_("",00,00,00,00),HX_("",00,00,00,00),text,uri,null());
+            	HX_GC_STACKFRAME(&_hx_pos_1234d3fa119c5de7_102_custom)
+HXDLIN( 102)		return  ::borogove::CustomEmojiReaction_obj::__alloc( HX_CTX ,HX_("",00,00,00,00),HX_("",00,00,00,00),text,uri,null());
             	}
 
 
@@ -199,8 +199,8 @@ void CustomEmojiReaction_obj::__register()
 void CustomEmojiReaction_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_1234d3fa119c5de7_77_boot)
-HXDLIN(  77)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_1234d3fa119c5de7_82_boot)
+HXDLIN(  82)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("uri__fromC",8d,ca,26,b8), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
diff --git a/Sources/c_borogove/src/borogove/DirectChat.cpp b/Sources/c_borogove/src/borogove/DirectChat.cpp
index 9732aae..4444064 100644
--- a/Sources/c_borogove/src/borogove/DirectChat.cpp
+++ b/Sources/c_borogove/src/borogove/DirectChat.cpp
@@ -13,6 +13,18 @@
 #ifndef INCLUDED_Std
 #include <Std.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
+#ifndef INCLUDED_borogove_AvailableChat
+#include <borogove/AvailableChat.h>
+#endif
+#ifndef INCLUDED_borogove_Caps
+#include <borogove/Caps.h>
+#endif
+#ifndef INCLUDED_borogove_CapsRepo
+#include <borogove/CapsRepo.h>
+#endif
 #ifndef INCLUDED_borogove_Chat
 #include <borogove/Chat.h>
 #endif
@@ -46,12 +58,15 @@
 #ifndef INCLUDED_borogove_GenericStream
 #include <borogove/GenericStream.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED_borogove_Html
+#include <borogove/Html.h>
 #endif
 #ifndef INCLUDED_borogove_JID
 #include <borogove/JID.h>
 #endif
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
+#endif
 #ifndef INCLUDED_borogove_Message
 #include <borogove/Message.h>
 #endif
@@ -67,9 +82,6 @@
 #ifndef INCLUDED_borogove_OutboxItem
 #include <borogove/OutboxItem.h>
 #endif
-#ifndef INCLUDED_borogove_Participant
-#include <borogove/Participant.h>
-#endif
 #ifndef INCLUDED_borogove_Persistence
 #include <borogove/Persistence.h>
 #endif
@@ -79,6 +91,9 @@
 #ifndef INCLUDED_borogove_ReactionUpdate
 #include <borogove/ReactionUpdate.h>
 #endif
+#ifndef INCLUDED_borogove_Role
+#include <borogove/Role.h>
+#endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
@@ -94,6 +109,9 @@
 #ifndef INCLUDED_haxe_ds_StringMap
 #include <haxe/ds/StringMap.h>
 #endif
+#ifndef INCLUDED_haxe_iterators_MapKeyValueIterator
+#include <haxe/iterators/MapKeyValueIterator.h>
+#endif
 #ifndef INCLUDED_thenshim_PromiseTools
 #include <thenshim/PromiseTools.h>
 #endif
@@ -104,46 +122,57 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_e6282dde58caedf0_939_new,"borogove.DirectChat","new",0xe0794ae0,"borogove.DirectChat.new","borogove/Chat.hx",939,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_959_getParticipants,"borogove.DirectChat","getParticipants",0xd47a4596,"borogove.DirectChat.getParticipants","borogove/Chat.hx",959,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_945_getParticipants,"borogove.DirectChat","getParticipants",0xd47a4596,"borogove.DirectChat.getParticipants","borogove/Chat.hx",945,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_963_counterparts,"borogove.DirectChat","counterparts",0x8dab4624,"borogove.DirectChat.counterparts","borogove/Chat.hx",963,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_967_getParticipantDetails,"borogove.DirectChat","getParticipantDetails",0xdd134605,"borogove.DirectChat.getParticipantDetails","borogove/Chat.hx",967,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_975_getMessagesBefore,"borogove.DirectChat","getMessagesBefore",0x701bcc21,"borogove.DirectChat.getMessagesBefore","borogove/Chat.hx",975,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_973_getMessagesBefore,"borogove.DirectChat","getMessagesBefore",0x701bcc21,"borogove.DirectChat.getMessagesBefore","borogove/Chat.hx",973,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_992_getMessagesAfter,"borogove.DirectChat","getMessagesAfter",0x74b138ba,"borogove.DirectChat.getMessagesAfter","borogove/Chat.hx",992,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_987_getMessagesAfter,"borogove.DirectChat","getMessagesAfter",0x74b138ba,"borogove.DirectChat.getMessagesAfter","borogove/Chat.hx",987,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1006_getMessagesAround,"borogove.DirectChat","getMessagesAround",0x8bed6fef,"borogove.DirectChat.getMessagesAround","borogove/Chat.hx",1006,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1010_prepareIncomingMessage,"borogove.DirectChat","prepareIncomingMessage",0xf788013a,"borogove.DirectChat.prepareIncomingMessage","borogove/Chat.hx",1010,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1015_prepareOutgoingMessage,"borogove.DirectChat","prepareOutgoingMessage",0x5db4c674,"borogove.DirectChat.prepareOutgoingMessage","borogove/Chat.hx",1015,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1033_correctMessage,"borogove.DirectChat","correctMessage",0x06b2cbfd,"borogove.DirectChat.correctMessage","borogove/Chat.hx",1033,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1027_correctMessage,"borogove.DirectChat","correctMessage",0x06b2cbfd,"borogove.DirectChat.correctMessage","borogove/Chat.hx",1027,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1046_sendMessage,"borogove.DirectChat","sendMessage",0xb60183df,"borogove.DirectChat.sendMessage","borogove/Chat.hx",1046,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1056_sendMessage,"borogove.DirectChat","sendMessage",0xb60183df,"borogove.DirectChat.sendMessage","borogove/Chat.hx",1056,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1069_sendMessage,"borogove.DirectChat","sendMessage",0xb60183df,"borogove.DirectChat.sendMessage","borogove/Chat.hx",1069,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1106_removeReaction,"borogove.DirectChat","removeReaction",0xd2fab98d,"borogove.DirectChat.removeReaction","borogove/Chat.hx",1106,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1083_removeReaction,"borogove.DirectChat","removeReaction",0xd2fab98d,"borogove.DirectChat.removeReaction","borogove/Chat.hx",1083,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1098_removeReaction,"borogove.DirectChat","removeReaction",0xd2fab98d,"borogove.DirectChat.removeReaction","borogove/Chat.hx",1098,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1138_sendMessageStanza,"borogove.DirectChat","sendMessageStanza",0x9c440734,"borogove.DirectChat.sendMessageStanza","borogove/Chat.hx",1138,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1137_sendMessageStanza,"borogove.DirectChat","sendMessageStanza",0x9c440734,"borogove.DirectChat.sendMessageStanza","borogove/Chat.hx",1137,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1112_sendMessageStanza,"borogove.DirectChat","sendMessageStanza",0x9c440734,"borogove.DirectChat.sendMessageStanza","borogove/Chat.hx",1112,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1147_lastMessageId,"borogove.DirectChat","lastMessageId",0xf6102acc,"borogove.DirectChat.lastMessageId","borogove/Chat.hx",1147,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1152_markReadUpTo,"borogove.DirectChat","markReadUpTo",0x03c49dd9,"borogove.DirectChat.markReadUpTo","borogove/Chat.hx",1152,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1170_markReadUpTo,"borogove.DirectChat","markReadUpTo",0x03c49dd9,"borogove.DirectChat.markReadUpTo","borogove/Chat.hx",1170,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1151_markReadUpTo,"borogove.DirectChat","markReadUpTo",0x03c49dd9,"borogove.DirectChat.markReadUpTo","borogove/Chat.hx",1151,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1189_bookmark,"borogove.DirectChat","bookmark",0x64600236,"borogove.DirectChat.bookmark","borogove/Chat.hx",1189,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1174_bookmark,"borogove.DirectChat","bookmark",0x64600236,"borogove.DirectChat.bookmark","borogove/Chat.hx",1174,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1197_sendChatState,"borogove.DirectChat","sendChatState",0x3d4cbc31,"borogove.DirectChat.sendChatState","borogove/Chat.hx",1197,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1217_close,"borogove.DirectChat","close",0x98bc3238,"borogove.DirectChat.close","borogove/Chat.hx",1217,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_937_boot,"borogove.DirectChat","boot",0x81c139b2,"borogove.DirectChat.boot","borogove/Chat.hx",937,0x1763ae98)
+HX_DEFINE_STACK_FRAME(_hx_pos_e6282dde58caedf0_1056_new,"borogove.DirectChat","new",0xe0794ae0,"borogove.DirectChat.new","borogove/Chat.hx",1056,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1082_setPresence,"borogove.DirectChat","setPresence",0x291c167d,"borogove.DirectChat.setPresence","borogove/Chat.hx",1082,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1083_setPresence,"borogove.DirectChat","setPresence",0x291c167d,"borogove.DirectChat.setPresence","borogove/Chat.hx",1083,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1069_setPresence,"borogove.DirectChat","setPresence",0x291c167d,"borogove.DirectChat.setPresence","borogove/Chat.hx",1069,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1095_getCaps,"borogove.DirectChat","getCaps",0x00f18657,"borogove.DirectChat.getCaps","borogove/Chat.hx",1095,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1091_getCaps,"borogove.DirectChat","getCaps",0x00f18657,"borogove.DirectChat.getCaps","borogove/Chat.hx",1091,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1103_getResourceCaps,"borogove.DirectChat","getResourceCaps",0x4bbab445,"borogove.DirectChat.getResourceCaps","borogove/Chat.hx",1103,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1108_getDisplayName,"borogove.DirectChat","getDisplayName",0xca7ffa37,"borogove.DirectChat.getDisplayName","borogove/Chat.hx",1108,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1121_members,"borogove.DirectChat","members",0x0724e759,"borogove.DirectChat.members","borogove/Chat.hx",1121,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1125_getMemberDetails,"borogove.DirectChat","getMemberDetails",0xd04f2092,"borogove.DirectChat.getMemberDetails","borogove/Chat.hx",1125,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1141_setLastMessage,"borogove.DirectChat","setLastMessage",0x086abb0f,"borogove.DirectChat.setLastMessage","borogove/Chat.hx",1141,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1151_counterparts,"borogove.DirectChat","counterparts",0x8dab4624,"borogove.DirectChat.counterparts","borogove/Chat.hx",1151,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1159_getMessagesBefore,"borogove.DirectChat","getMessagesBefore",0x701bcc21,"borogove.DirectChat.getMessagesBefore","borogove/Chat.hx",1159,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1155_getMessagesBefore,"borogove.DirectChat","getMessagesBefore",0x701bcc21,"borogove.DirectChat.getMessagesBefore","borogove/Chat.hx",1155,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1178_getMessagesAfter,"borogove.DirectChat","getMessagesAfter",0x74b138ba,"borogove.DirectChat.getMessagesAfter","borogove/Chat.hx",1178,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1171_getMessagesAfter,"borogove.DirectChat","getMessagesAfter",0x74b138ba,"borogove.DirectChat.getMessagesAfter","borogove/Chat.hx",1171,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1190_getMessagesAround,"borogove.DirectChat","getMessagesAround",0x8bed6fef,"borogove.DirectChat.getMessagesAround","borogove/Chat.hx",1190,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1198_prepareIncomingMessage,"borogove.DirectChat","prepareIncomingMessage",0xf788013a,"borogove.DirectChat.prepareIncomingMessage","borogove/Chat.hx",1198,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1204_prepareOutgoingMessage,"borogove.DirectChat","prepareOutgoingMessage",0x5db4c674,"borogove.DirectChat.prepareOutgoingMessage","borogove/Chat.hx",1204,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1223_correctMessage,"borogove.DirectChat","correctMessage",0x06b2cbfd,"borogove.DirectChat.correctMessage","borogove/Chat.hx",1223,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1229_correctMessage,"borogove.DirectChat","correctMessage",0x06b2cbfd,"borogove.DirectChat.correctMessage","borogove/Chat.hx",1229,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1217_correctMessage,"borogove.DirectChat","correctMessage",0x06b2cbfd,"borogove.DirectChat.correctMessage","borogove/Chat.hx",1217,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1237_sendMessage,"borogove.DirectChat","sendMessage",0xb60183df,"borogove.DirectChat.sendMessage","borogove/Chat.hx",1237,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1255_sendMessage,"borogove.DirectChat","sendMessage",0xb60183df,"borogove.DirectChat.sendMessage","borogove/Chat.hx",1255,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1247_sendMessage,"borogove.DirectChat","sendMessage",0xb60183df,"borogove.DirectChat.sendMessage","borogove/Chat.hx",1247,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1261_sendMessage,"borogove.DirectChat","sendMessage",0xb60183df,"borogove.DirectChat.sendMessage","borogove/Chat.hx",1261,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1301_removeReaction,"borogove.DirectChat","removeReaction",0xd2fab98d,"borogove.DirectChat.removeReaction","borogove/Chat.hx",1301,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1275_removeReaction,"borogove.DirectChat","removeReaction",0xd2fab98d,"borogove.DirectChat.removeReaction","borogove/Chat.hx",1275,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1293_removeReaction,"borogove.DirectChat","removeReaction",0xd2fab98d,"borogove.DirectChat.removeReaction","borogove/Chat.hx",1293,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1333_sendMessageStanza,"borogove.DirectChat","sendMessageStanza",0x9c440734,"borogove.DirectChat.sendMessageStanza","borogove/Chat.hx",1333,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1332_sendMessageStanza,"borogove.DirectChat","sendMessageStanza",0x9c440734,"borogove.DirectChat.sendMessageStanza","borogove/Chat.hx",1332,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1307_sendMessageStanza,"borogove.DirectChat","sendMessageStanza",0x9c440734,"borogove.DirectChat.sendMessageStanza","borogove/Chat.hx",1307,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1346_markReadUpTo,"borogove.DirectChat","markReadUpTo",0x03c49dd9,"borogove.DirectChat.markReadUpTo","borogove/Chat.hx",1346,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1364_markReadUpTo,"borogove.DirectChat","markReadUpTo",0x03c49dd9,"borogove.DirectChat.markReadUpTo","borogove/Chat.hx",1364,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1341_markReadUpTo,"borogove.DirectChat","markReadUpTo",0x03c49dd9,"borogove.DirectChat.markReadUpTo","borogove/Chat.hx",1341,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1383_bookmark,"borogove.DirectChat","bookmark",0x64600236,"borogove.DirectChat.bookmark","borogove/Chat.hx",1383,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1368_bookmark,"borogove.DirectChat","bookmark",0x64600236,"borogove.DirectChat.bookmark","borogove/Chat.hx",1368,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1391_sendChatState,"borogove.DirectChat","sendChatState",0x3d4cbc31,"borogove.DirectChat.sendChatState","borogove/Chat.hx",1391,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1411_close,"borogove.DirectChat","close",0x98bc3238,"borogove.DirectChat.close","borogove/Chat.hx",1411,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_e6282dde58caedf0_1056_boot,"borogove.DirectChat","boot",0x81c139b2,"borogove.DirectChat.boot","borogove/Chat.hx",1056,0x1763ae98)
 namespace borogove{
 
-void DirectChat_obj::__construct( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs){
+void DirectChat_obj::__construct( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs){
             		int uiState = __o_uiState.Default(1);
+            		bool isBookmarked = __o_isBookmarked.Default(false);
             		bool isBlocked = __o_isBlocked.Default(false);
-            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_939_new)
-HXLINE( 940)		super::__construct(client,stream,persistence,chatId,uiState,isBlocked,extensions,readUpToId,readUpToBy,omemoContactDeviceIDs);
-HXLINE( 941)		this->outbox->start();
+            	HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1056_new)
+HXLINE(1058)		this->presence =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(1063)		super::__construct(client,stream,persistence,chatId,uiState,isBookmarked,isBlocked,extensions,readUpToId,readUpToBy,omemoContactDeviceIDs);
+HXLINE(1064)		this->_fullCounterparts = this->counterparts();
+HXLINE(1065)		this->outbox->start();
             	}
 
 Dynamic DirectChat_obj::__CreateEmpty() { return new DirectChat_obj; }
@@ -153,378 +182,607 @@ void *DirectChat_obj::_hx_vtable = 0;
 Dynamic DirectChat_obj::__Create(::hx::DynamicArray inArgs)
 {
 	::hx::ObjectPtr< DirectChat_obj > _hx_result = new DirectChat_obj();
-	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2],inArgs[3],inArgs[4],inArgs[5],inArgs[6],inArgs[7],inArgs[8],inArgs[9]);
+	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2],inArgs[3],inArgs[4],inArgs[5],inArgs[6],inArgs[7],inArgs[8],inArgs[9],inArgs[10]);
 	return _hx_result;
 }
 
 bool DirectChat_obj::_hx_isInstanceOf(int inClassId) {
-	if (inClassId<=(int)0x2acf7e59) {
-		return inClassId==(int)0x00000001 || inClassId==(int)0x2acf7e59;
+	if (inClassId<=(int)0x31b454e2) {
+		if (inClassId<=(int)0x2acf7e59) {
+			return inClassId==(int)0x00000001 || inClassId==(int)0x2acf7e59;
+		} else {
+			return inClassId==(int)0x31b454e2;
+		}
 	} else {
-		return inClassId==(int)0x31b454e2;
+		return inClassId==(int)0x4fb834f5;
 	}
 }
 
-::Array< ::String > DirectChat_obj::getParticipants(){
-            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::haxe::ds::StringMap,ids) HXARGC(0)
+void DirectChat_obj::setPresence(::String resource, ::borogove::Stanza presence,bool noStore){
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::DirectChat,_gthis) HXARGC(1)
+            		::Dynamic _hx_run(::Array< ::Dynamic> members){
+            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0,::Array< ::Dynamic>,members) HXARGC(1)
+            			::Array< ::Dynamic> _hx_run(bool _){
+            				HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1082_setPresence)
+HXLINE(1082)				return members;
+            			}
+            			HX_END_LOCAL_FUNC1(return)
+
+            			HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1082_setPresence)
+HXLINE(1082)			::Dynamic _gthis1 = _gthis->persistence;
+HXDLIN(1082)			::String _hx_tmp = _gthis->client->accountId();
+HXDLIN(1082)			return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMembers(_gthis1,_hx_tmp,_gthis->chatId,members), ::Dynamic(new _hx_Closure_0(members)),null());
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::borogove::DirectChat,_gthis) HXARGC(1)
+            		::Dynamic _hx_run(::Array< ::Dynamic> members){
+            			HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1083_setPresence)
+HXLINE(1084)			_gthis->trigger(HX_("members/update",bf,63,66,64),members);
+HXLINE(1085)			_gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
+HXLINE(1086)			return null();
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1069_setPresence)
+HXDLIN(1069)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1071)		if ((this->_fullCounterparts->length > 1)) {
+HXLINE(1071)			return;
+            		}
+HXLINE(1073)		if ((( (::String)(::Reflect_obj::field(presence->attr,HX_("type",ba,f2,08,4d))) ) == HX_("unavailable",50,e0,29,fd))) {
+HXLINE(1074)			this->presence->remove(resource);
+            		}
+            		else {
+HXLINE(1076)			this->presence->set(resource,presence);
+            		}
+HXLINE(1079)		if (noStore) {
+HXLINE(1079)			return;
+            		}
+HXLINE(1081)		::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->getMemberDetails(this->_fullCounterparts), ::Dynamic(new _hx_Closure_1(_gthis)),null()), ::Dynamic(new _hx_Closure_2(_gthis)),null());
+            	}
+
+
+ ::Dynamic DirectChat_obj::getCaps(){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::DirectChat,_gthis, ::Dynamic,iter) HXARGC(0)
             		 ::Dynamic _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_959_getParticipants)
-HXLINE( 959)			return ids->keys();
+            			HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1095_getCaps)
+HXLINE(1096)			 ::Dynamic n = iter->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
+HXLINE(1097)			::String n1 = ( (::String)(n->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic)) );
+HXDLIN(1097)			return  ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("key",9f,89,51,00),n1)
+            				->setFixed(1,HX_("value",71,7f,b8,31),_gthis->client->capsRepo->get(( ( ::borogove::Stanza)(n->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)) ))));
             		}
             		HX_END_LOCAL_FUNC0(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_945_getParticipants)
-HXLINE( 946)		::Array< ::String > counters = this->counterparts();
-HXLINE( 947)		 ::haxe::ds::StringMap ids =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE( 948)		bool _hx_tmp;
-HXDLIN( 948)		if ((counters->length < 2)) {
-HXLINE( 948)			 ::borogove::ChatMessage tmp = this->lastMessage;
-HXDLIN( 948)			::Array< ::Dynamic> tmp1;
-HXDLIN( 948)			if (::hx::IsNotNull( tmp )) {
-HXLINE( 948)				tmp1 = tmp->recipients;
+            	HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1091_getCaps)
+HXDLIN(1091)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1092)		 ::Dynamic iter =  ::haxe::iterators::MapKeyValueIterator_obj::__alloc( HX_CTX ,this->presence);
+HXLINE(1093)		return  ::Dynamic(::hx::Anon_obj::Create(2)
+            			->setFixed(0,HX_("hasNext",6d,a5,46,18), ::Dynamic(iter->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)))
+            			->setFixed(1,HX_("next",f3,84,02,49), ::Dynamic(new _hx_Closure_0(_gthis,iter))));
+            	}
+
+
+ ::borogove::Caps DirectChat_obj::getResourceCaps(::String resource){
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1103_getResourceCaps)
+HXLINE(1104)		 ::borogove::Stanza p = ( ( ::borogove::Stanza)(this->presence->get(resource)) );
+HXLINE(1105)		if (::hx::IsNull( p )) {
+HXLINE(1105)			return ::borogove::CapsRepo_obj::empty;
+            		}
+            		else {
+HXLINE(1105)			return this->client->capsRepo->get(p);
+            		}
+HXDLIN(1105)		return null();
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(DirectChat_obj,getResourceCaps,return )
+
+::String DirectChat_obj::getDisplayName(){
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1108_getDisplayName)
+HXLINE(1109)		::String name = this->super::getDisplayName();
+HXLINE(1110)		bool _hx_tmp;
+HXDLIN(1110)		if ((name == this->chatId)) {
+HXLINE(1110)			_hx_tmp = (this->_fullCounterparts->length > 1);
+            		}
+            		else {
+HXLINE(1110)			_hx_tmp = false;
+            		}
+HXDLIN(1110)		if (_hx_tmp) {
+HXLINE(1111)			::Array< ::String > _this = this->_fullCounterparts;
+HXDLIN(1111)			::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN(1111)			{
+HXLINE(1111)				int _g = 0;
+HXDLIN(1111)				int _g1 = _this->length;
+HXDLIN(1111)				while((_g < _g1)){
+HXLINE(1111)					_g = (_g + 1);
+HXDLIN(1111)					int i = (_g - 1);
+HXDLIN(1111)					{
+HXLINE(1111)						::String id = ( (::String)(_hx_array_unsafe_get(_this,i)) );
+HXDLIN(1111)						::String inValue = this->client->getDirectChat(id,null())->getDisplayName();
+HXDLIN(1111)						result->__unsafe_set(i,inValue);
+            					}
+            				}
+            			}
+HXLINE(1112)			result->sort(::Reflect_obj::compare_dyn());
+HXLINE(1113)			return result->join(HX_(", ",74,26,00,00));
+            		}
+HXLINE(1116)		return name;
+            	}
+
+
+::Dynamic DirectChat_obj::members(){
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1121_members)
+HXDLIN(1121)		::Array< ::String > _hx_tmp = this->_fullCounterparts;
+HXDLIN(1121)		return this->getMemberDetails(_hx_tmp->concat(::Array_obj< ::String >::__new(1)->init(0,this->client->accountId())));
+            	}
+
+
+::Dynamic DirectChat_obj::getMemberDetails(::Array< ::String > memberIds){
+            	HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1125_getMemberDetails)
+HXLINE(1126)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(memberIds->length);
+HXDLIN(1126)		{
+HXLINE(1126)			int _g = 0;
+HXDLIN(1126)			int _g1 = memberIds->length;
+HXDLIN(1126)			while((_g < _g1)){
+HXLINE(1126)				_g = (_g + 1);
+HXDLIN(1126)				int i = (_g - 1);
+HXDLIN(1126)				{
+HXLINE(1126)					::String id = ( (::String)(_hx_array_unsafe_get(memberIds,i)) );
+HXLINE(1127)					 ::borogove::DirectChat chat = this->client->getDirectChat(id,null());
+HXLINE(1130)					::String inValue = chat->getDisplayName();
+HXLINE(1131)					::String inValue1 = chat->getPhoto();
+HXLINE(1132)					::String chat1 = chat->chatId;
+HXDLIN(1132)					bool inValue2 = (chat1 == this->client->accountId());
+HXLINE(1134)					 ::borogove::JID inValue3 = ::borogove::JID_obj::parse(id);
+HXLINE(1135)					 ::haxe::ds::StringMap chat2 = chat->presence;
+HXLINE(1136)					::String inValue4 = chat->getDisplayName();
+HXLINE(1126)					 ::borogove::Member inValue5 =  ::borogove::Member_obj::__alloc( HX_CTX ,id,inValue,inValue1,inValue2,::Array_obj< ::Dynamic>::__new(0),inValue3,chat2, ::borogove::AvailableChat_obj::__alloc( HX_CTX ,id,inValue4,((((HX_("",00,00,00,00) + id) + HX_(" (via ",9a,ee,c1,21)) + this->displayName) + HX_(")",29,00,00,00)),::borogove::CapsRepo_obj::empty));
+HXDLIN(1126)					result->__unsafe_set(i,inValue5);
+            				}
+            			}
+            		}
+HXDLIN(1126)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(result);
+            	}
+
+
+::Dynamic DirectChat_obj::setLastMessage( ::borogove::ChatMessage message){
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1141_setLastMessage)
+HXLINE(1143)		bool _hx_tmp;
+HXDLIN(1143)		if ((this->_fullCounterparts->length < 2)) {
+HXLINE(1143)			::Array< ::Dynamic> tmp;
+HXDLIN(1143)			if (::hx::IsNotNull( message )) {
+HXLINE(1143)				tmp = message->recipients;
             			}
             			else {
-HXLINE( 948)				tmp1 = null();
+HXLINE(1143)				tmp = null();
             			}
-HXDLIN( 948)			 ::Dynamic tmp2;
-HXDLIN( 948)			if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 948)				tmp2 = tmp1->length;
+HXDLIN(1143)			 ::Dynamic tmp1;
+HXDLIN(1143)			if (::hx::IsNotNull( tmp )) {
+HXLINE(1143)				tmp1 = tmp->length;
             			}
             			else {
-HXLINE( 948)				tmp2 = null();
+HXLINE(1143)				tmp1 = null();
             			}
-HXDLIN( 948)			int _hx_tmp1;
-HXDLIN( 948)			if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 948)				_hx_tmp1 = ( (int)(tmp2) );
+HXDLIN(1143)			int _hx_tmp1;
+HXDLIN(1143)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE(1143)				_hx_tmp1 = ( (int)(tmp1) );
             			}
             			else {
-HXLINE( 948)				_hx_tmp1 = 0;
+HXLINE(1143)				_hx_tmp1 = 0;
             			}
-HXDLIN( 948)			_hx_tmp = (_hx_tmp1 > 1);
+HXDLIN(1143)			_hx_tmp = (_hx_tmp1 > 1);
             		}
             		else {
-HXLINE( 948)			_hx_tmp = false;
-            		}
-HXDLIN( 948)		if (_hx_tmp) {
-HXLINE( 949)			ids->set(this->lastMessage->senderId,true);
-HXLINE( 950)			{
-HXLINE( 950)				int _g = 0;
-HXDLIN( 950)				::Array< ::Dynamic> _this = this->lastMessage->recipients;
-HXDLIN( 950)				::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN( 950)				{
-HXLINE( 950)					int _g1 = 0;
-HXDLIN( 950)					int _g2 = _this->length;
-HXDLIN( 950)					while((_g1 < _g2)){
-HXLINE( 950)						_g1 = (_g1 + 1);
-HXDLIN( 950)						int i = (_g1 - 1);
-HXDLIN( 950)						{
-HXLINE( 950)							::String inValue = ( ( ::borogove::JID)(_hx_array_unsafe_get(_this,i)) )->asString();
-HXDLIN( 950)							result->__unsafe_set(i,inValue);
-            						}
+HXLINE(1143)			_hx_tmp = false;
+            		}
+HXDLIN(1143)		if (_hx_tmp) {
+HXLINE(1144)			::Array< ::Dynamic> _this = message->recipients;
+HXDLIN(1144)			::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN(1144)			{
+HXLINE(1144)				int _g = 0;
+HXDLIN(1144)				int _g1 = _this->length;
+HXDLIN(1144)				while((_g < _g1)){
+HXLINE(1144)					_g = (_g + 1);
+HXDLIN(1144)					int i = (_g - 1);
+HXDLIN(1144)					{
+HXLINE(1144)						::String inValue = ( ( ::borogove::JID)(_hx_array_unsafe_get(_this,i)) )->asBare()->asString();
+HXDLIN(1144)						result->__unsafe_set(i,inValue);
             					}
             				}
-HXDLIN( 950)				while((_g < result->length)){
-HXLINE( 950)					::String id = result->__get(_g);
-HXDLIN( 950)					_g = (_g + 1);
-HXLINE( 951)					ids->set(id,true);
-            				}
             			}
-            		}
-            		else {
-HXLINE( 954)			{
-HXLINE( 954)				::String k = this->client->accountId();
-HXDLIN( 954)				ids->set(k,true);
-            			}
-HXLINE( 955)			{
-HXLINE( 955)				int _g3 = 0;
-HXDLIN( 955)				::Array< ::String > _g4 = this->counterparts();
-HXDLIN( 955)				while((_g3 < _g4->length)){
-HXLINE( 955)					::String id1 = _g4->__get(_g3);
-HXDLIN( 955)					_g3 = (_g3 + 1);
-HXLINE( 956)					ids->set(id1,true);
+HXDLIN(1144)			::Array< ::String > _g2 = ::Array_obj< ::String >::__new(0);
+HXDLIN(1144)			{
+HXLINE(1144)				int _g3 = 0;
+HXDLIN(1144)				while((_g3 < result->length)){
+HXLINE(1144)					::String v = result->__get(_g3);
+HXDLIN(1144)					_g3 = (_g3 + 1);
+HXDLIN(1144)					if ((v != this->client->accountId())) {
+HXLINE(1144)						_g2->push(v);
+            					}
             				}
             			}
+HXDLIN(1144)			this->_fullCounterparts = _g2;
+HXLINE(1145)			if (!(this->_fullCounterparts->contains(message->senderId))) {
+HXLINE(1145)				this->_fullCounterparts->push(message->senderId);
+            			}
             		}
-HXLINE( 959)		return ::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("iterator",ee,49,9a,93), ::Dynamic(new _hx_Closure_0(ids)))));
+HXLINE(1147)		return this->super::setLastMessage(message);
             	}
 
 
 ::Array< ::String > DirectChat_obj::counterparts(){
-            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_963_counterparts)
-HXDLIN( 963)		return this->chatId.split(HX_("\n",0a,00,00,00));
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1151_counterparts)
+HXDLIN(1151)		return this->chatId.split(HX_("\n",0a,00,00,00));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(DirectChat_obj,counterparts,return )
 
- ::borogove::Participant DirectChat_obj::getParticipantDetails(::String participantId){
-            	HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_967_getParticipantDetails)
-HXLINE( 968)		 ::borogove::DirectChat chat = this->client->getDirectChat(participantId,null());
-HXLINE( 969)		::String _hx_tmp = chat->getDisplayName();
-HXDLIN( 969)		::String _hx_tmp1 = chat->getPhoto();
-HXDLIN( 969)		::String _hx_tmp2 = chat->getPlaceholder();
-HXDLIN( 969)		::String chat1 = chat->chatId;
-HXDLIN( 969)		bool _hx_tmp3 = (chat1 == this->client->accountId());
-HXDLIN( 969)		return  ::borogove::Participant_obj::__alloc( HX_CTX ,_hx_tmp,_hx_tmp1,_hx_tmp2,_hx_tmp3,::borogove::JID_obj::parse(participantId));
-            	}
-
-
-::Dynamic DirectChat_obj::getMessagesBefore(::String beforeId,::String beforeTime){
-            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::DirectChat,_gthis,::String,beforeId) HXARGC(1)
+::Dynamic DirectChat_obj::getMessagesBefore( ::borogove::ChatMessage before){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::DirectChat,_gthis, ::borogove::ChatMessage,before) HXARGC(1)
             		::Dynamic _hx_run(::Array< ::Dynamic> messages){
-            			HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_975_getMessagesBefore)
-HXLINE( 975)			if ((messages->length > 0)) {
-HXLINE( 976)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(messages);
+            			HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1159_getMessagesBefore)
+HXLINE(1159)			bool _hx_tmp;
+HXDLIN(1159)			if ((messages->length <= 0)) {
+HXLINE(1159)				if (::hx::IsNotNull( before )) {
+HXLINE(1159)					_hx_tmp = ::hx::IsNull( before->serverId );
+            				}
+            				else {
+HXLINE(1159)					_hx_tmp = false;
+            				}
+            			}
+            			else {
+HXLINE(1159)				_hx_tmp = true;
+            			}
+HXDLIN(1159)			if (_hx_tmp) {
+HXLINE(1160)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(messages);
             			}
             			else {
-HXLINE( 978)				 ::Dynamic filter =  ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1162)				 ::Dynamic filter =  ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("with",06,76,f8,4e),_gthis->chatId));
-HXLINE( 979)				if (::hx::IsNotNull( beforeId )) {
-HXLINE( 979)					filter->__SetField(HX_("page",4f,da,51,4a), ::Dynamic(::hx::Anon_obj::Create(1)
-            						->setFixed(0,HX_("before",7f,54,32,9a),beforeId)),::hx::paccDynamic);
+HXLINE(1163)				::String tmp;
+HXDLIN(1163)				if (::hx::IsNotNull( before )) {
+HXLINE(1163)					tmp = before->serverId;
             				}
-HXLINE( 980)				 ::borogove::MessageSync sync =  ::borogove::MessageSync_obj::__alloc( HX_CTX ,_gthis->client,_gthis->stream,filter,null());
-HXLINE( 981)				return _gthis->fetchFromSync(sync);
+            				else {
+HXLINE(1163)					tmp = null();
+            				}
+HXDLIN(1163)				::String _hx_tmp1;
+HXDLIN(1163)				if (::hx::IsNotNull( tmp )) {
+HXLINE(1163)					_hx_tmp1 = tmp;
+            				}
+            				else {
+HXLINE(1163)					_hx_tmp1 = HX_("",00,00,00,00);
+            				}
+HXDLIN(1163)				filter->__SetField(HX_("page",4f,da,51,4a), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("before",7f,54,32,9a),_hx_tmp1)),::hx::paccDynamic);
+HXLINE(1164)				::String sync;
+HXDLIN(1164)				if (::hx::IsNotNull( before )) {
+HXLINE(1164)					sync = before->sortId;
+            				}
+            				else {
+HXLINE(1164)					sync = null();
+            				}
+HXDLIN(1164)				 ::borogove::MessageSync sync1 =  ::borogove::MessageSync_obj::__alloc( HX_CTX ,_gthis->client,_gthis->stream,filter,null(),sync,null());
+HXLINE(1165)				return _gthis->fetchFromSync(sync1);
             			}
-HXLINE( 975)			return null();
+HXLINE(1159)			return null();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_973_getMessagesBefore)
-HXDLIN( 973)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 974)		::Dynamic _hx_tmp = this->persistence;
-HXDLIN( 974)		::String _hx_tmp1 = this->client->accountId();
-HXDLIN( 974)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesBefore(_hx_tmp,_hx_tmp1,this->chatId,beforeId,beforeTime), ::Dynamic(new _hx_Closure_0(_gthis,beforeId)),null());
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1155_getMessagesBefore)
+HXDLIN(1155)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1156)		bool _hx_tmp;
+HXDLIN(1156)		if (::hx::IsNotNull( before )) {
+HXLINE(1156)			::String _hx_tmp1 = before->chatId();
+HXDLIN(1156)			_hx_tmp = (_hx_tmp1 != this->chatId);
+            		}
+            		else {
+HXLINE(1156)			_hx_tmp = false;
+            		}
+HXDLIN(1156)		if (_hx_tmp) {
+HXLINE(1156)			HX_STACK_DO_THROW(HX_("Cannot look before from a different chat",f7,e6,d9,fa));
+            		}
+HXLINE(1158)		::Dynamic _hx_tmp2 = this->persistence;
+HXDLIN(1158)		::String _hx_tmp3 = this->client->accountId();
+HXDLIN(1158)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesBefore(_hx_tmp2,_hx_tmp3,this->chatId,before), ::Dynamic(new _hx_Closure_0(_gthis,before)),null());
             	}
 
 
-::Dynamic DirectChat_obj::getMessagesAfter(::String afterId,::String afterTime){
-            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::DirectChat,_gthis,::String,afterId) HXARGC(1)
+::Dynamic DirectChat_obj::getMessagesAfter( ::borogove::ChatMessage after){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::ChatMessage,after, ::borogove::DirectChat,_gthis) HXARGC(1)
             		::Dynamic _hx_run(::Array< ::Dynamic> messages){
-            			HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_992_getMessagesAfter)
-HXLINE( 992)			if ((messages->length > 0)) {
-HXLINE( 993)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(messages);
+            			HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1178_getMessagesAfter)
+HXLINE(1178)			bool _hx_tmp;
+HXDLIN(1178)			if ((messages->length <= 0)) {
+HXLINE(1178)				if (::hx::IsNotNull( after )) {
+HXLINE(1178)					_hx_tmp = ::hx::IsNull( after->serverId );
+            				}
+            				else {
+HXLINE(1178)					_hx_tmp = false;
+            				}
+            			}
+            			else {
+HXLINE(1178)				_hx_tmp = true;
+            			}
+HXDLIN(1178)			if (_hx_tmp) {
+HXLINE(1179)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(messages);
             			}
             			else {
-HXLINE( 995)				 ::Dynamic filter =  ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1181)				 ::Dynamic filter =  ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("with",06,76,f8,4e),_gthis->chatId));
-HXLINE( 996)				if (::hx::IsNotNull( afterId )) {
-HXLINE( 996)					filter->__SetField(HX_("page",4f,da,51,4a), ::Dynamic(::hx::Anon_obj::Create(1)
-            						->setFixed(0,HX_("after",1c,66,a2,1d),afterId)),::hx::paccDynamic);
+HXLINE(1182)				::String _hx_tmp1;
+HXDLIN(1182)				if (::hx::IsNotNull( after )) {
+HXLINE(1182)					_hx_tmp1 = after->serverId;
             				}
-HXLINE( 997)				 ::borogove::MessageSync sync =  ::borogove::MessageSync_obj::__alloc( HX_CTX ,_gthis->client,_gthis->stream,filter,null());
-HXLINE( 998)				return _gthis->fetchFromSync(sync);
+            				else {
+HXLINE(1182)					_hx_tmp1 = null();
+            				}
+HXDLIN(1182)				if (::hx::IsNotNull( _hx_tmp1 )) {
+HXLINE(1182)					filter->__SetField(HX_("page",4f,da,51,4a), ::Dynamic(::hx::Anon_obj::Create(1)
+            						->setFixed(0,HX_("after",1c,66,a2,1d),after->serverId)),::hx::paccDynamic);
+            				}
+HXLINE(1183)				::String sync;
+HXDLIN(1183)				if (::hx::IsNotNull( after )) {
+HXLINE(1183)					sync = after->sortId;
+            				}
+            				else {
+HXLINE(1183)					sync = null();
+            				}
+HXDLIN(1183)				 ::borogove::MessageSync sync1 =  ::borogove::MessageSync_obj::__alloc( HX_CTX ,_gthis->client,_gthis->stream,filter,sync,null(),null());
+HXLINE(1184)				return _gthis->fetchFromSync(sync1);
             			}
-HXLINE( 992)			return null();
+HXLINE(1178)			return null();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_987_getMessagesAfter)
-HXDLIN( 987)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 988)		bool _hx_tmp;
-HXDLIN( 988)		::String afterId1 = afterId;
-HXDLIN( 988)		if ((afterId1 == this->lastMessageId())) {
-HXLINE( 988)			_hx_tmp = !(this->syncing());
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1171_getMessagesAfter)
+HXDLIN(1171)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1172)		bool _hx_tmp;
+HXDLIN(1172)		if (::hx::IsNotNull( after )) {
+HXLINE(1172)			::String _hx_tmp1 = after->chatId();
+HXDLIN(1172)			_hx_tmp = (_hx_tmp1 != this->chatId);
+            		}
+            		else {
+HXLINE(1172)			_hx_tmp = false;
+            		}
+HXDLIN(1172)		if (_hx_tmp) {
+HXLINE(1172)			HX_STACK_DO_THROW(HX_("Cannot look after from a different chat",8c,1a,5f,f4));
+            		}
+HXLINE(1173)		bool _hx_tmp2;
+HXDLIN(1173)		bool _hx_tmp3;
+HXDLIN(1173)		bool _hx_tmp4;
+HXDLIN(1173)		if (::hx::IsNotNull( after )) {
+HXLINE(1173)			_hx_tmp4 = ::hx::IsNotNull( this->lastMessage );
+            		}
+            		else {
+HXLINE(1173)			_hx_tmp4 = false;
+            		}
+HXDLIN(1173)		if (_hx_tmp4) {
+HXLINE(1173)			_hx_tmp3 = this->lastMessage->canReplace(after);
             		}
             		else {
-HXLINE( 988)			_hx_tmp = false;
+HXLINE(1173)			_hx_tmp3 = false;
+            		}
+HXDLIN(1173)		if (_hx_tmp3) {
+HXLINE(1173)			_hx_tmp2 = !(this->syncing());
             		}
-HXDLIN( 988)		if (_hx_tmp) {
-HXLINE( 989)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+            		else {
+HXLINE(1173)			_hx_tmp2 = false;
             		}
-HXLINE( 991)		::Dynamic _hx_tmp1 = this->persistence;
-HXDLIN( 991)		::String _hx_tmp2 = this->client->accountId();
-HXDLIN( 991)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesAfter(_hx_tmp1,_hx_tmp2,this->chatId,afterId,afterTime), ::Dynamic(new _hx_Closure_0(_gthis,afterId)),null());
+HXDLIN(1173)		if (_hx_tmp2) {
+HXLINE(1174)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+            		}
+HXLINE(1177)		::Dynamic _hx_tmp5 = this->persistence;
+HXDLIN(1177)		::String _hx_tmp6 = this->client->accountId();
+HXDLIN(1177)		return ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesAfter(_hx_tmp5,_hx_tmp6,this->chatId,after), ::Dynamic(new _hx_Closure_0(after,_gthis)),null());
             	}
 
 
-::Dynamic DirectChat_obj::getMessagesAround(::String aroundId,::String aroundTime){
-            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1006_getMessagesAround)
-HXDLIN(1006)		::Dynamic _hx_tmp = this->persistence;
-HXDLIN(1006)		::String _hx_tmp1 = this->client->accountId();
-HXDLIN(1006)		return ::borogove::Persistence_obj::getMessagesAround(_hx_tmp,_hx_tmp1,this->chatId,aroundId,aroundTime);
+::Dynamic DirectChat_obj::getMessagesAround( ::borogove::ChatMessage around){
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1190_getMessagesAround)
+HXLINE(1191)		::String _hx_tmp = around->chatId();
+HXDLIN(1191)		if ((_hx_tmp != this->chatId)) {
+HXLINE(1191)			HX_STACK_DO_THROW(HX_("Cannot look around from a different chat",45,55,1b,ba));
+            		}
+HXLINE(1194)		::Dynamic _hx_tmp1 = this->persistence;
+HXDLIN(1194)		return ::borogove::Persistence_obj::getMessagesAround(_hx_tmp1,this->client->accountId(),around);
             	}
 
 
  ::borogove::ChatMessageBuilder DirectChat_obj::prepareIncomingMessage( ::borogove::ChatMessageBuilder message, ::borogove::Stanza stanza){
-            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1010_prepareIncomingMessage)
-HXLINE(1011)		message->syncPoint = !(this->syncing());
-HXLINE(1012)		return message;
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1198_prepareIncomingMessage)
+HXLINE(1199)		message->syncPoint = !(this->syncing());
+HXLINE(1200)		if (::hx::IsNull( message->sortId )) {
+HXLINE(1200)			message->sortId = this->client->nextSortId();
+            		}
+HXLINE(1201)		return message;
             	}
 
 
  ::borogove::ChatMessageBuilder DirectChat_obj::prepareOutgoingMessage( ::borogove::ChatMessageBuilder message){
-            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1015_prepareOutgoingMessage)
-HXLINE(1016)		::String tmp = message->timestamp;
-HXDLIN(1016)		::String _hx_tmp;
-HXDLIN(1016)		if (::hx::IsNotNull( tmp )) {
-HXLINE(1016)			_hx_tmp = tmp;
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1204_prepareOutgoingMessage)
+HXLINE(1205)		::String tmp = message->timestamp;
+HXDLIN(1205)		::String _hx_tmp;
+HXDLIN(1205)		if (::hx::IsNotNull( tmp )) {
+HXLINE(1205)			_hx_tmp = tmp;
             		}
             		else {
-HXLINE(1016)			_hx_tmp = ::borogove::Date_obj::format(::Date_obj::now());
-            		}
-HXDLIN(1016)		message->timestamp = _hx_tmp;
-HXLINE(1017)		message->direction = 1;
-HXLINE(1018)		message->from = this->client->jid;
-HXLINE(1019)		message->sender = message->from->asBare();
-HXLINE(1020)		message->replyTo = ::Array_obj< ::Dynamic>::__new(1)->init(0,message->sender);
-HXLINE(1021)		::Array< ::String > _this = this->counterparts();
-HXDLIN(1021)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_this->length);
-HXDLIN(1021)		{
-HXLINE(1021)			int _g = 0;
-HXDLIN(1021)			int _g1 = _this->length;
-HXDLIN(1021)			while((_g < _g1)){
-HXLINE(1021)				_g = (_g + 1);
-HXDLIN(1021)				int i = (_g - 1);
-HXDLIN(1021)				{
-HXLINE(1021)					 ::borogove::JID inValue = ::borogove::JID_obj::parse(( (::String)(_hx_array_unsafe_get(_this,i)) ));
-HXDLIN(1021)					result->__unsafe_set(i,inValue);
+HXLINE(1205)			_hx_tmp = ::borogove::Date_obj::format(::Date_obj::now());
+            		}
+HXDLIN(1205)		message->timestamp = _hx_tmp;
+HXLINE(1206)		message->direction = 1;
+HXLINE(1207)		message->from = this->client->jid;
+HXLINE(1208)		message->sender = message->from->asBare();
+HXLINE(1209)		message->replyTo = ::Array_obj< ::Dynamic>::__new(1)->init(0,message->sender);
+HXLINE(1210)		::Array< ::String > _this = this->counterparts();
+HXDLIN(1210)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_this->length);
+HXDLIN(1210)		{
+HXLINE(1210)			int _g = 0;
+HXDLIN(1210)			int _g1 = _this->length;
+HXDLIN(1210)			while((_g < _g1)){
+HXLINE(1210)				_g = (_g + 1);
+HXDLIN(1210)				int i = (_g - 1);
+HXDLIN(1210)				{
+HXLINE(1210)					 ::borogove::JID inValue = ::borogove::JID_obj::parse(( (::String)(_hx_array_unsafe_get(_this,i)) ));
+HXDLIN(1210)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN(1021)		message->recipients = result;
-HXLINE(1022)		message->to = message->recipients->__get(0).StaticCast<  ::borogove::JID >();
-HXLINE(1023)		return message;
+HXDLIN(1210)		message->recipients = result;
+HXLINE(1211)		message->to = message->recipients->__get(0).StaticCast<  ::borogove::JID >();
+HXLINE(1212)		if (::hx::IsNull( message->localId )) {
+HXLINE(1212)			message->localId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+            		}
+HXLINE(1213)		return message;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(DirectChat_obj,prepareOutgoingMessage,return )
 
-void DirectChat_obj::correctMessage(::String localId, ::borogove::ChatMessageBuilder message){
-            		HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_0, ::borogove::DirectChat,_gthis,::Array< ::Dynamic>,message1,::String,localId,::String,toSendId, ::borogove::OutboxItem,outboxItem) HXARGC(1)
-            		void _hx_run(::Array< ::Dynamic> corrected){
-            			HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1033_correctMessage)
-HXLINE(1034)			::Array< ::Dynamic> _hx_tmp;
-HXDLIN(1034)			 ::borogove::ChatMessage tmp = corrected->__get(0).StaticCast<  ::borogove::ChatMessage >()->versions->__get((corrected->__get(0).StaticCast<  ::borogove::ChatMessage >()->versions->length - 1)).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN(1034)			::String _hx_tmp1;
-HXDLIN(1034)			if (::hx::IsNotNull( tmp )) {
-HXLINE(1034)				_hx_tmp1 = tmp->localId;
+void DirectChat_obj::correctMessage( ::borogove::ChatMessage correct, ::borogove::ChatMessageBuilder message){
+            		HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_1, ::borogove::DirectChat,_gthis,::Array< ::Dynamic>,message1,::String,toSendId, ::borogove::OutboxItem,outboxItem, ::borogove::ChatMessage,correct) HXARGC(1)
+            		void _hx_run( ::borogove::ChatMessage corrected){
+            			HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1223_correctMessage)
+HXLINE(1224)			::Array< ::Dynamic> _hx_tmp;
+HXDLIN(1224)			 ::borogove::ChatMessage tmp = corrected->versions->__get((corrected->versions->length - 1)).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN(1224)			::String _hx_tmp1;
+HXDLIN(1224)			if (::hx::IsNotNull( tmp )) {
+HXLINE(1224)				_hx_tmp1 = tmp->localId;
             			}
             			else {
-HXLINE(1034)				_hx_tmp1 = null();
+HXLINE(1224)				_hx_tmp1 = null();
             			}
-HXDLIN(1034)			if ((_hx_tmp1 == localId)) {
-HXLINE(1034)				_hx_tmp = corrected->__get(0).StaticCast<  ::borogove::ChatMessage >()->versions;
+HXDLIN(1224)			if ((_hx_tmp1 == correct->localId)) {
+HXLINE(1224)				_hx_tmp = corrected->versions;
             			}
             			else {
-HXLINE(1034)				_hx_tmp = ::Array_obj< ::Dynamic>::__new(1)->init(0,message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build());
-            			}
-HXDLIN(1034)			message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->versions = _hx_tmp;
-HXLINE(1035)			message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->localId = toSendId;
-HXLINE(1036)			 ::borogove::DirectChat _gthis1 = _gthis;
-HXDLIN(1036)			 ::borogove::Stanza _hx_tmp2 = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build()->asStanza();
-HXDLIN(1036)			_gthis1->sendMessageStanza(_hx_tmp2,outboxItem);
-HXLINE(1037)			 ::borogove::ChatMessage tmp1 = _gthis->lastMessage;
-HXDLIN(1037)			::String _hx_tmp3;
-HXDLIN(1037)			if (::hx::IsNotNull( tmp1 )) {
-HXLINE(1037)				_hx_tmp3 = tmp1->localId;
+HXLINE(1224)				_hx_tmp = ::Array_obj< ::Dynamic>::__new(1)->init(0,message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build());
+            			}
+HXDLIN(1224)			message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->versions = _hx_tmp;
+HXLINE(1225)			message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->localId = toSendId;
+HXLINE(1226)			 ::borogove::DirectChat _gthis1 = _gthis;
+HXDLIN(1226)			 ::borogove::Stanza _hx_tmp2 = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build()->asStanza();
+HXDLIN(1226)			_gthis1->sendMessageStanza(_hx_tmp2,outboxItem);
+HXLINE(1227)			bool _hx_tmp3;
+HXDLIN(1227)			if (::hx::IsNotNull( _gthis->lastMessage )) {
+HXLINE(1227)				_hx_tmp3 = corrected->canReplace(_gthis->lastMessage);
             			}
             			else {
-HXLINE(1037)				_hx_tmp3 = null();
+HXLINE(1227)				_hx_tmp3 = true;
             			}
-HXDLIN(1037)			if ((localId == _hx_tmp3)) {
-HXLINE(1038)				_gthis->setLastMessage(corrected->__get(0).StaticCast<  ::borogove::ChatMessage >());
-HXLINE(1039)				_gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
+HXDLIN(1227)			if (_hx_tmp3) {
+            				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::DirectChat,_gthis) HXARGC(1)
+            				 ::borogove::EventResult _hx_run( ::Dynamic _){
+            					HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1229_correctMessage)
+HXLINE(1229)					return _gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+HXLINE(1228)				::thenshim::_Promise::Promise_Impl__obj::then(_gthis->setLastMessage(corrected), ::Dynamic(new _hx_Closure_0(_gthis)),null());
             			}
-HXLINE(1041)			_gthis->client->notifyMessageHandlers(corrected->__get(0).StaticCast<  ::borogove::ChatMessage >(),1);
+HXLINE(1232)			_gthis->client->notifyMessageHandlers(corrected,1);
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1027_correctMessage)
-HXDLIN(1027)		::Array< ::Dynamic> message1 = ::Array_obj< ::Dynamic>::__new(1)->init(0,message);
-HXDLIN(1027)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1028)		::String toSendId = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->localId;
-HXLINE(1029)		message1[0] = this->prepareOutgoingMessage(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >());
-HXLINE(1030)		 ::borogove::ChatMessage _hx_tmp = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build();
-HXDLIN(1030)		message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->versions = ::Array_obj< ::Dynamic>::__new(1)->init(0,_hx_tmp);
-HXLINE(1031)		message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->localId = localId;
-HXLINE(1032)		 ::borogove::OutboxItem outboxItem = this->outbox->newItem();
-HXLINE(1033)		 ::borogove::Client _hx_tmp1 = this->client;
-HXDLIN(1033)		::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp1->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build())), ::Dynamic(new _hx_Closure_0(_gthis,message1,localId,toSendId,outboxItem)),null());
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1217_correctMessage)
+HXDLIN(1217)		::Array< ::Dynamic> message1 = ::Array_obj< ::Dynamic>::__new(1)->init(0,message);
+HXDLIN(1217)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1218)		message1[0] = this->prepareOutgoingMessage(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >());
+HXLINE(1219)		::String toSendId = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->localId;
+HXLINE(1220)		 ::borogove::ChatMessage _hx_tmp = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build();
+HXDLIN(1220)		message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->versions = ::Array_obj< ::Dynamic>::__new(1)->init(0,_hx_tmp);
+HXLINE(1221)		message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->localId = correct->localId;
+HXLINE(1222)		 ::borogove::OutboxItem outboxItem = this->outbox->newItem();
+HXLINE(1223)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessageBuilder(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()), ::Dynamic(new _hx_Closure_1(_gthis,message1,toSendId,outboxItem,correct)),null());
             	}
 
 
 void DirectChat_obj::sendMessage( ::borogove::ChatMessageBuilder message){
-            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1046_sendMessage)
-HXDLIN(1046)		::Array< ::Dynamic> message1 = ::Array_obj< ::Dynamic>::__new(1)->init(0,message);
-HXDLIN(1046)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1047)		if ((this->uiState == 3)) {
-HXLINE(1047)			this->uiState = 1;
-            		}
-HXLINE(1048)		if (::hx::IsNotNull( this->typingTimer )) {
-HXLINE(1048)			this->typingTimer->stop();
-            		}
-HXLINE(1049)		this->client->chatActivity(::hx::ObjectPtr<OBJ_>(this),null());
-HXLINE(1050)		message1[0] = this->prepareOutgoingMessage(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >());
-HXLINE(1051)		message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->to = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->recipients->__get(0).StaticCast<  ::borogove::JID >();
-HXLINE(1052)		 ::borogove::Stanza fromStanza = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build()->asStanza();
-HXDLIN(1052)		 ::borogove::MessageStanza fromStanza1 = ::borogove::Message_obj::fromStanza(fromStanza,this->client->jid,null(),null())->parsed;
-HXLINE(1053)		switch((int)(fromStanza1->_hx_getIndex())){
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1237_sendMessage)
+HXDLIN(1237)		::Array< ::Dynamic> message1 = ::Array_obj< ::Dynamic>::__new(1)->init(0,message);
+HXDLIN(1237)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1238)		if ((this->uiState == 3)) {
+HXLINE(1238)			this->uiState = 1;
+            		}
+HXLINE(1239)		if (::hx::IsNotNull( this->typingTimer )) {
+HXLINE(1239)			this->typingTimer->stop();
+            		}
+HXLINE(1240)		this->client->chatActivity(::hx::ObjectPtr<OBJ_>(this),null());
+HXLINE(1241)		message1[0] = this->prepareOutgoingMessage(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >());
+HXLINE(1242)		message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->to = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->recipients->__get(0).StaticCast<  ::borogove::JID >();
+HXLINE(1243)		 ::borogove::Stanza fromStanza = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build()->asStanza();
+HXDLIN(1243)		 ::borogove::MessageStanza fromStanza1 = ::borogove::Message_obj::fromStanza(fromStanza,this->client->jid,null(),null(),null())->parsed;
+HXLINE(1244)		switch((int)(fromStanza1->_hx_getIndex())){
             			case (int)1: {
-            				HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::DirectChat,_gthis,::Array< ::Dynamic>,message1, ::borogove::OutboxItem,outboxItem) HXARGC(1)
-            				 ::borogove::EventResult _hx_run(::Array< ::Dynamic> stored){
-            					HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1056_sendMessage)
-HXLINE(1057)					 ::borogove::Stanza stanza = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build()->asStanza();
-HXLINE(1058)					if (::hx::IsNotNull( _gthis->isActive )) {
-HXLINE(1059)						_gthis->isActive = true;
-HXLINE(1060)						_gthis->activeThread = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->threadId;
-HXLINE(1061)						stanza->tag(HX_("active",c6,41,46,16), ::Dynamic(::hx::Anon_obj::Create(1)
-            							->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/chatstates",8e,6d,41,6d))))->up();
-            					}
-HXLINE(1063)					_gthis->sendMessageStanza(stanza,outboxItem);
-HXLINE(1064)					 ::borogove::DirectChat _gthis1 = _gthis;
-HXDLIN(1064)					_gthis1->setLastMessage(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build());
-HXLINE(1065)					int _hx_tmp;
-HXDLIN(1065)					if ((stored->__get(0).StaticCast<  ::borogove::ChatMessage >()->versions->length > 1)) {
-HXLINE(1065)						_hx_tmp = 1;
+            				HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_1, ::borogove::DirectChat,_gthis,::Array< ::Dynamic>,message1, ::borogove::OutboxItem,outboxItem) HXARGC(1)
+            				::Dynamic _hx_run( ::borogove::ChatMessage stored){
+            					HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::DirectChat,_gthis, ::borogove::ChatMessage,stored) HXARGC(1)
+            					 ::borogove::EventResult _hx_run( ::Dynamic _){
+            						HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1255_sendMessage)
+HXLINE(1256)						int _hx_tmp;
+HXDLIN(1256)						if ((stored->versions->length > 1)) {
+HXLINE(1256)							_hx_tmp = 1;
+            						}
+            						else {
+HXLINE(1256)							_hx_tmp = 0;
+            						}
+HXDLIN(1256)						_gthis->client->notifyMessageHandlers(stored,_hx_tmp);
+HXLINE(1257)						return _gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
             					}
-            					else {
-HXLINE(1065)						_hx_tmp = 0;
+            					HX_END_LOCAL_FUNC1(return)
+
+            					HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1247_sendMessage)
+HXLINE(1248)					 ::borogove::Stanza stanza = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build()->asStanza();
+HXLINE(1249)					if (::hx::IsNotNull( _gthis->isActive )) {
+HXLINE(1250)						_gthis->isActive = true;
+HXLINE(1251)						_gthis->activeThread = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->threadId;
+HXLINE(1252)						stanza->tag(HX_("active",c6,41,46,16), ::Dynamic(::hx::Anon_obj::Create(1)
+            							->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/chatstates",8e,6d,41,6d))))->up();
             					}
-HXDLIN(1065)					_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),_hx_tmp);
-HXLINE(1066)					return _gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
+HXLINE(1254)					_gthis->sendMessageStanza(stanza,outboxItem);
+HXLINE(1255)					return ::thenshim::_Promise::Promise_Impl__obj::then(_gthis->setLastMessage(stored), ::Dynamic(new _hx_Closure_0(_gthis,stored)),null());
             				}
             				HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1055)				 ::borogove::OutboxItem outboxItem = this->outbox->newItem();
-HXLINE(1056)				 ::borogove::Client _hx_tmp = this->client;
-HXDLIN(1056)				::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build())), ::Dynamic(new _hx_Closure_0(_gthis,message1,outboxItem)),null());
+HXLINE(1246)				 ::borogove::OutboxItem outboxItem = this->outbox->newItem();
+HXLINE(1247)				::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessageBuilder(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()), ::Dynamic(new _hx_Closure_1(_gthis,message1,outboxItem)),null());
             			}
             			break;
-            			case (int)3: {
-            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::DirectChat,_gthis,::Array< ::Dynamic>,message1) HXARGC(1)
+            			case (int)4: {
+            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_2, ::borogove::DirectChat,_gthis,::Array< ::Dynamic>,message1) HXARGC(1)
             				void _hx_run( ::borogove::ChatMessage stored){
-            					HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1069_sendMessage)
-HXLINE(1070)					{
-HXLINE(1070)						int _g = 0;
-HXDLIN(1070)						::Array< ::Dynamic> _g1 = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->recipients;
-HXDLIN(1070)						while((_g < _g1->length)){
-HXLINE(1070)							 ::borogove::JID recipient = _g1->__get(_g).StaticCast<  ::borogove::JID >();
-HXDLIN(1070)							_g = (_g + 1);
-HXLINE(1071)							message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->to = recipient;
-HXLINE(1072)							 ::borogove::Client _gthis1 = _gthis->client;
-HXDLIN(1072)							_gthis1->sendStanza(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build()->asStanza());
+            					HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1261_sendMessage)
+HXLINE(1262)					{
+HXLINE(1262)						int _g = 0;
+HXDLIN(1262)						::Array< ::Dynamic> _g1 = message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->recipients;
+HXDLIN(1262)						while((_g < _g1->length)){
+HXLINE(1262)							 ::borogove::JID recipient = _g1->__get(_g).StaticCast<  ::borogove::JID >();
+HXDLIN(1262)							_g = (_g + 1);
+HXLINE(1263)							message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->to = recipient;
+HXLINE(1264)							 ::borogove::Client _gthis1 = _gthis->client;
+HXDLIN(1264)							_gthis1->sendStanza(message1->__get(0).StaticCast<  ::borogove::ChatMessageBuilder >()->build()->asStanza());
             						}
             					}
-HXLINE(1074)					if (::hx::IsNotNull( stored )) {
-HXLINE(1074)						_gthis->client->notifyMessageHandlers(stored,2);
+HXLINE(1266)					if (::hx::IsNotNull( stored )) {
+HXLINE(1266)						_gthis->client->notifyMessageHandlers(stored,2);
             					}
             				}
             				HX_END_LOCAL_FUNC1((void))
 
-HXLINE(1069)				::Dynamic _hx_tmp1 = this->persistence;
-HXDLIN(1069)				::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_hx_tmp1,this->client->accountId(),fromStanza1->_hx_getObject(0).StaticCast<  ::borogove::ReactionUpdate >()), ::Dynamic(new _hx_Closure_1(_gthis,message1)),null());
+HXLINE(1261)				::Dynamic _hx_tmp = this->persistence;
+HXDLIN(1261)				::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_hx_tmp,this->client->accountId(),fromStanza1->_hx_getObject(0).StaticCast<  ::borogove::ReactionUpdate >()), ::Dynamic(new _hx_Closure_2(_gthis,message1)),null());
             			}
             			break;
             			default:{
-HXLINE(1077)				::haxe::Log_obj::trace(HX_("Invalid message",7e,ab,89,95), ::Dynamic(::hx::Anon_obj::Create(5)
+HXLINE(1269)				::haxe::Log_obj::trace(HX_("Invalid message",7e,ab,89,95), ::Dynamic(::hx::Anon_obj::Create(5)
             					->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.DirectChat",ee,9a,0a,36))
             					->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,fromStanza1))
             					->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("sendMessage",5f,89,1d,24))
             					->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Chat.hx",98,ae,63,17))
-            					->setFixed(4,HX_("lineNumber",dd,81,22,76),1077)));
-HXLINE(1078)				HX_STACK_DO_THROW(HX_("Trying to send invalid message.",dc,74,a0,91));
+            					->setFixed(4,HX_("lineNumber",dd,81,22,76),1269)));
+HXLINE(1270)				HX_STACK_DO_THROW(HX_("Trying to send invalid message.",dc,74,a0,91));
             			}
             		}
             	}
@@ -533,68 +791,70 @@ HXLINE(1078)				HX_STACK_DO_THROW(HX_("Trying to send invalid message.",dc,74,a0
 void DirectChat_obj::removeReaction( ::borogove::ChatMessage m, ::borogove::Reaction reaction){
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_1, ::borogove::DirectChat,_gthis, ::borogove::OutboxItem,outboxItem, ::borogove::ReactionUpdate,update3) HXARGC(1)
             		void _hx_run( ::borogove::ChatMessage stored){
-            			HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1106_removeReaction)
-HXLINE(1107)			 ::borogove::DirectChat _gthis1 = _gthis;
-HXDLIN(1107)			 ::borogove::Stanza _hx_tmp = update3->asStanza();
-HXDLIN(1107)			_gthis1->sendMessageStanza(_hx_tmp,outboxItem);
-HXLINE(1108)			if (::hx::IsNotNull( stored )) {
-HXLINE(1108)				_gthis->client->notifyMessageHandlers(stored,2);
+            			HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1301_removeReaction)
+HXLINE(1302)			 ::borogove::DirectChat _gthis1 = _gthis;
+HXDLIN(1302)			 ::borogove::Stanza _hx_tmp = update3->asStanza();
+HXDLIN(1302)			_gthis1->sendMessageStanza(_hx_tmp,outboxItem);
+HXLINE(1303)			if (::hx::IsNotNull( stored )) {
+HXLINE(1303)				_gthis->client->notifyMessageHandlers(stored,2);
             			}
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1083_removeReaction)
-HXDLIN(1083)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1084)		if (::Std_obj::isOfType(reaction,::hx::ClassOf< ::borogove::CustomEmojiReaction >())) {
-HXLINE(1085)			if (::hx::IsNull( reaction->envelopeId )) {
-HXLINE(1085)				HX_STACK_DO_THROW(HX_("Cannot remove custom emoji reaction without envelopeId",90,e6,80,fb));
-            			}
-HXLINE(1086)			 ::borogove::ChatMessageBuilder correct = m->reply();
-HXLINE(1087)			correct->localId = ::borogove::ID_obj::_hx_long();
-HXLINE(1088)			correct->setHtml(HX_("",00,00,00,00));
-HXLINE(1089)			correct->text = null();
-HXLINE(1090)			this->correctMessage(reaction->envelopeId,correct);
-HXLINE(1091)			return;
-            		}
-HXLINE(1095)		::Array< ::Dynamic> reactions = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(1096)		{
-HXLINE(1096)			::Dynamic this1 = m->reactions;
-HXDLIN(1096)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this1);
-HXDLIN(1096)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE(1096)				::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXDLIN(1096)				::Array< ::Dynamic> _g_value = ( (::Array< ::Dynamic>)(::haxe::IMap_obj::get(this1,key)) );
-HXLINE(1097)				if ((key != reaction->key)) {
+            	HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1275_removeReaction)
+HXDLIN(1275)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1276)		if (::Std_obj::isOfType(reaction,::hx::ClassOf< ::borogove::CustomEmojiReaction >())) {
+HXLINE(1277)			if (::hx::IsNull( reaction->envelopeId )) {
+HXLINE(1277)				HX_STACK_DO_THROW(HX_("Cannot remove custom emoji reaction without envelopeId",90,e6,80,fb));
+            			}
+HXLINE(1278)			 ::borogove::ChatMessageBuilder correct = m->reply();
+HXLINE(1279)			correct->localId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXLINE(1280)			correct->setBody(null());
+HXLINE(1282)			 ::borogove::ChatMessageBuilder fakeEnvelope =  ::borogove::ChatMessageBuilder_obj::__alloc( HX_CTX );
+HXLINE(1283)			fakeEnvelope->localId = reaction->envelopeId;
+HXLINE(1284)			fakeEnvelope->senderId = reaction->senderId;
+HXLINE(1285)			this->correctMessage(fakeEnvelope->build(),correct);
+HXLINE(1286)			return;
+            		}
+HXLINE(1290)		::Array< ::Dynamic> reactions = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1291)		{
+HXLINE(1291)			::Dynamic this1 = m->reactions;
+HXDLIN(1291)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this1);
+HXDLIN(1291)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(1291)				::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN(1291)				::Array< ::Dynamic> _g_value = ( (::Array< ::Dynamic>)(::haxe::IMap_obj::get(this1,key)) );
+HXLINE(1292)				if ((key != reaction->key)) {
             					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::DirectChat,_gthis) HXARGC(1)
             					bool _hx_run( ::borogove::Reaction r){
-            						HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1098_removeReaction)
-HXLINE(1098)						::String r1 = r->senderId;
-HXDLIN(1098)						return (r1 == _gthis->client->accountId());
+            						HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1293_removeReaction)
+HXLINE(1293)						::String r1 = r->senderId;
+HXDLIN(1293)						return (r1 == _gthis->client->accountId());
             					}
             					HX_END_LOCAL_FUNC1(return)
 
-HXLINE(1098)					 ::borogove::Reaction react = ( ( ::borogove::Reaction)(::Lambda_obj::find(_g_value, ::Dynamic(new _hx_Closure_0(_gthis)))) );
-HXLINE(1099)					bool _hx_tmp;
-HXDLIN(1099)					if (::hx::IsNotNull( react )) {
-HXLINE(1099)						_hx_tmp = !(::Std_obj::isOfType(react,::hx::ClassOf< ::borogove::CustomEmojiReaction >()));
+HXLINE(1293)					 ::borogove::Reaction react = ( ( ::borogove::Reaction)(::Lambda_obj::find(_g_value, ::Dynamic(new _hx_Closure_0(_gthis)))) );
+HXLINE(1294)					bool _hx_tmp;
+HXDLIN(1294)					if (::hx::IsNotNull( react )) {
+HXLINE(1294)						_hx_tmp = !(::Std_obj::isOfType(react,::hx::ClassOf< ::borogove::CustomEmojiReaction >()));
             					}
             					else {
-HXLINE(1099)						_hx_tmp = false;
+HXLINE(1294)						_hx_tmp = false;
             					}
-HXDLIN(1099)					if (_hx_tmp) {
-HXLINE(1100)						reactions->push(react);
+HXDLIN(1294)					if (_hx_tmp) {
+HXLINE(1295)						reactions->push(react);
             					}
             				}
             			}
             		}
-HXLINE(1104)		::String update = ::borogove::ID_obj::_hx_long();
-HXDLIN(1104)		::String m1 = m->localId;
-HXDLIN(1104)		::String update1 = m->chatId();
-HXDLIN(1104)		::String update2 = this->client->accountId();
-HXDLIN(1104)		 ::borogove::ReactionUpdate update3 =  ::borogove::ReactionUpdate_obj::__alloc( HX_CTX ,update,null(),null(),m1,update1,update2,::borogove::Date_obj::format(::Date_obj::now()),reactions,0);
-HXLINE(1105)		 ::borogove::OutboxItem outboxItem = this->outbox->newItem();
-HXLINE(1106)		::Dynamic _hx_tmp1 = this->persistence;
-HXDLIN(1106)		::String _hx_tmp2 = this->client->accountId();
-HXDLIN(1106)		::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_hx_tmp1,_hx_tmp2,update3), ::Dynamic(new _hx_Closure_1(_gthis,outboxItem,update3)),null());
+HXLINE(1299)		::String update = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXDLIN(1299)		::String m1 = m->localId;
+HXDLIN(1299)		::String update1 = m->chatId();
+HXDLIN(1299)		::String update2 = this->client->accountId();
+HXDLIN(1299)		 ::borogove::ReactionUpdate update3 =  ::borogove::ReactionUpdate_obj::__alloc( HX_CTX ,update,null(),null(),m1,update1,update2,::borogove::Date_obj::format(::Date_obj::now()),reactions,0);
+HXLINE(1300)		 ::borogove::OutboxItem outboxItem = this->outbox->newItem();
+HXLINE(1301)		::Dynamic _hx_tmp1 = this->persistence;
+HXDLIN(1301)		::String _hx_tmp2 = this->client->accountId();
+HXDLIN(1301)		::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeReaction(_hx_tmp1,_hx_tmp2,update3), ::Dynamic(new _hx_Closure_1(_gthis,outboxItem,update3)),null());
             	}
 
 
@@ -603,273 +863,250 @@ void DirectChat_obj::sendMessageStanza( ::borogove::Stanza stanza, ::borogove::O
             		void _hx_run(::Array< ::Dynamic> stanzas){
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::DirectChat,_gthis,::Array< ::Dynamic>,stanzas) HXARGC(0)
             			void _hx_run(){
-            				HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1138_sendMessageStanza)
-HXLINE(1138)				int _g = 0;
-HXDLIN(1138)				while((_g < stanzas->length)){
-HXLINE(1138)					 ::borogove::Stanza stanza = stanzas->__get(_g).StaticCast<  ::borogove::Stanza >();
-HXDLIN(1138)					_g = (_g + 1);
-HXLINE(1139)					_gthis->client->sendStanza(stanza);
+            				HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1333_sendMessageStanza)
+HXLINE(1333)				int _g = 0;
+HXDLIN(1333)				while((_g < stanzas->length)){
+HXLINE(1333)					 ::borogove::Stanza stanza = stanzas->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN(1333)					_g = (_g + 1);
+HXLINE(1334)					_gthis->client->sendStanza(stanza);
             				}
             			}
             			HX_END_LOCAL_FUNC0((void))
 
-            			HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1137_sendMessageStanza)
-HXLINE(1137)			outboxItem1->__get(0).StaticCast<  ::borogove::OutboxItem >()->handle( ::Dynamic(new _hx_Closure_0(_gthis,stanzas)));
+            			HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1332_sendMessageStanza)
+HXLINE(1332)			outboxItem1->__get(0).StaticCast<  ::borogove::OutboxItem >()->handle( ::Dynamic(new _hx_Closure_0(_gthis,stanzas)));
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1112_sendMessageStanza)
-HXDLIN(1112)		::Array< ::Dynamic> outboxItem1 = ::Array_obj< ::Dynamic>::__new(1)->init(0,outboxItem);
-HXDLIN(1112)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1113)		if ((stanza->name != HX_("message",c7,35,11,9a))) {
-HXLINE(1113)			HX_STACK_DO_THROW(HX_("Can only send message stanza this way",cb,e1,b3,60));
-            		}
-HXLINE(1115)		if (::hx::IsNull( outboxItem1->__get(0).StaticCast<  ::borogove::OutboxItem >() )) {
-HXLINE(1115)			outboxItem1[0] = this->outbox->newItem();
-            		}
-HXLINE(1117)		::Array< ::String > counters = this->counterparts();
-HXLINE(1118)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(counters->length);
-HXDLIN(1118)		{
-HXLINE(1118)			int _g = 0;
-HXDLIN(1118)			int _g1 = counters->length;
-HXDLIN(1118)			while((_g < _g1)){
-HXLINE(1118)				_g = (_g + 1);
-HXDLIN(1118)				int i = (_g - 1);
-HXDLIN(1118)				{
-HXLINE(1118)					::String counterpart = ( (::String)(_hx_array_unsafe_get(counters,i)) );
-HXLINE(1119)					 ::borogove::Stanza clone = stanza->clone();
-HXLINE(1120)					::Reflect_obj::setField(clone->attr,HX_("to",7b,65,00,00),counterpart);
-HXLINE(1121)					bool _hx_tmp;
-HXDLIN(1121)					if ((counters->length > 1)) {
-HXLINE(1121)						_hx_tmp = ::hx::IsNull( stanza->getChild(HX_("addresses",22,9f,12,8c),HX_("http://jabber.org/protocol/address",c0,fd,09,ed)) );
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1307_sendMessageStanza)
+HXDLIN(1307)		::Array< ::Dynamic> outboxItem1 = ::Array_obj< ::Dynamic>::__new(1)->init(0,outboxItem);
+HXDLIN(1307)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1308)		if ((stanza->name != HX_("message",c7,35,11,9a))) {
+HXLINE(1308)			HX_STACK_DO_THROW(HX_("Can only send message stanza this way",cb,e1,b3,60));
+            		}
+HXLINE(1310)		if (::hx::IsNull( outboxItem1->__get(0).StaticCast<  ::borogove::OutboxItem >() )) {
+HXLINE(1310)			outboxItem1[0] = this->outbox->newItem();
+            		}
+HXLINE(1312)		::Array< ::String > counters = this->counterparts();
+HXLINE(1313)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(counters->length);
+HXDLIN(1313)		{
+HXLINE(1313)			int _g = 0;
+HXDLIN(1313)			int _g1 = counters->length;
+HXDLIN(1313)			while((_g < _g1)){
+HXLINE(1313)				_g = (_g + 1);
+HXDLIN(1313)				int i = (_g - 1);
+HXDLIN(1313)				{
+HXLINE(1313)					::String counterpart = ( (::String)(_hx_array_unsafe_get(counters,i)) );
+HXLINE(1314)					 ::borogove::Stanza clone = stanza->clone();
+HXLINE(1315)					::Reflect_obj::setField(clone->attr,HX_("to",7b,65,00,00),counterpart);
+HXLINE(1316)					bool _hx_tmp;
+HXDLIN(1316)					if ((counters->length > 1)) {
+HXLINE(1316)						_hx_tmp = ::hx::IsNull( stanza->getChild(HX_("addresses",22,9f,12,8c),HX_("http://jabber.org/protocol/address",c0,fd,09,ed)) );
             					}
             					else {
-HXLINE(1121)						_hx_tmp = false;
+HXLINE(1316)						_hx_tmp = false;
             					}
-HXDLIN(1121)					if (_hx_tmp) {
-HXLINE(1122)						 ::borogove::Stanza addresses = clone->tag(HX_("addresses",22,9f,12,8c), ::Dynamic(::hx::Anon_obj::Create(1)
+HXDLIN(1316)					if (_hx_tmp) {
+HXLINE(1317)						 ::borogove::Stanza addresses = clone->tag(HX_("addresses",22,9f,12,8c), ::Dynamic(::hx::Anon_obj::Create(1)
             							->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/address",c0,fd,09,ed))));
-HXLINE(1123)						{
-HXLINE(1123)							int _g2 = 0;
-HXDLIN(1123)							while((_g2 < counters->length)){
-HXLINE(1123)								::String counter = counters->__get(_g2);
-HXDLIN(1123)								_g2 = (_g2 + 1);
-HXLINE(1124)								addresses->tag(HX_("address",b4,71,0b,9d), ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE(1318)						{
+HXLINE(1318)							int _g2 = 0;
+HXDLIN(1318)							while((_g2 < counters->length)){
+HXLINE(1318)								::String counter = counters->__get(_g2);
+HXDLIN(1318)								_g2 = (_g2 + 1);
+HXLINE(1319)								addresses->tag(HX_("address",b4,71,0b,9d), ::Dynamic(::hx::Anon_obj::Create(3)
             									->setFixed(0,HX_("delivered",84,e0,1c,b2),HX_("true",4e,a7,03,4d))
             									->setFixed(1,HX_("jid",c5,ca,50,00),counter)
             									->setFixed(2,HX_("type",ba,f2,08,4d),HX_("to",7b,65,00,00))))->up();
             							}
             						}
-HXLINE(1126)						addresses->up();
+HXLINE(1321)						addresses->up();
             					}
-HXLINE(1118)					::Dynamic inValue = ::thenshim::_Promise::Promise_Impl__obj::resolve(stanza);
-HXDLIN(1118)					result->__unsafe_set(i,inValue);
+HXLINE(1313)					::Dynamic inValue = ::thenshim::_Promise::Promise_Impl__obj::resolve(stanza);
+HXDLIN(1313)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN(1118)		::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(result), ::Dynamic(new _hx_Closure_1(_gthis,outboxItem1)),null());
-            	}
-
-
-::String DirectChat_obj::lastMessageId(){
-            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1147_lastMessageId)
-HXDLIN(1147)		 ::borogove::ChatMessage tmp = this->lastMessage;
-HXDLIN(1147)		::String tmp1;
-HXDLIN(1147)		if (::hx::IsNotNull( tmp )) {
-HXDLIN(1147)			tmp1 = tmp->serverId;
-            		}
-            		else {
-HXDLIN(1147)			tmp1 = null();
-            		}
-HXDLIN(1147)		if (::hx::IsNotNull( tmp1 )) {
-HXDLIN(1147)			return tmp1;
-            		}
-            		else {
-HXDLIN(1147)			 ::borogove::ChatMessage tmp2 = this->lastMessage;
-HXDLIN(1147)			if (::hx::IsNotNull( tmp2 )) {
-HXDLIN(1147)				return tmp2->localId;
-            			}
-            			else {
-HXDLIN(1147)				return null();
-            			}
-            		}
-HXDLIN(1147)		return null();
+HXDLIN(1313)		::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(result), ::Dynamic(new _hx_Closure_1(_gthis,outboxItem1)),null());
             	}
 
 
 void DirectChat_obj::markReadUpTo( ::borogove::ChatMessage message){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::DirectChat,_gthis, ::borogove::ChatMessage,message) HXARGC(1)
             		void _hx_run( ::Dynamic _){
-            			HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1152_markReadUpTo)
-HXLINE(1155)			bool _hx_tmp;
-HXDLIN(1155)			if (message->isIncoming()) {
-HXLINE(1155)				_hx_tmp = ::hx::IsNotNull( message->localId );
+            			HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1346_markReadUpTo)
+HXLINE(1349)			bool _hx_tmp;
+HXDLIN(1349)			if (message->isIncoming()) {
+HXLINE(1349)				_hx_tmp = ::hx::IsNotNull( message->localId );
             			}
             			else {
-HXLINE(1155)				_hx_tmp = false;
-            			}
-HXDLIN(1155)			if (_hx_tmp) {
-HXLINE(1156)				int _g = 0;
-HXDLIN(1156)				::Array< ::String > _g1 = _gthis->counterparts();
-HXDLIN(1156)				while((_g < _g1->length)){
-HXLINE(1156)					::String recipient = _g1->__get(_g);
-HXDLIN(1156)					_g = (_g + 1);
-HXLINE(1158)					::String stanza = ::borogove::ID_obj::_hx_long();
-HXDLIN(1158)					 ::borogove::Stanza stanza1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE(1349)				_hx_tmp = false;
+            			}
+HXDLIN(1349)			if (_hx_tmp) {
+HXLINE(1350)				int _g = 0;
+HXDLIN(1350)				::Array< ::String > _g1 = _gthis->counterparts();
+HXDLIN(1350)				while((_g < _g1->length)){
+HXLINE(1350)					::String recipient = _g1->__get(_g);
+HXDLIN(1350)					_g = (_g + 1);
+HXLINE(1352)					::String stanza = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXDLIN(1352)					 ::borogove::Stanza stanza1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("id",db,5b,00,00),stanza)
             						->setFixed(1,HX_("to",7b,65,00,00),recipient)))->tag(HX_("displayed",21,17,db,c1), ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("id",db,5b,00,00),message->localId)
             						->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:chat-markers:0",96,b8,66,e7))))->up();
-HXLINE(1160)					if (::hx::IsNotNull( message->threadId )) {
-HXLINE(1161)						stanza1->textTag(HX_("thread",ca,7a,b9,8e),message->threadId,null());
+HXLINE(1354)					if (::hx::IsNotNull( message->threadId )) {
+HXLINE(1355)						stanza1->textTag(HX_("thread",ca,7a,b9,8e),message->threadId,null());
             					}
-HXLINE(1163)					_gthis->client->sendStanza(stanza1);
+HXLINE(1357)					_gthis->client->sendStanza(stanza1);
             				}
             			}
-HXLINE(1167)			_gthis->publishMds();
-HXLINE(1168)			_gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
+HXLINE(1361)			_gthis->publishMds();
+HXLINE(1362)			_gthis->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,_gthis));
             		}
             		HX_END_LOCAL_FUNC1((void))
 
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             		::Dynamic _hx_run( ::Dynamic e){
-            			HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1170_markReadUpTo)
-HXLINE(1170)			if (::hx::IsNotNull( e )) {
-HXLINE(1170)				return ::thenshim::_Promise::Promise_Impl__obj::reject(e);
+            			HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1364_markReadUpTo)
+HXLINE(1364)			if (::hx::IsNotNull( e )) {
+HXLINE(1364)				return ::thenshim::_Promise::Promise_Impl__obj::reject(e);
             			}
             			else {
-HXLINE(1170)				return null();
+HXLINE(1364)				return null();
             			}
-HXDLIN(1170)			return null();
+HXDLIN(1364)			return null();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1151_markReadUpTo)
-HXDLIN(1151)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1152)		::thenshim::_Promise::Promise_Impl__obj::then(this->markReadUpToMessage(message), ::Dynamic(new _hx_Closure_0(_gthis,message)), ::Dynamic(new _hx_Closure_1()));
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1341_markReadUpTo)
+HXDLIN(1341)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1344)		if ((message->type == 3)) {
+HXLINE(1344)			return;
+            		}
+HXLINE(1346)		::thenshim::_Promise::Promise_Impl__obj::then(this->markReadUpToMessage(message), ::Dynamic(new _hx_Closure_0(_gthis,message)), ::Dynamic(new _hx_Closure_1()));
             	}
 
 
 void DirectChat_obj::bookmark(){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::DirectChat,_gthis) HXARGC(1)
             		void _hx_run( ::borogove::Stanza response){
-            			HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1189_bookmark)
-HXLINE(1190)			if ((( (::String)(::Reflect_obj::field(response->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
-HXLINE(1190)				return;
-            			}
-HXLINE(1191)			 ::borogove::GenericStream _gthis1 = _gthis->stream;
-HXDLIN(1191)			::String _gthis2 = _gthis->chatId;
-HXDLIN(1191)			_gthis1->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("presence",3b,52,d7,66), ::Dynamic(::hx::Anon_obj::Create(3)
-            				->setFixed(0,HX_("id",db,5b,00,00),::borogove::ID_obj::_hx_short())
+            			HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1383_bookmark)
+HXLINE(1384)			if ((( (::String)(::Reflect_obj::field(response->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
+HXLINE(1384)				return;
+            			}
+HXLINE(1385)			 ::borogove::GenericStream _gthis1 = _gthis->stream;
+HXDLIN(1385)			::String _gthis2 = _gthis->chatId;
+HXDLIN(1385)			_gthis1->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("presence",3b,52,d7,66), ::Dynamic(::hx::Anon_obj::Create(3)
+            				->setFixed(0,HX_("id",db,5b,00,00),::_UUIDv7::UUIDv7_Fields__obj::uuidv7())
             				->setFixed(1,HX_("to",7b,65,00,00),_gthis2)
             				->setFixed(2,HX_("type",ba,f2,08,4d),HX_("subscribe",4a,0b,18,19)))));
-HXLINE(1192)			if (_gthis->isTrusted()) {
-HXLINE(1192)				 ::borogove::GenericStream _gthis3 = _gthis->stream;
-HXDLIN(1192)				::String _gthis4 = _gthis->chatId;
-HXDLIN(1192)				_gthis3->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("presence",3b,52,d7,66), ::Dynamic(::hx::Anon_obj::Create(3)
-            					->setFixed(0,HX_("id",db,5b,00,00),::borogove::ID_obj::_hx_short())
+HXLINE(1386)			if (_gthis->isTrusted()) {
+HXLINE(1386)				 ::borogove::GenericStream _gthis3 = _gthis->stream;
+HXDLIN(1386)				::String _gthis4 = _gthis->chatId;
+HXDLIN(1386)				_gthis3->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("presence",3b,52,d7,66), ::Dynamic(::hx::Anon_obj::Create(3)
+            					->setFixed(0,HX_("id",db,5b,00,00),::_UUIDv7::UUIDv7_Fields__obj::uuidv7())
             					->setFixed(1,HX_("to",7b,65,00,00),_gthis4)
             					->setFixed(2,HX_("type",ba,f2,08,4d),HX_("subscribed",da,d5,f1,db)))));
             			}
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1174_bookmark)
-HXDLIN(1174)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(1175)		this->isBookmarked = true;
-HXLINE(1176)		if ((this->uiState == 3)) {
-HXLINE(1177)			this->uiState = 1;
-HXLINE(1178)			this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+            	HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1368_bookmark)
+HXDLIN(1368)		 ::borogove::DirectChat _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1369)		this->isBookmarked = true;
+HXLINE(1370)		if ((this->uiState == 3)) {
+HXLINE(1371)			this->uiState = 1;
+HXLINE(1372)			this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
             		}
-HXLINE(1180)		 ::Dynamic attr =  ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1374)		 ::Dynamic attr =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("jid",c5,ca,50,00),this->chatId));
-HXLINE(1181)		bool _hx_tmp;
-HXDLIN(1181)		bool _hx_tmp1;
-HXDLIN(1181)		if (::hx::IsNotNull( this->displayName )) {
-HXLINE(1181)			_hx_tmp1 = (this->displayName != HX_("",00,00,00,00));
+HXLINE(1375)		bool _hx_tmp;
+HXDLIN(1375)		bool _hx_tmp1;
+HXDLIN(1375)		if (::hx::IsNotNull( this->displayName )) {
+HXLINE(1375)			_hx_tmp1 = (this->displayName != HX_("",00,00,00,00));
             		}
             		else {
-HXLINE(1181)			_hx_tmp1 = false;
+HXLINE(1375)			_hx_tmp1 = false;
             		}
-HXDLIN(1181)		if (_hx_tmp1) {
-HXLINE(1181)			_hx_tmp = (this->displayName != this->chatId);
+HXDLIN(1375)		if (_hx_tmp1) {
+HXLINE(1375)			_hx_tmp = (this->displayName != this->chatId);
             		}
             		else {
-HXLINE(1181)			_hx_tmp = false;
+HXLINE(1375)			_hx_tmp = false;
             		}
-HXDLIN(1181)		if (_hx_tmp) {
-HXLINE(1182)			::Reflect_obj::setField(attr,HX_("name",4b,72,ff,48),this->displayName);
+HXDLIN(1375)		if (_hx_tmp) {
+HXLINE(1376)			::Reflect_obj::setField(attr,HX_("name",4b,72,ff,48),this->displayName);
             		}
-HXLINE(1184)		 ::borogove::GenericStream _hx_tmp2 = this->stream;
-HXDLIN(1184)		_hx_tmp2->sendIq( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1378)		 ::borogove::GenericStream _hx_tmp2 = this->stream;
+HXDLIN(1378)		_hx_tmp2->sendIq( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("query",08,8b,ea,5d), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("jabber:iq:roster",47,76,6e,06))))->tag(HX_("item",13,c5,bf,45),attr)->up()->up(), ::Dynamic(new _hx_Closure_0(_gthis)));
             	}
 
 
 void DirectChat_obj::sendChatState(::String state,::String threadId){
-            	HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1197_sendChatState)
-HXLINE(1198)		if (!(this->isTrusted())) {
-HXLINE(1198)			return;
-            		}
-HXLINE(1200)		{
-HXLINE(1200)			int _g = 0;
-HXDLIN(1200)			::Array< ::String > _g1 = this->counterparts();
-HXDLIN(1200)			while((_g < _g1->length)){
-HXLINE(1200)				::String recipient = _g1->__get(_g);
-HXDLIN(1200)				_g = (_g + 1);
-HXLINE(1202)				::String stanza = ::borogove::ID_obj::_hx_long();
-HXLINE(1204)				::String stanza1 = this->client->jid->asString();
-HXLINE(1201)				 ::borogove::Stanza stanza2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(4)
+            	HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1391_sendChatState)
+HXLINE(1392)		if (!(this->isTrusted())) {
+HXLINE(1392)			return;
+            		}
+HXLINE(1394)		{
+HXLINE(1394)			int _g = 0;
+HXDLIN(1394)			::Array< ::String > _g1 = this->counterparts();
+HXDLIN(1394)			while((_g < _g1->length)){
+HXLINE(1394)				::String recipient = _g1->__get(_g);
+HXDLIN(1394)				_g = (_g + 1);
+HXLINE(1396)				::String stanza = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXLINE(1398)				::String stanza1 = this->client->jid->asString();
+HXLINE(1395)				 ::borogove::Stanza stanza2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(4)
             					->setFixed(0,HX_("id",db,5b,00,00),stanza)
             					->setFixed(1,HX_("to",7b,65,00,00),recipient)
             					->setFixed(2,HX_("from",6a,a5,c2,43),stanza1)
             					->setFixed(3,HX_("type",ba,f2,08,4d),HX_("chat",d8,5e,bf,41))))->tag(state, ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/chatstates",8e,6d,41,6d))))->up();
-HXLINE(1209)				if (::hx::IsNotNull( threadId )) {
-HXLINE(1210)					stanza2->textTag(HX_("thread",ca,7a,b9,8e),threadId,null());
+HXLINE(1403)				if (::hx::IsNotNull( threadId )) {
+HXLINE(1404)					stanza2->textTag(HX_("thread",ca,7a,b9,8e),threadId,null());
             				}
-HXLINE(1212)				this->stream->sendStanza(stanza2);
+HXLINE(1406)				this->stream->sendStanza(stanza2);
             			}
             		}
             	}
 
 
 void DirectChat_obj::close(){
-            	HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1217_close)
-HXLINE(1218)		if (::hx::IsNotNull( this->typingTimer )) {
-HXLINE(1218)			this->typingTimer->stop();
-            		}
-HXLINE(1219)		if ((this->uiState == 3)) {
-HXLINE(1220)			 ::borogove::Client _hx_tmp = this->client;
-HXDLIN(1220)			::String _hx_tmp1 = this->chatId;
-HXDLIN(1220)			_hx_tmp->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("presence",3b,52,d7,66), ::Dynamic(::hx::Anon_obj::Create(3)
-            				->setFixed(0,HX_("id",db,5b,00,00),::borogove::ID_obj::_hx_short())
+            	HX_GC_STACKFRAME(&_hx_pos_e6282dde58caedf0_1411_close)
+HXLINE(1412)		if (::hx::IsNotNull( this->typingTimer )) {
+HXLINE(1412)			this->typingTimer->stop();
+            		}
+HXLINE(1413)		if ((this->uiState == 3)) {
+HXLINE(1414)			 ::borogove::Client _hx_tmp = this->client;
+HXDLIN(1414)			::String _hx_tmp1 = this->chatId;
+HXDLIN(1414)			_hx_tmp->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("presence",3b,52,d7,66), ::Dynamic(::hx::Anon_obj::Create(3)
+            				->setFixed(0,HX_("id",db,5b,00,00),::_UUIDv7::UUIDv7_Fields__obj::uuidv7())
             				->setFixed(1,HX_("to",7b,65,00,00),_hx_tmp1)
             				->setFixed(2,HX_("type",ba,f2,08,4d),HX_("unsubscribed",73,05,01,48)))));
             		}
-HXLINE(1223)		this->uiState = 2;
-HXLINE(1224)		::Dynamic _hx_tmp2 = this->persistence;
-HXDLIN(1224)		::borogove::Persistence_obj::storeChats(_hx_tmp2,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
-HXLINE(1225)		if (!(this->isBlocked)) {
-HXLINE(1225)			this->sendChatState(HX_("gone",5f,94,69,44),null());
+HXLINE(1417)		this->uiState = 2;
+HXLINE(1418)		::Dynamic _hx_tmp2 = this->persistence;
+HXDLIN(1418)		::borogove::Persistence_obj::storeChats(_hx_tmp2,this->client->accountId(),::Array_obj< ::Dynamic>::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+HXLINE(1419)		if (!(this->isBlocked)) {
+HXLINE(1419)			this->sendChatState(HX_("gone",5f,94,69,44),null());
             		}
-HXLINE(1226)		this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
-HXLINE(1227)		this->client->sortChats();
+HXLINE(1420)		this->client->trigger(HX_("chats/update",3d,8e,1d,14),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)));
+HXLINE(1421)		this->client->sortChats();
             	}
 
 
 
-::hx::ObjectPtr< DirectChat_obj > DirectChat_obj::__new( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs) {
+::hx::ObjectPtr< DirectChat_obj > DirectChat_obj::__new( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs) {
 	::hx::ObjectPtr< DirectChat_obj > __this = new DirectChat_obj();
-	__this->__construct(client,stream,persistence,chatId,__o_uiState,__o_isBlocked,extensions,readUpToId,readUpToBy,omemoContactDeviceIDs);
+	__this->__construct(client,stream,persistence,chatId,__o_uiState,__o_isBookmarked,__o_isBlocked,extensions,readUpToId,readUpToBy,omemoContactDeviceIDs);
 	return __this;
 }
 
-::hx::ObjectPtr< DirectChat_obj > DirectChat_obj::__alloc(::hx::Ctx *_hx_ctx, ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs) {
+::hx::ObjectPtr< DirectChat_obj > DirectChat_obj::__alloc(::hx::Ctx *_hx_ctx, ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence,::String chatId,::hx::Null< int >  __o_uiState,::hx::Null< bool >  __o_isBookmarked,::hx::Null< bool >  __o_isBlocked, ::borogove::Stanza extensions,::String readUpToId,::String readUpToBy,::Array< int > omemoContactDeviceIDs) {
 	DirectChat_obj *__this = (DirectChat_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(DirectChat_obj), true, "borogove.DirectChat"));
 	*(void **)__this = DirectChat_obj::_hx_vtable;
-	__this->__construct(client,stream,persistence,chatId,__o_uiState,__o_isBlocked,extensions,readUpToId,readUpToBy,omemoContactDeviceIDs);
+	__this->__construct(client,stream,persistence,chatId,__o_uiState,__o_isBookmarked,__o_isBlocked,extensions,readUpToId,readUpToBy,omemoContactDeviceIDs);
 	return __this;
 }
 
@@ -877,16 +1114,38 @@ DirectChat_obj::DirectChat_obj()
 {
 }
 
+void DirectChat_obj::__Mark(HX_MARK_PARAMS)
+{
+	HX_MARK_BEGIN_CLASS(DirectChat);
+	HX_MARK_MEMBER_NAME(presence,"presence");
+	HX_MARK_MEMBER_NAME(_fullCounterparts,"_fullCounterparts");
+	 ::borogove::Chat_obj::__Mark(HX_MARK_ARG);
+	HX_MARK_END_CLASS();
+}
+
+void DirectChat_obj::__Visit(HX_VISIT_PARAMS)
+{
+	HX_VISIT_MEMBER_NAME(presence,"presence");
+	HX_VISIT_MEMBER_NAME(_fullCounterparts,"_fullCounterparts");
+	 ::borogove::Chat_obj::__Visit(HX_VISIT_ARG);
+}
+
 ::hx::Val DirectChat_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
 {
 	switch(inName.length) {
 	case 5:
 		if (HX_FIELD_EQ(inName,"close") ) { return ::hx::Val( close_dyn() ); }
 		break;
+	case 7:
+		if (HX_FIELD_EQ(inName,"getCaps") ) { return ::hx::Val( getCaps_dyn() ); }
+		if (HX_FIELD_EQ(inName,"members") ) { return ::hx::Val( members_dyn() ); }
+		break;
 	case 8:
+		if (HX_FIELD_EQ(inName,"presence") ) { return ::hx::Val( presence ); }
 		if (HX_FIELD_EQ(inName,"bookmark") ) { return ::hx::Val( bookmark_dyn() ); }
 		break;
 	case 11:
+		if (HX_FIELD_EQ(inName,"setPresence") ) { return ::hx::Val( setPresence_dyn() ); }
 		if (HX_FIELD_EQ(inName,"sendMessage") ) { return ::hx::Val( sendMessage_dyn() ); }
 		break;
 	case 12:
@@ -894,27 +1153,27 @@ DirectChat_obj::DirectChat_obj()
 		if (HX_FIELD_EQ(inName,"markReadUpTo") ) { return ::hx::Val( markReadUpTo_dyn() ); }
 		break;
 	case 13:
-		if (HX_FIELD_EQ(inName,"lastMessageId") ) { return ::hx::Val( lastMessageId_dyn() ); }
 		if (HX_FIELD_EQ(inName,"sendChatState") ) { return ::hx::Val( sendChatState_dyn() ); }
 		break;
 	case 14:
+		if (HX_FIELD_EQ(inName,"getDisplayName") ) { return ::hx::Val( getDisplayName_dyn() ); }
+		if (HX_FIELD_EQ(inName,"setLastMessage") ) { return ::hx::Val( setLastMessage_dyn() ); }
 		if (HX_FIELD_EQ(inName,"correctMessage") ) { return ::hx::Val( correctMessage_dyn() ); }
 		if (HX_FIELD_EQ(inName,"removeReaction") ) { return ::hx::Val( removeReaction_dyn() ); }
 		break;
 	case 15:
-		if (HX_FIELD_EQ(inName,"getParticipants") ) { return ::hx::Val( getParticipants_dyn() ); }
+		if (HX_FIELD_EQ(inName,"getResourceCaps") ) { return ::hx::Val( getResourceCaps_dyn() ); }
 		break;
 	case 16:
+		if (HX_FIELD_EQ(inName,"getMemberDetails") ) { return ::hx::Val( getMemberDetails_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getMessagesAfter") ) { return ::hx::Val( getMessagesAfter_dyn() ); }
 		break;
 	case 17:
+		if (HX_FIELD_EQ(inName,"_fullCounterparts") ) { return ::hx::Val( _fullCounterparts ); }
 		if (HX_FIELD_EQ(inName,"getMessagesBefore") ) { return ::hx::Val( getMessagesBefore_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getMessagesAround") ) { return ::hx::Val( getMessagesAround_dyn() ); }
 		if (HX_FIELD_EQ(inName,"sendMessageStanza") ) { return ::hx::Val( sendMessageStanza_dyn() ); }
 		break;
-	case 21:
-		if (HX_FIELD_EQ(inName,"getParticipantDetails") ) { return ::hx::Val( getParticipantDetails_dyn() ); }
-		break;
 	case 22:
 		if (HX_FIELD_EQ(inName,"prepareIncomingMessage") ) { return ::hx::Val( prepareIncomingMessage_dyn() ); }
 		if (HX_FIELD_EQ(inName,"prepareOutgoingMessage") ) { return ::hx::Val( prepareOutgoingMessage_dyn() ); }
@@ -922,15 +1181,45 @@ DirectChat_obj::DirectChat_obj()
 	return super::__Field(inName,inCallProp);
 }
 
+::hx::Val DirectChat_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 8:
+		if (HX_FIELD_EQ(inName,"presence") ) { presence=inValue.Cast<  ::haxe::ds::StringMap >(); return inValue; }
+		break;
+	case 17:
+		if (HX_FIELD_EQ(inName,"_fullCounterparts") ) { _fullCounterparts=inValue.Cast< ::Array< ::String > >(); return inValue; }
+	}
+	return super::__SetField(inName,inValue,inCallProp);
+}
+
+void DirectChat_obj::__GetFields(Array< ::String> &outFields)
+{
+	outFields->push(HX_("presence",3b,52,d7,66));
+	outFields->push(HX_("_fullCounterparts",32,cf,25,db));
+	super::__GetFields(outFields);
+};
+
 #ifdef HXCPP_SCRIPTABLE
-static ::hx::StorageInfo *DirectChat_obj_sMemberStorageInfo = 0;
+static ::hx::StorageInfo DirectChat_obj_sMemberStorageInfo[] = {
+	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(DirectChat_obj,presence),HX_("presence",3b,52,d7,66)},
+	{::hx::fsObject /* ::Array< ::String > */ ,(int)offsetof(DirectChat_obj,_fullCounterparts),HX_("_fullCounterparts",32,cf,25,db)},
+	{ ::hx::fsUnknown, 0, null()}
+};
 static ::hx::StaticInfo *DirectChat_obj_sStaticStorageInfo = 0;
 #endif
 
 static ::String DirectChat_obj_sMemberFields[] = {
-	HX_("getParticipants",16,0b,c7,34),
+	HX_("presence",3b,52,d7,66),
+	HX_("_fullCounterparts",32,cf,25,db),
+	HX_("setPresence",fd,1b,38,97),
+	HX_("getCaps",d7,cb,3c,14),
+	HX_("getResourceCaps",c5,79,07,ac),
+	HX_("getDisplayName",b7,64,90,b8),
+	HX_("members",d9,2c,70,1a),
+	HX_("getMemberDetails",12,2b,2f,b3),
+	HX_("setLastMessage",8f,25,7b,f6),
 	HX_("counterparts",a4,10,14,78),
-	HX_("getParticipantDetails",85,2b,7d,4d),
 	HX_("getMessagesBefore",a1,f1,44,11),
 	HX_("getMessagesAfter",3a,43,91,57),
 	HX_("getMessagesAround",6f,95,16,2d),
@@ -940,7 +1229,6 @@ static ::String DirectChat_obj_sMemberFields[] = {
 	HX_("sendMessage",5f,89,1d,24),
 	HX_("removeReaction",0d,24,0b,c1),
 	HX_("sendMessageStanza",b4,2c,6d,3d),
-	HX_("lastMessageId",4c,90,58,27),
 	HX_("markReadUpTo",59,68,2d,ee),
 	HX_("bookmark",b6,8c,f1,32),
 	HX_("sendChatState",b1,21,95,6e),
@@ -975,32 +1263,34 @@ void DirectChat_obj::__register()
 void DirectChat_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_937_boot)
-HXDLIN( 937)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(12)
-            				->setFixed(0,HX_("removeReaction",0d,24,0b,c1), ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_e6282dde58caedf0_1056_boot)
+HXDLIN(1056)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(13)
+            				->setFixed(0,HX_("getMemberDetails",12,2b,2f,b3), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(1,HX_("getDisplayName",b7,64,90,b8), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(1,HX_("markReadUpTo",59,68,2d,ee), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(2,HX_("removeReaction",0d,24,0b,c1), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(2,HX_("correctMessage",7d,36,c3,f4), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(3,HX_("markReadUpTo",59,68,2d,ee), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(3,HX_("getMessagesBefore",a1,f1,44,11), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(4,HX_("correctMessage",7d,36,c3,f4), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(4,HX_("sendMessage",5f,89,1d,24), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(5,HX_("setLastMessage",8f,25,7b,f6), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(5,HX_("lastMessageId",4c,90,58,27), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(6,HX_("getMessagesBefore",a1,f1,44,11), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(6,HX_("getMessagesAround",6f,95,16,2d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(7,HX_("members",d9,2c,70,1a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(7,HX_("bookmark",b6,8c,f1,32), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(8,HX_("sendMessage",5f,89,1d,24), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(8,HX_("getParticipants",16,0b,c7,34), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(9,HX_("getMessagesAround",6f,95,16,2d), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(9,HX_("close",b8,17,63,48), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(10,HX_("bookmark",b6,8c,f1,32), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(10,HX_("getParticipantDetails",85,2b,7d,4d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(11,HX_("close",b8,17,63,48), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(11,HX_("getMessagesAfter",3a,43,91,57), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(12,HX_("getMessagesAfter",3a,43,91,57), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null()))))));
             	}
 }
diff --git a/Sources/c_borogove/src/borogove/Emoji.cpp b/Sources/c_borogove/src/borogove/Emoji.cpp
index e81f9c5..89512ff 100644
--- a/Sources/c_borogove/src/borogove/Emoji.cpp
+++ b/Sources/c_borogove/src/borogove/Emoji.cpp
@@ -8,13 +8,13 @@
 #include <borogove/Symbol.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_22aff44d6d78c3e4_136_new,"borogove.Emoji","new",0x971497cb,"borogove.Emoji.new","borogove/EmojiUtil.hx",136,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_22aff44d6d78c3e4_140_isEmoji,"borogove.Emoji","isEmoji",0x5c6f6c27,"borogove.Emoji.isEmoji","borogove/EmojiUtil.hx",140,0xaaf41424)
+HX_DEFINE_STACK_FRAME(_hx_pos_22aff44d6d78c3e4_144_new,"borogove.Emoji","new",0x971497cb,"borogove.Emoji.new","borogove/EmojiUtil.hx",144,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_22aff44d6d78c3e4_148_isEmoji,"borogove.Emoji","isEmoji",0x5c6f6c27,"borogove.Emoji.isEmoji","borogove/EmojiUtil.hx",148,0xaaf41424)
 namespace borogove{
 
 void Emoji_obj::__construct(::Array< int > codepoints){
-            	HX_STACKFRAME(&_hx_pos_22aff44d6d78c3e4_136_new)
-HXDLIN( 136)		super::__construct(codepoints);
+            	HX_STACKFRAME(&_hx_pos_22aff44d6d78c3e4_144_new)
+HXDLIN( 144)		super::__construct(codepoints);
             	}
 
 Dynamic Emoji_obj::__CreateEmpty() { return new Emoji_obj; }
@@ -37,8 +37,8 @@ bool Emoji_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 bool Emoji_obj::isEmoji(){
-            	HX_STACKFRAME(&_hx_pos_22aff44d6d78c3e4_140_isEmoji)
-HXDLIN( 140)		return true;
+            	HX_STACKFRAME(&_hx_pos_22aff44d6d78c3e4_148_isEmoji)
+HXDLIN( 148)		return true;
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/EmojiUtil.cpp b/Sources/c_borogove/src/borogove/EmojiUtil.cpp
index d7d0f23..29d352e 100644
--- a/Sources/c_borogove/src/borogove/EmojiUtil.cpp
+++ b/Sources/c_borogove/src/borogove/EmojiUtil.cpp
@@ -26,9 +26,9 @@
 #include <borogove/UnicodeSet.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_77_parse,"borogove.EmojiUtil","parse",0xbac39280,"borogove.EmojiUtil.parse","borogove/EmojiUtil.hx",77,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_100_isEmoji,"borogove.EmojiUtil","isEmoji",0xc30c02c9,"borogove.EmojiUtil.isEmoji","borogove/EmojiUtil.hx",100,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_105_isOnlyEmoji,"borogove.EmojiUtil","isOnlyEmoji",0x48ee233d,"borogove.EmojiUtil.isOnlyEmoji","borogove/EmojiUtil.hx",105,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_85_parse,"borogove.EmojiUtil","parse",0xbac39280,"borogove.EmojiUtil.parse","borogove/EmojiUtil.hx",85,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_108_isEmoji,"borogove.EmojiUtil","isEmoji",0xc30c02c9,"borogove.EmojiUtil.isEmoji","borogove/EmojiUtil.hx",108,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_113_isOnlyEmoji,"borogove.EmojiUtil","isOnlyEmoji",0x48ee233d,"borogove.EmojiUtil.isOnlyEmoji","borogove/EmojiUtil.hx",113,0xaaf41424)
 HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_34_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",34,0xaaf41424)
 HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_35_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",35,0xaaf41424)
 HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_36_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",36,0xaaf41424)
@@ -49,20 +49,27 @@ HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_48_boot,"borogove.EmojiUtil","boot
 static const int _hx_array_data_b0e07afb_20[] = {
 	(int)8482,(int)8505,
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_50_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",50,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_49_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",49,0xaaf41424)
 static const int _hx_array_data_b0e07afb_22[] = {
+	(int)8252,(int)8265,
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_50_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",50,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_51_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",51,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_52_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",52,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_54_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",54,0xaaf41424)
+static const int _hx_array_data_b0e07afb_27[] = {
 	(int)35,
 };
-static const int _hx_array_data_b0e07afb_23[] = {
+static const int _hx_array_data_b0e07afb_28[] = {
 	(int)42,
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_52_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",52,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_58_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",58,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_71_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",71,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_72_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",72,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_73_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",73,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_74_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",74,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_75_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",75,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_56_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",56,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_66_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",66,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_79_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",79,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_80_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",80,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_81_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",81,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_82_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",82,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_216062b58077c661_83_boot,"borogove.EmojiUtil","boot",0xc6430a85,"borogove.EmojiUtil.boot","borogove/EmojiUtil.hx",83,0xaaf41424)
 namespace borogove{
 
 void EmojiUtil_obj::__construct() { }
@@ -110,6 +117,14 @@ bool EmojiUtil_obj::_hx_isInstanceOf(int inClassId) {
 
  ::borogove::UnicodeList EmojiUtil_obj::LETTERLIKE_SYMBOLS;
 
+ ::borogove::UnicodeList EmojiUtil_obj::GENERAL_PUNCTUATION;
+
+ ::borogove::UnicodeRange EmojiUtil_obj::ARROWS;
+
+ ::borogove::UnicodeRange EmojiUtil_obj::ENCLOSED_ALPHANUMERICS;
+
+ ::borogove::UnicodeRange EmojiUtil_obj::MISC_SYMBOLS_AND_ARROWS;
+
  ::borogove::UnicodeBlocks EmojiUtil_obj::KEYCAP_COMBINEABLE;
 
  ::borogove::UnicodeBlocks EmojiUtil_obj::SYMBOLIZE;
@@ -127,67 +142,67 @@ int EmojiUtil_obj::BLACK_FLAG;
  ::borogove::UnicodeRange EmojiUtil_obj::FITZPATRICK;
 
 ::Array< ::Dynamic> EmojiUtil_obj::parse(::String str){
-            	HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_77_parse)
-HXLINE(  78)		::Array< ::Dynamic> symbols = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(  79)		 ::borogove::Builder builder =  ::borogove::Builder_obj::__alloc( HX_CTX );
-HXLINE(  80)		bool needsFinalBuild = false;
-HXLINE(  81)		::Array< int > input = ::borogove::StringUtil_obj::rawCodepointArray(str);
-HXLINE(  82)		{
-HXLINE(  82)			int _g = 0;
-HXDLIN(  82)			int _g1 = input->length;
-HXDLIN(  82)			while((_g < _g1)){
-HXLINE(  82)				_g = (_g + 1);
-HXLINE(  83)				int cp = input->__get((_g - 1));
-HXLINE(  84)				if (builder->offer(cp)) {
-HXLINE(  85)					needsFinalBuild = true;
+            	HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_85_parse)
+HXLINE(  86)		::Array< ::Dynamic> symbols = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  87)		 ::borogove::Builder builder =  ::borogove::Builder_obj::__alloc( HX_CTX );
+HXLINE(  88)		bool needsFinalBuild = false;
+HXLINE(  89)		::Array< int > input = ::borogove::StringUtil_obj::rawCodepointArray(str);
+HXLINE(  90)		{
+HXLINE(  90)			int _g = 0;
+HXDLIN(  90)			int _g1 = input->length;
+HXDLIN(  90)			while((_g < _g1)){
+HXLINE(  90)				_g = (_g + 1);
+HXLINE(  91)				int cp = input->__get((_g - 1));
+HXLINE(  92)				if (builder->offer(cp)) {
+HXLINE(  93)					needsFinalBuild = true;
             				}
             				else {
-HXLINE(  87)					symbols->push(builder->build());
-HXLINE(  88)					builder =  ::borogove::Builder_obj::__alloc( HX_CTX );
-HXLINE(  89)					if (builder->offer(cp)) {
-HXLINE(  90)						needsFinalBuild = true;
+HXLINE(  95)					symbols->push(builder->build());
+HXLINE(  96)					builder =  ::borogove::Builder_obj::__alloc( HX_CTX );
+HXLINE(  97)					if (builder->offer(cp)) {
+HXLINE(  98)						needsFinalBuild = true;
             					}
             				}
             			}
             		}
-HXLINE(  94)		if (needsFinalBuild) {
-HXLINE(  95)			symbols->push(builder->build());
+HXLINE( 102)		if (needsFinalBuild) {
+HXLINE( 103)			symbols->push(builder->build());
             		}
-HXLINE(  97)		return symbols;
+HXLINE( 105)		return symbols;
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(EmojiUtil_obj,parse,return )
 
 bool EmojiUtil_obj::isEmoji(::String input){
-            	HX_STACKFRAME(&_hx_pos_216062b58077c661_100_isEmoji)
-HXLINE( 101)		::Array< ::Dynamic> symbols = ::borogove::EmojiUtil_obj::parse(input);
-HXLINE( 102)		if ((symbols->length == 1)) {
-HXLINE( 102)			return symbols->__get(0).StaticCast<  ::borogove::Symbol >()->isEmoji();
+            	HX_STACKFRAME(&_hx_pos_216062b58077c661_108_isEmoji)
+HXLINE( 109)		::Array< ::Dynamic> symbols = ::borogove::EmojiUtil_obj::parse(input);
+HXLINE( 110)		if ((symbols->length == 1)) {
+HXLINE( 110)			return symbols->__get(0).StaticCast<  ::borogove::Symbol >()->isEmoji();
             		}
             		else {
-HXLINE( 102)			return false;
+HXLINE( 110)			return false;
             		}
-HXDLIN( 102)		return false;
+HXDLIN( 110)		return false;
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(EmojiUtil_obj,isEmoji,return )
 
 bool EmojiUtil_obj::isOnlyEmoji(::String input){
-            	HX_STACKFRAME(&_hx_pos_216062b58077c661_105_isOnlyEmoji)
-HXLINE( 106)		::Array< ::Dynamic> symbols = ::borogove::EmojiUtil_obj::parse(input);
-HXLINE( 107)		{
-HXLINE( 107)			int _g = 0;
-HXDLIN( 107)			while((_g < symbols->length)){
-HXLINE( 107)				 ::borogove::Symbol symbol = symbols->__get(_g).StaticCast<  ::borogove::Symbol >();
-HXDLIN( 107)				_g = (_g + 1);
-HXLINE( 108)				if (!(symbol->isEmoji())) {
-HXLINE( 109)					return false;
+            	HX_STACKFRAME(&_hx_pos_216062b58077c661_113_isOnlyEmoji)
+HXLINE( 114)		::Array< ::Dynamic> symbols = ::borogove::EmojiUtil_obj::parse(input);
+HXLINE( 115)		{
+HXLINE( 115)			int _g = 0;
+HXDLIN( 115)			while((_g < symbols->length)){
+HXLINE( 115)				 ::borogove::Symbol symbol = symbols->__get(_g).StaticCast<  ::borogove::Symbol >();
+HXDLIN( 115)				_g = (_g + 1);
+HXLINE( 116)				if (!(symbol->isEmoji())) {
+HXLINE( 117)					return false;
             				}
             			}
             		}
-HXLINE( 112)		return (symbols->length > 0);
+HXLINE( 120)		return (symbols->length > 0);
             	}
 
 
@@ -211,6 +226,7 @@ bool EmojiUtil_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx:
 		if (HX_FIELD_EQ(inName,"parse") ) { outValue = parse_dyn(); return true; }
 		break;
 	case 6:
+		if (HX_FIELD_EQ(inName,"ARROWS") ) { outValue = ( ARROWS ); return true; }
 		if (HX_FIELD_EQ(inName,"EMOJIS") ) { outValue = ( EMOJIS ); return true; }
 		break;
 	case 7:
@@ -247,10 +263,17 @@ bool EmojiUtil_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx:
 		break;
 	case 19:
 		if (HX_FIELD_EQ(inName,"REGIONAL_INDICATORS") ) { outValue = ( REGIONAL_INDICATORS ); return true; }
+		if (HX_FIELD_EQ(inName,"GENERAL_PUNCTUATION") ) { outValue = ( GENERAL_PUNCTUATION ); return true; }
 		break;
 	case 20:
 		if (HX_FIELD_EQ(inName,"SUPPLEMENTAL_SYMBOLS") ) { outValue = ( SUPPLEMENTAL_SYMBOLS ); return true; }
 		break;
+	case 22:
+		if (HX_FIELD_EQ(inName,"ENCLOSED_ALPHANUMERICS") ) { outValue = ( ENCLOSED_ALPHANUMERICS ); return true; }
+		break;
+	case 23:
+		if (HX_FIELD_EQ(inName,"MISC_SYMBOLS_AND_ARROWS") ) { outValue = ( MISC_SYMBOLS_AND_ARROWS ); return true; }
+		break;
 	case 26:
 		if (HX_FIELD_EQ(inName,"COMBINING_ENCLOSING_KEYCAP") ) { outValue = ( COMBINING_ENCLOSING_KEYCAP ); return true; }
 		break;
@@ -279,6 +302,7 @@ bool EmojiUtil_obj::__SetStatic(const ::String &inName,Dynamic &ioValue,::hx::Pr
 		if (HX_FIELD_EQ(inName,"TAGS") ) { TAGS=ioValue.Cast<  ::borogove::UnicodeRange >(); return true; }
 		break;
 	case 6:
+		if (HX_FIELD_EQ(inName,"ARROWS") ) { ARROWS=ioValue.Cast<  ::borogove::UnicodeRange >(); return true; }
 		if (HX_FIELD_EQ(inName,"EMOJIS") ) { EMOJIS=ioValue.Cast<  ::borogove::UnicodeBlocks >(); return true; }
 		break;
 	case 8:
@@ -311,10 +335,17 @@ bool EmojiUtil_obj::__SetStatic(const ::String &inName,Dynamic &ioValue,::hx::Pr
 		break;
 	case 19:
 		if (HX_FIELD_EQ(inName,"REGIONAL_INDICATORS") ) { REGIONAL_INDICATORS=ioValue.Cast<  ::borogove::UnicodeRange >(); return true; }
+		if (HX_FIELD_EQ(inName,"GENERAL_PUNCTUATION") ) { GENERAL_PUNCTUATION=ioValue.Cast<  ::borogove::UnicodeList >(); return true; }
 		break;
 	case 20:
 		if (HX_FIELD_EQ(inName,"SUPPLEMENTAL_SYMBOLS") ) { SUPPLEMENTAL_SYMBOLS=ioValue.Cast<  ::borogove::UnicodeRange >(); return true; }
 		break;
+	case 22:
+		if (HX_FIELD_EQ(inName,"ENCLOSED_ALPHANUMERICS") ) { ENCLOSED_ALPHANUMERICS=ioValue.Cast<  ::borogove::UnicodeRange >(); return true; }
+		break;
+	case 23:
+		if (HX_FIELD_EQ(inName,"MISC_SYMBOLS_AND_ARROWS") ) { MISC_SYMBOLS_AND_ARROWS=ioValue.Cast<  ::borogove::UnicodeRange >(); return true; }
+		break;
 	case 26:
 		if (HX_FIELD_EQ(inName,"COMBINING_ENCLOSING_KEYCAP") ) { COMBINING_ENCLOSING_KEYCAP=ioValue.Cast< int >(); return true; }
 		break;
@@ -350,6 +381,10 @@ static ::hx::StaticInfo EmojiUtil_obj_sStaticStorageInfo[] = {
 	{::hx::fsObject /*  ::borogove::UnicodeRange */ ,(void *) &EmojiUtil_obj::TAGS,HX_("TAGS",d9,7c,b7,37)},
 	{::hx::fsObject /*  ::borogove::UnicodeList */ ,(void *) &EmojiUtil_obj::CYK_SYMBOLS_AND_PUNCTUATION,HX_("CYK_SYMBOLS_AND_PUNCTUATION",44,38,ef,f1)},
 	{::hx::fsObject /*  ::borogove::UnicodeList */ ,(void *) &EmojiUtil_obj::LETTERLIKE_SYMBOLS,HX_("LETTERLIKE_SYMBOLS",b9,91,eb,11)},
+	{::hx::fsObject /*  ::borogove::UnicodeList */ ,(void *) &EmojiUtil_obj::GENERAL_PUNCTUATION,HX_("GENERAL_PUNCTUATION",43,74,c6,d5)},
+	{::hx::fsObject /*  ::borogove::UnicodeRange */ ,(void *) &EmojiUtil_obj::ARROWS,HX_("ARROWS",8a,c2,7d,6a)},
+	{::hx::fsObject /*  ::borogove::UnicodeRange */ ,(void *) &EmojiUtil_obj::ENCLOSED_ALPHANUMERICS,HX_("ENCLOSED_ALPHANUMERICS",1a,10,92,95)},
+	{::hx::fsObject /*  ::borogove::UnicodeRange */ ,(void *) &EmojiUtil_obj::MISC_SYMBOLS_AND_ARROWS,HX_("MISC_SYMBOLS_AND_ARROWS",09,56,f1,ae)},
 	{::hx::fsObject /*  ::borogove::UnicodeBlocks */ ,(void *) &EmojiUtil_obj::KEYCAP_COMBINEABLE,HX_("KEYCAP_COMBINEABLE",cd,11,de,c0)},
 	{::hx::fsObject /*  ::borogove::UnicodeBlocks */ ,(void *) &EmojiUtil_obj::SYMBOLIZE,HX_("SYMBOLIZE",dc,fe,6c,db)},
 	{::hx::fsObject /*  ::borogove::UnicodeBlocks */ ,(void *) &EmojiUtil_obj::EMOJIS,HX_("EMOJIS",2d,d2,ea,20)},
@@ -377,6 +412,10 @@ static void EmojiUtil_obj_sMarkStatics(HX_MARK_PARAMS) {
 	HX_MARK_MEMBER_NAME(EmojiUtil_obj::TAGS,"TAGS");
 	HX_MARK_MEMBER_NAME(EmojiUtil_obj::CYK_SYMBOLS_AND_PUNCTUATION,"CYK_SYMBOLS_AND_PUNCTUATION");
 	HX_MARK_MEMBER_NAME(EmojiUtil_obj::LETTERLIKE_SYMBOLS,"LETTERLIKE_SYMBOLS");
+	HX_MARK_MEMBER_NAME(EmojiUtil_obj::GENERAL_PUNCTUATION,"GENERAL_PUNCTUATION");
+	HX_MARK_MEMBER_NAME(EmojiUtil_obj::ARROWS,"ARROWS");
+	HX_MARK_MEMBER_NAME(EmojiUtil_obj::ENCLOSED_ALPHANUMERICS,"ENCLOSED_ALPHANUMERICS");
+	HX_MARK_MEMBER_NAME(EmojiUtil_obj::MISC_SYMBOLS_AND_ARROWS,"MISC_SYMBOLS_AND_ARROWS");
 	HX_MARK_MEMBER_NAME(EmojiUtil_obj::KEYCAP_COMBINEABLE,"KEYCAP_COMBINEABLE");
 	HX_MARK_MEMBER_NAME(EmojiUtil_obj::SYMBOLIZE,"SYMBOLIZE");
 	HX_MARK_MEMBER_NAME(EmojiUtil_obj::EMOJIS,"EMOJIS");
@@ -403,6 +442,10 @@ static void EmojiUtil_obj_sVisitStatics(HX_VISIT_PARAMS) {
 	HX_VISIT_MEMBER_NAME(EmojiUtil_obj::TAGS,"TAGS");
 	HX_VISIT_MEMBER_NAME(EmojiUtil_obj::CYK_SYMBOLS_AND_PUNCTUATION,"CYK_SYMBOLS_AND_PUNCTUATION");
 	HX_VISIT_MEMBER_NAME(EmojiUtil_obj::LETTERLIKE_SYMBOLS,"LETTERLIKE_SYMBOLS");
+	HX_VISIT_MEMBER_NAME(EmojiUtil_obj::GENERAL_PUNCTUATION,"GENERAL_PUNCTUATION");
+	HX_VISIT_MEMBER_NAME(EmojiUtil_obj::ARROWS,"ARROWS");
+	HX_VISIT_MEMBER_NAME(EmojiUtil_obj::ENCLOSED_ALPHANUMERICS,"ENCLOSED_ALPHANUMERICS");
+	HX_VISIT_MEMBER_NAME(EmojiUtil_obj::MISC_SYMBOLS_AND_ARROWS,"MISC_SYMBOLS_AND_ARROWS");
 	HX_VISIT_MEMBER_NAME(EmojiUtil_obj::KEYCAP_COMBINEABLE,"KEYCAP_COMBINEABLE");
 	HX_VISIT_MEMBER_NAME(EmojiUtil_obj::SYMBOLIZE,"SYMBOLIZE");
 	HX_VISIT_MEMBER_NAME(EmojiUtil_obj::EMOJIS,"EMOJIS");
@@ -432,6 +475,10 @@ static ::String EmojiUtil_obj_sStaticFields[] = {
 	HX_("TAGS",d9,7c,b7,37),
 	HX_("CYK_SYMBOLS_AND_PUNCTUATION",44,38,ef,f1),
 	HX_("LETTERLIKE_SYMBOLS",b9,91,eb,11),
+	HX_("GENERAL_PUNCTUATION",43,74,c6,d5),
+	HX_("ARROWS",8a,c2,7d,6a),
+	HX_("ENCLOSED_ALPHANUMERICS",1a,10,92,95),
+	HX_("MISC_SYMBOLS_AND_ARROWS",09,56,f1,ae),
 	HX_("KEYCAP_COMBINEABLE",cd,11,de,c0),
 	HX_("SYMBOLIZE",dc,fe,6c,db),
 	HX_("EMOJIS",2d,d2,ea,20),
@@ -531,45 +578,61 @@ HXDLIN(  47)		CYK_SYMBOLS_AND_PUNCTUATION =  ::borogove::UnicodeList_obj::__allo
             	HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_48_boot)
 HXDLIN(  48)		LETTERLIKE_SYMBOLS =  ::borogove::UnicodeList_obj::__alloc( HX_CTX ,::Array_obj< int >::fromData( _hx_array_data_b0e07afb_20,2));
             	}
+{
+            	HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_49_boot)
+HXDLIN(  49)		GENERAL_PUNCTUATION =  ::borogove::UnicodeList_obj::__alloc( HX_CTX ,::Array_obj< int >::fromData( _hx_array_data_b0e07afb_22,2));
+            	}
+{
+            	HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_50_boot)
+HXDLIN(  50)		ARROWS =  ::borogove::UnicodeRange_obj::__alloc( HX_CTX ,8592,8703);
+            	}
+{
+            	HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_51_boot)
+HXDLIN(  51)		ENCLOSED_ALPHANUMERICS =  ::borogove::UnicodeRange_obj::__alloc( HX_CTX ,9312,9471);
+            	}
+{
+            	HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_52_boot)
+HXDLIN(  52)		MISC_SYMBOLS_AND_ARROWS =  ::borogove::UnicodeRange_obj::__alloc( HX_CTX ,11008,11263);
+            	}
 {
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(0)
             		 ::borogove::UnicodeBlocks _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_50_boot)
-HXDLIN(  50)			 ::borogove::UnicodeList array =  ::borogove::UnicodeList_obj::__alloc( HX_CTX ,::Array_obj< int >::fromData( _hx_array_data_b0e07afb_22,1));
-HXDLIN(  50)			return  ::borogove::UnicodeBlocks_obj::__alloc( HX_CTX ,::Array_obj< ::Dynamic>::__new(3)->init(0,array)->init(1, ::borogove::UnicodeList_obj::__alloc( HX_CTX ,::Array_obj< int >::fromData( _hx_array_data_b0e07afb_23,1)))->init(2, ::borogove::UnicodeRange_obj::__alloc( HX_CTX ,48,57)));
+            			HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_54_boot)
+HXDLIN(  54)			 ::borogove::UnicodeList array =  ::borogove::UnicodeList_obj::__alloc( HX_CTX ,::Array_obj< int >::fromData( _hx_array_data_b0e07afb_27,1));
+HXDLIN(  54)			return  ::borogove::UnicodeBlocks_obj::__alloc( HX_CTX ,::Array_obj< ::Dynamic>::__new(3)->init(0,array)->init(1, ::borogove::UnicodeList_obj::__alloc( HX_CTX ,::Array_obj< int >::fromData( _hx_array_data_b0e07afb_28,1)))->init(2, ::borogove::UnicodeRange_obj::__alloc( HX_CTX ,48,57)));
             		}
             		HX_END_LOCAL_FUNC0(return)
 
-            	HX_STACKFRAME(&_hx_pos_216062b58077c661_50_boot)
-HXDLIN(  50)		KEYCAP_COMBINEABLE = ( ( ::borogove::UnicodeBlocks)( ::Dynamic(new _hx_Closure_0())()) );
+            	HX_STACKFRAME(&_hx_pos_216062b58077c661_54_boot)
+HXDLIN(  54)		KEYCAP_COMBINEABLE = ( ( ::borogove::UnicodeBlocks)( ::Dynamic(new _hx_Closure_0())()) );
             	}
 {
-            	HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_52_boot)
-HXDLIN(  52)		SYMBOLIZE =  ::borogove::UnicodeBlocks_obj::__alloc( HX_CTX ,::Array_obj< ::Dynamic>::__new(5)->init(0,::borogove::EmojiUtil_obj::GEOMETRIC_SHAPES)->init(1,::borogove::EmojiUtil_obj::LATIN_SUPPLEMENT)->init(2,::borogove::EmojiUtil_obj::CYK_SYMBOLS_AND_PUNCTUATION)->init(3,::borogove::EmojiUtil_obj::LETTERLIKE_SYMBOLS)->init(4,::borogove::EmojiUtil_obj::KEYCAP_COMBINEABLE));
+            	HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_56_boot)
+HXDLIN(  56)		SYMBOLIZE =  ::borogove::UnicodeBlocks_obj::__alloc( HX_CTX ,::Array_obj< ::Dynamic>::__new(9)->init(0,::borogove::EmojiUtil_obj::GENERAL_PUNCTUATION)->init(1,::borogove::EmojiUtil_obj::ARROWS)->init(2,::borogove::EmojiUtil_obj::ENCLOSED_ALPHANUMERICS)->init(3,::borogove::EmojiUtil_obj::MISC_SYMBOLS_AND_ARROWS)->init(4,::borogove::EmojiUtil_obj::GEOMETRIC_SHAPES)->init(5,::borogove::EmojiUtil_obj::LATIN_SUPPLEMENT)->init(6,::borogove::EmojiUtil_obj::CYK_SYMBOLS_AND_PUNCTUATION)->init(7,::borogove::EmojiUtil_obj::LETTERLIKE_SYMBOLS)->init(8,::borogove::EmojiUtil_obj::KEYCAP_COMBINEABLE));
             	}
 {
-            	HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_58_boot)
-HXDLIN(  58)		EMOJIS =  ::borogove::UnicodeBlocks_obj::__alloc( HX_CTX ,::Array_obj< ::Dynamic>::__new(8)->init(0,::borogove::EmojiUtil_obj::MISC_SYMBOLS_AND_PICTOGRAPHS)->init(1,::borogove::EmojiUtil_obj::SUPPLEMENTAL_SYMBOLS)->init(2,::borogove::EmojiUtil_obj::EMOTICONS)->init(3,::borogove::EmojiUtil_obj::MISC_SYMBOLS)->init(4,::borogove::EmojiUtil_obj::DINGBATS)->init(5,::borogove::EmojiUtil_obj::ENCLOSED_ALPHANUMERIC_SUPPLEMENT)->init(6,::borogove::EmojiUtil_obj::ENCLOSED_IDEOGRAPHIC_SUPPLEMENT)->init(7,::borogove::EmojiUtil_obj::MISC_TECHNICAL));
+            	HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_66_boot)
+HXDLIN(  66)		EMOJIS =  ::borogove::UnicodeBlocks_obj::__alloc( HX_CTX ,::Array_obj< ::Dynamic>::__new(8)->init(0,::borogove::EmojiUtil_obj::MISC_SYMBOLS_AND_PICTOGRAPHS)->init(1,::borogove::EmojiUtil_obj::SUPPLEMENTAL_SYMBOLS)->init(2,::borogove::EmojiUtil_obj::EMOTICONS)->init(3,::borogove::EmojiUtil_obj::MISC_SYMBOLS)->init(4,::borogove::EmojiUtil_obj::DINGBATS)->init(5,::borogove::EmojiUtil_obj::ENCLOSED_ALPHANUMERIC_SUPPLEMENT)->init(6,::borogove::EmojiUtil_obj::ENCLOSED_IDEOGRAPHIC_SUPPLEMENT)->init(7,::borogove::EmojiUtil_obj::MISC_TECHNICAL));
             	}
 {
-            	HX_STACKFRAME(&_hx_pos_216062b58077c661_71_boot)
-HXDLIN(  71)		ZWJ = 8205;
+            	HX_STACKFRAME(&_hx_pos_216062b58077c661_79_boot)
+HXDLIN(  79)		ZWJ = 8205;
             	}
 {
-            	HX_STACKFRAME(&_hx_pos_216062b58077c661_72_boot)
-HXDLIN(  72)		VARIATION_16 = 65039;
+            	HX_STACKFRAME(&_hx_pos_216062b58077c661_80_boot)
+HXDLIN(  80)		VARIATION_16 = 65039;
             	}
 {
-            	HX_STACKFRAME(&_hx_pos_216062b58077c661_73_boot)
-HXDLIN(  73)		COMBINING_ENCLOSING_KEYCAP = 8419;
+            	HX_STACKFRAME(&_hx_pos_216062b58077c661_81_boot)
+HXDLIN(  81)		COMBINING_ENCLOSING_KEYCAP = 8419;
             	}
 {
-            	HX_STACKFRAME(&_hx_pos_216062b58077c661_74_boot)
-HXDLIN(  74)		BLACK_FLAG = 127988;
+            	HX_STACKFRAME(&_hx_pos_216062b58077c661_82_boot)
+HXDLIN(  82)		BLACK_FLAG = 127988;
             	}
 {
-            	HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_75_boot)
-HXDLIN(  75)		FITZPATRICK =  ::borogove::UnicodeRange_obj::__alloc( HX_CTX ,127995,127999);
+            	HX_GC_STACKFRAME(&_hx_pos_216062b58077c661_83_boot)
+HXDLIN(  83)		FITZPATRICK =  ::borogove::UnicodeRange_obj::__alloc( HX_CTX ,127995,127999);
             	}
 }
 
diff --git a/Sources/c_borogove/src/borogove/EncryptionInfo.cpp b/Sources/c_borogove/src/borogove/EncryptionInfo.cpp
index 20e9883..f46ce30 100644
--- a/Sources/c_borogove/src/borogove/EncryptionInfo.cpp
+++ b/Sources/c_borogove/src/borogove/EncryptionInfo.cpp
@@ -17,25 +17,25 @@
 #include <haxe/ds/StringMap.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_495491200499f74a_35_new,"borogove.EncryptionInfo","new",0x76c80d50,"borogove.EncryptionInfo.new","borogove/EncryptionInfo.hx",35,0x95cafaff)
-HX_LOCAL_STACK_FRAME(_hx_pos_8773c78945f68a55_450_status__fromC,"borogove.EncryptionInfo","status__fromC",0x22417c77,"borogove.EncryptionInfo.status__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8773c78945f68a55_450_method__fromC,"borogove.EncryptionInfo","method__fromC",0xe6ee50a8,"borogove.EncryptionInfo.method__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8773c78945f68a55_450_methodName__fromC,"borogove.EncryptionInfo","methodName__fromC",0xcee0691d,"borogove.EncryptionInfo.methodName__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8773c78945f68a55_450_reason__fromC,"borogove.EncryptionInfo","reason__fromC",0x325a6a25,"borogove.EncryptionInfo.reason__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8773c78945f68a55_450_reasonText__fromC,"borogove.EncryptionInfo","reasonText__fromC",0xae981af8,"borogove.EncryptionInfo.reasonText__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_495491200499f74a_44_toXml,"borogove.EncryptionInfo","toXml",0x3dce780c,"borogove.EncryptionInfo.toXml","borogove/EncryptionInfo.hx",44,0x95cafaff)
-HX_LOCAL_STACK_FRAME(_hx_pos_495491200499f74a_62_fromStanza,"borogove.EncryptionInfo","fromStanza",0xbb51a40f,"borogove.EncryptionInfo.fromStanza","borogove/EncryptionInfo.hx",62,0x95cafaff)
-HX_LOCAL_STACK_FRAME(_hx_pos_495491200499f74a_17_boot,"borogove.EncryptionInfo","boot",0x705c9942,"borogove.EncryptionInfo.boot","borogove/EncryptionInfo.hx",17,0x95cafaff)
-HX_LOCAL_STACK_FRAME(_hx_pos_495491200499f74a_25_boot,"borogove.EncryptionInfo","boot",0x705c9942,"borogove.EncryptionInfo.boot","borogove/EncryptionInfo.hx",25,0x95cafaff)
+HX_DEFINE_STACK_FRAME(_hx_pos_495491200499f74a_38_new,"borogove.EncryptionInfo","new",0x76c80d50,"borogove.EncryptionInfo.new","borogove/EncryptionInfo.hx",38,0x95cafaff)
+HX_LOCAL_STACK_FRAME(_hx_pos_8773c78945f68a55_478_status__fromC,"borogove.EncryptionInfo","status__fromC",0x22417c77,"borogove.EncryptionInfo.status__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8773c78945f68a55_478_method__fromC,"borogove.EncryptionInfo","method__fromC",0xe6ee50a8,"borogove.EncryptionInfo.method__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8773c78945f68a55_478_methodName__fromC,"borogove.EncryptionInfo","methodName__fromC",0xcee0691d,"borogove.EncryptionInfo.methodName__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8773c78945f68a55_478_reason__fromC,"borogove.EncryptionInfo","reason__fromC",0x325a6a25,"borogove.EncryptionInfo.reason__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8773c78945f68a55_478_reasonText__fromC,"borogove.EncryptionInfo","reasonText__fromC",0xae981af8,"borogove.EncryptionInfo.reasonText__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_495491200499f74a_47_toXml,"borogove.EncryptionInfo","toXml",0x3dce780c,"borogove.EncryptionInfo.toXml","borogove/EncryptionInfo.hx",47,0x95cafaff)
+HX_LOCAL_STACK_FRAME(_hx_pos_495491200499f74a_65_fromStanza,"borogove.EncryptionInfo","fromStanza",0xbb51a40f,"borogove.EncryptionInfo.fromStanza","borogove/EncryptionInfo.hx",65,0x95cafaff)
+HX_LOCAL_STACK_FRAME(_hx_pos_495491200499f74a_20_boot,"borogove.EncryptionInfo","boot",0x705c9942,"borogove.EncryptionInfo.boot","borogove/EncryptionInfo.hx",20,0x95cafaff)
+HX_LOCAL_STACK_FRAME(_hx_pos_495491200499f74a_28_boot,"borogove.EncryptionInfo","boot",0x705c9942,"borogove.EncryptionInfo.boot","borogove/EncryptionInfo.hx",28,0x95cafaff)
 namespace borogove{
 
 void EncryptionInfo_obj::__construct(int status,::String method,::String methodName,::String reason,::String reasonText){
-            	HX_STACKFRAME(&_hx_pos_495491200499f74a_35_new)
-HXLINE(  36)		this->status = status;
-HXLINE(  37)		this->method = method;
-HXLINE(  38)		this->methodName = methodName;
-HXLINE(  39)		this->reason = reason;
-HXLINE(  40)		this->reasonText = reasonText;
+            	HX_STACKFRAME(&_hx_pos_495491200499f74a_38_new)
+HXLINE(  39)		this->status = status;
+HXLINE(  40)		this->method = method;
+HXLINE(  41)		this->methodName = methodName;
+HXLINE(  42)		this->reason = reason;
+HXLINE(  43)		this->reasonText = reasonText;
             	}
 
 Dynamic EncryptionInfo_obj::__CreateEmpty() { return new EncryptionInfo_obj; }
@@ -54,65 +54,65 @@ bool EncryptionInfo_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 int EncryptionInfo_obj::status__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8773c78945f68a55_450_status__fromC)
-HXDLIN( 450)		return this->status;
+            	HX_STACKFRAME(&_hx_pos_8773c78945f68a55_478_status__fromC)
+HXDLIN( 478)		return this->status;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(EncryptionInfo_obj,status__fromC,return )
 
 ::String EncryptionInfo_obj::method__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8773c78945f68a55_450_method__fromC)
-HXDLIN( 450)		return this->method;
+            	HX_STACKFRAME(&_hx_pos_8773c78945f68a55_478_method__fromC)
+HXDLIN( 478)		return this->method;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(EncryptionInfo_obj,method__fromC,return )
 
 ::String EncryptionInfo_obj::methodName__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8773c78945f68a55_450_methodName__fromC)
-HXDLIN( 450)		return this->methodName;
+            	HX_STACKFRAME(&_hx_pos_8773c78945f68a55_478_methodName__fromC)
+HXDLIN( 478)		return this->methodName;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(EncryptionInfo_obj,methodName__fromC,return )
 
 ::String EncryptionInfo_obj::reason__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8773c78945f68a55_450_reason__fromC)
-HXDLIN( 450)		return this->reason;
+            	HX_STACKFRAME(&_hx_pos_8773c78945f68a55_478_reason__fromC)
+HXDLIN( 478)		return this->reason;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(EncryptionInfo_obj,reason__fromC,return )
 
 ::String EncryptionInfo_obj::reasonText__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8773c78945f68a55_450_reasonText__fromC)
-HXDLIN( 450)		return this->reasonText;
+            	HX_STACKFRAME(&_hx_pos_8773c78945f68a55_478_reasonText__fromC)
+HXDLIN( 478)		return this->reasonText;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(EncryptionInfo_obj,reasonText__fromC,return )
 
  ::borogove::Stanza EncryptionInfo_obj::toXml(){
-            	HX_GC_STACKFRAME(&_hx_pos_495491200499f74a_44_toXml)
-HXLINE(  48)		::String el;
-HXDLIN(  48)		if ((this->status == 0)) {
-HXLINE(  48)			el = HX_("success",c3,25,4e,b8);
+            	HX_GC_STACKFRAME(&_hx_pos_495491200499f74a_47_toXml)
+HXLINE(  51)		::String el;
+HXDLIN(  51)		if ((this->status == 0)) {
+HXLINE(  51)			el = HX_("success",c3,25,4e,b8);
             		}
             		else {
-HXLINE(  48)			el = HX_("failure",4a,70,fa,16);
+HXLINE(  51)			el = HX_("failure",4a,70,fa,16);
             		}
-HXLINE(  45)		 ::borogove::Stanza el1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("decryption-status",e4,8c,66,6a), ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE(  48)		 ::borogove::Stanza el1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("decryption-status",e4,8c,66,6a), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("result",dd,68,84,08),el)
             			->setFixed(1,HX_("encryption",83,dc,39,4f),this->method)
             			->setFixed(2,HX_("xmlns",dc,31,74,60),HX_("https://borogove.dev/protocol/sdk",3b,17,54,0d))));
-HXLINE(  50)		if (::hx::IsNotNull( this->reason )) {
-HXLINE(  51)			el1->textTag(HX_("reason",c4,0f,9d,fc),this->reason,null());
+HXLINE(  53)		if (::hx::IsNotNull( this->reason )) {
+HXLINE(  54)			el1->textTag(HX_("reason",c4,0f,9d,fc),this->reason,null());
             		}
-HXLINE(  53)		if (::hx::IsNotNull( this->reasonText )) {
-HXLINE(  54)			el1->textTag(HX_("text",ad,cc,f9,4c),this->reasonText,null());
+HXLINE(  56)		if (::hx::IsNotNull( this->reasonText )) {
+HXLINE(  57)			el1->textTag(HX_("text",ad,cc,f9,4c),this->reasonText,null());
             		}
-HXLINE(  56)		return el1;
+HXLINE(  59)		return el1;
             	}
 
 
@@ -121,54 +121,54 @@ HX_DEFINE_DYNAMIC_FUNC0(EncryptionInfo_obj,toXml,return )
  ::haxe::ds::StringMap EncryptionInfo_obj::knownEncryptionSchemes;
 
  ::borogove::EncryptionInfo EncryptionInfo_obj::fromStanza( ::borogove::Stanza stanza){
-            	HX_GC_STACKFRAME(&_hx_pos_495491200499f74a_62_fromStanza)
-HXLINE(  63)		 ::borogove::Stanza emeElement = stanza->getChild(HX_("encryption",83,dc,39,4f),HX_("urn:xmpp:eme:0",57,c9,40,47));
-HXLINE(  66)		::String ns = null();
-HXDLIN(  66)		::String name = null();
-HXLINE(  67)		if (::hx::IsNotNull( emeElement )) {
-HXLINE(  68)			ns = ( (::String)(::Reflect_obj::field(emeElement->attr,HX_("namespace",9b,ea,ed,e7))) );
-HXLINE(  69)			name = ( (::String)(::Reflect_obj::field(emeElement->attr,HX_("name",4b,72,ff,48))) );
+            	HX_GC_STACKFRAME(&_hx_pos_495491200499f74a_65_fromStanza)
+HXLINE(  66)		 ::borogove::Stanza emeElement = stanza->getChild(HX_("encryption",83,dc,39,4f),HX_("urn:xmpp:eme:0",57,c9,40,47));
+HXLINE(  69)		::String ns = null();
+HXDLIN(  69)		::String name = null();
+HXLINE(  70)		if (::hx::IsNotNull( emeElement )) {
+HXLINE(  71)			ns = ( (::String)(::Reflect_obj::field(emeElement->attr,HX_("namespace",9b,ea,ed,e7))) );
+HXLINE(  72)			name = ( (::String)(::Reflect_obj::field(emeElement->attr,HX_("name",4b,72,ff,48))) );
             		}
             		else {
-HXLINE(  70)			if (::hx::IsNotNull( stanza->getChild(HX_("encrypted",04,fa,43,6c),HX_("eu.siacs.conversations.axolotl",44,2e,02,36)) )) {
-HXLINE(  73)				ns = HX_("eu.siacs.conversations.axolotl",44,2e,02,36);
+HXLINE(  73)			if (::hx::IsNotNull( stanza->getChild(HX_("encrypted",04,fa,43,6c),HX_("eu.siacs.conversations.axolotl",44,2e,02,36)) )) {
+HXLINE(  76)				ns = HX_("eu.siacs.conversations.axolotl",44,2e,02,36);
             			}
             		}
-HXLINE(  75)		if (::hx::IsNotNull( ns )) {
-HXLINE(  78)			::String tmp = ns;
-HXDLIN(  78)			::String _hx_tmp;
-HXDLIN(  78)			if (::hx::IsNotNull( tmp )) {
-HXLINE(  78)				_hx_tmp = tmp;
+HXLINE(  78)		if (::hx::IsNotNull( ns )) {
+HXLINE(  81)			::String tmp = ns;
+HXDLIN(  81)			::String _hx_tmp;
+HXDLIN(  81)			if (::hx::IsNotNull( tmp )) {
+HXLINE(  81)				_hx_tmp = tmp;
             			}
             			else {
-HXLINE(  78)				_hx_tmp = HX_("unknown",8a,23,7b,e1);
+HXLINE(  81)				_hx_tmp = HX_("unknown",8a,23,7b,e1);
             			}
-HXLINE(  79)			::String _hx_tmp1;
-HXDLIN(  79)			::String tmp1 = ::borogove::EncryptionInfo_obj::knownEncryptionSchemes->get_string(ns);
-HXDLIN(  79)			::String tmp2;
-HXDLIN(  79)			if (::hx::IsNotNull( tmp1 )) {
-HXLINE(  79)				tmp2 = tmp1;
+HXLINE(  82)			::String _hx_tmp1;
+HXDLIN(  82)			::String tmp1 = ::borogove::EncryptionInfo_obj::knownEncryptionSchemes->get_string(ns);
+HXDLIN(  82)			::String tmp2;
+HXDLIN(  82)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE(  82)				tmp2 = tmp1;
             			}
             			else {
-HXLINE(  79)				tmp2 = name;
+HXLINE(  82)				tmp2 = name;
             			}
-HXDLIN(  79)			if (::hx::IsNotNull( tmp2 )) {
-HXLINE(  79)				_hx_tmp1 = tmp2;
+HXDLIN(  82)			if (::hx::IsNotNull( tmp2 )) {
+HXLINE(  82)				_hx_tmp1 = tmp2;
             			}
             			else {
-HXLINE(  79)				_hx_tmp1 = HX_("Unknown encryption",79,3d,1c,26);
+HXLINE(  82)				_hx_tmp1 = HX_("Unknown encryption",79,3d,1c,26);
             			}
-HXLINE(  81)			::String tmp3 = name;
-HXDLIN(  81)			::String _hx_tmp2;
-HXDLIN(  81)			if (::hx::IsNotNull( tmp3 )) {
-HXLINE(  81)				_hx_tmp2 = tmp3;
+HXLINE(  84)			::String tmp3 = name;
+HXDLIN(  84)			::String _hx_tmp2;
+HXDLIN(  84)			if (::hx::IsNotNull( tmp3 )) {
+HXLINE(  84)				_hx_tmp2 = tmp3;
             			}
             			else {
-HXLINE(  81)				_hx_tmp2 = ns;
+HXLINE(  84)				_hx_tmp2 = ns;
             			}
-HXLINE(  76)			return  ::borogove::EncryptionInfo_obj::__alloc( HX_CTX ,1,_hx_tmp,_hx_tmp1,HX_("unsupported-encryption",5b,6c,86,4a),(HX_("Unsupported encryption method: ",f9,9f,a6,ec) + _hx_tmp2));
+HXLINE(  79)			return  ::borogove::EncryptionInfo_obj::__alloc( HX_CTX ,1,_hx_tmp,_hx_tmp1,HX_("unsupported-encryption",5b,6c,86,4a),(HX_("Unsupported encryption method: ",f9,9f,a6,ec) + _hx_tmp2));
             		}
-HXLINE(  84)		return null();
+HXLINE(  87)		return null();
             	}
 
 
@@ -363,8 +363,8 @@ void EncryptionInfo_obj::__register()
 void EncryptionInfo_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_495491200499f74a_17_boot)
-HXDLIN(  17)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_495491200499f74a_20_boot)
+HXDLIN(  20)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(5)
             				->setFixed(0,HX_("status__fromC",87,b3,25,a1), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
@@ -380,20 +380,20 @@ HXDLIN(  17)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
 {
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(0)
             		 ::haxe::ds::StringMap _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_495491200499f74a_25_boot)
-HXDLIN(  25)			 ::haxe::ds::StringMap _g =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXDLIN(  25)			_g->set(HX_("urn:xmpp:otr:0",07,f2,ec,0d),HX_("OTR",8d,3b,3c,00));
-HXDLIN(  25)			_g->set(HX_("jabber:x:encrypted",6c,67,64,ad),HX_("Legacy OpenPGP",18,54,6a,dd));
-HXDLIN(  25)			_g->set(HX_("urn:xmpp:openpgp:0",e9,3d,59,5b),HX_("OpenPGP",cf,10,83,0d));
-HXDLIN(  25)			_g->set(HX_("eu.siacs.conversations.axolotl",44,2e,02,36),HX_("OMEMO",89,e0,c1,af));
-HXDLIN(  25)			_g->set(HX_("urn:xmpp:omemo:1",04,93,c3,f1),HX_("OMEMO 1",da,f0,61,8c));
-HXDLIN(  25)			_g->set(HX_("urn:xmpp:omemo:2",05,93,c3,f1),HX_("OMEMO 2",db,f0,61,8c));
-HXDLIN(  25)			return _g;
+            			HX_GC_STACKFRAME(&_hx_pos_495491200499f74a_28_boot)
+HXDLIN(  28)			 ::haxe::ds::StringMap _g =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXDLIN(  28)			_g->set(HX_("urn:xmpp:otr:0",07,f2,ec,0d),HX_("OTR",8d,3b,3c,00));
+HXDLIN(  28)			_g->set(HX_("jabber:x:encrypted",6c,67,64,ad),HX_("Legacy OpenPGP",18,54,6a,dd));
+HXDLIN(  28)			_g->set(HX_("urn:xmpp:openpgp:0",e9,3d,59,5b),HX_("OpenPGP",cf,10,83,0d));
+HXDLIN(  28)			_g->set(HX_("eu.siacs.conversations.axolotl",44,2e,02,36),HX_("OMEMO",89,e0,c1,af));
+HXDLIN(  28)			_g->set(HX_("urn:xmpp:omemo:1",04,93,c3,f1),HX_("OMEMO 1",da,f0,61,8c));
+HXDLIN(  28)			_g->set(HX_("urn:xmpp:omemo:2",05,93,c3,f1),HX_("OMEMO 2",db,f0,61,8c));
+HXDLIN(  28)			return _g;
             		}
             		HX_END_LOCAL_FUNC0(return)
 
-            	HX_STACKFRAME(&_hx_pos_495491200499f74a_25_boot)
-HXDLIN(  25)		knownEncryptionSchemes = ( ( ::haxe::ds::StringMap)( ::Dynamic(new _hx_Closure_0())()) );
+            	HX_STACKFRAME(&_hx_pos_495491200499f74a_28_boot)
+HXDLIN(  28)		knownEncryptionSchemes = ( ( ::haxe::ds::StringMap)( ::Dynamic(new _hx_Closure_0())()) );
             	}
 }
 
diff --git a/Sources/c_borogove/src/borogove/EventEmitter.cpp b/Sources/c_borogove/src/borogove/EventEmitter.cpp
index d7a0d2e..79d829c 100644
--- a/Sources/c_borogove/src/borogove/EventEmitter.cpp
+++ b/Sources/c_borogove/src/borogove/EventEmitter.cpp
@@ -20,18 +20,18 @@
 #include <haxe/ds/StringMap.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_146a13f27c2d9810_23_new,"borogove.EventEmitter","new",0x4c1a4b73,"borogove.EventEmitter.new","borogove/EventEmitter.hx",23,0x67194c7c)
-HX_LOCAL_STACK_FRAME(_hx_pos_146a13f27c2d9810_30_on,"borogove.EventEmitter","on",0x9fe9296c,"borogove.EventEmitter.on","borogove/EventEmitter.hx",30,0x67194c7c)
-HX_LOCAL_STACK_FRAME(_hx_pos_146a13f27c2d9810_44_once,"borogove.EventEmitter","once",0x4b97b30e,"borogove.EventEmitter.once","borogove/EventEmitter.hx",44,0x67194c7c)
-HX_LOCAL_STACK_FRAME(_hx_pos_146a13f27c2d9810_42_once,"borogove.EventEmitter","once",0x4b97b30e,"borogove.EventEmitter.once","borogove/EventEmitter.hx",42,0x67194c7c)
-HX_LOCAL_STACK_FRAME(_hx_pos_146a13f27c2d9810_52_trigger,"borogove.EventEmitter","trigger",0x069c55cb,"borogove.EventEmitter.trigger","borogove/EventEmitter.hx",52,0x67194c7c)
-HX_LOCAL_STACK_FRAME(_hx_pos_146a13f27c2d9810_76_removeEventListener,"borogove.EventEmitter","removeEventListener",0xeb3a98dd,"borogove.EventEmitter.removeEventListener","borogove/EventEmitter.hx",76,0x67194c7c)
+HX_DEFINE_STACK_FRAME(_hx_pos_146a13f27c2d9810_26_new,"borogove.EventEmitter","new",0x4c1a4b73,"borogove.EventEmitter.new","borogove/EventEmitter.hx",26,0x67194c7c)
+HX_LOCAL_STACK_FRAME(_hx_pos_146a13f27c2d9810_31_on,"borogove.EventEmitter","on",0x9fe9296c,"borogove.EventEmitter.on","borogove/EventEmitter.hx",31,0x67194c7c)
+HX_LOCAL_STACK_FRAME(_hx_pos_146a13f27c2d9810_45_once,"borogove.EventEmitter","once",0x4b97b30e,"borogove.EventEmitter.once","borogove/EventEmitter.hx",45,0x67194c7c)
+HX_LOCAL_STACK_FRAME(_hx_pos_146a13f27c2d9810_43_once,"borogove.EventEmitter","once",0x4b97b30e,"borogove.EventEmitter.once","borogove/EventEmitter.hx",43,0x67194c7c)
+HX_LOCAL_STACK_FRAME(_hx_pos_146a13f27c2d9810_53_trigger,"borogove.EventEmitter","trigger",0x069c55cb,"borogove.EventEmitter.trigger","borogove/EventEmitter.hx",53,0x67194c7c)
+HX_LOCAL_STACK_FRAME(_hx_pos_146a13f27c2d9810_78_removeEventListener,"borogove.EventEmitter","removeEventListener",0xeb3a98dd,"borogove.EventEmitter.removeEventListener","borogove/EventEmitter.hx",78,0x67194c7c)
+HX_LOCAL_STACK_FRAME(_hx_pos_146a13f27c2d9810_25_boot,"borogove.EventEmitter","boot",0x4300b9bf,"borogove.EventEmitter.boot","borogove/EventEmitter.hx",25,0x67194c7c)
 namespace borogove{
 
 void EventEmitter_obj::__construct(){
-            	HX_GC_STACKFRAME(&_hx_pos_146a13f27c2d9810_23_new)
-HXLINE(  25)		this->eventHandlers =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(  24)		this->nextEventHandlerToken = 0;
+            	HX_GC_STACKFRAME(&_hx_pos_146a13f27c2d9810_26_new)
+HXDLIN(  26)		this->eventHandlers =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
             	}
 
 Dynamic EventEmitter_obj::__CreateEmpty() { return new EventEmitter_obj; }
@@ -50,15 +50,15 @@ bool EventEmitter_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 int EventEmitter_obj::on(::String eventName, ::Dynamic callback){
-            	HX_GC_STACKFRAME(&_hx_pos_146a13f27c2d9810_30_on)
-HXLINE(  31)		 ::haxe::ds::IntMap handlers = ( ( ::haxe::ds::IntMap)(this->eventHandlers->get(eventName)) );
-HXLINE(  32)		if (::hx::IsNull( handlers )) {
-HXLINE(  33)			handlers =  ::haxe::ds::IntMap_obj::__alloc( HX_CTX );
-HXLINE(  34)			this->eventHandlers->set(eventName,handlers);
+            	HX_GC_STACKFRAME(&_hx_pos_146a13f27c2d9810_31_on)
+HXLINE(  32)		 ::haxe::ds::IntMap handlers = ( ( ::haxe::ds::IntMap)(this->eventHandlers->get(eventName)) );
+HXLINE(  33)		if (::hx::IsNull( handlers )) {
+HXLINE(  34)			handlers =  ::haxe::ds::IntMap_obj::__alloc( HX_CTX );
+HXLINE(  35)			this->eventHandlers->set(eventName,handlers);
             		}
-HXLINE(  36)		int token = this->nextEventHandlerToken++;
-HXLINE(  37)		handlers->set(token,callback);
-HXLINE(  38)		return token;
+HXLINE(  37)		int token = ::borogove::EventEmitter_obj::nextEventHandlerToken++;
+HXLINE(  38)		handlers->set(token,callback);
+HXLINE(  39)		return token;
             	}
 
 
@@ -67,79 +67,81 @@ HX_DEFINE_DYNAMIC_FUNC2(EventEmitter_obj,on,return )
 void EventEmitter_obj::once(::String eventName, ::Dynamic callback){
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::EventEmitter,_gthis,::Array< ::Dynamic>,token, ::Dynamic,callback) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic e){
-            			HX_STACKFRAME(&_hx_pos_146a13f27c2d9810_44_once)
-HXLINE(  45)			if (::hx::IsNull( token->__get(0) )) {
-HXLINE(  45)				HX_STACK_DO_THROW(HX_("Somehow token was not ready",54,8b,59,8f));
+            			HX_STACKFRAME(&_hx_pos_146a13f27c2d9810_45_once)
+HXLINE(  46)			if (::hx::IsNull( token->__get(0) )) {
+HXLINE(  46)				HX_STACK_DO_THROW(HX_("Somehow token was not ready",54,8b,59,8f));
             			}
-HXLINE(  46)			_gthis->removeEventListener(( (int)(token->__get(0)) ));
-HXLINE(  47)			return callback(e);
+HXLINE(  47)			_gthis->removeEventListener(( (int)(token->__get(0)) ));
+HXLINE(  48)			return callback(e);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_146a13f27c2d9810_42_once)
-HXDLIN(  42)		 ::borogove::EventEmitter _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(  43)		::Array< ::Dynamic> token = ::Array_obj< ::Dynamic>::__new(1)->init(0,null());
-HXLINE(  44)		token[0] = this->on(eventName, ::Dynamic(new _hx_Closure_0(_gthis,token,callback)));
+            	HX_STACKFRAME(&_hx_pos_146a13f27c2d9810_43_once)
+HXDLIN(  43)		 ::borogove::EventEmitter _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(  44)		::Array< ::Dynamic> token = ::Array_obj< ::Dynamic>::__new(1)->init(0,null());
+HXLINE(  45)		token[0] = this->on(eventName, ::Dynamic(new _hx_Closure_0(_gthis,token,callback)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(EventEmitter_obj,once,(void))
 
  ::borogove::EventResult EventEmitter_obj::trigger(::String eventName, ::Dynamic eventData){
-            	HX_STACKFRAME(&_hx_pos_146a13f27c2d9810_52_trigger)
-HXLINE(  53)		 ::haxe::ds::IntMap handlers = ( ( ::haxe::ds::IntMap)(this->eventHandlers->get(eventName)) );
-HXLINE(  54)		if (::hx::IsNull( handlers )) {
-HXLINE(  54)			return ::borogove::EventResult_obj::EventUnhandled_dyn();
+            	HX_STACKFRAME(&_hx_pos_146a13f27c2d9810_53_trigger)
+HXLINE(  54)		 ::haxe::ds::IntMap handlers = ( ( ::haxe::ds::IntMap)(this->eventHandlers->get(eventName)) );
+HXLINE(  55)		if (::hx::IsNull( handlers )) {
+HXLINE(  55)			return ::borogove::EventResult_obj::EventUnhandled_dyn();
             		}
-HXLINE(  56)		::haxe::Log_obj::trace((HX_("firing event: ",93,3a,85,fb) + eventName),::hx::SourceInfo(HX_("borogove/EventEmitter.hx",7c,4c,19,67),56,HX_("borogove.EventEmitter",01,16,b5,ca),HX_("trigger",38,55,df,25)));
-HXLINE(  57)		bool handled = false;
-HXLINE(  58)		{
-HXLINE(  58)			 ::Dynamic handler = handlers->iterator();
-HXDLIN(  58)			while(( (bool)(handler->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE(  59)				 ::borogove::EventResult ret = handler->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()(eventData);
-HXLINE(  60)				switch((int)(ret->_hx_getIndex())){
+HXLINE(  57)		::haxe::Log_obj::trace((HX_("firing event: ",93,3a,85,fb) + eventName),::hx::SourceInfo(HX_("borogove/EventEmitter.hx",7c,4c,19,67),57,HX_("borogove.EventEmitter",01,16,b5,ca),HX_("trigger",38,55,df,25)));
+HXLINE(  58)		bool handled = false;
+HXLINE(  59)		{
+HXLINE(  59)			 ::Dynamic handler = handlers->iterator();
+HXDLIN(  59)			while(( (bool)(handler->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(  60)				 ::borogove::EventResult ret = handler->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()(eventData);
+HXLINE(  61)				switch((int)(ret->_hx_getIndex())){
             					case (int)0: {
-HXLINE(  61)						handled = true;
+HXLINE(  62)						handled = true;
             					}
             					break;
             					case (int)1: {
-HXLINE(  62)						continue;
+HXLINE(  63)						continue;
             					}
             					break;
             					case (int)2: {
-HXLINE(  63)						return ret;
+HXLINE(  64)						return ret;
             					}
             					break;
             					case (int)3: {
-HXLINE(  63)						return ret;
+HXLINE(  64)						return ret;
             					}
             					break;
             				}
             			}
             		}
-HXLINE(  66)		if (handled) {
-HXLINE(  66)			return ::borogove::EventResult_obj::EventHandled_dyn();
+HXLINE(  67)		if (handled) {
+HXLINE(  67)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		else {
-HXLINE(  66)			return ::borogove::EventResult_obj::EventUnhandled_dyn();
+HXLINE(  67)			return ::borogove::EventResult_obj::EventUnhandled_dyn();
             		}
-HXDLIN(  66)		return null();
+HXDLIN(  67)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(EventEmitter_obj,trigger,return )
 
 void EventEmitter_obj::removeEventListener(int token){
-            	HX_STACKFRAME(&_hx_pos_146a13f27c2d9810_76_removeEventListener)
-HXDLIN(  76)		 ::Dynamic handlers = this->eventHandlers->iterator();
-HXDLIN(  76)		while(( (bool)(handlers->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE(  77)			( ( ::haxe::ds::IntMap)(handlers->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) )->remove(token);
+            	HX_STACKFRAME(&_hx_pos_146a13f27c2d9810_78_removeEventListener)
+HXDLIN(  78)		 ::Dynamic handlers = this->eventHandlers->iterator();
+HXDLIN(  78)		while(( (bool)(handlers->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(  79)			( ( ::haxe::ds::IntMap)(handlers->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) )->remove(token);
             		}
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(EventEmitter_obj,removeEventListener,(void))
 
+int EventEmitter_obj::nextEventHandlerToken;
+
 
 ::hx::ObjectPtr< EventEmitter_obj > EventEmitter_obj::__new() {
 	::hx::ObjectPtr< EventEmitter_obj > __this = new EventEmitter_obj();
@@ -161,14 +163,12 @@ EventEmitter_obj::EventEmitter_obj()
 void EventEmitter_obj::__Mark(HX_MARK_PARAMS)
 {
 	HX_MARK_BEGIN_CLASS(EventEmitter);
-	HX_MARK_MEMBER_NAME(nextEventHandlerToken,"nextEventHandlerToken");
 	HX_MARK_MEMBER_NAME(eventHandlers,"eventHandlers");
 	HX_MARK_END_CLASS();
 }
 
 void EventEmitter_obj::__Visit(HX_VISIT_PARAMS)
 {
-	HX_VISIT_MEMBER_NAME(nextEventHandlerToken,"nextEventHandlerToken");
 	HX_VISIT_MEMBER_NAME(eventHandlers,"eventHandlers");
 }
 
@@ -189,43 +189,55 @@ void EventEmitter_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 19:
 		if (HX_FIELD_EQ(inName,"removeEventListener") ) { return ::hx::Val( removeEventListener_dyn() ); }
-		break;
-	case 21:
-		if (HX_FIELD_EQ(inName,"nextEventHandlerToken") ) { return ::hx::Val( nextEventHandlerToken ); }
 	}
 	return super::__Field(inName,inCallProp);
 }
 
+bool EventEmitter_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 21:
+		if (HX_FIELD_EQ(inName,"nextEventHandlerToken") ) { outValue = ( nextEventHandlerToken ); return true; }
+	}
+	return false;
+}
+
 ::hx::Val EventEmitter_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
 {
 	switch(inName.length) {
 	case 13:
 		if (HX_FIELD_EQ(inName,"eventHandlers") ) { eventHandlers=inValue.Cast<  ::haxe::ds::StringMap >(); return inValue; }
-		break;
-	case 21:
-		if (HX_FIELD_EQ(inName,"nextEventHandlerToken") ) { nextEventHandlerToken=inValue.Cast< int >(); return inValue; }
 	}
 	return super::__SetField(inName,inValue,inCallProp);
 }
 
+bool EventEmitter_obj::__SetStatic(const ::String &inName,Dynamic &ioValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 21:
+		if (HX_FIELD_EQ(inName,"nextEventHandlerToken") ) { nextEventHandlerToken=ioValue.Cast< int >(); return true; }
+	}
+	return false;
+}
+
 void EventEmitter_obj::__GetFields(Array< ::String> &outFields)
 {
-	outFields->push(HX_("nextEventHandlerToken",96,13,5a,b3));
 	outFields->push(HX_("eventHandlers",a3,4f,27,8f));
 	super::__GetFields(outFields);
 };
 
 #ifdef HXCPP_SCRIPTABLE
 static ::hx::StorageInfo EventEmitter_obj_sMemberStorageInfo[] = {
-	{::hx::fsInt,(int)offsetof(EventEmitter_obj,nextEventHandlerToken),HX_("nextEventHandlerToken",96,13,5a,b3)},
 	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(EventEmitter_obj,eventHandlers),HX_("eventHandlers",a3,4f,27,8f)},
 	{ ::hx::fsUnknown, 0, null()}
 };
-static ::hx::StaticInfo *EventEmitter_obj_sStaticStorageInfo = 0;
+static ::hx::StaticInfo EventEmitter_obj_sStaticStorageInfo[] = {
+	{::hx::fsInt,(void *) &EventEmitter_obj::nextEventHandlerToken,HX_("nextEventHandlerToken",96,13,5a,b3)},
+	{ ::hx::fsUnknown, 0, null()}
+};
 #endif
 
 static ::String EventEmitter_obj_sMemberFields[] = {
-	HX_("nextEventHandlerToken",96,13,5a,b3),
 	HX_("eventHandlers",a3,4f,27,8f),
 	HX_("on",1f,61,00,00),
 	HX_("once",81,7d,b2,49),
@@ -233,8 +245,24 @@ static ::String EventEmitter_obj_sMemberFields[] = {
 	HX_("removeEventListener",ca,87,75,55),
 	::String(null()) };
 
+static void EventEmitter_obj_sMarkStatics(HX_MARK_PARAMS) {
+	HX_MARK_MEMBER_NAME(EventEmitter_obj::nextEventHandlerToken,"nextEventHandlerToken");
+};
+
+#ifdef HXCPP_VISIT_ALLOCS
+static void EventEmitter_obj_sVisitStatics(HX_VISIT_PARAMS) {
+	HX_VISIT_MEMBER_NAME(EventEmitter_obj::nextEventHandlerToken,"nextEventHandlerToken");
+};
+
+#endif
+
 ::hx::Class EventEmitter_obj::__mClass;
 
+static ::String EventEmitter_obj_sStaticFields[] = {
+	HX_("nextEventHandlerToken",96,13,5a,b3),
+	::String(null())
+};
+
 void EventEmitter_obj::__register()
 {
 	EventEmitter_obj _hx_dummy;
@@ -244,11 +272,15 @@ void EventEmitter_obj::__register()
 	__mClass->mSuper = &super::__SGetClass();
 	__mClass->mConstructEmpty = &__CreateEmpty;
 	__mClass->mConstructArgs = &__Create;
-	__mClass->mGetStaticField = &::hx::Class_obj::GetNoStaticField;
-	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
-	__mClass->mStatics = ::hx::Class_obj::dupFunctions(0 /* sStaticFields */);
+	__mClass->mGetStaticField = &EventEmitter_obj::__GetStatic;
+	__mClass->mSetStaticField = &EventEmitter_obj::__SetStatic;
+	__mClass->mMarkFunc = EventEmitter_obj_sMarkStatics;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(EventEmitter_obj_sStaticFields);
 	__mClass->mMembers = ::hx::Class_obj::dupFunctions(EventEmitter_obj_sMemberFields);
 	__mClass->mCanCast = ::hx::TCanCast< EventEmitter_obj >;
+#ifdef HXCPP_VISIT_ALLOCS
+	__mClass->mVisitFunc = EventEmitter_obj_sVisitStatics;
+#endif
 #ifdef HXCPP_SCRIPTABLE
 	__mClass->mMemberStorageInfo = EventEmitter_obj_sMemberStorageInfo;
 #endif
@@ -258,4 +290,12 @@ void EventEmitter_obj::__register()
 	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
 }
 
+void EventEmitter_obj::__boot()
+{
+{
+            	HX_STACKFRAME(&_hx_pos_146a13f27c2d9810_25_boot)
+HXDLIN(  25)		nextEventHandlerToken = 0;
+            	}
+}
+
 } // end namespace borogove
diff --git a/Sources/c_borogove/src/borogove/Form.cpp b/Sources/c_borogove/src/borogove/Form.cpp
index 5f760ba..c0b6724 100644
--- a/Sources/c_borogove/src/borogove/Form.cpp
+++ b/Sources/c_borogove/src/borogove/Form.cpp
@@ -4,8 +4,8 @@
 #ifndef INCLUDED_Reflect
 #include <Reflect.h>
 #endif
-#ifndef INCLUDED__HaxeCBridge_Internal
-#include <_HaxeCBridge/Internal.h>
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
 #endif
 #ifndef INCLUDED_borogove_Form
 #include <borogove/Form.h>
@@ -31,37 +31,31 @@
 #ifndef INCLUDED_borogove__DataForm_Field_Impl_
 #include <borogove/_DataForm/Field_Impl_.h>
 #endif
-#ifndef INCLUDED_cpp_Int64Map
-#include <cpp/Int64Map.h>
-#endif
-#ifndef INCLUDED_haxe_IMap
-#include <haxe/IMap.h>
-#endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_d5f5e869927de4ab_102_new,"borogove.Form","new",0x1fd8d343,"borogove.Form.new","borogove/Form.hx",102,0x25d2f7ac)
-HX_LOCAL_STACK_FRAME(_hx_pos_d5f5e869927de4ab_111_isResult,"borogove.Form","isResult",0x5904aaa4,"borogove.Form.isResult","borogove/Form.hx",111,0x25d2f7ac)
-HX_LOCAL_STACK_FRAME(_hx_pos_d5f5e869927de4ab_121_title,"borogove.Form","title",0xdd30d73b,"borogove.Form.title","borogove/Form.hx",121,0x25d2f7ac)
-HX_LOCAL_STACK_FRAME(_hx_pos_d5f5e869927de4ab_128_url,"borogove.Form","url",0x1fde2e52,"borogove.Form.url","borogove/Form.hx",128,0x25d2f7ac)
-HX_LOCAL_STACK_FRAME(_hx_pos_d5f5e869927de4ab_134_items,"borogove.Form","items",0x8f026da3,"borogove.Form.items","borogove/Form.hx",134,0x25d2f7ac)
-HX_LOCAL_STACK_FRAME(_hx_pos_6b9e5fdea75c39d7_335_items__fromC,"borogove.Form","items__fromC",0x8be04d36,"borogove.Form.items__fromC","HaxeCBridge.hx",335,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_d5f5e869927de4ab_220_submit,"borogove.Form","submit",0x241a0515,"borogove.Form.submit","borogove/Form.hx",220,0x25d2f7ac)
-HX_LOCAL_STACK_FRAME(_hx_pos_d5f5e869927de4ab_97_boot,"borogove.Form","boot",0xb5f907ef,"borogove.Form.boot","borogove/Form.hx",97,0x25d2f7ac)
+HX_DEFINE_STACK_FRAME(_hx_pos_d5f5e869927de4ab_136_new,"borogove.Form","new",0x1fd8d343,"borogove.Form.new","borogove/Form.hx",136,0x25d2f7ac)
+HX_LOCAL_STACK_FRAME(_hx_pos_d5f5e869927de4ab_145_isResult,"borogove.Form","isResult",0x5904aaa4,"borogove.Form.isResult","borogove/Form.hx",145,0x25d2f7ac)
+HX_LOCAL_STACK_FRAME(_hx_pos_d5f5e869927de4ab_155_title,"borogove.Form","title",0xdd30d73b,"borogove.Form.title","borogove/Form.hx",155,0x25d2f7ac)
+HX_LOCAL_STACK_FRAME(_hx_pos_d5f5e869927de4ab_162_url,"borogove.Form","url",0x1fde2e52,"borogove.Form.url","borogove/Form.hx",162,0x25d2f7ac)
+HX_LOCAL_STACK_FRAME(_hx_pos_d5f5e869927de4ab_168_items,"borogove.Form","items",0x8f026da3,"borogove.Form.items","borogove/Form.hx",168,0x25d2f7ac)
+HX_LOCAL_STACK_FRAME(_hx_pos_6b9e5fdea75c39d7_363_items__fromC,"borogove.Form","items__fromC",0x8be04d36,"borogove.Form.items__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_d5f5e869927de4ab_260_submit,"borogove.Form","submit",0x241a0515,"borogove.Form.submit","borogove/Form.hx",260,0x25d2f7ac)
+HX_LOCAL_STACK_FRAME(_hx_pos_d5f5e869927de4ab_131_boot,"borogove.Form","boot",0xb5f907ef,"borogove.Form.boot","borogove/Form.hx",131,0x25d2f7ac)
 namespace borogove{
 
 void Form_obj::__construct( ::borogove::Stanza form, ::borogove::Stanza oob){
-            	HX_STACKFRAME(&_hx_pos_d5f5e869927de4ab_102_new)
-HXLINE( 103)		bool _hx_tmp;
-HXDLIN( 103)		if (::hx::IsNull( form )) {
-HXLINE( 103)			_hx_tmp = ::hx::IsNull( oob );
+            	HX_STACKFRAME(&_hx_pos_d5f5e869927de4ab_136_new)
+HXLINE( 137)		bool _hx_tmp;
+HXDLIN( 137)		if (::hx::IsNull( form )) {
+HXLINE( 137)			_hx_tmp = ::hx::IsNull( oob );
             		}
             		else {
-HXLINE( 103)			_hx_tmp = false;
+HXLINE( 137)			_hx_tmp = false;
             		}
-HXDLIN( 103)		if (_hx_tmp) {
-HXLINE( 103)			HX_STACK_DO_THROW(HX_("Need a form or OOB",98,11,b8,58));
+HXDLIN( 137)		if (_hx_tmp) {
+HXLINE( 137)			HX_STACK_DO_THROW(HX_("Need a form or OOB",98,11,b8,58));
             		}
-HXLINE( 104)		this->form = form;
-HXLINE( 105)		this->oob = oob;
+HXLINE( 138)		this->form = form;
+HXLINE( 139)		this->oob = oob;
             	}
 
 Dynamic Form_obj::__CreateEmpty() { return new Form_obj; }
@@ -96,354 +90,316 @@ void *Form_obj::_hx_getInterface(int inHash) {
 }
 
 bool Form_obj::isResult(){
-            	HX_STACKFRAME(&_hx_pos_d5f5e869927de4ab_111_isResult)
-HXLINE( 112)		if (::hx::IsNull( this->form )) {
-HXLINE( 112)			return true;
+            	HX_STACKFRAME(&_hx_pos_d5f5e869927de4ab_145_isResult)
+HXLINE( 146)		if (::hx::IsNull( this->form )) {
+HXLINE( 146)			return true;
             		}
-HXLINE( 114)		::String _hx_tmp;
-HXDLIN( 114)		::String tmp = ( (::String)(::Reflect_obj::field(this->form->attr,HX_("type",ba,f2,08,4d))) );
-HXDLIN( 114)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 114)			_hx_tmp = tmp;
+HXLINE( 148)		::String _hx_tmp;
+HXDLIN( 148)		::String tmp = ( (::String)(::Reflect_obj::field(this->form->attr,HX_("type",ba,f2,08,4d))) );
+HXDLIN( 148)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 148)			_hx_tmp = tmp;
             		}
             		else {
-HXLINE( 114)			_hx_tmp = HX_("form",44,61,c0,43);
+HXLINE( 148)			_hx_tmp = HX_("form",44,61,c0,43);
             		}
-HXDLIN( 114)		return (_hx_tmp == HX_("result",dd,68,84,08));
+HXDLIN( 148)		return (_hx_tmp == HX_("result",dd,68,84,08));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Form_obj,isResult,return )
 
 ::String Form_obj::title(){
-            	HX_STACKFRAME(&_hx_pos_d5f5e869927de4ab_121_title)
-HXDLIN( 121)		if (::hx::IsNotNull( this->form )) {
-HXDLIN( 121)			return this->form->getChildText(HX_("title",98,15,3b,10),null());
+            	HX_STACKFRAME(&_hx_pos_d5f5e869927de4ab_155_title)
+HXDLIN( 155)		if (::hx::IsNotNull( this->form )) {
+HXDLIN( 155)			return this->form->getChildText(HX_("title",98,15,3b,10),null());
             		}
             		else {
-HXDLIN( 121)			return this->oob->getChildText(HX_("desc",51,5e,66,42),null());
+HXDLIN( 155)			return this->oob->getChildText(HX_("desc",51,5e,66,42),null());
             		}
-HXDLIN( 121)		return null();
+HXDLIN( 155)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Form_obj,title,return )
 
 ::String Form_obj::url(){
-            	HX_STACKFRAME(&_hx_pos_d5f5e869927de4ab_128_url)
-HXDLIN( 128)		 ::borogove::Stanza tmp = this->oob;
-HXDLIN( 128)		if (::hx::IsNotNull( tmp )) {
-HXDLIN( 128)			return tmp->getChildText(HX_("url",6f,2b,59,00),null());
+            	HX_STACKFRAME(&_hx_pos_d5f5e869927de4ab_162_url)
+HXDLIN( 162)		 ::borogove::Stanza tmp = this->oob;
+HXDLIN( 162)		if (::hx::IsNotNull( tmp )) {
+HXDLIN( 162)			return tmp->getChildText(HX_("url",6f,2b,59,00),null());
             		}
             		else {
-HXDLIN( 128)			return null();
+HXDLIN( 162)			return null();
             		}
-HXDLIN( 128)		return null();
+HXDLIN( 162)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Form_obj,url,return )
 
 ::Array< ::Dynamic> Form_obj::items(){
-            	HX_GC_STACKFRAME(&_hx_pos_d5f5e869927de4ab_134_items)
-HXLINE( 135)		if (::hx::IsNull( this->form )) {
-HXLINE( 135)			return ::Array_obj< ::Dynamic>::__new(0);
+            	HX_GC_STACKFRAME(&_hx_pos_d5f5e869927de4ab_168_items)
+HXLINE( 169)		if (::hx::IsNull( this->form )) {
+HXLINE( 169)			return ::Array_obj< ::Dynamic>::__new(0);
             		}
-HXLINE( 137)		 ::borogove::Stanza s = this->form;
-HXLINE( 138)		bool hasLayout = ::hx::IsNotNull( s->getChild(HX_("page",4f,da,51,4a),HX_("http://jabber.org/protocol/xdata-layout",a9,5c,62,a8)) );
-HXLINE( 139)		::Array< ::Dynamic> items = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 140)		{
-HXLINE( 140)			int _g = 0;
-HXDLIN( 140)			::Array< ::Dynamic> _g1 = s->allTags(null(),null());
-HXDLIN( 140)			while((_g < _g1->length)){
-HXLINE( 140)				 ::borogove::Stanza child = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 140)				_g = (_g + 1);
-HXLINE( 141)				bool _hx_tmp;
-HXDLIN( 141)				if ((child->name == HX_("instructions",a5,96,3f,6d))) {
-HXLINE( 141)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
-HXLINE( 141)						_hx_tmp = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("jabber:x:data",c2,e1,e9,7c));
+HXLINE( 171)		 ::borogove::Stanza s = this->form;
+HXLINE( 172)		bool hasLayout = ::hx::IsNotNull( s->getChild(HX_("page",4f,da,51,4a),HX_("http://jabber.org/protocol/xdata-layout",a9,5c,62,a8)) );
+HXLINE( 173)		::Array< ::Dynamic> items = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 174)		{
+HXLINE( 174)			int _g = 0;
+HXDLIN( 174)			::Array< ::Dynamic> _g1 = s->allTags(null(),null());
+HXDLIN( 174)			while((_g < _g1->length)){
+HXLINE( 174)				 ::borogove::Stanza child = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 174)				_g = (_g + 1);
+HXLINE( 175)				bool _hx_tmp;
+HXDLIN( 175)				if ((child->name == HX_("instructions",a5,96,3f,6d))) {
+HXLINE( 175)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
+HXLINE( 175)						_hx_tmp = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("jabber:x:data",c2,e1,e9,7c));
             					}
             					else {
-HXLINE( 141)						_hx_tmp = true;
+HXLINE( 175)						_hx_tmp = true;
             					}
             				}
             				else {
-HXLINE( 141)					_hx_tmp = false;
+HXLINE( 175)					_hx_tmp = false;
             				}
-HXDLIN( 141)				if (_hx_tmp) {
-HXLINE( 142)					::String _hx_tmp1 = child->getText();
-HXDLIN( 142)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,_hx_tmp1,null(),null(),null(),null(),( (::String)(::Reflect_obj::field(child->attr,HX_("type",ba,f2,08,4d))) )));
+HXDLIN( 175)				if (_hx_tmp) {
+HXLINE( 176)					::String _hx_tmp1 = child->getText();
+HXDLIN( 176)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,_hx_tmp1,null(),null(),null(),null(),( (::String)(::Reflect_obj::field(child->attr,HX_("type",ba,f2,08,4d))) )));
             				}
-HXLINE( 144)				bool _hx_tmp2;
-HXDLIN( 144)				bool _hx_tmp3;
-HXDLIN( 144)				if (!(hasLayout)) {
-HXLINE( 144)					_hx_tmp3 = (child->name == HX_("field",ba,94,93,00));
+HXLINE( 178)				bool _hx_tmp2;
+HXDLIN( 178)				bool _hx_tmp3;
+HXDLIN( 178)				if (!(hasLayout)) {
+HXLINE( 178)					_hx_tmp3 = (child->name == HX_("field",ba,94,93,00));
             				}
             				else {
-HXLINE( 144)					_hx_tmp3 = false;
+HXLINE( 178)					_hx_tmp3 = false;
             				}
-HXDLIN( 144)				if (_hx_tmp3) {
-HXLINE( 144)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
-HXLINE( 144)						_hx_tmp2 = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("jabber:x:data",c2,e1,e9,7c));
+HXDLIN( 178)				if (_hx_tmp3) {
+HXLINE( 178)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
+HXLINE( 178)						_hx_tmp2 = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("jabber:x:data",c2,e1,e9,7c));
             					}
             					else {
-HXLINE( 144)						_hx_tmp2 = true;
+HXLINE( 178)						_hx_tmp2 = true;
             					}
             				}
             				else {
-HXLINE( 144)					_hx_tmp2 = false;
+HXLINE( 178)					_hx_tmp2 = false;
             				}
-HXDLIN( 144)				if (_hx_tmp2) {
-HXLINE( 145)					 ::borogove::Stanza fld = child;
-HXLINE( 146)					bool _hx_tmp4;
-HXDLIN( 146)					::String attr = ( (::String)(::Reflect_obj::field(fld->attr,HX_("type",ba,f2,08,4d))) );
-HXDLIN( 146)					::String _hx_tmp5;
-HXDLIN( 146)					if ((attr == HX_("jid-single",50,8e,f5,83))) {
-HXLINE( 146)						_hx_tmp5 = HX_("text-single",68,19,96,16);
+HXDLIN( 178)				if (_hx_tmp2) {
+HXLINE( 179)					 ::borogove::Stanza fld = child;
+HXLINE( 180)					bool _hx_tmp4;
+HXDLIN( 180)					::String attr = ( (::String)(::Reflect_obj::field(fld->attr,HX_("type",ba,f2,08,4d))) );
+HXDLIN( 180)					::String _hx_tmp5;
+HXDLIN( 180)					if ((attr == HX_("jid-single",50,8e,f5,83))) {
+HXLINE( 180)						_hx_tmp5 = HX_("text-single",68,19,96,16);
             					}
             					else {
-HXLINE( 146)						if ((attr == HX_("jid-multi",b1,73,6d,1a))) {
-HXLINE( 146)							_hx_tmp5 = HX_("text-multi",99,d3,c0,10);
+HXLINE( 180)						if ((attr == HX_("jid-multi",b1,73,6d,1a))) {
+HXLINE( 180)							_hx_tmp5 = HX_("text-multi",99,d3,c0,10);
             						}
             						else {
-HXLINE( 146)							_hx_tmp5 = attr;
+HXLINE( 180)							_hx_tmp5 = attr;
             						}
             					}
-HXDLIN( 146)					if ((_hx_tmp5 == HX_("fixed",74,f9,a1,00))) {
-HXLINE( 146)						_hx_tmp4 = ::hx::IsNull( ( (::String)(::Reflect_obj::field(fld->attr,HX_("label",f4,0d,af,6f))) ) );
+HXDLIN( 180)					if ((_hx_tmp5 == HX_("fixed",74,f9,a1,00))) {
+HXLINE( 180)						_hx_tmp4 = ::hx::IsNull( ( (::String)(::Reflect_obj::field(fld->attr,HX_("label",f4,0d,af,6f))) ) );
             					}
             					else {
-HXLINE( 146)						_hx_tmp4 = false;
+HXLINE( 180)						_hx_tmp4 = false;
             					}
-HXDLIN( 146)					if (_hx_tmp4) {
-HXLINE( 147)						int _g2 = 0;
-HXDLIN( 147)						::Array< ::String > _g3 = ::borogove::_DataForm::Field_Impl__obj::get_value(fld);
-HXDLIN( 147)						while((_g2 < _g3->length)){
-HXLINE( 147)							::String v = _g3->__get(_g2);
-HXDLIN( 147)							_g2 = (_g2 + 1);
-HXLINE( 148)							items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,v,null(),null(),null(),null(),null()));
+HXDLIN( 180)					if (_hx_tmp4) {
+HXLINE( 181)						int _g2 = 0;
+HXDLIN( 181)						::Array< ::String > _g3 = ::borogove::_DataForm::Field_Impl__obj::get_value(fld);
+HXDLIN( 181)						while((_g2 < _g3->length)){
+HXLINE( 181)							::String v = _g3->__get(_g2);
+HXDLIN( 181)							_g2 = (_g2 + 1);
+HXLINE( 182)							items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,v,null(),null(),null(),null(),null()));
             						}
             					}
             					else {
-HXLINE( 150)						::String attr1 = ( (::String)(::Reflect_obj::field(fld->attr,HX_("type",ba,f2,08,4d))) );
-HXDLIN( 150)						::String _hx_tmp6;
-HXDLIN( 150)						if ((attr1 == HX_("jid-single",50,8e,f5,83))) {
-HXLINE( 150)							_hx_tmp6 = HX_("text-single",68,19,96,16);
+HXLINE( 184)						::String attr1 = ( (::String)(::Reflect_obj::field(fld->attr,HX_("type",ba,f2,08,4d))) );
+HXDLIN( 184)						::String _hx_tmp6;
+HXDLIN( 184)						if ((attr1 == HX_("jid-single",50,8e,f5,83))) {
+HXLINE( 184)							_hx_tmp6 = HX_("text-single",68,19,96,16);
             						}
             						else {
-HXLINE( 150)							if ((attr1 == HX_("jid-multi",b1,73,6d,1a))) {
-HXLINE( 150)								_hx_tmp6 = HX_("text-multi",99,d3,c0,10);
+HXLINE( 184)							if ((attr1 == HX_("jid-multi",b1,73,6d,1a))) {
+HXLINE( 184)								_hx_tmp6 = HX_("text-multi",99,d3,c0,10);
             							}
             							else {
-HXLINE( 150)								_hx_tmp6 = attr1;
+HXLINE( 184)								_hx_tmp6 = attr1;
             							}
             						}
-HXDLIN( 150)						if ((_hx_tmp6 != HX_("hidden",6a,ff,95,4c))) {
-HXLINE( 151)							 ::borogove::FormField _hx_tmp7;
-HXDLIN( 151)							if (::hx::IsNull( fld )) {
-HXLINE( 151)								_hx_tmp7 = null();
+HXDLIN( 184)						if ((_hx_tmp6 != HX_("hidden",6a,ff,95,4c))) {
+HXLINE( 185)							 ::borogove::FormField _hx_tmp7;
+HXDLIN( 185)							if (::hx::IsNull( fld )) {
+HXLINE( 185)								_hx_tmp7 = null();
             							}
             							else {
-HXLINE( 151)								_hx_tmp7 =  ::borogove::FormField_obj::__alloc( HX_CTX ,fld);
+HXLINE( 185)								_hx_tmp7 =  ::borogove::FormField_obj::__alloc( HX_CTX ,fld);
             							}
-HXDLIN( 151)							items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,null(),_hx_tmp7,null(),null(),null(),null()));
+HXDLIN( 185)							items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,null(),_hx_tmp7,null(),null(),null(),null()));
             						}
             					}
             				}
-HXLINE( 154)				bool _hx_tmp8;
-HXDLIN( 154)				bool _hx_tmp9;
-HXDLIN( 154)				if (!(hasLayout)) {
-HXLINE( 154)					_hx_tmp9 = (child->name == HX_("reported",13,2a,94,dd));
+HXLINE( 188)				bool _hx_tmp8;
+HXDLIN( 188)				bool _hx_tmp9;
+HXDLIN( 188)				if (!(hasLayout)) {
+HXLINE( 188)					_hx_tmp9 = (child->name == HX_("reported",13,2a,94,dd));
             				}
             				else {
-HXLINE( 154)					_hx_tmp9 = false;
+HXLINE( 188)					_hx_tmp9 = false;
             				}
-HXDLIN( 154)				if (_hx_tmp9) {
-HXLINE( 154)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
-HXLINE( 154)						_hx_tmp8 = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("jabber:x:data",c2,e1,e9,7c));
+HXDLIN( 188)				if (_hx_tmp9) {
+HXLINE( 188)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
+HXLINE( 188)						_hx_tmp8 = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("jabber:x:data",c2,e1,e9,7c));
             					}
             					else {
-HXLINE( 154)						_hx_tmp8 = true;
+HXLINE( 188)						_hx_tmp8 = true;
             					}
             				}
             				else {
-HXLINE( 154)					_hx_tmp8 = false;
+HXLINE( 188)					_hx_tmp8 = false;
             				}
-HXDLIN( 154)				if (_hx_tmp8) {
-HXLINE( 157)					 ::borogove::Stanza tmp = this->form->getChild(HX_("reported",13,2a,94,dd),null());
-HXDLIN( 157)					::Array< ::Dynamic> tmp1;
-HXDLIN( 157)					if (::hx::IsNotNull( tmp )) {
-HXLINE( 157)						tmp1 = tmp->allTags(HX_("field",ba,94,93,00),null());
+HXDLIN( 188)				if (_hx_tmp8) {
+HXLINE( 191)					 ::borogove::Stanza tmp = this->form->getChild(HX_("reported",13,2a,94,dd),null());
+HXDLIN( 191)					::Array< ::Dynamic> tmp1;
+HXDLIN( 191)					if (::hx::IsNotNull( tmp )) {
+HXLINE( 191)						tmp1 = tmp->allTags(HX_("field",ba,94,93,00),null());
             					}
             					else {
-HXLINE( 157)						tmp1 = null();
+HXLINE( 191)						tmp1 = null();
             					}
-HXDLIN( 157)					::Array< ::Dynamic> _hx_tmp10;
-HXDLIN( 157)					if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 157)						::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(tmp1->length);
-HXDLIN( 157)						{
-HXLINE( 157)							int _g4 = 0;
-HXDLIN( 157)							int _g5 = tmp1->length;
-HXDLIN( 157)							while((_g4 < _g5)){
-HXLINE( 157)								_g4 = (_g4 + 1);
-HXDLIN( 157)								int i = (_g4 - 1);
-HXDLIN( 157)								{
-HXLINE( 157)									 ::borogove::Stanza f = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(tmp1,i)) );
-HXDLIN( 157)									 ::borogove::FormField inValue;
-HXDLIN( 157)									if (::hx::IsNull( f )) {
-HXLINE( 157)										inValue = null();
+HXDLIN( 191)					::Array< ::Dynamic> _hx_tmp10;
+HXDLIN( 191)					if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 191)						::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(tmp1->length);
+HXDLIN( 191)						{
+HXLINE( 191)							int _g4 = 0;
+HXDLIN( 191)							int _g5 = tmp1->length;
+HXDLIN( 191)							while((_g4 < _g5)){
+HXLINE( 191)								_g4 = (_g4 + 1);
+HXDLIN( 191)								int i = (_g4 - 1);
+HXDLIN( 191)								{
+HXLINE( 191)									 ::borogove::Stanza f = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(tmp1,i)) );
+HXDLIN( 191)									 ::borogove::FormField inValue;
+HXDLIN( 191)									if (::hx::IsNull( f )) {
+HXLINE( 191)										inValue = null();
             									}
             									else {
-HXLINE( 157)										inValue =  ::borogove::FormField_obj::__alloc( HX_CTX ,f);
+HXLINE( 191)										inValue =  ::borogove::FormField_obj::__alloc( HX_CTX ,f);
             									}
-HXDLIN( 157)									result->__unsafe_set(i,inValue);
+HXDLIN( 191)									result->__unsafe_set(i,inValue);
             								}
             							}
             						}
-HXDLIN( 157)						_hx_tmp10 = result;
+HXDLIN( 191)						_hx_tmp10 = result;
             					}
             					else {
-HXLINE( 157)						_hx_tmp10 = null();
+HXLINE( 191)						_hx_tmp10 = null();
             					}
-HXLINE( 158)					::Array< ::Dynamic> tmp2 = this->form->allTags(HX_("item",13,c5,bf,45),null());
-HXDLIN( 158)					::Array< ::Dynamic> tmp3;
-HXDLIN( 158)					if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 158)						::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new(tmp2->length);
-HXDLIN( 158)						{
-HXLINE( 158)							int _g6 = 0;
-HXDLIN( 158)							int _g7 = tmp2->length;
-HXDLIN( 158)							while((_g6 < _g7)){
-HXLINE( 158)								_g6 = (_g6 + 1);
-HXDLIN( 158)								int i1 = (_g6 - 1);
-HXDLIN( 158)								{
-HXLINE( 158)									::Array< ::Dynamic> inValue1 = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(tmp2,i1)) )->allTags(HX_("field",ba,94,93,00),null());
-HXDLIN( 158)									result1->__unsafe_set(i1,inValue1);
+HXLINE( 192)					::Array< ::Dynamic> tmp2 = this->form->allTags(HX_("item",13,c5,bf,45),null());
+HXDLIN( 192)					::Array< ::Dynamic> tmp3;
+HXDLIN( 192)					if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 192)						::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new(tmp2->length);
+HXDLIN( 192)						{
+HXLINE( 192)							int _g6 = 0;
+HXDLIN( 192)							int _g7 = tmp2->length;
+HXDLIN( 192)							while((_g6 < _g7)){
+HXLINE( 192)								_g6 = (_g6 + 1);
+HXDLIN( 192)								int i1 = (_g6 - 1);
+HXDLIN( 192)								{
+HXLINE( 192)									::Array< ::Dynamic> inValue1 = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(tmp2,i1)) )->allTags(HX_("field",ba,94,93,00),null());
+HXDLIN( 192)									result1->__unsafe_set(i1,inValue1);
             								}
             							}
             						}
-HXDLIN( 158)						tmp3 = result1;
+HXDLIN( 192)						tmp3 = result1;
             					}
             					else {
-HXLINE( 158)						tmp3 = null();
+HXLINE( 192)						tmp3 = null();
             					}
-HXDLIN( 158)					::Array< ::Dynamic> tmp4;
-HXDLIN( 158)					if (::hx::IsNotNull( tmp3 )) {
-HXLINE( 158)						::Array< ::Dynamic> result2 = ::Array_obj< ::Dynamic>::__new(tmp3->length);
-HXDLIN( 158)						{
-HXLINE( 158)							int _g8 = 0;
-HXDLIN( 158)							int _g9 = tmp3->length;
-HXDLIN( 158)							while((_g8 < _g9)){
-HXLINE( 158)								_g8 = (_g8 + 1);
-HXDLIN( 158)								int i2 = (_g8 - 1);
-HXDLIN( 158)								{
-HXLINE( 158)									::Array< ::Dynamic> row = ( (::Array< ::Dynamic>)(_hx_array_unsafe_get(tmp3,i2)) );
-HXDLIN( 158)									::Array< ::Dynamic> result3 = ::Array_obj< ::Dynamic>::__new(row->length);
-HXDLIN( 158)									{
-HXLINE( 158)										int _g10 = 0;
-HXDLIN( 158)										int _g11 = row->length;
-HXDLIN( 158)										while((_g10 < _g11)){
-HXLINE( 158)											_g10 = (_g10 + 1);
-HXDLIN( 158)											int i3 = (_g10 - 1);
-HXDLIN( 158)											{
-HXLINE( 158)												 ::borogove::Stanza f1 = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(row,i3)) );
-HXDLIN( 158)												 ::borogove::FormField inValue2;
-HXDLIN( 158)												if (::hx::IsNull( f1 )) {
-HXLINE( 158)													inValue2 = null();
+HXDLIN( 192)					::Array< ::Dynamic> tmp4;
+HXDLIN( 192)					if (::hx::IsNotNull( tmp3 )) {
+HXLINE( 192)						::Array< ::Dynamic> result2 = ::Array_obj< ::Dynamic>::__new(tmp3->length);
+HXDLIN( 192)						{
+HXLINE( 192)							int _g8 = 0;
+HXDLIN( 192)							int _g9 = tmp3->length;
+HXDLIN( 192)							while((_g8 < _g9)){
+HXLINE( 192)								_g8 = (_g8 + 1);
+HXDLIN( 192)								int i2 = (_g8 - 1);
+HXDLIN( 192)								{
+HXLINE( 192)									::Array< ::Dynamic> row = ( (::Array< ::Dynamic>)(_hx_array_unsafe_get(tmp3,i2)) );
+HXDLIN( 192)									::Array< ::Dynamic> result3 = ::Array_obj< ::Dynamic>::__new(row->length);
+HXDLIN( 192)									{
+HXLINE( 192)										int _g10 = 0;
+HXDLIN( 192)										int _g11 = row->length;
+HXDLIN( 192)										while((_g10 < _g11)){
+HXLINE( 192)											_g10 = (_g10 + 1);
+HXDLIN( 192)											int i3 = (_g10 - 1);
+HXDLIN( 192)											{
+HXLINE( 192)												 ::borogove::Stanza f1 = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(row,i3)) );
+HXDLIN( 192)												 ::borogove::FormField inValue2;
+HXDLIN( 192)												if (::hx::IsNull( f1 )) {
+HXLINE( 192)													inValue2 = null();
             												}
             												else {
-HXLINE( 158)													inValue2 =  ::borogove::FormField_obj::__alloc( HX_CTX ,f1);
+HXLINE( 192)													inValue2 =  ::borogove::FormField_obj::__alloc( HX_CTX ,f1);
             												}
-HXDLIN( 158)												result3->__unsafe_set(i3,inValue2);
+HXDLIN( 192)												result3->__unsafe_set(i3,inValue2);
             											}
             										}
             									}
-HXDLIN( 158)									result2->__unsafe_set(i2,result3);
+HXDLIN( 192)									result2->__unsafe_set(i2,result3);
             								}
             							}
             						}
-HXDLIN( 158)						tmp4 = result2;
+HXDLIN( 192)						tmp4 = result2;
             					}
             					else {
-HXLINE( 158)						tmp4 = null();
+HXLINE( 192)						tmp4 = null();
             					}
-HXDLIN( 158)					::Array< ::Dynamic> _hx_tmp11;
-HXDLIN( 158)					if (::hx::IsNotNull( tmp4 )) {
-HXLINE( 158)						_hx_tmp11 = tmp4;
+HXDLIN( 192)					::Array< ::Dynamic> _hx_tmp11;
+HXDLIN( 192)					if (::hx::IsNotNull( tmp4 )) {
+HXLINE( 192)						_hx_tmp11 = tmp4;
             					}
             					else {
-HXLINE( 158)						_hx_tmp11 = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 192)						_hx_tmp11 = ::Array_obj< ::Dynamic>::__new(0);
             					}
-HXLINE( 155)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,null(),null(),null(),_hx_tmp10,_hx_tmp11,null()));
+HXLINE( 189)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,null(),null(),null(),_hx_tmp10,_hx_tmp11,null()));
             				}
-HXLINE( 161)				bool _hx_tmp12;
-HXDLIN( 161)				if ((child->name == HX_("page",4f,da,51,4a))) {
-HXLINE( 161)					_hx_tmp12 = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xdata-layout",a9,5c,62,a8));
+HXLINE( 195)				bool _hx_tmp12;
+HXDLIN( 195)				if ((child->name == HX_("page",4f,da,51,4a))) {
+HXLINE( 195)					_hx_tmp12 = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xdata-layout",a9,5c,62,a8));
             				}
             				else {
-HXLINE( 161)					_hx_tmp12 = false;
+HXLINE( 195)					_hx_tmp12 = false;
             				}
-HXDLIN( 161)				if (_hx_tmp12) {
-HXLINE( 162)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,null(),null(), ::borogove::FormLayoutSection_obj::__alloc( HX_CTX ,this->form,child),null(),null(),null()));
+HXDLIN( 195)				if (_hx_tmp12) {
+HXLINE( 196)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,null(),null(), ::borogove::FormLayoutSection_obj::__alloc( HX_CTX ,this->form,child),null(),null(),null()));
             				}
             			}
             		}
-HXLINE( 166)		return items;
+HXLINE( 200)		return items;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Form_obj,items,return )
 
 size_t Form_obj::items__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_6b9e5fdea75c39d7_335_items__fromC)
-HXDLIN( 335)		::Array< ::Dynamic> out = this->items();
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g = 0;
-HXDLIN( 335)				while((_g < out->length)){
-HXDLIN( 335)					 ::borogove::FormItem el = out->__get(_g).StaticCast<  ::borogove::FormItem >();
-HXDLIN( 335)					_g = (_g + 1);
-HXDLIN( 335)					{
-HXDLIN( 335)						 ::Dynamic haxeObject = el;
-HXDLIN( 335)						void* ptr = haxeObject.mPtr;
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXDLIN( 335)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)out->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXDLIN( 335)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),out));
-HXDLIN( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_6b9e5fdea75c39d7_363_items__fromC)
+HXDLIN( 363)		::Array< ::Dynamic> out = this->items();
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
  ::borogove::Stanza Form_obj::submit( ::borogove::FormSubmitBuilder data){
-            	HX_STACKFRAME(&_hx_pos_d5f5e869927de4ab_220_submit)
-HXDLIN( 220)		return data->submit(this->form);
+            	HX_STACKFRAME(&_hx_pos_d5f5e869927de4ab_260_submit)
+HXDLIN( 260)		return data->submit(this->form);
             	}
 
 
@@ -570,8 +526,8 @@ void Form_obj::__register()
 void Form_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_d5f5e869927de4ab_97_boot)
-HXDLIN(  97)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_d5f5e869927de4ab_131_boot)
+HXDLIN( 131)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("items",00,ac,0c,c2), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
diff --git a/Sources/c_borogove/src/borogove/FormField.cpp b/Sources/c_borogove/src/borogove/FormField.cpp
index 828b1d0..3fd645d 100644
--- a/Sources/c_borogove/src/borogove/FormField.cpp
+++ b/Sources/c_borogove/src/borogove/FormField.cpp
@@ -4,8 +4,11 @@
 #ifndef INCLUDED_Reflect
 #include <Reflect.h>
 #endif
-#ifndef INCLUDED__HaxeCBridge_Internal
-#include <_HaxeCBridge/Internal.h>
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_HaxeStringArray_Impl_
+#include <_HaxeCBridge/HaxeStringArray_Impl_.h>
 #endif
 #ifndef INCLUDED_borogove_FormField
 #include <borogove/FormField.h>
@@ -19,145 +22,139 @@
 #ifndef INCLUDED_borogove__DataForm_Field_Impl_
 #include <borogove/_DataForm/Field_Impl_.h>
 #endif
-#ifndef INCLUDED_cpp_Int64Map
-#include <cpp/Int64Map.h>
-#endif
-#ifndef INCLUDED_haxe_IMap
-#include <haxe/IMap.h>
-#endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_088c849e9db23a84_192_new,"borogove.FormField","new",0x7db9c29b,"borogove.FormField.new","borogove/DataForm.hx",192,0x710703a2)
-HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_450_name__fromC,"borogove.FormField","name__fromC",0xcbb1d2c9,"borogove.FormField.name__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_450_label__fromC,"borogove.FormField","label__fromC",0xdd73376a,"borogove.FormField.label__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_450_desc__fromC,"borogove.FormField","desc__fromC",0x436f1383,"borogove.FormField.desc__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_424_value__fromC,"borogove.FormField","value__fromC",0x908b9f8d,"borogove.FormField.value__fromC","HaxeCBridge.hx",424,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_450_required__fromC,"borogove.FormField","required__fromC",0x060c37b5,"borogove.FormField.required__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_450_type__fromC,"borogove.FormField","type__fromC",0x50b7ce3a,"borogove.FormField.type__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_450_datatype__fromC,"borogove.FormField","datatype__fromC",0x990aedd0,"borogove.FormField.datatype__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_424_options__fromC,"borogove.FormField","options__fromC",0xb96a1680,"borogove.FormField.options__fromC","HaxeCBridge.hx",424,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_450_open__fromC,"borogove.FormField","open__fromC",0xfc27ff2a,"borogove.FormField.open__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_450_rangeMin__fromC,"borogove.FormField","rangeMin__fromC",0x4b1e8bff,"borogove.FormField.rangeMin__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_450_rangeMax__fromC,"borogove.FormField","rangeMax__fromC",0xef8bb92d,"borogove.FormField.rangeMax__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_450_regex__fromC,"borogove.FormField","regex__fromC",0xdb3b26f7,"borogove.FormField.regex__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_088c849e9db23a84_177_boot,"borogove.FormField","boot",0x7ce98597,"borogove.FormField.boot","borogove/DataForm.hx",177,0x710703a2)
+HX_DEFINE_STACK_FRAME(_hx_pos_088c849e9db23a84_195_new,"borogove.FormField","new",0x7db9c29b,"borogove.FormField.new","borogove/DataForm.hx",195,0x710703a2)
+HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_478_name__fromC,"borogove.FormField","name__fromC",0xcbb1d2c9,"borogove.FormField.name__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_478_label__fromC,"borogove.FormField","label__fromC",0xdd73376a,"borogove.FormField.label__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_478_desc__fromC,"borogove.FormField","desc__fromC",0x436f1383,"borogove.FormField.desc__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_452_value__fromC,"borogove.FormField","value__fromC",0x908b9f8d,"borogove.FormField.value__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_478_required__fromC,"borogove.FormField","required__fromC",0x060c37b5,"borogove.FormField.required__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_478_type__fromC,"borogove.FormField","type__fromC",0x50b7ce3a,"borogove.FormField.type__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_478_datatype__fromC,"borogove.FormField","datatype__fromC",0x990aedd0,"borogove.FormField.datatype__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_452_options__fromC,"borogove.FormField","options__fromC",0xb96a1680,"borogove.FormField.options__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_478_open__fromC,"borogove.FormField","open__fromC",0xfc27ff2a,"borogove.FormField.open__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_478_rangeMin__fromC,"borogove.FormField","rangeMin__fromC",0x4b1e8bff,"borogove.FormField.rangeMin__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_478_rangeMax__fromC,"borogove.FormField","rangeMax__fromC",0xef8bb92d,"borogove.FormField.rangeMax__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8debe23b4b6754d6_478_regex__fromC,"borogove.FormField","regex__fromC",0xdb3b26f7,"borogove.FormField.regex__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_088c849e9db23a84_180_boot,"borogove.FormField","boot",0x7ce98597,"borogove.FormField.boot","borogove/DataForm.hx",180,0x710703a2)
 namespace borogove{
 
 void FormField_obj::__construct( ::borogove::Stanza field){
-            	HX_STACKFRAME(&_hx_pos_088c849e9db23a84_192_new)
-HXLINE( 193)		::String tmp = ( (::String)(::Reflect_obj::field(field->attr,HX_("var",e7,de,59,00))) );
-HXDLIN( 193)		::String _hx_tmp;
-HXDLIN( 193)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 193)			_hx_tmp = tmp;
+            	HX_STACKFRAME(&_hx_pos_088c849e9db23a84_195_new)
+HXLINE( 196)		::String tmp = ( (::String)(::Reflect_obj::field(field->attr,HX_("var",e7,de,59,00))) );
+HXDLIN( 196)		::String _hx_tmp;
+HXDLIN( 196)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 196)			_hx_tmp = tmp;
             		}
             		else {
-HXLINE( 193)			_hx_tmp = HX_("",00,00,00,00);
+HXLINE( 196)			_hx_tmp = HX_("",00,00,00,00);
             		}
-HXDLIN( 193)		this->name = _hx_tmp;
-HXLINE( 194)		this->label = ( (::String)(::Reflect_obj::field(field->attr,HX_("label",f4,0d,af,6f))) );
-HXLINE( 195)		this->desc = field->getChildText(HX_("desc",51,5e,66,42),null());
-HXLINE( 196)		this->value = ::borogove::_DataForm::Field_Impl__obj::get_value(field);
-HXLINE( 197)		this->required = ::hx::IsNotNull( field->getChild(HX_("required",5f,91,62,b2),null()) );
-HXLINE( 198)		::String attr = ( (::String)(::Reflect_obj::field(field->attr,HX_("type",ba,f2,08,4d))) );
-HXDLIN( 198)		::String _hx_tmp1;
-HXDLIN( 198)		if ((attr == HX_("jid-single",50,8e,f5,83))) {
-HXLINE( 198)			_hx_tmp1 = HX_("text-single",68,19,96,16);
+HXDLIN( 196)		this->name = _hx_tmp;
+HXLINE( 197)		this->label = ( (::String)(::Reflect_obj::field(field->attr,HX_("label",f4,0d,af,6f))) );
+HXLINE( 198)		this->desc = field->getChildText(HX_("desc",51,5e,66,42),null());
+HXLINE( 199)		this->value = ::borogove::_DataForm::Field_Impl__obj::get_value(field);
+HXLINE( 200)		this->required = ::hx::IsNotNull( field->getChild(HX_("required",5f,91,62,b2),null()) );
+HXLINE( 201)		::String attr = ( (::String)(::Reflect_obj::field(field->attr,HX_("type",ba,f2,08,4d))) );
+HXDLIN( 201)		::String _hx_tmp1;
+HXDLIN( 201)		if ((attr == HX_("jid-single",50,8e,f5,83))) {
+HXLINE( 201)			_hx_tmp1 = HX_("text-single",68,19,96,16);
             		}
             		else {
-HXLINE( 198)			if ((attr == HX_("jid-multi",b1,73,6d,1a))) {
-HXLINE( 198)				_hx_tmp1 = HX_("text-multi",99,d3,c0,10);
+HXLINE( 201)			if ((attr == HX_("jid-multi",b1,73,6d,1a))) {
+HXLINE( 201)				_hx_tmp1 = HX_("text-multi",99,d3,c0,10);
             			}
             			else {
-HXLINE( 198)				_hx_tmp1 = attr;
+HXLINE( 201)				_hx_tmp1 = attr;
             			}
             		}
-HXDLIN( 198)		this->type = _hx_tmp1;
-HXLINE( 199)		this->datatype = ::borogove::_DataForm::Field_Impl__obj::get_datatype(field);
-HXLINE( 200)		::Array< ::Dynamic> _this = ::borogove::_DataForm::Field_Impl__obj::get_options(field);
-HXDLIN( 200)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_this->length);
-HXDLIN( 200)		{
-HXLINE( 200)			int _g = 0;
-HXDLIN( 200)			int _g1 = _this->length;
-HXDLIN( 200)			while((_g < _g1)){
-HXLINE( 200)				_g = (_g + 1);
-HXDLIN( 200)				int i = (_g - 1);
-HXDLIN( 200)				{
-HXLINE( 200)					 ::borogove::Stanza o = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) );
-HXDLIN( 200)					 ::borogove::FormOption inValue;
-HXDLIN( 200)					if (::hx::IsNull( o )) {
-HXLINE( 200)						inValue = null();
+HXDLIN( 201)		this->type = _hx_tmp1;
+HXLINE( 202)		this->datatype = ::borogove::_DataForm::Field_Impl__obj::get_datatype(field);
+HXLINE( 203)		::Array< ::Dynamic> _this = ::borogove::_DataForm::Field_Impl__obj::get_options(field);
+HXDLIN( 203)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_this->length);
+HXDLIN( 203)		{
+HXLINE( 203)			int _g = 0;
+HXDLIN( 203)			int _g1 = _this->length;
+HXDLIN( 203)			while((_g < _g1)){
+HXLINE( 203)				_g = (_g + 1);
+HXDLIN( 203)				int i = (_g - 1);
+HXDLIN( 203)				{
+HXLINE( 203)					 ::borogove::Stanza o = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) );
+HXDLIN( 203)					 ::borogove::FormOption inValue;
+HXDLIN( 203)					if (::hx::IsNull( o )) {
+HXLINE( 203)						inValue = null();
             					}
             					else {
-HXLINE( 200)						inValue = ::borogove::FormOption_obj::fromOption(o);
+HXLINE( 203)						inValue = ::borogove::FormOption_obj::fromOption(o);
             					}
-HXDLIN( 200)					result->__unsafe_set(i,inValue);
+HXDLIN( 203)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN( 200)		this->options = result;
-HXLINE( 201)		 ::borogove::Stanza validate = field->getChild(HX_("validate",96,d0,e3,04),HX_("http://jabber.org/protocol/xdata-validate",55,3c,d4,d4));
-HXDLIN( 201)		 ::borogove::Stanza _hx_tmp2;
-HXDLIN( 201)		if (::hx::IsNotNull( validate )) {
-HXLINE( 201)			_hx_tmp2 = validate->getChild(HX_("open",ca,03,b4,49),null());
+HXDLIN( 203)		this->options = result;
+HXLINE( 204)		 ::borogove::Stanza validate = field->getChild(HX_("validate",96,d0,e3,04),HX_("http://jabber.org/protocol/xdata-validate",55,3c,d4,d4));
+HXDLIN( 204)		 ::borogove::Stanza _hx_tmp2;
+HXDLIN( 204)		if (::hx::IsNotNull( validate )) {
+HXLINE( 204)			_hx_tmp2 = validate->getChild(HX_("open",ca,03,b4,49),null());
             		}
             		else {
-HXLINE( 201)			_hx_tmp2 = null();
+HXLINE( 204)			_hx_tmp2 = null();
             		}
-HXDLIN( 201)		this->open = ::hx::IsNotNull( _hx_tmp2 );
-HXLINE( 202)		 ::borogove::Stanza validate1 = field->getChild(HX_("validate",96,d0,e3,04),HX_("http://jabber.org/protocol/xdata-validate",55,3c,d4,d4));
-HXDLIN( 202)		 ::borogove::Stanza tmp1;
-HXDLIN( 202)		if (::hx::IsNotNull( validate1 )) {
-HXLINE( 202)			tmp1 = validate1->getChild(HX_("range",bd,a5,1f,e4),null());
+HXDLIN( 204)		this->open = ::hx::IsNotNull( _hx_tmp2 );
+HXLINE( 205)		 ::borogove::Stanza validate1 = field->getChild(HX_("validate",96,d0,e3,04),HX_("http://jabber.org/protocol/xdata-validate",55,3c,d4,d4));
+HXDLIN( 205)		 ::borogove::Stanza tmp1;
+HXDLIN( 205)		if (::hx::IsNotNull( validate1 )) {
+HXLINE( 205)			tmp1 = validate1->getChild(HX_("range",bd,a5,1f,e4),null());
             		}
             		else {
-HXLINE( 202)			tmp1 = null();
+HXLINE( 205)			tmp1 = null();
             		}
-HXDLIN( 202)		 ::Dynamic tmp2;
-HXDLIN( 202)		if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 202)			tmp2 = tmp1->attr;
+HXDLIN( 205)		 ::Dynamic tmp2;
+HXDLIN( 205)		if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 205)			tmp2 = tmp1->attr;
             		}
             		else {
-HXLINE( 202)			tmp2 = null();
+HXLINE( 205)			tmp2 = null();
             		}
-HXDLIN( 202)		::String _hx_tmp3;
-HXDLIN( 202)		if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 202)			_hx_tmp3 = ( (::String)(::Reflect_obj::field(tmp2,HX_("min",92,11,53,00))) );
+HXDLIN( 205)		::String _hx_tmp3;
+HXDLIN( 205)		if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 205)			_hx_tmp3 = ( (::String)(::Reflect_obj::field(tmp2,HX_("min",92,11,53,00))) );
             		}
             		else {
-HXLINE( 202)			_hx_tmp3 = null();
+HXLINE( 205)			_hx_tmp3 = null();
             		}
-HXDLIN( 202)		this->rangeMin = _hx_tmp3;
-HXLINE( 203)		 ::borogove::Stanza validate2 = field->getChild(HX_("validate",96,d0,e3,04),HX_("http://jabber.org/protocol/xdata-validate",55,3c,d4,d4));
-HXDLIN( 203)		 ::borogove::Stanza tmp3;
-HXDLIN( 203)		if (::hx::IsNotNull( validate2 )) {
-HXLINE( 203)			tmp3 = validate2->getChild(HX_("range",bd,a5,1f,e4),null());
+HXDLIN( 205)		this->rangeMin = _hx_tmp3;
+HXLINE( 206)		 ::borogove::Stanza validate2 = field->getChild(HX_("validate",96,d0,e3,04),HX_("http://jabber.org/protocol/xdata-validate",55,3c,d4,d4));
+HXDLIN( 206)		 ::borogove::Stanza tmp3;
+HXDLIN( 206)		if (::hx::IsNotNull( validate2 )) {
+HXLINE( 206)			tmp3 = validate2->getChild(HX_("range",bd,a5,1f,e4),null());
             		}
             		else {
-HXLINE( 203)			tmp3 = null();
+HXLINE( 206)			tmp3 = null();
             		}
-HXDLIN( 203)		 ::Dynamic tmp4;
-HXDLIN( 203)		if (::hx::IsNotNull( tmp3 )) {
-HXLINE( 203)			tmp4 = tmp3->attr;
+HXDLIN( 206)		 ::Dynamic tmp4;
+HXDLIN( 206)		if (::hx::IsNotNull( tmp3 )) {
+HXLINE( 206)			tmp4 = tmp3->attr;
             		}
             		else {
-HXLINE( 203)			tmp4 = null();
+HXLINE( 206)			tmp4 = null();
             		}
-HXDLIN( 203)		::String _hx_tmp4;
-HXDLIN( 203)		if (::hx::IsNotNull( tmp4 )) {
-HXLINE( 203)			_hx_tmp4 = ( (::String)(::Reflect_obj::field(tmp4,HX_("max",a4,0a,53,00))) );
+HXDLIN( 206)		::String _hx_tmp4;
+HXDLIN( 206)		if (::hx::IsNotNull( tmp4 )) {
+HXLINE( 206)			_hx_tmp4 = ( (::String)(::Reflect_obj::field(tmp4,HX_("max",a4,0a,53,00))) );
             		}
             		else {
-HXLINE( 203)			_hx_tmp4 = null();
+HXLINE( 206)			_hx_tmp4 = null();
             		}
-HXDLIN( 203)		this->rangeMax = _hx_tmp4;
-HXLINE( 204)		 ::borogove::Stanza validate3 = field->getChild(HX_("validate",96,d0,e3,04),HX_("http://jabber.org/protocol/xdata-validate",55,3c,d4,d4));
-HXDLIN( 204)		::String _hx_tmp5;
-HXDLIN( 204)		if (::hx::IsNotNull( validate3 )) {
-HXLINE( 204)			_hx_tmp5 = validate3->getChildText(HX_("regex",c7,2e,bf,e6),null());
+HXDLIN( 206)		this->rangeMax = _hx_tmp4;
+HXLINE( 207)		 ::borogove::Stanza validate3 = field->getChild(HX_("validate",96,d0,e3,04),HX_("http://jabber.org/protocol/xdata-validate",55,3c,d4,d4));
+HXDLIN( 207)		::String _hx_tmp5;
+HXDLIN( 207)		if (::hx::IsNotNull( validate3 )) {
+HXLINE( 207)			_hx_tmp5 = validate3->getChildText(HX_("regex",c7,2e,bf,e6),null());
             		}
             		else {
-HXLINE( 204)			_hx_tmp5 = null();
+HXLINE( 207)			_hx_tmp5 = null();
             		}
-HXDLIN( 204)		this->regex = _hx_tmp5;
+HXDLIN( 207)		this->regex = _hx_tmp5;
             	}
 
 Dynamic FormField_obj::__CreateEmpty() { return new FormField_obj; }
@@ -176,182 +173,102 @@ bool FormField_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String FormField_obj::name__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_450_name__fromC)
-HXDLIN( 450)		return this->name;
+            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_478_name__fromC)
+HXDLIN( 478)		return this->name;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormField_obj,name__fromC,return )
 
 ::String FormField_obj::label__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_450_label__fromC)
-HXDLIN( 450)		return this->label;
+            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_478_label__fromC)
+HXDLIN( 478)		return this->label;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormField_obj,label__fromC,return )
 
 ::String FormField_obj::desc__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_450_desc__fromC)
-HXDLIN( 450)		return this->desc;
+            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_478_desc__fromC)
+HXDLIN( 478)		return this->desc;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormField_obj,desc__fromC,return )
 
 size_t FormField_obj::value__fromC(const char*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_424_value__fromC)
-HXDLIN( 424)		::Array< ::String > x = this->value;
-HXDLIN( 424)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 424)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 424)			::Array< size_t > arr = ::Array_obj< size_t >::__new(x->length);
-HXDLIN( 424)			{
-HXDLIN( 424)				int _g_current = 0;
-HXDLIN( 424)				::Array< ::String > _g_array = x;
-HXDLIN( 424)				while((_g_current < _g_array->length)){
-HXDLIN( 424)					::String _g_value = _g_array->__get(_g_current);
-HXDLIN( 424)					_g_current = (_g_current + 1);
-HXDLIN( 424)					::String el = _g_value;
-HXDLIN( 424)					{
-HXDLIN( 424)						const char* cStrPtr = el.utf8_str();
-HXDLIN( 424)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 424)						{
-HXDLIN( 424)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 424)							if (::hx::IsNull( store )) {
-HXLINE(2243)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),el));
-HXLINE( 424)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 424)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-HXDLIN( 424)						const char* ptr = cStrPtr;
-HXDLIN( 424)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
-            					}
-            				}
-            			}
-HXDLIN( 424)			void** ptr1 = (void**)arr->getBase();
-HXDLIN( 424)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 424)			{
-HXDLIN( 424)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 424)				if (::hx::IsNull( store1 )) {
-HXLINE(2243)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),arr));
-HXLINE( 424)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 424)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 424)			_hx_tmp->set_ref(( (const char**)(ptr1) ));
+            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_452_value__fromC)
+HXDLIN( 452)		::Array< ::String > x = this->value;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(x));
             		}
-HXDLIN( 424)		return ( (size_t)(x->length) );
+HXDLIN( 452)		return ( (size_t)(x->length) );
             	}
 
 
 bool FormField_obj::required__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_450_required__fromC)
-HXDLIN( 450)		return this->required;
+            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_478_required__fromC)
+HXDLIN( 478)		return this->required;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormField_obj,required__fromC,return )
 
 ::String FormField_obj::type__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_450_type__fromC)
-HXDLIN( 450)		return this->type;
+            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_478_type__fromC)
+HXDLIN( 478)		return this->type;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormField_obj,type__fromC,return )
 
 ::String FormField_obj::datatype__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_450_datatype__fromC)
-HXDLIN( 450)		return this->datatype;
+            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_478_datatype__fromC)
+HXDLIN( 478)		return this->datatype;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormField_obj,datatype__fromC,return )
 
 size_t FormField_obj::options__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_424_options__fromC)
-HXDLIN( 424)		::Array< ::Dynamic> x = this->options;
-HXDLIN( 424)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 424)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 424)			{
-HXDLIN( 424)				int _g = 0;
-HXDLIN( 424)				while((_g < x->length)){
-HXDLIN( 424)					 ::borogove::FormOption el = x->__get(_g).StaticCast<  ::borogove::FormOption >();
-HXDLIN( 424)					_g = (_g + 1);
-HXDLIN( 424)					{
-HXDLIN( 424)						 ::Dynamic haxeObject = el;
-HXDLIN( 424)						void* ptr = haxeObject.mPtr;
-HXDLIN( 424)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 424)						{
-HXDLIN( 424)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 424)							if (::hx::IsNull( store )) {
-HXDLIN( 424)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 424)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 424)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 424)			void** ptr1 = (void**)x->getBase();
-HXDLIN( 424)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 424)			{
-HXDLIN( 424)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 424)				if (::hx::IsNull( store1 )) {
-HXDLIN( 424)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),x));
-HXDLIN( 424)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 424)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 424)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_452_options__fromC)
+HXDLIN( 452)		::Array< ::Dynamic> x = this->options;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(x));
             		}
-HXDLIN( 424)		return ( (size_t)(x->length) );
+HXDLIN( 452)		return ( (size_t)(x->length) );
             	}
 
 
 bool FormField_obj::open__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_450_open__fromC)
-HXDLIN( 450)		return this->open;
+            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_478_open__fromC)
+HXDLIN( 478)		return this->open;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormField_obj,open__fromC,return )
 
 ::String FormField_obj::rangeMin__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_450_rangeMin__fromC)
-HXDLIN( 450)		return this->rangeMin;
+            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_478_rangeMin__fromC)
+HXDLIN( 478)		return this->rangeMin;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormField_obj,rangeMin__fromC,return )
 
 ::String FormField_obj::rangeMax__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_450_rangeMax__fromC)
-HXDLIN( 450)		return this->rangeMax;
+            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_478_rangeMax__fromC)
+HXDLIN( 478)		return this->rangeMax;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormField_obj,rangeMax__fromC,return )
 
 ::String FormField_obj::regex__fromC(){
-            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_450_regex__fromC)
-HXDLIN( 450)		return this->regex;
+            	HX_STACKFRAME(&_hx_pos_8debe23b4b6754d6_478_regex__fromC)
+HXDLIN( 478)		return this->regex;
             	}
 
 
@@ -566,8 +483,8 @@ void FormField_obj::__register()
 void FormField_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_088c849e9db23a84_177_boot)
-HXDLIN( 177)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_088c849e9db23a84_180_boot)
+HXDLIN( 180)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(12)
             				->setFixed(0,HX_("desc__fromC",48,ee,23,86), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
diff --git a/Sources/c_borogove/src/borogove/FormItem.cpp b/Sources/c_borogove/src/borogove/FormItem.cpp
index 2afed99..868a11d 100644
--- a/Sources/c_borogove/src/borogove/FormItem.cpp
+++ b/Sources/c_borogove/src/borogove/FormItem.cpp
@@ -1,8 +1,8 @@
 // Generated by Haxe 4.3.3
 #include <hxcpp.h>
 
-#ifndef INCLUDED__HaxeCBridge_Internal
-#include <_HaxeCBridge/Internal.h>
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
 #endif
 #ifndef INCLUDED_borogove_FormField
 #include <borogove/FormField.h>
@@ -13,30 +13,24 @@
 #ifndef INCLUDED_borogove_FormSection
 #include <borogove/FormSection.h>
 #endif
-#ifndef INCLUDED_cpp_Int64Map
-#include <cpp/Int64Map.h>
-#endif
-#ifndef INCLUDED_haxe_IMap
-#include <haxe/IMap.h>
-#endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_df0b63d1edfec037_34_new,"borogove.FormItem","new",0x6aa3d676,"borogove.FormItem.new","borogove/Form.hx",34,0x25d2f7ac)
-HX_LOCAL_STACK_FRAME(_hx_pos_58fa9de42f050a39_450_text__fromC,"borogove.FormItem","text__fromC",0x82a04f82,"borogove.FormItem.text__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_58fa9de42f050a39_450_field__fromC,"borogove.FormItem","field__fromC",0xc23fce29,"borogove.FormItem.field__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_58fa9de42f050a39_450_section__fromC,"borogove.FormItem","section__fromC",0x5f2446de,"borogove.FormItem.section__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_58fa9de42f050a39_450_status__fromC,"borogove.FormItem","status__fromC",0x5916711d,"borogove.FormItem.status__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_58fa9de42f050a39_424_tableHeader__fromC,"borogove.FormItem","tableHeader__fromC",0x6e16cc48,"borogove.FormItem.tableHeader__fromC","HaxeCBridge.hx",424,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_df0b63d1edfec037_24_boot,"borogove.FormItem","boot",0xdcd0d15c,"borogove.FormItem.boot","borogove/Form.hx",24,0x25d2f7ac)
+HX_DEFINE_STACK_FRAME(_hx_pos_df0b63d1edfec037_58_new,"borogove.FormItem","new",0x6aa3d676,"borogove.FormItem.new","borogove/Form.hx",58,0x25d2f7ac)
+HX_LOCAL_STACK_FRAME(_hx_pos_58fa9de42f050a39_478_text__fromC,"borogove.FormItem","text__fromC",0x82a04f82,"borogove.FormItem.text__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_58fa9de42f050a39_478_field__fromC,"borogove.FormItem","field__fromC",0xc23fce29,"borogove.FormItem.field__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_58fa9de42f050a39_478_section__fromC,"borogove.FormItem","section__fromC",0x5f2446de,"borogove.FormItem.section__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_58fa9de42f050a39_478_status__fromC,"borogove.FormItem","status__fromC",0x5916711d,"borogove.FormItem.status__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_58fa9de42f050a39_452_tableHeader__fromC,"borogove.FormItem","tableHeader__fromC",0x6e16cc48,"borogove.FormItem.tableHeader__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_df0b63d1edfec037_30_boot,"borogove.FormItem","boot",0xdcd0d15c,"borogove.FormItem.boot","borogove/Form.hx",30,0x25d2f7ac)
 namespace borogove{
 
 void FormItem_obj::__construct(::String text, ::borogove::FormField field,::Dynamic section,::Array< ::Dynamic> tableHeader,::Array< ::Dynamic> tableRows,::String status){
-            	HX_STACKFRAME(&_hx_pos_df0b63d1edfec037_34_new)
-HXLINE(  35)		this->text = text;
-HXLINE(  36)		this->field = field;
-HXLINE(  37)		this->section = section;
-HXLINE(  38)		this->tableHeader = tableHeader;
-HXLINE(  39)		this->tableRows = tableRows;
-HXLINE(  40)		this->status = status;
+            	HX_STACKFRAME(&_hx_pos_df0b63d1edfec037_58_new)
+HXLINE(  59)		this->text = text;
+HXLINE(  60)		this->field = field;
+HXLINE(  61)		this->section = section;
+HXLINE(  62)		this->tableHeader = tableHeader;
+HXLINE(  63)		this->tableRows = tableRows;
+HXLINE(  64)		this->status = status;
             	}
 
 Dynamic FormItem_obj::__CreateEmpty() { return new FormItem_obj; }
@@ -55,83 +49,45 @@ bool FormItem_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String FormItem_obj::text__fromC(){
-            	HX_STACKFRAME(&_hx_pos_58fa9de42f050a39_450_text__fromC)
-HXDLIN( 450)		return this->text;
+            	HX_STACKFRAME(&_hx_pos_58fa9de42f050a39_478_text__fromC)
+HXDLIN( 478)		return this->text;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormItem_obj,text__fromC,return )
 
  ::borogove::FormField FormItem_obj::field__fromC(){
-            	HX_STACKFRAME(&_hx_pos_58fa9de42f050a39_450_field__fromC)
-HXDLIN( 450)		return this->field;
+            	HX_STACKFRAME(&_hx_pos_58fa9de42f050a39_478_field__fromC)
+HXDLIN( 478)		return this->field;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormItem_obj,field__fromC,return )
 
 ::Dynamic FormItem_obj::section__fromC(){
-            	HX_STACKFRAME(&_hx_pos_58fa9de42f050a39_450_section__fromC)
-HXDLIN( 450)		return this->section;
+            	HX_STACKFRAME(&_hx_pos_58fa9de42f050a39_478_section__fromC)
+HXDLIN( 478)		return this->section;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormItem_obj,section__fromC,return )
 
 ::String FormItem_obj::status__fromC(){
-            	HX_STACKFRAME(&_hx_pos_58fa9de42f050a39_450_status__fromC)
-HXDLIN( 450)		return this->status;
+            	HX_STACKFRAME(&_hx_pos_58fa9de42f050a39_478_status__fromC)
+HXDLIN( 478)		return this->status;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormItem_obj,status__fromC,return )
 
 size_t FormItem_obj::tableHeader__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_58fa9de42f050a39_424_tableHeader__fromC)
-HXDLIN( 424)		::Array< ::Dynamic> x = this->tableHeader;
-HXDLIN( 424)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 424)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 424)			{
-HXDLIN( 424)				int _g = 0;
-HXDLIN( 424)				while((_g < x->length)){
-HXDLIN( 424)					 ::borogove::FormField el = x->__get(_g).StaticCast<  ::borogove::FormField >();
-HXDLIN( 424)					_g = (_g + 1);
-HXDLIN( 424)					{
-HXDLIN( 424)						 ::Dynamic haxeObject = el;
-HXDLIN( 424)						void* ptr = haxeObject.mPtr;
-HXDLIN( 424)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 424)						{
-HXDLIN( 424)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 424)							if (::hx::IsNull( store )) {
-HXDLIN( 424)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 424)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 424)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 424)			void** ptr1 = (void**)x->getBase();
-HXDLIN( 424)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 424)			{
-HXDLIN( 424)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 424)				if (::hx::IsNull( store1 )) {
-HXDLIN( 424)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),x));
-HXDLIN( 424)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 424)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 424)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_58fa9de42f050a39_452_tableHeader__fromC)
+HXDLIN( 452)		::Array< ::Dynamic> x = this->tableHeader;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(x));
             		}
-HXDLIN( 424)		return ( (size_t)(x->length) );
+HXDLIN( 452)		return ( (size_t)(x->length) );
             	}
 
 
@@ -298,8 +254,8 @@ void FormItem_obj::__register()
 void FormItem_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_df0b63d1edfec037_24_boot)
-HXDLIN(  24)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_df0b63d1edfec037_30_boot)
+HXDLIN(  30)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(6)
             				->setFixed(0,HX_("status__fromC",87,b3,25,a1), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
diff --git a/Sources/c_borogove/src/borogove/FormLayoutSection.cpp b/Sources/c_borogove/src/borogove/FormLayoutSection.cpp
index 36b4843..b94b7a2 100644
--- a/Sources/c_borogove/src/borogove/FormLayoutSection.cpp
+++ b/Sources/c_borogove/src/borogove/FormLayoutSection.cpp
@@ -23,15 +23,15 @@
 #include <borogove/_DataForm/DataForm_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_45e75fb904d6662d_230_new,"borogove.FormLayoutSection","new",0x25c121bc,"borogove.FormLayoutSection.new","borogove/Form.hx",230,0x25d2f7ac)
-HX_LOCAL_STACK_FRAME(_hx_pos_45e75fb904d6662d_236_title,"borogove.FormLayoutSection","title",0x68a475f4,"borogove.FormLayoutSection.title","borogove/Form.hx",236,0x25d2f7ac)
-HX_LOCAL_STACK_FRAME(_hx_pos_45e75fb904d6662d_239_items,"borogove.FormLayoutSection","items",0x1a760c5c,"borogove.FormLayoutSection.items","borogove/Form.hx",239,0x25d2f7ac)
+HX_DEFINE_STACK_FRAME(_hx_pos_45e75fb904d6662d_270_new,"borogove.FormLayoutSection","new",0x25c121bc,"borogove.FormLayoutSection.new","borogove/Form.hx",270,0x25d2f7ac)
+HX_LOCAL_STACK_FRAME(_hx_pos_45e75fb904d6662d_279_title,"borogove.FormLayoutSection","title",0x68a475f4,"borogove.FormLayoutSection.title","borogove/Form.hx",279,0x25d2f7ac)
+HX_LOCAL_STACK_FRAME(_hx_pos_45e75fb904d6662d_285_items,"borogove.FormLayoutSection","items",0x1a760c5c,"borogove.FormLayoutSection.items","borogove/Form.hx",285,0x25d2f7ac)
 namespace borogove{
 
 void FormLayoutSection_obj::__construct( ::borogove::Stanza form, ::borogove::Stanza section){
-            	HX_STACKFRAME(&_hx_pos_45e75fb904d6662d_230_new)
-HXLINE( 231)		this->form = form;
-HXLINE( 232)		this->section = section;
+            	HX_STACKFRAME(&_hx_pos_45e75fb904d6662d_270_new)
+HXLINE( 271)		this->form = form;
+HXLINE( 272)		this->section = section;
             	}
 
 Dynamic FormLayoutSection_obj::__CreateEmpty() { return new FormLayoutSection_obj; }
@@ -66,197 +66,197 @@ void *FormLayoutSection_obj::_hx_getInterface(int inHash) {
 }
 
 ::String FormLayoutSection_obj::title(){
-            	HX_STACKFRAME(&_hx_pos_45e75fb904d6662d_236_title)
-HXDLIN( 236)		return ( (::String)(::Reflect_obj::field(this->section->attr,HX_("label",f4,0d,af,6f))) );
+            	HX_STACKFRAME(&_hx_pos_45e75fb904d6662d_279_title)
+HXDLIN( 279)		return ( (::String)(::Reflect_obj::field(this->section->attr,HX_("label",f4,0d,af,6f))) );
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormLayoutSection_obj,title,return )
 
 ::Array< ::Dynamic> FormLayoutSection_obj::items(){
-            	HX_GC_STACKFRAME(&_hx_pos_45e75fb904d6662d_239_items)
-HXLINE( 240)		::Array< ::Dynamic> items = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 241)		{
-HXLINE( 241)			int _g = 0;
-HXDLIN( 241)			::Array< ::Dynamic> _g1 = this->section->allTags(null(),null());
-HXDLIN( 241)			while((_g < _g1->length)){
-HXLINE( 241)				 ::borogove::Stanza child = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 241)				_g = (_g + 1);
-HXLINE( 242)				bool _hx_tmp;
-HXDLIN( 242)				if ((child->name == HX_("text",ad,cc,f9,4c))) {
-HXLINE( 242)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
-HXLINE( 242)						_hx_tmp = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xdata-layout",a9,5c,62,a8));
+            	HX_GC_STACKFRAME(&_hx_pos_45e75fb904d6662d_285_items)
+HXLINE( 286)		::Array< ::Dynamic> items = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 287)		{
+HXLINE( 287)			int _g = 0;
+HXDLIN( 287)			::Array< ::Dynamic> _g1 = this->section->allTags(null(),null());
+HXDLIN( 287)			while((_g < _g1->length)){
+HXLINE( 287)				 ::borogove::Stanza child = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 287)				_g = (_g + 1);
+HXLINE( 288)				bool _hx_tmp;
+HXDLIN( 288)				if ((child->name == HX_("text",ad,cc,f9,4c))) {
+HXLINE( 288)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
+HXLINE( 288)						_hx_tmp = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xdata-layout",a9,5c,62,a8));
             					}
             					else {
-HXLINE( 242)						_hx_tmp = true;
+HXLINE( 288)						_hx_tmp = true;
             					}
             				}
             				else {
-HXLINE( 242)					_hx_tmp = false;
+HXLINE( 288)					_hx_tmp = false;
             				}
-HXDLIN( 242)				if (_hx_tmp) {
-HXLINE( 243)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,child->getText(),null(),null(),null(),null(),null()));
+HXDLIN( 288)				if (_hx_tmp) {
+HXLINE( 289)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,child->getText(),null(),null(),null(),null(),null()));
             				}
-HXLINE( 245)				bool _hx_tmp1;
-HXDLIN( 245)				if ((child->name == HX_("fieldref",d9,74,29,ac))) {
-HXLINE( 245)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
-HXLINE( 245)						_hx_tmp1 = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xdata-layout",a9,5c,62,a8));
+HXLINE( 291)				bool _hx_tmp1;
+HXDLIN( 291)				if ((child->name == HX_("fieldref",d9,74,29,ac))) {
+HXLINE( 291)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
+HXLINE( 291)						_hx_tmp1 = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xdata-layout",a9,5c,62,a8));
             					}
             					else {
-HXLINE( 245)						_hx_tmp1 = true;
+HXLINE( 291)						_hx_tmp1 = true;
             					}
             				}
             				else {
-HXLINE( 245)					_hx_tmp1 = false;
+HXLINE( 291)					_hx_tmp1 = false;
             				}
-HXDLIN( 245)				if (_hx_tmp1) {
-HXLINE( 246)					 ::borogove::Stanza this1 = this->form;
-HXDLIN( 246)					 ::borogove::Stanza this2 = ::borogove::_DataForm::DataForm_Impl__obj::field(this1,( (::String)(::Reflect_obj::field(child->attr,HX_("var",e7,de,59,00))) ));
-HXDLIN( 246)					 ::borogove::FormField _hx_tmp2;
-HXDLIN( 246)					if (::hx::IsNull( this2 )) {
-HXLINE( 246)						_hx_tmp2 = null();
+HXDLIN( 291)				if (_hx_tmp1) {
+HXLINE( 292)					 ::borogove::Stanza this1 = this->form;
+HXDLIN( 292)					 ::borogove::Stanza this2 = ::borogove::_DataForm::DataForm_Impl__obj::field(this1,( (::String)(::Reflect_obj::field(child->attr,HX_("var",e7,de,59,00))) ));
+HXDLIN( 292)					 ::borogove::FormField _hx_tmp2;
+HXDLIN( 292)					if (::hx::IsNull( this2 )) {
+HXLINE( 292)						_hx_tmp2 = null();
             					}
             					else {
-HXLINE( 246)						_hx_tmp2 =  ::borogove::FormField_obj::__alloc( HX_CTX ,this2);
+HXLINE( 292)						_hx_tmp2 =  ::borogove::FormField_obj::__alloc( HX_CTX ,this2);
             					}
-HXDLIN( 246)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,null(),_hx_tmp2,null(),null(),null(),null()));
+HXDLIN( 292)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,null(),_hx_tmp2,null(),null(),null(),null()));
             				}
-HXLINE( 248)				bool _hx_tmp3;
-HXDLIN( 248)				if ((child->name == HX_("reportedref",20,fd,c7,a6))) {
-HXLINE( 248)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
-HXLINE( 248)						_hx_tmp3 = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xdata-layout",a9,5c,62,a8));
+HXLINE( 294)				bool _hx_tmp3;
+HXDLIN( 294)				if ((child->name == HX_("reportedref",20,fd,c7,a6))) {
+HXLINE( 294)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
+HXLINE( 294)						_hx_tmp3 = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xdata-layout",a9,5c,62,a8));
             					}
             					else {
-HXLINE( 248)						_hx_tmp3 = true;
+HXLINE( 294)						_hx_tmp3 = true;
             					}
             				}
             				else {
-HXLINE( 248)					_hx_tmp3 = false;
+HXLINE( 294)					_hx_tmp3 = false;
             				}
-HXDLIN( 248)				if (_hx_tmp3) {
-HXLINE( 251)					 ::borogove::Stanza tmp = this->form->getChild(HX_("reported",13,2a,94,dd),null());
-HXDLIN( 251)					::Array< ::Dynamic> tmp1;
-HXDLIN( 251)					if (::hx::IsNotNull( tmp )) {
-HXLINE( 251)						tmp1 = tmp->allTags(HX_("field",ba,94,93,00),null());
+HXDLIN( 294)				if (_hx_tmp3) {
+HXLINE( 297)					 ::borogove::Stanza tmp = this->form->getChild(HX_("reported",13,2a,94,dd),null());
+HXDLIN( 297)					::Array< ::Dynamic> tmp1;
+HXDLIN( 297)					if (::hx::IsNotNull( tmp )) {
+HXLINE( 297)						tmp1 = tmp->allTags(HX_("field",ba,94,93,00),null());
             					}
             					else {
-HXLINE( 251)						tmp1 = null();
+HXLINE( 297)						tmp1 = null();
             					}
-HXDLIN( 251)					::Array< ::Dynamic> _hx_tmp4;
-HXDLIN( 251)					if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 251)						::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(tmp1->length);
-HXDLIN( 251)						{
-HXLINE( 251)							int _g2 = 0;
-HXDLIN( 251)							int _g3 = tmp1->length;
-HXDLIN( 251)							while((_g2 < _g3)){
-HXLINE( 251)								_g2 = (_g2 + 1);
-HXDLIN( 251)								int i = (_g2 - 1);
-HXDLIN( 251)								{
-HXLINE( 251)									 ::borogove::Stanza f = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(tmp1,i)) );
-HXDLIN( 251)									 ::borogove::FormField inValue;
-HXDLIN( 251)									if (::hx::IsNull( f )) {
-HXLINE( 251)										inValue = null();
+HXDLIN( 297)					::Array< ::Dynamic> _hx_tmp4;
+HXDLIN( 297)					if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 297)						::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(tmp1->length);
+HXDLIN( 297)						{
+HXLINE( 297)							int _g2 = 0;
+HXDLIN( 297)							int _g3 = tmp1->length;
+HXDLIN( 297)							while((_g2 < _g3)){
+HXLINE( 297)								_g2 = (_g2 + 1);
+HXDLIN( 297)								int i = (_g2 - 1);
+HXDLIN( 297)								{
+HXLINE( 297)									 ::borogove::Stanza f = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(tmp1,i)) );
+HXDLIN( 297)									 ::borogove::FormField inValue;
+HXDLIN( 297)									if (::hx::IsNull( f )) {
+HXLINE( 297)										inValue = null();
             									}
             									else {
-HXLINE( 251)										inValue =  ::borogove::FormField_obj::__alloc( HX_CTX ,f);
+HXLINE( 297)										inValue =  ::borogove::FormField_obj::__alloc( HX_CTX ,f);
             									}
-HXDLIN( 251)									result->__unsafe_set(i,inValue);
+HXDLIN( 297)									result->__unsafe_set(i,inValue);
             								}
             							}
             						}
-HXDLIN( 251)						_hx_tmp4 = result;
+HXDLIN( 297)						_hx_tmp4 = result;
             					}
             					else {
-HXLINE( 251)						_hx_tmp4 = null();
+HXLINE( 297)						_hx_tmp4 = null();
             					}
-HXLINE( 252)					::Array< ::Dynamic> tmp2 = this->form->allTags(HX_("item",13,c5,bf,45),null());
-HXDLIN( 252)					::Array< ::Dynamic> tmp3;
-HXDLIN( 252)					if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 252)						::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new(tmp2->length);
-HXDLIN( 252)						{
-HXLINE( 252)							int _g4 = 0;
-HXDLIN( 252)							int _g5 = tmp2->length;
-HXDLIN( 252)							while((_g4 < _g5)){
-HXLINE( 252)								_g4 = (_g4 + 1);
-HXDLIN( 252)								int i1 = (_g4 - 1);
-HXDLIN( 252)								{
-HXLINE( 252)									::Array< ::Dynamic> inValue1 = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(tmp2,i1)) )->allTags(HX_("field",ba,94,93,00),null());
-HXDLIN( 252)									result1->__unsafe_set(i1,inValue1);
+HXLINE( 298)					::Array< ::Dynamic> tmp2 = this->form->allTags(HX_("item",13,c5,bf,45),null());
+HXDLIN( 298)					::Array< ::Dynamic> tmp3;
+HXDLIN( 298)					if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 298)						::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new(tmp2->length);
+HXDLIN( 298)						{
+HXLINE( 298)							int _g4 = 0;
+HXDLIN( 298)							int _g5 = tmp2->length;
+HXDLIN( 298)							while((_g4 < _g5)){
+HXLINE( 298)								_g4 = (_g4 + 1);
+HXDLIN( 298)								int i1 = (_g4 - 1);
+HXDLIN( 298)								{
+HXLINE( 298)									::Array< ::Dynamic> inValue1 = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(tmp2,i1)) )->allTags(HX_("field",ba,94,93,00),null());
+HXDLIN( 298)									result1->__unsafe_set(i1,inValue1);
             								}
             							}
             						}
-HXDLIN( 252)						tmp3 = result1;
+HXDLIN( 298)						tmp3 = result1;
             					}
             					else {
-HXLINE( 252)						tmp3 = null();
+HXLINE( 298)						tmp3 = null();
             					}
-HXDLIN( 252)					::Array< ::Dynamic> tmp4;
-HXDLIN( 252)					if (::hx::IsNotNull( tmp3 )) {
-HXLINE( 252)						::Array< ::Dynamic> result2 = ::Array_obj< ::Dynamic>::__new(tmp3->length);
-HXDLIN( 252)						{
-HXLINE( 252)							int _g6 = 0;
-HXDLIN( 252)							int _g7 = tmp3->length;
-HXDLIN( 252)							while((_g6 < _g7)){
-HXLINE( 252)								_g6 = (_g6 + 1);
-HXDLIN( 252)								int i2 = (_g6 - 1);
-HXDLIN( 252)								{
-HXLINE( 252)									::Array< ::Dynamic> row = ( (::Array< ::Dynamic>)(_hx_array_unsafe_get(tmp3,i2)) );
-HXDLIN( 252)									::Array< ::Dynamic> result3 = ::Array_obj< ::Dynamic>::__new(row->length);
-HXDLIN( 252)									{
-HXLINE( 252)										int _g8 = 0;
-HXDLIN( 252)										int _g9 = row->length;
-HXDLIN( 252)										while((_g8 < _g9)){
-HXLINE( 252)											_g8 = (_g8 + 1);
-HXDLIN( 252)											int i3 = (_g8 - 1);
-HXDLIN( 252)											{
-HXLINE( 252)												 ::borogove::Stanza f1 = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(row,i3)) );
-HXDLIN( 252)												 ::borogove::FormField inValue2;
-HXDLIN( 252)												if (::hx::IsNull( f1 )) {
-HXLINE( 252)													inValue2 = null();
+HXDLIN( 298)					::Array< ::Dynamic> tmp4;
+HXDLIN( 298)					if (::hx::IsNotNull( tmp3 )) {
+HXLINE( 298)						::Array< ::Dynamic> result2 = ::Array_obj< ::Dynamic>::__new(tmp3->length);
+HXDLIN( 298)						{
+HXLINE( 298)							int _g6 = 0;
+HXDLIN( 298)							int _g7 = tmp3->length;
+HXDLIN( 298)							while((_g6 < _g7)){
+HXLINE( 298)								_g6 = (_g6 + 1);
+HXDLIN( 298)								int i2 = (_g6 - 1);
+HXDLIN( 298)								{
+HXLINE( 298)									::Array< ::Dynamic> row = ( (::Array< ::Dynamic>)(_hx_array_unsafe_get(tmp3,i2)) );
+HXDLIN( 298)									::Array< ::Dynamic> result3 = ::Array_obj< ::Dynamic>::__new(row->length);
+HXDLIN( 298)									{
+HXLINE( 298)										int _g8 = 0;
+HXDLIN( 298)										int _g9 = row->length;
+HXDLIN( 298)										while((_g8 < _g9)){
+HXLINE( 298)											_g8 = (_g8 + 1);
+HXDLIN( 298)											int i3 = (_g8 - 1);
+HXDLIN( 298)											{
+HXLINE( 298)												 ::borogove::Stanza f1 = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(row,i3)) );
+HXDLIN( 298)												 ::borogove::FormField inValue2;
+HXDLIN( 298)												if (::hx::IsNull( f1 )) {
+HXLINE( 298)													inValue2 = null();
             												}
             												else {
-HXLINE( 252)													inValue2 =  ::borogove::FormField_obj::__alloc( HX_CTX ,f1);
+HXLINE( 298)													inValue2 =  ::borogove::FormField_obj::__alloc( HX_CTX ,f1);
             												}
-HXDLIN( 252)												result3->__unsafe_set(i3,inValue2);
+HXDLIN( 298)												result3->__unsafe_set(i3,inValue2);
             											}
             										}
             									}
-HXDLIN( 252)									result2->__unsafe_set(i2,result3);
+HXDLIN( 298)									result2->__unsafe_set(i2,result3);
             								}
             							}
             						}
-HXDLIN( 252)						tmp4 = result2;
+HXDLIN( 298)						tmp4 = result2;
             					}
             					else {
-HXLINE( 252)						tmp4 = null();
+HXLINE( 298)						tmp4 = null();
             					}
-HXDLIN( 252)					::Array< ::Dynamic> _hx_tmp5;
-HXDLIN( 252)					if (::hx::IsNotNull( tmp4 )) {
-HXLINE( 252)						_hx_tmp5 = tmp4;
+HXDLIN( 298)					::Array< ::Dynamic> _hx_tmp5;
+HXDLIN( 298)					if (::hx::IsNotNull( tmp4 )) {
+HXLINE( 298)						_hx_tmp5 = tmp4;
             					}
             					else {
-HXLINE( 252)						_hx_tmp5 = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 298)						_hx_tmp5 = ::Array_obj< ::Dynamic>::__new(0);
             					}
-HXLINE( 249)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,null(),null(),null(),_hx_tmp4,_hx_tmp5,null()));
+HXLINE( 295)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,null(),null(),null(),_hx_tmp4,_hx_tmp5,null()));
             				}
-HXLINE( 255)				bool _hx_tmp6;
-HXDLIN( 255)				if ((child->name == HX_("section",e5,05,d8,5d))) {
-HXLINE( 255)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
-HXLINE( 255)						_hx_tmp6 = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xdata-layout",a9,5c,62,a8));
+HXLINE( 301)				bool _hx_tmp6;
+HXDLIN( 301)				if ((child->name == HX_("section",e5,05,d8,5d))) {
+HXLINE( 301)					if (::hx::IsNotNull( ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) )) {
+HXLINE( 301)						_hx_tmp6 = (( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("http://jabber.org/protocol/xdata-layout",a9,5c,62,a8));
             					}
             					else {
-HXLINE( 255)						_hx_tmp6 = true;
+HXLINE( 301)						_hx_tmp6 = true;
             					}
             				}
             				else {
-HXLINE( 255)					_hx_tmp6 = false;
+HXLINE( 301)					_hx_tmp6 = false;
             				}
-HXDLIN( 255)				if (_hx_tmp6) {
-HXLINE( 256)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,null(),null(), ::borogove::FormLayoutSection_obj::__alloc( HX_CTX ,this->form,child),null(),null(),null()));
+HXDLIN( 301)				if (_hx_tmp6) {
+HXLINE( 302)					items->push( ::borogove::FormItem_obj::__alloc( HX_CTX ,null(),null(), ::borogove::FormLayoutSection_obj::__alloc( HX_CTX ,this->form,child),null(),null(),null()));
             				}
             			}
             		}
-HXLINE( 260)		return items;
+HXLINE( 306)		return items;
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/FormOption.cpp b/Sources/c_borogove/src/borogove/FormOption.cpp
index 6713ee7..2b8381a 100644
--- a/Sources/c_borogove/src/borogove/FormOption.cpp
+++ b/Sources/c_borogove/src/borogove/FormOption.cpp
@@ -11,31 +11,31 @@
 #include <borogove/Stanza.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_a7d595b8126d2317_218_new,"borogove.FormOption","new",0xfe881c18,"borogove.FormOption.new","borogove/DataForm.hx",218,0x710703a2)
-HX_LOCAL_STACK_FRAME(_hx_pos_ecda2718ab159179_450_label__fromC,"borogove.FormOption","label__fromC",0x9aee464d,"borogove.FormOption.label__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_ecda2718ab159179_450_value__fromC,"borogove.FormOption","value__fromC",0x4e06ae70,"borogove.FormOption.value__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a7d595b8126d2317_225_fromOption,"borogove.FormOption","fromOption",0x42bbf3c7,"borogove.FormOption.fromOption","borogove/DataForm.hx",225,0x710703a2)
-HX_LOCAL_STACK_FRAME(_hx_pos_a7d595b8126d2317_213_boot,"borogove.FormOption","boot",0xb0a9797a,"borogove.FormOption.boot","borogove/DataForm.hx",213,0x710703a2)
+HX_DEFINE_STACK_FRAME(_hx_pos_a7d595b8126d2317_221_new,"borogove.FormOption","new",0xfe881c18,"borogove.FormOption.new","borogove/DataForm.hx",221,0x710703a2)
+HX_LOCAL_STACK_FRAME(_hx_pos_ecda2718ab159179_478_label__fromC,"borogove.FormOption","label__fromC",0x9aee464d,"borogove.FormOption.label__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_ecda2718ab159179_478_value__fromC,"borogove.FormOption","value__fromC",0x4e06ae70,"borogove.FormOption.value__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a7d595b8126d2317_228_fromOption,"borogove.FormOption","fromOption",0x42bbf3c7,"borogove.FormOption.fromOption","borogove/DataForm.hx",228,0x710703a2)
+HX_LOCAL_STACK_FRAME(_hx_pos_a7d595b8126d2317_216_boot,"borogove.FormOption","boot",0xb0a9797a,"borogove.FormOption.boot","borogove/DataForm.hx",216,0x710703a2)
 namespace borogove{
 
 void FormOption_obj::__construct(::String label,::String value){
-            	HX_STACKFRAME(&_hx_pos_a7d595b8126d2317_218_new)
-HXLINE( 219)		::String _hx_tmp;
-HXDLIN( 219)		if (::hx::IsNotNull( label )) {
-HXLINE( 219)			_hx_tmp = label;
+            	HX_STACKFRAME(&_hx_pos_a7d595b8126d2317_221_new)
+HXLINE( 222)		::String _hx_tmp;
+HXDLIN( 222)		if (::hx::IsNotNull( label )) {
+HXLINE( 222)			_hx_tmp = label;
             		}
             		else {
-HXLINE( 219)			_hx_tmp = value;
+HXLINE( 222)			_hx_tmp = value;
             		}
-HXDLIN( 219)		this->label = _hx_tmp;
-HXLINE( 220)		::String _hx_tmp1;
-HXDLIN( 220)		if (::hx::IsNotNull( value )) {
-HXLINE( 220)			_hx_tmp1 = value;
+HXDLIN( 222)		this->label = _hx_tmp;
+HXLINE( 223)		::String _hx_tmp1;
+HXDLIN( 223)		if (::hx::IsNotNull( value )) {
+HXLINE( 223)			_hx_tmp1 = value;
             		}
             		else {
-HXLINE( 220)			_hx_tmp1 = HX_("",00,00,00,00);
+HXLINE( 223)			_hx_tmp1 = HX_("",00,00,00,00);
             		}
-HXDLIN( 220)		this->value = _hx_tmp1;
+HXDLIN( 223)		this->value = _hx_tmp1;
             	}
 
 Dynamic FormOption_obj::__CreateEmpty() { return new FormOption_obj; }
@@ -54,25 +54,25 @@ bool FormOption_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String FormOption_obj::label__fromC(){
-            	HX_STACKFRAME(&_hx_pos_ecda2718ab159179_450_label__fromC)
-HXDLIN( 450)		return this->label;
+            	HX_STACKFRAME(&_hx_pos_ecda2718ab159179_478_label__fromC)
+HXDLIN( 478)		return this->label;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormOption_obj,label__fromC,return )
 
 ::String FormOption_obj::value__fromC(){
-            	HX_STACKFRAME(&_hx_pos_ecda2718ab159179_450_value__fromC)
-HXDLIN( 450)		return this->value;
+            	HX_STACKFRAME(&_hx_pos_ecda2718ab159179_478_value__fromC)
+HXDLIN( 478)		return this->value;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(FormOption_obj,value__fromC,return )
 
  ::borogove::FormOption FormOption_obj::fromOption( ::borogove::Stanza option){
-            	HX_GC_STACKFRAME(&_hx_pos_a7d595b8126d2317_225_fromOption)
-HXDLIN( 225)		::String _hx_tmp = ( (::String)(::Reflect_obj::field(option->attr,HX_("label",f4,0d,af,6f))) );
-HXDLIN( 225)		return  ::borogove::FormOption_obj::__alloc( HX_CTX ,_hx_tmp,option->getChildText(HX_("value",71,7f,b8,31),null()));
+            	HX_GC_STACKFRAME(&_hx_pos_a7d595b8126d2317_228_fromOption)
+HXDLIN( 228)		::String _hx_tmp = ( (::String)(::Reflect_obj::field(option->attr,HX_("label",f4,0d,af,6f))) );
+HXDLIN( 228)		return  ::borogove::FormOption_obj::__alloc( HX_CTX ,_hx_tmp,option->getChildText(HX_("value",71,7f,b8,31),null()));
             	}
 
 
@@ -186,8 +186,8 @@ void FormOption_obj::__register()
 void FormOption_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_a7d595b8126d2317_213_boot)
-HXDLIN( 213)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_a7d595b8126d2317_216_boot)
+HXDLIN( 216)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("value__fromC",28,31,16,ac), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
diff --git a/Sources/c_borogove/src/borogove/FormSection__Companion.cpp b/Sources/c_borogove/src/borogove/FormSection__Companion.cpp
index 05e399c..b7db570 100644
--- a/Sources/c_borogove/src/borogove/FormSection__Companion.cpp
+++ b/Sources/c_borogove/src/borogove/FormSection__Companion.cpp
@@ -1,8 +1,8 @@
 // Generated by Haxe 4.3.3
 #include <hxcpp.h>
 
-#ifndef INCLUDED__HaxeCBridge_Internal
-#include <_HaxeCBridge/Internal.h>
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
 #endif
 #ifndef INCLUDED_borogove_FormItem
 #include <borogove/FormItem.h>
@@ -13,15 +13,9 @@
 #ifndef INCLUDED_borogove_FormSection__Companion
 #include <borogove/FormSection__Companion.h>
 #endif
-#ifndef INCLUDED_cpp_Int64Map
-#include <cpp/Int64Map.h>
-#endif
-#ifndef INCLUDED_haxe_IMap
-#include <haxe/IMap.h>
-#endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_6011c85ede3c7a5b_339_title__fromC,"borogove.FormSection__Companion","title__fromC",0x3b1ea757,"borogove.FormSection__Companion.title__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_6011c85ede3c7a5b_335_items__fromC,"borogove.FormSection__Companion","items__fromC",0xa0ca2def,"borogove.FormSection__Companion.items__fromC","HaxeCBridge.hx",335,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_6011c85ede3c7a5b_367_title__fromC,"borogove.FormSection__Companion","title__fromC",0x3b1ea757,"borogove.FormSection__Companion.title__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_6011c85ede3c7a5b_363_items__fromC,"borogove.FormSection__Companion","items__fromC",0xa0ca2def,"borogove.FormSection__Companion.items__fromC","HaxeCBridge.hx",363,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_916077ee930f3e53_14_boot,"borogove.FormSection__Companion","boot",0x3dd707a8,"borogove.FormSection__Companion.boot","borogove/Form.hx",14,0x25d2f7ac)
 namespace borogove{
 
@@ -43,59 +37,21 @@ bool FormSection__Companion_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String FormSection__Companion_obj::title__fromC(::Dynamic self){
-            	HX_STACKFRAME(&_hx_pos_6011c85ede3c7a5b_339_title__fromC)
-HXDLIN( 339)		return ::borogove::FormSection_obj::title(self);
+            	HX_STACKFRAME(&_hx_pos_6011c85ede3c7a5b_367_title__fromC)
+HXDLIN( 367)		return ::borogove::FormSection_obj::title(self);
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(FormSection__Companion_obj,title__fromC,return )
 
 size_t FormSection__Companion_obj::items__fromC(::Dynamic self,void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_6011c85ede3c7a5b_335_items__fromC)
-HXDLIN( 335)		::Array< ::Dynamic> out = ::borogove::FormSection_obj::items(self);
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g = 0;
-HXDLIN( 335)				while((_g < out->length)){
-HXDLIN( 335)					 ::borogove::FormItem el = out->__get(_g).StaticCast<  ::borogove::FormItem >();
-HXDLIN( 335)					_g = (_g + 1);
-HXDLIN( 335)					{
-HXDLIN( 335)						 ::Dynamic haxeObject = el;
-HXDLIN( 335)						void* ptr = haxeObject.mPtr;
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXDLIN( 335)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)out->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXDLIN( 335)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),out));
-HXDLIN( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_6011c85ede3c7a5b_363_items__fromC)
+HXDLIN( 363)		::Array< ::Dynamic> out = ::borogove::FormSection_obj::items(self);
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/FormSubmitBuilder.cpp b/Sources/c_borogove/src/borogove/FormSubmitBuilder.cpp
index bf43ba2..b7a006b 100644
--- a/Sources/c_borogove/src/borogove/FormSubmitBuilder.cpp
+++ b/Sources/c_borogove/src/borogove/FormSubmitBuilder.cpp
@@ -23,14 +23,14 @@
 #include <haxe/ds/StringMap.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_4c0d9a76469df0f6_49_new,"borogove.FormSubmitBuilder","new",0x3947db44,"borogove.FormSubmitBuilder.new","borogove/Form.hx",49,0x25d2f7ac)
-HX_LOCAL_STACK_FRAME(_hx_pos_4c0d9a76469df0f6_54_add,"borogove.FormSubmitBuilder","add",0x393dfd05,"borogove.FormSubmitBuilder.add","borogove/Form.hx",54,0x25d2f7ac)
-HX_LOCAL_STACK_FRAME(_hx_pos_4c0d9a76469df0f6_62_submit,"borogove.FormSubmitBuilder","submit",0xa46933b4,"borogove.FormSubmitBuilder.submit","borogove/Form.hx",62,0x25d2f7ac)
+HX_DEFINE_STACK_FRAME(_hx_pos_4c0d9a76469df0f6_74_new,"borogove.FormSubmitBuilder","new",0x3947db44,"borogove.FormSubmitBuilder.new","borogove/Form.hx",74,0x25d2f7ac)
+HX_LOCAL_STACK_FRAME(_hx_pos_4c0d9a76469df0f6_88_add,"borogove.FormSubmitBuilder","add",0x393dfd05,"borogove.FormSubmitBuilder.add","borogove/Form.hx",88,0x25d2f7ac)
+HX_LOCAL_STACK_FRAME(_hx_pos_4c0d9a76469df0f6_96_submit,"borogove.FormSubmitBuilder","submit",0xa46933b4,"borogove.FormSubmitBuilder.submit","borogove/Form.hx",96,0x25d2f7ac)
 namespace borogove{
 
 void FormSubmitBuilder_obj::__construct(){
-            	HX_GC_STACKFRAME(&_hx_pos_4c0d9a76469df0f6_49_new)
-HXDLIN(  49)		this->data =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+            	HX_GC_STACKFRAME(&_hx_pos_4c0d9a76469df0f6_74_new)
+HXDLIN(  74)		this->data =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
             	}
 
 Dynamic FormSubmitBuilder_obj::__CreateEmpty() { return new FormSubmitBuilder_obj; }
@@ -49,13 +49,13 @@ bool FormSubmitBuilder_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 void FormSubmitBuilder_obj::add(::String k,::String v){
-            	HX_STACKFRAME(&_hx_pos_4c0d9a76469df0f6_54_add)
-HXDLIN(  54)		if (::hx::IsNotNull( this->data->get(k) )) {
-HXLINE(  55)			::Dynamic this1 = this->data;
-HXDLIN(  55)			( ( ::haxe::ds::StringMap)(this1) )->set(k,( (::Array< ::String >)(this->data->get(k)) )->concat(::Array_obj< ::String >::__new(1)->init(0,v)));
+            	HX_STACKFRAME(&_hx_pos_4c0d9a76469df0f6_88_add)
+HXDLIN(  88)		if (::hx::IsNotNull( this->data->get(k) )) {
+HXLINE(  89)			::Dynamic this1 = this->data;
+HXDLIN(  89)			( ( ::haxe::ds::StringMap)(this1) )->set(k,( (::Array< ::String >)(this->data->get(k)) )->concat(::Array_obj< ::String >::__new(1)->init(0,v)));
             		}
             		else {
-HXLINE(  57)			this->data->set(k,::Array_obj< ::String >::__new(1)->init(0,v));
+HXLINE(  91)			this->data->set(k,::Array_obj< ::String >::__new(1)->init(0,v));
             		}
             	}
 
@@ -63,128 +63,128 @@ HXLINE(  57)			this->data->set(k,::Array_obj< ::String >::__new(1)->init(0,v));
 HX_DEFINE_DYNAMIC_FUNC2(FormSubmitBuilder_obj,add,(void))
 
  ::borogove::Stanza FormSubmitBuilder_obj::submit( ::borogove::Stanza form){
-            	HX_GC_STACKFRAME(&_hx_pos_4c0d9a76469df0f6_62_submit)
-HXLINE(  63)		 ::borogove::Stanza toSubmit =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_GC_STACKFRAME(&_hx_pos_4c0d9a76469df0f6_96_submit)
+HXLINE(  97)		 ::borogove::Stanza toSubmit =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("type",ba,f2,08,4d),HX_("submit",18,58,06,9a))
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("jabber:x:data",c2,e1,e9,7c))));
-HXLINE(  64)		if (::hx::IsNotNull( form )) {
-HXLINE(  65)			int _g = 0;
-HXDLIN(  65)			::Array< ::Dynamic> _g1 = form->allTags(HX_("field",ba,94,93,00),null());
-HXDLIN(  65)			while((_g < _g1->length)){
-HXLINE(  65)				 ::borogove::Stanza f = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
-HXDLIN(  65)				_g = (_g + 1);
-HXLINE(  66)				bool _hx_tmp;
-HXDLIN(  66)				::Dynamic this1 = this->data;
-HXDLIN(  66)				::String key;
-HXDLIN(  66)				::String tmp = ( (::String)(::Reflect_obj::field(f->attr,HX_("var",e7,de,59,00))) );
-HXDLIN(  66)				if (::hx::IsNotNull( tmp )) {
-HXLINE(  66)					key = tmp;
+HXLINE(  98)		if (::hx::IsNotNull( form )) {
+HXLINE(  99)			int _g = 0;
+HXDLIN(  99)			::Array< ::Dynamic> _g1 = form->allTags(HX_("field",ba,94,93,00),null());
+HXDLIN(  99)			while((_g < _g1->length)){
+HXLINE(  99)				 ::borogove::Stanza f = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN(  99)				_g = (_g + 1);
+HXLINE( 100)				bool _hx_tmp;
+HXDLIN( 100)				::Dynamic this1 = this->data;
+HXDLIN( 100)				::String key;
+HXDLIN( 100)				::String tmp = ( (::String)(::Reflect_obj::field(f->attr,HX_("var",e7,de,59,00))) );
+HXDLIN( 100)				if (::hx::IsNotNull( tmp )) {
+HXLINE( 100)					key = tmp;
             				}
             				else {
-HXLINE(  66)					key = HX_("",00,00,00,00);
+HXLINE( 100)					key = HX_("",00,00,00,00);
             				}
-HXDLIN(  66)				if (::hx::IsNull( ( ( ::haxe::ds::StringMap)(this1) )->get(key) )) {
-HXLINE(  66)					_hx_tmp = (::borogove::_DataForm::Field_Impl__obj::get_value(f)->length > 0);
+HXDLIN( 100)				if (::hx::IsNull( ( ( ::haxe::ds::StringMap)(this1) )->get(key) )) {
+HXLINE( 100)					_hx_tmp = (::borogove::_DataForm::Field_Impl__obj::get_value(f)->length > 0);
             				}
             				else {
-HXLINE(  66)					_hx_tmp = false;
+HXLINE( 100)					_hx_tmp = false;
             				}
-HXDLIN(  66)				if (_hx_tmp) {
-HXLINE(  67)					::String tmp1 = ( (::String)(::Reflect_obj::field(f->attr,HX_("var",e7,de,59,00))) );
-HXDLIN(  67)					::String tag;
-HXDLIN(  67)					if (::hx::IsNotNull( tmp1 )) {
-HXLINE(  67)						tag = tmp1;
+HXDLIN( 100)				if (_hx_tmp) {
+HXLINE( 101)					::String tmp1 = ( (::String)(::Reflect_obj::field(f->attr,HX_("var",e7,de,59,00))) );
+HXDLIN( 101)					::String tag;
+HXDLIN( 101)					if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 101)						tag = tmp1;
             					}
             					else {
-HXLINE(  67)						tag = HX_("",00,00,00,00);
+HXLINE( 101)						tag = HX_("",00,00,00,00);
             					}
-HXDLIN(  67)					 ::borogove::Stanza tag1 = toSubmit->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(1)
+HXDLIN( 101)					 ::borogove::Stanza tag1 = toSubmit->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("var",e7,de,59,00),tag)));
-HXLINE(  68)					{
-HXLINE(  68)						int _g2 = 0;
-HXDLIN(  68)						::Array< ::String > _g3 = ::borogove::_DataForm::Field_Impl__obj::get_value(f);
-HXDLIN(  68)						while((_g2 < _g3->length)){
-HXLINE(  68)							::String v = _g3->__get(_g2);
-HXDLIN(  68)							_g2 = (_g2 + 1);
-HXLINE(  69)							tag1->textTag(HX_("value",71,7f,b8,31),v,null());
+HXLINE( 102)					{
+HXLINE( 102)						int _g2 = 0;
+HXDLIN( 102)						::Array< ::String > _g3 = ::borogove::_DataForm::Field_Impl__obj::get_value(f);
+HXDLIN( 102)						while((_g2 < _g3->length)){
+HXLINE( 102)							::String v = _g3->__get(_g2);
+HXDLIN( 102)							_g2 = (_g2 + 1);
+HXLINE( 103)							tag1->textTag(HX_("value",71,7f,b8,31),v,null());
             						}
             					}
-HXLINE(  71)					tag1->up();
+HXLINE( 105)					tag1->up();
             				}
             				else {
-HXLINE(  72)					bool _hx_tmp1;
-HXDLIN(  72)					if (::hx::IsNotNull( f->getChild(HX_("required",5f,91,62,b2),null()) )) {
-HXLINE(  72)						::Dynamic this2 = this->data;
-HXDLIN(  72)						::String key1;
-HXDLIN(  72)						::String tmp2 = ( (::String)(::Reflect_obj::field(f->attr,HX_("var",e7,de,59,00))) );
-HXDLIN(  72)						if (::hx::IsNotNull( tmp2 )) {
-HXLINE(  72)							key1 = tmp2;
+HXLINE( 106)					bool _hx_tmp1;
+HXDLIN( 106)					if (::hx::IsNotNull( f->getChild(HX_("required",5f,91,62,b2),null()) )) {
+HXLINE( 106)						::Dynamic this2 = this->data;
+HXDLIN( 106)						::String key1;
+HXDLIN( 106)						::String tmp2 = ( (::String)(::Reflect_obj::field(f->attr,HX_("var",e7,de,59,00))) );
+HXDLIN( 106)						if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 106)							key1 = tmp2;
             						}
             						else {
-HXLINE(  72)							key1 = HX_("",00,00,00,00);
+HXLINE( 106)							key1 = HX_("",00,00,00,00);
             						}
-HXDLIN(  72)						if (::hx::IsNotNull( ( ( ::haxe::ds::StringMap)(this2) )->get(key1) )) {
-HXLINE(  72)							::Dynamic this3 = this->data;
-HXDLIN(  72)							::String key2;
-HXDLIN(  72)							::String tmp3 = ( (::String)(::Reflect_obj::field(f->attr,HX_("var",e7,de,59,00))) );
-HXDLIN(  72)							if (::hx::IsNotNull( tmp3 )) {
-HXLINE(  72)								key2 = tmp3;
+HXDLIN( 106)						if (::hx::IsNotNull( ( ( ::haxe::ds::StringMap)(this2) )->get(key1) )) {
+HXLINE( 106)							::Dynamic this3 = this->data;
+HXDLIN( 106)							::String key2;
+HXDLIN( 106)							::String tmp3 = ( (::String)(::Reflect_obj::field(f->attr,HX_("var",e7,de,59,00))) );
+HXDLIN( 106)							if (::hx::IsNotNull( tmp3 )) {
+HXLINE( 106)								key2 = tmp3;
             							}
             							else {
-HXLINE(  72)								key2 = HX_("",00,00,00,00);
+HXLINE( 106)								key2 = HX_("",00,00,00,00);
             							}
-HXDLIN(  72)							_hx_tmp1 = (( (::Array< ::String >)(( ( ::haxe::ds::StringMap)(this3) )->get(key2)) )->length < 1);
+HXDLIN( 106)							_hx_tmp1 = (( (::Array< ::String >)(( ( ::haxe::ds::StringMap)(this3) )->get(key2)) )->length < 1);
             						}
             						else {
-HXLINE(  72)							_hx_tmp1 = true;
+HXLINE( 106)							_hx_tmp1 = true;
             						}
             					}
             					else {
-HXLINE(  72)						_hx_tmp1 = false;
+HXLINE( 106)						_hx_tmp1 = false;
             					}
-HXDLIN(  72)					if (_hx_tmp1) {
-HXLINE(  73)						 ::Dynamic _hx_tmp2 = ::haxe::Log_obj::trace;
-HXDLIN(  73)						::String tmp4 = ( (::String)(::Reflect_obj::field(f->attr,HX_("var",e7,de,59,00))) );
-HXDLIN(  73)						::String _hx_tmp3;
-HXDLIN(  73)						if (::hx::IsNotNull( tmp4 )) {
-HXLINE(  73)							_hx_tmp3 = tmp4;
+HXDLIN( 106)					if (_hx_tmp1) {
+HXLINE( 107)						 ::Dynamic _hx_tmp2 = ::haxe::Log_obj::trace;
+HXDLIN( 107)						::String tmp4 = ( (::String)(::Reflect_obj::field(f->attr,HX_("var",e7,de,59,00))) );
+HXDLIN( 107)						::String _hx_tmp3;
+HXDLIN( 107)						if (::hx::IsNotNull( tmp4 )) {
+HXLINE( 107)							_hx_tmp3 = tmp4;
             						}
             						else {
-HXLINE(  73)							_hx_tmp3 = HX_("",00,00,00,00);
+HXLINE( 107)							_hx_tmp3 = HX_("",00,00,00,00);
             						}
-HXDLIN(  73)						_hx_tmp2(HX_("No value provided for required field",9f,e8,77,b6), ::Dynamic(::hx::Anon_obj::Create(5)
+HXDLIN( 107)						_hx_tmp2(HX_("No value provided for required field",9f,e8,77,b6), ::Dynamic(::hx::Anon_obj::Create(5)
             							->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.FormSubmitBuilder",52,29,e8,61))
             							->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,_hx_tmp3))
             							->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("submit",18,58,06,9a))
             							->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Form.hx",ac,f7,d2,25))
-            							->setFixed(4,HX_("lineNumber",dd,81,22,76),73)));
-HXLINE(  74)						return null();
+            							->setFixed(4,HX_("lineNumber",dd,81,22,76),107)));
+HXLINE( 108)						return null();
             					}
             				}
             			}
             		}
-HXLINE(  78)		{
-HXLINE(  78)			::Dynamic this4 = this->data;
-HXDLIN(  78)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this4);
-HXDLIN(  78)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE(  78)				::String key3 = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXDLIN(  78)				::Array< ::String > _g_value = ( (::Array< ::String >)(::haxe::IMap_obj::get(this4,key3)) );
-HXDLIN(  78)				{
-HXLINE(  79)					 ::borogove::Stanza tag2 = toSubmit->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 112)		{
+HXLINE( 112)			::Dynamic this4 = this->data;
+HXDLIN( 112)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this4);
+HXDLIN( 112)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 112)				::String key3 = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN( 112)				::Array< ::String > _g_value = ( (::Array< ::String >)(::haxe::IMap_obj::get(this4,key3)) );
+HXDLIN( 112)				{
+HXLINE( 113)					 ::borogove::Stanza tag2 = toSubmit->tag(HX_("field",ba,94,93,00), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("var",e7,de,59,00),key3)));
-HXLINE(  80)					{
-HXLINE(  80)						int _g4 = 0;
-HXDLIN(  80)						while((_g4 < _g_value->length)){
-HXLINE(  80)							::String v1 = _g_value->__get(_g4);
-HXDLIN(  80)							_g4 = (_g4 + 1);
-HXLINE(  81)							tag2->textTag(HX_("value",71,7f,b8,31),v1,null());
+HXLINE( 114)					{
+HXLINE( 114)						int _g4 = 0;
+HXDLIN( 114)						while((_g4 < _g_value->length)){
+HXLINE( 114)							::String v1 = _g_value->__get(_g4);
+HXDLIN( 114)							_g4 = (_g4 + 1);
+HXLINE( 115)							tag2->textTag(HX_("value",71,7f,b8,31),v1,null());
             						}
             					}
-HXLINE(  83)					tag2->up();
+HXLINE( 117)					tag2->up();
             				}
             			}
             		}
-HXLINE(  86)		return toSubmit;
+HXLINE( 120)		return toSubmit;
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/GenericStream.cpp b/Sources/c_borogove/src/borogove/GenericStream.cpp
index 7940ee4..f46b49f 100644
--- a/Sources/c_borogove/src/borogove/GenericStream.cpp
+++ b/Sources/c_borogove/src/borogove/GenericStream.cpp
@@ -4,6 +4,9 @@
 #ifndef INCLUDED_Reflect
 #include <Reflect.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_EventEmitter
 #include <borogove/EventEmitter.h>
 #endif
@@ -27,9 +30,9 @@
 #endif
 
 HX_DEFINE_STACK_FRAME(_hx_pos_b33ef4a473e70a2a_14_new,"borogove.GenericStream","new",0x7d32e5bc,"borogove.GenericStream.new","borogove/GenericStream.hx",14,0xe1a5f735)
-HX_LOCAL_STACK_FRAME(_hx_pos_b33ef4a473e70a2a_35_sendIq,"borogove.GenericStream","sendIq",0x22505b74,"borogove.GenericStream.sendIq","borogove/GenericStream.hx",35,0xe1a5f735)
-HX_LOCAL_STACK_FRAME(_hx_pos_b33ef4a473e70a2a_32_sendIq,"borogove.GenericStream","sendIq",0x22505b74,"borogove.GenericStream.sendIq","borogove/GenericStream.hx",32,0xe1a5f735)
-HX_LOCAL_STACK_FRAME(_hx_pos_b33ef4a473e70a2a_42_onStanza,"borogove.GenericStream","onStanza",0xa7ce5198,"borogove.GenericStream.onStanza","borogove/GenericStream.hx",42,0xe1a5f735)
+HX_LOCAL_STACK_FRAME(_hx_pos_b33ef4a473e70a2a_34_sendIq,"borogove.GenericStream","sendIq",0x22505b74,"borogove.GenericStream.sendIq","borogove/GenericStream.hx",34,0xe1a5f735)
+HX_LOCAL_STACK_FRAME(_hx_pos_b33ef4a473e70a2a_31_sendIq,"borogove.GenericStream","sendIq",0x22505b74,"borogove.GenericStream.sendIq","borogove/GenericStream.hx",31,0xe1a5f735)
+HX_LOCAL_STACK_FRAME(_hx_pos_b33ef4a473e70a2a_41_onStanza,"borogove.GenericStream","onStanza",0xa7ce5198,"borogove.GenericStream.onStanza","borogove/GenericStream.hx",41,0xe1a5f735)
 namespace borogove{
 
 void GenericStream_obj::__construct(){
@@ -54,60 +57,58 @@ HX_DEFINE_DYNAMIC_FUNC0(GenericStream_obj,disconnect,(void))
 
 HX_DEFINE_DYNAMIC_FUNC1(GenericStream_obj,sendStanza,(void))
 
-HX_DEFINE_DYNAMIC_FUNC0(GenericStream_obj,newId,return )
-
 HX_DEFINE_DYNAMIC_FUNC4(GenericStream_obj,onIq,(void))
 
 void GenericStream_obj::sendIq( ::borogove::Stanza stanza, ::Dynamic callback){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,callback) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic event){
-            			HX_STACKFRAME(&_hx_pos_b33ef4a473e70a2a_35_sendIq)
-HXLINE(  36)			callback( ::Dynamic(event->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic)));
-HXLINE(  37)			return ::borogove::EventResult_obj::EventHandled_dyn();
+            			HX_STACKFRAME(&_hx_pos_b33ef4a473e70a2a_34_sendIq)
+HXLINE(  35)			callback( ::Dynamic(event->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic)));
+HXLINE(  36)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_b33ef4a473e70a2a_32_sendIq)
-HXLINE(  33)		::String id = this->newId();
-HXLINE(  34)		::Reflect_obj::setField(stanza->attr,HX_("id",db,5b,00,00),id);
-HXLINE(  35)		this->once((HX_("iq-response/",a9,62,d4,cf) + id), ::Dynamic(new _hx_Closure_0(callback)));
-HXLINE(  39)		this->sendStanza(stanza);
+            	HX_STACKFRAME(&_hx_pos_b33ef4a473e70a2a_31_sendIq)
+HXLINE(  32)		::String id = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
+HXLINE(  33)		::Reflect_obj::setField(stanza->attr,HX_("id",db,5b,00,00),id);
+HXLINE(  34)		this->once((HX_("iq-response/",a9,62,d4,cf) + id), ::Dynamic(new _hx_Closure_0(callback)));
+HXLINE(  38)		this->sendStanza(stanza);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(GenericStream_obj,sendIq,(void))
 
 void GenericStream_obj::onStanza( ::borogove::Stanza stanza){
-            	HX_STACKFRAME(&_hx_pos_b33ef4a473e70a2a_42_onStanza)
-HXLINE(  43)		::haxe::Log_obj::trace(HX_("stanza received!",f5,75,78,a6),::hx::SourceInfo(HX_("borogove/GenericStream.hx",35,f7,a5,e1),43,HX_("borogove.GenericStream",ca,97,ee,7e),HX_("onStanza",74,54,a4,e5)));
-HXLINE(  45)		if ((( (::String)(::Reflect_obj::field(stanza->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("jabber:client",21,64,c5,e4))) {
-HXLINE(  46)			::String name = stanza->name;
-HXLINE(  47)			if ((name == HX_("iq",e8,5b,00,00))) {
-HXLINE(  48)				::String type = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) );
-HXLINE(  49)				::haxe::Log_obj::trace((HX_("type: ",e0,c7,36,57) + type),::hx::SourceInfo(HX_("borogove/GenericStream.hx",35,f7,a5,e1),49,HX_("borogove.GenericStream",ca,97,ee,7e),HX_("onStanza",74,54,a4,e5)));
-HXLINE(  50)				bool _hx_tmp;
-HXDLIN(  50)				if ((type != HX_("result",dd,68,84,08))) {
-HXLINE(  50)					_hx_tmp = (type == HX_("error",c8,cb,29,73));
+            	HX_STACKFRAME(&_hx_pos_b33ef4a473e70a2a_41_onStanza)
+HXLINE(  42)		::haxe::Log_obj::trace(HX_("stanza received!",f5,75,78,a6),::hx::SourceInfo(HX_("borogove/GenericStream.hx",35,f7,a5,e1),42,HX_("borogove.GenericStream",ca,97,ee,7e),HX_("onStanza",74,54,a4,e5)));
+HXLINE(  44)		if ((( (::String)(::Reflect_obj::field(stanza->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("jabber:client",21,64,c5,e4))) {
+HXLINE(  45)			::String name = stanza->name;
+HXLINE(  46)			if ((name == HX_("iq",e8,5b,00,00))) {
+HXLINE(  47)				::String type = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) );
+HXLINE(  48)				::haxe::Log_obj::trace((HX_("type: ",e0,c7,36,57) + type),::hx::SourceInfo(HX_("borogove/GenericStream.hx",35,f7,a5,e1),48,HX_("borogove.GenericStream",ca,97,ee,7e),HX_("onStanza",74,54,a4,e5)));
+HXLINE(  49)				bool _hx_tmp;
+HXDLIN(  49)				if ((type != HX_("result",dd,68,84,08))) {
+HXLINE(  49)					_hx_tmp = (type == HX_("error",c8,cb,29,73));
             				}
             				else {
-HXLINE(  50)					_hx_tmp = true;
+HXLINE(  49)					_hx_tmp = true;
             				}
-HXDLIN(  50)				if (_hx_tmp) {
-HXLINE(  52)					::String _hx_tmp1 = (HX_("iq-response/",a9,62,d4,cf) + ( (::String)(::Reflect_obj::field(stanza->attr,HX_("id",db,5b,00,00))) ));
-HXDLIN(  52)					this->trigger(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(1)
+HXDLIN(  49)				if (_hx_tmp) {
+HXLINE(  51)					::String _hx_tmp1 = (HX_("iq-response/",a9,62,d4,cf) + ( (::String)(::Reflect_obj::field(stanza->attr,HX_("id",db,5b,00,00))) ));
+HXDLIN(  51)					this->trigger(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("stanza",f5,5d,f7,05),stanza)));
             				}
             			}
             			else {
-HXLINE(  56)				bool _hx_tmp2;
-HXDLIN(  56)				if ((name != HX_("message",c7,35,11,9a))) {
-HXLINE(  56)					_hx_tmp2 = (name == HX_("presence",3b,52,d7,66));
+HXLINE(  55)				bool _hx_tmp2;
+HXDLIN(  55)				if ((name != HX_("message",c7,35,11,9a))) {
+HXLINE(  55)					_hx_tmp2 = (name == HX_("presence",3b,52,d7,66));
             				}
             				else {
-HXLINE(  56)					_hx_tmp2 = true;
+HXLINE(  55)					_hx_tmp2 = true;
             				}
-HXDLIN(  56)				if (_hx_tmp2) {
-HXLINE(  57)					this->trigger(name, ::Dynamic(::hx::Anon_obj::Create(1)
+HXDLIN(  55)				if (_hx_tmp2) {
+HXLINE(  56)					this->trigger(name, ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("stanza",f5,5d,f7,05),stanza)));
             				}
             			}
@@ -149,9 +150,6 @@ void GenericStream_obj::__Visit(HX_VISIT_PARAMS)
 	case 4:
 		if (HX_FIELD_EQ(inName,"onIq") ) { return ::hx::Val( onIq_dyn() ); }
 		break;
-	case 5:
-		if (HX_FIELD_EQ(inName,"newId") ) { return ::hx::Val( newId_dyn() ); }
-		break;
 	case 6:
 		if (HX_FIELD_EQ(inName,"sendIq") ) { return ::hx::Val( sendIq_dyn() ); }
 		break;
@@ -212,7 +210,6 @@ static ::String GenericStream_obj_sMemberFields[] = {
 	HX_("connect",ea,3b,80,15),
 	HX_("disconnect",5c,64,44,69),
 	HX_("sendStanza",5d,85,4d,a7),
-	HX_("newId",5b,e8,30,99),
 	HX_("onIq",e7,66,b2,49),
 	HX_("sendIq",50,af,84,6b),
 	HX_("onStanza",74,54,a4,e5),
diff --git a/Sources/c_borogove/src/borogove/Hash.cpp b/Sources/c_borogove/src/borogove/Hash.cpp
index ff19fa0..6cb539e 100644
--- a/Sources/c_borogove/src/borogove/Hash.cpp
+++ b/Sources/c_borogove/src/borogove/Hash.cpp
@@ -24,7 +24,7 @@
 #endif
 
 HX_DEFINE_STACK_FRAME(_hx_pos_44da733a4b4dd6a7_31_new,"borogove.Hash","new",0xd16baecd,"borogove.Hash.new","borogove/Hash.hx",31,0x70175b62)
-HX_LOCAL_STACK_FRAME(_hx_pos_cf3f028669fb61f2_450_algorithm__fromC,"borogove.Hash","algorithm__fromC",0xe5eca15d,"borogove.Hash.algorithm__fromC","HaxeCBridge.hx",450,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_cf3f028669fb61f2_478_algorithm__fromC,"borogove.Hash","algorithm__fromC",0xe5eca15d,"borogove.Hash.algorithm__fromC","HaxeCBridge.hx",478,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_44da733a4b4dd6a7_89_toUri,"borogove.Hash","toUri",0x41b8f05e,"borogove.Hash.toUri","borogove/Hash.hx",89,0x70175b62)
 HX_LOCAL_STACK_FRAME(_hx_pos_44da733a4b4dd6a7_98_bobUri,"borogove.Hash","bobUri",0x162eb02a,"borogove.Hash.bobUri","borogove/Hash.hx",98,0x70175b62)
 HX_LOCAL_STACK_FRAME(_hx_pos_44da733a4b4dd6a7_103_serializeUri,"borogove.Hash","serializeUri",0x8327dd5f,"borogove.Hash.serializeUri","borogove/Hash.hx",103,0x70175b62)
@@ -60,8 +60,8 @@ bool Hash_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String Hash_obj::algorithm__fromC(){
-            	HX_STACKFRAME(&_hx_pos_cf3f028669fb61f2_450_algorithm__fromC)
-HXDLIN( 450)		return this->algorithm;
+            	HX_STACKFRAME(&_hx_pos_cf3f028669fb61f2_478_algorithm__fromC)
+HXDLIN( 478)		return this->algorithm;
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/Html.cpp b/Sources/c_borogove/src/borogove/Html.cpp
new file mode 100644
index 0000000..95f5e4f
--- /dev/null
+++ b/Sources/c_borogove/src/borogove/Html.cpp
@@ -0,0 +1,1061 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_EReg
+#include <EReg.h>
+#endif
+#ifndef INCLUDED_Lambda
+#include <Lambda.h>
+#endif
+#ifndef INCLUDED_Reflect
+#include <Reflect.h>
+#endif
+#ifndef INCLUDED_Std
+#include <Std.h>
+#endif
+#ifndef INCLUDED_StringBuf
+#include <StringBuf.h>
+#endif
+#ifndef INCLUDED_StringTools
+#include <StringTools.h>
+#endif
+#ifndef INCLUDED_Xml
+#include <Xml.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_HaxeOpaqueArray_Impl_
+#include <_HaxeCBridge/HaxeOpaqueArray_Impl_.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_HaxeStringArray_Impl_
+#include <_HaxeCBridge/HaxeStringArray_Impl_.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_Internal
+#include <_HaxeCBridge/Internal.h>
+#endif
+#ifndef INCLUDED_borogove_Hash
+#include <borogove/Hash.h>
+#endif
+#ifndef INCLUDED_borogove_Html
+#include <borogove/Html.h>
+#endif
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
+#endif
+#ifndef INCLUDED_borogove_Node
+#include <borogove/Node.h>
+#endif
+#ifndef INCLUDED_borogove_Stanza
+#include <borogove/Stanza.h>
+#endif
+#ifndef INCLUDED_borogove_XEP0393
+#include <borogove/XEP0393.h>
+#endif
+#ifndef INCLUDED_borogove__Util_Util_Fields_
+#include <borogove/_Util/Util_Fields_.h>
+#endif
+#ifndef INCLUDED_cpp_Int64Map
+#include <cpp/Int64Map.h>
+#endif
+#ifndef INCLUDED_cpp__NativeString_NativeString_Impl_
+#include <cpp/_NativeString/NativeString_Impl_.h>
+#endif
+#ifndef INCLUDED_haxe_IMap
+#include <haxe/IMap.h>
+#endif
+#ifndef INCLUDED_haxe_xml_Printer
+#include <haxe/xml/Printer.h>
+#endif
+#ifndef INCLUDED_htmlparser_HtmlAttribute
+#include <htmlparser/HtmlAttribute.h>
+#endif
+#ifndef INCLUDED_htmlparser_HtmlNode
+#include <htmlparser/HtmlNode.h>
+#endif
+#ifndef INCLUDED_htmlparser_HtmlNodeElement
+#include <htmlparser/HtmlNodeElement.h>
+#endif
+#ifndef INCLUDED_htmlparser_HtmlNodeText
+#include <htmlparser/HtmlNodeText.h>
+#endif
+#ifndef INCLUDED_htmlparser_HtmlParser
+#include <htmlparser/HtmlParser.h>
+#endif
+
+HX_DEFINE_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_48_new,"borogove.Html","new",0xcef9a6ea,"borogove.Html.new","borogove/Html.hx",48,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_157_isPlainText,"borogove.Html","isPlainText",0x93f6e717,"borogove.Html.isPlainText","borogove/Html.hx",157,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_142_isPlainText,"borogove.Html","isPlainText",0x93f6e717,"borogove.Html.isPlainText","borogove/Html.hx",142,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_145_isPlainText,"borogove.Html","isPlainText",0x93f6e717,"borogove.Html.isPlainText","borogove/Html.hx",145,0x971c95e5)
+static const ::String _hx_array_data_de55a9f8_5[] = {
+	HX_("div",51,3d,4c,00),HX_("span",ca,da,58,4c),HX_("p",70,00,00,00),HX_("br",d0,55,00,00),
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_149_isPlainText,"borogove.Html","isPlainText",0x93f6e717,"borogove.Html.isPlainText","borogove/Html.hx",149,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_154_isPlainText,"borogove.Html","isPlainText",0x93f6e717,"borogove.Html.isPlainText","borogove/Html.hx",154,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_166_reduce,"borogove.Html","reduce",0xf3f5895c,"borogove.Html.reduce","borogove/Html.hx",166,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_163_reduce,"borogove.Html","reduce",0xf3f5895c,"borogove.Html.reduce","borogove/Html.hx",163,0x971c95e5)
+static const bool _hx_array_data_de55a9f8_13[] = {
+	0,
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_179_reduce,"borogove.Html","reduce",0xf3f5895c,"borogove.Html.reduce","borogove/Html.hx",179,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_199_reduce,"borogove.Html","reduce",0xf3f5895c,"borogove.Html.reduce","borogove/Html.hx",199,0x971c95e5)
+static const ::String _hx_array_data_de55a9f8_16[] = {
+	HX_("class",38,78,58,48),
+};
+static const ::String _hx_array_data_de55a9f8_17[] = {
+	HX_("action",b6,3b,46,16),
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_f22bfd6896666266_282_reduce__fromC,"borogove.Html","reduce__fromC",0xa2cb0a9d,"borogove.Html.reduce__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_f22bfd6896666266_363_reduce__fromC,"borogove.Html","reduce__fromC",0xa2cb0a9d,"borogove.Html.reduce__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_211_toString,"borogove.Html","toString",0xc02105e2,"borogove.Html.toString","borogove/Html.hx",211,0x971c95e5)
+static const ::String _hx_array_data_de55a9f8_23[] = {
+	HX_(" />",4f,71,18,00),
+};
+static const ::String _hx_array_data_de55a9f8_24[] = {
+	HX_(">",3e,00,00,00),
+};
+static const ::String _hx_array_data_de55a9f8_25[] = {
+	HX_("</",73,34,00,00),
+};
+static const ::String _hx_array_data_de55a9f8_26[] = {
+	HX_(">",3e,00,00,00),
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_249_toPlainText,"borogove.Html","toPlainText",0x1c5ba366,"borogove.Html.toPlainText","borogove/Html.hx",249,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_71_element,"borogove.Html","element",0xc0e99246,"borogove.Html.element","borogove/Html.hx",71,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_f22bfd6896666266_367_element__fromC,"borogove.Html","element__fromC",0xf80452f3,"borogove.Html.element__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_92_text,"borogove.Html","text",0x4f6faee3,"borogove.Html.text","borogove/Html.hx",92,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_99_fragment,"borogove.Html","fragment",0x35979506,"borogove.Html.fragment","borogove/Html.hx",99,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_f22bfd6896666266_367_fragment__fromC,"borogove.Html","fragment__fromC",0xdfd02833,"borogove.Html.fragment__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_105_fromString,"borogove.Html","fromString",0xd5069c91,"borogove.Html.fromString","borogove/Html.hx",105,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_120_htmlToNode,"borogove.Html","htmlToNode",0xcd174f9e,"borogove.Html.htmlToNode","borogove/Html.hx",120,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_25_boot,"borogove.Html","boot",0x43916668,"borogove.Html.boot","borogove/Html.hx",25,0x971c95e5)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f2f37b33fdbbbfb_26_boot,"borogove.Html","boot",0x43916668,"borogove.Html.boot","borogove/Html.hx",26,0x971c95e5)
+static const ::String _hx_array_data_de55a9f8_50[] = {
+	HX_("area",8d,8b,74,40),HX_("base",11,e8,10,41),HX_("br",d0,55,00,00),HX_("col",40,80,4b,00),HX_("embed",d9,8d,cf,6f),HX_("hr",0a,5b,00,00),HX_("img",03,0c,50,00),HX_("input",0a,c4,1d,be),HX_("link",fa,17,b3,47),HX_("meta",c5,4a,59,48),HX_("param",8d,80,55,bd),HX_("source",db,b0,31,32),HX_("track",8b,8e,1f,16),HX_("wbr",07,a2,5a,00),
+};
+namespace borogove{
+
+void Html_obj::__construct(::Array< ::Dynamic> xml, ::borogove::Member sender){
+            	HX_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_48_new)
+HXLINE(  49)		this->xml = xml;
+HXLINE(  50)		this->sender = sender;
+            	}
+
+Dynamic Html_obj::__CreateEmpty() { return new Html_obj; }
+
+void *Html_obj::_hx_vtable = 0;
+
+Dynamic Html_obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< Html_obj > _hx_result = new Html_obj();
+	_hx_result->__construct(inArgs[0],inArgs[1]);
+	return _hx_result;
+}
+
+bool Html_obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x2e26b4ec;
+}
+
+bool Html_obj::isPlainText(){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_3) HXARGC(1)
+            		bool _hx_run(bool plain){
+            			HX_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_157_isPlainText)
+HXLINE( 157)			return !(plain);
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_142_isPlainText)
+HXDLIN( 142)		::Array< ::Dynamic> _this = this->xml;
+HXDLIN( 142)		::Array< bool > result = ::Array_obj< bool >::__new(_this->length);
+HXDLIN( 142)		{
+HXDLIN( 142)			int _g = 0;
+HXDLIN( 142)			int _g1 = _this->length;
+HXDLIN( 142)			while((_g < _g1)){
+HXDLIN( 142)				_g = (_g + 1);
+HXDLIN( 142)				int i = (_g - 1);
+HXDLIN( 142)				{
+HXDLIN( 142)					 ::borogove::Node item = _hx_array_unsafe_get(_this,i);
+HXDLIN( 142)					bool inValue;
+HXDLIN( 142)					switch((int)(item->_hx_getIndex())){
+            						case (int)0: {
+            							HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(2)
+            							bool _hx_run( ::borogove::Stanza st,::Array< bool > kids){
+            								HX_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_145_isPlainText)
+HXLINE( 146)								::Array< ::String > attrs = ::Reflect_obj::fields(st->attr);
+HXLINE( 148)								if (::Array_obj< ::String >::fromData( _hx_array_data_de55a9f8_5,4)->contains(st->name)) {
+HXLINE( 149)									if ((attrs->length < 1)) {
+            										HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            										bool _hx_run(bool plain){
+            											HX_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_149_isPlainText)
+HXLINE( 149)											return !(plain);
+            										}
+            										HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 149)										return !(::Lambda_obj::exists(kids, ::Dynamic(new _hx_Closure_0())));
+            									}
+            									else {
+HXLINE( 149)										return false;
+            									}
+            								}
+HXLINE( 152)								return false;
+            							}
+            							HX_END_LOCAL_FUNC2(return)
+
+            							HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(1)
+            							bool _hx_run(::String txt){
+            								HX_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_154_isPlainText)
+HXLINE( 154)								return true;
+            							}
+            							HX_END_LOCAL_FUNC1(return)
+
+HXDLIN( 142)							inValue = ( (bool)(item->_hx_getObject(0).StaticCast<  ::borogove::Stanza >()->reduce( ::Dynamic(new _hx_Closure_1()), ::Dynamic(new _hx_Closure_2()))) );
+            						}
+            						break;
+            						case (int)1: {
+HXDLIN( 142)							inValue = true;
+            						}
+            						break;
+            					}
+HXDLIN( 142)					result->__unsafe_set(i,inValue);
+            				}
+            			}
+            		}
+HXDLIN( 142)		return !(::Lambda_obj::exists(result, ::Dynamic(new _hx_Closure_3())));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Html_obj,isPlainText,return )
+
+::cpp::VirtualArray Html_obj::reduce( ::Dynamic f){
+            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::Html,_gthis, ::Dynamic,f,::Array< bool >,isAction) HXARGC(1)
+            		 ::Dynamic _hx_run(::String txt){
+            			HX_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_166_reduce)
+HXLINE( 167)			 ::borogove::Member senderP = _gthis->sender;
+HXLINE( 168)			bool mkTxt;
+HXDLIN( 168)			bool mkTxt1;
+HXDLIN( 168)			if (!(isAction->__get(0))) {
+HXLINE( 168)				mkTxt1 = ::StringTools_obj::startsWith(txt,HX_("/me ",f9,14,64,1f));
+            			}
+            			else {
+HXLINE( 168)				mkTxt1 = false;
+            			}
+HXDLIN( 168)			if (mkTxt1) {
+HXLINE( 168)				mkTxt = ::hx::IsNotNull( senderP );
+            			}
+            			else {
+HXLINE( 168)				mkTxt = false;
+            			}
+HXDLIN( 168)			if (mkTxt) {
+HXLINE( 169)				isAction[0] = true;
+HXLINE( 170)				 ::Dynamic f1 = f;
+HXDLIN( 170)				::String senderP1 = senderP->displayName;
+HXDLIN( 170)				return f1((senderP1 + txt.substr(3,null())),null(),null(),null());
+            			}
+            			else {
+HXLINE( 172)				return f(txt,null(),null(),null());
+            			}
+HXLINE( 168)			return null();
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_163_reduce)
+HXDLIN( 163)		 ::borogove::Html _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 164)		::Array< bool > isAction = ::Array_obj< bool >::fromData( _hx_array_data_de55a9f8_13,1);
+HXLINE( 166)		 ::Dynamic mkTxt =  ::Dynamic(new _hx_Closure_0(_gthis,f,isAction));
+HXLINE( 176)		::Array< ::Dynamic> _this = this->xml;
+HXDLIN( 176)		::cpp::VirtualArray result = ::cpp::VirtualArray_obj::__new(_this->length);
+HXDLIN( 176)		{
+HXLINE( 176)			int _g = 0;
+HXDLIN( 176)			int _g1 = _this->length;
+HXDLIN( 176)			while((_g < _g1)){
+HXLINE( 176)				_g = (_g + 1);
+HXDLIN( 176)				int i = (_g - 1);
+HXDLIN( 176)				{
+HXLINE( 176)					 ::borogove::Node item = _hx_array_unsafe_get(_this,i);
+HXDLIN( 176)					 ::Dynamic inValue;
+HXDLIN( 176)					switch((int)(item->_hx_getIndex())){
+            						case (int)0: {
+            							HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::Dynamic,f, ::Dynamic,mkTxt) HXARGC(2)
+            							 ::Dynamic _hx_run( ::borogove::Stanza st,::cpp::VirtualArray kids){
+            								HX_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_179_reduce)
+HXLINE( 181)								bool inValue;
+HXDLIN( 181)								if ((st->name != HX_("style",31,a5,1d,84))) {
+HXLINE( 181)									inValue = (st->name == HX_("script",0b,4e,60,47));
+            								}
+            								else {
+HXLINE( 181)									inValue = true;
+            								}
+HXDLIN( 181)								if (inValue) {
+HXLINE( 181)									return mkTxt(HX_("",00,00,00,00));
+            								}
+HXLINE( 183)								::Array< ::String > _this = ::Reflect_obj::fields(st->attr);
+HXDLIN( 183)								::Array< ::String > _g = ::Array_obj< ::String >::__new(0);
+HXDLIN( 183)								{
+HXLINE( 183)									int _g1 = 0;
+HXDLIN( 183)									while((_g1 < _this->length)){
+HXLINE( 183)										::String v = _this->__get(_g1);
+HXDLIN( 183)										_g1 = (_g1 + 1);
+HXDLIN( 183)										if (!(::StringTools_obj::startsWith(v,HX_("on",1f,61,00,00)))) {
+HXLINE( 183)											_g->push(v);
+            										}
+            									}
+            								}
+HXLINE( 184)								 ::Dynamic f1 = f;
+HXLINE( 185)								::String st1 = st->name;
+HXLINE( 187)								::Array< ::String > result = ::Array_obj< ::String >::__new(_g->length);
+HXDLIN( 187)								{
+HXLINE( 187)									int _g2 = 0;
+HXDLIN( 187)									int _g3 = _g->length;
+HXDLIN( 187)									while((_g2 < _g3)){
+HXLINE( 187)										_g2 = (_g2 + 1);
+HXDLIN( 187)										int i = (_g2 - 1);
+HXDLIN( 187)										{
+HXLINE( 187)											::String k = ( (::String)(_hx_array_unsafe_get(_g,i)) );
+HXLINE( 188)											::String v1;
+HXDLIN( 188)											::String tmp = ( (::String)(::Reflect_obj::field(st->attr,k)) );
+HXDLIN( 188)											if (::hx::IsNotNull( tmp )) {
+HXLINE( 188)												v1 = tmp;
+            											}
+            											else {
+HXLINE( 188)												v1 = HX_("",00,00,00,00);
+            											}
+HXLINE( 187)											::String inValue1;
+HXLINE( 189)											bool inValue2;
+HXDLIN( 189)											bool inValue3;
+HXDLIN( 189)											if ((st->name == HX_("img",03,0c,50,00))) {
+HXLINE( 189)												inValue3 = (k == HX_("src",e4,a6,57,00));
+            											}
+            											else {
+HXLINE( 189)												inValue3 = false;
+            											}
+HXDLIN( 189)											if (inValue3) {
+HXLINE( 189)												inValue2 = (v1 != HX_("",00,00,00,00));
+            											}
+            											else {
+HXLINE( 189)												inValue2 = false;
+            											}
+HXDLIN( 189)											if (inValue2) {
+HXLINE( 190)												 ::borogove::Hash hash = ::borogove::Hash_obj::fromUri(v1);
+HXLINE( 191)												if (::hx::IsNull( hash )) {
+HXLINE( 187)													inValue1 = v1;
+            												}
+            												else {
+HXLINE( 187)													inValue1 = hash->toUri();
+            												}
+            											}
+            											else {
+HXLINE( 187)												inValue1 = v1;
+            											}
+HXDLIN( 187)											result->__unsafe_set(i,inValue1);
+            										}
+            									}
+            								}
+HXLINE( 184)								return f1(st1,_g,result,kids);
+            							}
+            							HX_END_LOCAL_FUNC2(return)
+
+            							HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::Dynamic,mkTxt) HXARGC(1)
+            							 ::Dynamic _hx_run(::String txt){
+            								HX_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_199_reduce)
+HXLINE( 199)								return mkTxt(txt);
+            							}
+            							HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 176)							inValue = item->_hx_getObject(0).StaticCast<  ::borogove::Stanza >()->reduce( ::Dynamic(new _hx_Closure_1(f,mkTxt)), ::Dynamic(new _hx_Closure_2(mkTxt)));
+            						}
+            						break;
+            						case (int)1: {
+HXLINE( 176)							inValue = mkTxt(item->_hx_getString(0));
+            						}
+            						break;
+            					}
+HXDLIN( 176)					result->__unsafe_set(i,inValue);
+            				}
+            			}
+            		}
+HXLINE( 204)		if (isAction->__get(0)) {
+HXLINE( 204)			return ::cpp::VirtualArray_obj::__new(1)->init(0,f(HX_("div",51,3d,4c,00),::Array_obj< ::String >::fromData( _hx_array_data_de55a9f8_16,1),::Array_obj< ::String >::fromData( _hx_array_data_de55a9f8_17,1),result));
+            		}
+            		else {
+HXLINE( 204)			return result;
+            		}
+HXDLIN( 204)		return null();
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(Html_obj,reduce,return )
+
+size_t Html_obj::reduce__fromC(::cpp::Function< void*  (const char*,const char**,ptrdiff_t,const char**,ptrdiff_t,void**,ptrdiff_t,void*) > f,void* f__context,void*** outPtr){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void*  (const char* HX_COMMA const char** HX_COMMA ptrdiff_t HX_COMMA const char** HX_COMMA ptrdiff_t HX_COMMA void** HX_COMMA ptrdiff_t HX_COMMA void*) >,f,void*,f__context) HXARGC(4)
+            		 ::Dynamic _hx_run(::String a0,::Array< ::String > a1,::Array< ::String > a2,::cpp::VirtualArray a3){
+            			HX_STACKFRAME(&_hx_pos_f22bfd6896666266_282_reduce__fromC)
+HXLINE( 255)			const char* cStrPtr = a0.utf8_str();
+HXDLIN( 255)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
+HXDLIN( 255)			{
+HXLINE( 255)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 255)				if (::hx::IsNull( store )) {
+HXLINE( 255)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            						->setFixed(1,HX_("value",71,7f,b8,31),a0));
+HXDLIN( 255)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            				}
+            				else {
+HXLINE( 255)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            				}
+            			}
+HXLINE( 251)			const char** x1 = ::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(a1);
+HXDLIN( 251)			int xl1;
+HXDLIN( 251)			 ::Dynamic tmp;
+HXDLIN( 251)			if (::hx::IsNotNull( a1 )) {
+HXLINE( 251)				tmp = a1->length;
+            			}
+            			else {
+HXLINE( 251)				tmp = null();
+            			}
+HXDLIN( 251)			if (::hx::IsNotNull( tmp )) {
+HXLINE( 251)				xl1 = ( (int)(tmp) );
+            			}
+            			else {
+HXLINE( 251)				xl1 = -1;
+            			}
+HXDLIN( 251)			const char** x2 = ::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(a2);
+HXDLIN( 251)			int xl2;
+HXDLIN( 251)			 ::Dynamic tmp1;
+HXDLIN( 251)			if (::hx::IsNotNull( a2 )) {
+HXLINE( 251)				tmp1 = a2->length;
+            			}
+            			else {
+HXLINE( 251)				tmp1 = null();
+            			}
+HXDLIN( 251)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 251)				xl2 = ( (int)(tmp1) );
+            			}
+            			else {
+HXLINE( 251)				xl2 = -1;
+            			}
+HXDLIN( 251)			void** x3 = ::_HaxeCBridge::HaxeOpaqueArray_Impl__obj::fromNullableArrayT(a3);
+HXDLIN( 251)			int xl3;
+HXDLIN( 251)			 ::Dynamic tmp2;
+HXDLIN( 251)			if (::hx::IsNotNull( a3 )) {
+HXLINE( 251)				tmp2 = a3->get_length();
+            			}
+            			else {
+HXLINE( 251)				tmp2 = null();
+            			}
+HXDLIN( 251)			if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 251)				xl3 = ( (int)(tmp2) );
+            			}
+            			else {
+HXLINE( 251)				xl3 = -1;
+            			}
+HXLINE( 277)			return ::cpp::Pointer_obj::fromRaw(f(cStrPtr,x1,( (ptrdiff_t)(xl1) ),x2,( (ptrdiff_t)(xl2) ),x3,( (ptrdiff_t)(xl3) ),f__context));
+            		}
+            		HX_END_LOCAL_FUNC4(return)
+
+            	HX_STACKFRAME(&_hx_pos_f22bfd6896666266_363_reduce__fromC)
+HXDLIN( 363)		::cpp::VirtualArray out = this->reduce( ::Dynamic(new _hx_Closure_0(f,f__context)));
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeOpaqueArray_Impl__obj::fromNullableArrayT(out));
+            		}
+HXDLIN( 363)		return ( (size_t)(out->get_length()) );
+            	}
+
+
+::String Html_obj::toString(){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(4)
+            		::String _hx_run(::String tag,::Array< ::String > attr,::Array< ::String > attrValue,::Array< ::String > kids){
+            			HX_GC_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_211_toString)
+HXLINE( 212)			bool _hx_tmp;
+HXDLIN( 212)			if (::hx::IsNull( attr )) {
+HXLINE( 212)				_hx_tmp = ::hx::IsNull( kids );
+            			}
+            			else {
+HXLINE( 212)				_hx_tmp = false;
+            			}
+HXDLIN( 212)			if (_hx_tmp) {
+HXLINE( 213)				return ::StringTools_obj::htmlEscape(tag,null());
+            			}
+            			else {
+HXLINE( 214)				bool _hx_tmp1;
+HXDLIN( 214)				if (::hx::IsNotNull( attr )) {
+HXLINE( 214)					_hx_tmp1 = ::hx::IsNotNull( attrValue );
+            				}
+            				else {
+HXLINE( 214)					_hx_tmp1 = false;
+            				}
+HXDLIN( 214)				if (_hx_tmp1) {
+HXLINE( 215)					 ::Xml el = ::Xml_obj::createElement(tag);
+HXLINE( 216)					{
+HXLINE( 216)						int _g_current = 0;
+HXDLIN( 216)						while((_g_current < attr->length)){
+HXLINE( 216)							::String _g_value = attr->__get(_g_current);
+HXDLIN( 216)							_g_current = (_g_current + 1);
+HXLINE( 217)							el->set(_g_value,attrValue->__get((_g_current - 1)));
+            						}
+            					}
+HXLINE( 220)					::String start = ::haxe::xml::Printer_obj::print(el,null());
+HXLINE( 221)					 ::StringBuf buffer =  ::StringBuf_obj::__alloc( HX_CTX );
+HXLINE( 222)					{
+HXLINE( 222)						 ::Dynamic len = (start.length - 2);
+HXDLIN( 222)						if (::hx::IsNotNull( buffer->charBuf )) {
+HXLINE( 222)							buffer->flush();
+            						}
+HXDLIN( 222)						if (::hx::IsNull( buffer->b )) {
+HXLINE( 222)							buffer->b = ::Array_obj< ::String >::__new(1)->init(0,start.substr(0,len));
+            						}
+            						else {
+HXLINE( 222)							::Array< ::String > buffer1 = buffer->b;
+HXDLIN( 222)							buffer1->push(start.substr(0,len));
+            						}
+            					}
+HXLINE( 224)					if (::borogove::Html_obj::HTML_EMPTY->contains(tag)) {
+HXLINE( 225)						{
+HXLINE( 225)							if (::hx::IsNotNull( buffer->charBuf )) {
+HXLINE( 225)								buffer->flush();
+            							}
+HXDLIN( 225)							if (::hx::IsNull( buffer->b )) {
+HXLINE( 225)								buffer->b = ::Array_obj< ::String >::fromData( _hx_array_data_de55a9f8_23,1);
+            							}
+            							else {
+HXLINE( 225)								buffer->b->push(HX_(" />",4f,71,18,00));
+            							}
+            						}
+HXLINE( 226)						return buffer->toString();
+            					}
+HXLINE( 229)					{
+HXLINE( 229)						if (::hx::IsNotNull( buffer->charBuf )) {
+HXLINE( 229)							buffer->flush();
+            						}
+HXDLIN( 229)						if (::hx::IsNull( buffer->b )) {
+HXLINE( 229)							buffer->b = ::Array_obj< ::String >::fromData( _hx_array_data_de55a9f8_24,1);
+            						}
+            						else {
+HXLINE( 229)							buffer->b->push(HX_(">",3e,00,00,00));
+            						}
+            					}
+HXLINE( 230)					if (::hx::IsNotNull( kids )) {
+HXLINE( 231)						int _g = 0;
+HXDLIN( 231)						while((_g < kids->length)){
+HXLINE( 231)							::String kid = kids->__get(_g);
+HXDLIN( 231)							_g = (_g + 1);
+HXLINE( 232)							{
+HXLINE( 232)								if (::hx::IsNotNull( buffer->charBuf )) {
+HXLINE( 232)									buffer->flush();
+            								}
+HXDLIN( 232)								if (::hx::IsNull( buffer->b )) {
+HXLINE( 232)									buffer->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(kid));
+            								}
+            								else {
+HXLINE( 232)									::Array< ::String > buffer2 = buffer->b;
+HXDLIN( 232)									buffer2->push(::Std_obj::string(kid));
+            								}
+            							}
+            						}
+            					}
+HXLINE( 236)					{
+HXLINE( 236)						if (::hx::IsNotNull( buffer->charBuf )) {
+HXLINE( 236)							buffer->flush();
+            						}
+HXDLIN( 236)						if (::hx::IsNull( buffer->b )) {
+HXLINE( 236)							buffer->b = ::Array_obj< ::String >::fromData( _hx_array_data_de55a9f8_25,1);
+            						}
+            						else {
+HXLINE( 236)							buffer->b->push(HX_("</",73,34,00,00));
+            						}
+            					}
+HXLINE( 237)					{
+HXLINE( 237)						if (::hx::IsNotNull( buffer->charBuf )) {
+HXLINE( 237)							buffer->flush();
+            						}
+HXDLIN( 237)						if (::hx::IsNull( buffer->b )) {
+HXLINE( 237)							buffer->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(tag));
+            						}
+            						else {
+HXLINE( 237)							::Array< ::String > buffer3 = buffer->b;
+HXDLIN( 237)							buffer3->push(::Std_obj::string(tag));
+            						}
+            					}
+HXLINE( 238)					{
+HXLINE( 238)						if (::hx::IsNotNull( buffer->charBuf )) {
+HXLINE( 238)							buffer->flush();
+            						}
+HXDLIN( 238)						if (::hx::IsNull( buffer->b )) {
+HXLINE( 238)							buffer->b = ::Array_obj< ::String >::fromData( _hx_array_data_de55a9f8_26,1);
+            						}
+            						else {
+HXLINE( 238)							buffer->b->push(HX_(">",3e,00,00,00));
+            						}
+            					}
+HXLINE( 239)					return buffer->toString();
+            				}
+            			}
+HXLINE( 242)			HX_STACK_DO_THROW(HX_("Invalid arguments",cd,d0,61,11));
+HXDLIN( 242)			return null();
+            		}
+            		HX_END_LOCAL_FUNC4(return)
+
+            	HX_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_211_toString)
+HXDLIN( 211)		return this->reduce( ::Dynamic(new _hx_Closure_0()))->join(HX_("",00,00,00,00));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Html_obj,toString,return )
+
+::String Html_obj::toPlainText(){
+            	HX_GC_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_249_toPlainText)
+HXLINE( 251)		 ::borogove::Stanza body =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("body",a2,7a,1b,41),null());
+HXLINE( 252)		body->addChildNodes(this->xml);
+HXLINE( 253)		 ::EReg _hx_tmp =  ::EReg_obj::__alloc( HX_CTX ,HX_("\n(\n)?$",82,45,54,0e),HX_("",00,00,00,00));
+HXDLIN( 253)		return _hx_tmp->replace(::borogove::XEP0393_obj::render(body,null(),null(),null()),HX_("",00,00,00,00));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Html_obj,toPlainText,return )
+
+::Array< ::String > Html_obj::HTML_EMPTY;
+
+ ::borogove::Html Html_obj::element(::String tag,::Array< ::String > attr,::Array< ::String > attrValues,::Array< ::Dynamic> children){
+            	HX_GC_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_71_element)
+HXLINE(  72)		 ::Dynamic attrs =  ::Dynamic(::hx::Anon_obj::Create(0));
+HXLINE(  73)		{
+HXLINE(  73)			int _g_current = 0;
+HXDLIN(  73)			while((_g_current < attr->length)){
+HXLINE(  73)				::String _g_value = attr->__get(_g_current);
+HXDLIN(  73)				_g_current = (_g_current + 1);
+HXLINE(  74)				::Reflect_obj::setField(attrs,_g_value,attrValues->__get((_g_current - 1)));
+            			}
+            		}
+HXLINE(  77)		 ::borogove::Stanza s =  ::borogove::Stanza_obj::__alloc( HX_CTX ,tag,attrs);
+HXLINE(  78)		{
+HXLINE(  78)			int _g = 0;
+HXDLIN(  78)			while((_g < children->length)){
+HXLINE(  78)				 ::borogove::Html c = children->__get(_g).StaticCast<  ::borogove::Html >();
+HXDLIN(  78)				_g = (_g + 1);
+HXLINE(  79)				{
+HXLINE(  79)					int _g1 = 0;
+HXDLIN(  79)					::Array< ::Dynamic> _g2 = c->xml;
+HXDLIN(  79)					while((_g1 < _g2->length)){
+HXLINE(  79)						 ::borogove::Node n = _g2->__get(_g1).StaticCast<  ::borogove::Node >();
+HXDLIN(  79)						_g1 = (_g1 + 1);
+HXLINE(  80)						s->addDirectChild(n);
+            					}
+            				}
+            			}
+            		}
+HXLINE(  84)		return  ::borogove::Html_obj::__alloc( HX_CTX ,::Array_obj< ::Dynamic>::__new(1)->init(0,::borogove::Node_obj::Element(s)),null());
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC4(Html_obj,element,return )
+
+ ::borogove::Html Html_obj::element__fromC(::String tag,::cpp::Pointer< const char* > attr,size_t attr__len,::cpp::Pointer< const char* > attrValues,size_t attrValues__len,::cpp::Pointer< void* > children,size_t children__len){
+            	HX_STACKFRAME(&_hx_pos_f22bfd6896666266_367_element__fromC)
+HXLINE( 300)		::Array< ::String > _hx_tmp;
+HXDLIN( 300)		if (::hx::IsNull( attr )) {
+HXLINE( 300)			_hx_tmp = ::Array_obj< ::String >::__new(0);
+            		}
+            		else {
+HXLINE( 300)			::cpp::Pointer< ::cpp::Pointer< char > > _this = attr->reinterpret();
+HXDLIN( 300)			::Array< ::cpp::Pointer< char > > result = ::Array_obj< ::cpp::Pointer< char > >::__new();
+HXDLIN( 300)			::cpp::Pointer< ::cpp::Pointer< char > > tmp = _this;
+HXDLIN( 300)			result->setUnmanagedData(tmp,( (int)(attr__len) ));
+HXDLIN( 300)			 ::Dynamic f = ::cpp::_NativeString::NativeString_Impl__obj::fromPointer_dyn();
+HXDLIN( 300)			::Array< ::String > result1 = ::Array_obj< ::String >::__new(result->length);
+HXDLIN( 300)			{
+HXLINE( 300)				int _g = 0;
+HXDLIN( 300)				int _g1 = result->length;
+HXDLIN( 300)				while((_g < _g1)){
+HXLINE( 300)					_g = (_g + 1);
+HXDLIN( 300)					int i = (_g - 1);
+HXDLIN( 300)					{
+HXLINE( 300)						::cpp::Pointer< char > tmp1 = _hx_array_unsafe_get(result,i);
+HXDLIN( 300)						::String inValue = ( (::String)(f(tmp1)) );
+HXDLIN( 300)						result1->__unsafe_set(i,inValue);
+            					}
+            				}
+            			}
+HXDLIN( 300)			_hx_tmp = result1->copy();
+            		}
+HXDLIN( 300)		::Array< ::String > _hx_tmp1;
+HXDLIN( 300)		if (::hx::IsNull( attrValues )) {
+HXLINE( 300)			_hx_tmp1 = ::Array_obj< ::String >::__new(0);
+            		}
+            		else {
+HXLINE( 300)			::cpp::Pointer< ::cpp::Pointer< char > > _this1 = attrValues->reinterpret();
+HXDLIN( 300)			::Array< ::cpp::Pointer< char > > result2 = ::Array_obj< ::cpp::Pointer< char > >::__new();
+HXDLIN( 300)			::cpp::Pointer< ::cpp::Pointer< char > > tmp2 = _this1;
+HXDLIN( 300)			result2->setUnmanagedData(tmp2,( (int)(attrValues__len) ));
+HXDLIN( 300)			 ::Dynamic f1 = ::cpp::_NativeString::NativeString_Impl__obj::fromPointer_dyn();
+HXDLIN( 300)			::Array< ::String > result3 = ::Array_obj< ::String >::__new(result2->length);
+HXDLIN( 300)			{
+HXLINE( 300)				int _g2 = 0;
+HXDLIN( 300)				int _g3 = result2->length;
+HXDLIN( 300)				while((_g2 < _g3)){
+HXLINE( 300)					_g2 = (_g2 + 1);
+HXDLIN( 300)					int i1 = (_g2 - 1);
+HXDLIN( 300)					{
+HXLINE( 300)						::cpp::Pointer< char > tmp3 = _hx_array_unsafe_get(result2,i1);
+HXDLIN( 300)						::String inValue1 = ( (::String)(f1(tmp3)) );
+HXDLIN( 300)						result3->__unsafe_set(i1,inValue1);
+            					}
+            				}
+            			}
+HXDLIN( 300)			_hx_tmp1 = result3->copy();
+            		}
+HXLINE( 302)		::Array< ::Dynamic> _hx_tmp2;
+HXDLIN( 302)		if (::hx::IsNull( children )) {
+HXLINE( 302)			_hx_tmp2 = ::Array_obj< ::Dynamic>::__new(0);
+            		}
+            		else {
+HXLINE( 302)			::cpp::Pointer<  ::borogove::Html > _this2 = children->reinterpret();
+HXDLIN( 302)			::Array< ::Dynamic> result4 = ::Array_obj< ::Dynamic>::__new();
+HXDLIN( 302)			::cpp::Pointer<  ::borogove::Html > tmp4 = _this2;
+HXDLIN( 302)			result4->setUnmanagedData(tmp4,( (int)(children__len) ));
+HXDLIN( 302)			_hx_tmp2 = result4->copy();
+            		}
+HXLINE( 367)		return ::borogove::Html_obj::element(tag,_hx_tmp,_hx_tmp1,_hx_tmp2);
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC7(Html_obj,element__fromC,return )
+
+ ::borogove::Html Html_obj::text(::String text){
+            	HX_GC_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_92_text)
+HXDLIN(  92)		return  ::borogove::Html_obj::__alloc( HX_CTX ,::Array_obj< ::Dynamic>::__new(1)->init(0,::borogove::Node_obj::CData(text)),null());
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Html_obj,text,return )
+
+ ::borogove::Html Html_obj::fragment(::Array< ::Dynamic> nodes){
+            	HX_GC_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_99_fragment)
+HXDLIN(  99)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(nodes->length);
+HXDLIN(  99)		{
+HXDLIN(  99)			int _g = 0;
+HXDLIN(  99)			int _g1 = nodes->length;
+HXDLIN(  99)			while((_g < _g1)){
+HXDLIN(  99)				_g = (_g + 1);
+HXDLIN(  99)				int i = (_g - 1);
+HXDLIN(  99)				{
+HXDLIN(  99)					::Array< ::Dynamic> inValue = ( ( ::borogove::Html)(_hx_array_unsafe_get(nodes,i)) )->xml;
+HXDLIN(  99)					result->__unsafe_set(i,inValue);
+            				}
+            			}
+            		}
+HXDLIN(  99)		::Array< ::Dynamic> _g2 = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN(  99)		{
+HXDLIN(  99)			 ::Dynamic e = result->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN(  99)			while(( (bool)(e->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXDLIN(  99)				 ::Dynamic x = e->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN(  99)				while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXDLIN(  99)					_g2->push(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+            				}
+            			}
+            		}
+HXDLIN(  99)		return  ::borogove::Html_obj::__alloc( HX_CTX ,_g2,null());
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Html_obj,fragment,return )
+
+ ::borogove::Html Html_obj::fragment__fromC(::cpp::Pointer< void* > nodes,size_t nodes__len){
+            	HX_STACKFRAME(&_hx_pos_f22bfd6896666266_367_fragment__fromC)
+HXLINE( 302)		::Array< ::Dynamic> _hx_tmp;
+HXDLIN( 302)		if (::hx::IsNull( nodes )) {
+HXLINE( 302)			_hx_tmp = ::Array_obj< ::Dynamic>::__new(0);
+            		}
+            		else {
+HXLINE( 302)			::cpp::Pointer<  ::borogove::Html > _this = nodes->reinterpret();
+HXDLIN( 302)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new();
+HXDLIN( 302)			::cpp::Pointer<  ::borogove::Html > tmp = _this;
+HXDLIN( 302)			result->setUnmanagedData(tmp,( (int)(nodes__len) ));
+HXDLIN( 302)			_hx_tmp = result->copy();
+            		}
+HXLINE( 367)		return ::borogove::Html_obj::fragment(_hx_tmp);
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC2(Html_obj,fragment__fromC,return )
+
+ ::borogove::Html Html_obj::fromString(::String html){
+            	HX_GC_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_105_fromString)
+HXLINE( 106)		::Array< ::Dynamic> nodes = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 107)		{
+HXLINE( 107)			int _g = 0;
+HXDLIN( 107)			::Array< ::Dynamic> _g1 = ::htmlparser::HtmlParser_obj::run(html,true);
+HXDLIN( 107)			while((_g < _g1->length)){
+HXLINE( 107)				 ::htmlparser::HtmlNode node = _g1->__get(_g).StaticCast<  ::htmlparser::HtmlNode >();
+HXDLIN( 107)				_g = (_g + 1);
+HXLINE( 108)				 ::htmlparser::HtmlNodeElement el = ( ( ::htmlparser::HtmlNodeElement)(::borogove::_Util::Util_Fields__obj::downcast(node,::hx::ClassOf< ::htmlparser::HtmlNodeElement >())) );
+HXLINE( 109)				bool _hx_tmp;
+HXDLIN( 109)				if (::hx::IsNotNull( el )) {
+HXLINE( 109)					if ((el->name != HX_("html",6b,95,16,45))) {
+HXLINE( 109)						_hx_tmp = (el->name == HX_("body",a2,7a,1b,41));
+            					}
+            					else {
+HXLINE( 109)						_hx_tmp = true;
+            					}
+            				}
+            				else {
+HXLINE( 109)					_hx_tmp = false;
+            				}
+HXDLIN( 109)				if (_hx_tmp) {
+HXLINE( 110)					int _g2 = 0;
+HXDLIN( 110)					::Array< ::Dynamic> _g3 = el->nodes;
+HXDLIN( 110)					while((_g2 < _g3->length)){
+HXLINE( 110)						 ::htmlparser::HtmlNode inner = _g3->__get(_g2).StaticCast<  ::htmlparser::HtmlNode >();
+HXDLIN( 110)						_g2 = (_g2 + 1);
+HXLINE( 111)						nodes->push(::borogove::Html_obj::htmlToNode(inner));
+            					}
+            				}
+            				else {
+HXLINE( 114)					nodes->push(::borogove::Html_obj::htmlToNode(node));
+            				}
+            			}
+            		}
+HXLINE( 117)		return  ::borogove::Html_obj::__alloc( HX_CTX ,nodes,null());
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Html_obj,fromString,return )
+
+ ::borogove::Node Html_obj::htmlToNode( ::htmlparser::HtmlNode node){
+            	HX_GC_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_120_htmlToNode)
+HXLINE( 121)		 ::htmlparser::HtmlNodeText txt = ( ( ::htmlparser::HtmlNodeText)(::borogove::_Util::Util_Fields__obj::downcast(node,::hx::ClassOf< ::htmlparser::HtmlNodeText >())) );
+HXLINE( 122)		if (::hx::IsNotNull( txt )) {
+HXLINE( 123)			return ::borogove::Node_obj::CData(txt->toText());
+            		}
+HXLINE( 125)		 ::htmlparser::HtmlNodeElement el = ( ( ::htmlparser::HtmlNodeElement)(::borogove::_Util::Util_Fields__obj::downcast(node,::hx::ClassOf< ::htmlparser::HtmlNodeElement >())) );
+HXLINE( 126)		if (::hx::IsNotNull( el )) {
+HXLINE( 127)			 ::borogove::Stanza s =  ::borogove::Stanza_obj::__alloc( HX_CTX ,el->name, ::Dynamic(::hx::Anon_obj::Create(0)));
+HXLINE( 128)			{
+HXLINE( 128)				int _g = 0;
+HXDLIN( 128)				::Array< ::Dynamic> _g1 = el->attributes;
+HXDLIN( 128)				while((_g < _g1->length)){
+HXLINE( 128)					 ::htmlparser::HtmlAttribute attr = _g1->__get(_g).StaticCast<  ::htmlparser::HtmlAttribute >();
+HXDLIN( 128)					_g = (_g + 1);
+HXLINE( 129)					::Reflect_obj::setField(s->attr,attr->name,attr->value);
+            				}
+            			}
+HXLINE( 131)			{
+HXLINE( 131)				int _g2 = 0;
+HXDLIN( 131)				::Array< ::Dynamic> _g3 = el->nodes;
+HXDLIN( 131)				while((_g2 < _g3->length)){
+HXLINE( 131)					 ::htmlparser::HtmlNode child = _g3->__get(_g2).StaticCast<  ::htmlparser::HtmlNode >();
+HXDLIN( 131)					_g2 = (_g2 + 1);
+HXLINE( 132)					s->addDirectChild(::borogove::Html_obj::htmlToNode(child));
+            				}
+            			}
+HXLINE( 134)			return ::borogove::Node_obj::Element(s);
+            		}
+HXLINE( 136)		HX_STACK_DO_THROW(HX_("node was neither text nor element?",c3,dc,19,83));
+HXDLIN( 136)		return null();
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Html_obj,htmlToNode,return )
+
+
+::hx::ObjectPtr< Html_obj > Html_obj::__new(::Array< ::Dynamic> xml, ::borogove::Member sender) {
+	::hx::ObjectPtr< Html_obj > __this = new Html_obj();
+	__this->__construct(xml,sender);
+	return __this;
+}
+
+::hx::ObjectPtr< Html_obj > Html_obj::__alloc(::hx::Ctx *_hx_ctx,::Array< ::Dynamic> xml, ::borogove::Member sender) {
+	Html_obj *__this = (Html_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Html_obj), true, "borogove.Html"));
+	*(void **)__this = Html_obj::_hx_vtable;
+	__this->__construct(xml,sender);
+	return __this;
+}
+
+Html_obj::Html_obj()
+{
+}
+
+void Html_obj::__Mark(HX_MARK_PARAMS)
+{
+	HX_MARK_BEGIN_CLASS(Html);
+	HX_MARK_MEMBER_NAME(xml,"xml");
+	HX_MARK_MEMBER_NAME(sender,"sender");
+	HX_MARK_END_CLASS();
+}
+
+void Html_obj::__Visit(HX_VISIT_PARAMS)
+{
+	HX_VISIT_MEMBER_NAME(xml,"xml");
+	HX_VISIT_MEMBER_NAME(sender,"sender");
+}
+
+::hx::Val Html_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 3:
+		if (HX_FIELD_EQ(inName,"xml") ) { return ::hx::Val( xml ); }
+		break;
+	case 6:
+		if (HX_FIELD_EQ(inName,"sender") ) { return ::hx::Val( sender ); }
+		if (HX_FIELD_EQ(inName,"reduce") ) { return ::hx::Val( reduce_dyn() ); }
+		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"toString") ) { return ::hx::Val( toString_dyn() ); }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"isPlainText") ) { return ::hx::Val( isPlainText_dyn() ); }
+		if (HX_FIELD_EQ(inName,"toPlainText") ) { return ::hx::Val( toPlainText_dyn() ); }
+	}
+	return super::__Field(inName,inCallProp);
+}
+
+bool Html_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 4:
+		if (HX_FIELD_EQ(inName,"text") ) { outValue = text_dyn(); return true; }
+		break;
+	case 7:
+		if (HX_FIELD_EQ(inName,"element") ) { outValue = element_dyn(); return true; }
+		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"fragment") ) { outValue = fragment_dyn(); return true; }
+		break;
+	case 10:
+		if (HX_FIELD_EQ(inName,"HTML_EMPTY") ) { outValue = ( HTML_EMPTY ); return true; }
+		if (HX_FIELD_EQ(inName,"fromString") ) { outValue = fromString_dyn(); return true; }
+		if (HX_FIELD_EQ(inName,"htmlToNode") ) { outValue = htmlToNode_dyn(); return true; }
+		break;
+	case 14:
+		if (HX_FIELD_EQ(inName,"element__fromC") ) { outValue = element__fromC_dyn(); return true; }
+		break;
+	case 15:
+		if (HX_FIELD_EQ(inName,"fragment__fromC") ) { outValue = fragment__fromC_dyn(); return true; }
+	}
+	return false;
+}
+
+::hx::Val Html_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 3:
+		if (HX_FIELD_EQ(inName,"xml") ) { xml=inValue.Cast< ::Array< ::Dynamic> >(); return inValue; }
+		break;
+	case 6:
+		if (HX_FIELD_EQ(inName,"sender") ) { sender=inValue.Cast<  ::borogove::Member >(); return inValue; }
+	}
+	return super::__SetField(inName,inValue,inCallProp);
+}
+
+bool Html_obj::__SetStatic(const ::String &inName,Dynamic &ioValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 10:
+		if (HX_FIELD_EQ(inName,"HTML_EMPTY") ) { HTML_EMPTY=ioValue.Cast< ::Array< ::String > >(); return true; }
+	}
+	return false;
+}
+
+void Html_obj::__GetFields(Array< ::String> &outFields)
+{
+	outFields->push(HX_("xml",d7,6d,5b,00));
+	outFields->push(HX_("sender",b5,c7,84,6b));
+	super::__GetFields(outFields);
+};
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo Html_obj_sMemberStorageInfo[] = {
+	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(Html_obj,xml),HX_("xml",d7,6d,5b,00)},
+	{::hx::fsObject /*  ::borogove::Member */ ,(int)offsetof(Html_obj,sender),HX_("sender",b5,c7,84,6b)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+static ::hx::StaticInfo Html_obj_sStaticStorageInfo[] = {
+	{::hx::fsObject /* ::Array< ::String > */ ,(void *) &Html_obj::HTML_EMPTY,HX_("HTML_EMPTY",59,79,63,c2)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+#endif
+
+static ::String Html_obj_sMemberFields[] = {
+	HX_("xml",d7,6d,5b,00),
+	HX_("sender",b5,c7,84,6b),
+	HX_("isPlainText",8d,76,68,94),
+	HX_("reduce",a6,2d,9a,fe),
+	HX_("toString",ac,d0,6e,38),
+	HX_("toPlainText",dc,32,cd,1c),
+	::String(null()) };
+
+static void Html_obj_sMarkStatics(HX_MARK_PARAMS) {
+	HX_MARK_MEMBER_NAME(Html_obj::HTML_EMPTY,"HTML_EMPTY");
+};
+
+#ifdef HXCPP_VISIT_ALLOCS
+static void Html_obj_sVisitStatics(HX_VISIT_PARAMS) {
+	HX_VISIT_MEMBER_NAME(Html_obj::HTML_EMPTY,"HTML_EMPTY");
+};
+
+#endif
+
+::hx::Class Html_obj::__mClass;
+
+static ::String Html_obj_sStaticFields[] = {
+	HX_("HTML_EMPTY",59,79,63,c2),
+	HX_("element",bc,ae,54,06),
+	HX_("element__fromC",3d,51,b5,e7),
+	HX_("text",ad,cc,f9,4c),
+	HX_("fragment",d0,5f,e5,ad),
+	HX_("fragment__fromC",a9,aa,fd,aa),
+	HX_("fromString",db,2d,74,54),
+	HX_("htmlToNode",e8,e0,84,4c),
+	::String(null())
+};
+
+void Html_obj::__register()
+{
+	Html_obj _hx_dummy;
+	Html_obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("borogove.Html",f8,a9,55,de);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &Html_obj::__GetStatic;
+	__mClass->mSetStaticField = &Html_obj::__SetStatic;
+	__mClass->mMarkFunc = Html_obj_sMarkStatics;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(Html_obj_sStaticFields);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(Html_obj_sMemberFields);
+	__mClass->mCanCast = ::hx::TCanCast< Html_obj >;
+#ifdef HXCPP_VISIT_ALLOCS
+	__mClass->mVisitFunc = Html_obj_sVisitStatics;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = Html_obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = Html_obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+void Html_obj::__boot()
+{
+{
+            	HX_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_25_boot)
+HXDLIN(  25)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(2)
+            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("reduce__fromC",93,e3,57,ce), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(1,HX_("reduce",a6,2d,9a,fe), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))))
+            			->setFixed(1,HX_("statics",05,3c,65,36), ::Dynamic(::hx::Anon_obj::Create(4)
+            				->setFixed(0,HX_("fragment__fromC",a9,aa,fd,aa), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(1,HX_("fragment",d0,5f,e5,ad), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
+            				->setFixed(2,HX_("element__fromC",3d,51,b5,e7), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(3,HX_("element",bc,ae,54,06), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d))))))));
+            	}
+{
+            	HX_STACKFRAME(&_hx_pos_7f2f37b33fdbbbfb_26_boot)
+HXDLIN(  26)		HTML_EMPTY = ::Array_obj< ::String >::fromData( _hx_array_data_de55a9f8_50,14);
+            	}
+}
+
+} // end namespace borogove
diff --git a/Sources/c_borogove/src/borogove/Identicon.cpp b/Sources/c_borogove/src/borogove/Identicon.cpp
index e0425a6..a3b3e28 100644
--- a/Sources/c_borogove/src/borogove/Identicon.cpp
+++ b/Sources/c_borogove/src/borogove/Identicon.cpp
@@ -23,7 +23,7 @@
 #include <haxe/io/Input.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_d6eb31ee75492eec_19_svg,"borogove.Identicon","svg",0x3a0e37b2,"borogove.Identicon.svg","borogove/Identicon.hx",19,0x517def03)
+HX_LOCAL_STACK_FRAME(_hx_pos_d6eb31ee75492eec_22_svg,"borogove.Identicon","svg",0x3a0e37b2,"borogove.Identicon.svg","borogove/Identicon.hx",22,0x517def03)
 namespace borogove{
 
 void Identicon_obj::__construct() { }
@@ -44,76 +44,76 @@ bool Identicon_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String Identicon_obj::svg(::String source){
-            	HX_GC_STACKFRAME(&_hx_pos_d6eb31ee75492eec_19_svg)
-HXLINE(  21)		 ::haxe::io::BytesInput input =  ::haxe::io::BytesInput_obj::__alloc( HX_CTX ,::haxe::crypto::Sha1_obj::make(::haxe::io::Bytes_obj::ofString(source,null())),null(),null());
-HXLINE(  22)		input->set_bigEndian(true);
-HXLINE(  23)		int hash = input->readInt32();
-HXLINE(  24)		::String uri = HX_("data:image/svg+xml,<svg%20xmlns=\"http://www.w3.org/2000/svg\"%20version=\"1.1\"%20width=\"5\"%20height=\"5\"%20viewBox=\"0%200%205%205\">",ab,fb,bd,f4);
-HXLINE(  25)		uri = (HX_("data:image/svg+xml,<svg%20xmlns=\"http://www.w3.org/2000/svg\"%20version=\"1.1\"%20width=\"5\"%20height=\"5\"%20viewBox=\"0%200%205%205\">",ab,fb,bd,f4) + ((HX_("<style>rect{fill:%23",3d,8c,37,23) + ::borogove::Color_obj::forString(source).substr(1,null())) + HX_(";}</style>",82,58,20,71)));
-HXLINE(  27)		{
-HXLINE(  28)			{
-HXLINE(  30)				if ((::hx::Mod(hash,2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 0) + HX_("\"%20y=\"",5d,64,2d,3b)) + 0) + HX_("\"/>",d1,f5,19,00)));
-HXLINE(  33)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 4) + HX_("\"%20y=\"",5d,64,2d,3b)) + 0) + HX_("\"/>",d1,f5,19,00)));
+            	HX_GC_STACKFRAME(&_hx_pos_d6eb31ee75492eec_22_svg)
+HXLINE(  24)		 ::haxe::io::BytesInput input =  ::haxe::io::BytesInput_obj::__alloc( HX_CTX ,::haxe::crypto::Sha1_obj::make(::haxe::io::Bytes_obj::ofString(source,null())),null(),null());
+HXLINE(  25)		input->set_bigEndian(true);
+HXLINE(  26)		int hash = input->readInt32();
+HXLINE(  27)		::String uri = HX_("data:image/svg+xml,<svg%20xmlns=\"http://www.w3.org/2000/svg\"%20version=\"1.1\"%20width=\"5\"%20height=\"5\"%20viewBox=\"0%200%205%205\">",ab,fb,bd,f4);
+HXLINE(  28)		uri = (HX_("data:image/svg+xml,<svg%20xmlns=\"http://www.w3.org/2000/svg\"%20version=\"1.1\"%20width=\"5\"%20height=\"5\"%20viewBox=\"0%200%205%205\">",ab,fb,bd,f4) + ((HX_("<style>rect{fill:%23",3d,8c,37,23) + ::borogove::Color_obj::forString(source).substr(1,null())) + HX_(";}</style>",82,58,20,71)));
+HXLINE(  30)		{
+HXLINE(  31)			{
+HXLINE(  33)				if ((::hx::Mod(hash,2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 0) + HX_("\"%20y=\"",5d,64,2d,3b)) + 0) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  36)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 4) + HX_("\"%20y=\"",5d,64,2d,3b)) + 0) + HX_("\"/>",d1,f5,19,00)));
             				}
-HXLINE(  30)				if ((::hx::Mod((hash >> 1),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 0) + HX_("\"%20y=\"",5d,64,2d,3b)) + 1) + HX_("\"/>",d1,f5,19,00)));
-HXLINE(  33)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 4) + HX_("\"%20y=\"",5d,64,2d,3b)) + 1) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  33)				if ((::hx::Mod((hash >> 1),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 0) + HX_("\"%20y=\"",5d,64,2d,3b)) + 1) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  36)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 4) + HX_("\"%20y=\"",5d,64,2d,3b)) + 1) + HX_("\"/>",d1,f5,19,00)));
             				}
-HXLINE(  30)				if ((::hx::Mod((hash >> 2),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 0) + HX_("\"%20y=\"",5d,64,2d,3b)) + 2) + HX_("\"/>",d1,f5,19,00)));
-HXLINE(  33)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 4) + HX_("\"%20y=\"",5d,64,2d,3b)) + 2) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  33)				if ((::hx::Mod((hash >> 2),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 0) + HX_("\"%20y=\"",5d,64,2d,3b)) + 2) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  36)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 4) + HX_("\"%20y=\"",5d,64,2d,3b)) + 2) + HX_("\"/>",d1,f5,19,00)));
             				}
-HXLINE(  30)				if ((::hx::Mod((hash >> 3),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 0) + HX_("\"%20y=\"",5d,64,2d,3b)) + 3) + HX_("\"/>",d1,f5,19,00)));
-HXLINE(  33)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 4) + HX_("\"%20y=\"",5d,64,2d,3b)) + 3) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  33)				if ((::hx::Mod((hash >> 3),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 0) + HX_("\"%20y=\"",5d,64,2d,3b)) + 3) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  36)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 4) + HX_("\"%20y=\"",5d,64,2d,3b)) + 3) + HX_("\"/>",d1,f5,19,00)));
             				}
-HXLINE(  30)				if ((::hx::Mod((hash >> 4),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 0) + HX_("\"%20y=\"",5d,64,2d,3b)) + 4) + HX_("\"/>",d1,f5,19,00)));
-HXLINE(  33)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 4) + HX_("\"%20y=\"",5d,64,2d,3b)) + 4) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  33)				if ((::hx::Mod((hash >> 4),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 0) + HX_("\"%20y=\"",5d,64,2d,3b)) + 4) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  36)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 4) + HX_("\"%20y=\"",5d,64,2d,3b)) + 4) + HX_("\"/>",d1,f5,19,00)));
             				}
             			}
-HXLINE(  28)			{
-HXLINE(  30)				if ((::hx::Mod((hash >> 5),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 1) + HX_("\"%20y=\"",5d,64,2d,3b)) + 0) + HX_("\"/>",d1,f5,19,00)));
-HXLINE(  33)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 3) + HX_("\"%20y=\"",5d,64,2d,3b)) + 0) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  31)			{
+HXLINE(  33)				if ((::hx::Mod((hash >> 5),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 1) + HX_("\"%20y=\"",5d,64,2d,3b)) + 0) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  36)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 3) + HX_("\"%20y=\"",5d,64,2d,3b)) + 0) + HX_("\"/>",d1,f5,19,00)));
             				}
-HXLINE(  30)				if ((::hx::Mod((hash >> 6),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 1) + HX_("\"%20y=\"",5d,64,2d,3b)) + 1) + HX_("\"/>",d1,f5,19,00)));
-HXLINE(  33)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 3) + HX_("\"%20y=\"",5d,64,2d,3b)) + 1) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  33)				if ((::hx::Mod((hash >> 6),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 1) + HX_("\"%20y=\"",5d,64,2d,3b)) + 1) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  36)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 3) + HX_("\"%20y=\"",5d,64,2d,3b)) + 1) + HX_("\"/>",d1,f5,19,00)));
             				}
-HXLINE(  30)				if ((::hx::Mod((hash >> 7),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 1) + HX_("\"%20y=\"",5d,64,2d,3b)) + 2) + HX_("\"/>",d1,f5,19,00)));
-HXLINE(  33)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 3) + HX_("\"%20y=\"",5d,64,2d,3b)) + 2) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  33)				if ((::hx::Mod((hash >> 7),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 1) + HX_("\"%20y=\"",5d,64,2d,3b)) + 2) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  36)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 3) + HX_("\"%20y=\"",5d,64,2d,3b)) + 2) + HX_("\"/>",d1,f5,19,00)));
             				}
-HXLINE(  30)				if ((::hx::Mod((hash >> 8),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 1) + HX_("\"%20y=\"",5d,64,2d,3b)) + 3) + HX_("\"/>",d1,f5,19,00)));
-HXLINE(  33)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 3) + HX_("\"%20y=\"",5d,64,2d,3b)) + 3) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  33)				if ((::hx::Mod((hash >> 8),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 1) + HX_("\"%20y=\"",5d,64,2d,3b)) + 3) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  36)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 3) + HX_("\"%20y=\"",5d,64,2d,3b)) + 3) + HX_("\"/>",d1,f5,19,00)));
             				}
-HXLINE(  30)				if ((::hx::Mod((hash >> 9),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 1) + HX_("\"%20y=\"",5d,64,2d,3b)) + 4) + HX_("\"/>",d1,f5,19,00)));
-HXLINE(  33)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 3) + HX_("\"%20y=\"",5d,64,2d,3b)) + 4) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  33)				if ((::hx::Mod((hash >> 9),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 1) + HX_("\"%20y=\"",5d,64,2d,3b)) + 4) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  36)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 3) + HX_("\"%20y=\"",5d,64,2d,3b)) + 4) + HX_("\"/>",d1,f5,19,00)));
             				}
             			}
-HXLINE(  28)			{
-HXLINE(  30)				if ((::hx::Mod((hash >> 10),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 2) + HX_("\"%20y=\"",5d,64,2d,3b)) + 0) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  31)			{
+HXLINE(  33)				if ((::hx::Mod((hash >> 10),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 2) + HX_("\"%20y=\"",5d,64,2d,3b)) + 0) + HX_("\"/>",d1,f5,19,00)));
             				}
-HXLINE(  30)				if ((::hx::Mod((hash >> 11),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 2) + HX_("\"%20y=\"",5d,64,2d,3b)) + 1) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  33)				if ((::hx::Mod((hash >> 11),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 2) + HX_("\"%20y=\"",5d,64,2d,3b)) + 1) + HX_("\"/>",d1,f5,19,00)));
             				}
-HXLINE(  30)				if ((::hx::Mod((hash >> 12),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 2) + HX_("\"%20y=\"",5d,64,2d,3b)) + 2) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  33)				if ((::hx::Mod((hash >> 12),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 2) + HX_("\"%20y=\"",5d,64,2d,3b)) + 2) + HX_("\"/>",d1,f5,19,00)));
             				}
-HXLINE(  30)				if ((::hx::Mod((hash >> 13),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 2) + HX_("\"%20y=\"",5d,64,2d,3b)) + 3) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  33)				if ((::hx::Mod((hash >> 13),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 2) + HX_("\"%20y=\"",5d,64,2d,3b)) + 3) + HX_("\"/>",d1,f5,19,00)));
             				}
-HXLINE(  30)				if ((::hx::Mod((hash >> 14),2) == 0)) {
-HXLINE(  31)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 2) + HX_("\"%20y=\"",5d,64,2d,3b)) + 4) + HX_("\"/>",d1,f5,19,00)));
+HXLINE(  33)				if ((::hx::Mod((hash >> 14),2) == 0)) {
+HXLINE(  34)					uri = (uri + ((((HX_("<rect%20width=\"1\"%20height=\"1\"%20x=\"",81,8b,c1,f0) + 2) + HX_("\"%20y=\"",5d,64,2d,3b)) + 4) + HX_("\"/>",d1,f5,19,00)));
             				}
             			}
             		}
-HXLINE(  38)		return (uri + HX_("</svg>",4d,57,9c,59));
+HXLINE(  41)		return (uri + HX_("</svg>",4d,57,9c,59));
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/Identity.cpp b/Sources/c_borogove/src/borogove/Identity.cpp
index 0721798..4a2836f 100644
--- a/Sources/c_borogove/src/borogove/Identity.cpp
+++ b/Sources/c_borogove/src/borogove/Identity.cpp
@@ -20,25 +20,25 @@
 #include <haxe/io/Output.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_d5f7fc7fc3ee8081_178_new,"borogove.Identity","new",0x6fb346bd,"borogove.Identity.new","borogove/Caps.hx",178,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_d5f7fc7fc3ee8081_185_addToDisco,"borogove.Identity","addToDisco",0xe04e3b21,"borogove.Identity.addToDisco","borogove/Caps.hx",185,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_d5f7fc7fc3ee8081_192_ver,"borogove.Identity","ver",0x6fb958c0,"borogove.Identity.ver","borogove/Caps.hx",192,0xed3da4ef)
-HX_LOCAL_STACK_FRAME(_hx_pos_d5f7fc7fc3ee8081_195_writeTo,"borogove.Identity","writeTo",0x8acc5517,"borogove.Identity.writeTo","borogove/Caps.hx",195,0xed3da4ef)
+HX_DEFINE_STACK_FRAME(_hx_pos_d5f7fc7fc3ee8081_228_new,"borogove.Identity","new",0x6fb346bd,"borogove.Identity.new","borogove/Caps.hx",228,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_d5f7fc7fc3ee8081_238_addToDisco,"borogove.Identity","addToDisco",0xe04e3b21,"borogove.Identity.addToDisco","borogove/Caps.hx",238,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_d5f7fc7fc3ee8081_248_ver,"borogove.Identity","ver",0x6fb958c0,"borogove.Identity.ver","borogove/Caps.hx",248,0xed3da4ef)
+HX_LOCAL_STACK_FRAME(_hx_pos_d5f7fc7fc3ee8081_254_writeTo,"borogove.Identity","writeTo",0x8acc5517,"borogove.Identity.writeTo","borogove/Caps.hx",254,0xed3da4ef)
 namespace borogove{
 
 void Identity_obj::__construct(::String category,::String type,::String name,::String lang){
-            	HX_STACKFRAME(&_hx_pos_d5f7fc7fc3ee8081_178_new)
-HXLINE( 179)		this->category = category;
-HXLINE( 180)		this->type = type;
-HXLINE( 181)		this->name = name;
-HXLINE( 182)		::String _hx_tmp;
-HXDLIN( 182)		if (::hx::IsNotNull( lang )) {
-HXLINE( 182)			_hx_tmp = lang;
+            	HX_STACKFRAME(&_hx_pos_d5f7fc7fc3ee8081_228_new)
+HXLINE( 229)		this->category = category;
+HXLINE( 230)		this->type = type;
+HXLINE( 231)		this->name = name;
+HXLINE( 232)		::String _hx_tmp;
+HXDLIN( 232)		if (::hx::IsNotNull( lang )) {
+HXLINE( 232)			_hx_tmp = lang;
             		}
             		else {
-HXLINE( 182)			_hx_tmp = HX_("",00,00,00,00);
+HXLINE( 232)			_hx_tmp = HX_("",00,00,00,00);
             		}
-HXDLIN( 182)		this->lang = _hx_tmp;
+HXDLIN( 232)		this->lang = _hx_tmp;
             	}
 
 Dynamic Identity_obj::__CreateEmpty() { return new Identity_obj; }
@@ -57,74 +57,74 @@ bool Identity_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 void Identity_obj::addToDisco( ::borogove::Stanza stanza){
-            	HX_STACKFRAME(&_hx_pos_d5f7fc7fc3ee8081_185_addToDisco)
-HXLINE( 186)		 ::Dynamic attrs =  ::Dynamic(::hx::Anon_obj::Create(3)
+            	HX_STACKFRAME(&_hx_pos_d5f7fc7fc3ee8081_238_addToDisco)
+HXLINE( 239)		 ::Dynamic attrs =  ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("category",fe,2a,6c,ad),this->category)
             			->setFixed(1,HX_("name",4b,72,ff,48),this->name)
             			->setFixed(2,HX_("type",ba,f2,08,4d),this->type));
-HXLINE( 187)		bool _hx_tmp;
-HXDLIN( 187)		if (::hx::IsNotNull( this->lang )) {
-HXLINE( 187)			_hx_tmp = (this->lang != HX_("",00,00,00,00));
+HXLINE( 240)		bool _hx_tmp;
+HXDLIN( 240)		if (::hx::IsNotNull( this->lang )) {
+HXLINE( 240)			_hx_tmp = (this->lang != HX_("",00,00,00,00));
             		}
             		else {
-HXLINE( 187)			_hx_tmp = false;
+HXLINE( 240)			_hx_tmp = false;
             		}
-HXDLIN( 187)		if (_hx_tmp) {
-HXLINE( 187)			::Reflect_obj::setField(attrs,HX_("xml:lang",f1,b1,be,5f),this->lang);
+HXDLIN( 240)		if (_hx_tmp) {
+HXLINE( 240)			::Reflect_obj::setField(attrs,HX_("xml:lang",f1,b1,be,5f),this->lang);
             		}
-HXLINE( 188)		stanza->tag(HX_("identity",3e,45,2f,b9),attrs)->up();
+HXLINE( 241)		stanza->tag(HX_("identity",3e,45,2f,b9),attrs)->up();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Identity_obj,addToDisco,(void))
 
 ::String Identity_obj::ver(){
-            	HX_STACKFRAME(&_hx_pos_d5f7fc7fc3ee8081_192_ver)
-HXDLIN( 192)		::String tmp = this->lang;
-HXDLIN( 192)		::String _hx_tmp;
-HXDLIN( 192)		if (::hx::IsNotNull( tmp )) {
-HXDLIN( 192)			_hx_tmp = tmp;
+            	HX_STACKFRAME(&_hx_pos_d5f7fc7fc3ee8081_248_ver)
+HXDLIN( 248)		::String tmp = this->lang;
+HXDLIN( 248)		::String _hx_tmp;
+HXDLIN( 248)		if (::hx::IsNotNull( tmp )) {
+HXDLIN( 248)			_hx_tmp = tmp;
             		}
             		else {
-HXDLIN( 192)			_hx_tmp = HX_("",00,00,00,00);
+HXDLIN( 248)			_hx_tmp = HX_("",00,00,00,00);
             		}
-HXDLIN( 192)		return ((((((this->category + HX_("/",2f,00,00,00)) + this->type) + HX_("/",2f,00,00,00)) + _hx_tmp) + HX_("/",2f,00,00,00)) + this->name);
+HXDLIN( 248)		return ((((((this->category + HX_("/",2f,00,00,00)) + this->type) + HX_("/",2f,00,00,00)) + _hx_tmp) + HX_("/",2f,00,00,00)) + this->name);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Identity_obj,ver,return )
 
 void Identity_obj::writeTo( ::haxe::io::Output out){
-            	HX_STACKFRAME(&_hx_pos_d5f7fc7fc3ee8081_195_writeTo)
-HXLINE( 196)		{
-HXLINE( 196)			 ::haxe::io::Bytes b = ::haxe::io::Bytes_obj::ofString(this->category,null());
-HXDLIN( 196)			out->writeBytes(b,0,b->length);
+            	HX_STACKFRAME(&_hx_pos_d5f7fc7fc3ee8081_254_writeTo)
+HXLINE( 255)		{
+HXLINE( 255)			 ::haxe::io::Bytes b = ::haxe::io::Bytes_obj::ofString(this->category,null());
+HXDLIN( 255)			out->writeBytes(b,0,b->length);
             		}
-HXLINE( 197)		out->writeByte(31);
-HXLINE( 198)		{
-HXLINE( 198)			 ::haxe::io::Bytes b1 = ::haxe::io::Bytes_obj::ofString(this->type,null());
-HXDLIN( 198)			out->writeBytes(b1,0,b1->length);
+HXLINE( 256)		out->writeByte(31);
+HXLINE( 257)		{
+HXLINE( 257)			 ::haxe::io::Bytes b1 = ::haxe::io::Bytes_obj::ofString(this->type,null());
+HXDLIN( 257)			out->writeBytes(b1,0,b1->length);
             		}
-HXLINE( 199)		out->writeByte(31);
-HXLINE( 200)		{
-HXLINE( 200)			::String s;
-HXDLIN( 200)			::String tmp = this->lang;
-HXDLIN( 200)			if (::hx::IsNotNull( tmp )) {
-HXLINE( 200)				s = tmp;
+HXLINE( 258)		out->writeByte(31);
+HXLINE( 259)		{
+HXLINE( 259)			::String s;
+HXDLIN( 259)			::String tmp = this->lang;
+HXDLIN( 259)			if (::hx::IsNotNull( tmp )) {
+HXLINE( 259)				s = tmp;
             			}
             			else {
-HXLINE( 200)				s = HX_("",00,00,00,00);
+HXLINE( 259)				s = HX_("",00,00,00,00);
             			}
-HXDLIN( 200)			 ::haxe::io::Bytes b2 = ::haxe::io::Bytes_obj::ofString(s,null());
-HXDLIN( 200)			out->writeBytes(b2,0,b2->length);
+HXDLIN( 259)			 ::haxe::io::Bytes b2 = ::haxe::io::Bytes_obj::ofString(s,null());
+HXDLIN( 259)			out->writeBytes(b2,0,b2->length);
             		}
-HXLINE( 201)		out->writeByte(31);
-HXLINE( 202)		{
-HXLINE( 202)			 ::haxe::io::Bytes b3 = ::haxe::io::Bytes_obj::ofString(this->name,null());
-HXDLIN( 202)			out->writeBytes(b3,0,b3->length);
+HXLINE( 260)		out->writeByte(31);
+HXLINE( 261)		{
+HXLINE( 261)			 ::haxe::io::Bytes b3 = ::haxe::io::Bytes_obj::ofString(this->name,null());
+HXDLIN( 261)			out->writeBytes(b3,0,b3->length);
             		}
-HXLINE( 203)		out->writeByte(31);
-HXLINE( 204)		out->writeByte(30);
+HXLINE( 262)		out->writeByte(31);
+HXLINE( 263)		out->writeByte(30);
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/JID.cpp b/Sources/c_borogove/src/borogove/JID.cpp
index c4bbe9c..94ea1d7 100644
--- a/Sources/c_borogove/src/borogove/JID.cpp
+++ b/Sources/c_borogove/src/borogove/JID.cpp
@@ -8,38 +8,38 @@
 #include <borogove/JID.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_78b34adee00b61f5_9_new,"borogove.JID","new",0xbb8417ca,"borogove.JID.new","borogove/JID.hx",9,0x7756e5a7)
-HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_56_asBare,"borogove.JID","asBare",0xc2a3801a,"borogove.JID.asBare","borogove/JID.hx",56,0x7756e5a7)
-HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_60_withResource,"borogove.JID","withResource",0xd03d804a,"borogove.JID.withResource","borogove/JID.hx",60,0x7756e5a7)
-HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_64_isValid,"borogove.JID","isValid",0x5d175d1c,"borogove.JID.isValid","borogove/JID.hx",64,0x7756e5a7)
-HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_68_isDomain,"borogove.JID","isDomain",0xf52ce524,"borogove.JID.isDomain","borogove/JID.hx",68,0x7756e5a7)
-HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_72_isBare,"borogove.JID","isBare",0xf57e6312,"borogove.JID.isBare","borogove/JID.hx",72,0x7756e5a7)
-HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_76_equals,"borogove.JID","equals",0x56f9a515,"borogove.JID.equals","borogove/JID.hx",76,0x7756e5a7)
-HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_84_asString,"borogove.JID","asString",0x0f48cbb9,"borogove.JID.asString","borogove/JID.hx",84,0x7756e5a7)
-HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_41_parse,"borogove.JID","parse",0xdab6061d,"borogove.JID.parse","borogove/JID.hx",41,0x7756e5a7)
+HX_DEFINE_STACK_FRAME(_hx_pos_78b34adee00b61f5_17_new,"borogove.JID","new",0xbb8417ca,"borogove.JID.new","borogove/JID.hx",17,0x7756e5a7)
+HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_70_asBare,"borogove.JID","asBare",0xc2a3801a,"borogove.JID.asBare","borogove/JID.hx",70,0x7756e5a7)
+HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_77_withResource,"borogove.JID","withResource",0xd03d804a,"borogove.JID.withResource","borogove/JID.hx",77,0x7756e5a7)
+HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_84_isValid,"borogove.JID","isValid",0x5d175d1c,"borogove.JID.isValid","borogove/JID.hx",84,0x7756e5a7)
+HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_91_isDomain,"borogove.JID","isDomain",0xf52ce524,"borogove.JID.isDomain","borogove/JID.hx",91,0x7756e5a7)
+HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_98_isBare,"borogove.JID","isBare",0xf57e6312,"borogove.JID.isBare","borogove/JID.hx",98,0x7756e5a7)
+HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_105_equals,"borogove.JID","equals",0x56f9a515,"borogove.JID.equals","borogove/JID.hx",105,0x7756e5a7)
+HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_116_asString,"borogove.JID","asString",0x0f48cbb9,"borogove.JID.asString","borogove/JID.hx",116,0x7756e5a7)
+HX_LOCAL_STACK_FRAME(_hx_pos_78b34adee00b61f5_52_parse,"borogove.JID","parse",0xdab6061d,"borogove.JID.parse","borogove/JID.hx",52,0x7756e5a7)
 namespace borogove{
 
 void JID_obj::__construct(::String node,::String domain,::String resource, ::Dynamic __o_raw){
             		 ::Dynamic raw = __o_raw;
             		if (::hx::IsNull(__o_raw)) raw = false;
-            	HX_STACKFRAME(&_hx_pos_78b34adee00b61f5_9_new)
-HXLINE(  10)		::String _hx_tmp;
-HXDLIN(  10)		bool _hx_tmp1;
-HXDLIN(  10)		if (::hx::IsNotNull( node )) {
-HXLINE(  10)			_hx_tmp1 = ::hx::IsEq( raw,true );
+            	HX_STACKFRAME(&_hx_pos_78b34adee00b61f5_17_new)
+HXLINE(  18)		::String _hx_tmp;
+HXDLIN(  18)		bool _hx_tmp1;
+HXDLIN(  18)		if (::hx::IsNotNull( node )) {
+HXLINE(  18)			_hx_tmp1 = ::hx::IsEq( raw,true );
             		}
             		else {
-HXLINE(  10)			_hx_tmp1 = true;
+HXLINE(  18)			_hx_tmp1 = true;
             		}
-HXDLIN(  10)		if (_hx_tmp1) {
-HXLINE(  10)			_hx_tmp = node;
+HXDLIN(  18)		if (_hx_tmp1) {
+HXLINE(  18)			_hx_tmp = node;
             		}
             		else {
-HXLINE(  10)			_hx_tmp = ::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::trim(node),HX_("\\5c",ea,fd,45,00),HX_("\\5c5c",f8,fa,30,1c)),HX_("\\20",1a,fb,45,00),HX_("\\5c20",28,f8,30,1c)),HX_("\\22",1c,fb,45,00),HX_("\\5c22",2a,f8,30,1c)),HX_("\\26",20,fb,45,00),HX_("\\5c26",2e,f8,30,1c)),HX_("\\27",21,fb,45,00),HX_("\\5c27",2f,f8,30,1c)),HX_("\\2f",50,fb,45,00),HX_("\\5c2f",5e,f8,30,1c)),HX_("\\3a",2a,fc,45,00),HX_("\\5c3a",38,f9,30,1c)),HX_("\\3c",2c,fc,45,00),HX_("\\5c3c",3a,f9,30,1c)),HX_("\\3e",2e,fc,45,00),HX_("\\5c3e",3c,f9,30,1c)),HX_("\\40",d8,fc,45,00),HX_("\\5c40",e6,f9,30,1c)),HX_(" ",20,00,00,00),HX_("\\20",1a,fb,45,00)),HX_("\"",22,00,00,00),HX_("\\22",1c,fb,45,00)),HX_("&",26,00,00,00),HX_("\\26",20,fb,45,00)),HX_("'",27,00,00,00),HX_("\\27",21,fb,45,00)),HX_("/",2f,00,00,00),HX_("\\2f",50,fb,45,00)),HX_(":",3a,00,00,00),HX_("\\3a",2a,fc,45,00)),HX_("<",3c,00,00,00),HX_("\\3c",2c,fc,45,00)),HX_(">",3e,00,00,00),HX_("\\3e",2e,fc,45,00)),HX_("@",40,00,00,00),HX_("\\40",d8,fc,45,00));
+HXLINE(  18)			_hx_tmp = ::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::trim(node),HX_("\\5c",ea,fd,45,00),HX_("\\5c5c",f8,fa,30,1c)),HX_("\\20",1a,fb,45,00),HX_("\\5c20",28,f8,30,1c)),HX_("\\22",1c,fb,45,00),HX_("\\5c22",2a,f8,30,1c)),HX_("\\26",20,fb,45,00),HX_("\\5c26",2e,f8,30,1c)),HX_("\\27",21,fb,45,00),HX_("\\5c27",2f,f8,30,1c)),HX_("\\2f",50,fb,45,00),HX_("\\5c2f",5e,f8,30,1c)),HX_("\\3a",2a,fc,45,00),HX_("\\5c3a",38,f9,30,1c)),HX_("\\3c",2c,fc,45,00),HX_("\\5c3c",3a,f9,30,1c)),HX_("\\3e",2e,fc,45,00),HX_("\\5c3e",3c,f9,30,1c)),HX_("\\40",d8,fc,45,00),HX_("\\5c40",e6,f9,30,1c)),HX_(" ",20,00,00,00),HX_("\\20",1a,fb,45,00)),HX_("\"",22,00,00,00),HX_("\\22",1c,fb,45,00)),HX_("&",26,00,00,00),HX_("\\26",20,fb,45,00)),HX_("'",27,00,00,00),HX_("\\27",21,fb,45,00)),HX_("/",2f,00,00,00),HX_("\\2f",50,fb,45,00)),HX_(":",3a,00,00,00),HX_("\\3a",2a,fc,45,00)),HX_("<",3c,00,00,00),HX_("\\3c",2c,fc,45,00)),HX_(">",3e,00,00,00),HX_("\\3e",2e,fc,45,00)),HX_("@",40,00,00,00),HX_("\\40",d8,fc,45,00));
             		}
-HXDLIN(  10)		this->node = _hx_tmp;
-HXLINE(  37)		this->domain = domain;
-HXLINE(  38)		this->resource = resource;
+HXDLIN(  18)		this->node = _hx_tmp;
+HXLINE(  45)		this->domain = domain;
+HXLINE(  46)		this->resource = resource;
             	}
 
 Dynamic JID_obj::__CreateEmpty() { return new JID_obj; }
@@ -58,132 +58,132 @@ bool JID_obj::_hx_isInstanceOf(int inClassId) {
 }
 
  ::borogove::JID JID_obj::asBare(){
-            	HX_GC_STACKFRAME(&_hx_pos_78b34adee00b61f5_56_asBare)
-HXDLIN(  56)		return  ::borogove::JID_obj::__alloc( HX_CTX ,this->node,this->domain,null(),true);
+            	HX_GC_STACKFRAME(&_hx_pos_78b34adee00b61f5_70_asBare)
+HXDLIN(  70)		return  ::borogove::JID_obj::__alloc( HX_CTX ,this->node,this->domain,null(),true);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(JID_obj,asBare,return )
 
  ::borogove::JID JID_obj::withResource(::String resource){
-            	HX_GC_STACKFRAME(&_hx_pos_78b34adee00b61f5_60_withResource)
-HXDLIN(  60)		return  ::borogove::JID_obj::__alloc( HX_CTX ,this->node,this->domain,resource,true);
+            	HX_GC_STACKFRAME(&_hx_pos_78b34adee00b61f5_77_withResource)
+HXDLIN(  77)		return  ::borogove::JID_obj::__alloc( HX_CTX ,this->node,this->domain,resource,true);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(JID_obj,withResource,return )
 
 bool JID_obj::isValid(){
-            	HX_STACKFRAME(&_hx_pos_78b34adee00b61f5_64_isValid)
-HXDLIN(  64)		return (this->domain.indexOf(HX_(".",2e,00,00,00),null()) >= 0);
+            	HX_STACKFRAME(&_hx_pos_78b34adee00b61f5_84_isValid)
+HXDLIN(  84)		return (this->domain.indexOf(HX_(".",2e,00,00,00),null()) >= 0);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(JID_obj,isValid,return )
 
 bool JID_obj::isDomain(){
-            	HX_STACKFRAME(&_hx_pos_78b34adee00b61f5_68_isDomain)
-HXDLIN(  68)		return ::hx::IsNull( this->node );
+            	HX_STACKFRAME(&_hx_pos_78b34adee00b61f5_91_isDomain)
+HXDLIN(  91)		return ::hx::IsNull( this->node );
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(JID_obj,isDomain,return )
 
 bool JID_obj::isBare(){
-            	HX_STACKFRAME(&_hx_pos_78b34adee00b61f5_72_isBare)
-HXDLIN(  72)		return ::hx::IsNull( this->resource );
+            	HX_STACKFRAME(&_hx_pos_78b34adee00b61f5_98_isBare)
+HXDLIN(  98)		return ::hx::IsNull( this->resource );
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(JID_obj,isBare,return )
 
 bool JID_obj::equals( ::borogove::JID rhs){
-            	HX_STACKFRAME(&_hx_pos_78b34adee00b61f5_76_equals)
-HXLINE(  77)		bool _hx_tmp;
-HXDLIN(  77)		if ((this->node == rhs->node)) {
-HXLINE(  77)			_hx_tmp = (this->domain == rhs->domain);
+            	HX_STACKFRAME(&_hx_pos_78b34adee00b61f5_105_equals)
+HXLINE( 106)		bool _hx_tmp;
+HXDLIN( 106)		if ((this->node == rhs->node)) {
+HXLINE( 106)			_hx_tmp = (this->domain == rhs->domain);
             		}
             		else {
-HXLINE(  77)			_hx_tmp = false;
+HXLINE( 106)			_hx_tmp = false;
             		}
-HXLINE(  76)		if (_hx_tmp) {
-HXLINE(  79)			return (this->resource == rhs->resource);
+HXLINE( 105)		if (_hx_tmp) {
+HXLINE( 108)			return (this->resource == rhs->resource);
             		}
             		else {
-HXDLIN(  76)			return false;
+HXDLIN( 105)			return false;
             		}
-HXDLIN(  76)		return false;
+HXDLIN( 105)		return false;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(JID_obj,equals,return )
 
 ::String JID_obj::asString(){
-            	HX_STACKFRAME(&_hx_pos_78b34adee00b61f5_84_asString)
-HXLINE(  85)		::String _hx_tmp;
-HXDLIN(  85)		if (::hx::IsNotNull( this->node )) {
-HXLINE(  85)			_hx_tmp = (this->node + HX_("@",40,00,00,00));
+            	HX_STACKFRAME(&_hx_pos_78b34adee00b61f5_116_asString)
+HXLINE( 117)		::String _hx_tmp;
+HXDLIN( 117)		if (::hx::IsNotNull( this->node )) {
+HXLINE( 117)			_hx_tmp = (this->node + HX_("@",40,00,00,00));
             		}
             		else {
-HXLINE(  85)			_hx_tmp = HX_("",00,00,00,00);
+HXLINE( 117)			_hx_tmp = HX_("",00,00,00,00);
             		}
-HXLINE(  87)		::String _hx_tmp1;
-HXDLIN(  87)		if (::hx::IsNotNull( this->resource )) {
-HXLINE(  87)			_hx_tmp1 = (HX_("/",2f,00,00,00) + this->resource);
+HXLINE( 119)		::String _hx_tmp1;
+HXDLIN( 119)		if (::hx::IsNotNull( this->resource )) {
+HXLINE( 119)			_hx_tmp1 = (HX_("/",2f,00,00,00) + this->resource);
             		}
             		else {
-HXLINE(  87)			_hx_tmp1 = HX_("",00,00,00,00);
+HXLINE( 119)			_hx_tmp1 = HX_("",00,00,00,00);
             		}
-HXLINE(  84)		return ((_hx_tmp + this->domain) + _hx_tmp1);
+HXLINE( 116)		return ((_hx_tmp + this->domain) + _hx_tmp1);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(JID_obj,asString,return )
 
  ::borogove::JID JID_obj::parse(::String jid){
-            	HX_GC_STACKFRAME(&_hx_pos_78b34adee00b61f5_41_parse)
-HXLINE(  42)		int resourceDelimiter = jid.indexOf(HX_("/",2f,00,00,00),null());
-HXLINE(  43)		int nodeDelimiter = jid.indexOf(HX_("@",40,00,00,00),null());
-HXLINE(  44)		bool _hx_tmp;
-HXDLIN(  44)		if ((resourceDelimiter > 0)) {
-HXLINE(  44)			_hx_tmp = (nodeDelimiter >= resourceDelimiter);
+            	HX_GC_STACKFRAME(&_hx_pos_78b34adee00b61f5_52_parse)
+HXLINE(  53)		int resourceDelimiter = jid.indexOf(HX_("/",2f,00,00,00),null());
+HXLINE(  54)		int nodeDelimiter = jid.indexOf(HX_("@",40,00,00,00),null());
+HXLINE(  55)		bool _hx_tmp;
+HXDLIN(  55)		if ((resourceDelimiter > 0)) {
+HXLINE(  55)			_hx_tmp = (nodeDelimiter >= resourceDelimiter);
             		}
             		else {
-HXLINE(  44)			_hx_tmp = false;
+HXLINE(  55)			_hx_tmp = false;
             		}
-HXDLIN(  44)		if (_hx_tmp) {
-HXLINE(  45)			nodeDelimiter = -1;
+HXDLIN(  55)		if (_hx_tmp) {
+HXLINE(  56)			nodeDelimiter = -1;
             		}
-HXLINE(  48)		::String _hx_tmp1;
-HXDLIN(  48)		if ((nodeDelimiter > 0)) {
-HXLINE(  48)			_hx_tmp1 = jid.substr(0,nodeDelimiter);
+HXLINE(  59)		::String _hx_tmp1;
+HXDLIN(  59)		if ((nodeDelimiter > 0)) {
+HXLINE(  59)			_hx_tmp1 = jid.substr(0,nodeDelimiter);
             		}
             		else {
-HXLINE(  48)			_hx_tmp1 = null();
+HXLINE(  59)			_hx_tmp1 = null();
             		}
-HXLINE(  49)		int _hx_tmp2;
-HXDLIN(  49)		if ((nodeDelimiter == -1)) {
-HXLINE(  49)			_hx_tmp2 = 0;
+HXLINE(  60)		int _hx_tmp2;
+HXDLIN(  60)		if ((nodeDelimiter == -1)) {
+HXLINE(  60)			_hx_tmp2 = 0;
             		}
             		else {
-HXLINE(  49)			_hx_tmp2 = (nodeDelimiter + 1);
+HXLINE(  60)			_hx_tmp2 = (nodeDelimiter + 1);
             		}
-HXDLIN(  49)		 ::Dynamic _hx_tmp3;
-HXDLIN(  49)		if ((resourceDelimiter == -1)) {
-HXLINE(  49)			_hx_tmp3 = (jid.length + 1);
+HXDLIN(  60)		 ::Dynamic _hx_tmp3;
+HXDLIN(  60)		if ((resourceDelimiter == -1)) {
+HXLINE(  60)			_hx_tmp3 = (jid.length + 1);
             		}
             		else {
-HXLINE(  49)			_hx_tmp3 = resourceDelimiter;
+HXLINE(  60)			_hx_tmp3 = resourceDelimiter;
             		}
-HXDLIN(  49)		::String _hx_tmp4 = jid.substring(_hx_tmp2,_hx_tmp3);
-HXLINE(  50)		::String _hx_tmp5;
-HXDLIN(  50)		if ((resourceDelimiter == -1)) {
-HXLINE(  50)			_hx_tmp5 = null();
+HXDLIN(  60)		::String _hx_tmp4 = jid.substring(_hx_tmp2,_hx_tmp3);
+HXLINE(  61)		::String _hx_tmp5;
+HXDLIN(  61)		if ((resourceDelimiter == -1)) {
+HXLINE(  61)			_hx_tmp5 = null();
             		}
             		else {
-HXLINE(  50)			_hx_tmp5 = jid.substring((resourceDelimiter + 1),null());
+HXLINE(  61)			_hx_tmp5 = jid.substring((resourceDelimiter + 1),null());
             		}
-HXLINE(  47)		return  ::borogove::JID_obj::__alloc( HX_CTX ,_hx_tmp1,_hx_tmp4,_hx_tmp5,true);
+HXLINE(  58)		return  ::borogove::JID_obj::__alloc( HX_CTX ,_hx_tmp1,_hx_tmp4,_hx_tmp5,true);
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/JsonPrinter.cpp b/Sources/c_borogove/src/borogove/JsonPrinter.cpp
index 36e50b5..b422838 100644
--- a/Sources/c_borogove/src/borogove/JsonPrinter.cpp
+++ b/Sources/c_borogove/src/borogove/JsonPrinter.cpp
@@ -36,51 +36,54 @@
 #include <haxe/ds/StringMap.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_d3ea37de6dab7070_56_new,"borogove.JsonPrinter","new",0xca6fef17,"borogove.JsonPrinter.new","borogove/JsonPrinter.hx",56,0x2fb85ffa)
-HX_LOCAL_STACK_FRAME(_hx_pos_d3ea37de6dab7070_81_write,"borogove.JsonPrinter","write",0x70c3e756,"borogove.JsonPrinter.write","borogove/JsonPrinter.hx",81,0x2fb85ffa)
-static const ::String _hx_array_data_27bf17a5_4[] = {
+HX_DEFINE_STACK_FRAME(_hx_pos_d3ea37de6dab7070_57_new,"borogove.JsonPrinter","new",0xca6fef17,"borogove.JsonPrinter.new","borogove/JsonPrinter.hx",57,0x2fb85ffa)
+HX_LOCAL_STACK_FRAME(_hx_pos_d3ea37de6dab7070_73_ipad,"borogove.JsonPrinter","ipad",0x543b79f3,"borogove.JsonPrinter.ipad","borogove/JsonPrinter.hx",73,0x2fb85ffa)
+HX_LOCAL_STACK_FRAME(_hx_pos_d3ea37de6dab7070_78_newl,"borogove.JsonPrinter","newl",0x57814575,"borogove.JsonPrinter.newl","borogove/JsonPrinter.hx",78,0x2fb85ffa)
+HX_LOCAL_STACK_FRAME(_hx_pos_d3ea37de6dab7070_82_write,"borogove.JsonPrinter","write",0x70c3e756,"borogove.JsonPrinter.write","borogove/JsonPrinter.hx",82,0x2fb85ffa)
+static const ::String _hx_array_data_27bf17a5_6[] = {
 	HX_("null",87,9e,0e,49),
 };
-static const ::String _hx_array_data_27bf17a5_5[] = {
+static const ::String _hx_array_data_27bf17a5_7[] = {
 	HX_("\"<fun>\"",09,3c,cc,8b),
 };
-static const ::String _hx_array_data_27bf17a5_6[] = {
+static const ::String _hx_array_data_27bf17a5_8[] = {
 	HX_("\"???\"",45,2f,74,bd),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_d3ea37de6dab7070_158_classString,"borogove.JsonPrinter","classString",0xe3753ce0,"borogove.JsonPrinter.classString","borogove/JsonPrinter.hx",158,0x2fb85ffa)
-HX_LOCAL_STACK_FRAME(_hx_pos_d3ea37de6dab7070_165_fieldsString,"borogove.JsonPrinter","fieldsString",0x76029e93,"borogove.JsonPrinter.fieldsString","borogove/JsonPrinter.hx",165,0x2fb85ffa)
-HX_LOCAL_STACK_FRAME(_hx_pos_d3ea37de6dab7070_195_quote,"borogove.JsonPrinter","quote",0xfe5c9db3,"borogove.JsonPrinter.quote","borogove/JsonPrinter.hx",195,0x2fb85ffa)
-static const ::String _hx_array_data_27bf17a5_12[] = {
+HX_LOCAL_STACK_FRAME(_hx_pos_d3ea37de6dab7070_159_classString,"borogove.JsonPrinter","classString",0xe3753ce0,"borogove.JsonPrinter.classString","borogove/JsonPrinter.hx",159,0x2fb85ffa)
+HX_LOCAL_STACK_FRAME(_hx_pos_d3ea37de6dab7070_163_objString,"borogove.JsonPrinter","objString",0x5e82821f,"borogove.JsonPrinter.objString","borogove/JsonPrinter.hx",163,0x2fb85ffa)
+HX_LOCAL_STACK_FRAME(_hx_pos_d3ea37de6dab7070_166_fieldsString,"borogove.JsonPrinter","fieldsString",0x76029e93,"borogove.JsonPrinter.fieldsString","borogove/JsonPrinter.hx",166,0x2fb85ffa)
+HX_LOCAL_STACK_FRAME(_hx_pos_d3ea37de6dab7070_196_quote,"borogove.JsonPrinter","quote",0xfe5c9db3,"borogove.JsonPrinter.quote","borogove/JsonPrinter.hx",196,0x2fb85ffa)
+static const ::String _hx_array_data_27bf17a5_15[] = {
 	HX_("\\b",86,50,00,00),
 };
-static const ::String _hx_array_data_27bf17a5_13[] = {
+static const ::String _hx_array_data_27bf17a5_16[] = {
 	HX_("\\t",98,50,00,00),
 };
-static const ::String _hx_array_data_27bf17a5_14[] = {
+static const ::String _hx_array_data_27bf17a5_17[] = {
 	HX_("\\n",92,50,00,00),
 };
-static const ::String _hx_array_data_27bf17a5_15[] = {
+static const ::String _hx_array_data_27bf17a5_18[] = {
 	HX_("\\f",8a,50,00,00),
 };
-static const ::String _hx_array_data_27bf17a5_16[] = {
+static const ::String _hx_array_data_27bf17a5_19[] = {
 	HX_("\\r",96,50,00,00),
 };
-static const ::String _hx_array_data_27bf17a5_17[] = {
+static const ::String _hx_array_data_27bf17a5_20[] = {
 	HX_("\\\"",46,50,00,00),
 };
-static const ::String _hx_array_data_27bf17a5_18[] = {
+static const ::String _hx_array_data_27bf17a5_21[] = {
 	HX_("\\\\",80,50,00,00),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_d3ea37de6dab7070_44_print,"borogove.JsonPrinter","print",0x68f5d2a4,"borogove.JsonPrinter.print","borogove/JsonPrinter.hx",44,0x2fb85ffa)
+HX_LOCAL_STACK_FRAME(_hx_pos_d3ea37de6dab7070_45_print,"borogove.JsonPrinter","print",0x68f5d2a4,"borogove.JsonPrinter.print","borogove/JsonPrinter.hx",45,0x2fb85ffa)
 namespace borogove{
 
 void JsonPrinter_obj::__construct( ::Dynamic replacer,::String space){
-            	HX_GC_STACKFRAME(&_hx_pos_d3ea37de6dab7070_56_new)
-HXLINE(  57)		this->replacer = replacer;
-HXLINE(  58)		this->indent = space;
-HXLINE(  59)		this->pretty = ::hx::IsNotNull( space );
-HXLINE(  60)		this->nind = 0;
-HXLINE(  67)		this->buf =  ::StringBuf_obj::__alloc( HX_CTX );
+            	HX_GC_STACKFRAME(&_hx_pos_d3ea37de6dab7070_57_new)
+HXLINE(  58)		this->replacer = replacer;
+HXLINE(  59)		this->indent = space;
+HXLINE(  60)		this->pretty = ::hx::IsNotNull( space );
+HXLINE(  61)		this->nind = 0;
+HXLINE(  68)		this->buf =  ::StringBuf_obj::__alloc( HX_CTX );
             	}
 
 Dynamic JsonPrinter_obj::__CreateEmpty() { return new JsonPrinter_obj; }
@@ -98,225 +101,264 @@ bool JsonPrinter_obj::_hx_isInstanceOf(int inClassId) {
 	return inClassId==(int)0x00000001 || inClassId==(int)0x60981331;
 }
 
+void JsonPrinter_obj::ipad(){
+            	HX_STACKFRAME(&_hx_pos_d3ea37de6dab7070_73_ipad)
+HXDLIN(  73)		if (this->pretty) {
+HXLINE(  74)			::String v = ::StringTools_obj::lpad(HX_("",00,00,00,00),this->indent,(this->nind * this->indent.length));
+HXDLIN(  74)			{
+HXLINE(  74)				 ::StringBuf _this = this->buf;
+HXDLIN(  74)				if (::hx::IsNotNull( _this->charBuf )) {
+HXLINE(  74)					_this->flush();
+            				}
+HXDLIN(  74)				if (::hx::IsNull( _this->b )) {
+HXLINE(  74)					_this->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v));
+            				}
+            				else {
+HXLINE(  74)					::Array< ::String > _this1 = _this->b;
+HXDLIN(  74)					_this1->push(::Std_obj::string(v));
+            				}
+            			}
+            		}
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(JsonPrinter_obj,ipad,(void))
+
+void JsonPrinter_obj::newl(){
+            	HX_STACKFRAME(&_hx_pos_d3ea37de6dab7070_78_newl)
+HXDLIN(  78)		if (this->pretty) {
+HXLINE(  79)			 ::StringBuf _this = this->buf;
+HXDLIN(  79)			{
+HXLINE(  79)				if (::hx::IsNull( _this->charBuf )) {
+HXLINE(  79)					_this->charBuf = ::Array_obj< char >::__new();
+            				}
+HXDLIN(  79)				_this->charBuf->push(10);
+            			}
+            		}
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(JsonPrinter_obj,newl,(void))
+
 void JsonPrinter_obj::write( ::Dynamic k, ::Dynamic v){
-            	HX_STACKFRAME(&_hx_pos_d3ea37de6dab7070_81_write)
-HXLINE(  82)		if (::hx::IsNotNull( this->replacer )) {
-HXLINE(  83)			v = this->replacer(k,v);
+            	HX_STACKFRAME(&_hx_pos_d3ea37de6dab7070_82_write)
+HXLINE(  83)		if (::hx::IsNotNull( this->replacer )) {
+HXLINE(  84)			v = this->replacer(k,v);
             		}
-HXLINE(  84)		{
-HXLINE(  84)			 ::ValueType _g = ::Type_obj::_hx_typeof(v);
-HXDLIN(  84)			switch((int)(_g->_hx_getIndex())){
+HXLINE(  85)		{
+HXLINE(  85)			 ::ValueType _g = ::Type_obj::_hx_typeof(v);
+HXDLIN(  85)			switch((int)(_g->_hx_getIndex())){
             				case (int)0: {
-HXLINE( 136)					 ::StringBuf _this = this->buf;
-HXDLIN( 136)					if (::hx::IsNotNull( _this->charBuf )) {
-HXLINE( 136)						_this->flush();
+HXLINE( 137)					 ::StringBuf _this = this->buf;
+HXDLIN( 137)					if (::hx::IsNotNull( _this->charBuf )) {
+HXLINE( 137)						_this->flush();
             					}
-HXDLIN( 136)					if (::hx::IsNull( _this->b )) {
-HXLINE( 136)						_this->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_4,1);
+HXDLIN( 137)					if (::hx::IsNull( _this->b )) {
+HXLINE( 137)						_this->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_6,1);
             					}
             					else {
-HXLINE( 136)						_this->b->push(HX_("null",87,9e,0e,49));
+HXLINE( 137)						_this->b->push(HX_("null",87,9e,0e,49));
             					}
             				}
             				break;
             				case (int)1: {
-HXLINE(  90)					::String v1 = ( (::String)(v) );
-HXDLIN(  90)					{
-HXLINE(  90)						 ::StringBuf _this1 = this->buf;
-HXDLIN(  90)						if (::hx::IsNotNull( _this1->charBuf )) {
-HXLINE(  90)							_this1->flush();
+HXLINE(  91)					::String v1 = ( (::String)(v) );
+HXDLIN(  91)					{
+HXLINE(  91)						 ::StringBuf _this1 = this->buf;
+HXDLIN(  91)						if (::hx::IsNotNull( _this1->charBuf )) {
+HXLINE(  91)							_this1->flush();
             						}
-HXDLIN(  90)						if (::hx::IsNull( _this1->b )) {
-HXLINE(  90)							_this1->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v1));
+HXDLIN(  91)						if (::hx::IsNull( _this1->b )) {
+HXLINE(  91)							_this1->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v1));
             						}
             						else {
-HXLINE(  90)							::Array< ::String > _this2 = _this1->b;
-HXDLIN(  90)							_this2->push(::Std_obj::string(v1));
+HXLINE(  91)							::Array< ::String > _this2 = _this1->b;
+HXDLIN(  91)							_this2->push(::Std_obj::string(v1));
             						}
             					}
             				}
             				break;
             				case (int)2: {
-HXLINE(  92)					::String v2;
-HXDLIN(  92)					if (::Math_obj::isFinite(( (Float)(v) ))) {
-HXLINE(  92)						v2 = ::Std_obj::string(v);
+HXLINE(  93)					::String v2;
+HXDLIN(  93)					if (::Math_obj::isFinite(( (Float)(v) ))) {
+HXLINE(  93)						v2 = ::Std_obj::string(v);
             					}
             					else {
-HXLINE(  92)						v2 = HX_("null",87,9e,0e,49);
+HXLINE(  93)						v2 = HX_("null",87,9e,0e,49);
             					}
-HXDLIN(  92)					{
-HXLINE(  92)						 ::StringBuf _this3 = this->buf;
-HXDLIN(  92)						if (::hx::IsNotNull( _this3->charBuf )) {
-HXLINE(  92)							_this3->flush();
+HXDLIN(  93)					{
+HXLINE(  93)						 ::StringBuf _this3 = this->buf;
+HXDLIN(  93)						if (::hx::IsNotNull( _this3->charBuf )) {
+HXLINE(  93)							_this3->flush();
             						}
-HXDLIN(  92)						if (::hx::IsNull( _this3->b )) {
-HXLINE(  92)							_this3->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v2));
+HXDLIN(  93)						if (::hx::IsNull( _this3->b )) {
+HXLINE(  93)							_this3->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v2));
             						}
             						else {
-HXLINE(  92)							::Array< ::String > _this4 = _this3->b;
-HXDLIN(  92)							_this4->push(::Std_obj::string(v2));
+HXLINE(  93)							::Array< ::String > _this4 = _this3->b;
+HXDLIN(  93)							_this4->push(::Std_obj::string(v2));
             						}
             					}
             				}
             				break;
             				case (int)3: {
-HXLINE( 134)					::String v3 = ( (::String)(v) );
-HXDLIN( 134)					{
-HXLINE( 134)						 ::StringBuf _this5 = this->buf;
-HXDLIN( 134)						if (::hx::IsNotNull( _this5->charBuf )) {
-HXLINE( 134)							_this5->flush();
+HXLINE( 135)					::String v3 = ( (::String)(v) );
+HXDLIN( 135)					{
+HXLINE( 135)						 ::StringBuf _this5 = this->buf;
+HXDLIN( 135)						if (::hx::IsNotNull( _this5->charBuf )) {
+HXLINE( 135)							_this5->flush();
             						}
-HXDLIN( 134)						if (::hx::IsNull( _this5->b )) {
-HXLINE( 134)							_this5->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v3));
+HXDLIN( 135)						if (::hx::IsNull( _this5->b )) {
+HXLINE( 135)							_this5->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v3));
             						}
             						else {
-HXLINE( 134)							::Array< ::String > _this6 = _this5->b;
-HXDLIN( 134)							_this6->push(::Std_obj::string(v3));
+HXLINE( 135)							::Array< ::String > _this6 = _this5->b;
+HXDLIN( 135)							_this6->push(::Std_obj::string(v3));
             						}
             					}
             				}
             				break;
             				case (int)4: {
-HXLINE(  88)					this->fieldsString(v,::Reflect_obj::fields(v));
+HXLINE(  89)					this->fieldsString(v,::Reflect_obj::fields(v));
             				}
             				break;
             				case (int)5: {
-HXLINE(  94)					 ::StringBuf _this7 = this->buf;
-HXDLIN(  94)					if (::hx::IsNotNull( _this7->charBuf )) {
-HXLINE(  94)						_this7->flush();
+HXLINE(  95)					 ::StringBuf _this7 = this->buf;
+HXDLIN(  95)					if (::hx::IsNotNull( _this7->charBuf )) {
+HXLINE(  95)						_this7->flush();
             					}
-HXDLIN(  94)					if (::hx::IsNull( _this7->b )) {
-HXLINE(  94)						_this7->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_5,1);
+HXDLIN(  95)					if (::hx::IsNull( _this7->b )) {
+HXLINE(  95)						_this7->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_7,1);
             					}
             					else {
-HXLINE(  94)						_this7->b->push(HX_("\"<fun>\"",09,3c,cc,8b));
+HXLINE(  95)						_this7->b->push(HX_("\"<fun>\"",09,3c,cc,8b));
             					}
             				}
             				break;
             				case (int)6: {
-HXLINE(  95)					::hx::Class _g1 = _g->_hx_getObject(0).StaticCast< ::hx::Class >();
-HXLINE(  96)					if (::hx::IsPointerEq( _g1,::hx::ClassOf< ::String >() )) {
-HXLINE(  97)						this->quote(( (::String)(v) ));
+HXLINE(  96)					::hx::Class _g1 = _g->_hx_getObject(0).StaticCast< ::hx::Class >();
+HXLINE(  97)					if (::hx::IsPointerEq( _g1,::hx::ClassOf< ::String >() )) {
+HXLINE(  98)						this->quote(( (::String)(v) ));
             					}
             					else {
-HXLINE(  98)						if (::hx::IsPointerEq( _g1,::hx::ArrayBase::__mClass )) {
-HXLINE(  99)							::cpp::VirtualArray v4 = ( (::cpp::VirtualArray)(v) );
-HXLINE( 100)							{
-HXLINE( 100)								 ::StringBuf _this8 = this->buf;
-HXDLIN( 100)								{
-HXLINE( 100)									if (::hx::IsNull( _this8->charBuf )) {
-HXLINE( 100)										_this8->charBuf = ::Array_obj< char >::__new();
+HXLINE(  99)						if (::hx::IsPointerEq( _g1,::hx::ArrayBase::__mClass )) {
+HXLINE( 100)							::cpp::VirtualArray v4 = ( (::cpp::VirtualArray)(v) );
+HXLINE( 101)							{
+HXLINE( 101)								 ::StringBuf _this8 = this->buf;
+HXDLIN( 101)								{
+HXLINE( 101)									if (::hx::IsNull( _this8->charBuf )) {
+HXLINE( 101)										_this8->charBuf = ::Array_obj< char >::__new();
             									}
-HXDLIN( 100)									_this8->charBuf->push(91);
+HXDLIN( 101)									_this8->charBuf->push(91);
             								}
             							}
-HXLINE( 102)							int len = v4->get_length();
-HXLINE( 103)							int last = (len - 1);
-HXLINE( 104)							{
-HXLINE( 104)								int _g2 = 0;
-HXDLIN( 104)								while((_g2 < len)){
-HXLINE( 104)									_g2 = (_g2 + 1);
-HXDLIN( 104)									int i = (_g2 - 1);
-HXLINE( 105)									if ((i > 0)) {
-HXLINE( 106)										 ::StringBuf _this9 = this->buf;
-HXDLIN( 106)										{
-HXLINE( 106)											if (::hx::IsNull( _this9->charBuf )) {
-HXLINE( 106)												_this9->charBuf = ::Array_obj< char >::__new();
+HXLINE( 103)							int len = v4->get_length();
+HXLINE( 104)							int last = (len - 1);
+HXLINE( 105)							{
+HXLINE( 105)								int _g2 = 0;
+HXDLIN( 105)								while((_g2 < len)){
+HXLINE( 105)									_g2 = (_g2 + 1);
+HXDLIN( 105)									int i = (_g2 - 1);
+HXLINE( 106)									if ((i > 0)) {
+HXLINE( 107)										 ::StringBuf _this9 = this->buf;
+HXDLIN( 107)										{
+HXLINE( 107)											if (::hx::IsNull( _this9->charBuf )) {
+HXLINE( 107)												_this9->charBuf = ::Array_obj< char >::__new();
             											}
-HXDLIN( 106)											_this9->charBuf->push(44);
+HXDLIN( 107)											_this9->charBuf->push(44);
             										}
             									}
             									else {
-HXLINE( 108)										this->nind++;
+HXLINE( 109)										this->nind++;
             									}
-HXLINE( 109)									if (this->pretty) {
-HXLINE( 109)										 ::StringBuf _this10 = this->buf;
-HXDLIN( 109)										{
-HXLINE( 109)											if (::hx::IsNull( _this10->charBuf )) {
-HXLINE( 109)												_this10->charBuf = ::Array_obj< char >::__new();
+HXLINE( 110)									if (this->pretty) {
+HXLINE( 110)										 ::StringBuf _this10 = this->buf;
+HXDLIN( 110)										{
+HXLINE( 110)											if (::hx::IsNull( _this10->charBuf )) {
+HXLINE( 110)												_this10->charBuf = ::Array_obj< char >::__new();
             											}
-HXDLIN( 109)											_this10->charBuf->push(10);
+HXDLIN( 110)											_this10->charBuf->push(10);
             										}
             									}
-HXLINE( 110)									if (this->pretty) {
-HXLINE( 110)										::String v5 = ::StringTools_obj::lpad(HX_("",00,00,00,00),this->indent,(this->nind * this->indent.length));
-HXDLIN( 110)										{
-HXLINE( 110)											 ::StringBuf _this11 = this->buf;
-HXDLIN( 110)											if (::hx::IsNotNull( _this11->charBuf )) {
-HXLINE( 110)												_this11->flush();
+HXLINE( 111)									if (this->pretty) {
+HXLINE( 111)										::String v5 = ::StringTools_obj::lpad(HX_("",00,00,00,00),this->indent,(this->nind * this->indent.length));
+HXDLIN( 111)										{
+HXLINE( 111)											 ::StringBuf _this11 = this->buf;
+HXDLIN( 111)											if (::hx::IsNotNull( _this11->charBuf )) {
+HXLINE( 111)												_this11->flush();
             											}
-HXDLIN( 110)											if (::hx::IsNull( _this11->b )) {
-HXLINE( 110)												_this11->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v5));
+HXDLIN( 111)											if (::hx::IsNull( _this11->b )) {
+HXLINE( 111)												_this11->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v5));
             											}
             											else {
-HXLINE( 110)												::Array< ::String > _this12 = _this11->b;
-HXDLIN( 110)												_this12->push(::Std_obj::string(v5));
+HXLINE( 111)												::Array< ::String > _this12 = _this11->b;
+HXDLIN( 111)												_this12->push(::Std_obj::string(v5));
             											}
             										}
             									}
-HXLINE( 111)									this->write(i,v4->__get(i));
-HXLINE( 112)									if ((i == last)) {
-HXLINE( 113)										this->nind--;
-HXLINE( 114)										if (this->pretty) {
-HXLINE( 114)											 ::StringBuf _this13 = this->buf;
-HXDLIN( 114)											{
-HXLINE( 114)												if (::hx::IsNull( _this13->charBuf )) {
-HXLINE( 114)													_this13->charBuf = ::Array_obj< char >::__new();
+HXLINE( 112)									this->write(i,v4->__get(i));
+HXLINE( 113)									if ((i == last)) {
+HXLINE( 114)										this->nind--;
+HXLINE( 115)										if (this->pretty) {
+HXLINE( 115)											 ::StringBuf _this13 = this->buf;
+HXDLIN( 115)											{
+HXLINE( 115)												if (::hx::IsNull( _this13->charBuf )) {
+HXLINE( 115)													_this13->charBuf = ::Array_obj< char >::__new();
             												}
-HXDLIN( 114)												_this13->charBuf->push(10);
+HXDLIN( 115)												_this13->charBuf->push(10);
             											}
             										}
-HXLINE( 115)										if (this->pretty) {
-HXLINE( 115)											::String v6 = ::StringTools_obj::lpad(HX_("",00,00,00,00),this->indent,(this->nind * this->indent.length));
-HXDLIN( 115)											{
-HXLINE( 115)												 ::StringBuf _this14 = this->buf;
-HXDLIN( 115)												if (::hx::IsNotNull( _this14->charBuf )) {
-HXLINE( 115)													_this14->flush();
+HXLINE( 116)										if (this->pretty) {
+HXLINE( 116)											::String v6 = ::StringTools_obj::lpad(HX_("",00,00,00,00),this->indent,(this->nind * this->indent.length));
+HXDLIN( 116)											{
+HXLINE( 116)												 ::StringBuf _this14 = this->buf;
+HXDLIN( 116)												if (::hx::IsNotNull( _this14->charBuf )) {
+HXLINE( 116)													_this14->flush();
             												}
-HXDLIN( 115)												if (::hx::IsNull( _this14->b )) {
-HXLINE( 115)													_this14->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v6));
+HXDLIN( 116)												if (::hx::IsNull( _this14->b )) {
+HXLINE( 116)													_this14->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v6));
             												}
             												else {
-HXLINE( 115)													::Array< ::String > _this15 = _this14->b;
-HXDLIN( 115)													_this15->push(::Std_obj::string(v6));
+HXLINE( 116)													::Array< ::String > _this15 = _this14->b;
+HXDLIN( 116)													_this15->push(::Std_obj::string(v6));
             												}
             											}
             										}
             									}
             								}
             							}
-HXLINE( 118)							{
-HXLINE( 118)								 ::StringBuf _this16 = this->buf;
-HXDLIN( 118)								{
-HXLINE( 118)									if (::hx::IsNull( _this16->charBuf )) {
-HXLINE( 118)										_this16->charBuf = ::Array_obj< char >::__new();
+HXLINE( 119)							{
+HXLINE( 119)								 ::StringBuf _this16 = this->buf;
+HXDLIN( 119)								{
+HXLINE( 119)									if (::hx::IsNull( _this16->charBuf )) {
+HXLINE( 119)										_this16->charBuf = ::Array_obj< char >::__new();
             									}
-HXDLIN( 118)									_this16->charBuf->push(93);
+HXDLIN( 119)									_this16->charBuf->push(93);
             								}
             							}
             						}
             						else {
-HXLINE( 119)							if (::hx::IsPointerEq( _g1,::hx::ClassOf< ::haxe::ds::StringMap >() )) {
-HXLINE( 120)								 ::haxe::ds::StringMap v7 = ( ( ::haxe::ds::StringMap)(v) );
-HXLINE( 121)								 ::Dynamic o =  ::Dynamic(::hx::Anon_obj::Create(0));
-HXLINE( 122)								{
-HXLINE( 122)									 ::Dynamic k1 = v7->keys();
-HXDLIN( 122)									while(( (bool)(k1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 122)										::String k2 = ( (::String)(k1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXLINE( 123)										::Reflect_obj::setField(o,k2,v7->get(k2));
+HXLINE( 120)							if (::hx::IsPointerEq( _g1,::hx::ClassOf< ::haxe::ds::StringMap >() )) {
+HXLINE( 121)								 ::haxe::ds::StringMap v7 = ( ( ::haxe::ds::StringMap)(v) );
+HXLINE( 122)								 ::Dynamic o =  ::Dynamic(::hx::Anon_obj::Create(0));
+HXLINE( 123)								{
+HXLINE( 123)									 ::Dynamic k1 = v7->keys();
+HXDLIN( 123)									while(( (bool)(k1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 123)										::String k2 = ( (::String)(k1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXLINE( 124)										::Reflect_obj::setField(o,k2,v7->get(k2));
             									}
             								}
-HXLINE( 124)								{
-HXLINE( 124)									 ::Dynamic v8 = o;
-HXDLIN( 124)									this->fieldsString(v8,::Reflect_obj::fields(v8));
+HXLINE( 125)								{
+HXLINE( 125)									 ::Dynamic v8 = o;
+HXDLIN( 125)									this->fieldsString(v8,::Reflect_obj::fields(v8));
             								}
             							}
             							else {
-HXLINE( 125)								if (::hx::IsPointerEq( _g1,::hx::ClassOf< ::Date >() )) {
-HXLINE( 127)									this->quote(( ( ::Date)(v) )->toString());
+HXLINE( 126)								if (::hx::IsPointerEq( _g1,::hx::ClassOf< ::Date >() )) {
+HXLINE( 128)									this->quote(( ( ::Date)(v) )->toString());
             								}
             								else {
-HXLINE( 129)									this->classString(v);
+HXLINE( 130)									this->classString(v);
             								}
             							}
             						}
@@ -324,32 +366,32 @@ HXLINE( 129)									this->classString(v);
             				}
             				break;
             				case (int)7: {
-HXLINE( 132)					::String v9 = ::Std_obj::string(_hx_getEnumValueIndex(v));
-HXDLIN( 132)					{
-HXLINE( 132)						 ::StringBuf _this17 = this->buf;
-HXDLIN( 132)						if (::hx::IsNotNull( _this17->charBuf )) {
-HXLINE( 132)							_this17->flush();
+HXLINE( 133)					::String v9 = ::Std_obj::string(_hx_getEnumValueIndex(v));
+HXDLIN( 133)					{
+HXLINE( 133)						 ::StringBuf _this17 = this->buf;
+HXDLIN( 133)						if (::hx::IsNotNull( _this17->charBuf )) {
+HXLINE( 133)							_this17->flush();
             						}
-HXDLIN( 132)						if (::hx::IsNull( _this17->b )) {
-HXLINE( 132)							_this17->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v9));
+HXDLIN( 133)						if (::hx::IsNull( _this17->b )) {
+HXLINE( 133)							_this17->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v9));
             						}
             						else {
-HXLINE( 132)							::Array< ::String > _this18 = _this17->b;
-HXDLIN( 132)							_this18->push(::Std_obj::string(v9));
+HXLINE( 133)							::Array< ::String > _this18 = _this17->b;
+HXDLIN( 133)							_this18->push(::Std_obj::string(v9));
             						}
             					}
             				}
             				break;
             				case (int)8: {
-HXLINE(  86)					 ::StringBuf _this19 = this->buf;
-HXDLIN(  86)					if (::hx::IsNotNull( _this19->charBuf )) {
-HXLINE(  86)						_this19->flush();
+HXLINE(  87)					 ::StringBuf _this19 = this->buf;
+HXDLIN(  87)					if (::hx::IsNotNull( _this19->charBuf )) {
+HXLINE(  87)						_this19->flush();
             					}
-HXDLIN(  86)					if (::hx::IsNull( _this19->b )) {
-HXLINE(  86)						_this19->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_6,1);
+HXDLIN(  87)					if (::hx::IsNull( _this19->b )) {
+HXLINE(  87)						_this19->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_8,1);
             					}
             					else {
-HXLINE(  86)						_this19->b->push(HX_("\"???\"",45,2f,74,bd));
+HXLINE(  87)						_this19->b->push(HX_("\"???\"",45,2f,74,bd));
             					}
             				}
             				break;
@@ -361,130 +403,138 @@ HXLINE(  86)						_this19->b->push(HX_("\"???\"",45,2f,74,bd));
 HX_DEFINE_DYNAMIC_FUNC2(JsonPrinter_obj,write,(void))
 
 void JsonPrinter_obj::classString( ::Dynamic v){
-            	HX_STACKFRAME(&_hx_pos_d3ea37de6dab7070_158_classString)
-HXDLIN( 158)		this->fieldsString(v,::Type_obj::getInstanceFields(::Type_obj::getClass(v)));
+            	HX_STACKFRAME(&_hx_pos_d3ea37de6dab7070_159_classString)
+HXDLIN( 159)		this->fieldsString(v,::Type_obj::getInstanceFields(::Type_obj::getClass(v)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(JsonPrinter_obj,classString,(void))
 
+void JsonPrinter_obj::objString( ::Dynamic v){
+            	HX_STACKFRAME(&_hx_pos_d3ea37de6dab7070_163_objString)
+HXDLIN( 163)		this->fieldsString(v,::Reflect_obj::fields(v));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(JsonPrinter_obj,objString,(void))
+
 void JsonPrinter_obj::fieldsString( ::Dynamic v,::Array< ::String > fields){
-            	HX_STACKFRAME(&_hx_pos_d3ea37de6dab7070_165_fieldsString)
-HXLINE( 166)		{
-HXLINE( 166)			 ::StringBuf _this = this->buf;
-HXDLIN( 166)			{
-HXLINE( 166)				if (::hx::IsNull( _this->charBuf )) {
-HXLINE( 166)					_this->charBuf = ::Array_obj< char >::__new();
+            	HX_STACKFRAME(&_hx_pos_d3ea37de6dab7070_166_fieldsString)
+HXLINE( 167)		{
+HXLINE( 167)			 ::StringBuf _this = this->buf;
+HXDLIN( 167)			{
+HXLINE( 167)				if (::hx::IsNull( _this->charBuf )) {
+HXLINE( 167)					_this->charBuf = ::Array_obj< char >::__new();
             				}
-HXDLIN( 166)				_this->charBuf->push(123);
+HXDLIN( 167)				_this->charBuf->push(123);
             			}
             		}
-HXLINE( 167)		int len = fields->length;
-HXLINE( 168)		bool empty = true;
-HXLINE( 169)		{
-HXLINE( 169)			int _g = 0;
-HXDLIN( 169)			while((_g < len)){
-HXLINE( 169)				_g = (_g + 1);
-HXLINE( 170)				::String f = fields->__get((_g - 1));
-HXLINE( 171)				 ::Dynamic value = ::Reflect_obj::field(v,f);
-HXLINE( 172)				if (::Reflect_obj::isFunction(value)) {
-HXLINE( 173)					continue;
+HXLINE( 168)		int len = fields->length;
+HXLINE( 169)		bool empty = true;
+HXLINE( 170)		{
+HXLINE( 170)			int _g = 0;
+HXDLIN( 170)			while((_g < len)){
+HXLINE( 170)				_g = (_g + 1);
+HXLINE( 171)				::String f = fields->__get((_g - 1));
+HXLINE( 172)				 ::Dynamic value = ::Reflect_obj::field(v,f);
+HXLINE( 173)				if (::Reflect_obj::isFunction(value)) {
+HXLINE( 174)					continue;
             				}
-HXLINE( 174)				if (empty) {
-HXLINE( 175)					this->nind++;
-HXLINE( 176)					empty = false;
+HXLINE( 175)				if (empty) {
+HXLINE( 176)					this->nind++;
+HXLINE( 177)					empty = false;
             				}
             				else {
-HXLINE( 178)					 ::StringBuf _this1 = this->buf;
-HXDLIN( 178)					{
-HXLINE( 178)						if (::hx::IsNull( _this1->charBuf )) {
-HXLINE( 178)							_this1->charBuf = ::Array_obj< char >::__new();
-            						}
-HXDLIN( 178)						_this1->charBuf->push(44);
-            					}
-            				}
-HXLINE( 179)				if (this->pretty) {
-HXLINE( 179)					 ::StringBuf _this2 = this->buf;
+HXLINE( 179)					 ::StringBuf _this1 = this->buf;
 HXDLIN( 179)					{
-HXLINE( 179)						if (::hx::IsNull( _this2->charBuf )) {
-HXLINE( 179)							_this2->charBuf = ::Array_obj< char >::__new();
+HXLINE( 179)						if (::hx::IsNull( _this1->charBuf )) {
+HXLINE( 179)							_this1->charBuf = ::Array_obj< char >::__new();
             						}
-HXDLIN( 179)						_this2->charBuf->push(10);
+HXDLIN( 179)						_this1->charBuf->push(44);
             					}
             				}
 HXLINE( 180)				if (this->pretty) {
-HXLINE( 180)					::String v1 = ::StringTools_obj::lpad(HX_("",00,00,00,00),this->indent,(this->nind * this->indent.length));
+HXLINE( 180)					 ::StringBuf _this2 = this->buf;
 HXDLIN( 180)					{
-HXLINE( 180)						 ::StringBuf _this3 = this->buf;
-HXDLIN( 180)						if (::hx::IsNotNull( _this3->charBuf )) {
-HXLINE( 180)							_this3->flush();
+HXLINE( 180)						if (::hx::IsNull( _this2->charBuf )) {
+HXLINE( 180)							_this2->charBuf = ::Array_obj< char >::__new();
             						}
-HXDLIN( 180)						if (::hx::IsNull( _this3->b )) {
-HXLINE( 180)							_this3->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v1));
+HXDLIN( 180)						_this2->charBuf->push(10);
+            					}
+            				}
+HXLINE( 181)				if (this->pretty) {
+HXLINE( 181)					::String v1 = ::StringTools_obj::lpad(HX_("",00,00,00,00),this->indent,(this->nind * this->indent.length));
+HXDLIN( 181)					{
+HXLINE( 181)						 ::StringBuf _this3 = this->buf;
+HXDLIN( 181)						if (::hx::IsNotNull( _this3->charBuf )) {
+HXLINE( 181)							_this3->flush();
+            						}
+HXDLIN( 181)						if (::hx::IsNull( _this3->b )) {
+HXLINE( 181)							_this3->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v1));
             						}
             						else {
-HXLINE( 180)							::Array< ::String > _this4 = _this3->b;
-HXDLIN( 180)							_this4->push(::Std_obj::string(v1));
+HXLINE( 181)							::Array< ::String > _this4 = _this3->b;
+HXDLIN( 181)							_this4->push(::Std_obj::string(v1));
             						}
             					}
             				}
-HXLINE( 181)				this->quote(f);
-HXLINE( 182)				{
-HXLINE( 182)					 ::StringBuf _this5 = this->buf;
-HXDLIN( 182)					{
-HXLINE( 182)						if (::hx::IsNull( _this5->charBuf )) {
-HXLINE( 182)							_this5->charBuf = ::Array_obj< char >::__new();
+HXLINE( 182)				this->quote(f);
+HXLINE( 183)				{
+HXLINE( 183)					 ::StringBuf _this5 = this->buf;
+HXDLIN( 183)					{
+HXLINE( 183)						if (::hx::IsNull( _this5->charBuf )) {
+HXLINE( 183)							_this5->charBuf = ::Array_obj< char >::__new();
             						}
-HXDLIN( 182)						_this5->charBuf->push(58);
+HXDLIN( 183)						_this5->charBuf->push(58);
             					}
             				}
-HXLINE( 183)				if (this->pretty) {
-HXLINE( 184)					 ::StringBuf _this6 = this->buf;
-HXDLIN( 184)					{
-HXLINE( 184)						if (::hx::IsNull( _this6->charBuf )) {
-HXLINE( 184)							_this6->charBuf = ::Array_obj< char >::__new();
+HXLINE( 184)				if (this->pretty) {
+HXLINE( 185)					 ::StringBuf _this6 = this->buf;
+HXDLIN( 185)					{
+HXLINE( 185)						if (::hx::IsNull( _this6->charBuf )) {
+HXLINE( 185)							_this6->charBuf = ::Array_obj< char >::__new();
             						}
-HXDLIN( 184)						_this6->charBuf->push(32);
+HXDLIN( 185)						_this6->charBuf->push(32);
             					}
             				}
-HXLINE( 185)				this->write(f,value);
+HXLINE( 186)				this->write(f,value);
             			}
             		}
-HXLINE( 187)		if (!(empty)) {
-HXLINE( 188)			this->nind--;
-HXLINE( 189)			if (this->pretty) {
-HXLINE( 189)				 ::StringBuf _this7 = this->buf;
-HXDLIN( 189)				{
-HXLINE( 189)					if (::hx::IsNull( _this7->charBuf )) {
-HXLINE( 189)						_this7->charBuf = ::Array_obj< char >::__new();
-            					}
-HXDLIN( 189)					_this7->charBuf->push(10);
-            				}
-            			}
+HXLINE( 188)		if (!(empty)) {
+HXLINE( 189)			this->nind--;
 HXLINE( 190)			if (this->pretty) {
-HXLINE( 190)				::String v2 = ::StringTools_obj::lpad(HX_("",00,00,00,00),this->indent,(this->nind * this->indent.length));
+HXLINE( 190)				 ::StringBuf _this7 = this->buf;
 HXDLIN( 190)				{
-HXLINE( 190)					 ::StringBuf _this8 = this->buf;
-HXDLIN( 190)					if (::hx::IsNotNull( _this8->charBuf )) {
-HXLINE( 190)						_this8->flush();
+HXLINE( 190)					if (::hx::IsNull( _this7->charBuf )) {
+HXLINE( 190)						_this7->charBuf = ::Array_obj< char >::__new();
             					}
-HXDLIN( 190)					if (::hx::IsNull( _this8->b )) {
-HXLINE( 190)						_this8->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v2));
+HXDLIN( 190)					_this7->charBuf->push(10);
+            				}
+            			}
+HXLINE( 191)			if (this->pretty) {
+HXLINE( 191)				::String v2 = ::StringTools_obj::lpad(HX_("",00,00,00,00),this->indent,(this->nind * this->indent.length));
+HXDLIN( 191)				{
+HXLINE( 191)					 ::StringBuf _this8 = this->buf;
+HXDLIN( 191)					if (::hx::IsNotNull( _this8->charBuf )) {
+HXLINE( 191)						_this8->flush();
+            					}
+HXDLIN( 191)					if (::hx::IsNull( _this8->b )) {
+HXLINE( 191)						_this8->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(v2));
             					}
             					else {
-HXLINE( 190)						::Array< ::String > _this9 = _this8->b;
-HXDLIN( 190)						_this9->push(::Std_obj::string(v2));
+HXLINE( 191)						::Array< ::String > _this9 = _this8->b;
+HXDLIN( 191)						_this9->push(::Std_obj::string(v2));
             					}
             				}
             			}
             		}
-HXLINE( 192)		{
-HXLINE( 192)			 ::StringBuf _this10 = this->buf;
-HXDLIN( 192)			{
-HXLINE( 192)				if (::hx::IsNull( _this10->charBuf )) {
-HXLINE( 192)					_this10->charBuf = ::Array_obj< char >::__new();
+HXLINE( 193)		{
+HXLINE( 193)			 ::StringBuf _this10 = this->buf;
+HXDLIN( 193)			{
+HXLINE( 193)				if (::hx::IsNull( _this10->charBuf )) {
+HXLINE( 193)					_this10->charBuf = ::Array_obj< char >::__new();
             				}
-HXDLIN( 192)				_this10->charBuf->push(125);
+HXDLIN( 193)				_this10->charBuf->push(125);
             			}
             		}
             	}
@@ -493,161 +543,161 @@ HXDLIN( 192)				_this10->charBuf->push(125);
 HX_DEFINE_DYNAMIC_FUNC2(JsonPrinter_obj,fieldsString,(void))
 
 void JsonPrinter_obj::quote(::String s){
-            	HX_STACKFRAME(&_hx_pos_d3ea37de6dab7070_195_quote)
-HXLINE( 196)		{
-HXLINE( 196)			 ::StringBuf _this = this->buf;
-HXDLIN( 196)			{
-HXLINE( 196)				if (::hx::IsNull( _this->charBuf )) {
-HXLINE( 196)					_this->charBuf = ::Array_obj< char >::__new();
+            	HX_STACKFRAME(&_hx_pos_d3ea37de6dab7070_196_quote)
+HXLINE( 197)		{
+HXLINE( 197)			 ::StringBuf _this = this->buf;
+HXDLIN( 197)			{
+HXLINE( 197)				if (::hx::IsNull( _this->charBuf )) {
+HXLINE( 197)					_this->charBuf = ::Array_obj< char >::__new();
             				}
-HXDLIN( 196)				_this->charBuf->push(34);
+HXDLIN( 197)				_this->charBuf->push(34);
             			}
             		}
-HXLINE( 197)		{
-HXLINE( 197)			int _g_offset = 0;
-HXDLIN( 197)			::String _g_s = s;
-HXDLIN( 197)			while((_g_offset < _g_s.length)){
-HXLINE( 197)				_g_offset = (_g_offset + 1);
-HXDLIN( 197)				int index = (_g_offset - 1);
-HXDLIN( 197)				int c = _g_s.cca(index);
-HXDLIN( 197)				bool _hx_tmp;
-HXDLIN( 197)				if ((c >= 55296)) {
-HXLINE( 197)					_hx_tmp = (c <= 56319);
+HXLINE( 198)		{
+HXLINE( 198)			int _g_offset = 0;
+HXDLIN( 198)			::String _g_s = s;
+HXDLIN( 198)			while((_g_offset < _g_s.length)){
+HXLINE( 198)				_g_offset = (_g_offset + 1);
+HXDLIN( 198)				int index = (_g_offset - 1);
+HXDLIN( 198)				int c = _g_s.cca(index);
+HXDLIN( 198)				bool _hx_tmp;
+HXDLIN( 198)				if ((c >= 55296)) {
+HXLINE( 198)					_hx_tmp = (c <= 56319);
             				}
             				else {
-HXLINE( 197)					_hx_tmp = false;
+HXLINE( 198)					_hx_tmp = false;
             				}
-HXDLIN( 197)				if (_hx_tmp) {
+HXDLIN( 198)				if (_hx_tmp) {
 HXLINE( 639)					c = (((c - 55232) << 10) | (_g_s.cca((index + 1)) & 1023));
             				}
-HXLINE( 197)				int c1 = c;
-HXDLIN( 197)				if ((c1 >= 65536)) {
-HXLINE( 197)					_g_offset = (_g_offset + 1);
+HXLINE( 198)				int c1 = c;
+HXDLIN( 198)				if ((c1 >= 65536)) {
+HXLINE( 198)					_g_offset = (_g_offset + 1);
             				}
-HXLINE( 198)				switch((int)(c1)){
+HXLINE( 199)				switch((int)(c1)){
             					case (int)8: {
-HXLINE( 210)						 ::StringBuf _this1 = this->buf;
-HXDLIN( 210)						if (::hx::IsNotNull( _this1->charBuf )) {
-HXLINE( 210)							_this1->flush();
+HXLINE( 211)						 ::StringBuf _this1 = this->buf;
+HXDLIN( 211)						if (::hx::IsNotNull( _this1->charBuf )) {
+HXLINE( 211)							_this1->flush();
             						}
-HXDLIN( 210)						if (::hx::IsNull( _this1->b )) {
-HXLINE( 210)							_this1->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_12,1);
+HXDLIN( 211)						if (::hx::IsNull( _this1->b )) {
+HXLINE( 211)							_this1->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_15,1);
             						}
             						else {
-HXLINE( 210)							_this1->b->push(HX_("\\b",86,50,00,00));
+HXLINE( 211)							_this1->b->push(HX_("\\b",86,50,00,00));
             						}
             					}
             					break;
             					case (int)9: {
-HXLINE( 208)						 ::StringBuf _this2 = this->buf;
-HXDLIN( 208)						if (::hx::IsNotNull( _this2->charBuf )) {
-HXLINE( 208)							_this2->flush();
+HXLINE( 209)						 ::StringBuf _this2 = this->buf;
+HXDLIN( 209)						if (::hx::IsNotNull( _this2->charBuf )) {
+HXLINE( 209)							_this2->flush();
             						}
-HXDLIN( 208)						if (::hx::IsNull( _this2->b )) {
-HXLINE( 208)							_this2->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_13,1);
+HXDLIN( 209)						if (::hx::IsNull( _this2->b )) {
+HXLINE( 209)							_this2->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_16,1);
             						}
             						else {
-HXLINE( 208)							_this2->b->push(HX_("\\t",98,50,00,00));
+HXLINE( 209)							_this2->b->push(HX_("\\t",98,50,00,00));
             						}
             					}
             					break;
             					case (int)10: {
-HXLINE( 204)						 ::StringBuf _this3 = this->buf;
-HXDLIN( 204)						if (::hx::IsNotNull( _this3->charBuf )) {
-HXLINE( 204)							_this3->flush();
+HXLINE( 205)						 ::StringBuf _this3 = this->buf;
+HXDLIN( 205)						if (::hx::IsNotNull( _this3->charBuf )) {
+HXLINE( 205)							_this3->flush();
             						}
-HXDLIN( 204)						if (::hx::IsNull( _this3->b )) {
-HXLINE( 204)							_this3->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_14,1);
+HXDLIN( 205)						if (::hx::IsNull( _this3->b )) {
+HXLINE( 205)							_this3->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_17,1);
             						}
             						else {
-HXLINE( 204)							_this3->b->push(HX_("\\n",92,50,00,00));
+HXLINE( 205)							_this3->b->push(HX_("\\n",92,50,00,00));
             						}
             					}
             					break;
             					case (int)12: {
-HXLINE( 212)						 ::StringBuf _this4 = this->buf;
-HXDLIN( 212)						if (::hx::IsNotNull( _this4->charBuf )) {
-HXLINE( 212)							_this4->flush();
+HXLINE( 213)						 ::StringBuf _this4 = this->buf;
+HXDLIN( 213)						if (::hx::IsNotNull( _this4->charBuf )) {
+HXLINE( 213)							_this4->flush();
             						}
-HXDLIN( 212)						if (::hx::IsNull( _this4->b )) {
-HXLINE( 212)							_this4->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_15,1);
+HXDLIN( 213)						if (::hx::IsNull( _this4->b )) {
+HXLINE( 213)							_this4->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_18,1);
             						}
             						else {
-HXLINE( 212)							_this4->b->push(HX_("\\f",8a,50,00,00));
+HXLINE( 213)							_this4->b->push(HX_("\\f",8a,50,00,00));
             						}
             					}
             					break;
             					case (int)13: {
-HXLINE( 206)						 ::StringBuf _this5 = this->buf;
-HXDLIN( 206)						if (::hx::IsNotNull( _this5->charBuf )) {
-HXLINE( 206)							_this5->flush();
+HXLINE( 207)						 ::StringBuf _this5 = this->buf;
+HXDLIN( 207)						if (::hx::IsNotNull( _this5->charBuf )) {
+HXLINE( 207)							_this5->flush();
             						}
-HXDLIN( 206)						if (::hx::IsNull( _this5->b )) {
-HXLINE( 206)							_this5->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_16,1);
+HXDLIN( 207)						if (::hx::IsNull( _this5->b )) {
+HXLINE( 207)							_this5->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_19,1);
             						}
             						else {
-HXLINE( 206)							_this5->b->push(HX_("\\r",96,50,00,00));
+HXLINE( 207)							_this5->b->push(HX_("\\r",96,50,00,00));
             						}
             					}
             					break;
             					case (int)34: {
-HXLINE( 200)						 ::StringBuf _this6 = this->buf;
-HXDLIN( 200)						if (::hx::IsNotNull( _this6->charBuf )) {
-HXLINE( 200)							_this6->flush();
+HXLINE( 201)						 ::StringBuf _this6 = this->buf;
+HXDLIN( 201)						if (::hx::IsNotNull( _this6->charBuf )) {
+HXLINE( 201)							_this6->flush();
             						}
-HXDLIN( 200)						if (::hx::IsNull( _this6->b )) {
-HXLINE( 200)							_this6->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_17,1);
+HXDLIN( 201)						if (::hx::IsNull( _this6->b )) {
+HXLINE( 201)							_this6->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_20,1);
             						}
             						else {
-HXLINE( 200)							_this6->b->push(HX_("\\\"",46,50,00,00));
+HXLINE( 201)							_this6->b->push(HX_("\\\"",46,50,00,00));
             						}
             					}
             					break;
             					case (int)92: {
-HXLINE( 202)						 ::StringBuf _this7 = this->buf;
-HXDLIN( 202)						if (::hx::IsNotNull( _this7->charBuf )) {
-HXLINE( 202)							_this7->flush();
+HXLINE( 203)						 ::StringBuf _this7 = this->buf;
+HXDLIN( 203)						if (::hx::IsNotNull( _this7->charBuf )) {
+HXLINE( 203)							_this7->flush();
             						}
-HXDLIN( 202)						if (::hx::IsNull( _this7->b )) {
-HXLINE( 202)							_this7->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_18,1);
+HXDLIN( 203)						if (::hx::IsNull( _this7->b )) {
+HXLINE( 203)							_this7->b = ::Array_obj< ::String >::fromData( _hx_array_data_27bf17a5_21,1);
             						}
             						else {
-HXLINE( 202)							_this7->b->push(HX_("\\\\",80,50,00,00));
+HXLINE( 203)							_this7->b->push(HX_("\\\\",80,50,00,00));
             						}
             					}
             					break;
             					default:{
-HXLINE( 214)						 ::StringBuf _this8 = this->buf;
-HXDLIN( 214)						if ((c1 >= 127)) {
-HXLINE( 214)							::String x = ::String::fromCharCode(c1);
-HXDLIN( 214)							if (::hx::IsNotNull( _this8->charBuf )) {
-HXLINE( 214)								_this8->flush();
+HXLINE( 215)						 ::StringBuf _this8 = this->buf;
+HXDLIN( 215)						if ((c1 >= 127)) {
+HXLINE( 215)							::String x = ::String::fromCharCode(c1);
+HXDLIN( 215)							if (::hx::IsNotNull( _this8->charBuf )) {
+HXLINE( 215)								_this8->flush();
             							}
-HXDLIN( 214)							if (::hx::IsNull( _this8->b )) {
-HXLINE( 214)								_this8->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(x));
+HXDLIN( 215)							if (::hx::IsNull( _this8->b )) {
+HXLINE( 215)								_this8->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(x));
             							}
             							else {
-HXLINE( 214)								::Array< ::String > _this9 = _this8->b;
-HXDLIN( 214)								_this9->push(::Std_obj::string(x));
+HXLINE( 215)								::Array< ::String > _this9 = _this8->b;
+HXDLIN( 215)								_this9->push(::Std_obj::string(x));
             							}
             						}
             						else {
-HXLINE( 214)							if (::hx::IsNull( _this8->charBuf )) {
-HXLINE( 214)								_this8->charBuf = ::Array_obj< char >::__new();
+HXLINE( 215)							if (::hx::IsNull( _this8->charBuf )) {
+HXLINE( 215)								_this8->charBuf = ::Array_obj< char >::__new();
             							}
-HXDLIN( 214)							_this8->charBuf->push(c1);
+HXDLIN( 215)							_this8->charBuf->push(c1);
             						}
             					}
             				}
             			}
             		}
-HXLINE( 217)		{
-HXLINE( 217)			 ::StringBuf _this10 = this->buf;
-HXDLIN( 217)			{
-HXLINE( 217)				if (::hx::IsNull( _this10->charBuf )) {
-HXLINE( 217)					_this10->charBuf = ::Array_obj< char >::__new();
+HXLINE( 218)		{
+HXLINE( 218)			 ::StringBuf _this10 = this->buf;
+HXDLIN( 218)			{
+HXLINE( 218)				if (::hx::IsNull( _this10->charBuf )) {
+HXLINE( 218)					_this10->charBuf = ::Array_obj< char >::__new();
             				}
-HXDLIN( 217)				_this10->charBuf->push(34);
+HXDLIN( 218)				_this10->charBuf->push(34);
             			}
             		}
             	}
@@ -656,10 +706,10 @@ HXDLIN( 217)				_this10->charBuf->push(34);
 HX_DEFINE_DYNAMIC_FUNC1(JsonPrinter_obj,quote,(void))
 
 ::String JsonPrinter_obj::print( ::Dynamic o, ::Dynamic replacer,::String space){
-            	HX_GC_STACKFRAME(&_hx_pos_d3ea37de6dab7070_44_print)
-HXLINE(  45)		 ::borogove::JsonPrinter printer =  ::borogove::JsonPrinter_obj::__alloc( HX_CTX ,replacer,space);
-HXLINE(  46)		printer->write(HX_("",00,00,00,00),o);
-HXLINE(  47)		return printer->buf->toString();
+            	HX_GC_STACKFRAME(&_hx_pos_d3ea37de6dab7070_45_print)
+HXLINE(  46)		 ::borogove::JsonPrinter printer =  ::borogove::JsonPrinter_obj::__alloc( HX_CTX ,replacer,space);
+HXLINE(  47)		printer->write(HX_("",00,00,00,00),o);
+HXLINE(  48)		return printer->buf->toString();
             	}
 
 
@@ -711,6 +761,8 @@ void JsonPrinter_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 4:
 		if (HX_FIELD_EQ(inName,"nind") ) { return ::hx::Val( nind ); }
+		if (HX_FIELD_EQ(inName,"ipad") ) { return ::hx::Val( ipad_dyn() ); }
+		if (HX_FIELD_EQ(inName,"newl") ) { return ::hx::Val( newl_dyn() ); }
 		break;
 	case 5:
 		if (HX_FIELD_EQ(inName,"write") ) { return ::hx::Val( write_dyn() ); }
@@ -723,6 +775,9 @@ void JsonPrinter_obj::__Visit(HX_VISIT_PARAMS)
 	case 8:
 		if (HX_FIELD_EQ(inName,"replacer") ) { return ::hx::Val( replacer ); }
 		break;
+	case 9:
+		if (HX_FIELD_EQ(inName,"objString") ) { return ::hx::Val( objString_dyn() ); }
+		break;
 	case 11:
 		if (HX_FIELD_EQ(inName,"classString") ) { return ::hx::Val( classString_dyn() ); }
 		break;
@@ -787,8 +842,11 @@ static ::String JsonPrinter_obj_sMemberFields[] = {
 	HX_("indent",6c,0c,f3,93),
 	HX_("pretty",b6,82,c1,ae),
 	HX_("nind",31,85,05,49),
+	HX_("ipad",8a,b8,bc,45),
+	HX_("newl",0c,84,02,49),
 	HX_("write",df,6c,59,d0),
 	HX_("classString",29,0f,79,88),
+	HX_("objString",28,00,a4,d9),
 	HX_("fieldsString",2a,cc,56,34),
 	HX_("quote",3c,23,f2,5d),
 	::String(null()) };
diff --git a/Sources/c_borogove/src/borogove/LinkMetadata.cpp b/Sources/c_borogove/src/borogove/LinkMetadata.cpp
new file mode 100644
index 0000000..89071ad
--- /dev/null
+++ b/Sources/c_borogove/src/borogove/LinkMetadata.cpp
@@ -0,0 +1,368 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED__HaxeCBridge_Internal
+#include <_HaxeCBridge/Internal.h>
+#endif
+#ifndef INCLUDED_borogove_LinkMetadata
+#include <borogove/LinkMetadata.h>
+#endif
+#ifndef INCLUDED_cpp_Int64Map
+#include <cpp/Int64Map.h>
+#endif
+#ifndef INCLUDED_haxe_IMap
+#include <haxe/IMap.h>
+#endif
+
+HX_DEFINE_STACK_FRAME(_hx_pos_8120eb91422b3a9e_41_new,"borogove.LinkMetadata","new",0x82e81308,"borogove.LinkMetadata.new","borogove/ChatMessage.hx",41,0xe4a3cadd)
+HX_LOCAL_STACK_FRAME(_hx_pos_e518ab4ca11f3b63_478_about__fromC,"borogove.LinkMetadata","about__fromC",0x51c6de24,"borogove.LinkMetadata.about__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e518ab4ca11f3b63_478_url__fromC,"borogove.LinkMetadata","url__fromC",0xa6310342,"borogove.LinkMetadata.url__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e518ab4ca11f3b63_478_title__fromC,"borogove.LinkMetadata","title__fromC",0xb613e639,"borogove.LinkMetadata.title__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e518ab4ca11f3b63_478_description__fromC,"borogove.LinkMetadata","description__fromC",0x66c9b955,"borogove.LinkMetadata.description__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e518ab4ca11f3b63_452_image__fromC,"borogove.LinkMetadata","image__fromC",0x8215ead6,"borogove.LinkMetadata.image__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_e518ab4ca11f3b63_452_video__fromC,"borogove.LinkMetadata","video__fromC",0xac49d9b6,"borogove.LinkMetadata.video__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_8120eb91422b3a9e_32_boot,"borogove.LinkMetadata","boot",0x0041948a,"borogove.LinkMetadata.boot","borogove/ChatMessage.hx",32,0xe4a3cadd)
+namespace borogove{
+
+void LinkMetadata_obj::__construct(::String about,::String url,::String title,::String description,::Array< ::String > image,::Array< ::String > video){
+            	HX_STACKFRAME(&_hx_pos_8120eb91422b3a9e_41_new)
+HXLINE(  42)		this->about = about;
+HXLINE(  43)		::String _hx_tmp;
+HXDLIN(  43)		if (::hx::IsNotNull( url )) {
+HXLINE(  43)			_hx_tmp = url;
+            		}
+            		else {
+HXLINE(  43)			_hx_tmp = about;
+            		}
+HXDLIN(  43)		this->url = _hx_tmp;
+HXLINE(  44)		this->title = title;
+HXLINE(  45)		this->description = description;
+HXLINE(  46)		this->image = image;
+HXLINE(  47)		this->video = video;
+            	}
+
+Dynamic LinkMetadata_obj::__CreateEmpty() { return new LinkMetadata_obj; }
+
+void *LinkMetadata_obj::_hx_vtable = 0;
+
+Dynamic LinkMetadata_obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< LinkMetadata_obj > _hx_result = new LinkMetadata_obj();
+	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2],inArgs[3],inArgs[4],inArgs[5]);
+	return _hx_result;
+}
+
+bool LinkMetadata_obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x7d1b4e0a;
+}
+
+::String LinkMetadata_obj::about__fromC(){
+            	HX_STACKFRAME(&_hx_pos_e518ab4ca11f3b63_478_about__fromC)
+HXDLIN( 478)		return this->about;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(LinkMetadata_obj,about__fromC,return )
+
+::String LinkMetadata_obj::url__fromC(){
+            	HX_STACKFRAME(&_hx_pos_e518ab4ca11f3b63_478_url__fromC)
+HXDLIN( 478)		return this->url;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(LinkMetadata_obj,url__fromC,return )
+
+::String LinkMetadata_obj::title__fromC(){
+            	HX_STACKFRAME(&_hx_pos_e518ab4ca11f3b63_478_title__fromC)
+HXDLIN( 478)		return this->title;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(LinkMetadata_obj,title__fromC,return )
+
+::String LinkMetadata_obj::description__fromC(){
+            	HX_STACKFRAME(&_hx_pos_e518ab4ca11f3b63_478_description__fromC)
+HXDLIN( 478)		return this->description;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(LinkMetadata_obj,description__fromC,return )
+
+size_t LinkMetadata_obj::image__fromC(const char*** outPtr){
+            	HX_STACKFRAME(&_hx_pos_e518ab4ca11f3b63_452_image__fromC)
+HXDLIN( 452)		::Array< ::String > x = this->image;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			::Array< ::String > x1 = x;
+HXDLIN( 452)			::Array< size_t > arr = ::Array_obj< size_t >::__new(x1->length);
+HXDLIN( 452)			{
+HXDLIN( 452)				int _g_current = 0;
+HXDLIN( 452)				::Array< ::String > _g_array = x1;
+HXDLIN( 452)				while((_g_current < _g_array->length)){
+HXDLIN( 452)					::String _g_value = _g_array->__get(_g_current);
+HXDLIN( 452)					_g_current = (_g_current + 1);
+HXDLIN( 452)					::String el = _g_value;
+HXDLIN( 452)					{
+HXDLIN( 452)						const char* cStrPtr = el.utf8_str();
+HXDLIN( 452)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
+HXDLIN( 452)						{
+HXDLIN( 452)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 452)							if (::hx::IsNull( store )) {
+HXLINE(2390)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            									->setFixed(1,HX_("value",71,7f,b8,31),el));
+HXLINE( 452)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            							}
+            							else {
+HXDLIN( 452)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            							}
+            						}
+HXDLIN( 452)						const char* ptr = cStrPtr;
+HXDLIN( 452)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
+            					}
+            				}
+            			}
+HXDLIN( 452)			void** ptr1 = (void**)arr->getBase();
+HXDLIN( 452)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
+HXDLIN( 452)			{
+HXDLIN( 452)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN( 452)				if (::hx::IsNull( store1 )) {
+HXLINE(2390)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            						->setFixed(1,HX_("value",71,7f,b8,31),arr));
+HXLINE( 452)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+            				}
+            				else {
+HXDLIN( 452)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+            				}
+            			}
+HXDLIN( 452)			_hx_tmp->set_ref(( (const char**)(ptr1) ));
+            		}
+HXDLIN( 452)		return ( (size_t)(x->length) );
+            	}
+
+
+size_t LinkMetadata_obj::video__fromC(const char*** outPtr){
+            	HX_STACKFRAME(&_hx_pos_e518ab4ca11f3b63_452_video__fromC)
+HXDLIN( 452)		::Array< ::String > x = this->video;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			::Array< ::String > x1 = x;
+HXDLIN( 452)			::Array< size_t > arr = ::Array_obj< size_t >::__new(x1->length);
+HXDLIN( 452)			{
+HXDLIN( 452)				int _g_current = 0;
+HXDLIN( 452)				::Array< ::String > _g_array = x1;
+HXDLIN( 452)				while((_g_current < _g_array->length)){
+HXDLIN( 452)					::String _g_value = _g_array->__get(_g_current);
+HXDLIN( 452)					_g_current = (_g_current + 1);
+HXDLIN( 452)					::String el = _g_value;
+HXDLIN( 452)					{
+HXDLIN( 452)						const char* cStrPtr = el.utf8_str();
+HXDLIN( 452)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
+HXDLIN( 452)						{
+HXDLIN( 452)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 452)							if (::hx::IsNull( store )) {
+HXLINE(2390)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            									->setFixed(1,HX_("value",71,7f,b8,31),el));
+HXLINE( 452)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            							}
+            							else {
+HXDLIN( 452)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            							}
+            						}
+HXDLIN( 452)						const char* ptr = cStrPtr;
+HXDLIN( 452)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
+            					}
+            				}
+            			}
+HXDLIN( 452)			void** ptr1 = (void**)arr->getBase();
+HXDLIN( 452)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
+HXDLIN( 452)			{
+HXDLIN( 452)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN( 452)				if (::hx::IsNull( store1 )) {
+HXLINE(2390)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            						->setFixed(1,HX_("value",71,7f,b8,31),arr));
+HXLINE( 452)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+            				}
+            				else {
+HXDLIN( 452)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+            				}
+            			}
+HXDLIN( 452)			_hx_tmp->set_ref(( (const char**)(ptr1) ));
+            		}
+HXDLIN( 452)		return ( (size_t)(x->length) );
+            	}
+
+
+
+::hx::ObjectPtr< LinkMetadata_obj > LinkMetadata_obj::__new(::String about,::String url,::String title,::String description,::Array< ::String > image,::Array< ::String > video) {
+	::hx::ObjectPtr< LinkMetadata_obj > __this = new LinkMetadata_obj();
+	__this->__construct(about,url,title,description,image,video);
+	return __this;
+}
+
+::hx::ObjectPtr< LinkMetadata_obj > LinkMetadata_obj::__alloc(::hx::Ctx *_hx_ctx,::String about,::String url,::String title,::String description,::Array< ::String > image,::Array< ::String > video) {
+	LinkMetadata_obj *__this = (LinkMetadata_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(LinkMetadata_obj), true, "borogove.LinkMetadata"));
+	*(void **)__this = LinkMetadata_obj::_hx_vtable;
+	__this->__construct(about,url,title,description,image,video);
+	return __this;
+}
+
+LinkMetadata_obj::LinkMetadata_obj()
+{
+}
+
+void LinkMetadata_obj::__Mark(HX_MARK_PARAMS)
+{
+	HX_MARK_BEGIN_CLASS(LinkMetadata);
+	HX_MARK_MEMBER_NAME(about,"about");
+	HX_MARK_MEMBER_NAME(url,"url");
+	HX_MARK_MEMBER_NAME(title,"title");
+	HX_MARK_MEMBER_NAME(description,"description");
+	HX_MARK_MEMBER_NAME(image,"image");
+	HX_MARK_MEMBER_NAME(video,"video");
+	HX_MARK_END_CLASS();
+}
+
+void LinkMetadata_obj::__Visit(HX_VISIT_PARAMS)
+{
+	HX_VISIT_MEMBER_NAME(about,"about");
+	HX_VISIT_MEMBER_NAME(url,"url");
+	HX_VISIT_MEMBER_NAME(title,"title");
+	HX_VISIT_MEMBER_NAME(description,"description");
+	HX_VISIT_MEMBER_NAME(image,"image");
+	HX_VISIT_MEMBER_NAME(video,"video");
+}
+
+::hx::Val LinkMetadata_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 3:
+		if (HX_FIELD_EQ(inName,"url") ) { return ::hx::Val( url ); }
+		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"about") ) { return ::hx::Val( about ); }
+		if (HX_FIELD_EQ(inName,"title") ) { return ::hx::Val( title ); }
+		if (HX_FIELD_EQ(inName,"image") ) { return ::hx::Val( image ); }
+		if (HX_FIELD_EQ(inName,"video") ) { return ::hx::Val( video ); }
+		break;
+	case 10:
+		if (HX_FIELD_EQ(inName,"url__fromC") ) { return ::hx::Val( url__fromC_dyn() ); }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"description") ) { return ::hx::Val( description ); }
+		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"about__fromC") ) { return ::hx::Val( about__fromC_dyn() ); }
+		if (HX_FIELD_EQ(inName,"title__fromC") ) { return ::hx::Val( title__fromC_dyn() ); }
+		break;
+	case 18:
+		if (HX_FIELD_EQ(inName,"description__fromC") ) { return ::hx::Val( description__fromC_dyn() ); }
+	}
+	return super::__Field(inName,inCallProp);
+}
+
+::hx::Val LinkMetadata_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 3:
+		if (HX_FIELD_EQ(inName,"url") ) { url=inValue.Cast< ::String >(); return inValue; }
+		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"about") ) { about=inValue.Cast< ::String >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"title") ) { title=inValue.Cast< ::String >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"image") ) { image=inValue.Cast< ::Array< ::String > >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"video") ) { video=inValue.Cast< ::Array< ::String > >(); return inValue; }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"description") ) { description=inValue.Cast< ::String >(); return inValue; }
+	}
+	return super::__SetField(inName,inValue,inCallProp);
+}
+
+void LinkMetadata_obj::__GetFields(Array< ::String> &outFields)
+{
+	outFields->push(HX_("about",4d,ce,f9,1a));
+	outFields->push(HX_("url",6f,2b,59,00));
+	outFields->push(HX_("title",98,15,3b,10));
+	outFields->push(HX_("description",fc,08,1d,5f));
+	outFields->push(HX_("image",5b,1f,69,bd));
+	outFields->push(HX_("video",7b,14,fc,36));
+	super::__GetFields(outFields);
+};
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo LinkMetadata_obj_sMemberStorageInfo[] = {
+	{::hx::fsString,(int)offsetof(LinkMetadata_obj,about),HX_("about",4d,ce,f9,1a)},
+	{::hx::fsString,(int)offsetof(LinkMetadata_obj,url),HX_("url",6f,2b,59,00)},
+	{::hx::fsString,(int)offsetof(LinkMetadata_obj,title),HX_("title",98,15,3b,10)},
+	{::hx::fsString,(int)offsetof(LinkMetadata_obj,description),HX_("description",fc,08,1d,5f)},
+	{::hx::fsObject /* ::Array< ::String > */ ,(int)offsetof(LinkMetadata_obj,image),HX_("image",5b,1f,69,bd)},
+	{::hx::fsObject /* ::Array< ::String > */ ,(int)offsetof(LinkMetadata_obj,video),HX_("video",7b,14,fc,36)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+static ::hx::StaticInfo *LinkMetadata_obj_sStaticStorageInfo = 0;
+#endif
+
+static ::String LinkMetadata_obj_sMemberFields[] = {
+	HX_("about",4d,ce,f9,1a),
+	HX_("about__fromC",cc,b5,14,63),
+	HX_("url",6f,2b,59,00),
+	HX_("url__fromC",ea,20,be,63),
+	HX_("title",98,15,3b,10),
+	HX_("title__fromC",e1,bd,61,c7),
+	HX_("description",fc,08,1d,5f),
+	HX_("description__fromC",fd,be,a8,c0),
+	HX_("image",5b,1f,69,bd),
+	HX_("video",7b,14,fc,36),
+	::String(null()) };
+
+::hx::Class LinkMetadata_obj::__mClass;
+
+void LinkMetadata_obj::__register()
+{
+	LinkMetadata_obj _hx_dummy;
+	LinkMetadata_obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("borogove.LinkMetadata",16,2f,18,f8);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &::hx::Class_obj::GetNoStaticField;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(0 /* sStaticFields */);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(LinkMetadata_obj_sMemberFields);
+	__mClass->mCanCast = ::hx::TCanCast< LinkMetadata_obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = LinkMetadata_obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = LinkMetadata_obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+void LinkMetadata_obj::__boot()
+{
+{
+            	HX_STACKFRAME(&_hx_pos_8120eb91422b3a9e_32_boot)
+HXDLIN(  32)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(6)
+            				->setFixed(0,HX_("image__fromC",7e,c2,63,93), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(1,HX_("video__fromC",5e,b1,97,bd), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(2,HX_("description__fromC",fd,be,a8,c0), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(3,HX_("title__fromC",e1,bd,61,c7), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(4,HX_("about__fromC",cc,b5,14,63), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(5,HX_("url__fromC",ea,20,be,63), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null()))))));
+            	}
+}
+
+} // end namespace borogove
diff --git a/Sources/c_borogove/src/borogove/Member.cpp b/Sources/c_borogove/src/borogove/Member.cpp
new file mode 100644
index 0000000..03d4dd9
--- /dev/null
+++ b/Sources/c_borogove/src/borogove/Member.cpp
@@ -0,0 +1,771 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_Reflect
+#include <Reflect.h>
+#endif
+#ifndef INCLUDED_Std
+#include <Std.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_Internal
+#include <_HaxeCBridge/Internal.h>
+#endif
+#ifndef INCLUDED_borogove_AvailableChat
+#include <borogove/AvailableChat.h>
+#endif
+#ifndef INCLUDED_borogove_Client
+#include <borogove/Client.h>
+#endif
+#ifndef INCLUDED_borogove_Color
+#include <borogove/Color.h>
+#endif
+#ifndef INCLUDED_borogove_EventEmitter
+#include <borogove/EventEmitter.h>
+#endif
+#ifndef INCLUDED_borogove_JID
+#include <borogove/JID.h>
+#endif
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
+#endif
+#ifndef INCLUDED_borogove_Profile
+#include <borogove/Profile.h>
+#endif
+#ifndef INCLUDED_borogove_ProfileItem
+#include <borogove/ProfileItem.h>
+#endif
+#ifndef INCLUDED_borogove_Role
+#include <borogove/Role.h>
+#endif
+#ifndef INCLUDED_borogove_Stanza
+#include <borogove/Stanza.h>
+#endif
+#ifndef INCLUDED_borogove_Status
+#include <borogove/Status.h>
+#endif
+#ifndef INCLUDED_borogove_queries_GenericQuery
+#include <borogove/queries/GenericQuery.h>
+#endif
+#ifndef INCLUDED_borogove_queries_PubsubGet
+#include <borogove/queries/PubsubGet.h>
+#endif
+#ifndef INCLUDED_cpp_Int64Map
+#include <cpp/Int64Map.h>
+#endif
+#ifndef INCLUDED_haxe_IMap
+#include <haxe/IMap.h>
+#endif
+#ifndef INCLUDED_haxe_ds_StringMap
+#include <haxe/ds/StringMap.h>
+#endif
+#ifndef INCLUDED_thenshim_Thenable
+#include <thenshim/Thenable.h>
+#endif
+#ifndef INCLUDED_thenshim__Promise_Promise_Impl_
+#include <thenshim/_Promise/Promise_Impl_.h>
+#endif
+
+HX_DEFINE_STACK_FRAME(_hx_pos_403768415749ca4b_65_new,"borogove.Member","new",0xaa333499,"borogove.Member.new","borogove/Member.hx",65,0x7e7898d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_de8dc97d744cad10_478_id__fromC,"borogove.Member","id__fromC",0xcd6eeaf7,"borogove.Member.id__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_de8dc97d744cad10_478_displayName__fromC,"borogove.Member","displayName__fromC",0x95afe253,"borogove.Member.displayName__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_de8dc97d744cad10_478_photoUri__fromC,"borogove.Member","photoUri__fromC",0x123d7f98,"borogove.Member.photoUri__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_de8dc97d744cad10_478_placeholderUri__fromC,"borogove.Member","placeholderUri__fromC",0x4f151659,"borogove.Member.placeholderUri__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_de8dc97d744cad10_478_isSelf__fromC,"borogove.Member","isSelf__fromC",0xed58441c,"borogove.Member.isSelf__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_de8dc97d744cad10_478_chat__fromC,"borogove.Member","chat__fromC",0xa328e1da,"borogove.Member.chat__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_de8dc97d744cad10_452_roles__fromC,"borogove.Member","roles__fromC",0x2c96d283,"borogove.Member.roles__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_de8dc97d744cad10_478_showPresence__fromC,"borogove.Member","showPresence__fromC",0x7575295a,"borogove.Member.showPresence__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_403768415749ca4b_95_profile,"borogove.Member","profile",0x5c81bde2,"borogove.Member.profile","borogove/Member.hx",95,0x7e7898d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_403768415749ca4b_93_profile,"borogove.Member","profile",0x5c81bde2,"borogove.Member.profile","borogove/Member.hx",93,0x7e7898d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_403768415749ca4b_92_profile,"borogove.Member","profile",0x5c81bde2,"borogove.Member.profile","borogove/Member.hx",92,0x7e7898d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_de8dc97d744cad10_365_profile__fromC,"borogove.Member","profile__fromC",0xd35512d7,"borogove.Member.profile__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_403768415749ca4b_117_status,"borogove.Member","status",0xd0802c99,"borogove.Member.status","borogove/Member.hx",117,0x7e7898d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_403768415749ca4b_115_status,"borogove.Member","status",0xd0802c99,"borogove.Member.status","borogove/Member.hx",115,0x7e7898d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_403768415749ca4b_114_status,"borogove.Member","status",0xd0802c99,"borogove.Member.status","borogove/Member.hx",114,0x7e7898d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_de8dc97d744cad10_365_status__fromC,"borogove.Member","status__fromC",0x8b2ff900,"borogove.Member.status__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_403768415749ca4b_20_boot,"borogove.Member","boot",0x3ab3d1d9,"borogove.Member.boot","borogove/Member.hx",20,0x7e7898d6)
+namespace borogove{
+
+void Member_obj::__construct(::String id,::String displayName,::String photoUri,bool isSelf,::Array< ::Dynamic> roles, ::borogove::JID jid, ::haxe::ds::StringMap presence, ::borogove::AvailableChat chat){
+            	HX_STACKFRAME(&_hx_pos_403768415749ca4b_65_new)
+HXLINE(  66)		this->id = id;
+HXLINE(  67)		this->displayName = displayName;
+HXLINE(  68)		this->photoUri = photoUri;
+HXLINE(  69)		this->placeholderUri = ::borogove::Color_obj::defaultPhoto(id,displayName.charAt(0).toUpperCase());
+HXLINE(  70)		this->isSelf = isSelf;
+HXLINE(  71)		this->roles = roles;
+HXLINE(  72)		this->jid = jid;
+HXLINE(  73)		this->presence = presence;
+HXLINE(  74)		this->chat = chat;
+HXLINE(  75)		int lowestShow = 4;
+HXLINE(  76)		int highestPrio = -100000;
+HXLINE(  77)		{
+HXLINE(  77)			::Dynamic map = presence;
+HXDLIN(  77)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(map);
+HXDLIN(  77)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(  77)				 ::borogove::Stanza _g_value = ( ( ::borogove::Stanza)(::haxe::IMap_obj::get(map,_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)())) );
+HXLINE(  78)				::String tmp = _g_value->getChildText(HX_("priority",64,7b,3e,bb),null());
+HXDLIN(  78)				::String tmp1;
+HXDLIN(  78)				if (::hx::IsNotNull( tmp )) {
+HXLINE(  78)					tmp1 = tmp;
+            				}
+            				else {
+HXLINE(  78)					tmp1 = HX_("0",30,00,00,00);
+            				}
+HXDLIN(  78)				 ::Dynamic tmp2 = ::Std_obj::parseInt(tmp1);
+HXDLIN(  78)				int _hx_tmp;
+HXDLIN(  78)				if (::hx::IsNotNull( tmp2 )) {
+HXLINE(  78)					_hx_tmp = ( (int)(tmp2) );
+            				}
+            				else {
+HXLINE(  78)					_hx_tmp = 0;
+            				}
+HXDLIN(  78)				if ((_hx_tmp >= highestPrio)) {
+HXLINE(  79)					::String tmp3 = _g_value->getChildText(HX_("priority",64,7b,3e,bb),null());
+HXDLIN(  79)					::String tmp4;
+HXDLIN(  79)					if (::hx::IsNotNull( tmp3 )) {
+HXLINE(  79)						tmp4 = tmp3;
+            					}
+            					else {
+HXLINE(  79)						tmp4 = HX_("0",30,00,00,00);
+            					}
+HXDLIN(  79)					 ::Dynamic tmp5 = ::Std_obj::parseInt(tmp4);
+HXDLIN(  79)					if (::hx::IsNotNull( tmp5 )) {
+HXLINE(  79)						highestPrio = ( (int)(tmp5) );
+            					}
+            					else {
+HXLINE(  79)						highestPrio = 0;
+            					}
+HXLINE(  80)					int _hx_tmp1;
+HXDLIN(  80)					if ((( (::String)(::Reflect_obj::field(_g_value->attr,HX_("type",ba,f2,08,4d))) ) == HX_("unavailable",50,e0,29,fd))) {
+HXLINE(  80)						_hx_tmp1 = 4;
+            					}
+            					else {
+HXLINE(  80)						::String _g = _g_value->getChildText(HX_("show",fd,d4,52,4c),null());
+HXDLIN(  80)						if (::hx::IsNull( _g )) {
+HXLINE(  80)							_hx_tmp1 = 0;
+            						}
+            						else {
+HXLINE(  80)							::String _hx_switch_0 = _g;
+            							if (  (_hx_switch_0==HX_("away",6e,53,78,40)) ){
+HXLINE(  80)								_hx_tmp1 = 1;
+HXDLIN(  80)								goto _hx_goto_1;
+            							}
+            							if (  (_hx_switch_0==HX_("dnd",9a,41,4c,00)) ){
+HXLINE(  80)								_hx_tmp1 = 2;
+HXDLIN(  80)								goto _hx_goto_1;
+            							}
+            							if (  (_hx_switch_0==HX_("xa",e9,68,00,00)) ){
+HXLINE(  80)								_hx_tmp1 = 3;
+HXDLIN(  80)								goto _hx_goto_1;
+            							}
+            							/* default */{
+HXLINE(  80)								_hx_tmp1 = 0;
+            							}
+            							_hx_goto_1:;
+            						}
+            					}
+HXDLIN(  80)					if ((lowestShow > _hx_tmp1)) {
+HXLINE(  80)						if ((( (::String)(::Reflect_obj::field(_g_value->attr,HX_("type",ba,f2,08,4d))) ) == HX_("unavailable",50,e0,29,fd))) {
+HXLINE(  80)							lowestShow = 4;
+            						}
+            						else {
+HXLINE(  80)							::String _g1 = _g_value->getChildText(HX_("show",fd,d4,52,4c),null());
+HXDLIN(  80)							if (::hx::IsNull( _g1 )) {
+HXLINE(  80)								lowestShow = 0;
+            							}
+            							else {
+HXLINE(  80)								::String _hx_switch_1 = _g1;
+            								if (  (_hx_switch_1==HX_("away",6e,53,78,40)) ){
+HXLINE(  80)									lowestShow = 1;
+HXDLIN(  80)									goto _hx_goto_2;
+            								}
+            								if (  (_hx_switch_1==HX_("dnd",9a,41,4c,00)) ){
+HXLINE(  80)									lowestShow = 2;
+HXDLIN(  80)									goto _hx_goto_2;
+            								}
+            								if (  (_hx_switch_1==HX_("xa",e9,68,00,00)) ){
+HXLINE(  80)									lowestShow = 3;
+HXDLIN(  80)									goto _hx_goto_2;
+            								}
+            								/* default */{
+HXLINE(  80)									lowestShow = 0;
+            								}
+            								_hx_goto_2:;
+            							}
+            						}
+            					}
+            				}
+            			}
+            		}
+HXLINE(  83)		this->showPresence = lowestShow;
+            	}
+
+Dynamic Member_obj::__CreateEmpty() { return new Member_obj; }
+
+void *Member_obj::_hx_vtable = 0;
+
+Dynamic Member_obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< Member_obj > _hx_result = new Member_obj();
+	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2],inArgs[3],inArgs[4],inArgs[5],inArgs[6],inArgs[7]);
+	return _hx_result;
+}
+
+bool Member_obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x69ada41b;
+}
+
+::String Member_obj::id__fromC(){
+            	HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_478_id__fromC)
+HXDLIN( 478)		return this->id;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Member_obj,id__fromC,return )
+
+::String Member_obj::displayName__fromC(){
+            	HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_478_displayName__fromC)
+HXDLIN( 478)		return this->displayName;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Member_obj,displayName__fromC,return )
+
+::String Member_obj::photoUri__fromC(){
+            	HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_478_photoUri__fromC)
+HXDLIN( 478)		return this->photoUri;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Member_obj,photoUri__fromC,return )
+
+::String Member_obj::placeholderUri__fromC(){
+            	HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_478_placeholderUri__fromC)
+HXDLIN( 478)		return this->placeholderUri;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Member_obj,placeholderUri__fromC,return )
+
+bool Member_obj::isSelf__fromC(){
+            	HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_478_isSelf__fromC)
+HXDLIN( 478)		return this->isSelf;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Member_obj,isSelf__fromC,return )
+
+ ::borogove::AvailableChat Member_obj::chat__fromC(){
+            	HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_478_chat__fromC)
+HXDLIN( 478)		return this->chat;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Member_obj,chat__fromC,return )
+
+size_t Member_obj::roles__fromC(void*** outPtr){
+            	HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_452_roles__fromC)
+HXDLIN( 452)		::Array< ::Dynamic> x = this->roles;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			::Array< ::Dynamic> x1 = x;
+HXDLIN( 452)			{
+HXDLIN( 452)				int _g = 0;
+HXDLIN( 452)				while((_g < x1->length)){
+HXDLIN( 452)					 ::borogove::Role el = x1->__get(_g).StaticCast<  ::borogove::Role >();
+HXDLIN( 452)					_g = (_g + 1);
+HXDLIN( 452)					{
+HXDLIN( 452)						 ::Dynamic haxeObject = el;
+HXDLIN( 452)						void* ptr = haxeObject.mPtr;
+HXDLIN( 452)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 452)						{
+HXDLIN( 452)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 452)							if (::hx::IsNull( store )) {
+HXDLIN( 452)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
+HXDLIN( 452)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            							}
+            							else {
+HXDLIN( 452)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            							}
+            						}
+            					}
+            				}
+            			}
+HXDLIN( 452)			void** ptr1 = (void**)x1->getBase();
+HXDLIN( 452)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
+HXDLIN( 452)			{
+HXDLIN( 452)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN( 452)				if (::hx::IsNull( store1 )) {
+HXDLIN( 452)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            						->setFixed(1,HX_("value",71,7f,b8,31),x1));
+HXDLIN( 452)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+            				}
+            				else {
+HXDLIN( 452)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+            				}
+            			}
+HXDLIN( 452)			_hx_tmp->set_ref(ptr1);
+            		}
+HXDLIN( 452)		return ( (size_t)(x->length) );
+            	}
+
+
+int Member_obj::showPresence__fromC(){
+            	HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_478_showPresence__fromC)
+HXDLIN( 478)		return this->showPresence;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Member_obj,showPresence__fromC,return )
+
+::Dynamic Member_obj::profile( ::borogove::Client client){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Member,_gthis, ::borogove::Client,client) HXARGC(2)
+            		void _hx_run( ::Dynamic resolve, ::Dynamic reject){
+            			HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::Member,_gthis, ::Dynamic,resolve, ::borogove::queries::PubsubGet,get) HXARGC(0)
+            			void _hx_run(){
+            				HX_GC_STACKFRAME(&_hx_pos_403768415749ca4b_95_profile)
+HXLINE(  96)				 ::borogove::Stanza item = get->getResult()->__get(0).StaticCast<  ::borogove::Stanza >();
+HXLINE(  97)				 ::borogove::Stanza fromItem;
+HXDLIN(  97)				if (::hx::IsNotNull( item )) {
+HXLINE(  97)					fromItem = item->getChild(HX_("vcard",46,91,02,33),HX_("urn:ietf:params:xml:ns:vcard-4.0",6e,ca,81,21));
+            				}
+            				else {
+HXLINE(  97)					fromItem = null();
+            				}
+HXLINE(  98)				 ::borogove::Stanza vcard;
+HXDLIN(  98)				if (::hx::IsNull( fromItem )) {
+HXLINE(  98)					vcard =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("vcard",46,91,02,33), ::Dynamic(::hx::Anon_obj::Create(1)
+            						->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:ietf:params:xml:ns:vcard-4.0",6e,ca,81,21))));
+            				}
+            				else {
+HXLINE(  98)					vcard = fromItem;
+            				}
+HXLINE(  99)				if (!(vcard->hasChild(HX_("fn",48,59,00,00),null()))) {
+HXLINE( 100)					vcard->insertChild(0, ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("fn",48,59,00,00),null())->textTag(HX_("text",ad,cc,f9,4c),_gthis->displayName,null()));
+            				}
+HXLINE( 102)				 ::Dynamic resolve1 = resolve;
+HXDLIN( 102)				resolve1( ::borogove::Profile_obj::__alloc( HX_CTX ,vcard,null()));
+            			}
+            			HX_END_LOCAL_FUNC0((void))
+
+            			HX_GC_STACKFRAME(&_hx_pos_403768415749ca4b_93_profile)
+HXLINE(  94)			 ::borogove::queries::PubsubGet get =  ::borogove::queries::PubsubGet_obj::__alloc( HX_CTX ,_gthis->jid->asString(),HX_("urn:xmpp:vcard4",4a,89,04,19),null());
+HXLINE(  95)			get->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,resolve,get)));
+HXLINE( 104)			client->sendQuery(get);
+            		}
+            		HX_END_LOCAL_FUNC2((void))
+
+            	HX_STACKFRAME(&_hx_pos_403768415749ca4b_92_profile)
+HXDLIN(  92)		 ::borogove::Member _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(  93)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(_gthis,client)));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(Member_obj,profile,return )
+
+void Member_obj::profile__fromC( ::borogove::Client client,::cpp::Function< void  (void*,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_365_profile__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->profile(client);
+            		}
+            		else {
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::borogove::Profile v){
+            				HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_365_profile__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            					}
+            					else {
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            					}
+            				}
+HXLINE( 365)				handler1(ptr,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::Dynamic e){
+            				HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_365_profile__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->profile(client), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+            		}
+            	}
+
+
+::Dynamic Member_obj::status( ::borogove::Client client){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Member,_gthis, ::borogove::Client,client) HXARGC(2)
+            		void _hx_run( ::Dynamic resolve, ::Dynamic reject){
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,resolve, ::borogove::queries::PubsubGet,get) HXARGC(0)
+            			void _hx_run(){
+            				HX_GC_STACKFRAME(&_hx_pos_403768415749ca4b_117_status)
+HXLINE( 118)				 ::borogove::Stanza item = get->getResult()->__get(0).StaticCast<  ::borogove::Stanza >();
+HXLINE( 120)				 ::borogove::Stanza activity;
+HXDLIN( 120)				if (::hx::IsNotNull( item )) {
+HXLINE( 120)					activity = item->getChild(HX_("activity",cf,2d,b2,e5),HX_("http://jabber.org/protocol/activity",43,2c,6e,94));
+            				}
+            				else {
+HXLINE( 120)					activity = null();
+            				}
+HXLINE( 121)				 ::Dynamic resolve1 = resolve;
+HXDLIN( 121)				::String _hx_tmp;
+HXDLIN( 121)				 ::borogove::Stanza tmp;
+HXDLIN( 121)				if (::hx::IsNotNull( activity )) {
+HXLINE( 121)					tmp = activity->getChild(HX_("undefined",90,3e,0a,9d),null());
+            				}
+            				else {
+HXLINE( 121)					tmp = null();
+            				}
+HXDLIN( 121)				::String tmp1;
+HXDLIN( 121)				if (::hx::IsNotNull( tmp )) {
+HXLINE( 121)					tmp1 = tmp->getChildText(HX_("emoji",86,6f,d9,6f),HX_("https://ns.borogove.dev/",0d,36,29,bd));
+            				}
+            				else {
+HXLINE( 121)					tmp1 = null();
+            				}
+HXDLIN( 121)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 121)					_hx_tmp = tmp1;
+            				}
+            				else {
+HXLINE( 121)					_hx_tmp = HX_("",00,00,00,00);
+            				}
+HXDLIN( 121)				::String tmp2;
+HXDLIN( 121)				if (::hx::IsNotNull( activity )) {
+HXLINE( 121)					tmp2 = activity->getChildText(HX_("text",ad,cc,f9,4c),null());
+            				}
+            				else {
+HXLINE( 121)					tmp2 = null();
+            				}
+HXDLIN( 121)				::String _hx_tmp1;
+HXDLIN( 121)				if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 121)					_hx_tmp1 = tmp2;
+            				}
+            				else {
+HXLINE( 121)					_hx_tmp1 = HX_("",00,00,00,00);
+            				}
+HXDLIN( 121)				resolve1( ::borogove::Status_obj::__alloc( HX_CTX ,_hx_tmp,_hx_tmp1));
+            			}
+            			HX_END_LOCAL_FUNC0((void))
+
+            			HX_GC_STACKFRAME(&_hx_pos_403768415749ca4b_115_status)
+HXLINE( 116)			 ::borogove::queries::PubsubGet get =  ::borogove::queries::PubsubGet_obj::__alloc( HX_CTX ,_gthis->jid->asString(),HX_("http://jabber.org/protocol/activity",43,2c,6e,94),null());
+HXLINE( 117)			get->onFinished( ::Dynamic(new _hx_Closure_0(resolve,get)));
+HXLINE( 123)			client->sendQuery(get);
+            		}
+            		HX_END_LOCAL_FUNC2((void))
+
+            	HX_STACKFRAME(&_hx_pos_403768415749ca4b_114_status)
+HXDLIN( 114)		 ::borogove::Member _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 115)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(_gthis,client)));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(Member_obj,status,return )
+
+void Member_obj::status__fromC( ::borogove::Client client,::cpp::Function< void  (void*,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_365_status__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->status(client);
+            		}
+            		else {
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::borogove::Status v){
+            				HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_365_status__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            					}
+            					else {
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            					}
+            				}
+HXLINE( 365)				handler1(ptr,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::Dynamic e){
+            				HX_STACKFRAME(&_hx_pos_de8dc97d744cad10_365_status__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->status(client), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+            		}
+            	}
+
+
+
+::hx::ObjectPtr< Member_obj > Member_obj::__new(::String id,::String displayName,::String photoUri,bool isSelf,::Array< ::Dynamic> roles, ::borogove::JID jid, ::haxe::ds::StringMap presence, ::borogove::AvailableChat chat) {
+	::hx::ObjectPtr< Member_obj > __this = new Member_obj();
+	__this->__construct(id,displayName,photoUri,isSelf,roles,jid,presence,chat);
+	return __this;
+}
+
+::hx::ObjectPtr< Member_obj > Member_obj::__alloc(::hx::Ctx *_hx_ctx,::String id,::String displayName,::String photoUri,bool isSelf,::Array< ::Dynamic> roles, ::borogove::JID jid, ::haxe::ds::StringMap presence, ::borogove::AvailableChat chat) {
+	Member_obj *__this = (Member_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Member_obj), true, "borogove.Member"));
+	*(void **)__this = Member_obj::_hx_vtable;
+	__this->__construct(id,displayName,photoUri,isSelf,roles,jid,presence,chat);
+	return __this;
+}
+
+Member_obj::Member_obj()
+{
+}
+
+void Member_obj::__Mark(HX_MARK_PARAMS)
+{
+	HX_MARK_BEGIN_CLASS(Member);
+	HX_MARK_MEMBER_NAME(id,"id");
+	HX_MARK_MEMBER_NAME(displayName,"displayName");
+	HX_MARK_MEMBER_NAME(photoUri,"photoUri");
+	HX_MARK_MEMBER_NAME(placeholderUri,"placeholderUri");
+	HX_MARK_MEMBER_NAME(isSelf,"isSelf");
+	HX_MARK_MEMBER_NAME(chat,"chat");
+	HX_MARK_MEMBER_NAME(roles,"roles");
+	HX_MARK_MEMBER_NAME(showPresence,"showPresence");
+	HX_MARK_MEMBER_NAME(presence,"presence");
+	HX_MARK_MEMBER_NAME(jid,"jid");
+	HX_MARK_END_CLASS();
+}
+
+void Member_obj::__Visit(HX_VISIT_PARAMS)
+{
+	HX_VISIT_MEMBER_NAME(id,"id");
+	HX_VISIT_MEMBER_NAME(displayName,"displayName");
+	HX_VISIT_MEMBER_NAME(photoUri,"photoUri");
+	HX_VISIT_MEMBER_NAME(placeholderUri,"placeholderUri");
+	HX_VISIT_MEMBER_NAME(isSelf,"isSelf");
+	HX_VISIT_MEMBER_NAME(chat,"chat");
+	HX_VISIT_MEMBER_NAME(roles,"roles");
+	HX_VISIT_MEMBER_NAME(showPresence,"showPresence");
+	HX_VISIT_MEMBER_NAME(presence,"presence");
+	HX_VISIT_MEMBER_NAME(jid,"jid");
+}
+
+::hx::Val Member_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 2:
+		if (HX_FIELD_EQ(inName,"id") ) { return ::hx::Val( id ); }
+		break;
+	case 3:
+		if (HX_FIELD_EQ(inName,"jid") ) { return ::hx::Val( jid ); }
+		break;
+	case 4:
+		if (HX_FIELD_EQ(inName,"chat") ) { return ::hx::Val( chat ); }
+		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"roles") ) { return ::hx::Val( roles ); }
+		break;
+	case 6:
+		if (HX_FIELD_EQ(inName,"isSelf") ) { return ::hx::Val( isSelf ); }
+		if (HX_FIELD_EQ(inName,"status") ) { return ::hx::Val( status_dyn() ); }
+		break;
+	case 7:
+		if (HX_FIELD_EQ(inName,"profile") ) { return ::hx::Val( profile_dyn() ); }
+		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"photoUri") ) { return ::hx::Val( photoUri ); }
+		if (HX_FIELD_EQ(inName,"presence") ) { return ::hx::Val( presence ); }
+		break;
+	case 9:
+		if (HX_FIELD_EQ(inName,"id__fromC") ) { return ::hx::Val( id__fromC_dyn() ); }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"displayName") ) { return ::hx::Val( displayName ); }
+		if (HX_FIELD_EQ(inName,"chat__fromC") ) { return ::hx::Val( chat__fromC_dyn() ); }
+		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"showPresence") ) { return ::hx::Val( showPresence ); }
+		break;
+	case 13:
+		if (HX_FIELD_EQ(inName,"isSelf__fromC") ) { return ::hx::Val( isSelf__fromC_dyn() ); }
+		break;
+	case 14:
+		if (HX_FIELD_EQ(inName,"placeholderUri") ) { return ::hx::Val( placeholderUri ); }
+		break;
+	case 15:
+		if (HX_FIELD_EQ(inName,"photoUri__fromC") ) { return ::hx::Val( photoUri__fromC_dyn() ); }
+		break;
+	case 18:
+		if (HX_FIELD_EQ(inName,"displayName__fromC") ) { return ::hx::Val( displayName__fromC_dyn() ); }
+		break;
+	case 19:
+		if (HX_FIELD_EQ(inName,"showPresence__fromC") ) { return ::hx::Val( showPresence__fromC_dyn() ); }
+		break;
+	case 21:
+		if (HX_FIELD_EQ(inName,"placeholderUri__fromC") ) { return ::hx::Val( placeholderUri__fromC_dyn() ); }
+	}
+	return super::__Field(inName,inCallProp);
+}
+
+::hx::Val Member_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 2:
+		if (HX_FIELD_EQ(inName,"id") ) { id=inValue.Cast< ::String >(); return inValue; }
+		break;
+	case 3:
+		if (HX_FIELD_EQ(inName,"jid") ) { jid=inValue.Cast<  ::borogove::JID >(); return inValue; }
+		break;
+	case 4:
+		if (HX_FIELD_EQ(inName,"chat") ) { chat=inValue.Cast<  ::borogove::AvailableChat >(); return inValue; }
+		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"roles") ) { roles=inValue.Cast< ::Array< ::Dynamic> >(); return inValue; }
+		break;
+	case 6:
+		if (HX_FIELD_EQ(inName,"isSelf") ) { isSelf=inValue.Cast< bool >(); return inValue; }
+		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"photoUri") ) { photoUri=inValue.Cast< ::String >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"presence") ) { presence=inValue.Cast<  ::haxe::ds::StringMap >(); return inValue; }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"displayName") ) { displayName=inValue.Cast< ::String >(); return inValue; }
+		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"showPresence") ) { showPresence=inValue.Cast< int >(); return inValue; }
+		break;
+	case 14:
+		if (HX_FIELD_EQ(inName,"placeholderUri") ) { placeholderUri=inValue.Cast< ::String >(); return inValue; }
+	}
+	return super::__SetField(inName,inValue,inCallProp);
+}
+
+void Member_obj::__GetFields(Array< ::String> &outFields)
+{
+	outFields->push(HX_("id",db,5b,00,00));
+	outFields->push(HX_("displayName",ad,11,f2,30));
+	outFields->push(HX_("photoUri",da,15,82,60));
+	outFields->push(HX_("placeholderUri",b9,d9,ba,ae));
+	outFields->push(HX_("isSelf",96,50,b7,69));
+	outFields->push(HX_("chat",d8,5e,bf,41));
+	outFields->push(HX_("roles",3d,1c,5f,ed));
+	outFields->push(HX_("showPresence",58,a8,64,92));
+	outFields->push(HX_("presence",3b,52,d7,66));
+	outFields->push(HX_("jid",c5,ca,50,00));
+	super::__GetFields(outFields);
+};
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo Member_obj_sMemberStorageInfo[] = {
+	{::hx::fsString,(int)offsetof(Member_obj,id),HX_("id",db,5b,00,00)},
+	{::hx::fsString,(int)offsetof(Member_obj,displayName),HX_("displayName",ad,11,f2,30)},
+	{::hx::fsString,(int)offsetof(Member_obj,photoUri),HX_("photoUri",da,15,82,60)},
+	{::hx::fsString,(int)offsetof(Member_obj,placeholderUri),HX_("placeholderUri",b9,d9,ba,ae)},
+	{::hx::fsBool,(int)offsetof(Member_obj,isSelf),HX_("isSelf",96,50,b7,69)},
+	{::hx::fsObject /*  ::borogove::AvailableChat */ ,(int)offsetof(Member_obj,chat),HX_("chat",d8,5e,bf,41)},
+	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(Member_obj,roles),HX_("roles",3d,1c,5f,ed)},
+	{::hx::fsInt,(int)offsetof(Member_obj,showPresence),HX_("showPresence",58,a8,64,92)},
+	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(Member_obj,presence),HX_("presence",3b,52,d7,66)},
+	{::hx::fsObject /*  ::borogove::JID */ ,(int)offsetof(Member_obj,jid),HX_("jid",c5,ca,50,00)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+static ::hx::StaticInfo *Member_obj_sStaticStorageInfo = 0;
+#endif
+
+static ::String Member_obj_sMemberFields[] = {
+	HX_("id",db,5b,00,00),
+	HX_("id__fromC",fe,15,a5,4d),
+	HX_("displayName",ad,11,f2,30),
+	HX_("displayName__fromC",6c,9e,e5,22),
+	HX_("photoUri",da,15,82,60),
+	HX_("photoUri__fromC",df,29,fc,dc),
+	HX_("placeholderUri",b9,d9,ba,ae),
+	HX_("placeholderUri__fromC",e0,2f,a3,85),
+	HX_("isSelf",96,50,b7,69),
+	HX_("isSelf__fromC",a3,fe,4d,03),
+	HX_("chat",d8,5e,bf,41),
+	HX_("chat__fromC",a1,1c,85,3d),
+	HX_("roles",3d,1c,5f,ed),
+	HX_("showPresence",58,a8,64,92),
+	HX_("showPresence__fromC",21,03,44,77),
+	HX_("presence",3b,52,d7,66),
+	HX_("jid",c5,ca,50,00),
+	HX_("profile",29,49,49,f3),
+	HX_("status",32,e7,fb,05),
+	::String(null()) };
+
+::hx::Class Member_obj::__mClass;
+
+void Member_obj::__register()
+{
+	Member_obj _hx_dummy;
+	Member_obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("borogove.Member",27,f4,4c,bb);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &::hx::Class_obj::GetNoStaticField;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(0 /* sStaticFields */);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(Member_obj_sMemberFields);
+	__mClass->mCanCast = ::hx::TCanCast< Member_obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = Member_obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = Member_obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+void Member_obj::__boot()
+{
+{
+            	HX_STACKFRAME(&_hx_pos_403768415749ca4b_20_boot)
+HXDLIN(  20)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(12)
+            				->setFixed(0,HX_("placeholderUri__fromC",e0,2f,a3,85), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(1,HX_("status__fromC",87,b3,25,a1), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(2,HX_("roles__fromC",dc,05,ee,a2), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(3,HX_("photoUri__fromC",df,29,fc,dc), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(4,HX_("profile",29,49,49,f3), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
+            				->setFixed(5,HX_("profile__fromC",70,8e,62,f4), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(6,HX_("isSelf__fromC",a3,fe,4d,03), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(7,HX_("status",32,e7,fb,05), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
+            				->setFixed(8,HX_("displayName__fromC",6c,9e,e5,22), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(9,HX_("chat__fromC",a1,1c,85,3d), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(10,HX_("id__fromC",fe,15,a5,4d), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(11,HX_("showPresence__fromC",21,03,44,77), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null()))))));
+            	}
+}
+
+} // end namespace borogove
diff --git a/Sources/c_borogove/src/borogove/MemberUpdate.cpp b/Sources/c_borogove/src/borogove/MemberUpdate.cpp
new file mode 100644
index 0000000..cfeadb6
--- /dev/null
+++ b/Sources/c_borogove/src/borogove/MemberUpdate.cpp
@@ -0,0 +1,649 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_Reflect
+#include <Reflect.h>
+#endif
+#ifndef INCLUDED_borogove_AvailableChat
+#include <borogove/AvailableChat.h>
+#endif
+#ifndef INCLUDED_borogove_Caps
+#include <borogove/Caps.h>
+#endif
+#ifndef INCLUDED_borogove_CapsRepo
+#include <borogove/CapsRepo.h>
+#endif
+#ifndef INCLUDED_borogove_Channel
+#include <borogove/Channel.h>
+#endif
+#ifndef INCLUDED_borogove_Chat
+#include <borogove/Chat.h>
+#endif
+#ifndef INCLUDED_borogove_EventEmitter
+#include <borogove/EventEmitter.h>
+#endif
+#ifndef INCLUDED_borogove_JID
+#include <borogove/JID.h>
+#endif
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
+#endif
+#ifndef INCLUDED_borogove_MemberUpdate
+#include <borogove/MemberUpdate.h>
+#endif
+#ifndef INCLUDED_borogove_Role
+#include <borogove/Role.h>
+#endif
+#ifndef INCLUDED_borogove_Stanza
+#include <borogove/Stanza.h>
+#endif
+#ifndef INCLUDED_borogove__Util_Util_Fields_
+#include <borogove/_Util/Util_Fields_.h>
+#endif
+#ifndef INCLUDED_haxe_IMap
+#include <haxe/IMap.h>
+#endif
+#ifndef INCLUDED_haxe_Log
+#include <haxe/Log.h>
+#endif
+#ifndef INCLUDED_haxe_ds_StringMap
+#include <haxe/ds/StringMap.h>
+#endif
+
+HX_DEFINE_STACK_FRAME(_hx_pos_77ddd3bd242e94f5_25_new,"borogove.MemberUpdate","new",0xd5b0ae82,"borogove.MemberUpdate.new","borogove/MemberUpdate.hx",25,0xac98404d)
+HX_LOCAL_STACK_FRAME(_hx_pos_77ddd3bd242e94f5_34_applyTo,"borogove.MemberUpdate","applyTo",0x89fe1dab,"borogove.MemberUpdate.applyTo","borogove/MemberUpdate.hx",34,0xac98404d)
+static const ::String _hx_array_data_c2db0590_5[] = {
+	HX_("owner",33,98,76,38),HX_("admin",8f,ac,4a,1c),HX_("member",5a,e2,b5,04),HX_("none",b8,12,0a,49),HX_("outcast",4d,1e,c5,db),
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_77ddd3bd242e94f5_62_extractUpdates,"borogove.MemberUpdate","extractUpdates",0xe0964027,"borogove.MemberUpdate.extractUpdates","borogove/MemberUpdate.hx",62,0xac98404d)
+namespace borogove{
+
+void MemberUpdate_obj::__construct(::String id, ::borogove::JID jid,::String displayName,bool isSelf, ::borogove::Role affiliation, ::haxe::ds::StringMap presence){
+            	HX_STACKFRAME(&_hx_pos_77ddd3bd242e94f5_25_new)
+HXLINE(  26)		this->id = id;
+HXLINE(  27)		this->jid = jid;
+HXLINE(  28)		this->displayName = displayName;
+HXLINE(  29)		this->isSelf = isSelf;
+HXLINE(  30)		this->affiliation = affiliation;
+HXLINE(  31)		this->presence = presence;
+            	}
+
+Dynamic MemberUpdate_obj::__CreateEmpty() { return new MemberUpdate_obj; }
+
+void *MemberUpdate_obj::_hx_vtable = 0;
+
+Dynamic MemberUpdate_obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< MemberUpdate_obj > _hx_result = new MemberUpdate_obj();
+	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2],inArgs[3],inArgs[4],inArgs[5]);
+	return _hx_result;
+}
+
+bool MemberUpdate_obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x47de2484;
+}
+
+ ::Dynamic MemberUpdate_obj::applyTo( ::borogove::Member member){
+            	HX_GC_STACKFRAME(&_hx_pos_77ddd3bd242e94f5_34_applyTo)
+HXLINE(  35)		bool _hx_tmp;
+HXDLIN(  35)		if (::hx::IsNull( this->id )) {
+HXLINE(  35)			_hx_tmp = ::hx::IsNotNull( this->jid );
+            		}
+            		else {
+HXLINE(  35)			_hx_tmp = true;
+            		}
+HXDLIN(  35)		if (_hx_tmp) {
+HXLINE(  36)			bool _hx_tmp1;
+HXDLIN(  36)			bool _hx_tmp2;
+HXDLIN(  36)			if (::hx::IsNotNull( member )) {
+HXLINE(  36)				::String _hx_tmp3;
+HXDLIN(  36)				if (::hx::IsNotNull( member )) {
+HXLINE(  36)					_hx_tmp3 = member->id;
+            				}
+            				else {
+HXLINE(  36)					_hx_tmp3 = null();
+            				}
+HXDLIN(  36)				_hx_tmp2 = (_hx_tmp3 != this->id);
+            			}
+            			else {
+HXLINE(  36)				_hx_tmp2 = false;
+            			}
+HXDLIN(  36)			if (_hx_tmp2) {
+HXLINE(  36)				 ::borogove::AvailableChat tmp;
+HXDLIN(  36)				if (::hx::IsNotNull( member )) {
+HXLINE(  36)					tmp = member->chat;
+            				}
+            				else {
+HXLINE(  36)					tmp = null();
+            				}
+HXDLIN(  36)				::String _hx_tmp4;
+HXDLIN(  36)				if (::hx::IsNotNull( tmp )) {
+HXLINE(  36)					_hx_tmp4 = tmp->chatId;
+            				}
+            				else {
+HXLINE(  36)					_hx_tmp4 = null();
+            				}
+HXDLIN(  36)				 ::borogove::JID tmp1 = this->jid;
+HXDLIN(  36)				::String _hx_tmp5;
+HXDLIN(  36)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE(  36)					_hx_tmp5 = tmp1->asString();
+            				}
+            				else {
+HXLINE(  36)					_hx_tmp5 = null();
+            				}
+HXDLIN(  36)				_hx_tmp1 = (_hx_tmp4 != _hx_tmp5);
+            			}
+            			else {
+HXLINE(  36)				_hx_tmp1 = false;
+            			}
+HXDLIN(  36)			if (_hx_tmp1) {
+HXLINE(  36)				HX_STACK_DO_THROW(HX_("Member does not match this update",22,c9,21,05));
+            			}
+            		}
+HXLINE(  38)		bool _hx_tmp6;
+HXDLIN(  38)		if (::hx::IsNotNull( member )) {
+HXLINE(  38)			 ::Dynamic _hx_tmp7;
+HXDLIN(  38)			if (::hx::IsNotNull( member )) {
+HXLINE(  38)				_hx_tmp7 = member->isSelf;
+            			}
+            			else {
+HXLINE(  38)				_hx_tmp7 = null();
+            			}
+HXDLIN(  38)			_hx_tmp6 = ::hx::IsNotEq( this->isSelf,_hx_tmp7 );
+            		}
+            		else {
+HXLINE(  38)			_hx_tmp6 = false;
+            		}
+HXDLIN(  38)		if (_hx_tmp6) {
+HXLINE(  38)			HX_STACK_DO_THROW(HX_("Member does not match this update",22,c9,21,05));
+            		}
+HXLINE(  39)		::Array< ::Dynamic> filteredRoles;
+HXDLIN(  39)		 ::borogove::Role tmp2 = this->affiliation;
+HXDLIN(  39)		::String filteredRoles1;
+HXDLIN(  39)		if (::hx::IsNotNull( tmp2 )) {
+HXLINE(  39)			filteredRoles1 = tmp2->id;
+            		}
+            		else {
+HXLINE(  39)			filteredRoles1 = null();
+            		}
+HXDLIN(  39)		if ((filteredRoles1 == HX_("none",b8,12,0a,49))) {
+HXLINE(  39)			filteredRoles = ::Array_obj< ::Dynamic>::__new(0);
+            		}
+            		else {
+HXLINE(  39)			::Array< ::Dynamic> _this;
+HXDLIN(  39)			::Array< ::Dynamic> tmp3;
+HXDLIN(  39)			if (::hx::IsNotNull( member )) {
+HXLINE(  39)				tmp3 = member->roles;
+            			}
+            			else {
+HXLINE(  39)				tmp3 = null();
+            			}
+HXDLIN(  39)			if (::hx::IsNotNull( tmp3 )) {
+HXLINE(  39)				_this = tmp3;
+            			}
+            			else {
+HXLINE(  39)				_this = ::Array_obj< ::Dynamic>::__new(0);
+            			}
+HXDLIN(  39)			::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN(  39)			{
+HXLINE(  39)				int _g1 = 0;
+HXDLIN(  39)				::Array< ::Dynamic> _g2 = _this;
+HXDLIN(  39)				while((_g1 < _g2->length)){
+HXLINE(  39)					 ::borogove::Role v = _g2->__get(_g1).StaticCast<  ::borogove::Role >();
+HXDLIN(  39)					_g1 = (_g1 + 1);
+HXDLIN(  39)					if (!(::Array_obj< ::String >::fromData( _hx_array_data_c2db0590_5,5)->contains(v->id))) {
+HXLINE(  39)						_g->push(v);
+            					}
+            				}
+            			}
+HXDLIN(  39)			filteredRoles = _g;
+            		}
+HXLINE(  40)		 ::haxe::ds::StringMap mergedPresence =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(  42)		{
+HXLINE(  42)			::Dynamic this1;
+HXDLIN(  42)			 ::haxe::ds::StringMap tmp4;
+HXDLIN(  42)			if (::hx::IsNotNull( member )) {
+HXLINE(  42)				tmp4 = member->presence;
+            			}
+            			else {
+HXLINE(  42)				tmp4 = null();
+            			}
+HXDLIN(  42)			if (::hx::IsNotNull( tmp4 )) {
+HXLINE(  42)				this1 = tmp4;
+            			}
+            			else {
+HXLINE(  42)				this1 =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+            			}
+HXDLIN(  42)			::Dynamic map = ( ( ::haxe::ds::StringMap)(this1) );
+HXDLIN(  42)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(map);
+HXDLIN(  42)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(  42)				::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXLINE(  43)				mergedPresence->set(key,( ( ::borogove::Stanza)(::haxe::IMap_obj::get(map,key)) ));
+            			}
+            		}
+HXLINE(  46)		{
+HXLINE(  46)			::Dynamic this2 = this->presence;
+HXDLIN(  46)			 ::Dynamic _g_keys1 = ::haxe::IMap_obj::keys(this2);
+HXDLIN(  46)			while(( (bool)(_g_keys1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(  46)				::String key1 = ( (::String)(_g_keys1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXLINE(  47)				mergedPresence->set(key1,( ( ::borogove::Stanza)(::haxe::IMap_obj::get(this2,key1)) ));
+            			}
+            		}
+HXLINE(  51)		::String _hx_tmp8;
+HXDLIN(  51)		::String tmp5 = this->id;
+HXDLIN(  51)		if (::hx::IsNotNull( tmp5 )) {
+HXLINE(  51)			_hx_tmp8 = tmp5;
+            		}
+            		else {
+HXLINE(  51)			if (::hx::IsNotNull( member )) {
+HXLINE(  51)				_hx_tmp8 = member->id;
+            			}
+            			else {
+HXLINE(  51)				_hx_tmp8 = null();
+            			}
+            		}
+HXLINE(  52)		::String _hx_tmp9;
+HXDLIN(  52)		::String tmp6 = this->displayName;
+HXDLIN(  52)		::String tmp7;
+HXDLIN(  52)		if (::hx::IsNotNull( tmp6 )) {
+HXLINE(  52)			tmp7 = tmp6;
+            		}
+            		else {
+HXLINE(  52)			::String tmp8;
+HXDLIN(  52)			if (::hx::IsNotNull( member )) {
+HXLINE(  52)				tmp8 = member->displayName;
+            			}
+            			else {
+HXLINE(  52)				tmp8 = null();
+            			}
+HXDLIN(  52)			if ((tmp8 == HX_("",00,00,00,00))) {
+HXLINE(  52)				tmp7 = null();
+            			}
+            			else {
+HXLINE(  52)				if (::hx::IsNotNull( member )) {
+HXLINE(  52)					tmp7 = member->displayName;
+            				}
+            				else {
+HXLINE(  52)					tmp7 = null();
+            				}
+            			}
+            		}
+HXDLIN(  52)		if (::hx::IsNotNull( tmp7 )) {
+HXLINE(  52)			_hx_tmp9 = tmp7;
+            		}
+            		else {
+HXLINE(  52)			 ::borogove::JID tmp9 = this->jid;
+HXDLIN(  52)			if (::hx::IsNotNull( tmp9 )) {
+HXLINE(  52)				_hx_tmp9 = tmp9->asString();
+            			}
+            			else {
+HXLINE(  52)				_hx_tmp9 = null();
+            			}
+            		}
+HXLINE(  53)		::String _hx_tmp10;
+HXDLIN(  53)		if (::hx::IsNotNull( member )) {
+HXLINE(  53)			_hx_tmp10 = member->photoUri;
+            		}
+            		else {
+HXLINE(  53)			_hx_tmp10 = null();
+            		}
+HXLINE(  54)		bool _hx_tmp11 = this->isSelf;
+HXLINE(  55)		::Array< ::Dynamic> _hx_tmp12;
+HXDLIN(  55)		if (::hx::IsNull( this->affiliation )) {
+HXLINE(  55)			_hx_tmp12 = ::Array_obj< ::Dynamic>::__new(0);
+            		}
+            		else {
+HXLINE(  55)			_hx_tmp12 = ::Array_obj< ::Dynamic>::__new(1)->init(0,this->affiliation);
+            		}
+HXDLIN(  55)		::Array< ::Dynamic> _hx_tmp13 = filteredRoles->concat(_hx_tmp12);
+HXLINE(  56)		 ::borogove::JID _hx_tmp14;
+HXDLIN(  56)		 ::borogove::JID tmp10;
+HXDLIN(  56)		if (::hx::IsNotNull( member )) {
+HXLINE(  56)			tmp10 = member->jid;
+            		}
+            		else {
+HXLINE(  56)			tmp10 = null();
+            		}
+HXDLIN(  56)		if (::hx::IsNotNull( tmp10 )) {
+HXLINE(  56)			_hx_tmp14 = tmp10;
+            		}
+            		else {
+HXLINE(  56)			_hx_tmp14 = this->jid;
+            		}
+HXLINE(  58)		 ::borogove::AvailableChat _hx_tmp15;
+HXDLIN(  58)		if (::hx::IsNull( this->jid )) {
+HXLINE(  58)			_hx_tmp15 = null();
+            		}
+            		else {
+HXLINE(  58)			::String _hx_tmp16 = this->jid->asBare()->asString();
+HXDLIN(  58)			_hx_tmp15 =  ::borogove::AvailableChat_obj::__alloc( HX_CTX ,_hx_tmp16,this->displayName,HX_("",00,00,00,00),::borogove::CapsRepo_obj::empty);
+            		}
+HXLINE(  50)		return  ::Dynamic(::hx::Anon_obj::Create(8)
+            			->setFixed(0,HX_("roles",3d,1c,5f,ed),_hx_tmp13)
+            			->setFixed(1,HX_("id",db,5b,00,00),_hx_tmp8)
+            			->setFixed(2,HX_("jid",c5,ca,50,00),_hx_tmp14)
+            			->setFixed(3,HX_("displayName",ad,11,f2,30),_hx_tmp9)
+            			->setFixed(4,HX_("chat",d8,5e,bf,41),_hx_tmp15)
+            			->setFixed(5,HX_("photoUri",da,15,82,60),_hx_tmp10)
+            			->setFixed(6,HX_("presence",3b,52,d7,66),mergedPresence)
+            			->setFixed(7,HX_("isSelf",96,50,b7,69),_hx_tmp11));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(MemberUpdate_obj,applyTo,return )
+
+::Array< ::Dynamic> MemberUpdate_obj::extractUpdates(::String accountId, ::borogove::Chat chat, ::borogove::Stanza stanza){
+            	HX_GC_STACKFRAME(&_hx_pos_77ddd3bd242e94f5_62_extractUpdates)
+HXLINE(  63)		::Array< ::Dynamic> updates = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  64)		 ::borogove::Stanza mucUser = stanza->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
+HXLINE(  65)		if (::hx::IsNotNull( mucUser )) {
+HXLINE(  66)			 ::borogove::Stanza tmp = stanza->getChild(HX_("occupant-id",2b,a5,8b,91),HX_("urn:xmpp:occupant-id:0",05,d7,05,11));
+HXDLIN(  66)			 ::Dynamic tmp1;
+HXDLIN(  66)			if (::hx::IsNotNull( tmp )) {
+HXLINE(  66)				tmp1 = tmp->attr;
+            			}
+            			else {
+HXLINE(  66)				tmp1 = null();
+            			}
+HXDLIN(  66)			::String sOccupantId;
+HXDLIN(  66)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE(  66)				sOccupantId = ( (::String)(::Reflect_obj::field(tmp1,HX_("id",db,5b,00,00))) );
+            			}
+            			else {
+HXLINE(  66)				sOccupantId = null();
+            			}
+HXLINE(  67)			::String from = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
+HXLINE(  68)			::String resource;
+HXDLIN(  68)			bool resource1;
+HXDLIN(  68)			if ((stanza->name == HX_("presence",3b,52,d7,66))) {
+HXLINE(  68)				resource1 = ::hx::IsNotNull( from );
+            			}
+            			else {
+HXLINE(  68)				resource1 = false;
+            			}
+HXDLIN(  68)			if (resource1) {
+HXLINE(  68)				resource = ::borogove::JID_obj::parse(from)->resource;
+            			}
+            			else {
+HXLINE(  68)				resource = null();
+            			}
+HXLINE(  69)			 ::borogove::Channel channel = ( ( ::borogove::Channel)(::borogove::_Util::Util_Fields__obj::downcast(chat,::hx::ClassOf< ::borogove::Channel >())) );
+HXLINE(  70)			{
+HXLINE(  70)				int _g = 0;
+HXDLIN(  70)				::Array< ::Dynamic> _g1 = mucUser->allTags(HX_("item",13,c5,bf,45),null());
+HXDLIN(  70)				while((_g < _g1->length)){
+HXLINE(  70)					 ::borogove::Stanza item = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN(  70)					_g = (_g + 1);
+HXLINE(  71)					::String jidS = ( (::String)(::Reflect_obj::field(item->attr,HX_("jid",c5,ca,50,00))) );
+HXLINE(  72)					 ::borogove::JID jid;
+HXDLIN(  72)					if (::hx::IsNull( jidS )) {
+HXLINE(  72)						jid = null();
+            					}
+            					else {
+HXLINE(  72)						jid = ::borogove::JID_obj::parse(jidS)->asBare();
+            					}
+HXLINE(  73)					::String occupantId;
+HXDLIN(  73)					 ::borogove::Stanza tmp2 = item->getChild(HX_("occupant-id",2b,a5,8b,91),HX_("urn:xmpp:occupant-id:0",05,d7,05,11));
+HXDLIN(  73)					 ::Dynamic tmp3;
+HXDLIN(  73)					if (::hx::IsNotNull( tmp2 )) {
+HXLINE(  73)						tmp3 = tmp2->attr;
+            					}
+            					else {
+HXLINE(  73)						tmp3 = null();
+            					}
+HXDLIN(  73)					::String tmp4;
+HXDLIN(  73)					if (::hx::IsNotNull( tmp3 )) {
+HXLINE(  73)						tmp4 = ( (::String)(::Reflect_obj::field(tmp3,HX_("id",db,5b,00,00))) );
+            					}
+            					else {
+HXLINE(  73)						tmp4 = null();
+            					}
+HXDLIN(  73)					if (::hx::IsNotNull( tmp4 )) {
+HXLINE(  73)						occupantId = tmp4;
+            					}
+            					else {
+HXLINE(  73)						occupantId = sOccupantId;
+            					}
+HXLINE(  74)					::String id;
+HXDLIN(  74)					if (::hx::IsNull( occupantId )) {
+HXLINE(  74)						id = null();
+            					}
+            					else {
+HXLINE(  74)						id = ((chat->chatId + HX_("/",2f,00,00,00)) + occupantId);
+            					}
+HXLINE(  75)					::String aff = ( (::String)(::Reflect_obj::field(item->attr,HX_("affiliation",b0,1a,35,a1))) );
+HXLINE(  76)					if (::hx::IsNull( aff )) {
+HXLINE(  77)						::haxe::Log_obj::trace(HX_("No affiliation on affiliation update",eb,38,ac,49), ::Dynamic(::hx::Anon_obj::Create(5)
+            							->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.MemberUpdate",90,05,db,c2))
+            							->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,stanza))
+            							->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("extractUpdates",09,cf,f5,73))
+            							->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/MemberUpdate.hx",4d,40,98,ac))
+            							->setFixed(4,HX_("lineNumber",dd,81,22,76),77)));
+            					}
+            					else {
+HXLINE(  82)						::String _hx_tmp;
+HXDLIN(  82)						::String tmp5 = ( (::String)(::Reflect_obj::field(item->attr,HX_("nick",a3,7b,05,49))) );
+HXDLIN(  82)						if (::hx::IsNotNull( tmp5 )) {
+HXLINE(  82)							_hx_tmp = tmp5;
+            						}
+            						else {
+HXLINE(  82)							_hx_tmp = resource;
+            						}
+HXLINE(  83)						bool _hx_tmp1;
+HXDLIN(  83)						::String _hx_tmp2;
+HXDLIN(  83)						if (::hx::IsNotNull( jid )) {
+HXLINE(  83)							_hx_tmp2 = jid->asString();
+            						}
+            						else {
+HXLINE(  83)							_hx_tmp2 = null();
+            						}
+HXDLIN(  83)						if ((_hx_tmp2 != accountId)) {
+HXLINE(  83)							 ::borogove::Member tmp6;
+HXDLIN(  83)							if (::hx::IsNotNull( channel )) {
+HXLINE(  83)								tmp6 = channel->self;
+            							}
+            							else {
+HXLINE(  83)								tmp6 = null();
+            							}
+HXDLIN(  83)							::String _hx_tmp3;
+HXDLIN(  83)							if (::hx::IsNotNull( tmp6 )) {
+HXLINE(  83)								_hx_tmp3 = tmp6->id;
+            							}
+            							else {
+HXLINE(  83)								_hx_tmp3 = null();
+            							}
+HXDLIN(  83)							_hx_tmp1 = (_hx_tmp3 == id);
+            						}
+            						else {
+HXLINE(  83)							_hx_tmp1 = true;
+            						}
+HXLINE(  84)						 ::borogove::Role _hx_tmp4 = ::borogove::Role_obj::forAffiliation(aff);
+HXLINE(  85)						 ::haxe::ds::StringMap _hx_tmp5;
+HXDLIN(  85)						if ((stanza->name == HX_("presence",3b,52,d7,66))) {
+HXLINE(  85)							 ::haxe::ds::StringMap _g2 =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXDLIN(  85)							::String tmp7 = resource;
+HXDLIN(  85)							::String _hx_tmp6;
+HXDLIN(  85)							if (::hx::IsNotNull( tmp7 )) {
+HXLINE(  85)								_hx_tmp6 = tmp7;
+            							}
+            							else {
+HXLINE(  85)								_hx_tmp6 = HX_("",00,00,00,00);
+            							}
+HXDLIN(  85)							_g2->set(_hx_tmp6,stanza);
+HXDLIN(  85)							_hx_tmp5 = _g2;
+            						}
+            						else {
+HXLINE(  85)							_hx_tmp5 =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+            						}
+HXLINE(  79)						updates->push( ::borogove::MemberUpdate_obj::__alloc( HX_CTX ,id,jid,_hx_tmp,_hx_tmp1,_hx_tmp4,_hx_tmp5));
+            					}
+            				}
+            			}
+            		}
+HXLINE(  91)		return updates;
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC3(MemberUpdate_obj,extractUpdates,return )
+
+
+::hx::ObjectPtr< MemberUpdate_obj > MemberUpdate_obj::__new(::String id, ::borogove::JID jid,::String displayName,bool isSelf, ::borogove::Role affiliation, ::haxe::ds::StringMap presence) {
+	::hx::ObjectPtr< MemberUpdate_obj > __this = new MemberUpdate_obj();
+	__this->__construct(id,jid,displayName,isSelf,affiliation,presence);
+	return __this;
+}
+
+::hx::ObjectPtr< MemberUpdate_obj > MemberUpdate_obj::__alloc(::hx::Ctx *_hx_ctx,::String id, ::borogove::JID jid,::String displayName,bool isSelf, ::borogove::Role affiliation, ::haxe::ds::StringMap presence) {
+	MemberUpdate_obj *__this = (MemberUpdate_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(MemberUpdate_obj), true, "borogove.MemberUpdate"));
+	*(void **)__this = MemberUpdate_obj::_hx_vtable;
+	__this->__construct(id,jid,displayName,isSelf,affiliation,presence);
+	return __this;
+}
+
+MemberUpdate_obj::MemberUpdate_obj()
+{
+}
+
+void MemberUpdate_obj::__Mark(HX_MARK_PARAMS)
+{
+	HX_MARK_BEGIN_CLASS(MemberUpdate);
+	HX_MARK_MEMBER_NAME(id,"id");
+	HX_MARK_MEMBER_NAME(jid,"jid");
+	HX_MARK_MEMBER_NAME(displayName,"displayName");
+	HX_MARK_MEMBER_NAME(isSelf,"isSelf");
+	HX_MARK_MEMBER_NAME(affiliation,"affiliation");
+	HX_MARK_MEMBER_NAME(presence,"presence");
+	HX_MARK_END_CLASS();
+}
+
+void MemberUpdate_obj::__Visit(HX_VISIT_PARAMS)
+{
+	HX_VISIT_MEMBER_NAME(id,"id");
+	HX_VISIT_MEMBER_NAME(jid,"jid");
+	HX_VISIT_MEMBER_NAME(displayName,"displayName");
+	HX_VISIT_MEMBER_NAME(isSelf,"isSelf");
+	HX_VISIT_MEMBER_NAME(affiliation,"affiliation");
+	HX_VISIT_MEMBER_NAME(presence,"presence");
+}
+
+::hx::Val MemberUpdate_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 2:
+		if (HX_FIELD_EQ(inName,"id") ) { return ::hx::Val( id ); }
+		break;
+	case 3:
+		if (HX_FIELD_EQ(inName,"jid") ) { return ::hx::Val( jid ); }
+		break;
+	case 6:
+		if (HX_FIELD_EQ(inName,"isSelf") ) { return ::hx::Val( isSelf ); }
+		break;
+	case 7:
+		if (HX_FIELD_EQ(inName,"applyTo") ) { return ::hx::Val( applyTo_dyn() ); }
+		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"presence") ) { return ::hx::Val( presence ); }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"displayName") ) { return ::hx::Val( displayName ); }
+		if (HX_FIELD_EQ(inName,"affiliation") ) { return ::hx::Val( affiliation ); }
+	}
+	return super::__Field(inName,inCallProp);
+}
+
+bool MemberUpdate_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 14:
+		if (HX_FIELD_EQ(inName,"extractUpdates") ) { outValue = extractUpdates_dyn(); return true; }
+	}
+	return false;
+}
+
+::hx::Val MemberUpdate_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 2:
+		if (HX_FIELD_EQ(inName,"id") ) { id=inValue.Cast< ::String >(); return inValue; }
+		break;
+	case 3:
+		if (HX_FIELD_EQ(inName,"jid") ) { jid=inValue.Cast<  ::borogove::JID >(); return inValue; }
+		break;
+	case 6:
+		if (HX_FIELD_EQ(inName,"isSelf") ) { isSelf=inValue.Cast< bool >(); return inValue; }
+		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"presence") ) { presence=inValue.Cast<  ::haxe::ds::StringMap >(); return inValue; }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"displayName") ) { displayName=inValue.Cast< ::String >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"affiliation") ) { affiliation=inValue.Cast<  ::borogove::Role >(); return inValue; }
+	}
+	return super::__SetField(inName,inValue,inCallProp);
+}
+
+void MemberUpdate_obj::__GetFields(Array< ::String> &outFields)
+{
+	outFields->push(HX_("id",db,5b,00,00));
+	outFields->push(HX_("jid",c5,ca,50,00));
+	outFields->push(HX_("displayName",ad,11,f2,30));
+	outFields->push(HX_("isSelf",96,50,b7,69));
+	outFields->push(HX_("affiliation",b0,1a,35,a1));
+	outFields->push(HX_("presence",3b,52,d7,66));
+	super::__GetFields(outFields);
+};
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo MemberUpdate_obj_sMemberStorageInfo[] = {
+	{::hx::fsString,(int)offsetof(MemberUpdate_obj,id),HX_("id",db,5b,00,00)},
+	{::hx::fsObject /*  ::borogove::JID */ ,(int)offsetof(MemberUpdate_obj,jid),HX_("jid",c5,ca,50,00)},
+	{::hx::fsString,(int)offsetof(MemberUpdate_obj,displayName),HX_("displayName",ad,11,f2,30)},
+	{::hx::fsBool,(int)offsetof(MemberUpdate_obj,isSelf),HX_("isSelf",96,50,b7,69)},
+	{::hx::fsObject /*  ::borogove::Role */ ,(int)offsetof(MemberUpdate_obj,affiliation),HX_("affiliation",b0,1a,35,a1)},
+	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(MemberUpdate_obj,presence),HX_("presence",3b,52,d7,66)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+static ::hx::StaticInfo *MemberUpdate_obj_sStaticStorageInfo = 0;
+#endif
+
+static ::String MemberUpdate_obj_sMemberFields[] = {
+	HX_("id",db,5b,00,00),
+	HX_("jid",c5,ca,50,00),
+	HX_("displayName",ad,11,f2,30),
+	HX_("isSelf",96,50,b7,69),
+	HX_("affiliation",b0,1a,35,a1),
+	HX_("presence",3b,52,d7,66),
+	HX_("applyTo",89,86,3a,4e),
+	::String(null()) };
+
+::hx::Class MemberUpdate_obj::__mClass;
+
+static ::String MemberUpdate_obj_sStaticFields[] = {
+	HX_("extractUpdates",09,cf,f5,73),
+	::String(null())
+};
+
+void MemberUpdate_obj::__register()
+{
+	MemberUpdate_obj _hx_dummy;
+	MemberUpdate_obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("borogove.MemberUpdate",90,05,db,c2);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &MemberUpdate_obj::__GetStatic;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(MemberUpdate_obj_sStaticFields);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(MemberUpdate_obj_sMemberFields);
+	__mClass->mCanCast = ::hx::TCanCast< MemberUpdate_obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = MemberUpdate_obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = MemberUpdate_obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+} // end namespace borogove
diff --git a/Sources/c_borogove/src/borogove/Message.cpp b/Sources/c_borogove/src/borogove/Message.cpp
index c9c8291..91037e2 100644
--- a/Sources/c_borogove/src/borogove/Message.cpp
+++ b/Sources/c_borogove/src/borogove/Message.cpp
@@ -10,6 +10,9 @@
 #ifndef INCLUDED_StringTools
 #include <StringTools.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_ChatAttachment
 #include <borogove/ChatAttachment.h>
 #endif
@@ -34,12 +37,12 @@
 #ifndef INCLUDED_borogove_Hash
 #include <borogove/Hash.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
-#endif
 #ifndef INCLUDED_borogove_JID
 #include <borogove/JID.h>
 #endif
+#ifndef INCLUDED_borogove_LinkMetadata
+#include <borogove/LinkMetadata.h>
+#endif
 #ifndef INCLUDED_borogove_Message
 #include <borogove/Message.h>
 #endif
@@ -68,22 +71,25 @@
 #include <haxe/ds/StringMap.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_5c42425238de6f01_43_new,"borogove.Message","new",0x751d0d4c,"borogove.Message.new","borogove/Message.hx",43,0x7a818ae5)
-HX_LOCAL_STACK_FRAME(_hx_pos_5c42425238de6f01_51_fromStanza,"borogove.Message","fromStanza",0x7cd2db93,"borogove.Message.fromStanza","borogove/Message.hx",51,0x7a818ae5)
-HX_LOCAL_STACK_FRAME(_hx_pos_5c42425238de6f01_179_fromStanza,"borogove.Message","fromStanza",0x7cd2db93,"borogove.Message.fromStanza","borogove/Message.hx",179,0x7a818ae5)
-HX_LOCAL_STACK_FRAME(_hx_pos_5c42425238de6f01_180_fromStanza,"borogove.Message","fromStanza",0x7cd2db93,"borogove.Message.fromStanza","borogove/Message.hx",180,0x7a818ae5)
-HX_LOCAL_STACK_FRAME(_hx_pos_5c42425238de6f01_181_fromStanza,"borogove.Message","fromStanza",0x7cd2db93,"borogove.Message.fromStanza","borogove/Message.hx",181,0x7a818ae5)
-HX_LOCAL_STACK_FRAME(_hx_pos_5c42425238de6f01_182_fromStanza,"borogove.Message","fromStanza",0x7cd2db93,"borogove.Message.fromStanza","borogove/Message.hx",182,0x7a818ae5)
-HX_LOCAL_STACK_FRAME(_hx_pos_5c42425238de6f01_186_fromStanza,"borogove.Message","fromStanza",0x7cd2db93,"borogove.Message.fromStanza","borogove/Message.hx",186,0x7a818ae5)
+HX_DEFINE_STACK_FRAME(_hx_pos_5c42425238de6f01_54_new,"borogove.Message","new",0x751d0d4c,"borogove.Message.new","borogove/Message.hx",54,0x7a818ae5)
+HX_LOCAL_STACK_FRAME(_hx_pos_5c42425238de6f01_62_fromStanza,"borogove.Message","fromStanza",0x7cd2db93,"borogove.Message.fromStanza","borogove/Message.hx",62,0x7a818ae5)
+HX_LOCAL_STACK_FRAME(_hx_pos_5c42425238de6f01_191_fromStanza,"borogove.Message","fromStanza",0x7cd2db93,"borogove.Message.fromStanza","borogove/Message.hx",191,0x7a818ae5)
+HX_LOCAL_STACK_FRAME(_hx_pos_5c42425238de6f01_192_fromStanza,"borogove.Message","fromStanza",0x7cd2db93,"borogove.Message.fromStanza","borogove/Message.hx",192,0x7a818ae5)
+HX_LOCAL_STACK_FRAME(_hx_pos_5c42425238de6f01_193_fromStanza,"borogove.Message","fromStanza",0x7cd2db93,"borogove.Message.fromStanza","borogove/Message.hx",193,0x7a818ae5)
+HX_LOCAL_STACK_FRAME(_hx_pos_5c42425238de6f01_194_fromStanza,"borogove.Message","fromStanza",0x7cd2db93,"borogove.Message.fromStanza","borogove/Message.hx",194,0x7a818ae5)
+HX_LOCAL_STACK_FRAME(_hx_pos_5c42425238de6f01_203_fromStanza,"borogove.Message","fromStanza",0x7cd2db93,"borogove.Message.fromStanza","borogove/Message.hx",203,0x7a818ae5)
 namespace borogove{
 
 void Message_obj::__construct(::String chatId,::String senderId,::String threadId, ::borogove::MessageStanza parsed, ::borogove::EncryptionInfo encryption){
-            	HX_STACKFRAME(&_hx_pos_5c42425238de6f01_43_new)
-HXLINE(  44)		this->chatId = chatId;
-HXLINE(  45)		this->senderId = senderId;
-HXLINE(  46)		this->threadId = threadId;
-HXLINE(  47)		this->parsed = parsed;
-HXLINE(  48)		this->encryption = encryption;
+            	HX_STACKFRAME(&_hx_pos_5c42425238de6f01_54_new)
+HXLINE(  55)		this->chatId = chatId;
+HXLINE(  56)		if (::hx::IsNull( senderId )) {
+HXLINE(  56)			HX_STACK_DO_THROW(HX_("no sender id",c7,72,2e,ca));
+            		}
+HXDLIN(  56)		this->senderId = senderId;
+HXLINE(  57)		this->threadId = threadId;
+HXLINE(  58)		this->parsed = parsed;
+HXLINE(  59)		this->encryption = encryption;
             	}
 
 Dynamic Message_obj::__CreateEmpty() { return new Message_obj; }
@@ -101,420 +107,397 @@ bool Message_obj::_hx_isInstanceOf(int inClassId) {
 	return inClassId==(int)0x00000001 || inClassId==(int)0x7f796532;
 }
 
- ::borogove::Message Message_obj::fromStanza( ::borogove::Stanza stanza, ::borogove::JID localJid, ::Dynamic addContext, ::borogove::EncryptionInfo encryptionInfo){
-            	HX_GC_STACKFRAME(&_hx_pos_5c42425238de6f01_51_fromStanza)
-HXDLIN(  51)		while(true){
+ ::borogove::Message Message_obj::fromStanza( ::borogove::Stanza stanza, ::borogove::JID localJid, ::Dynamic addContext, ::borogove::EncryptionInfo encryptionInfo,::hx::Null< bool >  __o_preferChatMessage){
+            		bool preferChatMessage = __o_preferChatMessage.Default(false);
+            	HX_GC_STACKFRAME(&_hx_pos_5c42425238de6f01_62_fromStanza)
+HXDLIN(  62)		while(true){
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::haxe::ds::StringMap,recipients) HXARGC(0)
             			 ::Dynamic _hx_run(){
-            				HX_GC_STACKFRAME(&_hx_pos_5c42425238de6f01_179_fromStanza)
-HXLINE( 179)				return recipients->keys();
+            				HX_GC_STACKFRAME(&_hx_pos_5c42425238de6f01_191_fromStanza)
+HXLINE( 191)				return recipients->keys();
             			}
             			HX_END_LOCAL_FUNC0(return)
 
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(2)
             			int _hx_run( ::borogove::JID x, ::borogove::JID y){
-            				HX_GC_STACKFRAME(&_hx_pos_5c42425238de6f01_180_fromStanza)
-HXLINE( 180)				::String _hx_tmp = x->asString();
-HXDLIN( 180)				return ::Reflect_obj::compare(_hx_tmp,y->asString());
+            				HX_GC_STACKFRAME(&_hx_pos_5c42425238de6f01_192_fromStanza)
+HXLINE( 192)				::String _hx_tmp = x->asString();
+HXDLIN( 192)				return ::Reflect_obj::compare(_hx_tmp,y->asString());
             			}
             			HX_END_LOCAL_FUNC2(return)
 
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::haxe::ds::StringMap,replyTo) HXARGC(0)
             			 ::Dynamic _hx_run(){
-            				HX_GC_STACKFRAME(&_hx_pos_5c42425238de6f01_181_fromStanza)
-HXLINE( 181)				return replyTo->keys();
+            				HX_GC_STACKFRAME(&_hx_pos_5c42425238de6f01_193_fromStanza)
+HXLINE( 193)				return replyTo->keys();
             			}
             			HX_END_LOCAL_FUNC0(return)
 
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_3) HXARGC(2)
             			int _hx_run( ::borogove::JID x, ::borogove::JID y){
-            				HX_GC_STACKFRAME(&_hx_pos_5c42425238de6f01_182_fromStanza)
-HXLINE( 182)				::String _hx_tmp = x->asString();
-HXDLIN( 182)				return ::Reflect_obj::compare(_hx_tmp,y->asString());
+            				HX_GC_STACKFRAME(&_hx_pos_5c42425238de6f01_194_fromStanza)
+HXLINE( 194)				::String _hx_tmp = x->asString();
+HXDLIN( 194)				return ::Reflect_obj::compare(_hx_tmp,y->asString());
             			}
             			HX_END_LOCAL_FUNC2(return)
 
-HXLINE(  52)			::String fromAttr = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
-HXLINE(  53)			::String from;
-HXDLIN(  53)			if (::hx::IsNull( fromAttr )) {
-HXLINE(  53)				from = localJid->domain;
+HXLINE(  63)			::String fromAttr = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
+HXLINE(  64)			::String from;
+HXDLIN(  64)			if (::hx::IsNull( fromAttr )) {
+HXLINE(  64)				from = localJid->domain;
             			}
             			else {
-HXLINE(  53)				from = fromAttr;
-            			}
-HXLINE(  54)			::String localId = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("id",db,5b,00,00))) );
-HXLINE(  55)			if (::hx::IsNull( encryptionInfo )) {
-HXLINE(  56)				encryptionInfo = ::borogove::EncryptionInfo_obj::fromStanza(stanza);
-            			}
-HXLINE(  59)			if ((( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
-HXLINE(  60)				return  ::borogove::Message_obj::__alloc( HX_CTX ,from,from,null(),::borogove::MessageStanza_obj::ErrorMessageStanza(localId,stanza),encryptionInfo);
-            			}
-HXLINE(  63)			 ::borogove::ChatMessageBuilder msg =  ::borogove::ChatMessageBuilder_obj::__alloc( HX_CTX );
-HXLINE(  64)			msg->stanza = stanza;
-HXLINE(  65)			msg->timestamp = stanza->findText(HX_("{urn:xmpp:delay}delay@stamp",cb,88,c4,86));
-HXLINE(  66)			msg->threadId = stanza->getChildText(HX_("thread",ca,7a,b9,8e),null());
-HXLINE(  67)			msg->lang = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("xml:lang",f1,b1,be,5f))) );
-HXLINE(  68)			msg->text = stanza->getChildText(HX_("body",a2,7a,1b,41),null());
-HXLINE(  69)			bool _hx_tmp;
-HXDLIN(  69)			if (::hx::IsNotNull( msg->text )) {
-HXLINE(  69)				if (::hx::IsNotNull( msg->lang )) {
-HXLINE(  69)					_hx_tmp = (msg->lang == HX_("",00,00,00,00));
+HXLINE(  64)				from = fromAttr;
+            			}
+HXLINE(  65)			::String localId = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("id",db,5b,00,00))) );
+HXLINE(  66)			if (::hx::IsNull( encryptionInfo )) {
+HXLINE(  67)				encryptionInfo = ::borogove::EncryptionInfo_obj::fromStanza(stanza);
+            			}
+HXLINE(  70)			if ((( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
+HXLINE(  71)				return  ::borogove::Message_obj::__alloc( HX_CTX ,from,from,null(),::borogove::MessageStanza_obj::ErrorMessageStanza(localId,stanza),encryptionInfo);
+            			}
+HXLINE(  74)			 ::borogove::ChatMessageBuilder msg =  ::borogove::ChatMessageBuilder_obj::__alloc( HX_CTX );
+HXLINE(  75)			msg->stanza = stanza;
+HXLINE(  76)			msg->timestamp = stanza->findText(HX_("{urn:xmpp:delay}delay@stamp",cb,88,c4,86));
+HXLINE(  77)			msg->threadId = stanza->getChildText(HX_("thread",ca,7a,b9,8e),null());
+HXLINE(  78)			msg->lang = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("xml:lang",f1,b1,be,5f))) );
+HXLINE(  79)			msg->text = stanza->getChildText(HX_("body",a2,7a,1b,41),null());
+HXLINE(  80)			bool _hx_tmp;
+HXDLIN(  80)			if (::hx::IsNotNull( msg->text )) {
+HXLINE(  80)				if (::hx::IsNotNull( msg->lang )) {
+HXLINE(  80)					_hx_tmp = (msg->lang == HX_("",00,00,00,00));
             				}
             				else {
-HXLINE(  69)					_hx_tmp = true;
+HXLINE(  80)					_hx_tmp = true;
             				}
             			}
             			else {
-HXLINE(  69)				_hx_tmp = false;
+HXLINE(  80)				_hx_tmp = false;
             			}
-HXDLIN(  69)			if (_hx_tmp) {
-HXLINE(  70)				 ::borogove::Stanza tmp = stanza->getChild(HX_("body",a2,7a,1b,41),null());
-HXDLIN(  70)				::String _hx_tmp1;
-HXDLIN(  70)				if (::hx::IsNotNull( tmp )) {
-HXLINE(  70)					_hx_tmp1 = ( (::String)(::Reflect_obj::field(tmp->attr,HX_("xml:lang",f1,b1,be,5f))) );
+HXDLIN(  80)			if (_hx_tmp) {
+HXLINE(  81)				 ::borogove::Stanza tmp = stanza->getChild(HX_("body",a2,7a,1b,41),null());
+HXDLIN(  81)				::String _hx_tmp1;
+HXDLIN(  81)				if (::hx::IsNotNull( tmp )) {
+HXLINE(  81)					_hx_tmp1 = ( (::String)(::Reflect_obj::field(tmp->attr,HX_("xml:lang",f1,b1,be,5f))) );
             				}
             				else {
-HXLINE(  70)					_hx_tmp1 = null();
+HXLINE(  81)					_hx_tmp1 = null();
             				}
-HXDLIN(  70)				msg->lang = _hx_tmp1;
+HXDLIN(  81)				msg->lang = _hx_tmp1;
             			}
-HXLINE(  72)			msg->from = ::borogove::JID_obj::parse(from);
-HXLINE(  73)			bool isGroupchat = (( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) == HX_("groupchat",97,1d,c8,e5));
-HXLINE(  74)			int _hx_tmp2;
-HXDLIN(  74)			if (isGroupchat) {
-HXLINE(  74)				_hx_tmp2 = 2;
+HXLINE(  83)			 ::borogove::Stanza subject = stanza->getChild(HX_("subject",ac,01,88,29),null());
+HXLINE(  84)			if (::hx::IsNotNull( subject )) {
+HXLINE(  84)				msg->payloads->push(subject);
             			}
-            			else {
-HXLINE(  74)				_hx_tmp2 = 0;
-            			}
-HXDLIN(  74)			msg->type = _hx_tmp2;
-HXLINE(  75)			bool _hx_tmp3;
-HXDLIN(  75)			if ((msg->type == 0)) {
-HXLINE(  75)				_hx_tmp3 = ::hx::IsNotNull( stanza->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14)) );
+HXLINE(  85)			msg->from = ::borogove::JID_obj::parse(from);
+HXLINE(  86)			bool isGroupchat = (( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) == HX_("groupchat",97,1d,c8,e5));
+HXLINE(  87)			int _hx_tmp2;
+HXDLIN(  87)			if (isGroupchat) {
+HXLINE(  87)				_hx_tmp2 = 2;
             			}
             			else {
-HXLINE(  75)				_hx_tmp3 = false;
-            			}
-HXDLIN(  75)			if (_hx_tmp3) {
-HXLINE(  76)				msg->type = 3;
+HXLINE(  87)				_hx_tmp2 = 0;
             			}
-HXLINE(  78)			 ::borogove::JID tmp1;
-HXDLIN(  78)			bool tmp2;
-HXDLIN(  78)			if ((msg->type != 2)) {
-HXLINE(  78)				tmp2 = (msg->type == 3);
+HXDLIN(  87)			msg->type = _hx_tmp2;
+HXLINE(  88)			bool _hx_tmp3;
+HXDLIN(  88)			if ((msg->type == 0)) {
+HXLINE(  88)				_hx_tmp3 = ::hx::IsNotNull( stanza->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14)) );
             			}
             			else {
-HXLINE(  78)				tmp2 = true;
+HXLINE(  88)				_hx_tmp3 = false;
             			}
-HXDLIN(  78)			if (tmp2) {
-HXLINE(  78)				tmp1 = msg->from;
+HXDLIN(  88)			if (_hx_tmp3) {
+HXLINE(  89)				msg->type = 3;
             			}
-            			else {
-HXLINE(  78)				 ::borogove::JID tmp3 = msg->from;
-HXDLIN(  78)				if (::hx::IsNotNull( tmp3 )) {
-HXLINE(  78)					tmp1 = tmp3->asBare();
-            				}
-            				else {
-HXLINE(  78)					tmp1 = null();
-            				}
-            			}
-HXDLIN(  78)			::String _hx_tmp4;
-HXDLIN(  78)			if (::hx::IsNotNull( tmp1 )) {
-HXLINE(  78)				_hx_tmp4 = tmp1->asString();
-            			}
-            			else {
-HXLINE(  78)				_hx_tmp4 = null();
-            			}
-HXDLIN(  78)			msg->senderId = _hx_tmp4;
-HXLINE(  79)			 ::borogove::JID localJidBare = localJid->asBare();
-HXLINE(  80)			::String domain = localJid->domain;
-HXLINE(  81)			::String to = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("to",7b,65,00,00))) );
-HXLINE(  82)			 ::borogove::JID _hx_tmp5;
-HXDLIN(  82)			if (::hx::IsNull( to )) {
-HXLINE(  82)				_hx_tmp5 = localJid;
+HXLINE(  91)			 ::borogove::JID localJidBare = localJid->asBare();
+HXLINE(  92)			::String domain = localJid->domain;
+HXLINE(  93)			::String to = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("to",7b,65,00,00))) );
+HXLINE(  94)			 ::borogove::JID _hx_tmp4;
+HXDLIN(  94)			if (::hx::IsNull( to )) {
+HXLINE(  94)				_hx_tmp4 = localJid;
             			}
             			else {
-HXLINE(  82)				_hx_tmp5 = ::borogove::JID_obj::parse(to);
+HXLINE(  94)				_hx_tmp4 = ::borogove::JID_obj::parse(to);
             			}
-HXDLIN(  82)			msg->to = _hx_tmp5;
-HXLINE(  83)			msg->encryption = encryptionInfo;
-HXLINE(  85)			bool _hx_tmp6;
-HXDLIN(  85)			if (::hx::IsNotNull( msg->from )) {
-HXLINE(  85)				_hx_tmp6 = msg->from->equals(localJidBare);
+HXDLIN(  94)			msg->to = _hx_tmp4;
+HXLINE(  95)			msg->encryption = encryptionInfo;
+HXLINE(  97)			bool _hx_tmp5;
+HXDLIN(  97)			if (::hx::IsNotNull( msg->from )) {
+HXLINE(  97)				_hx_tmp5 = msg->from->equals(localJidBare);
             			}
             			else {
-HXLINE(  85)				_hx_tmp6 = false;
+HXLINE(  97)				_hx_tmp5 = false;
             			}
-HXDLIN(  85)			if (_hx_tmp6) {
-HXLINE(  86)				 ::borogove::Stanza carbon = stanza->getChild(HX_("received",21,45,fd,e2),HX_("urn:xmpp:carbons:2",02,86,9e,df));
-HXLINE(  87)				if (::hx::IsNull( carbon )) {
-HXLINE(  87)					carbon = stanza->getChild(HX_("sent",58,8d,50,4c),HX_("urn:xmpp:carbons:2",02,86,9e,df));
+HXDLIN(  97)			if (_hx_tmp5) {
+HXLINE(  98)				 ::borogove::Stanza carbon = stanza->getChild(HX_("received",21,45,fd,e2),HX_("urn:xmpp:carbons:2",02,86,9e,df));
+HXLINE(  99)				if (::hx::IsNull( carbon )) {
+HXLINE(  99)					carbon = stanza->getChild(HX_("sent",58,8d,50,4c),HX_("urn:xmpp:carbons:2",02,86,9e,df));
             				}
-HXLINE(  88)				if (::hx::IsNotNull( carbon )) {
-HXLINE(  89)					 ::borogove::Stanza fwd = carbon->getChild(HX_("forwarded",64,f5,9a,17),HX_("urn:xmpp:forward:0",1f,ec,b0,d1));
-HXLINE(  90)					if (::hx::IsNotNull( fwd )) {
-HXLINE(  90)						 ::Dynamic _gtmp = null();
-HXDLIN(  90)						stanza = fwd->getFirstChild();
-HXDLIN(  90)						addContext = _gtmp;
+HXLINE( 100)				if (::hx::IsNotNull( carbon )) {
+HXLINE( 101)					 ::borogove::Stanza fwd = carbon->getChild(HX_("forwarded",64,f5,9a,17),HX_("urn:xmpp:forward:0",1f,ec,b0,d1));
+HXLINE( 102)					if (::hx::IsNotNull( fwd )) {
+HXLINE( 102)						 ::Dynamic _gtmp = null();
+HXDLIN( 102)						stanza = fwd->getFirstChild();
+HXDLIN( 102)						preferChatMessage = ( (bool)(_gtmp) );
 HXLINE(   1)						continue;
             					}
             				}
             			}
-HXLINE(  94)			if (::hx::IsNotNull( localId )) {
-HXLINE(  94)				msg->localId = localId;
-            			}
-HXLINE(  95)			 ::borogove::Stanza altServerId = null();
-HXLINE(  96)			{
-HXLINE(  96)				int _g = 0;
-HXDLIN(  96)				::Array< ::Dynamic> _g1 = stanza->allTags(HX_("stanza-id",73,8a,54,e9),HX_("urn:xmpp:sid:0",a8,4b,37,54));
-HXDLIN(  96)				while((_g < _g1->length)){
-HXLINE(  96)					 ::borogove::Stanza stanzaId = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
-HXDLIN(  96)					_g = (_g + 1);
-HXLINE(  97)					::String id = ( (::String)(::Reflect_obj::field(stanzaId->attr,HX_("id",db,5b,00,00))) );
-HXLINE(  98)					bool _hx_tmp7;
-HXDLIN(  98)					bool _hx_tmp8;
-HXDLIN(  98)					if ((( (::String)(::Reflect_obj::field(stanzaId->attr,HX_("by",d7,55,00,00))) ) != domain)) {
-HXLINE(  98)						::String _hx_tmp9 = ( (::String)(::Reflect_obj::field(stanzaId->attr,HX_("by",d7,55,00,00))) );
-HXDLIN(  98)						_hx_tmp8 = (_hx_tmp9 == localJidBare->asString());
+HXLINE( 106)			if (::hx::IsNotNull( localId )) {
+HXLINE( 106)				msg->localId = localId;
+            			}
+HXLINE( 107)			 ::borogove::Stanza altServerId = null();
+HXLINE( 108)			{
+HXLINE( 108)				int _g = 0;
+HXDLIN( 108)				::Array< ::Dynamic> _g1 = stanza->allTags(HX_("stanza-id",73,8a,54,e9),HX_("urn:xmpp:sid:0",a8,4b,37,54));
+HXDLIN( 108)				while((_g < _g1->length)){
+HXLINE( 108)					 ::borogove::Stanza stanzaId = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 108)					_g = (_g + 1);
+HXLINE( 109)					::String id = ( (::String)(::Reflect_obj::field(stanzaId->attr,HX_("id",db,5b,00,00))) );
+HXLINE( 110)					bool _hx_tmp6;
+HXDLIN( 110)					bool _hx_tmp7;
+HXDLIN( 110)					if ((( (::String)(::Reflect_obj::field(stanzaId->attr,HX_("by",d7,55,00,00))) ) != domain)) {
+HXLINE( 110)						::String _hx_tmp8 = ( (::String)(::Reflect_obj::field(stanzaId->attr,HX_("by",d7,55,00,00))) );
+HXDLIN( 110)						_hx_tmp7 = (_hx_tmp8 == localJidBare->asString());
             					}
             					else {
-HXLINE(  98)						_hx_tmp8 = true;
+HXLINE( 110)						_hx_tmp7 = true;
             					}
-HXDLIN(  98)					if (_hx_tmp8) {
-HXLINE(  98)						_hx_tmp7 = ::hx::IsNotNull( id );
+HXDLIN( 110)					if (_hx_tmp7) {
+HXLINE( 110)						_hx_tmp6 = ::hx::IsNotNull( id );
             					}
             					else {
-HXLINE(  98)						_hx_tmp7 = false;
+HXLINE( 110)						_hx_tmp6 = false;
             					}
-HXDLIN(  98)					if (_hx_tmp7) {
-HXLINE(  99)						msg->serverIdBy = localJidBare->asString();
-HXLINE( 100)						msg->serverId = id;
-HXLINE( 101)						goto _hx_goto_2;
+HXDLIN( 110)					if (_hx_tmp6) {
+HXLINE( 111)						msg->serverIdBy = localJidBare->asString();
+HXLINE( 112)						msg->serverId = id;
+HXLINE( 113)						goto _hx_goto_2;
             					}
-HXLINE( 103)					altServerId = stanzaId;
+HXLINE( 115)					altServerId = stanzaId;
             				}
             				_hx_goto_2:;
             			}
-HXLINE( 105)			bool _hx_tmp10;
-HXDLIN( 105)			bool _hx_tmp11;
-HXDLIN( 105)			if (::hx::IsNull( msg->serverId )) {
-HXLINE( 105)				_hx_tmp11 = ::hx::IsNotNull( altServerId );
+HXLINE( 117)			bool _hx_tmp9;
+HXDLIN( 117)			bool _hx_tmp10;
+HXDLIN( 117)			if (::hx::IsNull( msg->serverId )) {
+HXLINE( 117)				_hx_tmp10 = ::hx::IsNotNull( altServerId );
             			}
             			else {
-HXLINE( 105)				_hx_tmp11 = false;
+HXLINE( 117)				_hx_tmp10 = false;
             			}
-HXDLIN( 105)			if (_hx_tmp11) {
-HXLINE( 105)				_hx_tmp10 = (( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) != HX_("error",c8,cb,29,73));
+HXDLIN( 117)			if (_hx_tmp10) {
+HXLINE( 117)				_hx_tmp9 = (( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) ) != HX_("error",c8,cb,29,73));
             			}
             			else {
-HXLINE( 105)				_hx_tmp10 = false;
+HXLINE( 117)				_hx_tmp9 = false;
             			}
-HXDLIN( 105)			if (_hx_tmp10) {
-HXLINE( 106)				::String id1 = ( (::String)(::Reflect_obj::field(altServerId->attr,HX_("id",db,5b,00,00))) );
-HXLINE( 107)				if (::hx::IsNotNull( id1 )) {
-HXLINE( 108)					msg->serverId = id1;
-HXLINE( 109)					msg->serverIdBy = ( (::String)(::Reflect_obj::field(altServerId->attr,HX_("by",d7,55,00,00))) );
+HXDLIN( 117)			if (_hx_tmp9) {
+HXLINE( 118)				::String id1 = ( (::String)(::Reflect_obj::field(altServerId->attr,HX_("id",db,5b,00,00))) );
+HXLINE( 119)				if (::hx::IsNotNull( id1 )) {
+HXLINE( 120)					msg->serverId = id1;
+HXLINE( 121)					msg->serverIdBy = ( (::String)(::Reflect_obj::field(altServerId->attr,HX_("by",d7,55,00,00))) );
             				}
             			}
-HXLINE( 112)			bool _hx_tmp12;
-HXDLIN( 112)			if (::hx::IsNotNull( msg->serverIdBy )) {
-HXLINE( 112)				::String msg1 = msg->serverIdBy;
-HXDLIN( 112)				_hx_tmp12 = (msg1 != localJid->asBare()->asString());
+HXLINE( 124)			bool _hx_tmp11;
+HXDLIN( 124)			if (::hx::IsNotNull( msg->serverIdBy )) {
+HXLINE( 124)				::String msg1 = msg->serverIdBy;
+HXDLIN( 124)				_hx_tmp11 = (msg1 != localJid->asBare()->asString());
             			}
             			else {
-HXLINE( 112)				_hx_tmp12 = false;
+HXLINE( 124)				_hx_tmp11 = false;
             			}
-HXDLIN( 112)			if (_hx_tmp12) {
-HXLINE( 113)				msg->replyId = msg->serverId;
+HXDLIN( 124)			if (_hx_tmp11) {
+HXLINE( 125)				msg->replyId = msg->serverId;
             			}
             			else {
-HXLINE( 114)				::String msg2 = msg->serverIdBy;
-HXDLIN( 114)				if ((msg2 == localJid->asBare()->asString())) {
-HXLINE( 115)					msg->replyId = msg->localId;
+HXLINE( 126)				::String msg2 = msg->serverIdBy;
+HXDLIN( 126)				if ((msg2 == localJid->asBare()->asString())) {
+HXLINE( 127)					msg->replyId = msg->localId;
             				}
             			}
-HXLINE( 117)			int _hx_tmp13;
-HXDLIN( 117)			bool _hx_tmp14;
-HXDLIN( 117)			if (::hx::IsNotNull( msg->to )) {
-HXLINE( 117)				_hx_tmp14 = msg->to->asBare()->equals(localJidBare);
+HXLINE( 129)			int _hx_tmp12;
+HXDLIN( 129)			bool _hx_tmp13;
+HXDLIN( 129)			if (::hx::IsNotNull( msg->to )) {
+HXLINE( 129)				_hx_tmp13 = msg->to->asBare()->equals(localJidBare);
             			}
             			else {
-HXLINE( 117)				_hx_tmp14 = true;
+HXLINE( 129)				_hx_tmp13 = true;
             			}
-HXDLIN( 117)			if (_hx_tmp14) {
-HXLINE( 117)				_hx_tmp13 = 0;
+HXDLIN( 129)			if (_hx_tmp13) {
+HXLINE( 129)				_hx_tmp12 = 0;
             			}
             			else {
-HXLINE( 117)				_hx_tmp13 = 1;
+HXLINE( 129)				_hx_tmp12 = 1;
             			}
-HXDLIN( 117)			msg->direction = _hx_tmp13;
-HXLINE( 118)			bool _hx_tmp15;
-HXDLIN( 118)			if (::hx::IsNotNull( msg->from )) {
-HXLINE( 118)				_hx_tmp15 = msg->from->asBare()->equals(localJidBare);
+HXDLIN( 129)			msg->direction = _hx_tmp12;
+HXLINE( 130)			bool _hx_tmp14;
+HXDLIN( 130)			if (::hx::IsNotNull( msg->from )) {
+HXLINE( 130)				_hx_tmp14 = msg->from->asBare()->equals(localJidBare);
             			}
             			else {
-HXLINE( 118)				_hx_tmp15 = false;
+HXLINE( 130)				_hx_tmp14 = false;
             			}
-HXDLIN( 118)			if (_hx_tmp15) {
-HXLINE( 118)				msg->direction = 1;
+HXDLIN( 130)			if (_hx_tmp14) {
+HXLINE( 130)				msg->direction = 1;
             			}
-HXLINE( 119)			int _hx_tmp16;
-HXDLIN( 119)			if ((msg->direction == 0)) {
-HXLINE( 119)				_hx_tmp16 = 2;
+HXLINE( 131)			int _hx_tmp15;
+HXDLIN( 131)			if ((msg->direction == 0)) {
+HXLINE( 131)				_hx_tmp15 = 2;
             			}
             			else {
-HXLINE( 119)				_hx_tmp16 = 1;
-            			}
-HXDLIN( 119)			msg->status = _hx_tmp16;
-HXLINE( 121)			 ::borogove::Stanza mucDirectInvite = stanza->getChild(HX_("x",78,00,00,00),HX_("jabber:x:conference",b4,78,c2,fc));
-HXLINE( 122)			if (::hx::IsNotNull( mucDirectInvite )) {
-HXLINE( 123)				::String mucJid = ( (::String)(::Reflect_obj::field(mucDirectInvite->attr,HX_("jid",c5,ca,50,00))) );
-HXLINE( 124)				if (::hx::IsNotNull( mucJid )) {
-HXLINE( 125)					::String _hx_tmp17 = ( (::String)(::Reflect_obj::field(mucDirectInvite->attr,HX_("thread",ca,7a,b9,8e))) );
-HXDLIN( 125)					::String msg3 = msg->serverId;
-HXDLIN( 125)					::String msg4 = msg->serverIdBy;
-HXDLIN( 125)					::String _hx_tmp18 = ( (::String)(::Reflect_obj::field(mucDirectInvite->attr,HX_("reason",c4,0f,9d,fc))) );
-HXDLIN( 125)					return  ::borogove::Message_obj::__alloc( HX_CTX ,mucJid,from,_hx_tmp17,::borogove::MessageStanza_obj::MucInviteStanza(msg3,msg4,_hx_tmp18,( (::String)(::Reflect_obj::field(mucDirectInvite->attr,HX_("password",1b,23,d0,48))) )),encryptionInfo);
+HXLINE( 131)				_hx_tmp15 = 1;
+            			}
+HXDLIN( 131)			msg->status = _hx_tmp15;
+HXLINE( 133)			 ::borogove::Stanza mucDirectInvite = stanza->getChild(HX_("x",78,00,00,00),HX_("jabber:x:conference",b4,78,c2,fc));
+HXLINE( 134)			if (::hx::IsNotNull( mucDirectInvite )) {
+HXLINE( 135)				::String mucJid = ( (::String)(::Reflect_obj::field(mucDirectInvite->attr,HX_("jid",c5,ca,50,00))) );
+HXLINE( 136)				if (::hx::IsNotNull( mucJid )) {
+HXLINE( 137)					::String _hx_tmp16 = ( (::String)(::Reflect_obj::field(mucDirectInvite->attr,HX_("thread",ca,7a,b9,8e))) );
+HXDLIN( 137)					::String msg3 = msg->serverId;
+HXDLIN( 137)					::String msg4 = msg->serverIdBy;
+HXDLIN( 137)					::String _hx_tmp17 = ( (::String)(::Reflect_obj::field(mucDirectInvite->attr,HX_("reason",c4,0f,9d,fc))) );
+HXDLIN( 137)					return  ::borogove::Message_obj::__alloc( HX_CTX ,mucJid,from,_hx_tmp16,::borogove::MessageStanza_obj::MucInviteStanza(msg3,msg4,_hx_tmp17,( (::String)(::Reflect_obj::field(mucDirectInvite->attr,HX_("password",1b,23,d0,48))) )),encryptionInfo);
             				}
             			}
-HXLINE( 129)			 ::borogove::Stanza mucUser = stanza->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
-HXLINE( 130)			 ::borogove::Stanza mucInvite;
-HXDLIN( 130)			if (::hx::IsNotNull( mucUser )) {
-HXLINE( 130)				mucInvite = mucUser->getChild(HX_("invite",c9,f1,db,9f),null());
+HXLINE( 141)			 ::borogove::Stanza mucUser = stanza->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
+HXLINE( 142)			 ::borogove::Stanza mucInvite;
+HXDLIN( 142)			if (::hx::IsNotNull( mucUser )) {
+HXLINE( 142)				mucInvite = mucUser->getChild(HX_("invite",c9,f1,db,9f),null());
             			}
             			else {
-HXLINE( 130)				mucInvite = null();
+HXLINE( 142)				mucInvite = null();
             			}
-HXLINE( 131)			if (::hx::IsNotNull( mucInvite )) {
-HXLINE( 132)				 ::borogove::Stanza tmp4 = mucInvite->getChild(HX_("continue",67,e0,c8,31),null());
-HXDLIN( 132)				 ::Dynamic tmp5;
-HXDLIN( 132)				if (::hx::IsNotNull( tmp4 )) {
-HXLINE( 132)					tmp5 = tmp4->attr;
+HXLINE( 143)			if (::hx::IsNotNull( mucInvite )) {
+HXLINE( 144)				 ::borogove::Stanza tmp1 = mucInvite->getChild(HX_("continue",67,e0,c8,31),null());
+HXDLIN( 144)				 ::Dynamic tmp2;
+HXDLIN( 144)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 144)					tmp2 = tmp1->attr;
             				}
             				else {
-HXLINE( 132)					tmp5 = null();
+HXLINE( 144)					tmp2 = null();
             				}
-HXDLIN( 132)				::String threadId;
-HXDLIN( 132)				if (::hx::IsNotNull( tmp5 )) {
-HXLINE( 132)					threadId = ( (::String)(::Reflect_obj::field(tmp5,HX_("thread",ca,7a,b9,8e))) );
+HXDLIN( 144)				::String threadId;
+HXDLIN( 144)				if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 144)					threadId = ( (::String)(::Reflect_obj::field(tmp2,HX_("thread",ca,7a,b9,8e))) );
             				}
             				else {
-HXLINE( 132)					threadId = null();
+HXLINE( 144)					threadId = null();
             				}
-HXLINE( 133)				::String reason = mucInvite->getChildText(HX_("reason",c4,0f,9d,fc),null());
-HXLINE( 134)				::String password = mucInvite->getChildText(HX_("password",1b,23,d0,48),null());
-HXLINE( 136)				::String _hx_tmp19;
-HXDLIN( 136)				::String tmp6 = ( (::String)(::Reflect_obj::field(mucInvite->attr,HX_("from",6a,a5,c2,43))) );
-HXDLIN( 136)				if (::hx::IsNotNull( tmp6 )) {
-HXLINE( 136)					_hx_tmp19 = tmp6;
+HXLINE( 145)				::String reason = mucInvite->getChildText(HX_("reason",c4,0f,9d,fc),null());
+HXLINE( 146)				::String password = mucInvite->getChildText(HX_("password",1b,23,d0,48),null());
+HXLINE( 148)				::String _hx_tmp18;
+HXDLIN( 148)				::String tmp3 = ( (::String)(::Reflect_obj::field(mucInvite->attr,HX_("from",6a,a5,c2,43))) );
+HXDLIN( 148)				if (::hx::IsNotNull( tmp3 )) {
+HXLINE( 148)					_hx_tmp18 = tmp3;
             				}
             				else {
-HXLINE( 136)					_hx_tmp19 = from;
+HXLINE( 148)					_hx_tmp18 = from;
             				}
-HXDLIN( 136)				return  ::borogove::Message_obj::__alloc( HX_CTX ,from,_hx_tmp19,threadId,::borogove::MessageStanza_obj::MucInviteStanza(msg->serverId,msg->serverIdBy,reason,password),encryptionInfo);
+HXDLIN( 148)				return  ::borogove::Message_obj::__alloc( HX_CTX ,from,_hx_tmp18,threadId,::borogove::MessageStanza_obj::MucInviteStanza(msg->serverId,msg->serverIdBy,reason,password),encryptionInfo);
             			}
-HXLINE( 139)			 ::haxe::ds::StringMap recipients =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE( 140)			 ::haxe::ds::StringMap replyTo =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE( 141)			if (::hx::IsNotNull( msg->to )) {
-HXLINE( 142)				::String k = msg->to->asBare()->asString();
-HXDLIN( 142)				recipients->set(k,true);
+HXLINE( 151)			 ::haxe::ds::StringMap recipients =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 152)			 ::haxe::ds::StringMap replyTo =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 153)			if (::hx::IsNotNull( msg->to )) {
+HXLINE( 154)				::String k = msg->to->asBare()->asString();
+HXDLIN( 154)				recipients->set(k,true);
             			}
-HXLINE( 144)			 ::borogove::JID from1 = msg->from;
-HXLINE( 145)			bool _hx_tmp20;
-HXDLIN( 145)			if ((msg->direction == 0)) {
-HXLINE( 145)				_hx_tmp20 = ::hx::IsNotNull( from1 );
+HXLINE( 156)			 ::borogove::JID from1 = msg->from;
+HXLINE( 157)			bool _hx_tmp19;
+HXDLIN( 157)			if ((msg->direction == 0)) {
+HXLINE( 157)				_hx_tmp19 = ::hx::IsNotNull( from1 );
             			}
             			else {
-HXLINE( 145)				_hx_tmp20 = false;
+HXLINE( 157)				_hx_tmp19 = false;
             			}
-HXDLIN( 145)			if (_hx_tmp20) {
-HXLINE( 146)				::String k1;
-HXDLIN( 146)				if (isGroupchat) {
-HXLINE( 146)					k1 = from1->asBare()->asString();
+HXDLIN( 157)			if (_hx_tmp19) {
+HXLINE( 158)				::String k1;
+HXDLIN( 158)				if (isGroupchat) {
+HXLINE( 158)					k1 = from1->asBare()->asString();
             				}
             				else {
-HXLINE( 146)					k1 = from1->asString();
+HXLINE( 158)					k1 = from1->asString();
             				}
-HXDLIN( 146)				replyTo->set(k1,true);
+HXDLIN( 158)				replyTo->set(k1,true);
             			}
             			else {
-HXLINE( 147)				if (::hx::IsNotNull( msg->to )) {
-HXLINE( 148)					::String k2 = msg->to->asString();
-HXDLIN( 148)					replyTo->set(k2,true);
+HXLINE( 159)				if (::hx::IsNotNull( msg->to )) {
+HXLINE( 160)					::String k2 = msg->to->asString();
+HXDLIN( 160)					replyTo->set(k2,true);
             				}
             			}
-HXLINE( 151)			 ::borogove::Stanza addresses = stanza->getChild(HX_("addresses",22,9f,12,8c),HX_("http://jabber.org/protocol/address",c0,fd,09,ed));
-HXLINE( 152)			bool anyExtendedReplyTo = false;
-HXLINE( 153)			if (::hx::IsNotNull( addresses )) {
-HXLINE( 154)				int _g2 = 0;
-HXDLIN( 154)				::Array< ::Dynamic> _g3 = addresses->allTags(HX_("address",b4,71,0b,9d),null());
-HXDLIN( 154)				while((_g2 < _g3->length)){
-HXLINE( 154)					 ::borogove::Stanza address = _g3->__get(_g2).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 154)					_g2 = (_g2 + 1);
-HXLINE( 155)					::String jid = ( (::String)(::Reflect_obj::field(address->attr,HX_("jid",c5,ca,50,00))) );
-HXLINE( 156)					if ((( (::String)(::Reflect_obj::field(address->attr,HX_("type",ba,f2,08,4d))) ) == HX_("noreply",49,1d,9c,26))) {
-HXLINE( 157)						replyTo->clear();
+HXLINE( 163)			 ::borogove::Stanza addresses = stanza->getChild(HX_("addresses",22,9f,12,8c),HX_("http://jabber.org/protocol/address",c0,fd,09,ed));
+HXLINE( 164)			bool anyExtendedReplyTo = false;
+HXLINE( 165)			if (::hx::IsNotNull( addresses )) {
+HXLINE( 166)				int _g2 = 0;
+HXDLIN( 166)				::Array< ::Dynamic> _g3 = addresses->allTags(HX_("address",b4,71,0b,9d),null());
+HXDLIN( 166)				while((_g2 < _g3->length)){
+HXLINE( 166)					 ::borogove::Stanza address = _g3->__get(_g2).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 166)					_g2 = (_g2 + 1);
+HXLINE( 167)					::String jid = ( (::String)(::Reflect_obj::field(address->attr,HX_("jid",c5,ca,50,00))) );
+HXLINE( 168)					if ((( (::String)(::Reflect_obj::field(address->attr,HX_("type",ba,f2,08,4d))) ) == HX_("noreply",49,1d,9c,26))) {
+HXLINE( 169)						replyTo->clear();
             					}
             					else {
-HXLINE( 158)						if (::hx::IsNull( jid )) {
-HXLINE( 159)							::haxe::Log_obj::trace(HX_("No support for addressing to non-jid",ab,6a,51,09), ::Dynamic(::hx::Anon_obj::Create(5)
+HXLINE( 170)						if (::hx::IsNull( jid )) {
+HXLINE( 171)							::haxe::Log_obj::trace(HX_("No support for addressing to non-jid",ab,6a,51,09), ::Dynamic(::hx::Anon_obj::Create(5)
             								->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Message",5a,b7,a9,a7))
             								->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,address))
             								->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("fromStanza",ff,62,3b,49))
             								->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Message.hx",e5,8a,81,7a))
-            								->setFixed(4,HX_("lineNumber",dd,81,22,76),159)));
-HXLINE( 160)							::String _hx_tmp21 = msg->chatId();
-HXDLIN( 160)							::String _hx_tmp22 = msg->get_senderId();
-HXDLIN( 160)							return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp21,_hx_tmp22,msg->threadId,::borogove::MessageStanza_obj::UnknownMessageStanza(stanza),encryptionInfo);
+            								->setFixed(4,HX_("lineNumber",dd,81,22,76),171)));
+HXLINE( 172)							::String _hx_tmp20 = msg->chatId();
+HXDLIN( 172)							::String _hx_tmp21 = msg->get_senderId();
+HXDLIN( 172)							return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp20,_hx_tmp21,msg->threadId,::borogove::MessageStanza_obj::UnknownMessageStanza(stanza),encryptionInfo);
             						}
             						else {
-HXLINE( 161)							bool _hx_tmp23;
-HXDLIN( 161)							if ((( (::String)(::Reflect_obj::field(address->attr,HX_("type",ba,f2,08,4d))) ) != HX_("to",7b,65,00,00))) {
-HXLINE( 161)								_hx_tmp23 = (( (::String)(::Reflect_obj::field(address->attr,HX_("type",ba,f2,08,4d))) ) == HX_("cc",a0,56,00,00));
+HXLINE( 173)							bool _hx_tmp22;
+HXDLIN( 173)							if ((( (::String)(::Reflect_obj::field(address->attr,HX_("type",ba,f2,08,4d))) ) != HX_("to",7b,65,00,00))) {
+HXLINE( 173)								_hx_tmp22 = (( (::String)(::Reflect_obj::field(address->attr,HX_("type",ba,f2,08,4d))) ) == HX_("cc",a0,56,00,00));
             							}
             							else {
-HXLINE( 161)								_hx_tmp23 = true;
+HXLINE( 173)								_hx_tmp22 = true;
             							}
-HXDLIN( 161)							if (_hx_tmp23) {
-HXLINE( 162)								{
-HXLINE( 162)									::String k3 = ::borogove::JID_obj::parse(jid)->asBare()->asString();
-HXDLIN( 162)									recipients->set(k3,true);
+HXDLIN( 173)							if (_hx_tmp22) {
+HXLINE( 174)								{
+HXLINE( 174)									::String k3 = ::borogove::JID_obj::parse(jid)->asBare()->asString();
+HXDLIN( 174)									recipients->set(k3,true);
             								}
-HXLINE( 163)								if (!(anyExtendedReplyTo)) {
-HXLINE( 163)									::String k4 = ::borogove::JID_obj::parse(jid)->asString();
-HXDLIN( 163)									replyTo->set(k4,true);
+HXLINE( 175)								if (!(anyExtendedReplyTo)) {
+HXLINE( 175)									::String k4 = ::borogove::JID_obj::parse(jid)->asString();
+HXDLIN( 175)									replyTo->set(k4,true);
             								}
             							}
             							else {
-HXLINE( 164)								bool _hx_tmp24;
-HXDLIN( 164)								if ((( (::String)(::Reflect_obj::field(address->attr,HX_("type",ba,f2,08,4d))) ) != HX_("replyto",25,8d,3a,ab))) {
-HXLINE( 164)									_hx_tmp24 = (( (::String)(::Reflect_obj::field(address->attr,HX_("type",ba,f2,08,4d))) ) == HX_("replyroom",45,d4,81,d7));
+HXLINE( 176)								bool _hx_tmp23;
+HXDLIN( 176)								if ((( (::String)(::Reflect_obj::field(address->attr,HX_("type",ba,f2,08,4d))) ) != HX_("replyto",25,8d,3a,ab))) {
+HXLINE( 176)									_hx_tmp23 = (( (::String)(::Reflect_obj::field(address->attr,HX_("type",ba,f2,08,4d))) ) == HX_("replyroom",45,d4,81,d7));
             								}
             								else {
-HXLINE( 164)									_hx_tmp24 = true;
+HXLINE( 176)									_hx_tmp23 = true;
             								}
-HXDLIN( 164)								if (_hx_tmp24) {
-HXLINE( 165)									if (!(anyExtendedReplyTo)) {
-HXLINE( 166)										replyTo->clear();
-HXLINE( 167)										anyExtendedReplyTo = true;
+HXDLIN( 176)								if (_hx_tmp23) {
+HXLINE( 177)									if (!(anyExtendedReplyTo)) {
+HXLINE( 178)										replyTo->clear();
+HXLINE( 179)										anyExtendedReplyTo = true;
             									}
-HXLINE( 169)									{
-HXLINE( 169)										::String k5 = ::borogove::JID_obj::parse(jid)->asString();
-HXDLIN( 169)										replyTo->set(k5,true);
+HXLINE( 181)									{
+HXLINE( 181)										::String k5 = ::borogove::JID_obj::parse(jid)->asString();
+HXDLIN( 181)										replyTo->set(k5,true);
             									}
             								}
             								else {
-HXLINE( 170)									if ((( (::String)(::Reflect_obj::field(address->attr,HX_("type",ba,f2,08,4d))) ) == HX_("ofrom",59,09,3d,2d))) {
-HXLINE( 171)										 ::borogove::JID tmp7 = msg->from;
-HXDLIN( 171)										::String _hx_tmp25;
-HXDLIN( 171)										if (::hx::IsNotNull( tmp7 )) {
-HXLINE( 171)											_hx_tmp25 = tmp7->domain;
+HXLINE( 182)									if ((( (::String)(::Reflect_obj::field(address->attr,HX_("type",ba,f2,08,4d))) ) == HX_("ofrom",59,09,3d,2d))) {
+HXLINE( 183)										 ::borogove::JID tmp4 = msg->from;
+HXDLIN( 183)										::String _hx_tmp24;
+HXDLIN( 183)										if (::hx::IsNotNull( tmp4 )) {
+HXLINE( 183)											_hx_tmp24 = tmp4->domain;
             										}
             										else {
-HXLINE( 171)											_hx_tmp25 = null();
+HXLINE( 183)											_hx_tmp24 = null();
             										}
-HXDLIN( 171)										if ((::borogove::JID_obj::parse(jid)->domain == _hx_tmp25)) {
-HXLINE( 173)											msg->senderId = ::borogove::JID_obj::parse(jid)->asBare()->asString();
+HXDLIN( 183)										if ((::borogove::JID_obj::parse(jid)->domain == _hx_tmp24)) {
+HXLINE( 185)											msg->senderId = ::borogove::JID_obj::parse(jid)->asBare()->asString();
             										}
             									}
             								}
@@ -523,567 +506,719 @@ HXLINE( 173)											msg->senderId = ::borogove::JID_obj::parse(jid)->asBare()
             					}
             				}
             			}
-HXLINE( 179)			::Array< ::Dynamic> _g4 = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 179)			 ::Dynamic x =  ::Dynamic(new _hx_Closure_0(recipients))();
-HXDLIN( 179)			while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 179)				_g4->push(::borogove::JID_obj::parse(( (::String)(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) )));
-            			}
-HXDLIN( 179)			msg->recipients = _g4;
-HXLINE( 180)			msg->recipients->sort( ::Dynamic(new _hx_Closure_1()));
-HXLINE( 181)			::Array< ::Dynamic> _g5 = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 181)			 ::Dynamic x1 =  ::Dynamic(new _hx_Closure_2(replyTo))();
-HXDLIN( 181)			while(( (bool)(x1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 181)				_g5->push(::borogove::JID_obj::parse(( (::String)(x1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) )));
-            			}
-HXDLIN( 181)			msg->replyTo = _g5;
-HXLINE( 182)			msg->replyTo->sort( ::Dynamic(new _hx_Closure_3()));
-HXLINE( 184)			 ::borogove::JID msgFrom = msg->from;
-HXLINE( 186)			bool _hx_tmp26;
-HXDLIN( 186)			bool _hx_tmp27;
-HXDLIN( 186)			if ((msg->direction == 0)) {
-HXLINE( 186)				_hx_tmp27 = ::hx::IsNotNull( msgFrom );
+HXLINE( 191)			::Array< ::Dynamic> _g4 = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 191)			 ::Dynamic x =  ::Dynamic(new _hx_Closure_0(recipients))();
+HXDLIN( 191)			while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 191)				_g4->push(::borogove::JID_obj::parse(( (::String)(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) )));
+            			}
+HXDLIN( 191)			msg->recipients = _g4;
+HXLINE( 192)			msg->recipients->sort( ::Dynamic(new _hx_Closure_1()));
+HXLINE( 193)			::Array< ::Dynamic> _g5 = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 193)			 ::Dynamic x1 =  ::Dynamic(new _hx_Closure_2(replyTo))();
+HXDLIN( 193)			while(( (bool)(x1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 193)				_g5->push(::borogove::JID_obj::parse(( (::String)(x1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) )));
+            			}
+HXDLIN( 193)			msg->replyTo = _g5;
+HXLINE( 194)			msg->replyTo->sort( ::Dynamic(new _hx_Closure_3()));
+HXLINE( 196)			if (::hx::IsNull( msg->get_senderId() )) {
+HXLINE( 197)				 ::borogove::Stanza tmp5 = stanza->getChild(HX_("occupant-id",2b,a5,8b,91),HX_("urn:xmpp:occupant-id:0",05,d7,05,11));
+HXDLIN( 197)				 ::Dynamic tmp6;
+HXDLIN( 197)				if (::hx::IsNotNull( tmp5 )) {
+HXLINE( 197)					tmp6 = tmp5->attr;
+            				}
+            				else {
+HXLINE( 197)					tmp6 = null();
+            				}
+HXDLIN( 197)				::String occupantId;
+HXDLIN( 197)				if (::hx::IsNotNull( tmp6 )) {
+HXLINE( 197)					occupantId = ( (::String)(::Reflect_obj::field(tmp6,HX_("id",db,5b,00,00))) );
+            				}
+            				else {
+HXLINE( 197)					occupantId = null();
+            				}
+HXLINE( 198)				::String _hx_tmp25;
+HXDLIN( 198)				if (::hx::IsNotNull( occupantId )) {
+HXLINE( 198)					_hx_tmp25 = ((msg->chatId() + HX_("/",2f,00,00,00)) + occupantId);
+            				}
+            				else {
+HXLINE( 198)					 ::borogove::JID tmp7;
+HXDLIN( 198)					bool tmp8;
+HXDLIN( 198)					if ((msg->type != 2)) {
+HXLINE( 198)						tmp8 = (msg->type == 3);
+            					}
+            					else {
+HXLINE( 198)						tmp8 = true;
+            					}
+HXDLIN( 198)					if (tmp8) {
+HXLINE( 198)						tmp7 = msg->from;
+            					}
+            					else {
+HXLINE( 198)						 ::borogove::JID tmp9 = msg->from;
+HXDLIN( 198)						if (::hx::IsNotNull( tmp9 )) {
+HXLINE( 198)							tmp7 = tmp9->asBare();
+            						}
+            						else {
+HXLINE( 198)							tmp7 = null();
+            						}
+            					}
+HXDLIN( 198)					if (::hx::IsNotNull( tmp7 )) {
+HXLINE( 198)						_hx_tmp25 = tmp7->asString();
+            					}
+            					else {
+HXLINE( 198)						_hx_tmp25 = null();
+            					}
+            				}
+HXDLIN( 198)				msg->senderId = _hx_tmp25;
+            			}
+HXLINE( 201)			 ::borogove::JID msgFrom = msg->from;
+HXLINE( 203)			bool _hx_tmp26;
+HXDLIN( 203)			bool _hx_tmp27;
+HXDLIN( 203)			if ((msg->direction == 0)) {
+HXLINE( 203)				_hx_tmp27 = ::hx::IsNotNull( msgFrom );
             			}
             			else {
-HXLINE( 186)				_hx_tmp27 = false;
+HXLINE( 203)				_hx_tmp27 = false;
             			}
-HXDLIN( 186)			if (_hx_tmp27) {
+HXDLIN( 203)			if (_hx_tmp27) {
             				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_4, ::borogove::JID,msgFrom) HXARGC(1)
             				bool _hx_run( ::borogove::JID r){
-            					HX_GC_STACKFRAME(&_hx_pos_5c42425238de6f01_186_fromStanza)
-HXLINE( 186)					 ::borogove::JID f = r->asBare();
-HXDLIN( 186)					return f->equals(msgFrom->asBare());
+            					HX_GC_STACKFRAME(&_hx_pos_5c42425238de6f01_203_fromStanza)
+HXLINE( 203)					 ::borogove::JID f = r->asBare();
+HXDLIN( 203)					return f->equals(msgFrom->asBare());
             				}
             				HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 186)				::Array< ::Dynamic> it = msg->replyTo;
-HXDLIN( 186)				 ::Dynamic f =  ::Dynamic(new _hx_Closure_4(msgFrom));
-HXDLIN( 186)				 ::borogove::JID result = null();
-HXDLIN( 186)				{
-HXLINE( 186)					int _g6 = 0;
-HXDLIN( 186)					while((_g6 < it->length)){
-HXLINE( 186)						 ::borogove::JID v = it->__get(_g6).StaticCast<  ::borogove::JID >();
-HXDLIN( 186)						_g6 = (_g6 + 1);
-HXDLIN( 186)						if (( (bool)(f(v)) )) {
-HXLINE(  71)							result = v;
-HXLINE( 186)							goto _hx_goto_6;
+HXLINE( 203)				::Array< ::Dynamic> it = msg->replyTo;
+HXDLIN( 203)				 ::Dynamic f =  ::Dynamic(new _hx_Closure_4(msgFrom));
+HXDLIN( 203)				 ::borogove::JID result = null();
+HXDLIN( 203)				{
+HXLINE( 203)					int _g6 = 0;
+HXDLIN( 203)					while((_g6 < it->length)){
+HXLINE( 203)						 ::borogove::JID v = it->__get(_g6).StaticCast<  ::borogove::JID >();
+HXDLIN( 203)						_g6 = (_g6 + 1);
+HXDLIN( 203)						if (( (bool)(f(v)) )) {
+HXLINE(  96)							result = v;
+HXLINE( 203)							goto _hx_goto_6;
             						}
             					}
             					_hx_goto_6:;
             				}
-HXDLIN( 186)				_hx_tmp26 = ::hx::IsNull( result );
+HXDLIN( 203)				_hx_tmp26 = ::hx::IsNull( result );
             			}
             			else {
-HXLINE( 186)				_hx_tmp26 = false;
+HXLINE( 203)				_hx_tmp26 = false;
             			}
-HXDLIN( 186)			if (_hx_tmp26) {
-HXLINE( 187)				::haxe::Log_obj::trace(HX_("Don't know what chat message without from in replyTo belongs in",f3,47,ba,0d), ::Dynamic(::hx::Anon_obj::Create(5)
+HXDLIN( 203)			if (_hx_tmp26) {
+HXLINE( 204)				::haxe::Log_obj::trace(HX_("Don't know what chat message without from in replyTo belongs in",f3,47,ba,0d), ::Dynamic(::hx::Anon_obj::Create(5)
             					->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.Message",5a,b7,a9,a7))
             					->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,stanza))
             					->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("fromStanza",ff,62,3b,49))
             					->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/Message.hx",e5,8a,81,7a))
-            					->setFixed(4,HX_("lineNumber",dd,81,22,76),187)));
-HXLINE( 188)				::String _hx_tmp28 = msg->chatId();
-HXDLIN( 188)				::String _hx_tmp29 = msg->get_senderId();
-HXDLIN( 188)				return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp28,_hx_tmp29,msg->threadId,::borogove::MessageStanza_obj::UnknownMessageStanza(stanza),encryptionInfo);
+            					->setFixed(4,HX_("lineNumber",dd,81,22,76),204)));
+HXLINE( 205)				::String _hx_tmp28 = msg->chatId();
+HXDLIN( 205)				::String _hx_tmp29 = msg->get_senderId();
+HXDLIN( 205)				return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp28,_hx_tmp29,msg->threadId,::borogove::MessageStanza_obj::UnknownMessageStanza(stanza),encryptionInfo);
             			}
-HXLINE( 191)			if (::hx::IsNotNull( addContext )) {
-HXLINE( 191)				msg = ( ( ::borogove::ChatMessageBuilder)(addContext(msg,stanza)) );
+HXLINE( 208)			if (::hx::IsNotNull( addContext )) {
+HXLINE( 208)				msg = ( ( ::borogove::ChatMessageBuilder)(addContext(msg,stanza)) );
             			}
-HXLINE( 192)			::String timestamp;
-HXDLIN( 192)			::String tmp8 = msg->timestamp;
-HXDLIN( 192)			if (::hx::IsNotNull( tmp8 )) {
-HXLINE( 192)				timestamp = tmp8;
+HXLINE( 209)			::String timestamp;
+HXDLIN( 209)			::String tmp10 = msg->timestamp;
+HXDLIN( 209)			if (::hx::IsNotNull( tmp10 )) {
+HXLINE( 209)				timestamp = tmp10;
             			}
             			else {
-HXLINE( 192)				timestamp = ::borogove::Date_obj::format(::Date_obj::now());
-            			}
-HXLINE( 193)			msg->timestamp = timestamp;
-HXLINE( 195)			 ::borogove::Stanza reactionsEl = stanza->getChild(HX_("reactions",aa,cc,95,e7),HX_("urn:xmpp:reactions:0",44,fb,42,53));
-HXLINE( 196)			if (::hx::IsNotNull( reactionsEl )) {
-HXLINE( 198)				::Array< ::Dynamic> _this = reactionsEl->allTags(HX_("reaction",a9,e7,b4,f6),null());
-HXDLIN( 198)				::Array< ::String > result1 = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN( 198)				{
-HXLINE( 198)					int _g7 = 0;
-HXDLIN( 198)					int _g8 = _this->length;
-HXDLIN( 198)					while((_g7 < _g8)){
-HXLINE( 198)						_g7 = (_g7 + 1);
-HXDLIN( 198)						int i = (_g7 - 1);
-HXDLIN( 198)						{
-HXLINE( 198)							::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
-HXDLIN( 198)							result1->__unsafe_set(i,inValue);
+HXLINE( 209)				timestamp = ::borogove::Date_obj::format(::Date_obj::now());
+            			}
+HXLINE( 210)			msg->timestamp = timestamp;
+HXLINE( 212)			 ::borogove::Stanza reactionsEl = stanza->getChild(HX_("reactions",aa,cc,95,e7),HX_("urn:xmpp:reactions:0",44,fb,42,53));
+HXLINE( 213)			if (::hx::IsNotNull( reactionsEl )) {
+HXLINE( 215)				::Array< ::Dynamic> _this = reactionsEl->allTags(HX_("reaction",a9,e7,b4,f6),null());
+HXDLIN( 215)				::Array< ::String > result1 = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN( 215)				{
+HXLINE( 215)					int _g7 = 0;
+HXDLIN( 215)					int _g8 = _this->length;
+HXDLIN( 215)					while((_g7 < _g8)){
+HXLINE( 215)						_g7 = (_g7 + 1);
+HXDLIN( 215)						int i = (_g7 - 1);
+HXDLIN( 215)						{
+HXLINE( 215)							::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
+HXDLIN( 215)							result1->__unsafe_set(i,inValue);
             						}
             					}
             				}
-HXLINE( 199)				::String reactionId = ( (::String)(::Reflect_obj::field(reactionsEl->attr,HX_("id",db,5b,00,00))) );
-HXLINE( 200)				if (::hx::IsNotNull( reactionId )) {
-HXLINE( 201)					::String _hx_tmp30 = msg->chatId();
-HXDLIN( 201)					::String _hx_tmp31 = msg->get_senderId();
-HXDLIN( 201)					::String msg5 = msg->threadId;
-HXLINE( 202)					::String _hx_tmp32;
-HXDLIN( 202)					::String tmp9 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("id",db,5b,00,00))) );
-HXDLIN( 202)					if (::hx::IsNotNull( tmp9 )) {
-HXLINE( 202)						_hx_tmp32 = tmp9;
+HXLINE( 216)				::String reactionId = ( (::String)(::Reflect_obj::field(reactionsEl->attr,HX_("id",db,5b,00,00))) );
+HXLINE( 217)				if (::hx::IsNotNull( reactionId )) {
+HXLINE( 218)					::String _hx_tmp30 = msg->chatId();
+HXDLIN( 218)					::String _hx_tmp31 = msg->get_senderId();
+HXDLIN( 218)					::String msg5 = msg->threadId;
+HXLINE( 219)					::String _hx_tmp32;
+HXDLIN( 219)					::String tmp11 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("id",db,5b,00,00))) );
+HXDLIN( 219)					if (::hx::IsNotNull( tmp11 )) {
+HXLINE( 219)						_hx_tmp32 = tmp11;
             					}
             					else {
-HXLINE( 202)						_hx_tmp32 = ::borogove::ID_obj::_hx_long();
+HXLINE( 219)						_hx_tmp32 = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
             					}
-HXLINE( 203)					::String _hx_tmp33;
-HXDLIN( 203)					if (isGroupchat) {
-HXLINE( 203)						_hx_tmp33 = reactionId;
+HXLINE( 220)					::String _hx_tmp33;
+HXDLIN( 220)					if (isGroupchat) {
+HXLINE( 220)						_hx_tmp33 = reactionId;
             					}
             					else {
-HXLINE( 203)						_hx_tmp33 = null();
+HXLINE( 220)						_hx_tmp33 = null();
             					}
-HXLINE( 204)					::String _hx_tmp34;
-HXDLIN( 204)					if (isGroupchat) {
-HXLINE( 204)						_hx_tmp34 = msg->chatId();
+HXLINE( 221)					::String _hx_tmp34;
+HXDLIN( 221)					if (isGroupchat) {
+HXLINE( 221)						_hx_tmp34 = msg->chatId();
             					}
             					else {
-HXLINE( 204)						_hx_tmp34 = null();
+HXLINE( 221)						_hx_tmp34 = null();
             					}
-HXLINE( 205)					::String _hx_tmp35;
-HXDLIN( 205)					if (isGroupchat) {
-HXLINE( 205)						_hx_tmp35 = null();
+HXLINE( 222)					::String _hx_tmp35;
+HXDLIN( 222)					if (isGroupchat) {
+HXLINE( 222)						_hx_tmp35 = null();
             					}
             					else {
-HXLINE( 205)						_hx_tmp35 = reactionId;
+HXLINE( 222)						_hx_tmp35 = reactionId;
+            					}
+HXLINE( 223)					::String _hx_tmp36 = msg->chatId();
+HXLINE( 224)					::String tmp12 = msg->get_senderId();
+HXDLIN( 224)					if (::hx::IsNull( tmp12 )) {
+HXLINE( 224)						HX_STACK_DO_THROW(HX_("no sender",b4,39,ce,0e));
             					}
-HXLINE( 206)					::String _hx_tmp36 = msg->chatId();
-HXLINE( 207)					::String _hx_tmp37 = msg->get_senderId();
-HXLINE( 209)					::Array< ::Dynamic> result2 = ::Array_obj< ::Dynamic>::__new(result1->length);
-HXDLIN( 209)					{
-HXLINE( 209)						int _g9 = 0;
-HXDLIN( 209)						int _g10 = result1->length;
-HXDLIN( 209)						while((_g9 < _g10)){
-HXLINE( 209)							_g9 = (_g9 + 1);
-HXDLIN( 209)							int i1 = (_g9 - 1);
-HXDLIN( 209)							{
-HXLINE( 209)								::String text = ( (::String)(_hx_array_unsafe_get(result1,i1)) );
-HXDLIN( 209)								 ::borogove::Reaction inValue1 =  ::borogove::Reaction_obj::__alloc( HX_CTX ,msg->get_senderId(),timestamp,text,msg->localId,null());
-HXDLIN( 209)								result2->__unsafe_set(i1,inValue1);
+HXLINE( 226)					::Array< ::Dynamic> result2 = ::Array_obj< ::Dynamic>::__new(result1->length);
+HXDLIN( 226)					{
+HXLINE( 226)						int _g9 = 0;
+HXDLIN( 226)						int _g10 = result1->length;
+HXDLIN( 226)						while((_g9 < _g10)){
+HXLINE( 226)							_g9 = (_g9 + 1);
+HXDLIN( 226)							int i1 = (_g9 - 1);
+HXDLIN( 226)							{
+HXLINE( 226)								::String text = ( (::String)(_hx_array_unsafe_get(result1,i1)) );
+HXDLIN( 226)								::String tmp13 = msg->get_senderId();
+HXDLIN( 226)								if (::hx::IsNull( tmp13 )) {
+HXLINE( 226)									HX_STACK_DO_THROW(HX_("no sender",b4,39,ce,0e));
+            								}
+HXDLIN( 226)								 ::borogove::Reaction inValue1 =  ::borogove::Reaction_obj::__alloc( HX_CTX ,tmp13,timestamp,text,msg->localId,null());
+HXDLIN( 226)								result2->__unsafe_set(i1,inValue1);
             							}
             						}
             					}
-HXLINE( 201)					return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp30,_hx_tmp31,msg5,::borogove::MessageStanza_obj::ReactionUpdateStanza( ::borogove::ReactionUpdate_obj::__alloc( HX_CTX ,_hx_tmp32,_hx_tmp33,_hx_tmp34,_hx_tmp35,_hx_tmp36,_hx_tmp37,timestamp,result2,0)),encryptionInfo);
+HXLINE( 218)					return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp30,_hx_tmp31,msg5,::borogove::MessageStanza_obj::ReactionUpdateStanza( ::borogove::ReactionUpdate_obj::__alloc( HX_CTX ,_hx_tmp32,_hx_tmp33,_hx_tmp34,_hx_tmp35,_hx_tmp36,tmp12,timestamp,result2,0)),encryptionInfo);
             				}
             			}
-HXLINE( 215)			{
-HXLINE( 215)				int _g11 = 0;
-HXDLIN( 215)				::Array< ::Dynamic> _g12 = stanza->allTags(HX_("reference",cb,07,c5,5a),HX_("urn:xmpp:reference:0",a5,00,10,5d));
-HXDLIN( 215)				while((_g11 < _g12->length)){
-HXLINE( 215)					 ::borogove::Stanza ref = _g12->__get(_g11).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 215)					_g11 = (_g11 + 1);
-HXLINE( 216)					bool _hx_tmp38;
-HXDLIN( 216)					if (::hx::IsNull( ( (::String)(::Reflect_obj::field(ref->attr,HX_("begin",29,ea,55,b0))) ) )) {
-HXLINE( 216)						_hx_tmp38 = ::hx::IsNull( ( (::String)(::Reflect_obj::field(ref->attr,HX_("end",db,03,4d,00))) ) );
+HXLINE( 232)			{
+HXLINE( 232)				int _g11 = 0;
+HXDLIN( 232)				::Array< ::Dynamic> _g12 = stanza->allTags(HX_("reference",cb,07,c5,5a),HX_("urn:xmpp:reference:0",a5,00,10,5d));
+HXDLIN( 232)				while((_g11 < _g12->length)){
+HXLINE( 232)					 ::borogove::Stanza ref = _g12->__get(_g11).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 232)					_g11 = (_g11 + 1);
+HXLINE( 233)					bool _hx_tmp37;
+HXDLIN( 233)					if (::hx::IsNull( ( (::String)(::Reflect_obj::field(ref->attr,HX_("begin",29,ea,55,b0))) ) )) {
+HXLINE( 233)						_hx_tmp37 = ::hx::IsNull( ( (::String)(::Reflect_obj::field(ref->attr,HX_("end",db,03,4d,00))) ) );
             					}
             					else {
-HXLINE( 216)						_hx_tmp38 = false;
+HXLINE( 233)						_hx_tmp37 = false;
             					}
-HXDLIN( 216)					if (_hx_tmp38) {
-HXLINE( 217)						 ::borogove::Stanza sims = ref->getChild(HX_("media-sharing",33,1c,0a,3d),HX_("urn:xmpp:sims:1",4f,1c,49,62));
-HXLINE( 218)						if (::hx::IsNotNull( sims )) {
-HXLINE( 218)							msg->attachSims(sims);
+HXDLIN( 233)					if (_hx_tmp37) {
+HXLINE( 234)						 ::borogove::Stanza sims = ref->getChild(HX_("media-sharing",33,1c,0a,3d),HX_("urn:xmpp:sims:1",4f,1c,49,62));
+HXLINE( 235)						if (::hx::IsNotNull( sims )) {
+HXLINE( 235)							msg->attachSims(sims);
             						}
             					}
             				}
             			}
-HXLINE( 222)			{
-HXLINE( 222)				int _g13 = 0;
-HXDLIN( 222)				::Array< ::Dynamic> _g14 = stanza->allTags(HX_("media-sharing",33,1c,0a,3d),HX_("urn:xmpp:sims:1",4f,1c,49,62));
-HXDLIN( 222)				while((_g13 < _g14->length)){
-HXLINE( 222)					 ::borogove::Stanza sims1 = _g14->__get(_g13).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 222)					_g13 = (_g13 + 1);
-HXLINE( 223)					msg->attachSims(sims1);
+HXLINE( 239)			{
+HXLINE( 239)				int _g13 = 0;
+HXDLIN( 239)				::Array< ::Dynamic> _g14 = stanza->allTags(HX_("media-sharing",33,1c,0a,3d),HX_("urn:xmpp:sims:1",4f,1c,49,62));
+HXDLIN( 239)				while((_g13 < _g14->length)){
+HXLINE( 239)					 ::borogove::Stanza sims1 = _g14->__get(_g13).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 239)					_g13 = (_g13 + 1);
+HXLINE( 240)					msg->attachSims(sims1);
             				}
             			}
-HXLINE( 226)			 ::borogove::Stanza jmi = stanza->getChild(null(),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
-HXLINE( 227)			bool _hx_tmp39;
-HXDLIN( 227)			if (::hx::IsNotNull( jmi )) {
-HXLINE( 227)				_hx_tmp39 = (jmi->name != HX_("accept",08,93,06,0b));
+HXLINE( 243)			 ::borogove::Stanza jmi = stanza->getChild(null(),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
+HXLINE( 244)			bool _hx_tmp38;
+HXDLIN( 244)			if (::hx::IsNotNull( jmi )) {
+HXLINE( 244)				_hx_tmp38 = (jmi->name != HX_("accept",08,93,06,0b));
             			}
             			else {
-HXLINE( 227)				_hx_tmp39 = false;
+HXLINE( 244)				_hx_tmp38 = false;
             			}
-HXDLIN( 227)			if (_hx_tmp39) {
-HXLINE( 228)				msg->type = 1;
-HXLINE( 229)				msg->payloads->push(jmi);
-HXLINE( 230)				if (::hx::IsNull( msg->text )) {
-HXLINE( 230)					msg->text = (HX_("call ",c2,71,1b,41) + jmi->name);
+HXDLIN( 244)			if (_hx_tmp38) {
+HXLINE( 245)				msg->type = 1;
+HXLINE( 246)				msg->payloads->push(jmi);
+HXLINE( 247)				if (::hx::IsNull( msg->text )) {
+HXLINE( 247)					msg->text = (HX_("call ",c2,71,1b,41) + jmi->name);
             				}
-HXLINE( 231)				if ((jmi->name != HX_("propose",fe,fe,e9,f9))) {
-HXLINE( 232)					msg->versions = ::Array_obj< ::Dynamic>::__new(1)->init(0,msg->build());
+HXLINE( 248)				if ((jmi->name != HX_("propose",fe,fe,e9,f9))) {
+HXLINE( 249)					msg->versions = ::Array_obj< ::Dynamic>::__new(1)->init(0,msg->build());
             				}
-HXLINE( 235)				msg->localId = ( (::String)(::Reflect_obj::field(jmi->attr,HX_("id",db,5b,00,00))) );
+HXLINE( 252)				msg->localId = ( (::String)(::Reflect_obj::field(jmi->attr,HX_("id",db,5b,00,00))) );
             			}
-HXLINE( 238)			 ::borogove::Stanza retract = stanza->getChild(HX_("replace",34,48,28,ab),HX_("urn:xmpp:message-retract:1",16,5e,d8,d5));
-HXLINE( 239)			 ::borogove::Stanza fasten = stanza->getChild(HX_("apply-to",3a,9e,dd,24),HX_("urn:xmpp:fasten:0",17,f4,ed,3d));
-HXLINE( 240)			 ::borogove::Stanza moderated;
-HXDLIN( 240)			 ::borogove::Stanza tmp10;
-HXDLIN( 240)			if (::hx::IsNotNull( retract )) {
-HXLINE( 240)				tmp10 = retract->getChild(HX_("moderated",41,37,3b,22),HX_("urn:xmpp:message-retract:1",16,5e,d8,d5));
+HXLINE( 255)			 ::borogove::Stanza retract = stanza->getChild(HX_("retract",01,e2,b9,fc),HX_("urn:xmpp:message-retract:1",16,5e,d8,d5));
+HXLINE( 256)			 ::borogove::Stanza fasten = stanza->getChild(HX_("apply-to",3a,9e,dd,24),HX_("urn:xmpp:fasten:0",17,f4,ed,3d));
+HXLINE( 257)			 ::borogove::Stanza moderated;
+HXDLIN( 257)			 ::borogove::Stanza tmp14;
+HXDLIN( 257)			if (::hx::IsNotNull( retract )) {
+HXLINE( 257)				tmp14 = retract->getChild(HX_("moderated",41,37,3b,22),HX_("urn:xmpp:message-retract:1",16,5e,d8,d5));
             			}
             			else {
-HXLINE( 240)				tmp10 = null();
+HXLINE( 257)				tmp14 = null();
             			}
-HXDLIN( 240)			if (::hx::IsNotNull( tmp10 )) {
-HXLINE( 240)				moderated = tmp10;
+HXDLIN( 257)			if (::hx::IsNotNull( tmp14 )) {
+HXLINE( 257)				moderated = tmp14;
             			}
             			else {
-HXLINE( 240)				if (::hx::IsNotNull( fasten )) {
-HXLINE( 240)					moderated = fasten->getChild(HX_("moderated",41,37,3b,22),HX_("urn:xmpp:message-moderate:0",5b,30,1a,b9));
+HXLINE( 257)				if (::hx::IsNotNull( fasten )) {
+HXLINE( 257)					moderated = fasten->getChild(HX_("moderated",41,37,3b,22),HX_("urn:xmpp:message-moderate:0",5b,30,1a,b9));
             				}
             				else {
-HXLINE( 240)					moderated = null();
+HXLINE( 257)					moderated = null();
             				}
             			}
-HXLINE( 241)			::String moderateServerId;
-HXDLIN( 241)			 ::Dynamic tmp11;
-HXDLIN( 241)			if (::hx::IsNotNull( retract )) {
-HXLINE( 241)				tmp11 = retract->attr;
+HXLINE( 258)			::String moderateServerId;
+HXDLIN( 258)			 ::Dynamic tmp15;
+HXDLIN( 258)			if (::hx::IsNotNull( retract )) {
+HXLINE( 258)				tmp15 = retract->attr;
             			}
             			else {
-HXLINE( 241)				tmp11 = null();
+HXLINE( 258)				tmp15 = null();
             			}
-HXDLIN( 241)			::String tmp12;
-HXDLIN( 241)			if (::hx::IsNotNull( tmp11 )) {
-HXLINE( 241)				tmp12 = ( (::String)(::Reflect_obj::field(tmp11,HX_("id",db,5b,00,00))) );
+HXDLIN( 258)			::String tmp16;
+HXDLIN( 258)			if (::hx::IsNotNull( tmp15 )) {
+HXLINE( 258)				tmp16 = ( (::String)(::Reflect_obj::field(tmp15,HX_("id",db,5b,00,00))) );
             			}
             			else {
-HXLINE( 241)				tmp12 = null();
+HXLINE( 258)				tmp16 = null();
             			}
-HXDLIN( 241)			if (::hx::IsNotNull( tmp12 )) {
-HXLINE( 241)				moderateServerId = tmp12;
+HXDLIN( 258)			if (::hx::IsNotNull( tmp16 )) {
+HXLINE( 258)				moderateServerId = tmp16;
             			}
             			else {
-HXLINE( 241)				 ::Dynamic tmp13;
-HXDLIN( 241)				if (::hx::IsNotNull( fasten )) {
-HXLINE( 241)					tmp13 = fasten->attr;
+HXLINE( 258)				 ::Dynamic tmp17;
+HXDLIN( 258)				if (::hx::IsNotNull( fasten )) {
+HXLINE( 258)					tmp17 = fasten->attr;
             				}
             				else {
-HXLINE( 241)					tmp13 = null();
+HXLINE( 258)					tmp17 = null();
             				}
-HXDLIN( 241)				if (::hx::IsNotNull( tmp13 )) {
-HXLINE( 241)					moderateServerId = ( (::String)(::Reflect_obj::field(tmp13,HX_("id",db,5b,00,00))) );
+HXDLIN( 258)				if (::hx::IsNotNull( tmp17 )) {
+HXLINE( 258)					moderateServerId = ( (::String)(::Reflect_obj::field(tmp17,HX_("id",db,5b,00,00))) );
             				}
             				else {
-HXLINE( 241)					moderateServerId = null();
+HXLINE( 258)					moderateServerId = null();
             				}
             			}
-HXLINE( 242)			bool _hx_tmp40;
-HXDLIN( 242)			bool _hx_tmp41;
-HXDLIN( 242)			bool _hx_tmp42;
-HXDLIN( 242)			bool _hx_tmp43;
-HXDLIN( 242)			bool _hx_tmp44;
-HXDLIN( 242)			if (::hx::IsNotNull( moderated )) {
-HXLINE( 242)				_hx_tmp44 = ::hx::IsNotNull( moderateServerId );
+HXLINE( 259)			bool _hx_tmp39;
+HXDLIN( 259)			bool _hx_tmp40;
+HXDLIN( 259)			bool _hx_tmp41;
+HXDLIN( 259)			bool _hx_tmp42;
+HXDLIN( 259)			bool _hx_tmp43;
+HXDLIN( 259)			if (::hx::IsNotNull( moderated )) {
+HXLINE( 259)				_hx_tmp43 = ::hx::IsNotNull( moderateServerId );
             			}
             			else {
-HXLINE( 242)				_hx_tmp44 = false;
+HXLINE( 259)				_hx_tmp43 = false;
             			}
-HXDLIN( 242)			if (_hx_tmp44) {
-HXLINE( 242)				_hx_tmp43 = isGroupchat;
+HXDLIN( 259)			if (_hx_tmp43) {
+HXLINE( 259)				_hx_tmp42 = isGroupchat;
             			}
             			else {
-HXLINE( 242)				_hx_tmp43 = false;
+HXLINE( 259)				_hx_tmp42 = false;
             			}
-HXDLIN( 242)			if (_hx_tmp43) {
-HXLINE( 242)				_hx_tmp42 = ::hx::IsNotNull( msg->from );
+HXDLIN( 259)			if (_hx_tmp42) {
+HXLINE( 259)				_hx_tmp41 = ::hx::IsNotNull( msg->from );
             			}
             			else {
-HXLINE( 242)				_hx_tmp42 = false;
+HXLINE( 259)				_hx_tmp41 = false;
             			}
-HXDLIN( 242)			if (_hx_tmp42) {
-HXLINE( 242)				_hx_tmp41 = msg->from->isBare();
+HXDLIN( 259)			if (_hx_tmp41) {
+HXLINE( 259)				_hx_tmp40 = msg->from->isBare();
             			}
             			else {
-HXLINE( 242)				_hx_tmp41 = false;
+HXLINE( 259)				_hx_tmp40 = false;
             			}
-HXDLIN( 242)			if (_hx_tmp41) {
-HXLINE( 242)				::String _hx_tmp45 = msg->from->asString();
-HXDLIN( 242)				_hx_tmp40 = (_hx_tmp45 == msg->chatId());
+HXDLIN( 259)			if (_hx_tmp40) {
+HXLINE( 259)				::String _hx_tmp44 = msg->from->asString();
+HXDLIN( 259)				_hx_tmp39 = (_hx_tmp44 == msg->chatId());
             			}
             			else {
-HXLINE( 242)				_hx_tmp40 = false;
+HXLINE( 259)				_hx_tmp39 = false;
             			}
-HXDLIN( 242)			if (_hx_tmp40) {
-HXLINE( 243)				::String reason1;
-HXDLIN( 243)				::String tmp14;
-HXDLIN( 243)				if (::hx::IsNotNull( retract )) {
-HXLINE( 243)					tmp14 = retract->getChildText(HX_("reason",c4,0f,9d,fc),null());
+HXDLIN( 259)			if (_hx_tmp39) {
+HXLINE( 260)				::String reason1;
+HXDLIN( 260)				::String tmp18;
+HXDLIN( 260)				if (::hx::IsNotNull( retract )) {
+HXLINE( 260)					tmp18 = retract->getChildText(HX_("reason",c4,0f,9d,fc),null());
             				}
             				else {
-HXLINE( 243)					tmp14 = null();
+HXLINE( 260)					tmp18 = null();
             				}
-HXDLIN( 243)				if (::hx::IsNotNull( tmp14 )) {
-HXLINE( 243)					reason1 = tmp14;
+HXDLIN( 260)				if (::hx::IsNotNull( tmp18 )) {
+HXLINE( 260)					reason1 = tmp18;
             				}
             				else {
-HXLINE( 243)					if (::hx::IsNotNull( moderated )) {
-HXLINE( 243)						reason1 = moderated->getChildText(HX_("reason",c4,0f,9d,fc),null());
+HXLINE( 260)					if (::hx::IsNotNull( moderated )) {
+HXLINE( 260)						reason1 = moderated->getChildText(HX_("reason",c4,0f,9d,fc),null());
             					}
             					else {
-HXLINE( 243)						reason1 = null();
+HXLINE( 260)						reason1 = null();
             					}
             				}
-HXLINE( 244)				::String by = ( (::String)(::Reflect_obj::field(moderated->attr,HX_("by",d7,55,00,00))) );
-HXLINE( 247)				::String _hx_tmp46 = msg->chatId();
-HXLINE( 248)				::String _hx_tmp47 = msg->get_senderId();
-HXLINE( 249)				::String msg6 = msg->threadId;
-HXLINE( 246)				return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp46,_hx_tmp47,msg6,::borogove::MessageStanza_obj::ModerateMessageStanza( ::borogove::ModerationAction_obj::__alloc( HX_CTX ,msg->chatId(),moderateServerId,timestamp,by,reason1)),encryptionInfo);
+HXLINE( 261)				::String by = ( (::String)(::Reflect_obj::field(moderated->attr,HX_("by",d7,55,00,00))) );
+HXLINE( 264)				::String _hx_tmp45 = msg->chatId();
+HXLINE( 265)				::String _hx_tmp46 = msg->get_senderId();
+HXLINE( 266)				::String msg6 = msg->threadId;
+HXLINE( 263)				return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp45,_hx_tmp46,msg6,::borogove::MessageStanza_obj::ModerateMessageStanza( ::borogove::ModerationAction_obj::__alloc( HX_CTX ,msg->chatId(),moderateServerId,timestamp,by,reason1)),encryptionInfo);
+            			}
+HXLINE( 272)			 ::borogove::Stanza retracted = stanza->getChild(HX_("retracted",a0,7c,77,08),HX_("urn:xmpp:message-retract:1",16,5e,d8,d5));
+HXLINE( 273)			if (::hx::IsNotNull( retracted )) {
+HXLINE( 275)				msg->payloads->push(retracted);
             			}
-HXLINE( 255)			 ::borogove::Stanza replace = stanza->getChild(HX_("replace",34,48,28,ab),HX_("urn:xmpp:message-correct:0",be,10,1b,b0));
-HXLINE( 256)			 ::Dynamic tmp15;
-HXDLIN( 256)			if (::hx::IsNotNull( replace )) {
-HXLINE( 256)				tmp15 = replace->attr;
+HXLINE( 278)			 ::borogove::Stanza replace = stanza->getChild(HX_("replace",34,48,28,ab),HX_("urn:xmpp:message-correct:0",be,10,1b,b0));
+HXLINE( 279)			 ::Dynamic tmp19;
+HXDLIN( 279)			if (::hx::IsNotNull( replace )) {
+HXLINE( 279)				tmp19 = replace->attr;
             			}
             			else {
-HXLINE( 256)				tmp15 = null();
+HXLINE( 279)				tmp19 = null();
             			}
-HXDLIN( 256)			::String replaceId;
-HXDLIN( 256)			if (::hx::IsNotNull( tmp15 )) {
-HXLINE( 256)				replaceId = ( (::String)(::Reflect_obj::field(tmp15,HX_("id",db,5b,00,00))) );
+HXDLIN( 279)			::String replaceId;
+HXDLIN( 279)			if (::hx::IsNotNull( tmp19 )) {
+HXLINE( 279)				replaceId = ( (::String)(::Reflect_obj::field(tmp19,HX_("id",db,5b,00,00))) );
             			}
             			else {
-HXLINE( 256)				replaceId = null();
+HXLINE( 279)				replaceId = null();
             			}
-HXLINE( 258)			bool _hx_tmp48;
-HXDLIN( 258)			bool _hx_tmp49;
-HXDLIN( 258)			if (::hx::IsNull( msg->text )) {
-HXLINE( 258)				_hx_tmp49 = (msg->attachments->length < 1);
+HXLINE( 281)			bool _hx_tmp47;
+HXDLIN( 281)			bool _hx_tmp48;
+HXDLIN( 281)			bool _hx_tmp49;
+HXDLIN( 281)			bool _hx_tmp50;
+HXDLIN( 281)			if (!(preferChatMessage)) {
+HXLINE( 281)				_hx_tmp50 = ::hx::IsNull( msg->text );
             			}
             			else {
-HXLINE( 258)				_hx_tmp49 = false;
+HXLINE( 281)				_hx_tmp50 = false;
             			}
-HXDLIN( 258)			if (_hx_tmp49) {
-HXLINE( 258)				_hx_tmp48 = ::hx::IsNull( replaceId );
+HXDLIN( 281)			if (_hx_tmp50) {
+HXLINE( 281)				_hx_tmp49 = (msg->attachments->length < 1);
             			}
             			else {
-HXLINE( 258)				_hx_tmp48 = false;
-            			}
-HXDLIN( 258)			if (_hx_tmp48) {
-HXLINE( 258)				::String _hx_tmp50 = msg->chatId();
-HXDLIN( 258)				::String _hx_tmp51 = msg->get_senderId();
-HXDLIN( 258)				return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp50,_hx_tmp51,msg->threadId,::borogove::MessageStanza_obj::UnknownMessageStanza(stanza),encryptionInfo);
-            			}
-HXLINE( 260)			{
-HXLINE( 260)				int _g15 = 0;
-HXDLIN( 260)				::Array< ::Dynamic> _g16 = stanza->allTags(HX_("fallback",22,f0,9d,2a),HX_("urn:xmpp:fallback:0",74,aa,56,9b));
-HXDLIN( 260)				while((_g15 < _g16->length)){
-HXLINE( 260)					 ::borogove::Stanza fallback = _g16->__get(_g15).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 260)					_g15 = (_g15 + 1);
-HXLINE( 261)					msg->payloads->push(fallback);
+HXLINE( 281)				_hx_tmp49 = false;
+            			}
+HXDLIN( 281)			if (_hx_tmp49) {
+HXLINE( 281)				_hx_tmp48 = ::hx::IsNull( replaceId );
+            			}
+            			else {
+HXLINE( 281)				_hx_tmp48 = false;
+            			}
+HXDLIN( 281)			if (_hx_tmp48) {
+HXLINE( 281)				_hx_tmp47 = ::hx::IsNull( retracted );
+            			}
+            			else {
+HXLINE( 281)				_hx_tmp47 = false;
+            			}
+HXDLIN( 281)			if (_hx_tmp47) {
+HXLINE( 282)				bool _hx_tmp51;
+HXDLIN( 282)				if ((msg->payloads->length == 1)) {
+HXLINE( 282)					_hx_tmp51 = (msg->payloads->__get(0).StaticCast<  ::borogove::Stanza >()->name == HX_("subject",ac,01,88,29));
+            				}
+            				else {
+HXLINE( 282)					_hx_tmp51 = false;
+            				}
+HXDLIN( 282)				if (_hx_tmp51) {
+HXLINE( 283)					::String _hx_tmp52 = msg->chatId();
+HXDLIN( 283)					::String _hx_tmp53 = msg->get_senderId();
+HXDLIN( 283)					::String msg7 = msg->threadId;
+HXDLIN( 283)					return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp52,_hx_tmp53,msg7,::borogove::MessageStanza_obj::SubjectStanza(msg->payloads->__get(0).StaticCast<  ::borogove::Stanza >()->getText()),encryptionInfo);
+            				}
+HXLINE( 286)				::String _hx_tmp54 = msg->chatId();
+HXDLIN( 286)				::String _hx_tmp55 = msg->get_senderId();
+HXDLIN( 286)				return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp54,_hx_tmp55,msg->threadId,::borogove::MessageStanza_obj::UnknownMessageStanza(stanza),encryptionInfo);
+            			}
+HXLINE( 289)			{
+HXLINE( 289)				int _g15 = 0;
+HXDLIN( 289)				::Array< ::Dynamic> _g16 = stanza->allTags(HX_("fallback",22,f0,9d,2a),HX_("urn:xmpp:fallback:0",74,aa,56,9b));
+HXDLIN( 289)				while((_g15 < _g16->length)){
+HXLINE( 289)					 ::borogove::Stanza fallback = _g16->__get(_g15).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 289)					_g15 = (_g15 + 1);
+HXLINE( 290)					msg->payloads->push(fallback);
             				}
             			}
-HXLINE( 264)			 ::borogove::Stanza unstyled = stanza->getChild(HX_("unstyled",2c,15,1a,18),HX_("urn:xmpp:styling:0",48,d3,aa,fb));
-HXLINE( 265)			if (::hx::IsNotNull( unstyled )) {
-HXLINE( 266)				msg->payloads->push(unstyled);
-            			}
-HXLINE( 269)			 ::borogove::Stanza html = stanza->getChild(HX_("html",6b,95,16,45),HX_("http://jabber.org/protocol/xhtml-im",c2,5d,b2,ce));
-HXLINE( 270)			if (::hx::IsNotNull( html )) {
-HXLINE( 271)				msg->payloads->push(html);
-            			}
-HXLINE( 274)			 ::borogove::Stanza reply = stanza->getChild(HX_("reply",2a,09,c6,e6),HX_("urn:xmpp:reply:0",c4,d5,6f,90));
-HXLINE( 275)			if (::hx::IsNotNull( reply )) {
-HXLINE( 276)				::String replyToJid = ( (::String)(::Reflect_obj::field(reply->attr,HX_("to",7b,65,00,00))) );
-HXLINE( 277)				::String replyToID = ( (::String)(::Reflect_obj::field(reply->attr,HX_("id",db,5b,00,00))) );
-HXLINE( 279)				::String text1 = msg->text;
-HXLINE( 280)				bool _hx_tmp52;
-HXDLIN( 280)				if (::hx::IsNotNull( text1 )) {
-HXLINE( 280)					_hx_tmp52 = ::borogove::EmojiUtil_obj::isOnlyEmoji(::StringTools_obj::trim(text1));
+HXLINE( 293)			 ::borogove::Stanza unstyled = stanza->getChild(HX_("unstyled",2c,15,1a,18),HX_("urn:xmpp:styling:0",48,d3,aa,fb));
+HXLINE( 294)			if (::hx::IsNotNull( unstyled )) {
+HXLINE( 295)				msg->payloads->push(unstyled);
+            			}
+HXLINE( 298)			 ::borogove::Stanza html = stanza->getChild(HX_("html",6b,95,16,45),HX_("http://jabber.org/protocol/xhtml-im",c2,5d,b2,ce));
+HXLINE( 299)			if (::hx::IsNotNull( html )) {
+HXLINE( 300)				msg->payloads->push(html);
+            			}
+HXLINE( 303)			 ::borogove::Stanza reply = stanza->getChild(HX_("reply",2a,09,c6,e6),HX_("urn:xmpp:reply:0",c4,d5,6f,90));
+HXLINE( 304)			if (::hx::IsNotNull( reply )) {
+HXLINE( 305)				::String replyToJid = ( (::String)(::Reflect_obj::field(reply->attr,HX_("to",7b,65,00,00))) );
+HXLINE( 306)				::String replyToID = ( (::String)(::Reflect_obj::field(reply->attr,HX_("id",db,5b,00,00))) );
+HXLINE( 308)				::String text1 = msg->text;
+HXLINE( 309)				bool _hx_tmp56;
+HXDLIN( 309)				if (::hx::IsNotNull( text1 )) {
+HXLINE( 309)					_hx_tmp56 = ::borogove::EmojiUtil_obj::isOnlyEmoji(::StringTools_obj::trim(text1));
             				}
             				else {
-HXLINE( 280)					_hx_tmp52 = false;
+HXLINE( 309)					_hx_tmp56 = false;
             				}
-HXDLIN( 280)				if (_hx_tmp52) {
-HXLINE( 281)					::String _hx_tmp53 = msg->chatId();
-HXDLIN( 281)					::String _hx_tmp54 = msg->get_senderId();
-HXDLIN( 281)					::String msg7 = msg->threadId;
-HXLINE( 282)					::String _hx_tmp55;
-HXDLIN( 282)					::String tmp16 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("id",db,5b,00,00))) );
-HXDLIN( 282)					if (::hx::IsNotNull( tmp16 )) {
-HXLINE( 282)						_hx_tmp55 = tmp16;
+HXDLIN( 309)				if (_hx_tmp56) {
+HXLINE( 310)					::String _hx_tmp57 = msg->chatId();
+HXDLIN( 310)					::String _hx_tmp58 = msg->get_senderId();
+HXDLIN( 310)					::String msg8 = msg->threadId;
+HXLINE( 311)					::String _hx_tmp59;
+HXDLIN( 311)					::String tmp20 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("id",db,5b,00,00))) );
+HXDLIN( 311)					if (::hx::IsNotNull( tmp20 )) {
+HXLINE( 311)						_hx_tmp59 = tmp20;
             					}
             					else {
-HXLINE( 282)						_hx_tmp55 = ::borogove::ID_obj::_hx_long();
+HXLINE( 311)						_hx_tmp59 = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
             					}
-HXLINE( 283)					::String _hx_tmp56;
-HXDLIN( 283)					if (isGroupchat) {
-HXLINE( 283)						_hx_tmp56 = replyToID;
+HXLINE( 312)					::String _hx_tmp60;
+HXDLIN( 312)					if (isGroupchat) {
+HXLINE( 312)						_hx_tmp60 = replyToID;
             					}
             					else {
-HXLINE( 283)						_hx_tmp56 = null();
+HXLINE( 312)						_hx_tmp60 = null();
             					}
-HXLINE( 284)					::String _hx_tmp57;
-HXDLIN( 284)					if (isGroupchat) {
-HXLINE( 284)						_hx_tmp57 = msg->chatId();
+HXLINE( 313)					::String _hx_tmp61;
+HXDLIN( 313)					if (isGroupchat) {
+HXLINE( 313)						_hx_tmp61 = msg->chatId();
             					}
             					else {
-HXLINE( 284)						_hx_tmp57 = null();
+HXLINE( 313)						_hx_tmp61 = null();
             					}
-HXLINE( 285)					::String _hx_tmp58;
-HXDLIN( 285)					if (isGroupchat) {
-HXLINE( 285)						_hx_tmp58 = null();
+HXLINE( 314)					::String _hx_tmp62;
+HXDLIN( 314)					if (isGroupchat) {
+HXLINE( 314)						_hx_tmp62 = null();
             					}
             					else {
-HXLINE( 285)						_hx_tmp58 = replyToID;
+HXLINE( 314)						_hx_tmp62 = replyToID;
+            					}
+HXLINE( 315)					::String _hx_tmp63 = msg->chatId();
+HXLINE( 316)					::String tmp21 = msg->get_senderId();
+HXDLIN( 316)					if (::hx::IsNull( tmp21 )) {
+HXLINE( 316)						HX_STACK_DO_THROW(HX_("no sender",b4,39,ce,0e));
             					}
-HXLINE( 286)					::String _hx_tmp59 = msg->chatId();
-HXLINE( 287)					::String _hx_tmp60 = msg->get_senderId();
-HXLINE( 289)					::String _hx_tmp61 = msg->get_senderId();
-HXDLIN( 289)					::String _hx_tmp62 = ::StringTools_obj::trim(text1);
-HXLINE( 281)					return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp53,_hx_tmp54,msg7,::borogove::MessageStanza_obj::ReactionUpdateStanza( ::borogove::ReactionUpdate_obj::__alloc( HX_CTX ,_hx_tmp55,_hx_tmp56,_hx_tmp57,_hx_tmp58,_hx_tmp59,_hx_tmp60,timestamp,::Array_obj< ::Dynamic>::__new(1)->init(0, ::borogove::Reaction_obj::__alloc( HX_CTX ,_hx_tmp61,timestamp,_hx_tmp62,msg->localId,null())),1)),encryptionInfo);
+HXLINE( 318)					::String tmp22 = msg->get_senderId();
+HXDLIN( 318)					if (::hx::IsNull( tmp22 )) {
+HXLINE( 318)						HX_STACK_DO_THROW(HX_("no sender",b4,39,ce,0e));
+            					}
+HXDLIN( 318)					::String _hx_tmp64 = ::StringTools_obj::trim(text1);
+HXLINE( 310)					return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp57,_hx_tmp58,msg8,::borogove::MessageStanza_obj::ReactionUpdateStanza( ::borogove::ReactionUpdate_obj::__alloc( HX_CTX ,_hx_tmp59,_hx_tmp60,_hx_tmp61,_hx_tmp62,_hx_tmp63,tmp21,timestamp,::Array_obj< ::Dynamic>::__new(1)->init(0, ::borogove::Reaction_obj::__alloc( HX_CTX ,tmp22,timestamp,_hx_tmp64,msg->localId,null())),1)),encryptionInfo);
             				}
-HXLINE( 294)				if (::hx::IsNotNull( html )) {
-HXLINE( 295)					 ::borogove::Stanza body = html->getChild(HX_("body",a2,7a,1b,41),HX_("http://www.w3.org/1999/xhtml",90,6d,f8,c8));
-HXLINE( 296)					if (::hx::IsNotNull( body )) {
-HXLINE( 297)						::Array< ::Dynamic> els = body->allTags(null(),null());
-HXLINE( 298)						bool _hx_tmp63;
-HXDLIN( 298)						if ((els->length == 1)) {
-HXLINE( 298)							_hx_tmp63 = (els->__get(0).StaticCast<  ::borogove::Stanza >()->name == HX_("img",03,0c,50,00));
+HXLINE( 323)				if (::hx::IsNotNull( html )) {
+HXLINE( 324)					 ::borogove::Stanza body = html->getChild(HX_("body",a2,7a,1b,41),HX_("http://www.w3.org/1999/xhtml",90,6d,f8,c8));
+HXLINE( 325)					if (::hx::IsNotNull( body )) {
+HXLINE( 326)						::Array< ::Dynamic> els = body->allTags(null(),null());
+HXLINE( 327)						bool _hx_tmp65;
+HXDLIN( 327)						if ((els->length == 1)) {
+HXLINE( 327)							_hx_tmp65 = (els->__get(0).StaticCast<  ::borogove::Stanza >()->name == HX_("img",03,0c,50,00));
             						}
             						else {
-HXLINE( 298)							_hx_tmp63 = false;
+HXLINE( 327)							_hx_tmp65 = false;
             						}
-HXDLIN( 298)						if (_hx_tmp63) {
-HXLINE( 299)							::String tmp17 = ( (::String)(::Reflect_obj::field(els->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("src",e4,a6,57,00))) );
-HXDLIN( 299)							::String hash;
-HXDLIN( 299)							if (::hx::IsNotNull( tmp17 )) {
-HXLINE( 299)								hash = tmp17;
+HXDLIN( 327)						if (_hx_tmp65) {
+HXLINE( 328)							::String tmp23 = ( (::String)(::Reflect_obj::field(els->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("src",e4,a6,57,00))) );
+HXDLIN( 328)							::String hash;
+HXDLIN( 328)							if (::hx::IsNotNull( tmp23 )) {
+HXLINE( 328)								hash = tmp23;
             							}
             							else {
-HXLINE( 299)								hash = HX_("",00,00,00,00);
+HXLINE( 328)								hash = HX_("",00,00,00,00);
             							}
-HXDLIN( 299)							 ::borogove::Hash hash1 = ::borogove::Hash_obj::fromUri(hash);
-HXLINE( 300)							if (::hx::IsNotNull( hash1 )) {
-HXLINE( 301)								::String _hx_tmp64 = msg->chatId();
-HXDLIN( 301)								::String _hx_tmp65 = msg->get_senderId();
-HXDLIN( 301)								::String msg8 = msg->threadId;
-HXLINE( 302)								::String _hx_tmp66;
-HXDLIN( 302)								::String tmp18 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("id",db,5b,00,00))) );
-HXDLIN( 302)								if (::hx::IsNotNull( tmp18 )) {
-HXLINE( 302)									_hx_tmp66 = tmp18;
+HXDLIN( 328)							 ::borogove::Hash hash1 = ::borogove::Hash_obj::fromUri(hash);
+HXLINE( 329)							if (::hx::IsNotNull( hash1 )) {
+HXLINE( 330)								::String _hx_tmp66 = msg->chatId();
+HXDLIN( 330)								::String _hx_tmp67 = msg->get_senderId();
+HXDLIN( 330)								::String msg9 = msg->threadId;
+HXLINE( 331)								::String _hx_tmp68;
+HXDLIN( 331)								::String tmp24 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("id",db,5b,00,00))) );
+HXDLIN( 331)								if (::hx::IsNotNull( tmp24 )) {
+HXLINE( 331)									_hx_tmp68 = tmp24;
             								}
             								else {
-HXLINE( 302)									_hx_tmp66 = ::borogove::ID_obj::_hx_long();
+HXLINE( 331)									_hx_tmp68 = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
             								}
-HXLINE( 303)								::String _hx_tmp67;
-HXDLIN( 303)								if (isGroupchat) {
-HXLINE( 303)									_hx_tmp67 = replyToID;
+HXLINE( 332)								::String _hx_tmp69;
+HXDLIN( 332)								if (isGroupchat) {
+HXLINE( 332)									_hx_tmp69 = replyToID;
             								}
             								else {
-HXLINE( 303)									_hx_tmp67 = null();
+HXLINE( 332)									_hx_tmp69 = null();
             								}
-HXLINE( 304)								::String _hx_tmp68;
-HXDLIN( 304)								if (isGroupchat) {
-HXLINE( 304)									_hx_tmp68 = msg->chatId();
+HXLINE( 333)								::String _hx_tmp70;
+HXDLIN( 333)								if (isGroupchat) {
+HXLINE( 333)									_hx_tmp70 = msg->chatId();
             								}
             								else {
-HXLINE( 304)									_hx_tmp68 = null();
+HXLINE( 333)									_hx_tmp70 = null();
             								}
-HXLINE( 305)								::String _hx_tmp69;
-HXDLIN( 305)								if (isGroupchat) {
-HXLINE( 305)									_hx_tmp69 = null();
+HXLINE( 334)								::String _hx_tmp71;
+HXDLIN( 334)								if (isGroupchat) {
+HXLINE( 334)									_hx_tmp71 = null();
             								}
             								else {
-HXLINE( 305)									_hx_tmp69 = replyToID;
+HXLINE( 334)									_hx_tmp71 = replyToID;
+            								}
+HXLINE( 335)								::String _hx_tmp72 = msg->chatId();
+HXLINE( 336)								::String tmp25 = msg->get_senderId();
+HXDLIN( 336)								if (::hx::IsNull( tmp25 )) {
+HXLINE( 336)									HX_STACK_DO_THROW(HX_("no sender",b4,39,ce,0e));
             								}
-HXLINE( 306)								::String _hx_tmp70 = msg->chatId();
-HXLINE( 307)								::String _hx_tmp71 = msg->get_senderId();
-HXLINE( 309)								::String _hx_tmp72 = msg->get_senderId();
-HXDLIN( 309)								::String _hx_tmp73;
-HXDLIN( 309)								::String tmp19 = ( (::String)(::Reflect_obj::field(els->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("alt",29,f9,49,00))) );
-HXDLIN( 309)								if (::hx::IsNotNull( tmp19 )) {
-HXLINE( 309)									_hx_tmp73 = tmp19;
+HXLINE( 338)								::String tmp26 = msg->get_senderId();
+HXDLIN( 338)								if (::hx::IsNull( tmp26 )) {
+HXLINE( 338)									HX_STACK_DO_THROW(HX_("no sender",b4,39,ce,0e));
+            								}
+HXDLIN( 338)								::String _hx_tmp73;
+HXDLIN( 338)								::String tmp27 = ( (::String)(::Reflect_obj::field(els->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("alt",29,f9,49,00))) );
+HXDLIN( 338)								if (::hx::IsNotNull( tmp27 )) {
+HXLINE( 338)									_hx_tmp73 = tmp27;
             								}
             								else {
-HXLINE( 309)									_hx_tmp73 = HX_("",00,00,00,00);
+HXLINE( 338)									_hx_tmp73 = HX_("",00,00,00,00);
             								}
-HXDLIN( 309)								::String _hx_tmp74 = hash1->serializeUri();
-HXLINE( 301)								return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp64,_hx_tmp65,msg8,::borogove::MessageStanza_obj::ReactionUpdateStanza( ::borogove::ReactionUpdate_obj::__alloc( HX_CTX ,_hx_tmp66,_hx_tmp67,_hx_tmp68,_hx_tmp69,_hx_tmp70,_hx_tmp71,timestamp,::Array_obj< ::Dynamic>::__new(1)->init(0, ::borogove::CustomEmojiReaction_obj::__alloc( HX_CTX ,_hx_tmp72,timestamp,_hx_tmp73,_hx_tmp74,msg->localId)),1)),encryptionInfo);
+HXDLIN( 338)								::String _hx_tmp74 = hash1->serializeUri();
+HXLINE( 330)								return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp66,_hx_tmp67,msg9,::borogove::MessageStanza_obj::ReactionUpdateStanza( ::borogove::ReactionUpdate_obj::__alloc( HX_CTX ,_hx_tmp68,_hx_tmp69,_hx_tmp70,_hx_tmp71,_hx_tmp72,tmp25,timestamp,::Array_obj< ::Dynamic>::__new(1)->init(0, ::borogove::CustomEmojiReaction_obj::__alloc( HX_CTX ,tmp26,timestamp,_hx_tmp73,_hx_tmp74,msg->localId)),1)),encryptionInfo);
             							}
             						}
             					}
             				}
-HXLINE( 317)				if (::hx::IsNotNull( replyToID )) {
-HXLINE( 319)					 ::borogove::ChatMessageBuilder replyToMessage =  ::borogove::ChatMessageBuilder_obj::__alloc( HX_CTX );
-HXLINE( 320)					 ::borogove::JID _hx_tmp75;
-HXDLIN( 320)					if ((replyToJid == msg->get_senderId())) {
-HXLINE( 320)						_hx_tmp75 = msg->to;
+HXLINE( 346)				if (::hx::IsNotNull( replyToID )) {
+HXLINE( 348)					 ::borogove::ChatMessageBuilder replyToMessage =  ::borogove::ChatMessageBuilder_obj::__alloc( HX_CTX );
+HXLINE( 349)					 ::borogove::JID _hx_tmp75;
+HXDLIN( 349)					if ((replyToJid == msg->get_senderId())) {
+HXLINE( 349)						_hx_tmp75 = msg->to;
             					}
             					else {
-HXLINE( 320)						_hx_tmp75 = msg->from;
+HXLINE( 349)						_hx_tmp75 = msg->from;
             					}
-HXDLIN( 320)					replyToMessage->to = _hx_tmp75;
-HXLINE( 321)					 ::borogove::JID _hx_tmp76;
-HXDLIN( 321)					if (::hx::IsNull( replyToJid )) {
-HXLINE( 321)						_hx_tmp76 = null();
+HXDLIN( 349)					replyToMessage->to = _hx_tmp75;
+HXLINE( 350)					 ::borogove::JID _hx_tmp76;
+HXDLIN( 350)					if (::hx::IsNull( replyToJid )) {
+HXLINE( 350)						_hx_tmp76 = null();
             					}
             					else {
-HXLINE( 321)						_hx_tmp76 = ::borogove::JID_obj::parse(replyToJid);
+HXLINE( 350)						_hx_tmp76 = ::borogove::JID_obj::parse(replyToJid);
             					}
-HXDLIN( 321)					replyToMessage->from = _hx_tmp76;
-HXLINE( 322)					::String _hx_tmp77;
-HXDLIN( 322)					if (isGroupchat) {
-HXLINE( 322)						 ::borogove::JID tmp20 = replyToMessage->from;
-HXDLIN( 322)						if (::hx::IsNotNull( tmp20 )) {
-HXLINE( 322)							_hx_tmp77 = tmp20->asString();
+HXDLIN( 350)					replyToMessage->from = _hx_tmp76;
+HXLINE( 352)					::String _hx_tmp77;
+HXDLIN( 352)					if (isGroupchat) {
+HXLINE( 352)						 ::borogove::JID tmp28 = replyToMessage->from;
+HXDLIN( 352)						if (::hx::IsNotNull( tmp28 )) {
+HXLINE( 352)							_hx_tmp77 = tmp28->asString();
             						}
             						else {
-HXLINE( 322)							_hx_tmp77 = null();
+HXLINE( 352)							_hx_tmp77 = null();
             						}
             					}
             					else {
-HXLINE( 322)						 ::borogove::JID tmp21 = replyToMessage->from;
-HXDLIN( 322)						 ::borogove::JID tmp22;
-HXDLIN( 322)						if (::hx::IsNotNull( tmp21 )) {
-HXLINE( 322)							tmp22 = tmp21->asBare();
+HXLINE( 352)						 ::borogove::JID tmp29 = replyToMessage->from;
+HXDLIN( 352)						 ::borogove::JID tmp30;
+HXDLIN( 352)						if (::hx::IsNotNull( tmp29 )) {
+HXLINE( 352)							tmp30 = tmp29->asBare();
             						}
             						else {
-HXLINE( 322)							tmp22 = null();
+HXLINE( 352)							tmp30 = null();
             						}
-HXDLIN( 322)						if (::hx::IsNotNull( tmp22 )) {
-HXLINE( 322)							_hx_tmp77 = tmp22->asString();
+HXDLIN( 352)						if (::hx::IsNotNull( tmp30 )) {
+HXLINE( 352)							_hx_tmp77 = tmp30->asString();
             						}
             						else {
-HXLINE( 322)							_hx_tmp77 = null();
+HXLINE( 352)							_hx_tmp77 = null();
             						}
             					}
-HXDLIN( 322)					replyToMessage->senderId = _hx_tmp77;
-HXLINE( 323)					replyToMessage->replyId = replyToID;
-HXLINE( 324)					bool _hx_tmp78;
-HXDLIN( 324)					if (::hx::IsNotNull( msg->serverIdBy )) {
-HXLINE( 324)						::String msg9 = msg->serverIdBy;
-HXDLIN( 324)						_hx_tmp78 = (msg9 != localJid->asBare()->asString());
+HXDLIN( 352)					replyToMessage->senderId = _hx_tmp77;
+HXLINE( 353)					replyToMessage->replyId = replyToID;
+HXLINE( 354)					bool _hx_tmp78;
+HXDLIN( 354)					bool _hx_tmp79;
+HXDLIN( 354)					if (::hx::IsNotNull( msg->serverIdBy )) {
+HXLINE( 354)						::String msg10 = msg->serverIdBy;
+HXDLIN( 354)						_hx_tmp79 = (msg10 != localJid->asBare()->asString());
+            					}
+            					else {
+HXLINE( 354)						_hx_tmp79 = false;
+            					}
+HXDLIN( 354)					if (!(_hx_tmp79)) {
+HXLINE( 354)						_hx_tmp78 = isGroupchat;
             					}
             					else {
-HXLINE( 324)						_hx_tmp78 = false;
+HXLINE( 354)						_hx_tmp78 = true;
             					}
-HXDLIN( 324)					if (_hx_tmp78) {
-HXLINE( 325)						replyToMessage->serverId = replyToID;
+HXDLIN( 354)					if (_hx_tmp78) {
+HXLINE( 355)						replyToMessage->serverId = replyToID;
+HXLINE( 356)						replyToMessage->serverIdBy = msg->serverIdBy;
             					}
             					else {
-HXLINE( 327)						replyToMessage->localId = replyToID;
+HXLINE( 358)						replyToMessage->localId = replyToID;
             					}
-HXLINE( 329)					msg->replyToMessage = replyToMessage->build();
+HXLINE( 360)					msg->replyToMessage = replyToMessage->build();
             				}
             			}
-HXLINE( 333)			if (::hx::IsNotNull( replaceId )) {
-HXLINE( 334)				if ((msg->versions->length < 1)) {
-HXLINE( 334)					msg->versions = ::Array_obj< ::Dynamic>::__new(1)->init(0,msg->build());
+HXLINE( 364)			if (::hx::IsNotNull( replaceId )) {
+HXLINE( 365)				if ((msg->versions->length < 1)) {
+HXLINE( 365)					msg->versions = ::Array_obj< ::Dynamic>::__new(1)->init(0,msg->build());
+            				}
+HXLINE( 366)				msg->localId = replaceId;
+            			}
+HXLINE( 369)			{
+HXLINE( 369)				int _g17 = 0;
+HXDLIN( 369)				::Array< ::Dynamic> _g18 = stanza->allTags(HX_("Description",dc,a0,4f,43),HX_("http://www.w3.org/1999/02/22-rdf-syntax-ns#",20,d2,3b,f3));
+HXDLIN( 369)				while((_g17 < _g18->length)){
+HXLINE( 369)					 ::borogove::Stanza desc = _g18->__get(_g17).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 369)					_g17 = (_g17 + 1);
+HXLINE( 370)					::String about = ( (::String)(::Reflect_obj::field(desc->attr,HX_("{http://www.w3.org/1999/02/22-rdf-syntax-ns#}about",f5,8b,b0,68))) );
+HXLINE( 371)					if (::hx::IsNotNull( about )) {
+HXLINE( 372)						::Array< ::Dynamic> msg11 = msg->linkMetadata;
+HXLINE( 374)						::String _hx_tmp80 = desc->getChildText(HX_("url",6f,2b,59,00),HX_("https://ogp.me/ns#",ac,b9,8c,d5));
+HXLINE( 375)						::String _hx_tmp81 = desc->getChildText(HX_("title",98,15,3b,10),HX_("https://ogp.me/ns#",ac,b9,8c,d5));
+HXLINE( 376)						::String _hx_tmp82 = desc->getChildText(HX_("description",fc,08,1d,5f),HX_("https://ogp.me/ns#",ac,b9,8c,d5));
+HXLINE( 377)						::Array< ::Dynamic> _this1 = desc->allTags(HX_("image",5b,1f,69,bd),HX_("https://ogp.me/ns#",ac,b9,8c,d5));
+HXDLIN( 377)						::Array< ::String > result3 = ::Array_obj< ::String >::__new(_this1->length);
+HXDLIN( 377)						{
+HXLINE( 377)							int _g19 = 0;
+HXDLIN( 377)							int _g20 = _this1->length;
+HXDLIN( 377)							while((_g19 < _g20)){
+HXLINE( 377)								_g19 = (_g19 + 1);
+HXDLIN( 377)								int i2 = (_g19 - 1);
+HXDLIN( 377)								{
+HXLINE( 377)									::String inValue2 = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this1,i2)) )->getText();
+HXDLIN( 377)									result3->__unsafe_set(i2,inValue2);
+            								}
+            							}
+            						}
+HXLINE( 378)						::Array< ::Dynamic> _this2 = desc->allTags(HX_("video",7b,14,fc,36),HX_("https://ogp.me/ns#",ac,b9,8c,d5));
+HXDLIN( 378)						::Array< ::String > result4 = ::Array_obj< ::String >::__new(_this2->length);
+HXDLIN( 378)						{
+HXLINE( 378)							int _g21 = 0;
+HXDLIN( 378)							int _g22 = _this2->length;
+HXDLIN( 378)							while((_g21 < _g22)){
+HXLINE( 378)								_g21 = (_g21 + 1);
+HXDLIN( 378)								int i3 = (_g21 - 1);
+HXDLIN( 378)								{
+HXLINE( 378)									::String inValue3 = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this2,i3)) )->getText();
+HXDLIN( 378)									result4->__unsafe_set(i3,inValue3);
+            								}
+            							}
+            						}
+HXLINE( 372)						msg11->push( ::borogove::LinkMetadata_obj::__alloc( HX_CTX ,about,_hx_tmp80,_hx_tmp81,_hx_tmp82,result3,result4));
+            					}
             				}
-HXLINE( 335)				msg->localId = replaceId;
             			}
-HXLINE( 338)			::String _hx_tmp79 = msg->chatId();
-HXDLIN( 338)			::String _hx_tmp80 = msg->get_senderId();
-HXDLIN( 338)			::String msg10 = msg->threadId;
-HXDLIN( 338)			return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp79,_hx_tmp80,msg10,::borogove::MessageStanza_obj::ChatMessageStanza(msg->build()),encryptionInfo);
+HXLINE( 383)			::String _hx_tmp83 = msg->chatId();
+HXDLIN( 383)			::String _hx_tmp84 = msg->get_senderId();
+HXDLIN( 383)			::String msg12 = msg->threadId;
+HXDLIN( 383)			return  ::borogove::Message_obj::__alloc( HX_CTX ,_hx_tmp83,_hx_tmp84,msg12,::borogove::MessageStanza_obj::ChatMessageStanza(msg->build()),encryptionInfo);
             		}
-HXLINE(  51)		return null();
+HXLINE(  62)		return null();
             	}
 
 
-STATIC_HX_DEFINE_DYNAMIC_FUNC4(Message_obj,fromStanza,return )
+STATIC_HX_DEFINE_DYNAMIC_FUNC5(Message_obj,fromStanza,return )
 
 
 ::hx::ObjectPtr< Message_obj > Message_obj::__new(::String chatId,::String senderId,::String threadId, ::borogove::MessageStanza parsed, ::borogove::EncryptionInfo encryption) {
diff --git a/Sources/c_borogove/src/borogove/MessageStanza.cpp b/Sources/c_borogove/src/borogove/MessageStanza.cpp
index 0dc1fb7..d7821a6 100644
--- a/Sources/c_borogove/src/borogove/MessageStanza.cpp
+++ b/Sources/c_borogove/src/borogove/MessageStanza.cpp
@@ -30,22 +30,27 @@ namespace borogove{
 
 ::borogove::MessageStanza MessageStanza_obj::ModerateMessageStanza( ::borogove::ModerationAction action)
 {
-	return ::hx::CreateEnum< MessageStanza_obj >(HX_("ModerateMessageStanza",39,25,06,6f),2,1)->_hx_init(0,action);
+	return ::hx::CreateEnum< MessageStanza_obj >(HX_("ModerateMessageStanza",39,25,06,6f),3,1)->_hx_init(0,action);
 }
 
 ::borogove::MessageStanza MessageStanza_obj::MucInviteStanza(::String serverId,::String serverIdBy,::String reason,::String password)
 {
-	return ::hx::CreateEnum< MessageStanza_obj >(HX_("MucInviteStanza",19,bd,35,96),4,4)->_hx_init(0,serverId)->_hx_init(1,serverIdBy)->_hx_init(2,reason)->_hx_init(3,password);
+	return ::hx::CreateEnum< MessageStanza_obj >(HX_("MucInviteStanza",19,bd,35,96),5,4)->_hx_init(0,serverId)->_hx_init(1,serverIdBy)->_hx_init(2,reason)->_hx_init(3,password);
 }
 
 ::borogove::MessageStanza MessageStanza_obj::ReactionUpdateStanza( ::borogove::ReactionUpdate update)
 {
-	return ::hx::CreateEnum< MessageStanza_obj >(HX_("ReactionUpdateStanza",47,fe,3e,f3),3,1)->_hx_init(0,update);
+	return ::hx::CreateEnum< MessageStanza_obj >(HX_("ReactionUpdateStanza",47,fe,3e,f3),4,1)->_hx_init(0,update);
+}
+
+::borogove::MessageStanza MessageStanza_obj::SubjectStanza(::String subject)
+{
+	return ::hx::CreateEnum< MessageStanza_obj >(HX_("SubjectStanza",a1,ac,e6,07),2,1)->_hx_init(0,subject);
 }
 
 ::borogove::MessageStanza MessageStanza_obj::UnknownMessageStanza( ::borogove::Stanza stanza)
 {
-	return ::hx::CreateEnum< MessageStanza_obj >(HX_("UnknownMessageStanza",52,c1,f7,28),5,1)->_hx_init(0,stanza);
+	return ::hx::CreateEnum< MessageStanza_obj >(HX_("UnknownMessageStanza",52,c1,f7,28),6,1)->_hx_init(0,stanza);
 }
 
 bool MessageStanza_obj::__GetStatic(const ::String &inName, ::Dynamic &outValue, ::hx::PropertyAccess inCallProp)
@@ -55,6 +60,7 @@ bool MessageStanza_obj::__GetStatic(const ::String &inName, ::Dynamic &outValue,
 	if (inName==HX_("ModerateMessageStanza",39,25,06,6f)) { outValue = MessageStanza_obj::ModerateMessageStanza_dyn(); return true; }
 	if (inName==HX_("MucInviteStanza",19,bd,35,96)) { outValue = MessageStanza_obj::MucInviteStanza_dyn(); return true; }
 	if (inName==HX_("ReactionUpdateStanza",47,fe,3e,f3)) { outValue = MessageStanza_obj::ReactionUpdateStanza_dyn(); return true; }
+	if (inName==HX_("SubjectStanza",a1,ac,e6,07)) { outValue = MessageStanza_obj::SubjectStanza_dyn(); return true; }
 	if (inName==HX_("UnknownMessageStanza",52,c1,f7,28)) { outValue = MessageStanza_obj::UnknownMessageStanza_dyn(); return true; }
 	return super::__GetStatic(inName, outValue, inCallProp);
 }
@@ -65,10 +71,11 @@ int MessageStanza_obj::__FindIndex(::String inName)
 {
 	if (inName==HX_("ChatMessageStanza",04,61,54,9f)) return 1;
 	if (inName==HX_("ErrorMessageStanza",54,02,51,07)) return 0;
-	if (inName==HX_("ModerateMessageStanza",39,25,06,6f)) return 2;
-	if (inName==HX_("MucInviteStanza",19,bd,35,96)) return 4;
-	if (inName==HX_("ReactionUpdateStanza",47,fe,3e,f3)) return 3;
-	if (inName==HX_("UnknownMessageStanza",52,c1,f7,28)) return 5;
+	if (inName==HX_("ModerateMessageStanza",39,25,06,6f)) return 3;
+	if (inName==HX_("MucInviteStanza",19,bd,35,96)) return 5;
+	if (inName==HX_("ReactionUpdateStanza",47,fe,3e,f3)) return 4;
+	if (inName==HX_("SubjectStanza",a1,ac,e6,07)) return 2;
+	if (inName==HX_("UnknownMessageStanza",52,c1,f7,28)) return 6;
 	return super::__FindIndex(inName);
 }
 
@@ -82,6 +89,8 @@ STATIC_HX_DEFINE_DYNAMIC_FUNC4(MessageStanza_obj,MucInviteStanza,return)
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(MessageStanza_obj,ReactionUpdateStanza,return)
 
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(MessageStanza_obj,SubjectStanza,return)
+
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(MessageStanza_obj,UnknownMessageStanza,return)
 
 int MessageStanza_obj::__FindArgCount(::String inName)
@@ -91,6 +100,7 @@ int MessageStanza_obj::__FindArgCount(::String inName)
 	if (inName==HX_("ModerateMessageStanza",39,25,06,6f)) return 1;
 	if (inName==HX_("MucInviteStanza",19,bd,35,96)) return 4;
 	if (inName==HX_("ReactionUpdateStanza",47,fe,3e,f3)) return 1;
+	if (inName==HX_("SubjectStanza",a1,ac,e6,07)) return 1;
 	if (inName==HX_("UnknownMessageStanza",52,c1,f7,28)) return 1;
 	return super::__FindArgCount(inName);
 }
@@ -102,6 +112,7 @@ int MessageStanza_obj::__FindArgCount(::String inName)
 	if (inName==HX_("ModerateMessageStanza",39,25,06,6f)) return ModerateMessageStanza_dyn();
 	if (inName==HX_("MucInviteStanza",19,bd,35,96)) return MucInviteStanza_dyn();
 	if (inName==HX_("ReactionUpdateStanza",47,fe,3e,f3)) return ReactionUpdateStanza_dyn();
+	if (inName==HX_("SubjectStanza",a1,ac,e6,07)) return SubjectStanza_dyn();
 	if (inName==HX_("UnknownMessageStanza",52,c1,f7,28)) return UnknownMessageStanza_dyn();
 	return super::__Field(inName,inCallProp);
 }
@@ -109,6 +120,7 @@ int MessageStanza_obj::__FindArgCount(::String inName)
 static ::String MessageStanza_obj_sStaticFields[] = {
 	HX_("ErrorMessageStanza",54,02,51,07),
 	HX_("ChatMessageStanza",04,61,54,9f),
+	HX_("SubjectStanza",a1,ac,e6,07),
 	HX_("ModerateMessageStanza",39,25,06,6f),
 	HX_("ReactionUpdateStanza",47,fe,3e,f3),
 	HX_("MucInviteStanza",19,bd,35,96),
diff --git a/Sources/c_borogove/src/borogove/MessageSync.cpp b/Sources/c_borogove/src/borogove/MessageSync.cpp
index fabc4d2..312232d 100644
--- a/Sources/c_borogove/src/borogove/MessageSync.cpp
+++ b/Sources/c_borogove/src/borogove/MessageSync.cpp
@@ -13,6 +13,9 @@
 #ifndef INCLUDED_StringTools
 #include <StringTools.h>
 #endif
+#ifndef INCLUDED__FractionalIndexing_FractionalIndexing_Fields_
+#include <_FractionalIndexing/FractionalIndexing_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_ChatMessageBuilder
 #include <borogove/ChatMessageBuilder.h>
 #endif
@@ -40,9 +43,6 @@
 #ifndef INCLUDED_borogove_MessageSync
 #include <borogove/MessageSync.h>
 #endif
-#ifndef INCLUDED_borogove_NS
-#include <borogove/NS.h>
-#endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
@@ -74,52 +74,52 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_33_new,"borogove.MessageSync","new",0x01408247,"borogove.MessageSync.new","borogove/MessageSync.hx",33,0xc40e42ca)
+HX_DEFINE_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_32_new,"borogove.MessageSync","new",0x01408247,"borogove.MessageSync.new","borogove/MessageSync.hx",32,0xc40e42ca)
 HX_DEFINE_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_26_new,"borogove.MessageSync","new",0x01408247,"borogove.MessageSync.new","borogove/MessageSync.hx",26,0xc40e42ca)
-HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_74_fetchNext,"borogove.MessageSync","fetchNext",0x76930374,"borogove.MessageSync.fetchNext","borogove/MessageSync.hx",74,0xc40e42ca)
-HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_94_fetchNext,"borogove.MessageSync","fetchNext",0x76930374,"borogove.MessageSync.fetchNext","borogove/MessageSync.hx",94,0xc40e42ca)
-HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_145_fetchNext,"borogove.MessageSync","fetchNext",0x76930374,"borogove.MessageSync.fetchNext","borogove/MessageSync.hx",145,0xc40e42ca)
-HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_158_fetchNext,"borogove.MessageSync","fetchNext",0x76930374,"borogove.MessageSync.fetchNext","borogove/MessageSync.hx",158,0xc40e42ca)
-HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_172_fetchNext,"borogove.MessageSync","fetchNext",0x76930374,"borogove.MessageSync.fetchNext","borogove/MessageSync.hx",172,0xc40e42ca)
-HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_48_fetchNext,"borogove.MessageSync","fetchNext",0x76930374,"borogove.MessageSync.fetchNext","borogove/MessageSync.hx",48,0xc40e42ca)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_144_fetchNext,"borogove.MessageSync","fetchNext",0x76930374,"borogove.MessageSync.fetchNext","borogove/MessageSync.hx",144,0xc40e42ca)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_69_fetchNext,"borogove.MessageSync","fetchNext",0x76930374,"borogove.MessageSync.fetchNext","borogove/MessageSync.hx",69,0xc40e42ca)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_90_fetchNext,"borogove.MessageSync","fetchNext",0x76930374,"borogove.MessageSync.fetchNext","borogove/MessageSync.hx",90,0xc40e42ca)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_156_fetchNext,"borogove.MessageSync","fetchNext",0x76930374,"borogove.MessageSync.fetchNext","borogove/MessageSync.hx",156,0xc40e42ca)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_170_fetchNext,"borogove.MessageSync","fetchNext",0x76930374,"borogove.MessageSync.fetchNext","borogove/MessageSync.hx",170,0xc40e42ca)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_50_fetchNext,"borogove.MessageSync","fetchNext",0x76930374,"borogove.MessageSync.fetchNext","borogove/MessageSync.hx",50,0xc40e42ca)
 static const ::String _hx_array_data_8d9a52d5_8[] = {
 	HX_("",00,00,00,00),
 };
 static const int _hx_array_data_8d9a52d5_9[] = {
 	(int)0,
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_183_hasMore,"borogove.MessageSync","hasMore",0xecce3176,"borogove.MessageSync.hasMore","borogove/MessageSync.hx",183,0xc40e42ca)
-HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_187_addContext,"borogove.MessageSync","addContext",0x33022ac7,"borogove.MessageSync.addContext","borogove/MessageSync.hx",187,0xc40e42ca)
-HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_191_onMessages,"borogove.MessageSync","onMessages",0xc4b51604,"borogove.MessageSync.onMessages","borogove/MessageSync.hx",191,0xc40e42ca)
-HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_195_onError,"borogove.MessageSync","onError",0xde909b90,"borogove.MessageSync.onError","borogove/MessageSync.hx",195,0xc40e42ca)
-HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_199_setNewestPageFirst,"borogove.MessageSync","setNewestPageFirst",0xfe9d2b12,"borogove.MessageSync.setNewestPageFirst","borogove/MessageSync.hx",199,0xc40e42ca)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_181_hasMore,"borogove.MessageSync","hasMore",0xecce3176,"borogove.MessageSync.hasMore","borogove/MessageSync.hx",181,0xc40e42ca)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_185_addContext,"borogove.MessageSync","addContext",0x33022ac7,"borogove.MessageSync.addContext","borogove/MessageSync.hx",185,0xc40e42ca)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_189_onMessages,"borogove.MessageSync","onMessages",0xc4b51604,"borogove.MessageSync.onMessages","borogove/MessageSync.hx",189,0xc40e42ca)
+HX_LOCAL_STACK_FRAME(_hx_pos_b6f42aa0d664cfb6_193_onError,"borogove.MessageSync","onError",0xde909b90,"borogove.MessageSync.onError","borogove/MessageSync.hx",193,0xc40e42ca)
 namespace borogove{
 
-void MessageSync_obj::__construct( ::borogove::Client client, ::borogove::GenericStream stream, ::Dynamic filter,::String serviceJID){
+void MessageSync_obj::__construct( ::borogove::Client client, ::borogove::GenericStream stream, ::Dynamic filter,::String sortA,::String sortB,::String serviceJID){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(2)
             		 ::borogove::ChatMessageBuilder _hx_run( ::borogove::ChatMessageBuilder b, ::borogove::Stanza _){
-            			HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_33_new)
-HXLINE(  33)			return b;
+            			HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_32_new)
+HXLINE(  32)			return b;
             		}
             		HX_END_LOCAL_FUNC2(return)
 
             	HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_26_new)
 HXLINE(  39)		this->jmi =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(  38)		this->newestPageFirst = true;
-HXLINE(  37)		this->complete = false;
-HXLINE(  36)		this->progress = 0;
-HXLINE(  33)		this->contextHandler =  ::Dynamic(new _hx_Closure_0());
+HXLINE(  38)		this->complete = false;
+HXLINE(  37)		this->progress = 0;
+HXLINE(  32)		this->contextHandler =  ::Dynamic(new _hx_Closure_0());
 HXLINE(  42)		this->client = client;
 HXLINE(  43)		this->stream = stream;
 HXLINE(  44)		this->filter = ::Reflect_obj::copy(filter);
-HXLINE(  45)		::String _hx_tmp;
-HXDLIN(  45)		if (::hx::IsNotNull( serviceJID )) {
-HXLINE(  45)			_hx_tmp = serviceJID;
+HXLINE(  45)		this->sortA = sortA;
+HXLINE(  46)		this->sortB = sortB;
+HXLINE(  47)		::String _hx_tmp;
+HXDLIN(  47)		if (::hx::IsNotNull( serviceJID )) {
+HXLINE(  47)			_hx_tmp = serviceJID;
             		}
             		else {
-HXLINE(  45)			_hx_tmp = client->accountId();
+HXLINE(  47)			_hx_tmp = client->accountId();
             		}
-HXDLIN(  45)		this->serviceJID = _hx_tmp;
+HXDLIN(  47)		this->serviceJID = _hx_tmp;
             	}
 
 Dynamic MessageSync_obj::__CreateEmpty() { return new MessageSync_obj; }
@@ -129,7 +129,7 @@ void *MessageSync_obj::_hx_vtable = 0;
 Dynamic MessageSync_obj::__Create(::hx::DynamicArray inArgs)
 {
 	::hx::ObjectPtr< MessageSync_obj > _hx_result = new MessageSync_obj();
-	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2],inArgs[3]);
+	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2],inArgs[3],inArgs[4],inArgs[5]);
 	return _hx_result;
 }
 
@@ -140,259 +140,223 @@ bool MessageSync_obj::_hx_isInstanceOf(int inClassId) {
 void MessageSync_obj::fetchNext(){
             		HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_2,::Array< int >,counterSameTime, ::borogove::MessageSync,_gthis, ::borogove::queries::MAMQuery,query,::Array< ::String >,previousMessageTime,::Array< ::Dynamic>,promisedMessages) HXARGC(1)
             		 ::borogove::EventResult _hx_run( ::Dynamic event){
-            			HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_74_fetchNext)
-HXLINE(  75)			_gthis->progress++;
-HXLINE(  76)			 ::borogove::Stanza message = ( ( ::borogove::Stanza)(event->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic)) );
-HXLINE(  77)			::String from;
-HXDLIN(  77)			if (::Reflect_obj::hasField(message->attr,HX_("from",6a,a5,c2,43))) {
-HXLINE(  77)				from = ( (::String)(::Reflect_obj::field(message->attr,HX_("from",6a,a5,c2,43))) );
+            			HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_1, ::borogove::MessageSync,_gthis,::Array< ::String >,timestamp, ::borogove::Stanza,result) HXARGC(2)
+            			 ::borogove::ChatMessageBuilder _hx_run( ::borogove::ChatMessageBuilder builder, ::borogove::Stanza stanza){
+            				HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_144_fetchNext)
+HXLINE( 145)				builder->sortId = _gthis->sortA;
+HXLINE( 146)				builder->serverId = ( (::String)(::Reflect_obj::field(result->attr,HX_("id",db,5b,00,00))) );
+HXLINE( 147)				builder->serverIdBy = _gthis->serviceJID;
+HXLINE( 148)				bool msg;
+HXDLIN( 148)				if (::hx::IsNotNull( timestamp->__get(0) )) {
+HXLINE( 148)					msg = ::hx::IsNull( builder->timestamp );
+            				}
+            				else {
+HXLINE( 148)					msg = false;
+            				}
+HXDLIN( 148)				if (msg) {
+HXLINE( 148)					builder->timestamp = timestamp->__get(0);
+            				}
+HXLINE( 149)				return ( ( ::borogove::ChatMessageBuilder)(_gthis->contextHandler(builder,stanza)) );
+            			}
+            			HX_END_LOCAL_FUNC2(return)
+
+            			HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_69_fetchNext)
+HXLINE(  70)			 ::borogove::Stanza message = ( ( ::borogove::Stanza)(event->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic)) );
+HXLINE(  71)			::String from;
+HXDLIN(  71)			if (::Reflect_obj::hasField(message->attr,HX_("from",6a,a5,c2,43))) {
+HXLINE(  71)				from = ( (::String)(::Reflect_obj::field(message->attr,HX_("from",6a,a5,c2,43))) );
             			}
             			else {
-HXLINE(  77)				from = _gthis->client->accountId();
+HXLINE(  71)				from = _gthis->client->accountId();
             			}
-HXLINE(  78)			if ((from != _gthis->serviceJID)) {
-HXLINE(  79)				return ::borogove::EventResult_obj::EventUnhandled_dyn();
+HXLINE(  72)			if ((from != _gthis->serviceJID)) {
+HXLINE(  73)				return ::borogove::EventResult_obj::EventUnhandled_dyn();
             			}
-HXLINE(  81)			 ::borogove::Stanza result = message->getChild(HX_("result",dd,68,84,08),query->xmlns);
-HXLINE(  82)			bool eventToken;
-HXDLIN(  82)			if (::hx::IsNotNull( result )) {
-HXLINE(  82)				::String eventToken1 = ( (::String)(::Reflect_obj::field(result->attr,HX_("queryid",e3,b8,e9,95))) );
-HXDLIN(  82)				eventToken = (eventToken1 != query->queryId);
+HXLINE(  75)			 ::borogove::Stanza result = message->getChild(HX_("result",dd,68,84,08),query->xmlns);
+HXLINE(  76)			bool eventToken;
+HXDLIN(  76)			if (::hx::IsNotNull( result )) {
+HXLINE(  76)				::String eventToken1 = ( (::String)(::Reflect_obj::field(result->attr,HX_("queryid",e3,b8,e9,95))) );
+HXDLIN(  76)				eventToken = (eventToken1 != query->queryId);
             			}
             			else {
-HXLINE(  82)				eventToken = true;
+HXLINE(  76)				eventToken = true;
             			}
-HXDLIN(  82)			if (eventToken) {
-HXLINE(  83)				return ::borogove::EventResult_obj::EventUnhandled_dyn();
+HXDLIN(  76)			if (eventToken) {
+HXLINE(  77)				return ::borogove::EventResult_obj::EventUnhandled_dyn();
             			}
-HXLINE(  85)			 ::borogove::Stanza originalMessage = result->findChild(HX_("{urn:xmpp:forward:0}forwarded/{jabber:client}message",1e,de,1d,61));
-HXLINE(  86)			if (::hx::IsNull( originalMessage )) {
-HXLINE(  87)				return ::borogove::EventResult_obj::EventHandled_dyn();
+HXLINE(  79)			_gthis->progress++;
+HXLINE(  80)			 ::borogove::Stanza originalMessage = result->findChild(HX_("{urn:xmpp:forward:0}forwarded/{jabber:client}message",1e,de,1d,61));
+HXLINE(  81)			if (::hx::IsNull( originalMessage )) {
+HXLINE(  82)				return ::borogove::EventResult_obj::EventHandled_dyn();
             			}
-HXLINE(  89)			::Array< ::String > timestamp = ::Array_obj< ::String >::__new(1)->init(0,result->findText(HX_("{urn:xmpp:forward:0}forwarded/{urn:xmpp:delay}delay@stamp",9d,33,43,e7)));
-HXLINE(  90)			if (::hx::IsNull( timestamp->__get(0) )) {
-HXLINE(  91)				::haxe::Log_obj::trace(HX_("MAM result with no timestamp",15,bb,83,7d), ::Dynamic(::hx::Anon_obj::Create(5)
+HXLINE(  84)			_gthis->sortA = ::_FractionalIndexing::FractionalIndexing_Fields__obj::between(_gthis->sortA,_gthis->sortB,HX_(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",6f,61,48,0a));
+HXLINE(  85)			::Array< ::String > timestamp = ::Array_obj< ::String >::__new(1)->init(0,result->findText(HX_("{urn:xmpp:forward:0}forwarded/{urn:xmpp:delay}delay@stamp",9d,33,43,e7)));
+HXLINE(  86)			if (::hx::IsNull( timestamp->__get(0) )) {
+HXLINE(  87)				::haxe::Log_obj::trace(HX_("MAM result with no timestamp",15,bb,83,7d), ::Dynamic(::hx::Anon_obj::Create(5)
             					->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.MessageSync",d5,52,9a,8d))
             					->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,result))
             					->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("fetchNext",4d,6a,ad,1f))
             					->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/MessageSync.hx",ca,42,0e,c4))
-            					->setFixed(4,HX_("lineNumber",dd,81,22,76),91)));
+            					->setFixed(4,HX_("lineNumber",dd,81,22,76),87)));
             			}
             			else {
             				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::Array< int >,counterSameTime,::Array< ::String >,previousMessageTime) HXARGC(1)
             				::String _hx_run( ::EReg ereg){
-            					HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_94_fetchNext)
-HXLINE(  95)					bool eventToken;
-HXDLIN(  95)					if (::hx::IsNotNull( ereg->matched(2) )) {
-HXLINE(  95)						eventToken = (ereg->matched(2) == HX_(".000",c2,66,8c,1e));
+            					HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_90_fetchNext)
+HXLINE(  91)					bool eventToken;
+HXDLIN(  91)					if (::hx::IsNotNull( ereg->matched(2) )) {
+HXLINE(  91)						eventToken = (ereg->matched(2) == HX_(".000",c2,66,8c,1e));
             					}
             					else {
-HXLINE(  95)						eventToken = true;
+HXLINE(  91)						eventToken = true;
             					}
-HXDLIN(  95)					if (eventToken) {
-HXLINE(  96)						::String eventToken1 = ereg->matched(1);
-HXDLIN(  96)						if ((eventToken1 == previousMessageTime->__get(0))) {
-HXLINE(  97)							counterSameTime[0]++;
+HXDLIN(  91)					if (eventToken) {
+HXLINE(  92)						::String eventToken1 = ereg->matched(1);
+HXDLIN(  92)						if ((eventToken1 == previousMessageTime->__get(0))) {
+HXLINE(  93)							counterSameTime[0]++;
             						}
             						else {
-HXLINE(  99)							previousMessageTime[0] = ereg->matched(1);
-HXLINE( 100)							counterSameTime[0] = 1;
+HXLINE(  95)							previousMessageTime[0] = ereg->matched(1);
+HXLINE(  96)							counterSameTime[0] = 1;
             						}
-HXLINE( 103)						::String eventToken2 = (ereg->matched(1) + HX_(".",2e,00,00,00));
-HXDLIN( 103)						return (eventToken2 + ::StringTools_obj::lpad(::Std_obj::string(counterSameTime->__get(0)),HX_("0",30,00,00,00),3));
+HXLINE(  99)						::String eventToken2 = (ereg->matched(1) + HX_(".",2e,00,00,00));
+HXDLIN(  99)						return (eventToken2 + ::StringTools_obj::lpad(::Std_obj::string(counterSameTime->__get(0)),HX_("0",30,00,00,00),3));
             					}
-HXLINE( 106)					return ereg->matched(0);
+HXLINE( 102)					return ereg->matched(0);
             				}
             				HX_END_LOCAL_FUNC1(return)
 
-HXLINE(  94)				::Array< ::String > timestamp1 = timestamp;
-HXDLIN(  94)				 ::EReg eventToken2 =  ::EReg_obj::__alloc( HX_CTX ,HX_("([0-9][0-9]:[0-9][0-9]:[0-9][0-9])(\\.[0-9][0-9][0-9])?",99,64,fa,66),HX_("",00,00,00,00));
-HXDLIN(  94)				timestamp1[0] = eventToken2->map(timestamp->__get(0), ::Dynamic(new _hx_Closure_0(counterSameTime,previousMessageTime)));
+HXLINE(  90)				::Array< ::String > timestamp1 = timestamp;
+HXDLIN(  90)				 ::EReg eventToken2 =  ::EReg_obj::__alloc( HX_CTX ,HX_("([0-9][0-9]:[0-9][0-9]:[0-9][0-9])(\\.[0-9][0-9][0-9])?",99,64,fa,66),HX_("",00,00,00,00));
+HXDLIN(  90)				timestamp1[0] = eventToken2->map(timestamp->__get(0), ::Dynamic(new _hx_Closure_0(counterSameTime,previousMessageTime)));
             			}
-HXLINE( 110)			::Array< ::Dynamic> jmiChildren = originalMessage->allTags(null(),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
-HXLINE( 111)			if ((jmiChildren->length > 0)) {
-HXLINE( 112)				::Dynamic this1 = _gthis->jmi;
-HXDLIN( 112)				( ( ::haxe::ds::StringMap)(this1) )->set(( (::String)(::Reflect_obj::field(jmiChildren->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("id",db,5b,00,00))) ),originalMessage);
+HXLINE( 106)			::Array< ::Dynamic> jmiChildren = originalMessage->allTags(null(),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
+HXLINE( 107)			if ((jmiChildren->length > 0)) {
+HXLINE( 108)				::Dynamic this1 = _gthis->jmi;
+HXDLIN( 108)				( ( ::haxe::ds::StringMap)(this1) )->set(( (::String)(::Reflect_obj::field(jmiChildren->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("id",db,5b,00,00))) ),originalMessage);
             			}
-HXLINE( 115)			if (originalMessage->hasChild(HX_("encrypted",04,fa,43,6c),::borogove::NS_obj::OMEMO)) {
-HXLINE( 141)				return ::borogove::EventResult_obj::EventHandled_dyn();
-            			}
-            			else {
-            				HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_1, ::borogove::MessageSync,_gthis,::Array< ::String >,timestamp, ::borogove::Stanza,result) HXARGC(2)
-            				 ::borogove::ChatMessageBuilder _hx_run( ::borogove::ChatMessageBuilder builder, ::borogove::Stanza stanza){
-            					HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_145_fetchNext)
-HXLINE( 146)					builder->serverId = ( (::String)(::Reflect_obj::field(result->attr,HX_("id",db,5b,00,00))) );
-HXLINE( 147)					builder->serverIdBy = _gthis->serviceJID;
-HXLINE( 148)					bool msg;
-HXDLIN( 148)					if (::hx::IsNotNull( timestamp->__get(0) )) {
-HXLINE( 148)						msg = ::hx::IsNull( builder->timestamp );
-            					}
-            					else {
-HXLINE( 148)						msg = false;
-            					}
-HXDLIN( 148)					if (msg) {
-HXLINE( 148)						builder->timestamp = timestamp->__get(0);
-            					}
-HXLINE( 149)					return ( ( ::borogove::ChatMessageBuilder)(_gthis->contextHandler(builder,stanza)) );
-            				}
-            				HX_END_LOCAL_FUNC2(return)
-
-HXLINE( 143)				 ::Dynamic eventToken3 = ::haxe::Log_obj::trace;
-HXDLIN( 143)				::String eventToken4 = (HX_("MAM: Processing non-OMEMO message from ",f8,ed,2b,0d) + ( (::String)(::Reflect_obj::field(originalMessage->attr,HX_("from",6a,a5,c2,43))) ));
-HXDLIN( 143)				eventToken3(eventToken4,::hx::SourceInfo(HX_("borogove/MessageSync.hx",ca,42,0e,c4),143,HX_("borogove.MessageSync",d5,52,9a,8d),HX_("fetchNext",4d,6a,ad,1f)));
-HXLINE( 145)				 ::borogove::Message msg = ::borogove::Message_obj::fromStanza(originalMessage,_gthis->client->jid, ::Dynamic(new _hx_Closure_1(_gthis,timestamp,result)),null());
-HXLINE( 152)				::Array< ::Dynamic> promisedMessages1 = promisedMessages;
-HXDLIN( 152)				promisedMessages1->push(::thenshim::_Promise::Promise_Impl__obj::resolve(msg));
-            			}
-HXLINE( 156)			return ::borogove::EventResult_obj::EventHandled_dyn();
+HXLINE( 142)			 ::Dynamic eventToken3 = ::haxe::Log_obj::trace;
+HXDLIN( 142)			::String eventToken4 = (HX_("MAM: Processing non-OMEMO message from ",f8,ed,2b,0d) + ( (::String)(::Reflect_obj::field(originalMessage->attr,HX_("from",6a,a5,c2,43))) ));
+HXDLIN( 142)			eventToken3(eventToken4,::hx::SourceInfo(HX_("borogove/MessageSync.hx",ca,42,0e,c4),142,HX_("borogove.MessageSync",d5,52,9a,8d),HX_("fetchNext",4d,6a,ad,1f)));
+HXLINE( 144)			 ::borogove::Message msg = ::borogove::Message_obj::fromStanza(originalMessage,_gthis->client->jid, ::Dynamic(new _hx_Closure_1(_gthis,timestamp,result)),null(),null());
+HXLINE( 152)			::Array< ::Dynamic> promisedMessages1 = promisedMessages;
+HXDLIN( 152)			promisedMessages1->push(::thenshim::_Promise::Promise_Impl__obj::resolve(msg));
+HXLINE( 154)			return ::borogove::EventResult_obj::EventHandled_dyn();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_4, ::borogove::MessageSync,_gthis, ::borogove::queries::MAMQuery,query,int,eventToken,::Array< ::Dynamic>,promisedMessages) HXARGC(0)
             		void _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_158_fetchNext)
-HXLINE( 159)			_gthis->stream->removeEventListener(eventToken);
-HXLINE( 160)			 ::Dynamic result = query->getResult();
-HXLINE( 161)			if (::hx::IsNull( result )) {
-HXLINE( 162)				::haxe::Log_obj::trace(HX_("Error from MAM, stopping sync",b8,c9,46,be),::hx::SourceInfo(HX_("borogove/MessageSync.hx",ca,42,0e,c4),162,HX_("borogove.MessageSync",d5,52,9a,8d),HX_("fetchNext",4d,6a,ad,1f)));
-HXLINE( 163)				_gthis->complete = true;
-HXLINE( 164)				if (::hx::IsNotNull( _gthis->errorHandler )) {
-HXLINE( 165)					_gthis->errorHandler(query->responseStanza);
+            			HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_156_fetchNext)
+HXLINE( 157)			_gthis->stream->removeEventListener(eventToken);
+HXLINE( 158)			 ::Dynamic result = query->getResult();
+HXLINE( 159)			if (::hx::IsNull( result )) {
+HXLINE( 160)				::haxe::Log_obj::trace(HX_("Error from MAM, stopping sync",b8,c9,46,be),::hx::SourceInfo(HX_("borogove/MessageSync.hx",ca,42,0e,c4),160,HX_("borogove.MessageSync",d5,52,9a,8d),HX_("fetchNext",4d,6a,ad,1f)));
+HXLINE( 161)				_gthis->complete = true;
+HXLINE( 162)				if (::hx::IsNotNull( _gthis->errorHandler )) {
+HXLINE( 163)					_gthis->errorHandler(query->responseStanza);
             				}
             			}
             			else {
-HXLINE( 167)				_gthis->complete = ( (bool)(result->__Field(HX_("complete",b9,00,c8,7f),::hx::paccDynamic)) );
-HXLINE( 168)				_gthis->lastPage = result->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic);
+HXLINE( 165)				_gthis->complete = ( (bool)(result->__Field(HX_("complete",b9,00,c8,7f),::hx::paccDynamic)) );
+HXLINE( 166)				_gthis->lastPage = result->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic);
             			}
-HXLINE( 170)			bool _hx_tmp;
-HXDLIN( 170)			if (::hx::IsNull( result )) {
-HXLINE( 170)				_hx_tmp = ::hx::IsNull( _gthis->errorHandler );
+HXLINE( 168)			bool _hx_tmp;
+HXDLIN( 168)			if (::hx::IsNull( result )) {
+HXLINE( 168)				_hx_tmp = ::hx::IsNull( _gthis->errorHandler );
             			}
             			else {
-HXLINE( 170)				_hx_tmp = true;
+HXLINE( 168)				_hx_tmp = true;
             			}
-HXDLIN( 170)			if (_hx_tmp) {
+HXDLIN( 168)			if (_hx_tmp) {
             				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_3, ::borogove::MessageSync,_gthis) HXARGC(1)
             				void _hx_run(::Array< ::Dynamic> messages){
-            					HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_172_fetchNext)
-HXLINE( 172)					_gthis->handler( ::Dynamic(::hx::Anon_obj::Create(2)
+            					HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_170_fetchNext)
+HXLINE( 170)					_gthis->handler( ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("messages",cc,d8,fd,34),messages)
             						->setFixed(1,HX_("sync",5b,ba,5f,4c),_gthis)));
             				}
             				HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 171)				::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(promisedMessages), ::Dynamic(new _hx_Closure_3(_gthis)),null());
+HXLINE( 169)				::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(promisedMessages), ::Dynamic(new _hx_Closure_3(_gthis)),null());
             			}
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_48_fetchNext)
-HXDLIN(  48)		 ::borogove::MessageSync _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(  49)		if (::hx::IsNull( this->handler )) {
-HXLINE(  50)			HX_STACK_DO_THROW( ::haxe::Exception_obj::__alloc( HX_CTX ,HX_("Attempt to fetch messages, but no handler has been set",72,e3,58,24),null(),null()));
-            		}
-HXLINE(  52)		if (this->complete) {
-HXLINE(  53)			HX_STACK_DO_THROW( ::haxe::Exception_obj::__alloc( HX_CTX ,HX_("Attempt to fetch messages, but already complete",f8,43,a7,37),null(),null()));
+            	HX_GC_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_50_fetchNext)
+HXDLIN(  50)		 ::borogove::MessageSync _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(  51)		if (::hx::IsNull( this->handler )) {
+HXLINE(  52)			HX_STACK_DO_THROW( ::haxe::Exception_obj::__alloc( HX_CTX ,HX_("Attempt to fetch messages, but no handler has been set",72,e3,58,24),null(),null()));
             		}
-HXLINE(  55)		::Array< ::Dynamic> promisedMessages = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(  56)		if (::hx::IsNull( this->lastPage )) {
-HXLINE(  57)			bool _hx_tmp;
-HXDLIN(  57)			if ((this->newestPageFirst == true)) {
-HXLINE(  57)				if (::hx::IsNotNull( this->filter->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic) )) {
-HXLINE(  57)					if (::hx::IsNull(  ::Dynamic(this->filter->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic))->__Field(HX_("before",7f,54,32,9a),::hx::paccDynamic) )) {
-HXLINE(  57)						_hx_tmp = ::hx::IsNull(  ::Dynamic(this->filter->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic))->__Field(HX_("after",1c,66,a2,1d),::hx::paccDynamic) );
-            					}
-            					else {
-HXLINE(  57)						_hx_tmp = false;
-            					}
-            				}
-            				else {
-HXLINE(  57)					_hx_tmp = true;
-            				}
-            			}
-            			else {
-HXLINE(  57)				_hx_tmp = false;
-            			}
-HXDLIN(  57)			if (_hx_tmp) {
-HXLINE(  58)				if (::hx::IsNull( this->filter->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic) )) {
-HXLINE(  59)					this->filter->__SetField(HX_("page",4f,da,51,4a), ::Dynamic(::hx::Anon_obj::Create(0)),::hx::paccDynamic);
-            				}
-HXLINE(  60)				 ::Dynamic(this->filter->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic))->__SetField(HX_("before",7f,54,32,9a),HX_("",00,00,00,00),::hx::paccDynamic);
-            			}
+HXLINE(  54)		if (this->complete) {
+HXLINE(  55)			HX_STACK_DO_THROW( ::haxe::Exception_obj::__alloc( HX_CTX ,HX_("Attempt to fetch messages, but already complete",f8,43,a7,37),null(),null()));
             		}
-            		else {
-HXLINE(  63)			if (::hx::IsNull( this->filter->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic) )) {
-HXLINE(  64)				this->filter->__SetField(HX_("page",4f,da,51,4a), ::Dynamic(::hx::Anon_obj::Create(0)),::hx::paccDynamic);
+HXLINE(  57)		::Array< ::Dynamic> promisedMessages = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  58)		if (::hx::IsNotNull( this->lastPage )) {
+HXLINE(  59)			if (::hx::IsNull( this->filter->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic) )) {
+HXLINE(  59)				this->filter->__SetField(HX_("page",4f,da,51,4a), ::Dynamic(::hx::Anon_obj::Create(0)),::hx::paccDynamic);
             			}
-HXLINE(  65)			if ((this->newestPageFirst == true)) {
-HXLINE(  66)				 ::Dynamic(this->filter->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic))->__SetField(HX_("before",7f,54,32,9a),this->lastPage->__Field(HX_("first",30,78,9d,00),::hx::paccDynamic),::hx::paccDynamic);
+HXLINE(  60)			if (::hx::IsNull(  ::Dynamic(this->filter->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic))->__Field(HX_("before",7f,54,32,9a),::hx::paccDynamic) )) {
+HXLINE(  61)				 ::Dynamic(this->filter->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic))->__SetField(HX_("after",1c,66,a2,1d),this->lastPage->__Field(HX_("last",56,0a,ad,47),::hx::paccDynamic),::hx::paccDynamic);
             			}
             			else {
-HXLINE(  68)				 ::Dynamic(this->filter->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic))->__SetField(HX_("after",1c,66,a2,1d),this->lastPage->__Field(HX_("last",56,0a,ad,47),::hx::paccDynamic),::hx::paccDynamic);
+HXLINE(  63)				 ::Dynamic(this->filter->__Field(HX_("page",4f,da,51,4a),::hx::paccDynamic))->__SetField(HX_("before",7f,54,32,9a),this->lastPage->__Field(HX_("first",30,78,9d,00),::hx::paccDynamic),::hx::paccDynamic);
             			}
             		}
-HXLINE(  71)		 ::borogove::queries::MAMQuery query =  ::borogove::queries::MAMQuery_obj::__alloc( HX_CTX ,this->filter,this->serviceJID);
-HXLINE(  72)		::Array< ::String > previousMessageTime = ::Array_obj< ::String >::fromData( _hx_array_data_8d9a52d5_8,1);
-HXLINE(  73)		::Array< int > counterSameTime = ::Array_obj< int >::fromData( _hx_array_data_8d9a52d5_9,1);
-HXLINE(  74)		int eventToken = this->stream->on(HX_("message",c7,35,11,9a), ::Dynamic(new _hx_Closure_2(counterSameTime,_gthis,query,previousMessageTime,promisedMessages)));
-HXLINE( 158)		query->onFinished( ::Dynamic(new _hx_Closure_4(_gthis,query,eventToken,promisedMessages)));
-HXLINE( 179)		this->client->sendQuery(query);
+HXLINE(  66)		 ::borogove::queries::MAMQuery query =  ::borogove::queries::MAMQuery_obj::__alloc( HX_CTX ,this->filter,this->serviceJID);
+HXLINE(  67)		::Array< ::String > previousMessageTime = ::Array_obj< ::String >::fromData( _hx_array_data_8d9a52d5_8,1);
+HXLINE(  68)		::Array< int > counterSameTime = ::Array_obj< int >::fromData( _hx_array_data_8d9a52d5_9,1);
+HXLINE(  69)		int eventToken = this->stream->on(HX_("message",c7,35,11,9a), ::Dynamic(new _hx_Closure_2(counterSameTime,_gthis,query,previousMessageTime,promisedMessages)));
+HXLINE( 156)		query->onFinished( ::Dynamic(new _hx_Closure_4(_gthis,query,eventToken,promisedMessages)));
+HXLINE( 177)		this->client->sendQuery(query);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(MessageSync_obj,fetchNext,(void))
 
 bool MessageSync_obj::hasMore(){
-            	HX_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_183_hasMore)
-HXDLIN( 183)		return !(this->complete);
+            	HX_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_181_hasMore)
+HXDLIN( 181)		return !(this->complete);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(MessageSync_obj,hasMore,return )
 
 void MessageSync_obj::addContext( ::Dynamic handler){
-            	HX_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_187_addContext)
-HXDLIN( 187)		this->contextHandler = handler;
+            	HX_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_185_addContext)
+HXDLIN( 185)		this->contextHandler = handler;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(MessageSync_obj,addContext,(void))
 
 void MessageSync_obj::onMessages( ::Dynamic handler){
-            	HX_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_191_onMessages)
-HXDLIN( 191)		this->handler = handler;
+            	HX_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_189_onMessages)
+HXDLIN( 189)		this->handler = handler;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(MessageSync_obj,onMessages,(void))
 
 void MessageSync_obj::onError( ::Dynamic handler){
-            	HX_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_195_onError)
-HXDLIN( 195)		this->errorHandler = handler;
+            	HX_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_193_onError)
+HXDLIN( 193)		this->errorHandler = handler;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(MessageSync_obj,onError,(void))
 
-void MessageSync_obj::setNewestPageFirst(bool newestPageFirst){
-            	HX_STACKFRAME(&_hx_pos_b6f42aa0d664cfb6_199_setNewestPageFirst)
-HXDLIN( 199)		this->newestPageFirst = newestPageFirst;
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC1(MessageSync_obj,setNewestPageFirst,(void))
 
-
-::hx::ObjectPtr< MessageSync_obj > MessageSync_obj::__new( ::borogove::Client client, ::borogove::GenericStream stream, ::Dynamic filter,::String serviceJID) {
+::hx::ObjectPtr< MessageSync_obj > MessageSync_obj::__new( ::borogove::Client client, ::borogove::GenericStream stream, ::Dynamic filter,::String sortA,::String sortB,::String serviceJID) {
 	::hx::ObjectPtr< MessageSync_obj > __this = new MessageSync_obj();
-	__this->__construct(client,stream,filter,serviceJID);
+	__this->__construct(client,stream,filter,sortA,sortB,serviceJID);
 	return __this;
 }
 
-::hx::ObjectPtr< MessageSync_obj > MessageSync_obj::__alloc(::hx::Ctx *_hx_ctx, ::borogove::Client client, ::borogove::GenericStream stream, ::Dynamic filter,::String serviceJID) {
+::hx::ObjectPtr< MessageSync_obj > MessageSync_obj::__alloc(::hx::Ctx *_hx_ctx, ::borogove::Client client, ::borogove::GenericStream stream, ::Dynamic filter,::String sortA,::String sortB,::String serviceJID) {
 	MessageSync_obj *__this = (MessageSync_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(MessageSync_obj), true, "borogove.MessageSync"));
 	*(void **)__this = MessageSync_obj::_hx_vtable;
-	__this->__construct(client,stream,filter,serviceJID);
+	__this->__construct(client,stream,filter,sortA,sortB,serviceJID);
 	return __this;
 }
 
@@ -410,10 +374,11 @@ void MessageSync_obj::__Mark(HX_MARK_PARAMS)
 	HX_MARK_MEMBER_NAME(handler,"handler");
 	HX_MARK_MEMBER_NAME(contextHandler,"contextHandler");
 	HX_MARK_MEMBER_NAME(errorHandler,"errorHandler");
+	HX_MARK_MEMBER_NAME(sortA,"sortA");
+	HX_MARK_MEMBER_NAME(sortB,"sortB");
 	HX_MARK_MEMBER_NAME(lastPage,"lastPage");
 	HX_MARK_MEMBER_NAME(progress,"progress");
 	HX_MARK_MEMBER_NAME(complete,"complete");
-	HX_MARK_MEMBER_NAME(newestPageFirst,"newestPageFirst");
 	HX_MARK_MEMBER_NAME(jmi,"jmi");
 	HX_MARK_END_CLASS();
 }
@@ -427,10 +392,11 @@ void MessageSync_obj::__Visit(HX_VISIT_PARAMS)
 	HX_VISIT_MEMBER_NAME(handler,"handler");
 	HX_VISIT_MEMBER_NAME(contextHandler,"contextHandler");
 	HX_VISIT_MEMBER_NAME(errorHandler,"errorHandler");
+	HX_VISIT_MEMBER_NAME(sortA,"sortA");
+	HX_VISIT_MEMBER_NAME(sortB,"sortB");
 	HX_VISIT_MEMBER_NAME(lastPage,"lastPage");
 	HX_VISIT_MEMBER_NAME(progress,"progress");
 	HX_VISIT_MEMBER_NAME(complete,"complete");
-	HX_VISIT_MEMBER_NAME(newestPageFirst,"newestPageFirst");
 	HX_VISIT_MEMBER_NAME(jmi,"jmi");
 }
 
@@ -440,6 +406,10 @@ void MessageSync_obj::__Visit(HX_VISIT_PARAMS)
 	case 3:
 		if (HX_FIELD_EQ(inName,"jmi") ) { return ::hx::Val( jmi ); }
 		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"sortA") ) { return ::hx::Val( sortA ); }
+		if (HX_FIELD_EQ(inName,"sortB") ) { return ::hx::Val( sortB ); }
+		break;
 	case 6:
 		if (HX_FIELD_EQ(inName,"client") ) { return ::hx::Val( client ); }
 		if (HX_FIELD_EQ(inName,"stream") ) { return ::hx::Val( stream ); }
@@ -468,12 +438,6 @@ void MessageSync_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 14:
 		if (HX_FIELD_EQ(inName,"contextHandler") ) { return ::hx::Val( contextHandler ); }
-		break;
-	case 15:
-		if (HX_FIELD_EQ(inName,"newestPageFirst") ) { return ::hx::Val( newestPageFirst ); }
-		break;
-	case 18:
-		if (HX_FIELD_EQ(inName,"setNewestPageFirst") ) { return ::hx::Val( setNewestPageFirst_dyn() ); }
 	}
 	return super::__Field(inName,inCallProp);
 }
@@ -484,6 +448,10 @@ void MessageSync_obj::__Visit(HX_VISIT_PARAMS)
 	case 3:
 		if (HX_FIELD_EQ(inName,"jmi") ) { jmi=inValue.Cast<  ::haxe::ds::StringMap >(); return inValue; }
 		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"sortA") ) { sortA=inValue.Cast< ::String >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"sortB") ) { sortB=inValue.Cast< ::String >(); return inValue; }
+		break;
 	case 6:
 		if (HX_FIELD_EQ(inName,"client") ) { client=inValue.Cast<  ::borogove::Client >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"stream") ) { stream=inValue.Cast<  ::borogove::GenericStream >(); return inValue; }
@@ -505,9 +473,6 @@ void MessageSync_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 14:
 		if (HX_FIELD_EQ(inName,"contextHandler") ) { contextHandler=inValue.Cast<  ::Dynamic >(); return inValue; }
-		break;
-	case 15:
-		if (HX_FIELD_EQ(inName,"newestPageFirst") ) { newestPageFirst=inValue.Cast< bool >(); return inValue; }
 	}
 	return super::__SetField(inName,inValue,inCallProp);
 }
@@ -518,10 +483,11 @@ void MessageSync_obj::__GetFields(Array< ::String> &outFields)
 	outFields->push(HX_("stream",80,14,2d,11));
 	outFields->push(HX_("filter",b8,1f,35,85));
 	outFields->push(HX_("serviceJID",90,19,2d,7d));
+	outFields->push(HX_("sortA",23,4b,ca,80));
+	outFields->push(HX_("sortB",24,4b,ca,80));
 	outFields->push(HX_("lastPage",c5,f3,9a,dd));
 	outFields->push(HX_("progress",ad,f7,2a,86));
 	outFields->push(HX_("complete",b9,00,c8,7f));
-	outFields->push(HX_("newestPageFirst",9b,ce,b0,7d));
 	outFields->push(HX_("jmi",46,ce,50,00));
 	super::__GetFields(outFields);
 };
@@ -535,10 +501,11 @@ static ::hx::StorageInfo MessageSync_obj_sMemberStorageInfo[] = {
 	{::hx::fsObject /*  ::Dynamic */ ,(int)offsetof(MessageSync_obj,handler),HX_("handler",ca,af,d5,45)},
 	{::hx::fsObject /*  ::Dynamic */ ,(int)offsetof(MessageSync_obj,contextHandler),HX_("contextHandler",9b,6d,14,e9)},
 	{::hx::fsObject /*  ::Dynamic */ ,(int)offsetof(MessageSync_obj,errorHandler),HX_("errorHandler",e2,94,05,f7)},
+	{::hx::fsString,(int)offsetof(MessageSync_obj,sortA),HX_("sortA",23,4b,ca,80)},
+	{::hx::fsString,(int)offsetof(MessageSync_obj,sortB),HX_("sortB",24,4b,ca,80)},
 	{::hx::fsObject /*  ::Dynamic */ ,(int)offsetof(MessageSync_obj,lastPage),HX_("lastPage",c5,f3,9a,dd)},
 	{::hx::fsInt,(int)offsetof(MessageSync_obj,progress),HX_("progress",ad,f7,2a,86)},
 	{::hx::fsBool,(int)offsetof(MessageSync_obj,complete),HX_("complete",b9,00,c8,7f)},
-	{::hx::fsBool,(int)offsetof(MessageSync_obj,newestPageFirst),HX_("newestPageFirst",9b,ce,b0,7d)},
 	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(MessageSync_obj,jmi),HX_("jmi",46,ce,50,00)},
 	{ ::hx::fsUnknown, 0, null()}
 };
@@ -553,17 +520,17 @@ static ::String MessageSync_obj_sMemberFields[] = {
 	HX_("handler",ca,af,d5,45),
 	HX_("contextHandler",9b,6d,14,e9),
 	HX_("errorHandler",e2,94,05,f7),
+	HX_("sortA",23,4b,ca,80),
+	HX_("sortB",24,4b,ca,80),
 	HX_("lastPage",c5,f3,9a,dd),
 	HX_("progress",ad,f7,2a,86),
 	HX_("complete",b9,00,c8,7f),
-	HX_("newestPageFirst",9b,ce,b0,7d),
 	HX_("jmi",46,ce,50,00),
 	HX_("fetchNext",4d,6a,ad,1f),
 	HX_("hasMore",0f,00,a5,17),
 	HX_("addContext",ce,c1,01,81),
 	HX_("onMessages",0b,ad,b4,12),
 	HX_("onError",29,6a,67,09),
-	HX_("setNewestPageFirst",19,a1,25,0d),
 	::String(null()) };
 
 ::hx::Class MessageSync_obj::__mClass;
diff --git a/Sources/c_borogove/src/borogove/Notification.cpp b/Sources/c_borogove/src/borogove/Notification.cpp
index d6d242c..c1a6437 100644
--- a/Sources/c_borogove/src/borogove/Notification.cpp
+++ b/Sources/c_borogove/src/borogove/Notification.cpp
@@ -10,9 +10,15 @@
 #ifndef INCLUDED_borogove_ChatMessage
 #include <borogove/ChatMessage.h>
 #endif
+#ifndef INCLUDED_borogove_Html
+#include <borogove/Html.h>
+#endif
 #ifndef INCLUDED_borogove_JID
 #include <borogove/JID.h>
 #endif
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
+#endif
 #ifndef INCLUDED_borogove_Notification
 #include <borogove/Notification.h>
 #endif
@@ -21,18 +27,18 @@
 #endif
 
 HX_DEFINE_STACK_FRAME(_hx_pos_44a57d84c61de0e9_67_new,"borogove.Notification","new",0x9a361d6a,"borogove.Notification.new","borogove/Notification.hx",67,0x6f7c2665)
-HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_450_title__fromC,"borogove.Notification","title__fromC",0xca367f97,"borogove.Notification.title__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_450_body__fromC,"borogove.Notification","body__fromC",0xbb65d521,"borogove.Notification.body__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_450_accountId__fromC,"borogove.Notification","accountId__fromC",0x39085047,"borogove.Notification.accountId__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_450_chatId__fromC,"borogove.Notification","chatId__fromC",0x0c06b990,"borogove.Notification.chatId__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_450_senderId__fromC,"borogove.Notification","senderId__fromC",0x4f6fc393,"borogove.Notification.senderId__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_450_messageId__fromC,"borogove.Notification","messageId__fromC",0x0db223ed,"borogove.Notification.messageId__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_450_type__fromC,"borogove.Notification","type__fromC",0xb9521009,"borogove.Notification.type__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_450_callStatus__fromC,"borogove.Notification","callStatus__fromC",0xe429aa93,"borogove.Notification.callStatus__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_450_callSid__fromC,"borogove.Notification","callSid__fromC",0x6a29589f,"borogove.Notification.callSid__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_450_imageUri__fromC,"borogove.Notification","imageUri__fromC",0xebb481d2,"borogove.Notification.imageUri__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_450_lang__fromC,"borogove.Notification","lang__fromC",0x77e58b55,"borogove.Notification.lang__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_450_timestamp__fromC,"borogove.Notification","timestamp__fromC",0xf5425719,"borogove.Notification.timestamp__fromC","HaxeCBridge.hx",450,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_478_title__fromC,"borogove.Notification","title__fromC",0xca367f97,"borogove.Notification.title__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_478_body__fromC,"borogove.Notification","body__fromC",0xbb65d521,"borogove.Notification.body__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_478_accountId__fromC,"borogove.Notification","accountId__fromC",0x39085047,"borogove.Notification.accountId__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_478_chatId__fromC,"borogove.Notification","chatId__fromC",0x0c06b990,"borogove.Notification.chatId__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_478_senderId__fromC,"borogove.Notification","senderId__fromC",0x4f6fc393,"borogove.Notification.senderId__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_478_messageId__fromC,"borogove.Notification","messageId__fromC",0x0db223ed,"borogove.Notification.messageId__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_478_type__fromC,"borogove.Notification","type__fromC",0xb9521009,"borogove.Notification.type__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_478_callStatus__fromC,"borogove.Notification","callStatus__fromC",0xe429aa93,"borogove.Notification.callStatus__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_478_callSid__fromC,"borogove.Notification","callSid__fromC",0x6a29589f,"borogove.Notification.callSid__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_478_imageUri__fromC,"borogove.Notification","imageUri__fromC",0xebb481d2,"borogove.Notification.imageUri__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_478_lang__fromC,"borogove.Notification","lang__fromC",0x77e58b55,"borogove.Notification.lang__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_a36c4e022559a091_478_timestamp__fromC,"borogove.Notification","timestamp__fromC",0xf5425719,"borogove.Notification.timestamp__fromC","HaxeCBridge.hx",478,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_44a57d84c61de0e9_83_fromChatMessage,"borogove.Notification","fromChatMessage",0xe6bd348f,"borogove.Notification.fromChatMessage","borogove/Notification.hx",83,0x6f7c2665)
 HX_LOCAL_STACK_FRAME(_hx_pos_44a57d84c61de0e9_109_fromThinStanza,"borogove.Notification","fromThinStanza",0x4d440e6e,"borogove.Notification.fromThinStanza","borogove/Notification.hx",109,0x6f7c2665)
 HX_LOCAL_STACK_FRAME(_hx_pos_44a57d84c61de0e9_16_boot,"borogove.Notification","boot",0x4d3c9fe8,"borogove.Notification.boot","borogove/Notification.hx",16,0x6f7c2665)
@@ -70,96 +76,96 @@ bool Notification_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String Notification_obj::title__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_450_title__fromC)
-HXDLIN( 450)		return this->title;
+            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_478_title__fromC)
+HXDLIN( 478)		return this->title;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Notification_obj,title__fromC,return )
 
 ::String Notification_obj::body__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_450_body__fromC)
-HXDLIN( 450)		return this->body;
+            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_478_body__fromC)
+HXDLIN( 478)		return this->body;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Notification_obj,body__fromC,return )
 
 ::String Notification_obj::accountId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_450_accountId__fromC)
-HXDLIN( 450)		return this->accountId;
+            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_478_accountId__fromC)
+HXDLIN( 478)		return this->accountId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Notification_obj,accountId__fromC,return )
 
 ::String Notification_obj::chatId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_450_chatId__fromC)
-HXDLIN( 450)		return this->chatId;
+            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_478_chatId__fromC)
+HXDLIN( 478)		return this->chatId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Notification_obj,chatId__fromC,return )
 
 ::String Notification_obj::senderId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_450_senderId__fromC)
-HXDLIN( 450)		return this->senderId;
+            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_478_senderId__fromC)
+HXDLIN( 478)		return this->senderId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Notification_obj,senderId__fromC,return )
 
 ::String Notification_obj::messageId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_450_messageId__fromC)
-HXDLIN( 450)		return this->messageId;
+            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_478_messageId__fromC)
+HXDLIN( 478)		return this->messageId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Notification_obj,messageId__fromC,return )
 
 int Notification_obj::type__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_450_type__fromC)
-HXDLIN( 450)		return this->type;
+            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_478_type__fromC)
+HXDLIN( 478)		return this->type;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Notification_obj,type__fromC,return )
 
 ::String Notification_obj::callStatus__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_450_callStatus__fromC)
-HXDLIN( 450)		return this->callStatus;
+            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_478_callStatus__fromC)
+HXDLIN( 478)		return this->callStatus;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Notification_obj,callStatus__fromC,return )
 
 ::String Notification_obj::callSid__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_450_callSid__fromC)
-HXDLIN( 450)		return this->callSid;
+            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_478_callSid__fromC)
+HXDLIN( 478)		return this->callSid;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Notification_obj,callSid__fromC,return )
 
 ::String Notification_obj::imageUri__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_450_imageUri__fromC)
-HXDLIN( 450)		return this->imageUri;
+            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_478_imageUri__fromC)
+HXDLIN( 478)		return this->imageUri;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Notification_obj,imageUri__fromC,return )
 
 ::String Notification_obj::lang__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_450_lang__fromC)
-HXDLIN( 450)		return this->lang;
+            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_478_lang__fromC)
+HXDLIN( 478)		return this->lang;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Notification_obj,lang__fromC,return )
 
 ::String Notification_obj::timestamp__fromC(){
-            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_450_timestamp__fromC)
-HXDLIN( 450)		return this->timestamp;
+            	HX_STACKFRAME(&_hx_pos_a36c4e022559a091_478_timestamp__fromC)
+HXDLIN( 478)		return this->timestamp;
             	}
 
 
@@ -179,15 +185,15 @@ HXLINE(  90)			_hx_tmp = HX_("Incoming Call",18,e2,4d,47);
             		else {
 HXLINE(  90)			_hx_tmp = HX_("New Message",c7,69,0e,bd);
             		}
-HXLINE(  91)		::String m1 = m->text;
-HXLINE(  92)		::String _hx_tmp1 = m->account();
-HXLINE(  93)		::String _hx_tmp2 = m->chatId();
-HXLINE(  94)		::String m2 = m->senderId;
-HXLINE(  95)		::String m3 = m->serverId;
-HXLINE(  96)		int m4 = m->type;
-HXLINE(  97)		::String _hx_tmp3 = m->callStatus();
-HXLINE(  98)		::String _hx_tmp4 = m->callSid();
-HXLINE(  89)		return  ::borogove::Notification_obj::__alloc( HX_CTX ,_hx_tmp,m1,_hx_tmp1,_hx_tmp2,m2,m3,m4,_hx_tmp3,_hx_tmp4,imageUri,m->lang,m->timestamp);
+HXLINE(  91)		::String _hx_tmp1 = m->body(null())->toPlainText();
+HXLINE(  92)		::String _hx_tmp2 = m->account();
+HXLINE(  93)		::String _hx_tmp3 = m->chatId();
+HXLINE(  94)		::String m1 = m->senderId;
+HXLINE(  95)		::String m2 = m->serverId;
+HXLINE(  96)		int m3 = m->type;
+HXLINE(  97)		::String _hx_tmp4 = m->callStatus();
+HXLINE(  98)		::String _hx_tmp5 = m->callSid();
+HXLINE(  89)		return  ::borogove::Notification_obj::__alloc( HX_CTX ,_hx_tmp,_hx_tmp1,_hx_tmp2,_hx_tmp3,m1,m2,m3,_hx_tmp4,_hx_tmp5,imageUri,m->lang,m->timestamp);
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/Other.cpp b/Sources/c_borogove/src/borogove/Other.cpp
index 79d8e87..915bb80 100644
--- a/Sources/c_borogove/src/borogove/Other.cpp
+++ b/Sources/c_borogove/src/borogove/Other.cpp
@@ -8,13 +8,13 @@
 #include <borogove/Symbol.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_c8cb9fdf9d715eea_146_new,"borogove.Other","new",0x709ffc15,"borogove.Other.new","borogove/EmojiUtil.hx",146,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_c8cb9fdf9d715eea_150_isEmoji,"borogove.Other","isEmoji",0x0523bd71,"borogove.Other.isEmoji","borogove/EmojiUtil.hx",150,0xaaf41424)
+HX_DEFINE_STACK_FRAME(_hx_pos_c8cb9fdf9d715eea_154_new,"borogove.Other","new",0x709ffc15,"borogove.Other.new","borogove/EmojiUtil.hx",154,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_c8cb9fdf9d715eea_158_isEmoji,"borogove.Other","isEmoji",0x0523bd71,"borogove.Other.isEmoji","borogove/EmojiUtil.hx",158,0xaaf41424)
 namespace borogove{
 
 void Other_obj::__construct(::Array< int > codepoints){
-            	HX_STACKFRAME(&_hx_pos_c8cb9fdf9d715eea_146_new)
-HXDLIN( 146)		super::__construct(codepoints);
+            	HX_STACKFRAME(&_hx_pos_c8cb9fdf9d715eea_154_new)
+HXDLIN( 154)		super::__construct(codepoints);
             	}
 
 Dynamic Other_obj::__CreateEmpty() { return new Other_obj; }
@@ -37,8 +37,8 @@ bool Other_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 bool Other_obj::isEmoji(){
-            	HX_STACKFRAME(&_hx_pos_c8cb9fdf9d715eea_150_isEmoji)
-HXDLIN( 150)		return false;
+            	HX_STACKFRAME(&_hx_pos_c8cb9fdf9d715eea_158_isEmoji)
+HXDLIN( 158)		return false;
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/Participant.cpp b/Sources/c_borogove/src/borogove/Participant.cpp
index bb190da..a0151ff 100644
--- a/Sources/c_borogove/src/borogove/Participant.cpp
+++ b/Sources/c_borogove/src/borogove/Participant.cpp
@@ -4,6 +4,9 @@
 #ifndef INCLUDED__HaxeCBridge_Internal
 #include <_HaxeCBridge/Internal.h>
 #endif
+#ifndef INCLUDED_borogove_AvailableChat
+#include <borogove/AvailableChat.h>
+#endif
 #ifndef INCLUDED_borogove_Client
 #include <borogove/Client.h>
 #endif
@@ -22,9 +25,15 @@
 #ifndef INCLUDED_borogove_ProfileItem
 #include <borogove/ProfileItem.h>
 #endif
+#ifndef INCLUDED_borogove_Role
+#include <borogove/Role.h>
+#endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
+#ifndef INCLUDED_borogove_Status
+#include <borogove/Status.h>
+#endif
 #ifndef INCLUDED_borogove_queries_GenericQuery
 #include <borogove/queries/GenericQuery.h>
 #endif
@@ -44,25 +53,33 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_74a0113f4a5624a8_25_new,"borogove.Participant","new",0x618fcab8,"borogove.Participant.new","borogove/Participant.hx",25,0xf8259379)
-HX_LOCAL_STACK_FRAME(_hx_pos_9afbd85bbbe40848_450_displayName__fromC,"borogove.Participant","displayName__fromC",0xdcc10714,"borogove.Participant.displayName__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9afbd85bbbe40848_450_photoUri__fromC,"borogove.Participant","photoUri__fromC",0x9f724837,"borogove.Participant.photoUri__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9afbd85bbbe40848_450_placeholderUri__fromC,"borogove.Participant","placeholderUri__fromC",0x53e4a038,"borogove.Participant.placeholderUri__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_9afbd85bbbe40848_450_isSelf__fromC,"borogove.Participant","isSelf__fromC",0xdd7b56fb,"borogove.Participant.isSelf__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_74a0113f4a5624a8_37_profile,"borogove.Participant","profile",0xe64d4f81,"borogove.Participant.profile","borogove/Participant.hx",37,0xf8259379)
-HX_LOCAL_STACK_FRAME(_hx_pos_74a0113f4a5624a8_35_profile,"borogove.Participant","profile",0xe64d4f81,"borogove.Participant.profile","borogove/Participant.hx",35,0xf8259379)
-HX_LOCAL_STACK_FRAME(_hx_pos_74a0113f4a5624a8_34_profile,"borogove.Participant","profile",0xe64d4f81,"borogove.Participant.profile","borogove/Participant.hx",34,0xf8259379)
-HX_LOCAL_STACK_FRAME(_hx_pos_9afbd85bbbe40848_337_profile__fromC,"borogove.Participant","profile__fromC",0x01e28318,"borogove.Participant.profile__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_74a0113f4a5624a8_17_boot,"borogove.Participant","boot",0xf45a96da,"borogove.Participant.boot","borogove/Participant.hx",17,0xf8259379)
+HX_DEFINE_STACK_FRAME(_hx_pos_74a0113f4a5624a8_53_new,"borogove.Participant","new",0x618fcab8,"borogove.Participant.new","borogove/Participant.hx",53,0xf8259379)
+HX_LOCAL_STACK_FRAME(_hx_pos_9afbd85bbbe40848_478_displayName__fromC,"borogove.Participant","displayName__fromC",0xdcc10714,"borogove.Participant.displayName__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9afbd85bbbe40848_478_photoUri__fromC,"borogove.Participant","photoUri__fromC",0x9f724837,"borogove.Participant.photoUri__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9afbd85bbbe40848_478_placeholderUri__fromC,"borogove.Participant","placeholderUri__fromC",0x53e4a038,"borogove.Participant.placeholderUri__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9afbd85bbbe40848_478_isSelf__fromC,"borogove.Participant","isSelf__fromC",0xdd7b56fb,"borogove.Participant.isSelf__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9afbd85bbbe40848_478_chat__fromC,"borogove.Participant","chat__fromC",0x15472ef9,"borogove.Participant.chat__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9afbd85bbbe40848_452_roles__fromC,"borogove.Participant","roles__fromC",0x94fc0084,"borogove.Participant.roles__fromC","HaxeCBridge.hx",452,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_74a0113f4a5624a8_72_profile,"borogove.Participant","profile",0xe64d4f81,"borogove.Participant.profile","borogove/Participant.hx",72,0xf8259379)
+HX_LOCAL_STACK_FRAME(_hx_pos_74a0113f4a5624a8_70_profile,"borogove.Participant","profile",0xe64d4f81,"borogove.Participant.profile","borogove/Participant.hx",70,0xf8259379)
+HX_LOCAL_STACK_FRAME(_hx_pos_74a0113f4a5624a8_69_profile,"borogove.Participant","profile",0xe64d4f81,"borogove.Participant.profile","borogove/Participant.hx",69,0xf8259379)
+HX_LOCAL_STACK_FRAME(_hx_pos_9afbd85bbbe40848_365_profile__fromC,"borogove.Participant","profile__fromC",0x01e28318,"borogove.Participant.profile__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_74a0113f4a5624a8_94_status,"borogove.Participant","status",0x5522f3da,"borogove.Participant.status","borogove/Participant.hx",94,0xf8259379)
+HX_LOCAL_STACK_FRAME(_hx_pos_74a0113f4a5624a8_92_status,"borogove.Participant","status",0x5522f3da,"borogove.Participant.status","borogove/Participant.hx",92,0xf8259379)
+HX_LOCAL_STACK_FRAME(_hx_pos_74a0113f4a5624a8_91_status,"borogove.Participant","status",0x5522f3da,"borogove.Participant.status","borogove/Participant.hx",91,0xf8259379)
+HX_LOCAL_STACK_FRAME(_hx_pos_9afbd85bbbe40848_365_status__fromC,"borogove.Participant","status__fromC",0x7b530bdf,"borogove.Participant.status__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_74a0113f4a5624a8_19_boot,"borogove.Participant","boot",0xf45a96da,"borogove.Participant.boot","borogove/Participant.hx",19,0xf8259379)
 namespace borogove{
 
-void Participant_obj::__construct(::String displayName,::String photoUri,::String placeholderUri,bool isSelf, ::borogove::JID jid){
-            	HX_STACKFRAME(&_hx_pos_74a0113f4a5624a8_25_new)
-HXLINE(  26)		this->displayName = displayName;
-HXLINE(  27)		this->photoUri = photoUri;
-HXLINE(  28)		this->placeholderUri = placeholderUri;
-HXLINE(  29)		this->isSelf = isSelf;
-HXLINE(  30)		this->jid = jid;
+void Participant_obj::__construct(::String displayName,::String photoUri,::String placeholderUri,bool isSelf,::Array< ::Dynamic> roles, ::borogove::JID jid, ::borogove::AvailableChat chat){
+            	HX_STACKFRAME(&_hx_pos_74a0113f4a5624a8_53_new)
+HXLINE(  54)		this->displayName = displayName;
+HXLINE(  55)		this->photoUri = photoUri;
+HXLINE(  56)		this->placeholderUri = placeholderUri;
+HXLINE(  57)		this->isSelf = isSelf;
+HXLINE(  58)		this->roles = roles;
+HXLINE(  59)		this->chat = chat;
+HXLINE(  60)		this->jid = jid;
             	}
 
 Dynamic Participant_obj::__CreateEmpty() { return new Participant_obj; }
@@ -72,7 +89,7 @@ void *Participant_obj::_hx_vtable = 0;
 Dynamic Participant_obj::__Create(::hx::DynamicArray inArgs)
 {
 	::hx::ObjectPtr< Participant_obj > _hx_result = new Participant_obj();
-	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2],inArgs[3],inArgs[4]);
+	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2],inArgs[3],inArgs[4],inArgs[5],inArgs[6]);
 	return _hx_result;
 }
 
@@ -81,134 +98,302 @@ bool Participant_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String Participant_obj::displayName__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_450_displayName__fromC)
-HXDLIN( 450)		return this->displayName;
+            	HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_478_displayName__fromC)
+HXDLIN( 478)		return this->displayName;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Participant_obj,displayName__fromC,return )
 
 ::String Participant_obj::photoUri__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_450_photoUri__fromC)
-HXDLIN( 450)		return this->photoUri;
+            	HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_478_photoUri__fromC)
+HXDLIN( 478)		return this->photoUri;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Participant_obj,photoUri__fromC,return )
 
 ::String Participant_obj::placeholderUri__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_450_placeholderUri__fromC)
-HXDLIN( 450)		return this->placeholderUri;
+            	HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_478_placeholderUri__fromC)
+HXDLIN( 478)		return this->placeholderUri;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Participant_obj,placeholderUri__fromC,return )
 
 bool Participant_obj::isSelf__fromC(){
-            	HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_450_isSelf__fromC)
-HXDLIN( 450)		return this->isSelf;
+            	HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_478_isSelf__fromC)
+HXDLIN( 478)		return this->isSelf;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Participant_obj,isSelf__fromC,return )
 
+ ::borogove::AvailableChat Participant_obj::chat__fromC(){
+            	HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_478_chat__fromC)
+HXDLIN( 478)		return this->chat;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Participant_obj,chat__fromC,return )
+
+size_t Participant_obj::roles__fromC(void*** outPtr){
+            	HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_452_roles__fromC)
+HXDLIN( 452)		::Array< ::Dynamic> x = this->roles;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			::Array< ::Dynamic> x1 = x;
+HXDLIN( 452)			{
+HXDLIN( 452)				int _g = 0;
+HXDLIN( 452)				while((_g < x1->length)){
+HXDLIN( 452)					 ::borogove::Role el = x1->__get(_g).StaticCast<  ::borogove::Role >();
+HXDLIN( 452)					_g = (_g + 1);
+HXDLIN( 452)					{
+HXDLIN( 452)						 ::Dynamic haxeObject = el;
+HXDLIN( 452)						void* ptr = haxeObject.mPtr;
+HXDLIN( 452)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 452)						{
+HXDLIN( 452)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 452)							if (::hx::IsNull( store )) {
+HXDLIN( 452)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
+HXDLIN( 452)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            							}
+            							else {
+HXDLIN( 452)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            							}
+            						}
+            					}
+            				}
+            			}
+HXDLIN( 452)			void** ptr1 = (void**)x1->getBase();
+HXDLIN( 452)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
+HXDLIN( 452)			{
+HXDLIN( 452)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN( 452)				if (::hx::IsNull( store1 )) {
+HXDLIN( 452)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            						->setFixed(1,HX_("value",71,7f,b8,31),x1));
+HXDLIN( 452)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+            				}
+            				else {
+HXDLIN( 452)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+            				}
+            			}
+HXDLIN( 452)			_hx_tmp->set_ref(ptr1);
+            		}
+HXDLIN( 452)		return ( (size_t)(x->length) );
+            	}
+
+
 ::Dynamic Participant_obj::profile( ::borogove::Client client){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Participant,_gthis, ::borogove::Client,client) HXARGC(2)
             		void _hx_run( ::Dynamic resolve, ::Dynamic reject){
             			HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::Participant,_gthis, ::Dynamic,resolve, ::borogove::queries::PubsubGet,get) HXARGC(0)
             			void _hx_run(){
-            				HX_GC_STACKFRAME(&_hx_pos_74a0113f4a5624a8_37_profile)
-HXLINE(  38)				 ::borogove::Stanza item = get->getResult()->__get(0).StaticCast<  ::borogove::Stanza >();
-HXLINE(  39)				 ::borogove::Stanza fromItem;
-HXDLIN(  39)				if (::hx::IsNotNull( item )) {
-HXLINE(  39)					fromItem = item->getChild(HX_("vcard",46,91,02,33),HX_("urn:ietf:params:xml:ns:vcard-4.0",6e,ca,81,21));
+            				HX_GC_STACKFRAME(&_hx_pos_74a0113f4a5624a8_72_profile)
+HXLINE(  73)				 ::borogove::Stanza item = get->getResult()->__get(0).StaticCast<  ::borogove::Stanza >();
+HXLINE(  74)				 ::borogove::Stanza fromItem;
+HXDLIN(  74)				if (::hx::IsNotNull( item )) {
+HXLINE(  74)					fromItem = item->getChild(HX_("vcard",46,91,02,33),HX_("urn:ietf:params:xml:ns:vcard-4.0",6e,ca,81,21));
             				}
             				else {
-HXLINE(  39)					fromItem = null();
+HXLINE(  74)					fromItem = null();
             				}
-HXLINE(  40)				 ::borogove::Stanza vcard;
-HXDLIN(  40)				if (::hx::IsNull( fromItem )) {
-HXLINE(  40)					vcard =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("vcard",46,91,02,33), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(  75)				 ::borogove::Stanza vcard;
+HXDLIN(  75)				if (::hx::IsNull( fromItem )) {
+HXLINE(  75)					vcard =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("vcard",46,91,02,33), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:ietf:params:xml:ns:vcard-4.0",6e,ca,81,21))));
             				}
             				else {
-HXLINE(  40)					vcard = fromItem;
+HXLINE(  75)					vcard = fromItem;
             				}
-HXLINE(  41)				if (!(vcard->hasChild(HX_("fn",48,59,00,00),null()))) {
-HXLINE(  42)					vcard->insertChild(0, ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("fn",48,59,00,00),null())->textTag(HX_("text",ad,cc,f9,4c),_gthis->displayName,null()));
+HXLINE(  76)				if (!(vcard->hasChild(HX_("fn",48,59,00,00),null()))) {
+HXLINE(  77)					vcard->insertChild(0, ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("fn",48,59,00,00),null())->textTag(HX_("text",ad,cc,f9,4c),_gthis->displayName,null()));
             				}
-HXLINE(  44)				 ::Dynamic resolve1 = resolve;
-HXDLIN(  44)				resolve1( ::borogove::Profile_obj::__alloc( HX_CTX ,vcard,null()));
+HXLINE(  79)				 ::Dynamic resolve1 = resolve;
+HXDLIN(  79)				resolve1( ::borogove::Profile_obj::__alloc( HX_CTX ,vcard,null()));
             			}
             			HX_END_LOCAL_FUNC0((void))
 
-            			HX_GC_STACKFRAME(&_hx_pos_74a0113f4a5624a8_35_profile)
-HXLINE(  36)			 ::borogove::queries::PubsubGet get =  ::borogove::queries::PubsubGet_obj::__alloc( HX_CTX ,_gthis->jid->asString(),HX_("urn:xmpp:vcard4",4a,89,04,19),null());
-HXLINE(  37)			get->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,resolve,get)));
-HXLINE(  46)			client->sendQuery(get);
+            			HX_GC_STACKFRAME(&_hx_pos_74a0113f4a5624a8_70_profile)
+HXLINE(  71)			 ::borogove::queries::PubsubGet get =  ::borogove::queries::PubsubGet_obj::__alloc( HX_CTX ,_gthis->jid->asString(),HX_("urn:xmpp:vcard4",4a,89,04,19),null());
+HXLINE(  72)			get->onFinished( ::Dynamic(new _hx_Closure_0(_gthis,resolve,get)));
+HXLINE(  81)			client->sendQuery(get);
             		}
             		HX_END_LOCAL_FUNC2((void))
 
-            	HX_STACKFRAME(&_hx_pos_74a0113f4a5624a8_34_profile)
-HXDLIN(  34)		 ::borogove::Participant _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(  35)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(_gthis,client)));
+            	HX_STACKFRAME(&_hx_pos_74a0113f4a5624a8_69_profile)
+HXDLIN(  69)		 ::borogove::Participant _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(  70)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(_gthis,client)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Participant_obj,profile,return )
 
 void Participant_obj::profile__fromC( ::borogove::Client client,::cpp::Function< void  (void*,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_337_profile__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			this->profile(client);
+            	HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_365_profile__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->profile(client);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::borogove::Profile v){
-            				HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_337_profile__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void*,void*) > handler1 = handler;
-HXLINE( 314)				 ::Dynamic haxeObject = v;
-HXDLIN( 314)				void* ptr = haxeObject.mPtr;
-HXDLIN( 314)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 314)				{
-HXLINE( 314)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 314)					if (::hx::IsNull( store )) {
-HXLINE( 314)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            				HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_365_profile__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 314)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             					}
             					else {
-HXLINE( 314)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             					}
             				}
-HXLINE( 337)				handler1(ptr,handler__context);
+HXLINE( 365)				handler1(ptr,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_337_profile__fromC)
-HXDLIN( 337)				handler(null(),handler__context);
+            				HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_365_profile__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->profile(client), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->profile(client), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
+::Dynamic Participant_obj::status( ::borogove::Client client){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::Participant,_gthis, ::borogove::Client,client) HXARGC(2)
+            		void _hx_run( ::Dynamic resolve, ::Dynamic reject){
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,resolve, ::borogove::queries::PubsubGet,get) HXARGC(0)
+            			void _hx_run(){
+            				HX_GC_STACKFRAME(&_hx_pos_74a0113f4a5624a8_94_status)
+HXLINE(  95)				 ::borogove::Stanza item = get->getResult()->__get(0).StaticCast<  ::borogove::Stanza >();
+HXLINE(  97)				 ::borogove::Stanza activity;
+HXDLIN(  97)				if (::hx::IsNotNull( item )) {
+HXLINE(  97)					activity = item->getChild(HX_("activity",cf,2d,b2,e5),HX_("http://jabber.org/protocol/activity",43,2c,6e,94));
+            				}
+            				else {
+HXLINE(  97)					activity = null();
+            				}
+HXLINE(  98)				 ::Dynamic resolve1 = resolve;
+HXDLIN(  98)				::String _hx_tmp;
+HXDLIN(  98)				 ::borogove::Stanza tmp;
+HXDLIN(  98)				if (::hx::IsNotNull( activity )) {
+HXLINE(  98)					tmp = activity->getChild(HX_("undefined",90,3e,0a,9d),null());
+            				}
+            				else {
+HXLINE(  98)					tmp = null();
+            				}
+HXDLIN(  98)				::String tmp1;
+HXDLIN(  98)				if (::hx::IsNotNull( tmp )) {
+HXLINE(  98)					tmp1 = tmp->getChildText(HX_("emoji",86,6f,d9,6f),HX_("https://ns.borogove.dev/",0d,36,29,bd));
+            				}
+            				else {
+HXLINE(  98)					tmp1 = null();
+            				}
+HXDLIN(  98)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE(  98)					_hx_tmp = tmp1;
+            				}
+            				else {
+HXLINE(  98)					_hx_tmp = HX_("",00,00,00,00);
+            				}
+HXDLIN(  98)				::String tmp2;
+HXDLIN(  98)				if (::hx::IsNotNull( activity )) {
+HXLINE(  98)					tmp2 = activity->getChildText(HX_("text",ad,cc,f9,4c),null());
+            				}
+            				else {
+HXLINE(  98)					tmp2 = null();
+            				}
+HXDLIN(  98)				::String _hx_tmp1;
+HXDLIN(  98)				if (::hx::IsNotNull( tmp2 )) {
+HXLINE(  98)					_hx_tmp1 = tmp2;
+            				}
+            				else {
+HXLINE(  98)					_hx_tmp1 = HX_("",00,00,00,00);
+            				}
+HXDLIN(  98)				resolve1( ::borogove::Status_obj::__alloc( HX_CTX ,_hx_tmp,_hx_tmp1));
+            			}
+            			HX_END_LOCAL_FUNC0((void))
+
+            			HX_GC_STACKFRAME(&_hx_pos_74a0113f4a5624a8_92_status)
+HXLINE(  93)			 ::borogove::queries::PubsubGet get =  ::borogove::queries::PubsubGet_obj::__alloc( HX_CTX ,_gthis->jid->asString(),HX_("http://jabber.org/protocol/activity",43,2c,6e,94),null());
+HXLINE(  94)			get->onFinished( ::Dynamic(new _hx_Closure_0(resolve,get)));
+HXLINE( 100)			client->sendQuery(get);
+            		}
+            		HX_END_LOCAL_FUNC2((void))
+
+            	HX_STACKFRAME(&_hx_pos_74a0113f4a5624a8_91_status)
+HXDLIN(  91)		 ::borogove::Participant _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(  92)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(_gthis,client)));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(Participant_obj,status,return )
+
+void Participant_obj::status__fromC( ::borogove::Client client,::cpp::Function< void  (void*,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_365_status__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->status(client);
+            		}
+            		else {
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::borogove::Status v){
+            				HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_365_status__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
+            							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            					}
+            					else {
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+            					}
+            				}
+HXLINE( 365)				handler1(ptr,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::Dynamic e){
+            				HX_STACKFRAME(&_hx_pos_9afbd85bbbe40848_365_status__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->status(client), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+            		}
+            	}
+
 
-::hx::ObjectPtr< Participant_obj > Participant_obj::__new(::String displayName,::String photoUri,::String placeholderUri,bool isSelf, ::borogove::JID jid) {
+
+::hx::ObjectPtr< Participant_obj > Participant_obj::__new(::String displayName,::String photoUri,::String placeholderUri,bool isSelf,::Array< ::Dynamic> roles, ::borogove::JID jid, ::borogove::AvailableChat chat) {
 	::hx::ObjectPtr< Participant_obj > __this = new Participant_obj();
-	__this->__construct(displayName,photoUri,placeholderUri,isSelf,jid);
+	__this->__construct(displayName,photoUri,placeholderUri,isSelf,roles,jid,chat);
 	return __this;
 }
 
-::hx::ObjectPtr< Participant_obj > Participant_obj::__alloc(::hx::Ctx *_hx_ctx,::String displayName,::String photoUri,::String placeholderUri,bool isSelf, ::borogove::JID jid) {
+::hx::ObjectPtr< Participant_obj > Participant_obj::__alloc(::hx::Ctx *_hx_ctx,::String displayName,::String photoUri,::String placeholderUri,bool isSelf,::Array< ::Dynamic> roles, ::borogove::JID jid, ::borogove::AvailableChat chat) {
 	Participant_obj *__this = (Participant_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Participant_obj), true, "borogove.Participant"));
 	*(void **)__this = Participant_obj::_hx_vtable;
-	__this->__construct(displayName,photoUri,placeholderUri,isSelf,jid);
+	__this->__construct(displayName,photoUri,placeholderUri,isSelf,roles,jid,chat);
 	return __this;
 }
 
@@ -223,6 +408,8 @@ void Participant_obj::__Mark(HX_MARK_PARAMS)
 	HX_MARK_MEMBER_NAME(photoUri,"photoUri");
 	HX_MARK_MEMBER_NAME(placeholderUri,"placeholderUri");
 	HX_MARK_MEMBER_NAME(isSelf,"isSelf");
+	HX_MARK_MEMBER_NAME(chat,"chat");
+	HX_MARK_MEMBER_NAME(roles,"roles");
 	HX_MARK_MEMBER_NAME(jid,"jid");
 	HX_MARK_END_CLASS();
 }
@@ -233,6 +420,8 @@ void Participant_obj::__Visit(HX_VISIT_PARAMS)
 	HX_VISIT_MEMBER_NAME(photoUri,"photoUri");
 	HX_VISIT_MEMBER_NAME(placeholderUri,"placeholderUri");
 	HX_VISIT_MEMBER_NAME(isSelf,"isSelf");
+	HX_VISIT_MEMBER_NAME(chat,"chat");
+	HX_VISIT_MEMBER_NAME(roles,"roles");
 	HX_VISIT_MEMBER_NAME(jid,"jid");
 }
 
@@ -242,8 +431,15 @@ void Participant_obj::__Visit(HX_VISIT_PARAMS)
 	case 3:
 		if (HX_FIELD_EQ(inName,"jid") ) { return ::hx::Val( jid ); }
 		break;
+	case 4:
+		if (HX_FIELD_EQ(inName,"chat") ) { return ::hx::Val( chat ); }
+		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"roles") ) { return ::hx::Val( roles ); }
+		break;
 	case 6:
 		if (HX_FIELD_EQ(inName,"isSelf") ) { return ::hx::Val( isSelf ); }
+		if (HX_FIELD_EQ(inName,"status") ) { return ::hx::Val( status_dyn() ); }
 		break;
 	case 7:
 		if (HX_FIELD_EQ(inName,"profile") ) { return ::hx::Val( profile_dyn() ); }
@@ -253,6 +449,7 @@ void Participant_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 11:
 		if (HX_FIELD_EQ(inName,"displayName") ) { return ::hx::Val( displayName ); }
+		if (HX_FIELD_EQ(inName,"chat__fromC") ) { return ::hx::Val( chat__fromC_dyn() ); }
 		break;
 	case 13:
 		if (HX_FIELD_EQ(inName,"isSelf__fromC") ) { return ::hx::Val( isSelf__fromC_dyn() ); }
@@ -278,6 +475,12 @@ void Participant_obj::__Visit(HX_VISIT_PARAMS)
 	case 3:
 		if (HX_FIELD_EQ(inName,"jid") ) { jid=inValue.Cast<  ::borogove::JID >(); return inValue; }
 		break;
+	case 4:
+		if (HX_FIELD_EQ(inName,"chat") ) { chat=inValue.Cast<  ::borogove::AvailableChat >(); return inValue; }
+		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"roles") ) { roles=inValue.Cast< ::Array< ::Dynamic> >(); return inValue; }
+		break;
 	case 6:
 		if (HX_FIELD_EQ(inName,"isSelf") ) { isSelf=inValue.Cast< bool >(); return inValue; }
 		break;
@@ -299,6 +502,8 @@ void Participant_obj::__GetFields(Array< ::String> &outFields)
 	outFields->push(HX_("photoUri",da,15,82,60));
 	outFields->push(HX_("placeholderUri",b9,d9,ba,ae));
 	outFields->push(HX_("isSelf",96,50,b7,69));
+	outFields->push(HX_("chat",d8,5e,bf,41));
+	outFields->push(HX_("roles",3d,1c,5f,ed));
 	outFields->push(HX_("jid",c5,ca,50,00));
 	super::__GetFields(outFields);
 };
@@ -309,6 +514,8 @@ static ::hx::StorageInfo Participant_obj_sMemberStorageInfo[] = {
 	{::hx::fsString,(int)offsetof(Participant_obj,photoUri),HX_("photoUri",da,15,82,60)},
 	{::hx::fsString,(int)offsetof(Participant_obj,placeholderUri),HX_("placeholderUri",b9,d9,ba,ae)},
 	{::hx::fsBool,(int)offsetof(Participant_obj,isSelf),HX_("isSelf",96,50,b7,69)},
+	{::hx::fsObject /*  ::borogove::AvailableChat */ ,(int)offsetof(Participant_obj,chat),HX_("chat",d8,5e,bf,41)},
+	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(Participant_obj,roles),HX_("roles",3d,1c,5f,ed)},
 	{::hx::fsObject /*  ::borogove::JID */ ,(int)offsetof(Participant_obj,jid),HX_("jid",c5,ca,50,00)},
 	{ ::hx::fsUnknown, 0, null()}
 };
@@ -324,8 +531,12 @@ static ::String Participant_obj_sMemberFields[] = {
 	HX_("placeholderUri__fromC",e0,2f,a3,85),
 	HX_("isSelf",96,50,b7,69),
 	HX_("isSelf__fromC",a3,fe,4d,03),
+	HX_("chat",d8,5e,bf,41),
+	HX_("chat__fromC",a1,1c,85,3d),
+	HX_("roles",3d,1c,5f,ed),
 	HX_("jid",c5,ca,50,00),
 	HX_("profile",29,49,49,f3),
+	HX_("status",32,e7,fb,05),
 	::String(null()) };
 
 ::hx::Class Participant_obj::__mClass;
@@ -356,20 +567,28 @@ void Participant_obj::__register()
 void Participant_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_74a0113f4a5624a8_17_boot)
-HXDLIN(  17)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(6)
+            	HX_STACKFRAME(&_hx_pos_74a0113f4a5624a8_19_boot)
+HXDLIN(  19)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(10)
             				->setFixed(0,HX_("placeholderUri__fromC",e0,2f,a3,85), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(1,HX_("photoUri__fromC",df,29,fc,dc), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(1,HX_("status__fromC",87,b3,25,a1), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(2,HX_("profile",29,49,49,f3), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(2,HX_("roles__fromC",dc,05,ee,a2), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(3,HX_("photoUri__fromC",df,29,fc,dc), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(4,HX_("profile",29,49,49,f3), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(3,HX_("profile__fromC",70,8e,62,f4), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(5,HX_("profile__fromC",70,8e,62,f4), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(4,HX_("isSelf__fromC",a3,fe,4d,03), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(6,HX_("isSelf__fromC",a3,fe,4d,03), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(7,HX_("status",32,e7,fb,05), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
+            				->setFixed(8,HX_("displayName__fromC",6c,9e,e5,22), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(5,HX_("displayName__fromC",6c,9e,e5,22), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(9,HX_("chat__fromC",a1,1c,85,3d), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null()))))));
             	}
 }
diff --git a/Sources/c_borogove/src/borogove/Persistence.cpp b/Sources/c_borogove/src/borogove/Persistence.cpp
index e081d60..b1de8e5 100644
--- a/Sources/c_borogove/src/borogove/Persistence.cpp
+++ b/Sources/c_borogove/src/borogove/Persistence.cpp
@@ -10,6 +10,15 @@
 #ifndef INCLUDED_borogove_ChatMessage
 #include <borogove/ChatMessage.h>
 #endif
+#ifndef INCLUDED_borogove_EventEmitter
+#include <borogove/EventEmitter.h>
+#endif
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
+#endif
+#ifndef INCLUDED_borogove_MemberUpdate
+#include <borogove/MemberUpdate.h>
+#endif
 #ifndef INCLUDED_borogove_Persistence
 #include <borogove/Persistence.h>
 #endif
@@ -20,14 +29,19 @@
 #include <thenshim/Thenable.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_86b0a481bb186c19_22_boot,"borogove.Persistence","boot",0x620c37ae,"borogove.Persistence.boot","borogove/Persistence.hx",22,0x3c6f974d)
+HX_LOCAL_STACK_FRAME(_hx_pos_86b0a481bb186c19_23_boot,"borogove.Persistence","boot",0x620c37ae,"borogove.Persistence.boot","borogove/Persistence.hx",23,0x3c6f974d)
 namespace borogove{
 
 
 static ::String Persistence_obj_sMemberFields[] = {
-	HX_("lastId",d1,0b,c5,54),
+	HX_("syncPoint",f5,ff,94,98),
 	HX_("storeChats",fa,4a,32,83),
 	HX_("getChats",25,ae,8a,a5),
+	HX_("storeMembers",f8,ee,39,b6),
+	HX_("storeMemberUpdates",6f,0a,28,a1),
+	HX_("clearMemberPresence",22,9d,db,a5),
+	HX_("getMembers",e3,b2,d1,69),
+	HX_("getMemberDetails",12,2b,2f,b3),
 	HX_("getChatsUnreadDetails",ee,d4,5a,85),
 	HX_("storeReaction",aa,00,75,ab),
 	HX_("storeMessages",cd,f1,bd,e9),
@@ -67,9 +81,9 @@ void Persistence_obj::__register()
 void Persistence_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_86b0a481bb186c19_22_boot)
-HXDLIN(  22)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(25)
+            	HX_STACKFRAME(&_hx_pos_86b0a481bb186c19_23_boot)
+HXDLIN(  23)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(30)
             				->setFixed(0,HX_("storeChats",fa,4a,32,83), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
             				->setFixed(1,HX_("getChatsUnreadDetails",ee,d4,5a,85), ::Dynamic(::hx::Anon_obj::Create(1)
@@ -78,47 +92,57 @@ HXDLIN(  22)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
             				->setFixed(3,HX_("hasMedia",2a,4f,14,92), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(4,HX_("storeCaps",a2,60,d7,9d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(4,HX_("syncPoint",f5,ff,94,98), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
+            				->setFixed(5,HX_("storeCaps",a2,60,d7,9d), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(6,HX_("storeService",54,de,f6,9d), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(5,HX_("storeService",54,de,f6,9d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(7,HX_("storeMemberUpdates",6f,0a,28,a1), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(6,HX_("getChats",25,ae,8a,a5), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(8,HX_("getChats",25,ae,8a,a5), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(7,HX_("storeReaction",aa,00,75,ab), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(9,HX_("clearMemberPresence",22,9d,db,a5), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(8,HX_("storeLogin",c8,85,72,b6), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(10,HX_("storeReaction",aa,00,75,ab), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(11,HX_("getMemberDetails",12,2b,2f,b3), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(12,HX_("storeMembers",f8,ee,39,b6), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(13,HX_("storeLogin",c8,85,72,b6), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(9,HX_("getLogin",f3,e8,ca,d8), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(14,HX_("getLogin",f3,e8,ca,d8), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(10,HX_("getMessage",d1,bb,72,e9), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(15,HX_("getMessage",d1,bb,72,e9), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(11,HX_("storeMessages",cd,f1,bd,e9), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(16,HX_("storeMessages",cd,f1,bd,e9), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(12,HX_("listAccounts",a4,81,e8,f5), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(17,HX_("listAccounts",a4,81,e8,f5), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(13,HX_("removeMedia",00,e2,ef,03), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(18,HX_("removeMedia",00,e2,ef,03), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(14,HX_("updateMessageStatus",90,98,ad,0f), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(19,HX_("updateMessageStatus",90,98,ad,0f), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(15,HX_("getMessagesBefore",a1,f1,44,11), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(20,HX_("getMessagesBefore",a1,f1,44,11), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(16,HX_("getCaps",d7,cb,3c,14), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(21,HX_("getCaps",d7,cb,3c,14), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(17,HX_("getMessagesAround",6f,95,16,2d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(22,HX_("getMessagesAround",6f,95,16,2d), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(18,HX_("storeMedia",43,b1,3a,43), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(23,HX_("storeMedia",43,b1,3a,43), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(19,HX_("findServicesWithFeature",99,4e,bd,4a), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(24,HX_("findServicesWithFeature",99,4e,bd,4a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(20,HX_("lastId",d1,0b,c5,54), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(25,HX_("getMessagesAfter",3a,43,91,57), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(21,HX_("getMessagesAfter",3a,43,91,57), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(26,HX_("updateMessage",be,9a,7f,65), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(22,HX_("updateMessage",be,9a,7f,65), ::Dynamic(::hx::Anon_obj::Create(1)
-            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(23,HX_("getStreamManagement",d9,03,ec,6c), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(27,HX_("getMembers",e3,b2,d1,69), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(28,HX_("getStreamManagement",d9,03,ec,6c), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(24,HX_("removeAccount",c9,58,14,7a), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(29,HX_("removeAccount",c9,58,14,7a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d))))))));
             	}
 }
diff --git a/Sources/c_borogove/src/borogove/Persistence__Companion.cpp b/Sources/c_borogove/src/borogove/Persistence__Companion.cpp
index 05f438e..1f15510 100644
--- a/Sources/c_borogove/src/borogove/Persistence__Companion.cpp
+++ b/Sources/c_borogove/src/borogove/Persistence__Companion.cpp
@@ -1,6 +1,12 @@
 // Generated by Haxe 4.3.3
 #include <hxcpp.h>
 
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
+#endif
+#ifndef INCLUDED__HaxeCBridge_HaxeStringArray_Impl_
+#include <_HaxeCBridge/HaxeStringArray_Impl_.h>
+#endif
 #ifndef INCLUDED__HaxeCBridge_Internal
 #include <_HaxeCBridge/Internal.h>
 #endif
@@ -10,6 +16,9 @@
 #ifndef INCLUDED_borogove_ChatMessage
 #include <borogove/ChatMessage.h>
 #endif
+#ifndef INCLUDED_borogove_EventEmitter
+#include <borogove/EventEmitter.h>
+#endif
 #ifndef INCLUDED_borogove_Persistence
 #include <borogove/Persistence.h>
 #endif
@@ -29,22 +38,22 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_337_lastId__fromC,"borogove.Persistence__Companion","lastId__fromC",0x12c49c74,"borogove.Persistence__Companion.lastId__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_339_storeChats__fromC,"borogove.Persistence__Companion","storeChats__fromC",0xc83eca6b,"borogove.Persistence__Companion.storeChats__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_337_storeMessages__fromC,"borogove.Persistence__Companion","storeMessages__fromC",0xd59d6420,"borogove.Persistence__Companion.storeMessages__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_339_updateMessage__fromC,"borogove.Persistence__Companion","updateMessage__fromC",0xb75e2b4f,"borogove.Persistence__Companion.updateMessage__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_337_updateMessageStatus__fromC,"borogove.Persistence__Companion","updateMessageStatus__fromC",0x758082bd,"borogove.Persistence__Companion.updateMessageStatus__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_337_getMessage__fromC,"borogove.Persistence__Companion","getMessage__fromC",0xc54a3274,"borogove.Persistence__Companion.getMessage__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_337_getMessagesBefore__fromC,"borogove.Persistence__Companion","getMessagesBefore__fromC",0xc80240cc,"borogove.Persistence__Companion.getMessagesBefore__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_337_getMessagesAfter__fromC,"borogove.Persistence__Companion","getMessagesAfter__fromC",0x9041e32b,"borogove.Persistence__Companion.getMessagesAfter__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_337_getMessagesAround__fromC,"borogove.Persistence__Companion","getMessagesAround__fromC",0x5d92d2be,"borogove.Persistence__Companion.getMessagesAround__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_337_hasMedia__fromC,"borogove.Persistence__Companion","hasMedia__fromC",0x4b80a93b,"borogove.Persistence__Companion.hasMedia__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_337_storeMedia__fromC,"borogove.Persistence__Companion","storeMedia__fromC",0x0211af42,"borogove.Persistence__Companion.storeMedia__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_339_removeMedia__fromC,"borogove.Persistence__Companion","removeMedia__fromC",0x250c534d,"borogove.Persistence__Companion.removeMedia__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_339_storeLogin__fromC,"borogove.Persistence__Companion","storeLogin__fromC",0xf171a55d,"borogove.Persistence__Companion.storeLogin__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_339_removeAccount__fromC,"borogove.Persistence__Companion","removeAccount__fromC",0x032814a4,"borogove.Persistence__Companion.removeAccount__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_337_listAccounts__fromC,"borogove.Persistence__Companion","listAccounts__fromC",0x55fbe001,"borogove.Persistence__Companion.listAccounts__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_c5ec1c5882052979_22_boot,"borogove.Persistence__Companion","boot",0x08e8fe06,"borogove.Persistence__Companion.boot","borogove/Persistence.hx",22,0x3c6f974d)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_365_syncPoint__fromC,"borogove.Persistence__Companion","syncPoint__fromC",0x55d370f8,"borogove.Persistence__Companion.syncPoint__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_354_storeChats__fromC,"borogove.Persistence__Companion","storeChats__fromC",0xc83eca6b,"borogove.Persistence__Companion.storeChats__fromC","HaxeCBridge.hx",354,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_365_storeMessages__fromC,"borogove.Persistence__Companion","storeMessages__fromC",0xd59d6420,"borogove.Persistence__Companion.storeMessages__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_354_updateMessage__fromC,"borogove.Persistence__Companion","updateMessage__fromC",0xb75e2b4f,"borogove.Persistence__Companion.updateMessage__fromC","HaxeCBridge.hx",354,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_365_updateMessageStatus__fromC,"borogove.Persistence__Companion","updateMessageStatus__fromC",0x758082bd,"borogove.Persistence__Companion.updateMessageStatus__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_365_getMessage__fromC,"borogove.Persistence__Companion","getMessage__fromC",0xc54a3274,"borogove.Persistence__Companion.getMessage__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_365_getMessagesBefore__fromC,"borogove.Persistence__Companion","getMessagesBefore__fromC",0xc80240cc,"borogove.Persistence__Companion.getMessagesBefore__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_365_getMessagesAfter__fromC,"borogove.Persistence__Companion","getMessagesAfter__fromC",0x9041e32b,"borogove.Persistence__Companion.getMessagesAfter__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_365_getMessagesAround__fromC,"borogove.Persistence__Companion","getMessagesAround__fromC",0x5d92d2be,"borogove.Persistence__Companion.getMessagesAround__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_365_hasMedia__fromC,"borogove.Persistence__Companion","hasMedia__fromC",0x4b80a93b,"borogove.Persistence__Companion.hasMedia__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_365_storeMedia__fromC,"borogove.Persistence__Companion","storeMedia__fromC",0x0211af42,"borogove.Persistence__Companion.storeMedia__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_365_removeMedia__fromC,"borogove.Persistence__Companion","removeMedia__fromC",0x250c534d,"borogove.Persistence__Companion.removeMedia__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_365_storeLogin__fromC,"borogove.Persistence__Companion","storeLogin__fromC",0xf171a55d,"borogove.Persistence__Companion.storeLogin__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_365_removeAccount__fromC,"borogove.Persistence__Companion","removeAccount__fromC",0x032814a4,"borogove.Persistence__Companion.removeAccount__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_3b8bc4f87a0221fe_365_listAccounts__fromC,"borogove.Persistence__Companion","listAccounts__fromC",0x55fbe001,"borogove.Persistence__Companion.listAccounts__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_c5ec1c5882052979_23_boot,"borogove.Persistence__Companion","boot",0x08e8fe06,"borogove.Persistence__Companion.boot","borogove/Persistence.hx",23,0x3c6f974d)
 namespace borogove{
 
 void Persistence__Companion_obj::__construct() { }
@@ -64,626 +73,495 @@ bool Persistence__Companion_obj::_hx_isInstanceOf(int inClassId) {
 	return inClassId==(int)0x00000001 || inClassId==(int)0x0f6bf1d6;
 }
 
-void Persistence__Companion_obj::lastId__fromC(::Dynamic self,::String accountId,::String chatId,::cpp::Function< void  (const char*,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_lastId__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			::borogove::Persistence_obj::lastId(self,accountId,chatId);
+void Persistence__Companion_obj::syncPoint__fromC(::Dynamic self,::String accountId,::String chatId,::cpp::Function< void  (void*,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_syncPoint__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			::borogove::Persistence_obj::syncPoint(self,accountId,chatId);
             		}
             		else {
-            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (const char* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
-            			void _hx_run(::String v){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_lastId__fromC)
-HXDLIN( 337)				::cpp::Function< void  (const char*,void*) > handler1 = handler;
-HXLINE( 312)				const char* cStrPtr = v.utf8_str();
-HXDLIN( 312)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 312)				{
-HXLINE( 312)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 312)					if (::hx::IsNull( store )) {
-HXLINE( 312)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::borogove::ChatMessage v){
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_syncPoint__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            							->setFixed(1,HX_("value",71,7f,b8,31),v));
-HXDLIN( 312)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+            							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             					}
             					else {
-HXLINE( 312)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             					}
             				}
-HXLINE( 337)				handler1(cStrPtr,handler__context);
+HXLINE( 365)				handler1(ptr,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (const char* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_lastId__fromC)
-HXDLIN( 337)				handler(null(),handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_syncPoint__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::lastId(self,accountId,chatId), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::syncPoint(self,accountId,chatId), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
 void Persistence__Companion_obj::storeChats__fromC(::Dynamic self,::String accountId,::cpp::Pointer< void* > chats,size_t chats__len){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_339_storeChats__fromC)
-HXLINE( 282)		::Array< ::Dynamic> _hx_tmp;
-HXDLIN( 282)		if (::hx::IsNull( chats )) {
-HXLINE( 282)			_hx_tmp = null();
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_354_storeChats__fromC)
+HXLINE( 302)		::Array< ::Dynamic> _hx_tmp;
+HXDLIN( 302)		if (::hx::IsNull( chats )) {
+HXLINE( 302)			_hx_tmp = ::Array_obj< ::Dynamic>::__new(0);
             		}
             		else {
-HXLINE( 282)			::cpp::Pointer<  ::borogove::Chat > _this = chats->reinterpret();
-HXDLIN( 282)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new();
-HXDLIN( 282)			::cpp::Pointer<  ::borogove::Chat > tmp = _this;
-HXDLIN( 282)			result->setUnmanagedData(tmp,( (int)(chats__len) ));
-HXDLIN( 282)			_hx_tmp = result->copy();
+HXLINE( 302)			::cpp::Pointer<  ::borogove::Chat > _this = chats->reinterpret();
+HXDLIN( 302)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new();
+HXDLIN( 302)			::cpp::Pointer<  ::borogove::Chat > tmp = _this;
+HXDLIN( 302)			result->setUnmanagedData(tmp,( (int)(chats__len) ));
+HXDLIN( 302)			_hx_tmp = result->copy();
             		}
-HXLINE( 339)		::borogove::Persistence_obj::storeChats(self,accountId,_hx_tmp);
+HXLINE( 354)		::borogove::Persistence_obj::storeChats(self,accountId,_hx_tmp);
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC4(Persistence__Companion_obj,storeChats__fromC,(void))
 
 void Persistence__Companion_obj::storeMessages__fromC(::Dynamic self,::String accountId,::cpp::Pointer< void* > message,size_t message__len,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_storeMessages__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXLINE( 282)			::Array< ::Dynamic> _hx_tmp;
-HXDLIN( 282)			if (::hx::IsNull( message )) {
-HXLINE( 282)				_hx_tmp = null();
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_storeMessages__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXLINE( 302)			::Array< ::Dynamic> _hx_tmp;
+HXDLIN( 302)			if (::hx::IsNull( message )) {
+HXLINE( 302)				_hx_tmp = ::Array_obj< ::Dynamic>::__new(0);
             			}
             			else {
-HXLINE( 282)				::cpp::Pointer<  ::borogove::ChatMessage > _this = message->reinterpret();
-HXDLIN( 282)				::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new();
-HXDLIN( 282)				::cpp::Pointer<  ::borogove::ChatMessage > tmp = _this;
-HXDLIN( 282)				result->setUnmanagedData(tmp,( (int)(message__len) ));
-HXDLIN( 282)				_hx_tmp = result->copy();
+HXLINE( 302)				::cpp::Pointer<  ::borogove::ChatMessage > _this = message->reinterpret();
+HXDLIN( 302)				::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new();
+HXDLIN( 302)				::cpp::Pointer<  ::borogove::ChatMessage > tmp = _this;
+HXDLIN( 302)				result->setUnmanagedData(tmp,( (int)(message__len) ));
+HXDLIN( 302)				_hx_tmp = result->copy();
             			}
-HXLINE( 337)			::borogove::Persistence_obj::storeMessages(self,accountId,_hx_tmp);
+HXLINE( 365)			::borogove::Persistence_obj::storeMessages(self,accountId,_hx_tmp);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(::Array< ::Dynamic> v){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_storeMessages__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
-HXLINE( 308)				{
-HXLINE( 308)					int _g = 0;
-HXDLIN( 308)					while((_g < v->length)){
-HXLINE( 308)						 ::borogove::ChatMessage el = v->__get(_g).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 308)						_g = (_g + 1);
-HXDLIN( 308)						{
-HXLINE( 308)							 ::Dynamic haxeObject = el;
-HXDLIN( 308)							void* ptr = haxeObject.mPtr;
-HXDLIN( 308)							::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 308)							{
-HXLINE( 308)								 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 308)								if (::hx::IsNull( store )) {
-HXLINE( 308)									store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            										->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            										->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 308)									::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            								}
-            								else {
-HXLINE( 308)									::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            								}
-            							}
-            						}
-            					}
-            				}
-HXDLIN( 308)				void** ptr1 = (void**)v->getBase();
-HXDLIN( 308)				::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 308)				{
-HXLINE( 308)					 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 308)					if (::hx::IsNull( store1 )) {
-HXLINE( 308)						store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            							->setFixed(1,HX_("value",71,7f,b8,31),v));
-HXDLIN( 308)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            					}
-            					else {
-HXLINE( 308)						::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            					}
-            				}
-HXLINE( 337)				handler1(ptr1,( (size_t)(v->length) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_storeMessages__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
+HXDLIN( 365)				handler1(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(v),( (size_t)(v->length) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_storeMessages__fromC)
-HXDLIN( 337)				handler(null(),( (size_t)(0) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_storeMessages__fromC)
+HXDLIN( 365)				handler(null(),( (size_t)(0) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 282)			::Array< ::Dynamic> _hx_tmp1;
-HXDLIN( 282)			if (::hx::IsNull( message )) {
-HXLINE( 282)				_hx_tmp1 = null();
+HXLINE( 302)			::Array< ::Dynamic> _hx_tmp1;
+HXDLIN( 302)			if (::hx::IsNull( message )) {
+HXLINE( 302)				_hx_tmp1 = ::Array_obj< ::Dynamic>::__new(0);
             			}
             			else {
-HXLINE( 282)				::cpp::Pointer<  ::borogove::ChatMessage > _this1 = message->reinterpret();
-HXDLIN( 282)				::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new();
-HXDLIN( 282)				::cpp::Pointer<  ::borogove::ChatMessage > tmp1 = _this1;
-HXDLIN( 282)				result1->setUnmanagedData(tmp1,( (int)(message__len) ));
-HXDLIN( 282)				_hx_tmp1 = result1->copy();
+HXLINE( 302)				::cpp::Pointer<  ::borogove::ChatMessage > _this1 = message->reinterpret();
+HXDLIN( 302)				::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new();
+HXDLIN( 302)				::cpp::Pointer<  ::borogove::ChatMessage > tmp1 = _this1;
+HXDLIN( 302)				result1->setUnmanagedData(tmp1,( (int)(message__len) ));
+HXDLIN( 302)				_hx_tmp1 = result1->copy();
             			}
-HXLINE( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMessages(self,accountId,_hx_tmp1), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXLINE( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMessages(self,accountId,_hx_tmp1), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
 void Persistence__Companion_obj::updateMessage__fromC(::Dynamic self,::String accountId, ::borogove::ChatMessage message){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_339_updateMessage__fromC)
-HXDLIN( 339)		::borogove::Persistence_obj::updateMessage(self,accountId,message);
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_354_updateMessage__fromC)
+HXDLIN( 354)		::borogove::Persistence_obj::updateMessage(self,accountId,message);
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC3(Persistence__Companion_obj,updateMessage__fromC,(void))
 
 void Persistence__Companion_obj::updateMessageStatus__fromC(::Dynamic self,::String accountId,::String localId,int status,::String statusText,::cpp::Function< void  (void*,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_updateMessageStatus__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			::borogove::Persistence_obj::updateMessageStatus(self,accountId,localId,status,statusText);
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_updateMessageStatus__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			::borogove::Persistence_obj::updateMessageStatus(self,accountId,localId,status,statusText);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::borogove::ChatMessage v){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_updateMessageStatus__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void*,void*) > handler1 = handler;
-HXLINE( 314)				 ::Dynamic haxeObject = v;
-HXDLIN( 314)				void* ptr = haxeObject.mPtr;
-HXDLIN( 314)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 314)				{
-HXLINE( 314)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 314)					if (::hx::IsNull( store )) {
-HXLINE( 314)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_updateMessageStatus__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 314)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             					}
             					else {
-HXLINE( 314)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             					}
             				}
-HXLINE( 337)				handler1(ptr,handler__context);
+HXLINE( 365)				handler1(ptr,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_updateMessageStatus__fromC)
-HXDLIN( 337)				handler(null(),handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_updateMessageStatus__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::updateMessageStatus(self,accountId,localId,status,statusText), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::updateMessageStatus(self,accountId,localId,status,statusText), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
 void Persistence__Companion_obj::getMessage__fromC(::Dynamic self,::String accountId,::String chatId,::String serverId,::String localId,::cpp::Function< void  (void*,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_getMessage__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			::borogove::Persistence_obj::getMessage(self,accountId,chatId,serverId,localId);
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_getMessage__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			::borogove::Persistence_obj::getMessage(self,accountId,chatId,serverId,localId);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::borogove::ChatMessage v){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_getMessage__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void*,void*) > handler1 = handler;
-HXLINE( 314)				 ::Dynamic haxeObject = v;
-HXDLIN( 314)				void* ptr = haxeObject.mPtr;
-HXDLIN( 314)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 314)				{
-HXLINE( 314)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 314)					if (::hx::IsNull( store )) {
-HXLINE( 314)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_getMessage__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 314)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             					}
             					else {
-HXLINE( 314)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             					}
             				}
-HXLINE( 337)				handler1(ptr,handler__context);
+HXLINE( 365)				handler1(ptr,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_getMessage__fromC)
-HXDLIN( 337)				handler(null(),handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_getMessage__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessage(self,accountId,chatId,serverId,localId), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessage(self,accountId,chatId,serverId,localId), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
-void Persistence__Companion_obj::getMessagesBefore__fromC(::Dynamic self,::String accountId,::String chatId,::String beforeId,::String beforeTime,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_getMessagesBefore__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			::borogove::Persistence_obj::getMessagesBefore(self,accountId,chatId,beforeId,beforeTime);
+void Persistence__Companion_obj::getMessagesBefore__fromC(::Dynamic self,::String accountId,::String chatId, ::borogove::ChatMessage before,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_getMessagesBefore__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			::borogove::Persistence_obj::getMessagesBefore(self,accountId,chatId,before);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(::Array< ::Dynamic> v){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_getMessagesBefore__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
-HXLINE( 308)				{
-HXLINE( 308)					int _g = 0;
-HXDLIN( 308)					while((_g < v->length)){
-HXLINE( 308)						 ::borogove::ChatMessage el = v->__get(_g).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 308)						_g = (_g + 1);
-HXDLIN( 308)						{
-HXLINE( 308)							 ::Dynamic haxeObject = el;
-HXDLIN( 308)							void* ptr = haxeObject.mPtr;
-HXDLIN( 308)							::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 308)							{
-HXLINE( 308)								 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 308)								if (::hx::IsNull( store )) {
-HXLINE( 308)									store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            										->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            										->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 308)									::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            								}
-            								else {
-HXLINE( 308)									::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            								}
-            							}
-            						}
-            					}
-            				}
-HXDLIN( 308)				void** ptr1 = (void**)v->getBase();
-HXDLIN( 308)				::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 308)				{
-HXLINE( 308)					 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 308)					if (::hx::IsNull( store1 )) {
-HXLINE( 308)						store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            							->setFixed(1,HX_("value",71,7f,b8,31),v));
-HXDLIN( 308)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            					}
-            					else {
-HXLINE( 308)						::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            					}
-            				}
-HXLINE( 337)				handler1(ptr1,( (size_t)(v->length) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_getMessagesBefore__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
+HXDLIN( 365)				handler1(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(v),( (size_t)(v->length) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_getMessagesBefore__fromC)
-HXDLIN( 337)				handler(null(),( (size_t)(0) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_getMessagesBefore__fromC)
+HXDLIN( 365)				handler(null(),( (size_t)(0) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesBefore(self,accountId,chatId,beforeId,beforeTime), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesBefore(self,accountId,chatId,before), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
-void Persistence__Companion_obj::getMessagesAfter__fromC(::Dynamic self,::String accountId,::String chatId,::String afterId,::String afterTime,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_getMessagesAfter__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			::borogove::Persistence_obj::getMessagesAfter(self,accountId,chatId,afterId,afterTime);
+void Persistence__Companion_obj::getMessagesAfter__fromC(::Dynamic self,::String accountId,::String chatId, ::borogove::ChatMessage afterId,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_getMessagesAfter__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			::borogove::Persistence_obj::getMessagesAfter(self,accountId,chatId,afterId);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(::Array< ::Dynamic> v){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_getMessagesAfter__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
-HXLINE( 308)				{
-HXLINE( 308)					int _g = 0;
-HXDLIN( 308)					while((_g < v->length)){
-HXLINE( 308)						 ::borogove::ChatMessage el = v->__get(_g).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 308)						_g = (_g + 1);
-HXDLIN( 308)						{
-HXLINE( 308)							 ::Dynamic haxeObject = el;
-HXDLIN( 308)							void* ptr = haxeObject.mPtr;
-HXDLIN( 308)							::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 308)							{
-HXLINE( 308)								 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 308)								if (::hx::IsNull( store )) {
-HXLINE( 308)									store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            										->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            										->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 308)									::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            								}
-            								else {
-HXLINE( 308)									::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            								}
-            							}
-            						}
-            					}
-            				}
-HXDLIN( 308)				void** ptr1 = (void**)v->getBase();
-HXDLIN( 308)				::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 308)				{
-HXLINE( 308)					 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 308)					if (::hx::IsNull( store1 )) {
-HXLINE( 308)						store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            							->setFixed(1,HX_("value",71,7f,b8,31),v));
-HXDLIN( 308)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            					}
-            					else {
-HXLINE( 308)						::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            					}
-            				}
-HXLINE( 337)				handler1(ptr1,( (size_t)(v->length) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_getMessagesAfter__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
+HXDLIN( 365)				handler1(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(v),( (size_t)(v->length) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_getMessagesAfter__fromC)
-HXDLIN( 337)				handler(null(),( (size_t)(0) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_getMessagesAfter__fromC)
+HXDLIN( 365)				handler(null(),( (size_t)(0) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesAfter(self,accountId,chatId,afterId,afterTime), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesAfter(self,accountId,chatId,afterId), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
-void Persistence__Companion_obj::getMessagesAround__fromC(::Dynamic self,::String accountId,::String chatId,::String aroundId,::String aroundTime,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_getMessagesAround__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			::borogove::Persistence_obj::getMessagesAround(self,accountId,chatId,aroundId,aroundTime);
+void Persistence__Companion_obj::getMessagesAround__fromC(::Dynamic self,::String accountId, ::borogove::ChatMessage around,::cpp::Function< void  (void**,size_t,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_getMessagesAround__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			::borogove::Persistence_obj::getMessagesAround(self,accountId,around);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(::Array< ::Dynamic> v){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_getMessagesAround__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
-HXLINE( 308)				{
-HXLINE( 308)					int _g = 0;
-HXDLIN( 308)					while((_g < v->length)){
-HXLINE( 308)						 ::borogove::ChatMessage el = v->__get(_g).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 308)						_g = (_g + 1);
-HXDLIN( 308)						{
-HXLINE( 308)							 ::Dynamic haxeObject = el;
-HXDLIN( 308)							void* ptr = haxeObject.mPtr;
-HXDLIN( 308)							::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 308)							{
-HXLINE( 308)								 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 308)								if (::hx::IsNull( store )) {
-HXLINE( 308)									store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            										->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            										->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 308)									::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            								}
-            								else {
-HXLINE( 308)									::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            								}
-            							}
-            						}
-            					}
-            				}
-HXDLIN( 308)				void** ptr1 = (void**)v->getBase();
-HXDLIN( 308)				::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 308)				{
-HXLINE( 308)					 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 308)					if (::hx::IsNull( store1 )) {
-HXLINE( 308)						store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            							->setFixed(1,HX_("value",71,7f,b8,31),v));
-HXDLIN( 308)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            					}
-            					else {
-HXLINE( 308)						::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            					}
-            				}
-HXLINE( 337)				handler1(ptr1,( (size_t)(v->length) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_getMessagesAround__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void**,size_t,void*) > handler1 = handler;
+HXDLIN( 365)				handler1(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(v),( (size_t)(v->length) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_getMessagesAround__fromC)
-HXDLIN( 337)				handler(null(),( (size_t)(0) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_getMessagesAround__fromC)
+HXDLIN( 365)				handler(null(),( (size_t)(0) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesAround(self,accountId,chatId,aroundId,aroundTime), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getMessagesAround(self,accountId,around), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
 void Persistence__Companion_obj::hasMedia__fromC(::Dynamic self,::String hashAlgorithm,::cpp::Pointer< unsigned char > hash,size_t hash__len,::cpp::Function< void  (bool,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_hasMedia__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXLINE( 282)			::Array< unsigned char > _hx_tmp;
-HXDLIN( 282)			if (::hx::IsNull( hash )) {
-HXLINE( 282)				_hx_tmp = null();
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_hasMedia__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXLINE( 302)			::Array< unsigned char > _hx_tmp;
+HXDLIN( 302)			if (::hx::IsNull( hash )) {
+HXLINE( 302)				_hx_tmp = ::Array_obj< unsigned char >::__new(0);
             			}
             			else {
-HXLINE( 282)				::cpp::Pointer< unsigned char > _this = hash->reinterpret();
-HXDLIN( 282)				::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
-HXDLIN( 282)				::cpp::Pointer< unsigned char > tmp = _this;
-HXDLIN( 282)				result->setUnmanagedData(tmp,( (int)(hash__len) ));
-HXDLIN( 282)				_hx_tmp = result->copy();
+HXLINE( 302)				::cpp::Pointer< unsigned char > _this = hash->reinterpret();
+HXDLIN( 302)				::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)				::cpp::Pointer< unsigned char > tmp = _this;
+HXDLIN( 302)				result->setUnmanagedData(tmp,( (int)(hash__len) ));
+HXDLIN( 302)				_hx_tmp = result->copy();
             			}
-HXLINE( 337)			::borogove::Persistence_obj::hasMedia(self,hashAlgorithm,_hx_tmp);
+HXLINE( 365)			::borogove::Persistence_obj::hasMedia(self,hashAlgorithm,_hx_tmp);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(bool v){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_hasMedia__fromC)
-HXDLIN( 337)				handler(v,handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_hasMedia__fromC)
+HXDLIN( 365)				handler(v,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_hasMedia__fromC)
-HXDLIN( 337)				handler(false,handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_hasMedia__fromC)
+HXDLIN( 365)				handler(false,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 282)			::Array< unsigned char > _hx_tmp1;
-HXDLIN( 282)			if (::hx::IsNull( hash )) {
-HXLINE( 282)				_hx_tmp1 = null();
+HXLINE( 302)			::Array< unsigned char > _hx_tmp1;
+HXDLIN( 302)			if (::hx::IsNull( hash )) {
+HXLINE( 302)				_hx_tmp1 = ::Array_obj< unsigned char >::__new(0);
             			}
             			else {
-HXLINE( 282)				::cpp::Pointer< unsigned char > _this1 = hash->reinterpret();
-HXDLIN( 282)				::Array< unsigned char > result1 = ::Array_obj< unsigned char >::__new();
-HXDLIN( 282)				::cpp::Pointer< unsigned char > tmp1 = _this1;
-HXDLIN( 282)				result1->setUnmanagedData(tmp1,( (int)(hash__len) ));
-HXDLIN( 282)				_hx_tmp1 = result1->copy();
+HXLINE( 302)				::cpp::Pointer< unsigned char > _this1 = hash->reinterpret();
+HXDLIN( 302)				::Array< unsigned char > result1 = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)				::cpp::Pointer< unsigned char > tmp1 = _this1;
+HXDLIN( 302)				result1->setUnmanagedData(tmp1,( (int)(hash__len) ));
+HXDLIN( 302)				_hx_tmp1 = result1->copy();
             			}
-HXLINE( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::hasMedia(self,hashAlgorithm,_hx_tmp1), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXLINE( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::hasMedia(self,hashAlgorithm,_hx_tmp1), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
 void Persistence__Companion_obj::storeMedia__fromC(::Dynamic self,::String mime,::cpp::Pointer< unsigned char > bytes,size_t bytes__len,::cpp::Function< void  (bool,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_storeMedia__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXLINE( 282)			::Array< unsigned char > _hx_tmp;
-HXDLIN( 282)			if (::hx::IsNull( bytes )) {
-HXLINE( 282)				_hx_tmp = null();
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_storeMedia__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXLINE( 302)			::Array< unsigned char > _hx_tmp;
+HXDLIN( 302)			if (::hx::IsNull( bytes )) {
+HXLINE( 302)				_hx_tmp = ::Array_obj< unsigned char >::__new(0);
             			}
             			else {
-HXLINE( 282)				::cpp::Pointer< unsigned char > _this = bytes->reinterpret();
-HXDLIN( 282)				::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
-HXDLIN( 282)				::cpp::Pointer< unsigned char > tmp = _this;
-HXDLIN( 282)				result->setUnmanagedData(tmp,( (int)(bytes__len) ));
-HXDLIN( 282)				_hx_tmp = result->copy();
+HXLINE( 302)				::cpp::Pointer< unsigned char > _this = bytes->reinterpret();
+HXDLIN( 302)				::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)				::cpp::Pointer< unsigned char > tmp = _this;
+HXDLIN( 302)				result->setUnmanagedData(tmp,( (int)(bytes__len) ));
+HXDLIN( 302)				_hx_tmp = result->copy();
             			}
-HXLINE( 337)			::borogove::Persistence_obj::storeMedia(self,mime,_hx_tmp);
+HXLINE( 365)			::borogove::Persistence_obj::storeMedia(self,mime,_hx_tmp);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(bool v){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_storeMedia__fromC)
-HXDLIN( 337)				handler(v,handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_storeMedia__fromC)
+HXDLIN( 365)				handler(v,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_storeMedia__fromC)
-HXDLIN( 337)				handler(false,handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_storeMedia__fromC)
+HXDLIN( 365)				handler(false,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 282)			::Array< unsigned char > _hx_tmp1;
-HXDLIN( 282)			if (::hx::IsNull( bytes )) {
-HXLINE( 282)				_hx_tmp1 = null();
+HXLINE( 302)			::Array< unsigned char > _hx_tmp1;
+HXDLIN( 302)			if (::hx::IsNull( bytes )) {
+HXLINE( 302)				_hx_tmp1 = ::Array_obj< unsigned char >::__new(0);
             			}
             			else {
-HXLINE( 282)				::cpp::Pointer< unsigned char > _this1 = bytes->reinterpret();
-HXDLIN( 282)				::Array< unsigned char > result1 = ::Array_obj< unsigned char >::__new();
-HXDLIN( 282)				::cpp::Pointer< unsigned char > tmp1 = _this1;
-HXDLIN( 282)				result1->setUnmanagedData(tmp1,( (int)(bytes__len) ));
-HXDLIN( 282)				_hx_tmp1 = result1->copy();
+HXLINE( 302)				::cpp::Pointer< unsigned char > _this1 = bytes->reinterpret();
+HXDLIN( 302)				::Array< unsigned char > result1 = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)				::cpp::Pointer< unsigned char > tmp1 = _this1;
+HXDLIN( 302)				result1->setUnmanagedData(tmp1,( (int)(bytes__len) ));
+HXDLIN( 302)				_hx_tmp1 = result1->copy();
             			}
-HXLINE( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMedia(self,mime,_hx_tmp1), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXLINE( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeMedia(self,mime,_hx_tmp1), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
-void Persistence__Companion_obj::removeMedia__fromC(::Dynamic self,::String hashAlgorithm,::cpp::Pointer< unsigned char > hash,size_t hash__len){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_339_removeMedia__fromC)
-HXLINE( 282)		::Array< unsigned char > _hx_tmp;
-HXDLIN( 282)		if (::hx::IsNull( hash )) {
-HXLINE( 282)			_hx_tmp = null();
+void Persistence__Companion_obj::removeMedia__fromC(::Dynamic self,::String hashAlgorithm,::cpp::Pointer< unsigned char > hash,size_t hash__len,::cpp::Function< void  (bool,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_removeMedia__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXLINE( 302)			::Array< unsigned char > _hx_tmp;
+HXDLIN( 302)			if (::hx::IsNull( hash )) {
+HXLINE( 302)				_hx_tmp = ::Array_obj< unsigned char >::__new(0);
+            			}
+            			else {
+HXLINE( 302)				::cpp::Pointer< unsigned char > _this = hash->reinterpret();
+HXDLIN( 302)				::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)				::cpp::Pointer< unsigned char > tmp = _this;
+HXDLIN( 302)				result->setUnmanagedData(tmp,( (int)(hash__len) ));
+HXDLIN( 302)				_hx_tmp = result->copy();
+            			}
+HXLINE( 365)			::borogove::Persistence_obj::removeMedia(self,hashAlgorithm,_hx_tmp);
             		}
             		else {
-HXLINE( 282)			::cpp::Pointer< unsigned char > _this = hash->reinterpret();
-HXDLIN( 282)			::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
-HXDLIN( 282)			::cpp::Pointer< unsigned char > tmp = _this;
-HXDLIN( 282)			result->setUnmanagedData(tmp,( (int)(hash__len) ));
-HXDLIN( 282)			_hx_tmp = result->copy();
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run(bool v){
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_removeMedia__fromC)
+HXDLIN( 365)				handler(v,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::Dynamic e){
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_removeMedia__fromC)
+HXDLIN( 365)				handler(false,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+HXLINE( 302)			::Array< unsigned char > _hx_tmp1;
+HXDLIN( 302)			if (::hx::IsNull( hash )) {
+HXLINE( 302)				_hx_tmp1 = ::Array_obj< unsigned char >::__new(0);
+            			}
+            			else {
+HXLINE( 302)				::cpp::Pointer< unsigned char > _this1 = hash->reinterpret();
+HXDLIN( 302)				::Array< unsigned char > result1 = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)				::cpp::Pointer< unsigned char > tmp1 = _this1;
+HXDLIN( 302)				result1->setUnmanagedData(tmp1,( (int)(hash__len) ));
+HXDLIN( 302)				_hx_tmp1 = result1->copy();
+            			}
+HXLINE( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::removeMedia(self,hashAlgorithm,_hx_tmp1), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
-HXLINE( 339)		::borogove::Persistence_obj::removeMedia(self,hashAlgorithm,_hx_tmp);
             	}
 
 
-STATIC_HX_DEFINE_DYNAMIC_FUNC4(Persistence__Companion_obj,removeMedia__fromC,(void))
+void Persistence__Companion_obj::storeLogin__fromC(::Dynamic self,::String accountId,::String clientId,::String displayName,::String token,::cpp::Function< void  (bool,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_storeLogin__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			::borogove::Persistence_obj::storeLogin(self,accountId,clientId,displayName,token);
+            		}
+            		else {
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run(bool v){
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_storeLogin__fromC)
+HXDLIN( 365)				handler(v,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::Dynamic e){
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_storeLogin__fromC)
+HXDLIN( 365)				handler(false,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
 
-void Persistence__Companion_obj::storeLogin__fromC(::Dynamic self,::String login,::String clientId,::String displayName,::String token){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_339_storeLogin__fromC)
-HXDLIN( 339)		::borogove::Persistence_obj::storeLogin(self,login,clientId,displayName,token);
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::storeLogin(self,accountId,clientId,displayName,token), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+            		}
             	}
 
 
-STATIC_HX_DEFINE_DYNAMIC_FUNC5(Persistence__Companion_obj,storeLogin__fromC,(void))
+void Persistence__Companion_obj::removeAccount__fromC(::Dynamic self,::String accountId,bool completely,::cpp::Function< void  (bool,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_removeAccount__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			::borogove::Persistence_obj::removeAccount(self,accountId,completely);
+            		}
+            		else {
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run(bool v){
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_removeAccount__fromC)
+HXDLIN( 365)				handler(v,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
 
-void Persistence__Companion_obj::removeAccount__fromC(::Dynamic self,::String accountId,bool completely){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_339_removeAccount__fromC)
-HXDLIN( 339)		::borogove::Persistence_obj::removeAccount(self,accountId,completely);
-            	}
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::Dynamic e){
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_removeAccount__fromC)
+HXDLIN( 365)				handler(false,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
 
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::removeAccount(self,accountId,completely), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+            		}
+            	}
 
-STATIC_HX_DEFINE_DYNAMIC_FUNC3(Persistence__Companion_obj,removeAccount__fromC,(void))
 
 void Persistence__Companion_obj::listAccounts__fromC(::Dynamic self,::cpp::Function< void  (const char**,size_t,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_listAccounts__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			::borogove::Persistence_obj::listAccounts(self);
+            	HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_listAccounts__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			::borogove::Persistence_obj::listAccounts(self);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (const char** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(::Array< ::String > v){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_listAccounts__fromC)
-HXDLIN( 337)				::cpp::Function< void  (const char**,size_t,void*) > handler1 = handler;
-HXLINE( 308)				::Array< size_t > arr = ::Array_obj< size_t >::__new(v->length);
-HXDLIN( 308)				{
-HXLINE( 308)					int _g_current = 0;
-HXDLIN( 308)					::Array< ::String > _g_array = v;
-HXDLIN( 308)					while((_g_current < _g_array->length)){
-HXLINE( 308)						::String _g_value = _g_array->__get(_g_current);
-HXDLIN( 308)						_g_current = (_g_current + 1);
-HXDLIN( 308)						::String el = _g_value;
-HXDLIN( 308)						{
-HXLINE( 308)							const char* cStrPtr = el.utf8_str();
-HXDLIN( 308)							::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 308)							{
-HXLINE( 308)								 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 308)								if (::hx::IsNull( store )) {
-HXLINE(2243)									store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            										->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            										->setFixed(1,HX_("value",71,7f,b8,31),el));
-HXLINE( 308)									::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            								}
-            								else {
-HXLINE( 308)									::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            								}
-            							}
-HXDLIN( 308)							const char* ptr = cStrPtr;
-HXDLIN( 308)							arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
-            						}
-            					}
-            				}
-HXDLIN( 308)				void** ptr1 = (void**)arr->getBase();
-HXDLIN( 308)				::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 308)				{
-HXLINE( 308)					 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 308)					if (::hx::IsNull( store1 )) {
-HXLINE(2243)						store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            							->setFixed(1,HX_("value",71,7f,b8,31),arr));
-HXLINE( 308)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            					}
-            					else {
-HXLINE( 308)						::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            					}
-            				}
-HXLINE( 337)				handler1(( (const char**)(ptr1) ),( (size_t)(v->length) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_listAccounts__fromC)
+HXDLIN( 365)				::cpp::Function< void  (const char**,size_t,void*) > handler1 = handler;
+HXDLIN( 365)				handler1(::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(v),( (size_t)(v->length) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (const char** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_337_listAccounts__fromC)
-HXDLIN( 337)				handler(null(),( (size_t)(0) ),handler__context);
+            				HX_STACKFRAME(&_hx_pos_3b8bc4f87a0221fe_365_listAccounts__fromC)
+HXDLIN( 365)				handler(null(),( (size_t)(0) ),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::listAccounts(self), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::listAccounts(self), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
@@ -698,14 +576,9 @@ bool Persistence__Companion_obj::__GetStatic(const ::String &inName, Dynamic &ou
 	switch(inName.length) {
 	case 17:
 		if (HX_FIELD_EQ(inName,"storeChats__fromC") ) { outValue = storeChats__fromC_dyn(); return true; }
-		if (HX_FIELD_EQ(inName,"storeLogin__fromC") ) { outValue = storeLogin__fromC_dyn(); return true; }
-		break;
-	case 18:
-		if (HX_FIELD_EQ(inName,"removeMedia__fromC") ) { outValue = removeMedia__fromC_dyn(); return true; }
 		break;
 	case 20:
 		if (HX_FIELD_EQ(inName,"updateMessage__fromC") ) { outValue = updateMessage__fromC_dyn(); return true; }
-		if (HX_FIELD_EQ(inName,"removeAccount__fromC") ) { outValue = removeAccount__fromC_dyn(); return true; }
 	}
 	return false;
 }
@@ -720,9 +593,6 @@ static ::hx::StaticInfo *Persistence__Companion_obj_sStaticStorageInfo = 0;
 static ::String Persistence__Companion_obj_sStaticFields[] = {
 	HX_("storeChats__fromC",bf,d8,3a,08),
 	HX_("updateMessage__fromC",7b,c9,64,15),
-	HX_("removeMedia__fromC",79,ce,9c,e1),
-	HX_("storeLogin__fromC",b1,b3,6d,31),
-	HX_("removeAccount__fromC",d0,b2,2e,61),
 	::String(null())
 };
 
@@ -752,8 +622,8 @@ void Persistence__Companion_obj::__register()
 void Persistence__Companion_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_c5ec1c5882052979_22_boot)
-HXDLIN(  22)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_c5ec1c5882052979_23_boot)
+HXDLIN(  23)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("obj",f7,8f,54,00), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("HaxeCBridge.name",13,6a,03,0e),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("borogove_Persistence",e1,59,bc,9a)))))
             			->setFixed(1,HX_("statics",05,3c,65,36), ::Dynamic(::hx::Anon_obj::Create(15)
@@ -763,27 +633,27 @@ HXDLIN(  22)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(2)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
             				->setFixed(2,HX_("getMessagesAfter__fromC",7f,68,c7,c6), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(3,HX_("getMessagesAround__fromC",ea,f6,e1,db), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(3,HX_("syncPoint__fromC",24,89,cc,cf), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(4,HX_("removeMedia__fromC",79,ce,9c,e1), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(4,HX_("getMessagesAround__fromC",ea,f6,e1,db), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(5,HX_("hasMedia__fromC",8f,ba,d6,fc), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(5,HX_("removeMedia__fromC",79,ce,9c,e1), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(6,HX_("getMessage__fromC",c8,40,46,05), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(6,HX_("hasMedia__fromC",8f,ba,d6,fc), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(7,HX_("storeChats__fromC",bf,d8,3a,08), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(7,HX_("getMessage__fromC",c8,40,46,05), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(8,HX_("updateMessage__fromC",7b,c9,64,15), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(8,HX_("storeChats__fromC",bf,d8,3a,08), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(9,HX_("storeLogin__fromC",b1,b3,6d,31), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(9,HX_("updateMessage__fromC",7b,c9,64,15), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(10,HX_("storeMessages__fromC",4c,02,a4,33), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(10,HX_("storeLogin__fromC",b1,b3,6d,31), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(11,HX_("storeMedia__fromC",96,bd,0d,42), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(11,HX_("storeMessages__fromC",4c,02,a4,33), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(12,HX_("getMessagesBefore__fromC",f8,64,51,46), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(12,HX_("storeMedia__fromC",96,bd,0d,42), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(13,HX_("lastId__fromC",c8,f0,dd,4b), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(13,HX_("getMessagesBefore__fromC",f8,64,51,46), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
             				->setFixed(14,HX_("removeAccount__fromC",d0,b2,2e,61), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null()))))));
diff --git a/Sources/c_borogove/src/borogove/Profile.cpp b/Sources/c_borogove/src/borogove/Profile.cpp
index 9a4e565..9c741a7 100644
--- a/Sources/c_borogove/src/borogove/Profile.cpp
+++ b/Sources/c_borogove/src/borogove/Profile.cpp
@@ -4,8 +4,8 @@
 #ifndef INCLUDED__HaxeCBridge_Internal
 #include <_HaxeCBridge/Internal.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_Profile
 #include <borogove/Profile.h>
@@ -30,7 +30,7 @@
 #endif
 
 HX_DEFINE_STACK_FRAME(_hx_pos_ce4ac9f79e689c3e_28_new,"borogove.Profile","new",0xd49f79ae,"borogove.Profile.new","borogove/Profile.hx",28,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_83ac2628da8a8bb8_424_items__fromC,"borogove.Profile","items__fromC",0xb735016b,"borogove.Profile.items__fromC","HaxeCBridge.hx",424,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_83ac2628da8a8bb8_452_items__fromC,"borogove.Profile","items__fromC",0xb735016b,"borogove.Profile.items__fromC","HaxeCBridge.hx",452,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_ce4ac9f79e689c3e_18_boot,"borogove.Profile","boot",0x2f03ff24,"borogove.Profile.boot","borogove/Profile.hx",18,0x841e40c3)
 namespace borogove{
 
@@ -64,7 +64,7 @@ HXDLIN(  30)					int i = (_g2 - 1);
 HXDLIN(  30)					{
 HXLINE(  32)						 ::borogove::Stanza child = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_g,i)) );
 HXDLIN(  32)						::String inValue = (child->name + HX_("/",2f,00,00,00));
-HXLINE(  30)						 ::borogove::ProfileItem inValue1 =  ::borogove::ProfileItem_obj::__alloc( HX_CTX ,child,(inValue + ::borogove::ID_obj::_hx_short()));
+HXLINE(  30)						 ::borogove::ProfileItem inValue1 =  ::borogove::ProfileItem_obj::__alloc( HX_CTX ,child,(inValue + ::_UUIDv7::UUIDv7_Fields__obj::uuidv7()));
 HXDLIN(  30)						result->__unsafe_set(i,inValue1);
             					}
             				}
@@ -90,52 +90,52 @@ bool Profile_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 size_t Profile_obj::items__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_83ac2628da8a8bb8_424_items__fromC)
-HXDLIN( 424)		::Array< ::Dynamic> x = this->items;
-HXDLIN( 424)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 424)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 424)			::Array< ::Dynamic> x1 = x;
-HXDLIN( 424)			{
-HXDLIN( 424)				int _g = 0;
-HXDLIN( 424)				while((_g < x1->length)){
-HXDLIN( 424)					 ::borogove::ProfileItem el = x1->__get(_g).StaticCast<  ::borogove::ProfileItem >();
-HXDLIN( 424)					_g = (_g + 1);
-HXDLIN( 424)					{
-HXDLIN( 424)						 ::Dynamic haxeObject = el;
-HXDLIN( 424)						void* ptr = haxeObject.mPtr;
-HXDLIN( 424)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 424)						{
-HXDLIN( 424)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 424)							if (::hx::IsNull( store )) {
-HXDLIN( 424)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_83ac2628da8a8bb8_452_items__fromC)
+HXDLIN( 452)		::Array< ::Dynamic> x = this->items;
+HXDLIN( 452)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 452)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 452)			::Array< ::Dynamic> x1 = x;
+HXDLIN( 452)			{
+HXDLIN( 452)				int _g = 0;
+HXDLIN( 452)				while((_g < x1->length)){
+HXDLIN( 452)					 ::borogove::ProfileItem el = x1->__get(_g).StaticCast<  ::borogove::ProfileItem >();
+HXDLIN( 452)					_g = (_g + 1);
+HXDLIN( 452)					{
+HXDLIN( 452)						 ::Dynamic haxeObject = el;
+HXDLIN( 452)						void* ptr = haxeObject.mPtr;
+HXDLIN( 452)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 452)						{
+HXDLIN( 452)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 452)							if (::hx::IsNull( store )) {
+HXDLIN( 452)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
             									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 424)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 452)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             							}
             							else {
-HXDLIN( 424)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXDLIN( 452)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             							}
             						}
             					}
             				}
             			}
-HXDLIN( 424)			void** ptr1 = (void**)x1->getBase();
-HXDLIN( 424)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 424)			{
-HXDLIN( 424)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 424)				if (::hx::IsNull( store1 )) {
-HXDLIN( 424)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
+HXDLIN( 452)			void** ptr1 = (void**)x1->getBase();
+HXDLIN( 452)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
+HXDLIN( 452)			{
+HXDLIN( 452)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
+HXDLIN( 452)				if (::hx::IsNull( store1 )) {
+HXDLIN( 452)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),x1));
-HXDLIN( 424)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
+HXDLIN( 452)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
             				}
             				else {
-HXDLIN( 424)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXDLIN( 452)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXDLIN( 424)			_hx_tmp->set_ref(ptr1);
+HXDLIN( 452)			_hx_tmp->set_ref(ptr1);
             		}
-HXDLIN( 424)		return ( (size_t)(x->length) );
+HXDLIN( 452)		return ( (size_t)(x->length) );
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/ProfileBuilder.cpp b/Sources/c_borogove/src/borogove/ProfileBuilder.cpp
index 168d181..fb34de6 100644
--- a/Sources/c_borogove/src/borogove/ProfileBuilder.cpp
+++ b/Sources/c_borogove/src/borogove/ProfileBuilder.cpp
@@ -4,8 +4,8 @@
 #ifndef INCLUDED_Lambda
 #include <Lambda.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_Profile
 #include <borogove/Profile.h>
@@ -29,56 +29,56 @@
 #include <haxe/ds/StringMap.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_330db0caed3d734f_137_new,"borogove.ProfileBuilder","new",0xd2573431,"borogove.ProfileBuilder.new","borogove/Profile.hx",137,0x841e40c3)
+HX_DEFINE_STACK_FRAME(_hx_pos_330db0caed3d734f_164_new,"borogove.ProfileBuilder","new",0xd2573431,"borogove.ProfileBuilder.new","borogove/Profile.hx",164,0x841e40c3)
 static const ::String _hx_array_data_596347bf_3[] = {
 	HX_("n",6e,00,00,00),HX_("adr",2f,f2,49,00),HX_("gender",41,73,3c,9f),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_157_add,"borogove.ProfileBuilder","add",0xd24d55f2,"borogove.ProfileBuilder.add","borogove/Profile.hx",157,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_174_set,"borogove.ProfileBuilder","set",0xd25aff73,"borogove.ProfileBuilder.set","borogove/Profile.hx",174,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_171_set,"borogove.ProfileBuilder","set",0xd25aff73,"borogove.ProfileBuilder.set","borogove/Profile.hx",171,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_193_move,"borogove.ProfileBuilder","move",0x3954d620,"borogove.ProfileBuilder.move","borogove/Profile.hx",193,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_196_move,"borogove.ProfileBuilder","move",0x3954d620,"borogove.ProfileBuilder.move","borogove/Profile.hx",196,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_192_move,"borogove.ProfileBuilder","move",0x3954d620,"borogove.ProfileBuilder.move","borogove/Profile.hx",192,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_206_remove,"borogove.ProfileBuilder","remove",0x10aab113,"borogove.ProfileBuilder.remove","borogove/Profile.hx",206,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_205_remove,"borogove.ProfileBuilder","remove",0x10aab113,"borogove.ProfileBuilder.remove","borogove/Profile.hx",205,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_214_build,"borogove.ProfileBuilder","build",0x9f6b953f,"borogove.ProfileBuilder.build","borogove/Profile.hx",214,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_219_buildStanza,"borogove.ProfileBuilder","buildStanza",0xf61d6094,"borogove.ProfileBuilder.buildStanza","borogove/Profile.hx",219,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_187_add,"borogove.ProfileBuilder","add",0xd24d55f2,"borogove.ProfileBuilder.add","borogove/Profile.hx",187,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_204_set,"borogove.ProfileBuilder","set",0xd25aff73,"borogove.ProfileBuilder.set","borogove/Profile.hx",204,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_201_set,"borogove.ProfileBuilder","set",0xd25aff73,"borogove.ProfileBuilder.set","borogove/Profile.hx",201,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_223_move,"borogove.ProfileBuilder","move",0x3954d620,"borogove.ProfileBuilder.move","borogove/Profile.hx",223,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_226_move,"borogove.ProfileBuilder","move",0x3954d620,"borogove.ProfileBuilder.move","borogove/Profile.hx",226,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_222_move,"borogove.ProfileBuilder","move",0x3954d620,"borogove.ProfileBuilder.move","borogove/Profile.hx",222,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_236_remove,"borogove.ProfileBuilder","remove",0x10aab113,"borogove.ProfileBuilder.remove","borogove/Profile.hx",236,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_235_remove,"borogove.ProfileBuilder","remove",0x10aab113,"borogove.ProfileBuilder.remove","borogove/Profile.hx",235,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_247_build,"borogove.ProfileBuilder","build",0x9f6b953f,"borogove.ProfileBuilder.build","borogove/Profile.hx",247,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_330db0caed3d734f_252_buildStanza,"borogove.ProfileBuilder","buildStanza",0xf61d6094,"borogove.ProfileBuilder.buildStanza","borogove/Profile.hx",252,0x841e40c3)
 namespace borogove{
 
 void ProfileBuilder_obj::__construct( ::borogove::Profile profile){
-            	HX_GC_STACKFRAME(&_hx_pos_330db0caed3d734f_137_new)
-HXLINE( 139)		this->items = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 142)		this->vcard = profile->vcard->clone();
-HXLINE( 143)		::Array< ::Dynamic> _this = this->vcard->allTags(null(),null());
-HXDLIN( 143)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 143)		{
-HXLINE( 143)			int _g1 = 0;
-HXDLIN( 143)			while((_g1 < _this->length)){
-HXLINE( 143)				 ::borogove::Stanza v = _this->__get(_g1).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 143)				_g1 = (_g1 + 1);
-HXDLIN( 143)				if (!(::Array_obj< ::String >::fromData( _hx_array_data_596347bf_3,3)->contains(v->name))) {
-HXLINE( 143)					_g->push(v);
+            	HX_GC_STACKFRAME(&_hx_pos_330db0caed3d734f_164_new)
+HXLINE( 166)		this->items = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 172)		this->vcard = profile->vcard->clone();
+HXLINE( 173)		::Array< ::Dynamic> _this = this->vcard->allTags(null(),null());
+HXDLIN( 173)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 173)		{
+HXLINE( 173)			int _g1 = 0;
+HXDLIN( 173)			while((_g1 < _this->length)){
+HXLINE( 173)				 ::borogove::Stanza v = _this->__get(_g1).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 173)				_g1 = (_g1 + 1);
+HXDLIN( 173)				if (!(::Array_obj< ::String >::fromData( _hx_array_data_596347bf_3,3)->contains(v->name))) {
+HXLINE( 173)					_g->push(v);
             				}
             			}
             		}
-HXLINE( 147)		{
-HXLINE( 147)			int _g2 = 0;
-HXDLIN( 147)			::Array< ::Dynamic> _g3 = profile->items;
-HXDLIN( 147)			while((_g2 < _g3->length)){
-HXLINE( 147)				 ::borogove::ProfileItem item = _g3->__get(_g2).StaticCast<  ::borogove::ProfileItem >();
-HXDLIN( 147)				_g2 = (_g2 + 1);
-HXLINE( 148)				 ::borogove::Stanza el = _g->shift().StaticCast<  ::borogove::Stanza >();
-HXLINE( 149)				bool _hx_tmp;
-HXDLIN( 149)				if (::hx::IsNotNull( el )) {
-HXLINE( 149)					_hx_tmp = (el->name != item->key);
+HXLINE( 177)		{
+HXLINE( 177)			int _g2 = 0;
+HXDLIN( 177)			::Array< ::Dynamic> _g3 = profile->items;
+HXDLIN( 177)			while((_g2 < _g3->length)){
+HXLINE( 177)				 ::borogove::ProfileItem item = _g3->__get(_g2).StaticCast<  ::borogove::ProfileItem >();
+HXDLIN( 177)				_g2 = (_g2 + 1);
+HXLINE( 178)				 ::borogove::Stanza el = _g->shift().StaticCast<  ::borogove::Stanza >();
+HXLINE( 179)				bool _hx_tmp;
+HXDLIN( 179)				if (::hx::IsNotNull( el )) {
+HXLINE( 179)					_hx_tmp = (el->name != item->key);
             				}
             				else {
-HXLINE( 149)					_hx_tmp = true;
+HXLINE( 179)					_hx_tmp = true;
             				}
-HXDLIN( 149)				if (_hx_tmp) {
-HXLINE( 149)					HX_STACK_DO_THROW(HX_("els/items mismatch",31,ac,3f,bf));
+HXDLIN( 179)				if (_hx_tmp) {
+HXLINE( 179)					HX_STACK_DO_THROW(HX_("els/items mismatch",31,ac,3f,bf));
             				}
-HXLINE( 150)				this->items->push( ::borogove::ProfileItem_obj::__alloc( HX_CTX ,el,item->id));
+HXLINE( 180)				this->items->push( ::borogove::ProfileItem_obj::__alloc( HX_CTX ,el,item->id));
             			}
             		}
             	}
@@ -99,16 +99,16 @@ bool ProfileBuilder_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 void ProfileBuilder_obj::add(::String k,::String v){
-            	HX_GC_STACKFRAME(&_hx_pos_330db0caed3d734f_157_add)
-HXLINE( 158)		::String type = ::borogove::_Profile::Profile_Fields__obj::TYPES->get_string(k);
-HXLINE( 159)		if (::hx::IsNotNull( type )) {
-HXLINE( 160)			 ::borogove::Stanza el =  ::borogove::Stanza_obj::__alloc( HX_CTX ,k,null())->textTag(type,v,null());
-HXLINE( 161)			this->vcard->addChild(el);
-HXLINE( 162)			::Array< ::Dynamic> _hx_tmp = this->items;
-HXDLIN( 162)			_hx_tmp->push( ::borogove::ProfileItem_obj::__alloc( HX_CTX ,el,((k + HX_("/",2f,00,00,00)) + ::borogove::ID_obj::_hx_short())));
+            	HX_GC_STACKFRAME(&_hx_pos_330db0caed3d734f_187_add)
+HXLINE( 188)		::String type = ::borogove::_Profile::Profile_Fields__obj::TYPES->get_string(k);
+HXLINE( 189)		if (::hx::IsNotNull( type )) {
+HXLINE( 190)			 ::borogove::Stanza el =  ::borogove::Stanza_obj::__alloc( HX_CTX ,k,null())->textTag(type,v,null());
+HXLINE( 191)			this->vcard->addChild(el);
+HXLINE( 192)			::Array< ::Dynamic> _hx_tmp = this->items;
+HXDLIN( 192)			_hx_tmp->push( ::borogove::ProfileItem_obj::__alloc( HX_CTX ,el,((k + HX_("/",2f,00,00,00)) + ::_UUIDv7::UUIDv7_Fields__obj::uuidv7())));
             		}
             		else {
-HXLINE( 164)			HX_STACK_DO_THROW((HX_("Unknown profile property ",3e,fe,b6,f1) + k));
+HXLINE( 194)			HX_STACK_DO_THROW((HX_("Unknown profile property ",3e,fe,b6,f1) + k));
             		}
             	}
 
@@ -118,32 +118,32 @@ HX_DEFINE_DYNAMIC_FUNC2(ProfileBuilder_obj,add,(void))
 void ProfileBuilder_obj::set(::String id,::String v){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0,::String,id) HXARGC(1)
             		bool _hx_run( ::borogove::ProfileItem item){
-            			HX_STACKFRAME(&_hx_pos_330db0caed3d734f_174_set)
-HXLINE( 174)			return (item->id == id);
+            			HX_STACKFRAME(&_hx_pos_330db0caed3d734f_204_set)
+HXLINE( 204)			return (item->id == id);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_330db0caed3d734f_171_set)
-HXLINE( 172)		::Array< ::String > parts = id.split(HX_("/",2f,00,00,00));
-HXLINE( 173)		::String k = parts->__get(0);
-HXLINE( 174)		 ::borogove::ProfileItem tmp = ( ( ::borogove::ProfileItem)(::Lambda_obj::find(this->items, ::Dynamic(new _hx_Closure_0(id)))) );
-HXDLIN( 174)		 ::borogove::Stanza prop;
-HXDLIN( 174)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 174)			prop = tmp->item;
+            	HX_STACKFRAME(&_hx_pos_330db0caed3d734f_201_set)
+HXLINE( 202)		::Array< ::String > parts = id.split(HX_("/",2f,00,00,00));
+HXLINE( 203)		::String k = parts->__get(0);
+HXLINE( 204)		 ::borogove::ProfileItem tmp = ( ( ::borogove::ProfileItem)(::Lambda_obj::find(this->items, ::Dynamic(new _hx_Closure_0(id)))) );
+HXDLIN( 204)		 ::borogove::Stanza prop;
+HXDLIN( 204)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 204)			prop = tmp->item;
             		}
             		else {
-HXLINE( 174)			prop = null();
+HXLINE( 204)			prop = null();
             		}
-HXLINE( 175)		if (::hx::IsNull( prop )) {
-HXLINE( 175)			HX_STACK_DO_THROW((HX_("prop not found for ",5f,11,d5,80) + id));
+HXLINE( 205)		if (::hx::IsNull( prop )) {
+HXLINE( 205)			HX_STACK_DO_THROW((HX_("prop not found for ",5f,11,d5,80) + id));
             		}
-HXLINE( 177)		::String type = ::borogove::_Profile::Profile_Fields__obj::TYPES->get_string(k);
-HXLINE( 178)		if (::hx::IsNotNull( type )) {
-HXLINE( 179)			prop->removeChildren(null(),null());
-HXLINE( 180)			prop->textTag(type,v,null());
+HXLINE( 207)		::String type = ::borogove::_Profile::Profile_Fields__obj::TYPES->get_string(k);
+HXLINE( 208)		if (::hx::IsNotNull( type )) {
+HXLINE( 209)			prop->removeChildren(null(),null());
+HXLINE( 210)			prop->textTag(type,v,null());
             		}
             		else {
-HXLINE( 182)			HX_STACK_DO_THROW((HX_("Unknown profile property ",3e,fe,b6,f1) + k));
+HXLINE( 212)			HX_STACK_DO_THROW((HX_("Unknown profile property ",3e,fe,b6,f1) + k));
             		}
             	}
 
@@ -153,27 +153,27 @@ HX_DEFINE_DYNAMIC_FUNC2(ProfileBuilder_obj,set,(void))
 void ProfileBuilder_obj::move(::String id,::String moveTo){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0,::String,id) HXARGC(1)
             		bool _hx_run( ::borogove::ProfileItem item){
-            			HX_STACKFRAME(&_hx_pos_330db0caed3d734f_193_move)
-HXLINE( 193)			return (item->id == id);
+            			HX_STACKFRAME(&_hx_pos_330db0caed3d734f_223_move)
+HXLINE( 223)			return (item->id == id);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1,::String,moveTo) HXARGC(1)
             		bool _hx_run( ::borogove::ProfileItem item){
-            			HX_STACKFRAME(&_hx_pos_330db0caed3d734f_196_move)
-HXLINE( 196)			return (item->id == moveTo);
+            			HX_STACKFRAME(&_hx_pos_330db0caed3d734f_226_move)
+HXLINE( 226)			return (item->id == moveTo);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_330db0caed3d734f_192_move)
-HXLINE( 193)		 ::borogove::ProfileItem move = ( ( ::borogove::ProfileItem)(::Lambda_obj::find(this->items, ::Dynamic(new _hx_Closure_0(id)))) );
-HXLINE( 194)		if (::hx::IsNull( move )) {
-HXLINE( 194)			HX_STACK_DO_THROW(((HX_("item ",ad,ab,0c,c2) + id) + HX_(" not found",55,f3,a5,21)));
+            	HX_STACKFRAME(&_hx_pos_330db0caed3d734f_222_move)
+HXLINE( 223)		 ::borogove::ProfileItem move = ( ( ::borogove::ProfileItem)(::Lambda_obj::find(this->items, ::Dynamic(new _hx_Closure_0(id)))) );
+HXLINE( 224)		if (::hx::IsNull( move )) {
+HXLINE( 224)			HX_STACK_DO_THROW(((HX_("item ",ad,ab,0c,c2) + id) + HX_(" not found",55,f3,a5,21)));
             		}
-HXLINE( 196)		int idx = ::Lambda_obj::findIndex(this->items, ::Dynamic(new _hx_Closure_1(moveTo)));
-HXLINE( 197)		this->remove(id);
-HXLINE( 198)		this->items->insert(idx,move);
-HXLINE( 199)		this->vcard->insertChild(idx,move->item);
+HXLINE( 226)		int idx = ::Lambda_obj::findIndex(this->items, ::Dynamic(new _hx_Closure_1(moveTo)));
+HXLINE( 227)		this->remove(id);
+HXLINE( 228)		this->items->insert(idx,move);
+HXLINE( 229)		this->vcard->insertChild(idx,move->item);
             	}
 
 
@@ -182,47 +182,47 @@ HX_DEFINE_DYNAMIC_FUNC2(ProfileBuilder_obj,move,(void))
 void ProfileBuilder_obj::remove(::String id){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0,::String,id) HXARGC(1)
             		bool _hx_run( ::borogove::ProfileItem item){
-            			HX_STACKFRAME(&_hx_pos_330db0caed3d734f_206_remove)
-HXLINE( 206)			return (item->id == id);
+            			HX_STACKFRAME(&_hx_pos_330db0caed3d734f_236_remove)
+HXLINE( 236)			return (item->id == id);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_330db0caed3d734f_205_remove)
-HXLINE( 206)		 ::borogove::ProfileItem prop = ( ( ::borogove::ProfileItem)(::Lambda_obj::find(this->items, ::Dynamic(new _hx_Closure_0(id)))) );
-HXLINE( 207)		if (::hx::IsNull( prop )) {
-HXLINE( 207)			return;
+            	HX_STACKFRAME(&_hx_pos_330db0caed3d734f_235_remove)
+HXLINE( 236)		 ::borogove::ProfileItem prop = ( ( ::borogove::ProfileItem)(::Lambda_obj::find(this->items, ::Dynamic(new _hx_Closure_0(id)))) );
+HXLINE( 237)		if (::hx::IsNull( prop )) {
+HXLINE( 237)			return;
             		}
-HXLINE( 209)		::Array< ::Dynamic> _this = this->items;
-HXDLIN( 209)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 209)		{
-HXLINE( 209)			int _g1 = 0;
-HXDLIN( 209)			while((_g1 < _this->length)){
-HXLINE( 209)				 ::borogove::ProfileItem v = _this->__get(_g1).StaticCast<  ::borogove::ProfileItem >();
-HXDLIN( 209)				_g1 = (_g1 + 1);
-HXDLIN( 209)				if ((v->id != id)) {
-HXLINE( 209)					_g->push(v);
+HXLINE( 239)		::Array< ::Dynamic> _this = this->items;
+HXDLIN( 239)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 239)		{
+HXLINE( 239)			int _g1 = 0;
+HXDLIN( 239)			while((_g1 < _this->length)){
+HXLINE( 239)				 ::borogove::ProfileItem v = _this->__get(_g1).StaticCast<  ::borogove::ProfileItem >();
+HXDLIN( 239)				_g1 = (_g1 + 1);
+HXDLIN( 239)				if ((v->id != id)) {
+HXLINE( 239)					_g->push(v);
             				}
             			}
             		}
-HXDLIN( 209)		this->items = _g;
-HXLINE( 210)		this->vcard->removeChild(prop->item);
+HXDLIN( 239)		this->items = _g;
+HXLINE( 240)		this->vcard->removeChild(prop->item);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ProfileBuilder_obj,remove,(void))
 
  ::borogove::Profile ProfileBuilder_obj::build(){
-            	HX_GC_STACKFRAME(&_hx_pos_330db0caed3d734f_214_build)
-HXDLIN( 214)		 ::borogove::Stanza _hx_tmp = this->vcard->clone();
-HXDLIN( 214)		return  ::borogove::Profile_obj::__alloc( HX_CTX ,_hx_tmp,::Lambda_obj::array(this->items));
+            	HX_GC_STACKFRAME(&_hx_pos_330db0caed3d734f_247_build)
+HXDLIN( 247)		 ::borogove::Stanza _hx_tmp = this->vcard->clone();
+HXDLIN( 247)		return  ::borogove::Profile_obj::__alloc( HX_CTX ,_hx_tmp,::Lambda_obj::array(this->items));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ProfileBuilder_obj,build,return )
 
  ::borogove::Stanza ProfileBuilder_obj::buildStanza(){
-            	HX_STACKFRAME(&_hx_pos_330db0caed3d734f_219_buildStanza)
-HXDLIN( 219)		return this->vcard->clone();
+            	HX_STACKFRAME(&_hx_pos_330db0caed3d734f_252_buildStanza)
+HXDLIN( 252)		return this->vcard->clone();
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/ProfileItem.cpp b/Sources/c_borogove/src/borogove/ProfileItem.cpp
index da7d8a8..9648888 100644
--- a/Sources/c_borogove/src/borogove/ProfileItem.cpp
+++ b/Sources/c_borogove/src/borogove/ProfileItem.cpp
@@ -4,11 +4,14 @@
 #ifndef INCLUDED_Std
 #include <Std.h>
 #endif
-#ifndef INCLUDED__HaxeCBridge_Internal
-#include <_HaxeCBridge/Internal.h>
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__HaxeCBridge_HaxeStringArray_Impl_
+#include <_HaxeCBridge/HaxeStringArray_Impl_.h>
+#endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_ProfileItem
 #include <borogove/ProfileItem.h>
@@ -16,32 +19,26 @@
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
-#ifndef INCLUDED_cpp_Int64Map
-#include <cpp/Int64Map.h>
-#endif
-#ifndef INCLUDED_haxe_IMap
-#include <haxe/IMap.h>
-#endif
 
 HX_DEFINE_STACK_FRAME(_hx_pos_f70289cea0098992_50_new,"borogove.ProfileItem","new",0x1a958e61,"borogove.ProfileItem.new","borogove/Profile.hx",50,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_450_id__fromC,"borogove.ProfileItem","id__fromC",0x265ecabf,"borogove.ProfileItem.id__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_450_key__fromC,"borogove.ProfileItem","key__fromC",0xdbe75cd9,"borogove.ProfileItem.key__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_56_parameters,"borogove.ProfileItem","parameters",0x1b4332c9,"borogove.ProfileItem.parameters","borogove/Profile.hx",56,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_335_parameters__fromC,"borogove.ProfileItem","parameters__fromC",0x56ef18d0,"borogove.ProfileItem.parameters__fromC","HaxeCBridge.hx",335,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_62_text,"borogove.ProfileItem","text",0x2c3e4f8c,"borogove.ProfileItem.text","borogove/Profile.hx",62,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_335_text__fromC,"borogove.ProfileItem","text__fromC",0x413c6a6d,"borogove.ProfileItem.text__fromC","HaxeCBridge.hx",335,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_66_uri,"borogove.ProfileItem","uri",0x1a9ae96d,"borogove.ProfileItem.uri","borogove/Profile.hx",66,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_335_uri__fromC,"borogove.ProfileItem","uri__fromC",0x81eb3eac,"borogove.ProfileItem.uri__fromC","HaxeCBridge.hx",335,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_70_date,"borogove.ProfileItem","date",0x21a7d90d,"borogove.ProfileItem.date","borogove/Profile.hx",70,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_335_date__fromC,"borogove.ProfileItem","date__fromC",0x8c71830c,"borogove.ProfileItem.date__fromC","HaxeCBridge.hx",335,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_74_time,"borogove.ProfileItem","time",0x2c414eec,"borogove.ProfileItem.time","borogove/Profile.hx",74,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_335_time__fromC,"borogove.ProfileItem","time__fromC",0xd812170d,"borogove.ProfileItem.time__fromC","HaxeCBridge.hx",335,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_78_datetime,"borogove.ProfileItem","datetime",0x3e3aaf9a,"borogove.ProfileItem.datetime","borogove/Profile.hx",78,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_335_datetime__fromC,"borogove.ProfileItem","datetime__fromC",0xb24e481f,"borogove.ProfileItem.datetime__fromC","HaxeCBridge.hx",335,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_83_boolean,"borogove.ProfileItem","boolean",0x025e3d29,"borogove.ProfileItem.boolean","borogove/Profile.hx",83,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_88_integer,"borogove.ProfileItem","integer",0x9b7b103f,"borogove.ProfileItem.integer","borogove/Profile.hx",88,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_92_languageTag,"borogove.ProfileItem","languageTag",0xfe6a7fe3,"borogove.ProfileItem.languageTag","borogove/Profile.hx",92,0x841e40c3)
-HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_335_languageTag__fromC,"borogove.ProfileItem","languageTag__fromC",0x321b02f6,"borogove.ProfileItem.languageTag__fromC","HaxeCBridge.hx",335,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_478_id__fromC,"borogove.ProfileItem","id__fromC",0x265ecabf,"borogove.ProfileItem.id__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_478_key__fromC,"borogove.ProfileItem","key__fromC",0xdbe75cd9,"borogove.ProfileItem.key__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_59_parameters,"borogove.ProfileItem","parameters",0x1b4332c9,"borogove.ProfileItem.parameters","borogove/Profile.hx",59,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_363_parameters__fromC,"borogove.ProfileItem","parameters__fromC",0x56ef18d0,"borogove.ProfileItem.parameters__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_68_text,"borogove.ProfileItem","text",0x2c3e4f8c,"borogove.ProfileItem.text","borogove/Profile.hx",68,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_363_text__fromC,"borogove.ProfileItem","text__fromC",0x413c6a6d,"borogove.ProfileItem.text__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_75_uri,"borogove.ProfileItem","uri",0x1a9ae96d,"borogove.ProfileItem.uri","borogove/Profile.hx",75,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_363_uri__fromC,"borogove.ProfileItem","uri__fromC",0x81eb3eac,"borogove.ProfileItem.uri__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_82_date,"borogove.ProfileItem","date",0x21a7d90d,"borogove.ProfileItem.date","borogove/Profile.hx",82,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_363_date__fromC,"borogove.ProfileItem","date__fromC",0x8c71830c,"borogove.ProfileItem.date__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_89_time,"borogove.ProfileItem","time",0x2c414eec,"borogove.ProfileItem.time","borogove/Profile.hx",89,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_363_time__fromC,"borogove.ProfileItem","time__fromC",0xd812170d,"borogove.ProfileItem.time__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_96_datetime,"borogove.ProfileItem","datetime",0x3e3aaf9a,"borogove.ProfileItem.datetime","borogove/Profile.hx",96,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_363_datetime__fromC,"borogove.ProfileItem","datetime__fromC",0xb24e481f,"borogove.ProfileItem.datetime__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_104_boolean,"borogove.ProfileItem","boolean",0x025e3d29,"borogove.ProfileItem.boolean","borogove/Profile.hx",104,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_112_integer,"borogove.ProfileItem","integer",0x9b7b103f,"borogove.ProfileItem.integer","borogove/Profile.hx",112,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_119_languageTag,"borogove.ProfileItem","languageTag",0xfe6a7fe3,"borogove.ProfileItem.languageTag","borogove/Profile.hx",119,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_fe69ecc873f78d42_363_languageTag__fromC,"borogove.ProfileItem","languageTag__fromC",0x321b02f6,"borogove.ProfileItem.languageTag__fromC","HaxeCBridge.hx",363,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_f70289cea0098992_42_boot,"borogove.ProfileItem","boot",0x20600711,"borogove.ProfileItem.boot","borogove/Profile.hx",42,0x841e40c3)
 namespace borogove{
 
@@ -68,606 +65,316 @@ bool ProfileItem_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String ProfileItem_obj::id__fromC(){
-            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_450_id__fromC)
-HXDLIN( 450)		return this->id;
+            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_478_id__fromC)
+HXDLIN( 478)		return this->id;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ProfileItem_obj,id__fromC,return )
 
 ::String ProfileItem_obj::key__fromC(){
-            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_450_key__fromC)
-HXDLIN( 450)		return this->key;
+            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_478_key__fromC)
+HXDLIN( 478)		return this->key;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ProfileItem_obj,key__fromC,return )
 
 ::Array< ::Dynamic> ProfileItem_obj::parameters(){
-            	HX_GC_STACKFRAME(&_hx_pos_f70289cea0098992_56_parameters)
-HXLINE(  57)		::Array< ::Dynamic> params;
-HXDLIN(  57)		 ::borogove::Stanza tmp = this->item->getChild(HX_("parameters",aa,be,7e,51),null());
-HXDLIN(  57)		::Array< ::Dynamic> tmp1;
-HXDLIN(  57)		if (::hx::IsNotNull( tmp )) {
-HXLINE(  57)			tmp1 = tmp->allTags(null(),null());
+            	HX_GC_STACKFRAME(&_hx_pos_f70289cea0098992_59_parameters)
+HXLINE(  60)		::Array< ::Dynamic> params;
+HXDLIN(  60)		 ::borogove::Stanza tmp = this->item->getChild(HX_("parameters",aa,be,7e,51),null());
+HXDLIN(  60)		::Array< ::Dynamic> tmp1;
+HXDLIN(  60)		if (::hx::IsNotNull( tmp )) {
+HXLINE(  60)			tmp1 = tmp->allTags(null(),null());
             		}
             		else {
-HXLINE(  57)			tmp1 = null();
+HXLINE(  60)			tmp1 = null();
             		}
-HXDLIN(  57)		if (::hx::IsNotNull( tmp1 )) {
-HXLINE(  57)			params = tmp1;
+HXDLIN(  60)		if (::hx::IsNotNull( tmp1 )) {
+HXLINE(  60)			params = tmp1;
             		}
             		else {
-HXLINE(  57)			params = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  60)			params = ::Array_obj< ::Dynamic>::__new(0);
             		}
-HXLINE(  58)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(params->length);
-HXDLIN(  58)		{
-HXLINE(  58)			int _g = 0;
-HXDLIN(  58)			int _g1 = params->length;
-HXDLIN(  58)			while((_g < _g1)){
-HXLINE(  58)				_g = (_g + 1);
-HXDLIN(  58)				int i = (_g - 1);
-HXDLIN(  58)				{
-HXLINE(  58)					 ::borogove::Stanza param = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(params,i)) );
-HXDLIN(  58)					::String inValue = (this->id + HX_("/",2f,00,00,00));
-HXDLIN(  58)					 ::borogove::ProfileItem inValue1 =  ::borogove::ProfileItem_obj::__alloc( HX_CTX ,param,(inValue + ::borogove::ID_obj::_hx_short()));
-HXDLIN(  58)					result->__unsafe_set(i,inValue1);
+HXLINE(  61)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(params->length);
+HXDLIN(  61)		{
+HXLINE(  61)			int _g = 0;
+HXDLIN(  61)			int _g1 = params->length;
+HXDLIN(  61)			while((_g < _g1)){
+HXLINE(  61)				_g = (_g + 1);
+HXDLIN(  61)				int i = (_g - 1);
+HXDLIN(  61)				{
+HXLINE(  61)					 ::borogove::Stanza param = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(params,i)) );
+HXDLIN(  61)					::String inValue = (this->id + HX_("/",2f,00,00,00));
+HXDLIN(  61)					 ::borogove::ProfileItem inValue1 =  ::borogove::ProfileItem_obj::__alloc( HX_CTX ,param,(inValue + ::_UUIDv7::UUIDv7_Fields__obj::uuidv7()));
+HXDLIN(  61)					result->__unsafe_set(i,inValue1);
             				}
             			}
             		}
-HXDLIN(  58)		return result;
+HXDLIN(  61)		return result;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ProfileItem_obj,parameters,return )
 
 size_t ProfileItem_obj::parameters__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_335_parameters__fromC)
-HXDLIN( 335)		::Array< ::Dynamic> out = this->parameters();
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g = 0;
-HXDLIN( 335)				while((_g < out->length)){
-HXDLIN( 335)					 ::borogove::ProfileItem el = out->__get(_g).StaticCast<  ::borogove::ProfileItem >();
-HXDLIN( 335)					_g = (_g + 1);
-HXDLIN( 335)					{
-HXDLIN( 335)						 ::Dynamic haxeObject = el;
-HXDLIN( 335)						void* ptr = haxeObject.mPtr;
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXDLIN( 335)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)out->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXDLIN( 335)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),out));
-HXDLIN( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_363_parameters__fromC)
+HXDLIN( 363)		::Array< ::Dynamic> out = this->parameters();
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
 ::Array< ::String > ProfileItem_obj::text(){
-            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_62_text)
-HXDLIN(  62)		::Array< ::Dynamic> _this = this->item->allTags(HX_("text",ad,cc,f9,4c),null());
-HXDLIN(  62)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN(  62)		{
-HXDLIN(  62)			int _g = 0;
-HXDLIN(  62)			int _g1 = _this->length;
-HXDLIN(  62)			while((_g < _g1)){
-HXDLIN(  62)				_g = (_g + 1);
-HXDLIN(  62)				int i = (_g - 1);
-HXDLIN(  62)				{
-HXDLIN(  62)					::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
-HXDLIN(  62)					result->__unsafe_set(i,inValue);
+            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_68_text)
+HXDLIN(  68)		::Array< ::Dynamic> _this = this->item->allTags(HX_("text",ad,cc,f9,4c),null());
+HXDLIN(  68)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN(  68)		{
+HXDLIN(  68)			int _g = 0;
+HXDLIN(  68)			int _g1 = _this->length;
+HXDLIN(  68)			while((_g < _g1)){
+HXDLIN(  68)				_g = (_g + 1);
+HXDLIN(  68)				int i = (_g - 1);
+HXDLIN(  68)				{
+HXDLIN(  68)					::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
+HXDLIN(  68)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN(  62)		return result;
+HXDLIN(  68)		return result;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ProfileItem_obj,text,return )
 
 size_t ProfileItem_obj::text__fromC(const char*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_335_text__fromC)
-HXDLIN( 335)		::Array< ::String > out = this->text();
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			::Array< size_t > arr = ::Array_obj< size_t >::__new(out->length);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g_current = 0;
-HXDLIN( 335)				::Array< ::String > _g_array = out;
-HXDLIN( 335)				while((_g_current < _g_array->length)){
-HXDLIN( 335)					::String _g_value = _g_array->__get(_g_current);
-HXDLIN( 335)					_g_current = (_g_current + 1);
-HXDLIN( 335)					::String el = _g_value;
-HXDLIN( 335)					{
-HXDLIN( 335)						const char* cStrPtr = el.utf8_str();
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXLINE(2243)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),el));
-HXLINE( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-HXDLIN( 335)						const char* ptr = cStrPtr;
-HXDLIN( 335)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)arr->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXLINE(2243)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),arr));
-HXLINE( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(( (const char**)(ptr1) ));
+            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_363_text__fromC)
+HXDLIN( 363)		::Array< ::String > out = this->text();
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
 ::Array< ::String > ProfileItem_obj::uri(){
-            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_66_uri)
-HXDLIN(  66)		::Array< ::Dynamic> _this = this->item->allTags(HX_("uri",6c,2b,59,00),null());
-HXDLIN(  66)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN(  66)		{
-HXDLIN(  66)			int _g = 0;
-HXDLIN(  66)			int _g1 = _this->length;
-HXDLIN(  66)			while((_g < _g1)){
-HXDLIN(  66)				_g = (_g + 1);
-HXDLIN(  66)				int i = (_g - 1);
-HXDLIN(  66)				{
-HXDLIN(  66)					::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
-HXDLIN(  66)					result->__unsafe_set(i,inValue);
+            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_75_uri)
+HXDLIN(  75)		::Array< ::Dynamic> _this = this->item->allTags(HX_("uri",6c,2b,59,00),null());
+HXDLIN(  75)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN(  75)		{
+HXDLIN(  75)			int _g = 0;
+HXDLIN(  75)			int _g1 = _this->length;
+HXDLIN(  75)			while((_g < _g1)){
+HXDLIN(  75)				_g = (_g + 1);
+HXDLIN(  75)				int i = (_g - 1);
+HXDLIN(  75)				{
+HXDLIN(  75)					::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
+HXDLIN(  75)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN(  66)		return result;
+HXDLIN(  75)		return result;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ProfileItem_obj,uri,return )
 
 size_t ProfileItem_obj::uri__fromC(const char*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_335_uri__fromC)
-HXDLIN( 335)		::Array< ::String > out = this->uri();
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			::Array< size_t > arr = ::Array_obj< size_t >::__new(out->length);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g_current = 0;
-HXDLIN( 335)				::Array< ::String > _g_array = out;
-HXDLIN( 335)				while((_g_current < _g_array->length)){
-HXDLIN( 335)					::String _g_value = _g_array->__get(_g_current);
-HXDLIN( 335)					_g_current = (_g_current + 1);
-HXDLIN( 335)					::String el = _g_value;
-HXDLIN( 335)					{
-HXDLIN( 335)						const char* cStrPtr = el.utf8_str();
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXLINE(2243)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),el));
-HXLINE( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-HXDLIN( 335)						const char* ptr = cStrPtr;
-HXDLIN( 335)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)arr->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXLINE(2243)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),arr));
-HXLINE( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(( (const char**)(ptr1) ));
+            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_363_uri__fromC)
+HXDLIN( 363)		::Array< ::String > out = this->uri();
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
 ::Array< ::String > ProfileItem_obj::date(){
-            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_70_date)
-HXDLIN(  70)		::Array< ::Dynamic> _this = this->item->allTags(HX_("date",2e,56,63,42),null());
-HXDLIN(  70)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN(  70)		{
-HXDLIN(  70)			int _g = 0;
-HXDLIN(  70)			int _g1 = _this->length;
-HXDLIN(  70)			while((_g < _g1)){
-HXDLIN(  70)				_g = (_g + 1);
-HXDLIN(  70)				int i = (_g - 1);
-HXDLIN(  70)				{
-HXDLIN(  70)					::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
-HXDLIN(  70)					result->__unsafe_set(i,inValue);
+            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_82_date)
+HXDLIN(  82)		::Array< ::Dynamic> _this = this->item->allTags(HX_("date",2e,56,63,42),null());
+HXDLIN(  82)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN(  82)		{
+HXDLIN(  82)			int _g = 0;
+HXDLIN(  82)			int _g1 = _this->length;
+HXDLIN(  82)			while((_g < _g1)){
+HXDLIN(  82)				_g = (_g + 1);
+HXDLIN(  82)				int i = (_g - 1);
+HXDLIN(  82)				{
+HXDLIN(  82)					::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
+HXDLIN(  82)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN(  70)		return result;
+HXDLIN(  82)		return result;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ProfileItem_obj,date,return )
 
 size_t ProfileItem_obj::date__fromC(const char*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_335_date__fromC)
-HXDLIN( 335)		::Array< ::String > out = this->date();
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			::Array< size_t > arr = ::Array_obj< size_t >::__new(out->length);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g_current = 0;
-HXDLIN( 335)				::Array< ::String > _g_array = out;
-HXDLIN( 335)				while((_g_current < _g_array->length)){
-HXDLIN( 335)					::String _g_value = _g_array->__get(_g_current);
-HXDLIN( 335)					_g_current = (_g_current + 1);
-HXDLIN( 335)					::String el = _g_value;
-HXDLIN( 335)					{
-HXDLIN( 335)						const char* cStrPtr = el.utf8_str();
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXLINE(2243)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),el));
-HXLINE( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-HXDLIN( 335)						const char* ptr = cStrPtr;
-HXDLIN( 335)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)arr->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXLINE(2243)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),arr));
-HXLINE( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(( (const char**)(ptr1) ));
+            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_363_date__fromC)
+HXDLIN( 363)		::Array< ::String > out = this->date();
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
 ::Array< ::String > ProfileItem_obj::time(){
-            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_74_time)
-HXDLIN(  74)		::Array< ::Dynamic> _this = this->item->allTags(HX_("time",0d,cc,fc,4c),null());
-HXDLIN(  74)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN(  74)		{
-HXDLIN(  74)			int _g = 0;
-HXDLIN(  74)			int _g1 = _this->length;
-HXDLIN(  74)			while((_g < _g1)){
-HXDLIN(  74)				_g = (_g + 1);
-HXDLIN(  74)				int i = (_g - 1);
-HXDLIN(  74)				{
-HXDLIN(  74)					::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
-HXDLIN(  74)					result->__unsafe_set(i,inValue);
+            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_89_time)
+HXDLIN(  89)		::Array< ::Dynamic> _this = this->item->allTags(HX_("time",0d,cc,fc,4c),null());
+HXDLIN(  89)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN(  89)		{
+HXDLIN(  89)			int _g = 0;
+HXDLIN(  89)			int _g1 = _this->length;
+HXDLIN(  89)			while((_g < _g1)){
+HXDLIN(  89)				_g = (_g + 1);
+HXDLIN(  89)				int i = (_g - 1);
+HXDLIN(  89)				{
+HXDLIN(  89)					::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
+HXDLIN(  89)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN(  74)		return result;
+HXDLIN(  89)		return result;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ProfileItem_obj,time,return )
 
 size_t ProfileItem_obj::time__fromC(const char*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_335_time__fromC)
-HXDLIN( 335)		::Array< ::String > out = this->time();
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			::Array< size_t > arr = ::Array_obj< size_t >::__new(out->length);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g_current = 0;
-HXDLIN( 335)				::Array< ::String > _g_array = out;
-HXDLIN( 335)				while((_g_current < _g_array->length)){
-HXDLIN( 335)					::String _g_value = _g_array->__get(_g_current);
-HXDLIN( 335)					_g_current = (_g_current + 1);
-HXDLIN( 335)					::String el = _g_value;
-HXDLIN( 335)					{
-HXDLIN( 335)						const char* cStrPtr = el.utf8_str();
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXLINE(2243)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),el));
-HXLINE( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-HXDLIN( 335)						const char* ptr = cStrPtr;
-HXDLIN( 335)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)arr->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXLINE(2243)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),arr));
-HXLINE( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(( (const char**)(ptr1) ));
+            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_363_time__fromC)
+HXDLIN( 363)		::Array< ::String > out = this->time();
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
 ::Array< ::String > ProfileItem_obj::datetime(){
-            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_78_datetime)
-HXDLIN(  78)		::Array< ::Dynamic> _this = this->item->allTags(HX_("datetime",3b,d1,31,ef),null());
-HXDLIN(  78)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN(  78)		{
-HXDLIN(  78)			int _g = 0;
-HXDLIN(  78)			int _g1 = _this->length;
-HXDLIN(  78)			while((_g < _g1)){
-HXDLIN(  78)				_g = (_g + 1);
-HXDLIN(  78)				int i = (_g - 1);
-HXDLIN(  78)				{
-HXDLIN(  78)					::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
-HXDLIN(  78)					result->__unsafe_set(i,inValue);
+            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_96_datetime)
+HXDLIN(  96)		::Array< ::Dynamic> _this = this->item->allTags(HX_("datetime",3b,d1,31,ef),null());
+HXDLIN(  96)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN(  96)		{
+HXDLIN(  96)			int _g = 0;
+HXDLIN(  96)			int _g1 = _this->length;
+HXDLIN(  96)			while((_g < _g1)){
+HXDLIN(  96)				_g = (_g + 1);
+HXDLIN(  96)				int i = (_g - 1);
+HXDLIN(  96)				{
+HXDLIN(  96)					::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
+HXDLIN(  96)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN(  78)		return result;
+HXDLIN(  96)		return result;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ProfileItem_obj,datetime,return )
 
 size_t ProfileItem_obj::datetime__fromC(const char*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_335_datetime__fromC)
-HXDLIN( 335)		::Array< ::String > out = this->datetime();
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			::Array< size_t > arr = ::Array_obj< size_t >::__new(out->length);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g_current = 0;
-HXDLIN( 335)				::Array< ::String > _g_array = out;
-HXDLIN( 335)				while((_g_current < _g_array->length)){
-HXDLIN( 335)					::String _g_value = _g_array->__get(_g_current);
-HXDLIN( 335)					_g_current = (_g_current + 1);
-HXDLIN( 335)					::String el = _g_value;
-HXDLIN( 335)					{
-HXDLIN( 335)						const char* cStrPtr = el.utf8_str();
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXLINE(2243)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),el));
-HXLINE( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-HXDLIN( 335)						const char* ptr = cStrPtr;
-HXDLIN( 335)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)arr->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXLINE(2243)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),arr));
-HXLINE( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(( (const char**)(ptr1) ));
+            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_363_datetime__fromC)
+HXDLIN( 363)		::Array< ::String > out = this->datetime();
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
 ::Array< bool > ProfileItem_obj::boolean(){
-            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_83_boolean)
-HXDLIN(  83)		::Array< ::Dynamic> _this = this->item->allTags(HX_("boolean",a8,ea,fe,7d),null());
-HXDLIN(  83)		::Array< bool > result = ::Array_obj< bool >::__new(_this->length);
-HXDLIN(  83)		{
-HXDLIN(  83)			int _g = 0;
-HXDLIN(  83)			int _g1 = _this->length;
-HXDLIN(  83)			while((_g < _g1)){
-HXDLIN(  83)				_g = (_g + 1);
-HXDLIN(  83)				int i = (_g - 1);
-HXDLIN(  83)				{
-HXDLIN(  83)					bool inValue = (( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText() == HX_("true",4e,a7,03,4d));
-HXDLIN(  83)					result->__unsafe_set(i,inValue);
+            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_104_boolean)
+HXDLIN( 104)		::Array< ::Dynamic> _this = this->item->allTags(HX_("boolean",a8,ea,fe,7d),null());
+HXDLIN( 104)		::Array< bool > result = ::Array_obj< bool >::__new(_this->length);
+HXDLIN( 104)		{
+HXDLIN( 104)			int _g = 0;
+HXDLIN( 104)			int _g1 = _this->length;
+HXDLIN( 104)			while((_g < _g1)){
+HXDLIN( 104)				_g = (_g + 1);
+HXDLIN( 104)				int i = (_g - 1);
+HXDLIN( 104)				{
+HXDLIN( 104)					bool inValue = (( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText() == HX_("true",4e,a7,03,4d));
+HXDLIN( 104)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN(  83)		return result;
+HXDLIN( 104)		return result;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ProfileItem_obj,boolean,return )
 
 ::Array< int > ProfileItem_obj::integer(){
-            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_88_integer)
-HXDLIN(  88)		::Array< ::Dynamic> _this = this->item->allTags(HX_("integer",be,bd,1b,17),null());
-HXDLIN(  88)		::Array< int > result = ::Array_obj< int >::__new(_this->length);
-HXDLIN(  88)		{
-HXDLIN(  88)			int _g = 0;
-HXDLIN(  88)			int _g1 = _this->length;
-HXDLIN(  88)			while((_g < _g1)){
-HXDLIN(  88)				_g = (_g + 1);
-HXDLIN(  88)				int i = (_g - 1);
-HXDLIN(  88)				{
-HXDLIN(  88)					int inValue;
-HXDLIN(  88)					 ::Dynamic tmp = ::Std_obj::parseInt(( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText());
-HXDLIN(  88)					if (::hx::IsNotNull( tmp )) {
-HXDLIN(  88)						inValue = ( (int)(tmp) );
+            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_112_integer)
+HXDLIN( 112)		::Array< ::Dynamic> _this = this->item->allTags(HX_("integer",be,bd,1b,17),null());
+HXDLIN( 112)		::Array< int > result = ::Array_obj< int >::__new(_this->length);
+HXDLIN( 112)		{
+HXDLIN( 112)			int _g = 0;
+HXDLIN( 112)			int _g1 = _this->length;
+HXDLIN( 112)			while((_g < _g1)){
+HXDLIN( 112)				_g = (_g + 1);
+HXDLIN( 112)				int i = (_g - 1);
+HXDLIN( 112)				{
+HXDLIN( 112)					int inValue;
+HXDLIN( 112)					 ::Dynamic tmp = ::Std_obj::parseInt(( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText());
+HXDLIN( 112)					if (::hx::IsNotNull( tmp )) {
+HXDLIN( 112)						inValue = ( (int)(tmp) );
             					}
             					else {
-HXDLIN(  88)						inValue = 0;
+HXDLIN( 112)						inValue = 0;
             					}
-HXDLIN(  88)					result->__unsafe_set(i,inValue);
+HXDLIN( 112)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN(  88)		return result;
+HXDLIN( 112)		return result;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ProfileItem_obj,integer,return )
 
 ::Array< ::String > ProfileItem_obj::languageTag(){
-            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_92_languageTag)
-HXDLIN(  92)		::Array< ::Dynamic> _this = this->item->allTags(HX_("language-tag",a5,80,2b,6a),null());
-HXDLIN(  92)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN(  92)		{
-HXDLIN(  92)			int _g = 0;
-HXDLIN(  92)			int _g1 = _this->length;
-HXDLIN(  92)			while((_g < _g1)){
-HXDLIN(  92)				_g = (_g + 1);
-HXDLIN(  92)				int i = (_g - 1);
-HXDLIN(  92)				{
-HXDLIN(  92)					::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
-HXDLIN(  92)					result->__unsafe_set(i,inValue);
+            	HX_STACKFRAME(&_hx_pos_f70289cea0098992_119_languageTag)
+HXDLIN( 119)		::Array< ::Dynamic> _this = this->item->allTags(HX_("language-tag",a5,80,2b,6a),null());
+HXDLIN( 119)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN( 119)		{
+HXDLIN( 119)			int _g = 0;
+HXDLIN( 119)			int _g1 = _this->length;
+HXDLIN( 119)			while((_g < _g1)){
+HXDLIN( 119)				_g = (_g + 1);
+HXDLIN( 119)				int i = (_g - 1);
+HXDLIN( 119)				{
+HXDLIN( 119)					::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
+HXDLIN( 119)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN(  92)		return result;
+HXDLIN( 119)		return result;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ProfileItem_obj,languageTag,return )
 
 size_t ProfileItem_obj::languageTag__fromC(const char*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_335_languageTag__fromC)
-HXDLIN( 335)		::Array< ::String > out = this->languageTag();
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			::Array< size_t > arr = ::Array_obj< size_t >::__new(out->length);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g_current = 0;
-HXDLIN( 335)				::Array< ::String > _g_array = out;
-HXDLIN( 335)				while((_g_current < _g_array->length)){
-HXDLIN( 335)					::String _g_value = _g_array->__get(_g_current);
-HXDLIN( 335)					_g_current = (_g_current + 1);
-HXDLIN( 335)					::String el = _g_value;
-HXDLIN( 335)					{
-HXDLIN( 335)						const char* cStrPtr = el.utf8_str();
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXLINE(2243)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),el));
-HXLINE( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-HXDLIN( 335)						const char* ptr = cStrPtr;
-HXDLIN( 335)						arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)arr->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXLINE(2243)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),arr));
-HXLINE( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(( (const char**)(ptr1) ));
+            	HX_STACKFRAME(&_hx_pos_fe69ecc873f78d42_363_languageTag__fromC)
+HXDLIN( 363)		::Array< ::String > out = this->languageTag();
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< const char** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeStringArray_Impl__obj::fromNullableArrayString(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/Push.cpp b/Sources/c_borogove/src/borogove/Push.cpp
index c33a8e6..4811716 100644
--- a/Sources/c_borogove/src/borogove/Push.cpp
+++ b/Sources/c_borogove/src/borogove/Push.cpp
@@ -4,6 +4,9 @@
 #ifndef INCLUDED_Reflect
 #include <Reflect.h>
 #endif
+#ifndef INCLUDED__FractionalIndexing_FractionalIndexing_Fields_
+#include <_FractionalIndexing/FractionalIndexing_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_ChatMessage
 #include <borogove/ChatMessage.h>
 #endif
@@ -28,8 +31,15 @@
 #ifndef INCLUDED_thenshim_Thenable
 #include <thenshim/Thenable.h>
 #endif
+#ifndef INCLUDED_thenshim__Promise_Promise_Impl_
+#include <thenshim/_Promise/Promise_Impl_.h>
+#endif
 
 HX_LOCAL_STACK_FRAME(_hx_pos_3e92fffecd881428_28_receive,"borogove.Push","receive",0xa9c048dc,"borogove.Push.receive","borogove/Push.hx",28,0xbbe648d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_3e92fffecd881428_50_receive,"borogove.Push","receive",0xa9c048dc,"borogove.Push.receive","borogove/Push.hx",50,0xbbe648d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_3e92fffecd881428_45_receive,"borogove.Push","receive",0xa9c048dc,"borogove.Push.receive","borogove/Push.hx",45,0xbbe648d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_3e92fffecd881428_43_receive,"borogove.Push","receive",0xa9c048dc,"borogove.Push.receive","borogove/Push.hx",43,0xbbe648d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_3e92fffecd881428_44_receive,"borogove.Push","receive",0xa9c048dc,"borogove.Push.receive","borogove/Push.hx",44,0xbbe648d6)
 namespace borogove{
 
 void Push_obj::__construct() { }
@@ -51,40 +61,97 @@ bool Push_obj::_hx_isInstanceOf(int inClassId) {
 
  ::borogove::Notification Push_obj::receive(::String data,::Dynamic persistence){
             	HX_STACKFRAME(&_hx_pos_3e92fffecd881428_28_receive)
-HXLINE(  29)		 ::borogove::Stanza stanza = ::borogove::Stanza_obj::parse(data);
-HXLINE(  30)		if (::hx::IsNull( stanza )) {
+HXLINE(  29)		::Array< ::Dynamic> stanza = ::Array_obj< ::Dynamic>::__new(1)->init(0,::borogove::Stanza_obj::parse(data));
+HXLINE(  30)		if (::hx::IsNull( stanza->__get(0).StaticCast<  ::borogove::Stanza >() )) {
 HXLINE(  30)			return null();
             		}
 HXLINE(  31)		bool _hx_tmp;
-HXDLIN(  31)		if ((stanza->name == HX_("envelope",10,df,6c,0c))) {
-HXLINE(  31)			_hx_tmp = (( (::String)(::Reflect_obj::field(stanza->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:sce:1",30,c6,40,50));
+HXDLIN(  31)		if ((stanza->__get(0).StaticCast<  ::borogove::Stanza >()->name == HX_("envelope",10,df,6c,0c))) {
+HXLINE(  31)			_hx_tmp = (( (::String)(::Reflect_obj::field(stanza->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:sce:1",30,c6,40,50));
             		}
             		else {
 HXLINE(  31)			_hx_tmp = false;
             		}
 HXDLIN(  31)		if (_hx_tmp) {
-HXLINE(  32)			stanza = stanza->getChild(HX_("content",39,8d,77,19),null())->getFirstChild();
+HXLINE(  32)			stanza[0] = stanza->__get(0).StaticCast<  ::borogove::Stanza >()->getChild(HX_("content",39,8d,77,19),null())->getFirstChild();
             		}
 HXLINE(  34)		bool _hx_tmp1;
-HXDLIN(  34)		if ((stanza->name == HX_("forwarded",64,f5,9a,17))) {
-HXLINE(  34)			_hx_tmp1 = (( (::String)(::Reflect_obj::field(stanza->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:forward:0",1f,ec,b0,d1));
+HXDLIN(  34)		if ((stanza->__get(0).StaticCast<  ::borogove::Stanza >()->name == HX_("forwarded",64,f5,9a,17))) {
+HXLINE(  34)			_hx_tmp1 = (( (::String)(::Reflect_obj::field(stanza->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("xmlns",dc,31,74,60))) ) == HX_("urn:xmpp:forward:0",1f,ec,b0,d1));
             		}
             		else {
 HXLINE(  34)			_hx_tmp1 = false;
             		}
 HXDLIN(  34)		if (_hx_tmp1) {
-HXLINE(  35)			stanza = stanza->getChild(HX_("message",c7,35,11,9a),HX_("jabber:client",21,64,c5,e4));
+HXLINE(  35)			stanza[0] = stanza->__get(0).StaticCast<  ::borogove::Stanza >()->getChild(HX_("message",c7,35,11,9a),HX_("jabber:client",21,64,c5,e4));
             		}
-HXLINE(  37)		if (::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->attr,HX_("to",7b,65,00,00))) ) )) {
+HXLINE(  37)		if (::hx::IsNull( ( (::String)(::Reflect_obj::field(stanza->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("to",7b,65,00,00))) ) )) {
 HXLINE(  37)			return null();
             		}
-HXLINE(  39)		 ::borogove::ChatMessage message = ::borogove::ChatMessage_obj::fromStanza(stanza,::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("to",7b,65,00,00))) ))->asBare(),null());
+HXLINE(  39)		 ::borogove::Stanza stanza1 = stanza->__get(0).StaticCast<  ::borogove::Stanza >();
+HXDLIN(  39)		 ::borogove::ChatMessage message = ::borogove::ChatMessage_obj::fromStanza(stanza1,::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("to",7b,65,00,00))) ))->asBare(),null());
 HXLINE(  40)		if (::hx::IsNotNull( message )) {
-HXLINE(  41)			::borogove::Persistence_obj::storeMessages(persistence,message->account(),::Array_obj< ::Dynamic>::__new(1)->init(0,message));
-HXLINE(  42)			return ::borogove::Notification_obj::fromChatMessage(message);
+            			HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_3, ::borogove::ChatMessage,message,::Dynamic,persistence,::Array< ::Dynamic>,stanza) HXARGC(1)
+            			::Dynamic _hx_run(::String sortId){
+            				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2,::String,sortId1) HXARGC(2)
+            				 ::borogove::ChatMessageBuilder _hx_run( ::borogove::ChatMessageBuilder builder, ::borogove::Stanza stanza){
+            					HX_STACKFRAME(&_hx_pos_3e92fffecd881428_50_receive)
+HXLINE(  51)					builder->sortId = sortId1;
+HXLINE(  52)					return builder;
+            				}
+            				HX_END_LOCAL_FUNC2(return)
+
+            				HX_STACKFRAME(&_hx_pos_3e92fffecd881428_45_receive)
+HXLINE(  46)				::String sortId1 = ::_FractionalIndexing::FractionalIndexing_Fields__obj::between(sortId,null(),HX_(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",6f,61,48,0a));
+HXLINE(  48)				 ::borogove::Stanza stanza1 = stanza->__get(0).StaticCast<  ::borogove::Stanza >();
+HXLINE(  47)				 ::borogove::ChatMessage toStore = ::borogove::ChatMessage_obj::fromStanza(stanza1,::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->__get(0).StaticCast<  ::borogove::Stanza >()->attr,HX_("to",7b,65,00,00))) ))->asBare(), ::Dynamic(new _hx_Closure_2(sortId1)));
+HXLINE(  55)				::Dynamic persistence1 = persistence;
+HXDLIN(  55)				return ::borogove::Persistence_obj::storeMessages(persistence1,message->account(),::Array_obj< ::Dynamic>::__new(1)->init(0,toStore));
+            			}
+            			HX_END_LOCAL_FUNC1(return)
+
+HXLINE(  42)			::Dynamic _hx_tmp2;
+HXDLIN(  42)			if ((message->type == 2)) {
+            				HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            				::String _hx_run( ::borogove::ChatMessage point){
+            					HX_STACKFRAME(&_hx_pos_3e92fffecd881428_43_receive)
+HXLINE(  43)					::String tmp;
+HXDLIN(  43)					if (::hx::IsNotNull( point )) {
+HXLINE(  43)						tmp = point->sortId;
+            					}
+            					else {
+HXLINE(  43)						tmp = null();
+            					}
+HXDLIN(  43)					if (::hx::IsNotNull( tmp )) {
+HXLINE(  43)						return tmp;
+            					}
+            					else {
+HXLINE(  43)						return HX_("a ",9f,54,00,00);
+            					}
+HXDLIN(  43)					return null();
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+HXLINE(  43)				::Dynamic persistence1 = persistence;
+HXDLIN(  43)				::String _hx_tmp3 = message->account();
+HXLINE(  42)				_hx_tmp2 = ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::syncPoint(persistence1,_hx_tmp3,message->chatId()), ::Dynamic(new _hx_Closure_0()),null());
+            			}
+            			else {
+            				HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
+            				::String _hx_run( ::Dynamic data){
+            					HX_STACKFRAME(&_hx_pos_3e92fffecd881428_44_receive)
+HXLINE(  44)					return ( (::String)(data->__Field(HX_("sortId",d9,7a,37,30),::hx::paccDynamic)) );
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+HXLINE(  44)				::Dynamic persistence2 = persistence;
+HXLINE(  42)				_hx_tmp2 = ::thenshim::_Promise::Promise_Impl__obj::then(::borogove::Persistence_obj::getStreamManagement(persistence2,message->account()), ::Dynamic(new _hx_Closure_1()),null());
+            			}
+HXDLIN(  42)			::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp2, ::Dynamic(new _hx_Closure_3(message,persistence,stanza)),null());
+HXLINE(  57)			return ::borogove::Notification_obj::fromChatMessage(message);
             		}
             		else {
-HXLINE(  44)			return ::borogove::Notification_obj::fromThinStanza(stanza);
+HXLINE(  59)			return ::borogove::Notification_obj::fromThinStanza(stanza->__get(0).StaticCast<  ::borogove::Stanza >());
             		}
 HXLINE(  40)		return null();
             	}
diff --git a/Sources/c_borogove/src/borogove/Reaction.cpp b/Sources/c_borogove/src/borogove/Reaction.cpp
index bd5ad0b..ad2a236 100644
--- a/Sources/c_borogove/src/borogove/Reaction.cpp
+++ b/Sources/c_borogove/src/borogove/Reaction.cpp
@@ -7,13 +7,19 @@
 #ifndef INCLUDED_borogove_Reaction
 #include <borogove/Reaction.h>
 #endif
+#ifndef INCLUDED_haxe_io_Bytes
+#include <haxe/io/Bytes.h>
+#endif
+#ifndef INCLUDED_haxe_io_Encoding
+#include <haxe/io/Encoding.h>
+#endif
 
 HX_DEFINE_STACK_FRAME(_hx_pos_4535f3ba2f7d91d5_35_new,"borogove.Reaction","new",0xd991faa8,"borogove.Reaction.new","borogove/Reaction.hx",35,0xa2017f67)
-HX_LOCAL_STACK_FRAME(_hx_pos_88fddae410342e60_450_senderId__fromC,"borogove.Reaction","senderId__fromC",0xbc4185d1,"borogove.Reaction.senderId__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_88fddae410342e60_450_timestamp__fromC,"borogove.Reaction","timestamp__fromC",0xbffa8b1b,"borogove.Reaction.timestamp__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_88fddae410342e60_450_key__fromC,"borogove.Reaction","key__fromC",0x598e1772,"borogove.Reaction.key__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_4535f3ba2f7d91d5_68_render,"borogove.Reaction","render",0xf938de0e,"borogove.Reaction.render","borogove/Reaction.hx",68,0xa2017f67)
-HX_LOCAL_STACK_FRAME(_hx_pos_4535f3ba2f7d91d5_50_unicode,"borogove.Reaction","unicode",0x4cdd7f65,"borogove.Reaction.unicode","borogove/Reaction.hx",50,0xa2017f67)
+HX_LOCAL_STACK_FRAME(_hx_pos_88fddae410342e60_478_senderId__fromC,"borogove.Reaction","senderId__fromC",0xbc4185d1,"borogove.Reaction.senderId__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_88fddae410342e60_478_timestamp__fromC,"borogove.Reaction","timestamp__fromC",0xbffa8b1b,"borogove.Reaction.timestamp__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_88fddae410342e60_478_key__fromC,"borogove.Reaction","key__fromC",0x598e1772,"borogove.Reaction.key__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_4535f3ba2f7d91d5_73_render,"borogove.Reaction","render",0xf938de0e,"borogove.Reaction.render","borogove/Reaction.hx",73,0xa2017f67)
+HX_LOCAL_STACK_FRAME(_hx_pos_4535f3ba2f7d91d5_55_unicode,"borogove.Reaction","unicode",0x4cdd7f65,"borogove.Reaction.unicode","borogove/Reaction.hx",55,0xa2017f67)
 HX_LOCAL_STACK_FRAME(_hx_pos_4535f3ba2f7d91d5_15_boot,"borogove.Reaction","boot",0x7e4258ea,"borogove.Reaction.boot","borogove/Reaction.hx",15,0xa2017f67)
 namespace borogove{
 
@@ -23,14 +29,14 @@ HXLINE(  36)		this->senderId = senderId;
 HXLINE(  37)		this->timestamp = timestamp;
 HXLINE(  38)		this->text = ::StringTools_obj::replace(text,HX_W(u"\ufe0f",fb86,00b5),HX_("",00,00,00,00));
 HXLINE(  39)		this->envelopeId = envelopeId;
-HXLINE(  40)		::String _hx_tmp;
-HXDLIN(  40)		if (::hx::IsNotNull( key )) {
-HXLINE(  40)			_hx_tmp = key;
+HXLINE(  42)		::String _hx_tmp;
+HXDLIN(  42)		if (::hx::IsNotNull( key )) {
+HXLINE(  42)			_hx_tmp = key;
             		}
             		else {
-HXLINE(  40)			_hx_tmp = this->text;
+HXLINE(  42)			_hx_tmp = this->text;
             		}
-HXDLIN(  40)		this->key = _hx_tmp;
+HXDLIN(  42)		this->key = ::haxe::io::Bytes_obj::ofString(_hx_tmp,null())->toString();
             	}
 
 Dynamic Reaction_obj::__CreateEmpty() { return new Reaction_obj; }
@@ -49,40 +55,40 @@ bool Reaction_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String Reaction_obj::senderId__fromC(){
-            	HX_STACKFRAME(&_hx_pos_88fddae410342e60_450_senderId__fromC)
-HXDLIN( 450)		return this->senderId;
+            	HX_STACKFRAME(&_hx_pos_88fddae410342e60_478_senderId__fromC)
+HXDLIN( 478)		return this->senderId;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Reaction_obj,senderId__fromC,return )
 
 ::String Reaction_obj::timestamp__fromC(){
-            	HX_STACKFRAME(&_hx_pos_88fddae410342e60_450_timestamp__fromC)
-HXDLIN( 450)		return this->timestamp;
+            	HX_STACKFRAME(&_hx_pos_88fddae410342e60_478_timestamp__fromC)
+HXDLIN( 478)		return this->timestamp;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Reaction_obj,timestamp__fromC,return )
 
 ::String Reaction_obj::key__fromC(){
-            	HX_STACKFRAME(&_hx_pos_88fddae410342e60_450_key__fromC)
-HXDLIN( 450)		return this->key;
+            	HX_STACKFRAME(&_hx_pos_88fddae410342e60_478_key__fromC)
+HXDLIN( 478)		return this->key;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Reaction_obj,key__fromC,return )
 
 ::String Reaction_obj::render( ::Dynamic forText, ::Dynamic forImage){
-            	HX_STACKFRAME(&_hx_pos_4535f3ba2f7d91d5_68_render)
-HXDLIN(  68)		return ( (::String)(forText((this->text + HX_W(u"\ufe0f",fb86,00b5)))) );
+            	HX_STACKFRAME(&_hx_pos_4535f3ba2f7d91d5_73_render)
+HXDLIN(  73)		return ( (::String)(forText((this->text + HX_W(u"\ufe0f",fb86,00b5)))) );
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Reaction_obj,render,return )
 
  ::borogove::Reaction Reaction_obj::unicode(::String unicode){
-            	HX_GC_STACKFRAME(&_hx_pos_4535f3ba2f7d91d5_50_unicode)
-HXDLIN(  50)		return  ::borogove::Reaction_obj::__alloc( HX_CTX ,HX_("",00,00,00,00),HX_("",00,00,00,00),unicode,null(),null());
+            	HX_GC_STACKFRAME(&_hx_pos_4535f3ba2f7d91d5_55_unicode)
+HXDLIN(  55)		return  ::borogove::Reaction_obj::__alloc( HX_CTX ,HX_("",00,00,00,00),HX_("",00,00,00,00),unicode,null(),null());
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/ReactionUpdate.cpp b/Sources/c_borogove/src/borogove/ReactionUpdate.cpp
index 5e6278d..1100a92 100644
--- a/Sources/c_borogove/src/borogove/ReactionUpdate.cpp
+++ b/Sources/c_borogove/src/borogove/ReactionUpdate.cpp
@@ -32,43 +32,43 @@
 #include <haxe/ds/StringMap.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_7ae1846c96c5ccc5_25_new,"borogove.ReactionUpdate","new",0xe929e9d1,"borogove.ReactionUpdate.new","borogove/ReactionUpdate.hx",25,0xfc79e99e)
-HX_LOCAL_STACK_FRAME(_hx_pos_7ae1846c96c5ccc5_39_getReactions,"borogove.ReactionUpdate","getReactions",0x69ea19a3,"borogove.ReactionUpdate.getReactions","borogove/ReactionUpdate.hx",39,0xfc79e99e)
-HX_LOCAL_STACK_FRAME(_hx_pos_7ae1846c96c5ccc5_67_inlineHashReferences,"borogove.ReactionUpdate","inlineHashReferences",0xc23dab5e,"borogove.ReactionUpdate.inlineHashReferences","borogove/ReactionUpdate.hx",67,0xfc79e99e)
-HX_LOCAL_STACK_FRAME(_hx_pos_7ae1846c96c5ccc5_82_asStanza,"borogove.ReactionUpdate","asStanza",0xfe907576,"borogove.ReactionUpdate.asStanza","borogove/ReactionUpdate.hx",82,0xfc79e99e)
+HX_DEFINE_STACK_FRAME(_hx_pos_7ae1846c96c5ccc5_31_new,"borogove.ReactionUpdate","new",0xe929e9d1,"borogove.ReactionUpdate.new","borogove/ReactionUpdate.hx",31,0xfc79e99e)
+HX_LOCAL_STACK_FRAME(_hx_pos_7ae1846c96c5ccc5_51_getReactions,"borogove.ReactionUpdate","getReactions",0x69ea19a3,"borogove.ReactionUpdate.getReactions","borogove/ReactionUpdate.hx",51,0xfc79e99e)
+HX_LOCAL_STACK_FRAME(_hx_pos_7ae1846c96c5ccc5_79_inlineHashReferences,"borogove.ReactionUpdate","inlineHashReferences",0xc23dab5e,"borogove.ReactionUpdate.inlineHashReferences","borogove/ReactionUpdate.hx",79,0xfc79e99e)
+HX_LOCAL_STACK_FRAME(_hx_pos_7ae1846c96c5ccc5_94_asStanza,"borogove.ReactionUpdate","asStanza",0xfe907576,"borogove.ReactionUpdate.asStanza","borogove/ReactionUpdate.hx",94,0xfc79e99e)
 namespace borogove{
 
 void ReactionUpdate_obj::__construct(::String updateId,::String serverId,::String serverIdBy,::String localId,::String chatId,::String senderId,::String timestamp,::Array< ::Dynamic> reactions,int kind){
-            	HX_STACKFRAME(&_hx_pos_7ae1846c96c5ccc5_25_new)
-HXLINE(  26)		bool _hx_tmp;
-HXDLIN(  26)		if (::hx::IsNull( serverId )) {
-HXLINE(  26)			_hx_tmp = ::hx::IsNull( localId );
+            	HX_STACKFRAME(&_hx_pos_7ae1846c96c5ccc5_31_new)
+HXLINE(  32)		bool _hx_tmp;
+HXDLIN(  32)		if (::hx::IsNull( serverId )) {
+HXLINE(  32)			_hx_tmp = ::hx::IsNull( localId );
             		}
             		else {
-HXLINE(  26)			_hx_tmp = false;
+HXLINE(  32)			_hx_tmp = false;
             		}
-HXDLIN(  26)		if (_hx_tmp) {
-HXLINE(  26)			HX_STACK_DO_THROW(HX_("ReactionUpdate serverId and localId cannot both be null",6b,73,a4,c0));
+HXDLIN(  32)		if (_hx_tmp) {
+HXLINE(  32)			HX_STACK_DO_THROW(HX_("ReactionUpdate serverId and localId cannot both be null",6b,73,a4,c0));
             		}
-HXLINE(  27)		bool _hx_tmp1;
-HXDLIN(  27)		if (::hx::IsNotNull( serverId )) {
-HXLINE(  27)			_hx_tmp1 = ::hx::IsNull( serverIdBy );
+HXLINE(  33)		bool _hx_tmp1;
+HXDLIN(  33)		if (::hx::IsNotNull( serverId )) {
+HXLINE(  33)			_hx_tmp1 = ::hx::IsNull( serverIdBy );
             		}
             		else {
-HXLINE(  27)			_hx_tmp1 = false;
+HXLINE(  33)			_hx_tmp1 = false;
             		}
-HXDLIN(  27)		if (_hx_tmp1) {
-HXLINE(  27)			HX_STACK_DO_THROW(HX_("serverId requires serverIdBy",c5,30,61,d4));
+HXDLIN(  33)		if (_hx_tmp1) {
+HXLINE(  33)			HX_STACK_DO_THROW(HX_("serverId requires serverIdBy",c5,30,61,d4));
             		}
-HXLINE(  28)		this->updateId = updateId;
-HXLINE(  29)		this->serverId = serverId;
-HXLINE(  30)		this->serverIdBy = serverIdBy;
-HXLINE(  31)		this->localId = localId;
-HXLINE(  32)		this->chatId = chatId;
-HXLINE(  33)		this->senderId = senderId;
-HXLINE(  34)		this->timestamp = timestamp;
-HXLINE(  35)		this->reactions = reactions;
-HXLINE(  36)		this->kind = kind;
+HXLINE(  34)		this->updateId = updateId;
+HXLINE(  35)		this->serverId = serverId;
+HXLINE(  36)		this->serverIdBy = serverIdBy;
+HXLINE(  37)		this->localId = localId;
+HXLINE(  38)		this->chatId = chatId;
+HXLINE(  39)		this->senderId = senderId;
+HXLINE(  40)		this->timestamp = timestamp;
+HXLINE(  41)		this->reactions = reactions;
+HXLINE(  42)		this->kind = kind;
             	}
 
 Dynamic ReactionUpdate_obj::__CreateEmpty() { return new ReactionUpdate_obj; }
@@ -87,141 +87,141 @@ bool ReactionUpdate_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::Array< ::Dynamic> ReactionUpdate_obj::getReactions(::Array< ::Dynamic> existingReactions){
-            	HX_GC_STACKFRAME(&_hx_pos_7ae1846c96c5ccc5_39_getReactions)
-HXLINE(  40)		if ((this->kind == 1)) {
-HXLINE(  41)			 ::haxe::ds::StringMap set =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(  42)			::Array< ::Dynamic> list = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(  43)			{
-HXLINE(  43)				int _g = 0;
-HXDLIN(  43)				::Array< ::Dynamic> _g1;
-HXDLIN(  43)				if (::hx::IsNotNull( existingReactions )) {
-HXLINE(  43)					_g1 = existingReactions;
+            	HX_GC_STACKFRAME(&_hx_pos_7ae1846c96c5ccc5_51_getReactions)
+HXLINE(  52)		if ((this->kind == 1)) {
+HXLINE(  53)			 ::haxe::ds::StringMap set =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(  54)			::Array< ::Dynamic> list = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  55)			{
+HXLINE(  55)				int _g = 0;
+HXDLIN(  55)				::Array< ::Dynamic> _g1;
+HXDLIN(  55)				if (::hx::IsNotNull( existingReactions )) {
+HXLINE(  55)					_g1 = existingReactions;
             				}
             				else {
-HXLINE(  43)					_g1 = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  55)					_g1 = ::Array_obj< ::Dynamic>::__new(0);
             				}
-HXDLIN(  43)				while((_g < _g1->length)){
-HXLINE(  43)					 ::borogove::Reaction r = _g1->__get(_g).StaticCast<  ::borogove::Reaction >();
-HXDLIN(  43)					_g = (_g + 1);
-HXLINE(  44)					if (!(set->exists(r->key))) {
-HXLINE(  44)						list->push(r);
+HXDLIN(  55)				while((_g < _g1->length)){
+HXLINE(  55)					 ::borogove::Reaction r = _g1->__get(_g).StaticCast<  ::borogove::Reaction >();
+HXDLIN(  55)					_g = (_g + 1);
+HXLINE(  56)					if (!(set->exists(r->key))) {
+HXLINE(  56)						list->push(r);
             					}
-HXLINE(  45)					set->set(r->key,true);
+HXLINE(  57)					set->set(r->key,true);
             				}
             			}
-HXLINE(  47)			{
-HXLINE(  47)				int _g2 = 0;
-HXDLIN(  47)				::Array< ::Dynamic> _g3 = this->reactions;
-HXDLIN(  47)				while((_g2 < _g3->length)){
-HXLINE(  47)					 ::borogove::Reaction r1 = _g3->__get(_g2).StaticCast<  ::borogove::Reaction >();
-HXDLIN(  47)					_g2 = (_g2 + 1);
-HXLINE(  48)					if (!(set->exists(r1->key))) {
-HXLINE(  48)						list->push(r1);
+HXLINE(  59)			{
+HXLINE(  59)				int _g2 = 0;
+HXDLIN(  59)				::Array< ::Dynamic> _g3 = this->reactions;
+HXDLIN(  59)				while((_g2 < _g3->length)){
+HXLINE(  59)					 ::borogove::Reaction r1 = _g3->__get(_g2).StaticCast<  ::borogove::Reaction >();
+HXDLIN(  59)					_g2 = (_g2 + 1);
+HXLINE(  60)					if (!(set->exists(r1->key))) {
+HXLINE(  60)						list->push(r1);
             					}
-HXLINE(  49)					set->set(r1->key,true);
+HXLINE(  61)					set->set(r1->key,true);
             				}
             			}
-HXLINE(  51)			return list;
+HXLINE(  63)			return list;
             		}
             		else {
-HXLINE(  52)			if ((this->kind == 0)) {
-HXLINE(  54)				::Array< ::Dynamic> list1 = ::Lambda_obj::array(this->reactions);
-HXLINE(  55)				{
-HXLINE(  55)					int _g4 = 0;
-HXDLIN(  55)					::Array< ::Dynamic> _g5;
-HXDLIN(  55)					if (::hx::IsNotNull( existingReactions )) {
-HXLINE(  55)						_g5 = existingReactions;
+HXLINE(  64)			if ((this->kind == 0)) {
+HXLINE(  66)				::Array< ::Dynamic> list1 = ::Lambda_obj::array(this->reactions);
+HXLINE(  67)				{
+HXLINE(  67)					int _g4 = 0;
+HXDLIN(  67)					::Array< ::Dynamic> _g5;
+HXDLIN(  67)					if (::hx::IsNotNull( existingReactions )) {
+HXLINE(  67)						_g5 = existingReactions;
             					}
             					else {
-HXLINE(  55)						_g5 = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  67)						_g5 = ::Array_obj< ::Dynamic>::__new(0);
             					}
-HXDLIN(  55)					while((_g4 < _g5->length)){
-HXLINE(  55)						 ::borogove::Reaction r2 = _g5->__get(_g4).StaticCast<  ::borogove::Reaction >();
-HXDLIN(  55)						_g4 = (_g4 + 1);
-HXLINE(  56)						 ::borogove::CustomEmojiReaction custom = ( ( ::borogove::CustomEmojiReaction)(::borogove::_Util::Util_Fields__obj::downcast(r2,::hx::ClassOf< ::borogove::CustomEmojiReaction >())) );
-HXLINE(  57)						if (::hx::IsNotNull( custom )) {
-HXLINE(  57)							list1->push(custom);
+HXDLIN(  67)					while((_g4 < _g5->length)){
+HXLINE(  67)						 ::borogove::Reaction r2 = _g5->__get(_g4).StaticCast<  ::borogove::Reaction >();
+HXDLIN(  67)						_g4 = (_g4 + 1);
+HXLINE(  68)						 ::borogove::CustomEmojiReaction custom = ( ( ::borogove::CustomEmojiReaction)(::borogove::_Util::Util_Fields__obj::downcast(r2,::hx::ClassOf< ::borogove::CustomEmojiReaction >())) );
+HXLINE(  69)						if (::hx::IsNotNull( custom )) {
+HXLINE(  69)							list1->push(custom);
             						}
             					}
             				}
-HXLINE(  59)				return list1;
+HXLINE(  71)				return list1;
             			}
             			else {
-HXLINE(  60)				if ((this->kind == 2)) {
-HXLINE(  61)					return this->reactions;
+HXLINE(  72)				if ((this->kind == 2)) {
+HXLINE(  73)					return this->reactions;
             				}
             			}
             		}
-HXLINE(  63)		HX_STACK_DO_THROW(HX_("Unknown kind of reaction update",2d,19,e6,bc));
-HXDLIN(  63)		return null();
+HXLINE(  75)		HX_STACK_DO_THROW(HX_("Unknown kind of reaction update",2d,19,e6,bc));
+HXDLIN(  75)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(ReactionUpdate_obj,getReactions,return )
 
 ::Array< ::Dynamic> ReactionUpdate_obj::inlineHashReferences(){
-            	HX_STACKFRAME(&_hx_pos_7ae1846c96c5ccc5_67_inlineHashReferences)
-HXLINE(  68)		::Array< ::Dynamic> hashes = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(  69)		{
-HXLINE(  69)			int _g = 0;
-HXDLIN(  69)			::Array< ::Dynamic> _g1 = this->reactions;
-HXDLIN(  69)			while((_g < _g1->length)){
-HXLINE(  69)				 ::borogove::Reaction r = _g1->__get(_g).StaticCast<  ::borogove::Reaction >();
-HXDLIN(  69)				_g = (_g + 1);
-HXLINE(  70)				 ::borogove::CustomEmojiReaction custom = ( ( ::borogove::CustomEmojiReaction)(::borogove::_Util::Util_Fields__obj::downcast(r,::hx::ClassOf< ::borogove::CustomEmojiReaction >())) );
-HXLINE(  71)				if (::hx::IsNotNull( custom )) {
-HXLINE(  72)					 ::borogove::Hash hash = ::borogove::Hash_obj::fromUri(custom->uri);
-HXLINE(  73)					if (::hx::IsNotNull( hash )) {
-HXLINE(  73)						hashes->push(hash);
+            	HX_STACKFRAME(&_hx_pos_7ae1846c96c5ccc5_79_inlineHashReferences)
+HXLINE(  80)		::Array< ::Dynamic> hashes = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  81)		{
+HXLINE(  81)			int _g = 0;
+HXDLIN(  81)			::Array< ::Dynamic> _g1 = this->reactions;
+HXDLIN(  81)			while((_g < _g1->length)){
+HXLINE(  81)				 ::borogove::Reaction r = _g1->__get(_g).StaticCast<  ::borogove::Reaction >();
+HXDLIN(  81)				_g = (_g + 1);
+HXLINE(  82)				 ::borogove::CustomEmojiReaction custom = ( ( ::borogove::CustomEmojiReaction)(::borogove::_Util::Util_Fields__obj::downcast(r,::hx::ClassOf< ::borogove::CustomEmojiReaction >())) );
+HXLINE(  83)				if (::hx::IsNotNull( custom )) {
+HXLINE(  84)					 ::borogove::Hash hash = ::borogove::Hash_obj::fromUri(custom->uri);
+HXLINE(  85)					if (::hx::IsNotNull( hash )) {
+HXLINE(  85)						hashes->push(hash);
             					}
             				}
             			}
             		}
-HXLINE(  76)		return hashes;
+HXLINE(  88)		return hashes;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(ReactionUpdate_obj,inlineHashReferences,return )
 
  ::borogove::Stanza ReactionUpdate_obj::asStanza(){
-            	HX_GC_STACKFRAME(&_hx_pos_7ae1846c96c5ccc5_82_asStanza)
-HXLINE(  83)		if ((this->kind != 0)) {
-HXLINE(  83)			HX_STACK_DO_THROW(HX_("Cannot make a reaction XEP stanza for this kind",d4,3c,65,53));
+            	HX_GC_STACKFRAME(&_hx_pos_7ae1846c96c5ccc5_94_asStanza)
+HXLINE(  95)		if ((this->kind != 0)) {
+HXLINE(  95)			HX_STACK_DO_THROW(HX_("Cannot make a reaction XEP stanza for this kind",d4,3c,65,53));
             		}
-HXLINE(  85)		::String attrs;
-HXDLIN(  85)		if (::hx::IsNull( this->serverId )) {
-HXLINE(  85)			attrs = HX_("chat",d8,5e,bf,41);
+HXLINE(  97)		::String attrs;
+HXDLIN(  97)		if (::hx::IsNull( this->serverId )) {
+HXLINE(  97)			attrs = HX_("chat",d8,5e,bf,41);
             		}
             		else {
-HXLINE(  85)			attrs = HX_("groupchat",97,1d,c8,e5);
+HXLINE(  97)			attrs = HX_("groupchat",97,1d,c8,e5);
             		}
-HXLINE(  86)		 ::borogove::Stanza stanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE(  98)		 ::borogove::Stanza stanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("id",db,5b,00,00),this->updateId)
             			->setFixed(1,HX_("type",ba,f2,08,4d),attrs)));
-HXLINE(  88)		::String tmp = this->localId;
-HXDLIN(  88)		::String _hx_tmp;
-HXDLIN(  88)		if (::hx::IsNotNull( tmp )) {
-HXLINE(  88)			_hx_tmp = tmp;
+HXLINE( 100)		::String tmp = this->localId;
+HXDLIN( 100)		::String _hx_tmp;
+HXDLIN( 100)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 100)			_hx_tmp = tmp;
             		}
             		else {
-HXLINE(  88)			_hx_tmp = this->serverId;
+HXLINE( 100)			_hx_tmp = this->serverId;
             		}
-HXDLIN(  88)		stanza->tag(HX_("reactions",aa,cc,95,e7), ::Dynamic(::hx::Anon_obj::Create(2)
+HXDLIN( 100)		stanza->tag(HX_("reactions",aa,cc,95,e7), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("id",db,5b,00,00),_hx_tmp)
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:reactions:0",44,fb,42,53))));
-HXLINE(  89)		{
-HXLINE(  89)			int _g = 0;
-HXDLIN(  89)			::Array< ::Dynamic> _g1 = this->reactions;
-HXDLIN(  89)			while((_g < _g1->length)){
-HXLINE(  89)				 ::borogove::Reaction reaction = _g1->__get(_g).StaticCast<  ::borogove::Reaction >();
-HXDLIN(  89)				_g = (_g + 1);
-HXLINE(  90)				if (!(::Std_obj::isOfType(reaction,::hx::ClassOf< ::borogove::CustomEmojiReaction >()))) {
-HXLINE(  90)					stanza->textTag(HX_("reaction",a9,e7,b4,f6),reaction->text,null());
+HXLINE( 101)		{
+HXLINE( 101)			int _g = 0;
+HXDLIN( 101)			::Array< ::Dynamic> _g1 = this->reactions;
+HXDLIN( 101)			while((_g < _g1->length)){
+HXLINE( 101)				 ::borogove::Reaction reaction = _g1->__get(_g).StaticCast<  ::borogove::Reaction >();
+HXDLIN( 101)				_g = (_g + 1);
+HXLINE( 102)				if (!(::Std_obj::isOfType(reaction,::hx::ClassOf< ::borogove::CustomEmojiReaction >()))) {
+HXLINE( 102)					stanza->textTag(HX_("reaction",a9,e7,b4,f6),reaction->text,null());
             				}
             			}
             		}
-HXLINE(  92)		stanza->up();
-HXLINE(  94)		return stanza;
+HXLINE( 104)		stanza->up();
+HXLINE( 106)		return stanza;
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/Role.cpp b/Sources/c_borogove/src/borogove/Role.cpp
new file mode 100644
index 0000000..030d65e
--- /dev/null
+++ b/Sources/c_borogove/src/borogove/Role.cpp
@@ -0,0 +1,233 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_borogove_Color
+#include <borogove/Color.h>
+#endif
+#ifndef INCLUDED_borogove_Role
+#include <borogove/Role.h>
+#endif
+
+HX_DEFINE_STACK_FRAME(_hx_pos_7247b9264b09844a_26_new,"borogove.Role","new",0xccdd5e75,"borogove.Role.new","borogove/Role.hx",26,0x9f2358ba)
+HX_LOCAL_STACK_FRAME(_hx_pos_6bad22cc5be64639_478_id__fromC,"borogove.Role","id__fromC",0xf80fe1d3,"borogove.Role.id__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_6bad22cc5be64639_478_title__fromC,"borogove.Role","title__fromC",0xb652452c,"borogove.Role.title__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7247b9264b09844a_47_color,"borogove.Role","color",0x76f56eb8,"borogove.Role.color","borogove/Role.hx",47,0x9f2358ba)
+HX_LOCAL_STACK_FRAME(_hx_pos_7247b9264b09844a_32_forAffiliation,"borogove.Role","forAffiliation",0x8dc55632,"borogove.Role.forAffiliation","borogove/Role.hx",32,0x9f2358ba)
+HX_LOCAL_STACK_FRAME(_hx_pos_7247b9264b09844a_11_boot,"borogove.Role","boot",0x6cee487d,"borogove.Role.boot","borogove/Role.hx",11,0x9f2358ba)
+namespace borogove{
+
+void Role_obj::__construct(::String id,::String title){
+            	HX_STACKFRAME(&_hx_pos_7247b9264b09844a_26_new)
+HXLINE(  27)		this->id = id;
+HXLINE(  28)		this->title = title;
+            	}
+
+Dynamic Role_obj::__CreateEmpty() { return new Role_obj; }
+
+void *Role_obj::_hx_vtable = 0;
+
+Dynamic Role_obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< Role_obj > _hx_result = new Role_obj();
+	_hx_result->__construct(inArgs[0],inArgs[1]);
+	return _hx_result;
+}
+
+bool Role_obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x34bf0af7;
+}
+
+::String Role_obj::id__fromC(){
+            	HX_STACKFRAME(&_hx_pos_6bad22cc5be64639_478_id__fromC)
+HXDLIN( 478)		return this->id;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Role_obj,id__fromC,return )
+
+::String Role_obj::title__fromC(){
+            	HX_STACKFRAME(&_hx_pos_6bad22cc5be64639_478_title__fromC)
+HXDLIN( 478)		return this->title;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Role_obj,title__fromC,return )
+
+::String Role_obj::color(){
+            	HX_STACKFRAME(&_hx_pos_7247b9264b09844a_47_color)
+HXDLIN(  47)		return ::borogove::Color_obj::forString(this->id);
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Role_obj,color,return )
+
+ ::borogove::Role Role_obj::forAffiliation(::String aff){
+            	HX_GC_STACKFRAME(&_hx_pos_7247b9264b09844a_32_forAffiliation)
+HXLINE(  33)		::String title;
+HXDLIN(  33)		::String _hx_switch_0 = aff;
+            		if (  (_hx_switch_0==HX_("admin",8f,ac,4a,1c)) ){
+HXLINE(  33)			title = HX_("Admin",6f,1c,78,af);
+HXDLIN(  33)			goto _hx_goto_4;
+            		}
+            		if (  (_hx_switch_0==HX_("none",b8,12,0a,49)) ){
+HXLINE(  33)			title = HX_("Guest",b8,2e,16,2f);
+HXDLIN(  33)			goto _hx_goto_4;
+            		}
+            		if (  (_hx_switch_0==HX_("outcast",4d,1e,c5,db)) ){
+HXLINE(  33)			title = HX_("Banned",fe,5d,75,86);
+HXDLIN(  33)			goto _hx_goto_4;
+            		}
+            		if (  (_hx_switch_0==HX_("owner",33,98,76,38)) ){
+HXLINE(  33)			title = HX_("Owner",13,08,a4,cb);
+HXDLIN(  33)			goto _hx_goto_4;
+            		}
+            		/* default */{
+HXLINE(  38)			return null();
+            		}
+            		_hx_goto_4:;
+HXLINE(  40)		return  ::borogove::Role_obj::__alloc( HX_CTX ,aff,title);
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Role_obj,forAffiliation,return )
+
+
+::hx::ObjectPtr< Role_obj > Role_obj::__new(::String id,::String title) {
+	::hx::ObjectPtr< Role_obj > __this = new Role_obj();
+	__this->__construct(id,title);
+	return __this;
+}
+
+::hx::ObjectPtr< Role_obj > Role_obj::__alloc(::hx::Ctx *_hx_ctx,::String id,::String title) {
+	Role_obj *__this = (Role_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Role_obj), true, "borogove.Role"));
+	*(void **)__this = Role_obj::_hx_vtable;
+	__this->__construct(id,title);
+	return __this;
+}
+
+Role_obj::Role_obj()
+{
+}
+
+void Role_obj::__Mark(HX_MARK_PARAMS)
+{
+	HX_MARK_BEGIN_CLASS(Role);
+	HX_MARK_MEMBER_NAME(id,"id");
+	HX_MARK_MEMBER_NAME(title,"title");
+	HX_MARK_END_CLASS();
+}
+
+void Role_obj::__Visit(HX_VISIT_PARAMS)
+{
+	HX_VISIT_MEMBER_NAME(id,"id");
+	HX_VISIT_MEMBER_NAME(title,"title");
+}
+
+::hx::Val Role_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 2:
+		if (HX_FIELD_EQ(inName,"id") ) { return ::hx::Val( id ); }
+		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"title") ) { return ::hx::Val( title ); }
+		if (HX_FIELD_EQ(inName,"color") ) { return ::hx::Val( color_dyn() ); }
+		break;
+	case 9:
+		if (HX_FIELD_EQ(inName,"id__fromC") ) { return ::hx::Val( id__fromC_dyn() ); }
+		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"title__fromC") ) { return ::hx::Val( title__fromC_dyn() ); }
+	}
+	return super::__Field(inName,inCallProp);
+}
+
+bool Role_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 14:
+		if (HX_FIELD_EQ(inName,"forAffiliation") ) { outValue = forAffiliation_dyn(); return true; }
+	}
+	return false;
+}
+
+::hx::Val Role_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 2:
+		if (HX_FIELD_EQ(inName,"id") ) { id=inValue.Cast< ::String >(); return inValue; }
+		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"title") ) { title=inValue.Cast< ::String >(); return inValue; }
+	}
+	return super::__SetField(inName,inValue,inCallProp);
+}
+
+void Role_obj::__GetFields(Array< ::String> &outFields)
+{
+	outFields->push(HX_("id",db,5b,00,00));
+	outFields->push(HX_("title",98,15,3b,10));
+	super::__GetFields(outFields);
+};
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo Role_obj_sMemberStorageInfo[] = {
+	{::hx::fsString,(int)offsetof(Role_obj,id),HX_("id",db,5b,00,00)},
+	{::hx::fsString,(int)offsetof(Role_obj,title),HX_("title",98,15,3b,10)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+static ::hx::StaticInfo *Role_obj_sStaticStorageInfo = 0;
+#endif
+
+static ::String Role_obj_sMemberFields[] = {
+	HX_("id",db,5b,00,00),
+	HX_("id__fromC",fe,15,a5,4d),
+	HX_("title",98,15,3b,10),
+	HX_("title__fromC",e1,bd,61,c7),
+	HX_("color",63,71,5c,4a),
+	::String(null()) };
+
+::hx::Class Role_obj::__mClass;
+
+static ::String Role_obj_sStaticFields[] = {
+	HX_("forAffiliation",27,26,2c,9c),
+	::String(null())
+};
+
+void Role_obj::__register()
+{
+	Role_obj _hx_dummy;
+	Role_obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("borogove.Role",03,00,ee,e4);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &Role_obj::__GetStatic;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(Role_obj_sStaticFields);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(Role_obj_sMemberFields);
+	__mClass->mCanCast = ::hx::TCanCast< Role_obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = Role_obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = Role_obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+void Role_obj::__boot()
+{
+{
+            	HX_STACKFRAME(&_hx_pos_7247b9264b09844a_11_boot)
+HXDLIN(  11)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("title__fromC",e1,bd,61,c7), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(1,HX_("id__fromC",fe,15,a5,4d), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null()))))));
+            	}
+}
+
+} // end namespace borogove
diff --git a/Sources/c_borogove/src/borogove/SerializedChat.cpp b/Sources/c_borogove/src/borogove/SerializedChat.cpp
index e8f6d01..265d9fe 100644
--- a/Sources/c_borogove/src/borogove/SerializedChat.cpp
+++ b/Sources/c_borogove/src/borogove/SerializedChat.cpp
@@ -4,6 +4,9 @@
 #ifndef INCLUDED_borogove_Caps
 #include <borogove/Caps.h>
 #endif
+#ifndef INCLUDED_borogove_CapsRepo
+#include <borogove/CapsRepo.h>
+#endif
 #ifndef INCLUDED_borogove_Channel
 #include <borogove/Channel.h>
 #endif
@@ -22,74 +25,81 @@
 #ifndef INCLUDED_borogove_GenericStream
 #include <borogove/GenericStream.h>
 #endif
-#ifndef INCLUDED_borogove_Identity
-#include <borogove/Identity.h>
-#endif
 #ifndef INCLUDED_borogove_Persistence
 #include <borogove/Persistence.h>
 #endif
-#ifndef INCLUDED_borogove_Presence
-#include <borogove/Presence.h>
-#endif
 #ifndef INCLUDED_borogove_SerializedChat
 #include <borogove/SerializedChat.h>
 #endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
+#ifndef INCLUDED_borogove_Status
+#include <borogove/Status.h>
+#endif
+#ifndef INCLUDED_borogove__Chat_Chat_Fields_
+#include <borogove/_Chat/Chat_Fields_.h>
+#endif
 #ifndef INCLUDED_haxe_IMap
 #include <haxe/IMap.h>
 #endif
 #ifndef INCLUDED_haxe_ds_StringMap
 #include <haxe/ds/StringMap.h>
 #endif
+#ifndef INCLUDED_thenshim_Thenable
+#include <thenshim/Thenable.h>
+#endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_10d675922f29bad2_1967_new,"borogove.SerializedChat","new",0x812203bb,"borogove.SerializedChat.new","borogove/Chat.hx",1967,0x1763ae98)
-HX_LOCAL_STACK_FRAME(_hx_pos_10d675922f29bad2_1986_toChat,"borogove.SerializedChat","toChat",0xdd72e178,"borogove.SerializedChat.toChat","borogove/Chat.hx",1986,0x1763ae98)
-static const ::String _hx_array_data_f7d90a49_3[] = {
-	HX_("http://jabber.org/protocol/muc",07,b2,7f,c6),
-};
+HX_DEFINE_STACK_FRAME(_hx_pos_10d675922f29bad2_2363_new,"borogove.SerializedChat","new",0x812203bb,"borogove.SerializedChat.new","borogove/Chat.hx",2363,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_10d675922f29bad2_2416_toChat,"borogove.SerializedChat","toChat",0xdd72e178,"borogove.SerializedChat.toChat","borogove/Chat.hx",2416,0x1763ae98)
+HX_LOCAL_STACK_FRAME(_hx_pos_10d675922f29bad2_2448_toChat,"borogove.SerializedChat","toChat",0xdd72e178,"borogove.SerializedChat.toChat","borogove/Chat.hx",2448,0x1763ae98)
 namespace borogove{
 
-void SerializedChat_obj::__construct(::String chatId,bool trusted,::Array< unsigned char > avatarSha1, ::haxe::ds::StringMap presence,::String displayName, ::Dynamic uiState, ::Dynamic isBlocked,::String extensions,::String readUpToId,::String readUpToBy, ::Dynamic notificationsFiltered,bool notifyMention,bool notifyReply, ::borogove::Caps disco,::Array< int > omemoContactDeviceIDs,::String klass){
-            	HX_STACKFRAME(&_hx_pos_10d675922f29bad2_1967_new)
-HXLINE(1968)		this->chatId = chatId;
-HXLINE(1969)		this->trusted = trusted;
-HXLINE(1970)		this->avatarSha1 = avatarSha1;
-HXLINE(1971)		this->presence = presence;
-HXLINE(1972)		this->displayName = displayName;
-HXLINE(1973)		int _hx_tmp;
-HXDLIN(1973)		if (::hx::IsNotNull( uiState )) {
-HXLINE(1973)			_hx_tmp = ( (int)(uiState) );
+void SerializedChat_obj::__construct(::String chatId,bool trusted,bool isBookmarked,::Array< unsigned char > avatarSha1, ::haxe::ds::StringMap presence,::Array< ::Dynamic> membersForName,::String displayName, ::Dynamic uiState, ::Dynamic isBlocked, ::borogove::Status status,::String extensions,::String readUpToId,::String readUpToBy, ::Dynamic notificationsFiltered,bool notifyMention,bool notifyReply, ::haxe::ds::StringMap threads, ::borogove::Caps disco,::String mavUntil,::Array< int > omemoContactDeviceIDs,::String klass){
+            	HX_GC_STACKFRAME(&_hx_pos_10d675922f29bad2_2363_new)
+HXLINE(2377)		this->threads =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(2390)		this->chatId = chatId;
+HXLINE(2391)		this->trusted = trusted;
+HXLINE(2392)		this->isBookmarked = isBookmarked;
+HXLINE(2393)		this->avatarSha1 = avatarSha1;
+HXLINE(2394)		this->presence = presence;
+HXLINE(2395)		this->membersForName = membersForName;
+HXLINE(2396)		this->displayName = displayName;
+HXLINE(2397)		int _hx_tmp;
+HXDLIN(2397)		if (::hx::IsNotNull( uiState )) {
+HXLINE(2397)			_hx_tmp = ( (int)(uiState) );
             		}
             		else {
-HXLINE(1973)			_hx_tmp = 1;
+HXLINE(2397)			_hx_tmp = 1;
             		}
-HXDLIN(1973)		this->uiState = _hx_tmp;
-HXLINE(1974)		bool _hx_tmp1;
-HXDLIN(1974)		if (::hx::IsNotNull( isBlocked )) {
-HXLINE(1974)			_hx_tmp1 = ( (bool)(isBlocked) );
+HXDLIN(2397)		this->uiState = _hx_tmp;
+HXLINE(2398)		bool _hx_tmp1;
+HXDLIN(2398)		if (::hx::IsNotNull( isBlocked )) {
+HXLINE(2398)			_hx_tmp1 = ( (bool)(isBlocked) );
             		}
             		else {
-HXLINE(1974)			_hx_tmp1 = false;
+HXLINE(2398)			_hx_tmp1 = false;
             		}
-HXDLIN(1974)		this->isBlocked = _hx_tmp1;
-HXLINE(1975)		::String _hx_tmp2;
-HXDLIN(1975)		if (::hx::IsNotNull( extensions )) {
-HXLINE(1975)			_hx_tmp2 = extensions;
+HXDLIN(2398)		this->isBlocked = _hx_tmp1;
+HXLINE(2399)		this->status = status;
+HXLINE(2400)		::String _hx_tmp2;
+HXDLIN(2400)		if (::hx::IsNotNull( extensions )) {
+HXLINE(2400)			_hx_tmp2 = extensions;
             		}
             		else {
-HXLINE(1975)			_hx_tmp2 = HX_("<extensions xmlns='urn:app:bookmarks:1' />",84,43,42,a9);
+HXLINE(2400)			_hx_tmp2 = HX_("<extensions xmlns='urn:app:bookmarks:1' />",84,43,42,a9);
             		}
-HXDLIN(1975)		this->extensions = _hx_tmp2;
-HXLINE(1976)		this->readUpToId = readUpToId;
-HXLINE(1977)		this->readUpToBy = readUpToBy;
-HXLINE(1978)		this->notificationsFiltered = notificationsFiltered;
-HXLINE(1979)		this->notifyMention = notifyMention;
-HXLINE(1980)		this->notifyReply = notifyReply;
-HXLINE(1981)		this->disco = disco;
-HXLINE(1982)		this->omemoContactDeviceIDs = omemoContactDeviceIDs;
-HXLINE(1983)		this->klass = klass;
+HXDLIN(2400)		this->extensions = _hx_tmp2;
+HXLINE(2401)		this->readUpToId = readUpToId;
+HXLINE(2402)		this->readUpToBy = readUpToBy;
+HXLINE(2403)		this->notificationsFiltered = notificationsFiltered;
+HXLINE(2404)		this->notifyMention = notifyMention;
+HXLINE(2405)		this->notifyReply = notifyReply;
+HXLINE(2406)		this->threads = threads;
+HXLINE(2407)		this->disco = disco;
+HXLINE(2408)		this->mavUntil = mavUntil;
+HXLINE(2409)		this->omemoContactDeviceIDs = omemoContactDeviceIDs;
+HXLINE(2410)		this->klass = klass;
             	}
 
 Dynamic SerializedChat_obj::__CreateEmpty() { return new SerializedChat_obj; }
@@ -99,7 +109,7 @@ void *SerializedChat_obj::_hx_vtable = 0;
 Dynamic SerializedChat_obj::__Create(::hx::DynamicArray inArgs)
 {
 	::hx::ObjectPtr< SerializedChat_obj > _hx_result = new SerializedChat_obj();
-	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2],inArgs[3],inArgs[4],inArgs[5],inArgs[6],inArgs[7],inArgs[8],inArgs[9],inArgs[10],inArgs[11],inArgs[12],inArgs[13],inArgs[14],inArgs[15]);
+	_hx_result->__construct(inArgs[0],inArgs[1],inArgs[2],inArgs[3],inArgs[4],inArgs[5],inArgs[6],inArgs[7],inArgs[8],inArgs[9],inArgs[10],inArgs[11],inArgs[12],inArgs[13],inArgs[14],inArgs[15],inArgs[16],inArgs[17],inArgs[18],inArgs[19],inArgs[20]);
 	return _hx_result;
 }
 
@@ -108,90 +118,136 @@ bool SerializedChat_obj::_hx_isInstanceOf(int inClassId) {
 }
 
  ::borogove::Chat SerializedChat_obj::toChat( ::borogove::Client client, ::borogove::GenericStream stream,::Dynamic persistence){
-            	HX_GC_STACKFRAME(&_hx_pos_10d675922f29bad2_1986_toChat)
-HXLINE(1987)		 ::borogove::Stanza extensionsStanza = ::borogove::Stanza_obj::parse(this->extensions);
-HXLINE(1988)		bool filterN;
-HXDLIN(1988)		 ::Dynamic tmp = this->notificationsFiltered;
-HXDLIN(1988)		if (::hx::IsNotNull( tmp )) {
-HXLINE(1988)			filterN = ( (bool)(tmp) );
+            	HX_GC_STACKFRAME(&_hx_pos_10d675922f29bad2_2416_toChat)
+HXLINE(2417)		 ::borogove::Stanza extensionsStanza = ::borogove::Stanza_obj::parse(this->extensions);
+HXLINE(2418)		bool filterN;
+HXDLIN(2418)		 ::Dynamic tmp = this->notificationsFiltered;
+HXDLIN(2418)		if (::hx::IsNotNull( tmp )) {
+HXLINE(2418)			filterN = ( (bool)(tmp) );
             		}
             		else {
-HXLINE(1988)			filterN = false;
+HXLINE(2418)			filterN = false;
+            		}
+HXLINE(2419)		bool mention = this->notifyMention;
+HXLINE(2422)		{
+HXLINE(2422)			::Dynamic this1 = this->presence;
+HXDLIN(2422)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this1);
+HXDLIN(2422)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(2422)				 ::borogove::Stanza _g_value = ( ( ::borogove::Stanza)(::haxe::IMap_obj::get(this1,_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)())) );
+HXLINE(2423)				if (::hx::IsNotNull( _g_value )) {
+HXLINE(2423)					client->capsRepo->getAsync(_g_value);
+            				}
+            			}
             		}
-HXLINE(1989)		bool mention = this->notifyMention;
-HXLINE(1991)		 ::borogove::Chat chat;
-HXDLIN(1991)		if ((this->klass == HX_("DirectChat",c1,22,a3,05))) {
-HXLINE(1991)			chat =  ::borogove::DirectChat_obj::__alloc( HX_CTX ,client,stream,persistence,this->chatId,this->uiState,this->isBlocked,extensionsStanza,this->readUpToId,this->readUpToBy,this->omemoContactDeviceIDs);
+HXLINE(2426)		 ::borogove::Chat chat;
+HXDLIN(2426)		if ((this->klass == HX_("DirectChat",c1,22,a3,05))) {
+HXLINE(2426)			chat =  ::borogove::DirectChat_obj::__alloc( HX_CTX ,client,stream,persistence,this->chatId,this->uiState,this->isBookmarked,this->isBlocked,extensionsStanza,this->readUpToId,this->readUpToBy,this->omemoContactDeviceIDs);
             		}
             		else {
-HXLINE(1993)			if ((this->klass == HX_("Channel",a3,28,23,9a))) {
-HXLINE(1994)				 ::borogove::Channel channel =  ::borogove::Channel_obj::__alloc( HX_CTX ,client,stream,persistence,this->chatId,this->uiState,this->isBlocked,extensionsStanza,this->readUpToId,this->readUpToBy,null());
-HXLINE(1995)				 ::borogove::Caps tmp1 = this->disco;
-HXDLIN(1995)				 ::borogove::Caps chat1;
-HXDLIN(1995)				if (::hx::IsNotNull( tmp1 )) {
-HXLINE(1995)					chat1 = tmp1;
-            				}
-            				else {
-HXLINE(1995)					chat1 =  ::borogove::Caps_obj::__alloc( HX_CTX ,HX_("",00,00,00,00),::Array_obj< ::Dynamic>::__new(0),::Array_obj< ::String >::fromData( _hx_array_data_f7d90a49_3,1),::Array_obj< ::Dynamic>::__new(0),null());
+HXLINE(2428)			if ((this->klass == HX_("Channel",a3,28,23,9a))) {
+HXLINE(2429)				 ::borogove::Channel channel =  ::borogove::Channel_obj::__alloc( HX_CTX ,client,stream,persistence,this->chatId,this->uiState,this->isBookmarked,this->isBlocked,extensionsStanza,this->readUpToId,this->readUpToBy,null());
+HXLINE(2430)				channel->membersForName = this->membersForName;
+HXLINE(2431)				channel->mavUntil = this->mavUntil;
+HXLINE(2432)				if (::hx::IsNotNull( this->disco )) {
+HXLINE(2432)					channel->disco = client->capsRepo->add(this->disco,false);
             				}
-HXDLIN(1995)				channel->disco = chat1;
-HXLINE(1996)				bool chat2;
-HXDLIN(1996)				if (::hx::IsNull( this->notificationsFiltered )) {
-HXLINE(1996)					chat2 = !(channel->isPrivate());
+HXLINE(2433)				bool chat1;
+HXDLIN(2433)				if (::hx::IsNull( this->notificationsFiltered )) {
+HXLINE(2433)					chat1 = !(channel->isPrivate());
             				}
             				else {
-HXLINE(1996)					chat2 = false;
+HXLINE(2433)					chat1 = false;
             				}
-HXDLIN(1996)				if (chat2) {
-HXLINE(1997)					filterN = true;
-HXDLIN(1997)					mention = true;
+HXDLIN(2433)				if (chat1) {
+HXLINE(2434)					filterN = true;
+HXDLIN(2434)					mention = true;
             				}
-HXLINE(1991)				chat = channel;
+HXLINE(2426)				chat = channel;
             			}
             			else {
-HXLINE(2001)				HX_STACK_DO_THROW((((HX_("Unknown class of ",0b,cb,7f,f2) + this->chatId) + HX_(": ",a6,32,00,00)) + this->klass));
+HXLINE(2438)				HX_STACK_DO_THROW((((HX_("Unknown class of ",0b,cb,7f,f2) + this->chatId) + HX_(": ",a6,32,00,00)) + this->klass));
             			}
             		}
-HXLINE(2003)		chat->setNotificationsInternal(filterN,mention,this->notifyReply);
-HXLINE(2004)		bool _hx_tmp;
-HXDLIN(2004)		if (::hx::IsNotNull( this->displayName )) {
-HXLINE(2004)			_hx_tmp = (this->displayName != HX_("",00,00,00,00));
+HXLINE(2440)		chat->setNotificationsInternal(filterN,mention,this->notifyReply);
+HXLINE(2441)		bool _hx_tmp;
+HXDLIN(2441)		if (::hx::IsNotNull( this->displayName )) {
+HXLINE(2441)			_hx_tmp = (this->displayName != HX_("",00,00,00,00));
             		}
             		else {
-HXLINE(2004)			_hx_tmp = false;
+HXLINE(2441)			_hx_tmp = false;
             		}
-HXDLIN(2004)		if (_hx_tmp) {
-HXLINE(2004)			chat->displayName = this->displayName;
+HXDLIN(2441)		if (_hx_tmp) {
+HXLINE(2441)			chat->displayName = this->displayName;
             		}
-HXLINE(2005)		if (::hx::IsNotNull( this->avatarSha1 )) {
-HXLINE(2005)			chat->setAvatarSha1(this->avatarSha1);
+HXLINE(2442)		if (::hx::IsNotNull( this->avatarSha1 )) {
+HXLINE(2442)			chat->setAvatarSha1(this->avatarSha1);
             		}
-HXLINE(2006)		chat->setTrusted(this->trusted);
-HXLINE(2007)		{
-HXLINE(2007)			::Dynamic this1 = this->presence;
-HXDLIN(2007)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this1);
-HXDLIN(2007)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE(2007)				::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXLINE(2008)				chat->setPresence(key,( ( ::borogove::Presence)(::haxe::IMap_obj::get(this1,key)) ));
+HXLINE(2443)		chat->status = this->status;
+HXLINE(2444)		chat->setTrusted(this->trusted);
+HXLINE(2445)		{
+HXLINE(2445)			::Dynamic this2 = this->presence;
+HXDLIN(2445)			 ::Dynamic _g_keys1 = ::haxe::IMap_obj::keys(this2);
+HXDLIN(2445)			while(( (bool)(_g_keys1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(2445)				::String key = ( (::String)(_g_keys1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXLINE(2446)				chat->setPresence(key,( ( ::borogove::Stanza)(::haxe::IMap_obj::get(this2,key)) ),true);
             			}
             		}
-HXLINE(2010)		return chat;
+HXLINE(2448)		{
+            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0,::Array< ::Dynamic>,iter_keys) HXARGC(0)
+            			bool _hx_run(){
+            				HX_GC_STACKFRAME(&_hx_pos_10d675922f29bad2_2448_toChat)
+HXLINE(2448)				return ( (bool)(iter_keys->__get(0)->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) );
+            			}
+            			HX_END_LOCAL_FUNC0(return)
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::Array< ::Dynamic>,iter_map,::Array< ::Dynamic>,iter_keys) HXARGC(0)
+            			 ::Dynamic _hx_run(){
+            				HX_GC_STACKFRAME(&_hx_pos_10d675922f29bad2_2448_toChat)
+HXLINE(2448)				::String key = ( (::String)(iter_keys->__get(0)->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN(2448)				 ::Dynamic v =  ::Dynamic(::hx::Anon_obj::Create(2)
+            					->setFixed(0,HX_("key",9f,89,51,00),key)
+            					->setFixed(1,HX_("value",71,7f,b8,31),( (::String)(::haxe::IMap_obj::get(iter_map->__get(0),key)) )));
+HXDLIN(2448)				if (::hx::IsEq( v->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic),::borogove::_Chat::Chat_Fields__obj::nullSentinel )) {
+HXLINE(2448)					return  ::Dynamic(::hx::Anon_obj::Create(2)
+            						->setFixed(0,HX_("key",9f,89,51,00),null())
+            						->setFixed(1,HX_("value",71,7f,b8,31), ::Dynamic(v->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic))));
+            				}
+            				else {
+HXLINE(2448)					return v;
+            				}
+HXDLIN(2448)				return null();
+            			}
+            			HX_END_LOCAL_FUNC0(return)
+
+HXLINE(2448)			::Array< ::Dynamic> iter_map = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN(2448)			::Array< ::Dynamic> iter_keys = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN(2448)			::Dynamic map = this->threads;
+HXDLIN(2448)			iter_map[0] = map;
+HXDLIN(2448)			iter_keys[0] = ::haxe::IMap_obj::keys(map);
+HXDLIN(2448)			 ::Dynamic _g_hasNext =  ::Dynamic(new _hx_Closure_0(iter_keys));
+HXDLIN(2448)			 ::Dynamic _g_next =  ::Dynamic(new _hx_Closure_1(iter_map,iter_keys));
+HXDLIN(2448)			while(( (bool)(_g_hasNext()) )){
+HXLINE(2448)				 ::Dynamic _g = _g_next();
+HXLINE(2449)				chat->setThreadSubject(( (::String)(_g->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic)) ),( (::String)(_g->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)) ));
+            			}
+            		}
+HXLINE(2451)		return chat;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC3(SerializedChat_obj,toChat,return )
 
 
-::hx::ObjectPtr< SerializedChat_obj > SerializedChat_obj::__new(::String chatId,bool trusted,::Array< unsigned char > avatarSha1, ::haxe::ds::StringMap presence,::String displayName, ::Dynamic uiState, ::Dynamic isBlocked,::String extensions,::String readUpToId,::String readUpToBy, ::Dynamic notificationsFiltered,bool notifyMention,bool notifyReply, ::borogove::Caps disco,::Array< int > omemoContactDeviceIDs,::String klass) {
+::hx::ObjectPtr< SerializedChat_obj > SerializedChat_obj::__new(::String chatId,bool trusted,bool isBookmarked,::Array< unsigned char > avatarSha1, ::haxe::ds::StringMap presence,::Array< ::Dynamic> membersForName,::String displayName, ::Dynamic uiState, ::Dynamic isBlocked, ::borogove::Status status,::String extensions,::String readUpToId,::String readUpToBy, ::Dynamic notificationsFiltered,bool notifyMention,bool notifyReply, ::haxe::ds::StringMap threads, ::borogove::Caps disco,::String mavUntil,::Array< int > omemoContactDeviceIDs,::String klass) {
 	::hx::ObjectPtr< SerializedChat_obj > __this = new SerializedChat_obj();
-	__this->__construct(chatId,trusted,avatarSha1,presence,displayName,uiState,isBlocked,extensions,readUpToId,readUpToBy,notificationsFiltered,notifyMention,notifyReply,disco,omemoContactDeviceIDs,klass);
+	__this->__construct(chatId,trusted,isBookmarked,avatarSha1,presence,membersForName,displayName,uiState,isBlocked,status,extensions,readUpToId,readUpToBy,notificationsFiltered,notifyMention,notifyReply,threads,disco,mavUntil,omemoContactDeviceIDs,klass);
 	return __this;
 }
 
-::hx::ObjectPtr< SerializedChat_obj > SerializedChat_obj::__alloc(::hx::Ctx *_hx_ctx,::String chatId,bool trusted,::Array< unsigned char > avatarSha1, ::haxe::ds::StringMap presence,::String displayName, ::Dynamic uiState, ::Dynamic isBlocked,::String extensions,::String readUpToId,::String readUpToBy, ::Dynamic notificationsFiltered,bool notifyMention,bool notifyReply, ::borogove::Caps disco,::Array< int > omemoContactDeviceIDs,::String klass) {
+::hx::ObjectPtr< SerializedChat_obj > SerializedChat_obj::__alloc(::hx::Ctx *_hx_ctx,::String chatId,bool trusted,bool isBookmarked,::Array< unsigned char > avatarSha1, ::haxe::ds::StringMap presence,::Array< ::Dynamic> membersForName,::String displayName, ::Dynamic uiState, ::Dynamic isBlocked, ::borogove::Status status,::String extensions,::String readUpToId,::String readUpToBy, ::Dynamic notificationsFiltered,bool notifyMention,bool notifyReply, ::haxe::ds::StringMap threads, ::borogove::Caps disco,::String mavUntil,::Array< int > omemoContactDeviceIDs,::String klass) {
 	SerializedChat_obj *__this = (SerializedChat_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(SerializedChat_obj), true, "borogove.SerializedChat"));
 	*(void **)__this = SerializedChat_obj::_hx_vtable;
-	__this->__construct(chatId,trusted,avatarSha1,presence,displayName,uiState,isBlocked,extensions,readUpToId,readUpToBy,notificationsFiltered,notifyMention,notifyReply,disco,omemoContactDeviceIDs,klass);
+	__this->__construct(chatId,trusted,isBookmarked,avatarSha1,presence,membersForName,displayName,uiState,isBlocked,status,extensions,readUpToId,readUpToBy,notificationsFiltered,notifyMention,notifyReply,threads,disco,mavUntil,omemoContactDeviceIDs,klass);
 	return __this;
 }
 
@@ -204,20 +260,25 @@ void SerializedChat_obj::__Mark(HX_MARK_PARAMS)
 	HX_MARK_BEGIN_CLASS(SerializedChat);
 	HX_MARK_MEMBER_NAME(chatId,"chatId");
 	HX_MARK_MEMBER_NAME(trusted,"trusted");
+	HX_MARK_MEMBER_NAME(isBookmarked,"isBookmarked");
 	HX_MARK_MEMBER_NAME(avatarSha1,"avatarSha1");
 	HX_MARK_MEMBER_NAME(presence,"presence");
+	HX_MARK_MEMBER_NAME(membersForName,"membersForName");
 	HX_MARK_MEMBER_NAME(displayName,"displayName");
 	HX_MARK_MEMBER_NAME(uiState,"uiState");
 	HX_MARK_MEMBER_NAME(isBlocked,"isBlocked");
+	HX_MARK_MEMBER_NAME(status,"status");
 	HX_MARK_MEMBER_NAME(extensions,"extensions");
 	HX_MARK_MEMBER_NAME(readUpToId,"readUpToId");
 	HX_MARK_MEMBER_NAME(readUpToBy,"readUpToBy");
+	HX_MARK_MEMBER_NAME(threads,"threads");
 	HX_MARK_MEMBER_NAME(disco,"disco");
+	HX_MARK_MEMBER_NAME(mavUntil,"mavUntil");
 	HX_MARK_MEMBER_NAME(omemoContactDeviceIDs,"omemoContactDeviceIDs");
-	HX_MARK_MEMBER_NAME(klass,"klass");
 	HX_MARK_MEMBER_NAME(notificationsFiltered,"notificationsFiltered");
 	HX_MARK_MEMBER_NAME(notifyMention,"notifyMention");
 	HX_MARK_MEMBER_NAME(notifyReply,"notifyReply");
+	HX_MARK_MEMBER_NAME(klass,"klass");
 	HX_MARK_END_CLASS();
 }
 
@@ -225,20 +286,25 @@ void SerializedChat_obj::__Visit(HX_VISIT_PARAMS)
 {
 	HX_VISIT_MEMBER_NAME(chatId,"chatId");
 	HX_VISIT_MEMBER_NAME(trusted,"trusted");
+	HX_VISIT_MEMBER_NAME(isBookmarked,"isBookmarked");
 	HX_VISIT_MEMBER_NAME(avatarSha1,"avatarSha1");
 	HX_VISIT_MEMBER_NAME(presence,"presence");
+	HX_VISIT_MEMBER_NAME(membersForName,"membersForName");
 	HX_VISIT_MEMBER_NAME(displayName,"displayName");
 	HX_VISIT_MEMBER_NAME(uiState,"uiState");
 	HX_VISIT_MEMBER_NAME(isBlocked,"isBlocked");
+	HX_VISIT_MEMBER_NAME(status,"status");
 	HX_VISIT_MEMBER_NAME(extensions,"extensions");
 	HX_VISIT_MEMBER_NAME(readUpToId,"readUpToId");
 	HX_VISIT_MEMBER_NAME(readUpToBy,"readUpToBy");
+	HX_VISIT_MEMBER_NAME(threads,"threads");
 	HX_VISIT_MEMBER_NAME(disco,"disco");
+	HX_VISIT_MEMBER_NAME(mavUntil,"mavUntil");
 	HX_VISIT_MEMBER_NAME(omemoContactDeviceIDs,"omemoContactDeviceIDs");
-	HX_VISIT_MEMBER_NAME(klass,"klass");
 	HX_VISIT_MEMBER_NAME(notificationsFiltered,"notificationsFiltered");
 	HX_VISIT_MEMBER_NAME(notifyMention,"notifyMention");
 	HX_VISIT_MEMBER_NAME(notifyReply,"notifyReply");
+	HX_VISIT_MEMBER_NAME(klass,"klass");
 }
 
 ::hx::Val SerializedChat_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
@@ -250,14 +316,17 @@ void SerializedChat_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 6:
 		if (HX_FIELD_EQ(inName,"chatId") ) { return ::hx::Val( chatId ); }
+		if (HX_FIELD_EQ(inName,"status") ) { return ::hx::Val( status ); }
 		if (HX_FIELD_EQ(inName,"toChat") ) { return ::hx::Val( toChat_dyn() ); }
 		break;
 	case 7:
 		if (HX_FIELD_EQ(inName,"trusted") ) { return ::hx::Val( trusted ); }
 		if (HX_FIELD_EQ(inName,"uiState") ) { return ::hx::Val( uiState ); }
+		if (HX_FIELD_EQ(inName,"threads") ) { return ::hx::Val( threads ); }
 		break;
 	case 8:
 		if (HX_FIELD_EQ(inName,"presence") ) { return ::hx::Val( presence ); }
+		if (HX_FIELD_EQ(inName,"mavUntil") ) { return ::hx::Val( mavUntil ); }
 		break;
 	case 9:
 		if (HX_FIELD_EQ(inName,"isBlocked") ) { return ::hx::Val( isBlocked ); }
@@ -272,9 +341,15 @@ void SerializedChat_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"displayName") ) { return ::hx::Val( displayName ); }
 		if (HX_FIELD_EQ(inName,"notifyReply") ) { return ::hx::Val( notifyReply ); }
 		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"isBookmarked") ) { return ::hx::Val( isBookmarked ); }
+		break;
 	case 13:
 		if (HX_FIELD_EQ(inName,"notifyMention") ) { return ::hx::Val( notifyMention ); }
 		break;
+	case 14:
+		if (HX_FIELD_EQ(inName,"membersForName") ) { return ::hx::Val( membersForName ); }
+		break;
 	case 21:
 		if (HX_FIELD_EQ(inName,"omemoContactDeviceIDs") ) { return ::hx::Val( omemoContactDeviceIDs ); }
 		if (HX_FIELD_EQ(inName,"notificationsFiltered") ) { return ::hx::Val( notificationsFiltered ); }
@@ -291,13 +366,16 @@ void SerializedChat_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 6:
 		if (HX_FIELD_EQ(inName,"chatId") ) { chatId=inValue.Cast< ::String >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"status") ) { status=inValue.Cast<  ::borogove::Status >(); return inValue; }
 		break;
 	case 7:
 		if (HX_FIELD_EQ(inName,"trusted") ) { trusted=inValue.Cast< bool >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"uiState") ) { uiState=inValue.Cast< int >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"threads") ) { threads=inValue.Cast<  ::haxe::ds::StringMap >(); return inValue; }
 		break;
 	case 8:
 		if (HX_FIELD_EQ(inName,"presence") ) { presence=inValue.Cast<  ::haxe::ds::StringMap >(); return inValue; }
+		if (HX_FIELD_EQ(inName,"mavUntil") ) { mavUntil=inValue.Cast< ::String >(); return inValue; }
 		break;
 	case 9:
 		if (HX_FIELD_EQ(inName,"isBlocked") ) { isBlocked=inValue.Cast< bool >(); return inValue; }
@@ -312,9 +390,15 @@ void SerializedChat_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"displayName") ) { displayName=inValue.Cast< ::String >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"notifyReply") ) { notifyReply=inValue.Cast< bool >(); return inValue; }
 		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"isBookmarked") ) { isBookmarked=inValue.Cast< bool >(); return inValue; }
+		break;
 	case 13:
 		if (HX_FIELD_EQ(inName,"notifyMention") ) { notifyMention=inValue.Cast< bool >(); return inValue; }
 		break;
+	case 14:
+		if (HX_FIELD_EQ(inName,"membersForName") ) { membersForName=inValue.Cast< ::Array< ::Dynamic> >(); return inValue; }
+		break;
 	case 21:
 		if (HX_FIELD_EQ(inName,"omemoContactDeviceIDs") ) { omemoContactDeviceIDs=inValue.Cast< ::Array< int > >(); return inValue; }
 		if (HX_FIELD_EQ(inName,"notificationsFiltered") ) { notificationsFiltered=inValue.Cast<  ::Dynamic >(); return inValue; }
@@ -326,20 +410,25 @@ void SerializedChat_obj::__GetFields(Array< ::String> &outFields)
 {
 	outFields->push(HX_("chatId",d3,04,77,b7));
 	outFields->push(HX_("trusted",f7,b7,a6,16));
+	outFields->push(HX_("isBookmarked",1f,27,16,ce));
 	outFields->push(HX_("avatarSha1",3e,f5,cc,3e));
 	outFields->push(HX_("presence",3b,52,d7,66));
+	outFields->push(HX_("membersForName",1b,56,f2,d2));
 	outFields->push(HX_("displayName",ad,11,f2,30));
 	outFields->push(HX_("uiState",1d,0f,01,14));
 	outFields->push(HX_("isBlocked",22,f8,fc,48));
+	outFields->push(HX_("status",32,e7,fb,05));
 	outFields->push(HX_("extensions",14,7c,70,89));
 	outFields->push(HX_("readUpToId",27,7a,f8,75));
 	outFields->push(HX_("readUpToBy",23,74,f8,75));
+	outFields->push(HX_("threads",69,f6,91,53));
 	outFields->push(HX_("disco",7a,03,d1,d9));
+	outFields->push(HX_("mavUntil",9c,52,56,84));
 	outFields->push(HX_("omemoContactDeviceIDs",6b,7d,55,9d));
-	outFields->push(HX_("klass",40,1c,8d,e3));
 	outFields->push(HX_("notificationsFiltered",5f,11,ed,96));
 	outFields->push(HX_("notifyMention",21,c7,22,5a));
 	outFields->push(HX_("notifyReply",a1,e5,9f,37));
+	outFields->push(HX_("klass",40,1c,8d,e3));
 	super::__GetFields(outFields);
 };
 
@@ -347,20 +436,25 @@ void SerializedChat_obj::__GetFields(Array< ::String> &outFields)
 static ::hx::StorageInfo SerializedChat_obj_sMemberStorageInfo[] = {
 	{::hx::fsString,(int)offsetof(SerializedChat_obj,chatId),HX_("chatId",d3,04,77,b7)},
 	{::hx::fsBool,(int)offsetof(SerializedChat_obj,trusted),HX_("trusted",f7,b7,a6,16)},
+	{::hx::fsBool,(int)offsetof(SerializedChat_obj,isBookmarked),HX_("isBookmarked",1f,27,16,ce)},
 	{::hx::fsObject /* ::Array< unsigned char > */ ,(int)offsetof(SerializedChat_obj,avatarSha1),HX_("avatarSha1",3e,f5,cc,3e)},
 	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(SerializedChat_obj,presence),HX_("presence",3b,52,d7,66)},
+	{::hx::fsObject /* ::Array< ::Dynamic> */ ,(int)offsetof(SerializedChat_obj,membersForName),HX_("membersForName",1b,56,f2,d2)},
 	{::hx::fsString,(int)offsetof(SerializedChat_obj,displayName),HX_("displayName",ad,11,f2,30)},
 	{::hx::fsInt,(int)offsetof(SerializedChat_obj,uiState),HX_("uiState",1d,0f,01,14)},
 	{::hx::fsBool,(int)offsetof(SerializedChat_obj,isBlocked),HX_("isBlocked",22,f8,fc,48)},
+	{::hx::fsObject /*  ::borogove::Status */ ,(int)offsetof(SerializedChat_obj,status),HX_("status",32,e7,fb,05)},
 	{::hx::fsString,(int)offsetof(SerializedChat_obj,extensions),HX_("extensions",14,7c,70,89)},
 	{::hx::fsString,(int)offsetof(SerializedChat_obj,readUpToId),HX_("readUpToId",27,7a,f8,75)},
 	{::hx::fsString,(int)offsetof(SerializedChat_obj,readUpToBy),HX_("readUpToBy",23,74,f8,75)},
+	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(SerializedChat_obj,threads),HX_("threads",69,f6,91,53)},
 	{::hx::fsObject /*  ::borogove::Caps */ ,(int)offsetof(SerializedChat_obj,disco),HX_("disco",7a,03,d1,d9)},
+	{::hx::fsString,(int)offsetof(SerializedChat_obj,mavUntil),HX_("mavUntil",9c,52,56,84)},
 	{::hx::fsObject /* ::Array< int > */ ,(int)offsetof(SerializedChat_obj,omemoContactDeviceIDs),HX_("omemoContactDeviceIDs",6b,7d,55,9d)},
-	{::hx::fsString,(int)offsetof(SerializedChat_obj,klass),HX_("klass",40,1c,8d,e3)},
 	{::hx::fsObject /*  ::Dynamic */ ,(int)offsetof(SerializedChat_obj,notificationsFiltered),HX_("notificationsFiltered",5f,11,ed,96)},
 	{::hx::fsBool,(int)offsetof(SerializedChat_obj,notifyMention),HX_("notifyMention",21,c7,22,5a)},
 	{::hx::fsBool,(int)offsetof(SerializedChat_obj,notifyReply),HX_("notifyReply",a1,e5,9f,37)},
+	{::hx::fsString,(int)offsetof(SerializedChat_obj,klass),HX_("klass",40,1c,8d,e3)},
 	{ ::hx::fsUnknown, 0, null()}
 };
 static ::hx::StaticInfo *SerializedChat_obj_sStaticStorageInfo = 0;
@@ -369,20 +463,25 @@ static ::hx::StaticInfo *SerializedChat_obj_sStaticStorageInfo = 0;
 static ::String SerializedChat_obj_sMemberFields[] = {
 	HX_("chatId",d3,04,77,b7),
 	HX_("trusted",f7,b7,a6,16),
+	HX_("isBookmarked",1f,27,16,ce),
 	HX_("avatarSha1",3e,f5,cc,3e),
 	HX_("presence",3b,52,d7,66),
+	HX_("membersForName",1b,56,f2,d2),
 	HX_("displayName",ad,11,f2,30),
 	HX_("uiState",1d,0f,01,14),
 	HX_("isBlocked",22,f8,fc,48),
+	HX_("status",32,e7,fb,05),
 	HX_("extensions",14,7c,70,89),
 	HX_("readUpToId",27,7a,f8,75),
 	HX_("readUpToBy",23,74,f8,75),
+	HX_("threads",69,f6,91,53),
 	HX_("disco",7a,03,d1,d9),
+	HX_("mavUntil",9c,52,56,84),
 	HX_("omemoContactDeviceIDs",6b,7d,55,9d),
-	HX_("klass",40,1c,8d,e3),
 	HX_("notificationsFiltered",5f,11,ed,96),
 	HX_("notifyMention",21,c7,22,5a),
 	HX_("notifyReply",a1,e5,9f,37),
+	HX_("klass",40,1c,8d,e3),
 	HX_("toChat",f3,c9,78,77),
 	::String(null()) };
 
diff --git a/Sources/c_borogove/src/borogove/Stanza.cpp b/Sources/c_borogove/src/borogove/Stanza.cpp
index 5e9c724..cacf427 100644
--- a/Sources/c_borogove/src/borogove/Stanza.cpp
+++ b/Sources/c_borogove/src/borogove/Stanza.cpp
@@ -32,34 +32,35 @@
 HX_DEFINE_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_67_new,"borogove.Stanza","new",0x686a19b4,"borogove.Stanza.new","borogove/Stanza.hx",67,0xaf8a101b)
 HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_83_serialize,"borogove.Stanza","serialize",0xd5705e34,"borogove.Stanza.serialize","borogove/Stanza.hx",83,0xaf8a101b)
 HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_118_toString,"borogove.Stanza","toString",0x63ea36d8,"borogove.Stanza.toString","borogove/Stanza.hx",118,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_159_tag,"borogove.Stanza","tag",0x686ea3ae,"borogove.Stanza.tag","borogove/Stanza.hx",159,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_168_text,"borogove.Stanza","text",0xf863acd9,"borogove.Stanza.text","borogove/Stanza.hx",168,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_174_textTag,"borogove.Stanza","textTag",0x67df3301,"borogove.Stanza.textTag","borogove/Stanza.hx",174,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_180_up,"borogove.Stanza","up",0xef3fa387,"borogove.Stanza.up","borogove/Stanza.hx",180,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_187_reset,"borogove.Stanza","reset",0x38029023,"borogove.Stanza.reset","borogove/Stanza.hx",187,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_193_addChildren,"borogove.Stanza","addChildren",0x1e040dd4,"borogove.Stanza.addChildren","borogove/Stanza.hx",193,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_202_addChildNodes,"borogove.Stanza","addChildNodes",0xfdaa2cca,"borogove.Stanza.addChildNodes","borogove/Stanza.hx",202,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_210_insertChild,"borogove.Stanza","insertChild",0x09ac44f7,"borogove.Stanza.insertChild","borogove/Stanza.hx",210,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_216_addChild,"borogove.Stanza","addChild",0xea9235e7,"borogove.Stanza.addChild","borogove/Stanza.hx",216,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_222_addDirectChild,"borogove.Stanza","addDirectChild",0xc782103e,"borogove.Stanza.addDirectChild","borogove/Stanza.hx",222,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_228_clone,"borogove.Stanza","clone",0x999d59b1,"borogove.Stanza.clone","borogove/Stanza.hx",228,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_240_allTags,"borogove.Stanza","allTags",0x205b01ee,"borogove.Stanza.allTags","borogove/Stanza.hx",240,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_262_allText,"borogove.Stanza","allText",0x205e19c2,"borogove.Stanza.allText","borogove/Stanza.hx",262,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_273_getFirstChild,"borogove.Stanza","getFirstChild",0x353109d6,"borogove.Stanza.getFirstChild","borogove/Stanza.hx",273,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_276_getErrorText,"borogove.Stanza","getErrorText",0xbc80d14b,"borogove.Stanza.getErrorText","borogove/Stanza.hx",276,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_285_getChild,"borogove.Stanza","getChild",0xd10c1f52,"borogove.Stanza.getChild","borogove/Stanza.hx",285,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_302_getChildText,"borogove.Stanza","getChildText",0x21b6291f,"borogove.Stanza.getChildText","borogove/Stanza.hx",302,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_311_hasChild,"borogove.Stanza","hasChild",0xfd8d5a0e,"borogove.Stanza.hasChild","borogove/Stanza.hx",311,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_315_getText,"borogove.Stanza","getText",0xe893ffb7,"borogove.Stanza.getText","borogove/Stanza.hx",315,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_318_find,"borogove.Stanza","find",0xef25b065,"borogove.Stanza.find","borogove/Stanza.hx",318,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_356_findChild,"borogove.Stanza","findChild",0x152edaf7,"borogove.Stanza.findChild","borogove/Stanza.hx",356,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_367_findText,"borogove.Stanza","findText",0xcb093fb2,"borogove.Stanza.findText","borogove/Stanza.hx",367,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_378_traverse,"borogove.Stanza","traverse",0x97e5e3de,"borogove.Stanza.traverse","borogove/Stanza.hx",378,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_387_getError,"borogove.Stanza","getError",0xfe7c417e,"borogove.Stanza.getError","borogove/Stanza.hx",387,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_400_removeChild,"borogove.Stanza","removeChild",0xc02b440c,"borogove.Stanza.removeChild","borogove/Stanza.hx",400,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_410_removeChildren,"borogove.Stanza","removeChildren",0x677ca4cf,"borogove.Stanza.removeChildren","borogove/Stanza.hx",410,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_158_tag,"borogove.Stanza","tag",0x686ea3ae,"borogove.Stanza.tag","borogove/Stanza.hx",158,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_167_text,"borogove.Stanza","text",0xf863acd9,"borogove.Stanza.text","borogove/Stanza.hx",167,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_173_textTag,"borogove.Stanza","textTag",0x67df3301,"borogove.Stanza.textTag","borogove/Stanza.hx",173,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_179_up,"borogove.Stanza","up",0xef3fa387,"borogove.Stanza.up","borogove/Stanza.hx",179,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_186_reset,"borogove.Stanza","reset",0x38029023,"borogove.Stanza.reset","borogove/Stanza.hx",186,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_192_addChildren,"borogove.Stanza","addChildren",0x1e040dd4,"borogove.Stanza.addChildren","borogove/Stanza.hx",192,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_201_addChildNodes,"borogove.Stanza","addChildNodes",0xfdaa2cca,"borogove.Stanza.addChildNodes","borogove/Stanza.hx",201,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_209_insertChild,"borogove.Stanza","insertChild",0x09ac44f7,"borogove.Stanza.insertChild","borogove/Stanza.hx",209,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_215_addChild,"borogove.Stanza","addChild",0xea9235e7,"borogove.Stanza.addChild","borogove/Stanza.hx",215,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_221_addDirectChild,"borogove.Stanza","addDirectChild",0xc782103e,"borogove.Stanza.addDirectChild","borogove/Stanza.hx",221,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_227_clone,"borogove.Stanza","clone",0x999d59b1,"borogove.Stanza.clone","borogove/Stanza.hx",227,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_239_allTags,"borogove.Stanza","allTags",0x205b01ee,"borogove.Stanza.allTags","borogove/Stanza.hx",239,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_261_allText,"borogove.Stanza","allText",0x205e19c2,"borogove.Stanza.allText","borogove/Stanza.hx",261,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_272_getFirstChild,"borogove.Stanza","getFirstChild",0x353109d6,"borogove.Stanza.getFirstChild","borogove/Stanza.hx",272,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_275_getErrorText,"borogove.Stanza","getErrorText",0xbc80d14b,"borogove.Stanza.getErrorText","borogove/Stanza.hx",275,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_284_getChild,"borogove.Stanza","getChild",0xd10c1f52,"borogove.Stanza.getChild","borogove/Stanza.hx",284,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_301_getChildText,"borogove.Stanza","getChildText",0x21b6291f,"borogove.Stanza.getChildText","borogove/Stanza.hx",301,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_310_hasChild,"borogove.Stanza","hasChild",0xfd8d5a0e,"borogove.Stanza.hasChild","borogove/Stanza.hx",310,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_314_getText,"borogove.Stanza","getText",0xe893ffb7,"borogove.Stanza.getText","borogove/Stanza.hx",314,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_317_find,"borogove.Stanza","find",0xef25b065,"borogove.Stanza.find","borogove/Stanza.hx",317,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_355_findChild,"borogove.Stanza","findChild",0x152edaf7,"borogove.Stanza.findChild","borogove/Stanza.hx",355,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_366_findText,"borogove.Stanza","findText",0xcb093fb2,"borogove.Stanza.findText","borogove/Stanza.hx",366,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_377_traverse,"borogove.Stanza","traverse",0x97e5e3de,"borogove.Stanza.traverse","borogove/Stanza.hx",377,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_387_reduce,"borogove.Stanza","reduce",0xc05d70d2,"borogove.Stanza.reduce","borogove/Stanza.hx",387,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_393_getError,"borogove.Stanza","getError",0xfe7c417e,"borogove.Stanza.getError","borogove/Stanza.hx",393,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_406_removeChild,"borogove.Stanza","removeChild",0xc02b440c,"borogove.Stanza.removeChild","borogove/Stanza.hx",406,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_416_removeChildren,"borogove.Stanza","removeChildren",0x677ca4cf,"borogove.Stanza.removeChildren","borogove/Stanza.hx",416,0xaf8a101b)
 HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_121_parse,"borogove.Stanza","parse",0x0e8fd687,"borogove.Stanza.parse","borogove/Stanza.hx",121,0xaf8a101b)
-HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_430_parseXmlBool,"borogove.Stanza","parseXmlBool",0x01d395da,"borogove.Stanza.parseXmlBool","borogove/Stanza.hx",430,0xaf8a101b)
+HX_LOCAL_STACK_FRAME(_hx_pos_f25e9a34e2b06c56_436_parseXmlBool,"borogove.Stanza","parseXmlBool",0x01d395da,"borogove.Stanza.parseXmlBool","borogove/Stanza.hx",436,0xaf8a101b)
 namespace borogove{
 
 void Stanza_obj::__construct(::String name, ::Dynamic attr){
@@ -111,626 +112,659 @@ HXDLIN( 118)		return this->serialize();
 HX_DEFINE_DYNAMIC_FUNC0(Stanza_obj,toString,return )
 
  ::borogove::Stanza Stanza_obj::tag(::String name, ::Dynamic attr){
-            	HX_GC_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_159_tag)
-HXLINE( 160)		this->serialized = null();
-HXLINE( 161)		 ::borogove::Stanza child =  ::borogove::Stanza_obj::__alloc( HX_CTX ,name,attr);
-HXLINE( 162)		this->last_added->addDirectChild(::borogove::Node_obj::Element(child));
-HXLINE( 163)		this->last_added_stack->push(this->last_added);
-HXLINE( 164)		this->last_added = child;
-HXLINE( 165)		return ::hx::ObjectPtr<OBJ_>(this);
+            	HX_GC_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_158_tag)
+HXLINE( 159)		this->serialized = null();
+HXLINE( 160)		 ::borogove::Stanza child =  ::borogove::Stanza_obj::__alloc( HX_CTX ,name,attr);
+HXLINE( 161)		this->last_added->addDirectChild(::borogove::Node_obj::Element(child));
+HXLINE( 162)		this->last_added_stack->push(this->last_added);
+HXLINE( 163)		this->last_added = child;
+HXLINE( 164)		return ::hx::ObjectPtr<OBJ_>(this);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Stanza_obj,tag,return )
 
  ::borogove::Stanza Stanza_obj::text(::String content){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_168_text)
-HXLINE( 169)		this->serialized = null();
-HXLINE( 170)		this->last_added->addDirectChild(::borogove::Node_obj::CData(content));
-HXLINE( 171)		return ::hx::ObjectPtr<OBJ_>(this);
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_167_text)
+HXLINE( 168)		this->serialized = null();
+HXLINE( 169)		this->last_added->addDirectChild(::borogove::Node_obj::CData(content));
+HXLINE( 170)		return ::hx::ObjectPtr<OBJ_>(this);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Stanza_obj,text,return )
 
  ::borogove::Stanza Stanza_obj::textTag(::String tagName,::String textContent, ::Dynamic attr){
-            	HX_GC_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_174_textTag)
-HXLINE( 175)		this->serialized = null();
-HXLINE( 176)		 ::borogove::Stanza _hx_tmp = this->last_added;
-HXDLIN( 176)		 ::Dynamic _hx_tmp1;
-HXDLIN( 176)		if (::hx::IsNotNull( attr )) {
-HXLINE( 176)			_hx_tmp1 = attr;
+            	HX_GC_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_173_textTag)
+HXLINE( 174)		this->serialized = null();
+HXLINE( 175)		 ::borogove::Stanza _hx_tmp = this->last_added;
+HXDLIN( 175)		 ::Dynamic _hx_tmp1;
+HXDLIN( 175)		if (::hx::IsNotNull( attr )) {
+HXLINE( 175)			_hx_tmp1 = attr;
             		}
             		else {
-HXLINE( 176)			_hx_tmp1 =  ::Dynamic(::hx::Anon_obj::Create(0));
+HXLINE( 175)			_hx_tmp1 =  ::Dynamic(::hx::Anon_obj::Create(0));
             		}
-HXDLIN( 176)		_hx_tmp->addDirectChild(::borogove::Node_obj::Element( ::borogove::Stanza_obj::__alloc( HX_CTX ,tagName,_hx_tmp1)->text(textContent)));
-HXLINE( 177)		return ::hx::ObjectPtr<OBJ_>(this);
+HXDLIN( 175)		_hx_tmp->addDirectChild(::borogove::Node_obj::Element( ::borogove::Stanza_obj::__alloc( HX_CTX ,tagName,_hx_tmp1)->text(textContent)));
+HXLINE( 176)		return ::hx::ObjectPtr<OBJ_>(this);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC3(Stanza_obj,textTag,return )
 
  ::borogove::Stanza Stanza_obj::up(){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_180_up)
-HXLINE( 181)		if (::hx::IsInstanceNotEq( this->last_added,::hx::ObjectPtr<OBJ_>(this) )) {
-HXLINE( 182)			this->last_added = this->last_added_stack->pop().StaticCast<  ::borogove::Stanza >();
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_179_up)
+HXLINE( 180)		if (::hx::IsInstanceNotEq( this->last_added,::hx::ObjectPtr<OBJ_>(this) )) {
+HXLINE( 181)			this->last_added = this->last_added_stack->pop().StaticCast<  ::borogove::Stanza >();
             		}
-HXLINE( 184)		return ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 183)		return ::hx::ObjectPtr<OBJ_>(this);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Stanza_obj,up,return )
 
  ::borogove::Stanza Stanza_obj::reset(){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_187_reset)
-HXLINE( 188)		this->last_added = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 189)		return ::hx::ObjectPtr<OBJ_>(this);
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_186_reset)
+HXLINE( 187)		this->last_added = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 188)		return ::hx::ObjectPtr<OBJ_>(this);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Stanza_obj,reset,return )
 
  ::borogove::Stanza Stanza_obj::addChildren( ::Dynamic children){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_193_addChildren)
-HXLINE( 194)		this->serialized = null();
-HXLINE( 195)		{
-HXLINE( 195)			 ::Dynamic child = children->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 195)			while(( (bool)(child->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 196)				this->addChild(( ( ::borogove::Stanza)(child->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) ));
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_192_addChildren)
+HXLINE( 193)		this->serialized = null();
+HXLINE( 194)		{
+HXLINE( 194)			 ::Dynamic child = children->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 194)			while(( (bool)(child->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 195)				this->addChild(( ( ::borogove::Stanza)(child->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) ));
             			}
             		}
-HXLINE( 198)		return ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 197)		return ::hx::ObjectPtr<OBJ_>(this);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Stanza_obj,addChildren,return )
 
  ::borogove::Stanza Stanza_obj::addChildNodes( ::Dynamic children){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_202_addChildNodes)
-HXLINE( 203)		this->serialized = null();
-HXLINE( 204)		{
-HXLINE( 204)			 ::Dynamic child = children->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 204)			while(( (bool)(child->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 205)				this->addDirectChild(child->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_201_addChildNodes)
+HXLINE( 202)		this->serialized = null();
+HXLINE( 203)		{
+HXLINE( 203)			 ::Dynamic child = children->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 203)			while(( (bool)(child->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 204)				this->addDirectChild(child->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
             			}
             		}
-HXLINE( 207)		return ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 206)		return ::hx::ObjectPtr<OBJ_>(this);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Stanza_obj,addChildNodes,return )
 
  ::borogove::Stanza Stanza_obj::insertChild(int idx, ::borogove::Stanza stanza){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_210_insertChild)
-HXLINE( 211)		this->serialized = null();
-HXLINE( 212)		this->last_added->children->insert(idx,::borogove::Node_obj::Element(stanza));
-HXLINE( 213)		return ::hx::ObjectPtr<OBJ_>(this);
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_209_insertChild)
+HXLINE( 210)		this->serialized = null();
+HXLINE( 211)		this->last_added->children->insert(idx,::borogove::Node_obj::Element(stanza));
+HXLINE( 212)		return ::hx::ObjectPtr<OBJ_>(this);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Stanza_obj,insertChild,return )
 
  ::borogove::Stanza Stanza_obj::addChild( ::borogove::Stanza stanza){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_216_addChild)
-HXLINE( 217)		this->serialized = null();
-HXLINE( 218)		this->last_added->children->push(::borogove::Node_obj::Element(stanza));
-HXLINE( 219)		return ::hx::ObjectPtr<OBJ_>(this);
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_215_addChild)
+HXLINE( 216)		this->serialized = null();
+HXLINE( 217)		this->last_added->children->push(::borogove::Node_obj::Element(stanza));
+HXLINE( 218)		return ::hx::ObjectPtr<OBJ_>(this);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Stanza_obj,addChild,return )
 
  ::borogove::Stanza Stanza_obj::addDirectChild( ::borogove::Node child){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_222_addDirectChild)
-HXLINE( 223)		this->serialized = null();
-HXLINE( 224)		this->children->push(child);
-HXLINE( 225)		return ::hx::ObjectPtr<OBJ_>(this);
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_221_addDirectChild)
+HXLINE( 222)		this->serialized = null();
+HXLINE( 223)		this->children->push(child);
+HXLINE( 224)		return ::hx::ObjectPtr<OBJ_>(this);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Stanza_obj,addDirectChild,return )
 
  ::borogove::Stanza Stanza_obj::clone(){
-            	HX_GC_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_228_clone)
-HXLINE( 229)		 ::borogove::Stanza clone =  ::borogove::Stanza_obj::__alloc( HX_CTX ,this->name,this->attr);
-HXLINE( 230)		{
-HXLINE( 230)			int _g = 0;
-HXDLIN( 230)			::Array< ::Dynamic> _g1 = this->children;
-HXDLIN( 230)			while((_g < _g1->length)){
-HXLINE( 230)				 ::borogove::Node child = _g1->__get(_g).StaticCast<  ::borogove::Node >();
-HXDLIN( 230)				_g = (_g + 1);
-HXLINE( 231)				 ::borogove::Node _hx_tmp;
-HXDLIN( 231)				switch((int)(child->_hx_getIndex())){
+            	HX_GC_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_227_clone)
+HXLINE( 228)		 ::borogove::Stanza clone =  ::borogove::Stanza_obj::__alloc( HX_CTX ,this->name,this->attr);
+HXLINE( 229)		{
+HXLINE( 229)			int _g = 0;
+HXDLIN( 229)			::Array< ::Dynamic> _g1 = this->children;
+HXDLIN( 229)			while((_g < _g1->length)){
+HXLINE( 229)				 ::borogove::Node child = _g1->__get(_g).StaticCast<  ::borogove::Node >();
+HXDLIN( 229)				_g = (_g + 1);
+HXLINE( 230)				 ::borogove::Node _hx_tmp;
+HXDLIN( 230)				switch((int)(child->_hx_getIndex())){
             					case (int)0: {
-HXLINE( 231)						_hx_tmp = ::borogove::Node_obj::Element(child->_hx_getObject(0).StaticCast<  ::borogove::Stanza >()->clone());
+HXLINE( 230)						_hx_tmp = ::borogove::Node_obj::Element(child->_hx_getObject(0).StaticCast<  ::borogove::Stanza >()->clone());
             					}
             					break;
             					case (int)1: {
-HXLINE( 231)						_hx_tmp = ::borogove::Node_obj::CData(child->_hx_getString(0));
+HXLINE( 230)						_hx_tmp = ::borogove::Node_obj::CData(child->_hx_getString(0));
             					}
             					break;
             				}
-HXDLIN( 231)				clone->addDirectChild(_hx_tmp);
+HXDLIN( 230)				clone->addDirectChild(_hx_tmp);
             			}
             		}
-HXLINE( 236)		clone->serialized = this->serialized;
-HXLINE( 237)		return clone;
+HXLINE( 235)		clone->serialized = this->serialized;
+HXLINE( 236)		return clone;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Stanza_obj,clone,return )
 
 ::Array< ::Dynamic> Stanza_obj::allTags(::String name,::String xmlns){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_240_allTags)
-HXLINE( 241)		::Array< ::Dynamic> _this = this->children;
-HXDLIN( 241)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 241)		{
-HXLINE( 241)			int _g1 = 0;
-HXDLIN( 241)			while((_g1 < _this->length)){
-HXLINE( 241)				 ::borogove::Node v = _this->__get(_g1).StaticCast<  ::borogove::Node >();
-HXDLIN( 241)				_g1 = (_g1 + 1);
-HXLINE( 242)				bool _hx_tmp;
-HXDLIN( 242)				if ((v->_hx_getIndex() == 0)) {
-HXLINE( 242)					_hx_tmp = true;
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_239_allTags)
+HXLINE( 240)		::Array< ::Dynamic> _this = this->children;
+HXDLIN( 240)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 240)		{
+HXLINE( 240)			int _g1 = 0;
+HXDLIN( 240)			while((_g1 < _this->length)){
+HXLINE( 240)				 ::borogove::Node v = _this->__get(_g1).StaticCast<  ::borogove::Node >();
+HXDLIN( 240)				_g1 = (_g1 + 1);
+HXLINE( 241)				bool _hx_tmp;
+HXDLIN( 241)				if ((v->_hx_getIndex() == 0)) {
+HXLINE( 241)					_hx_tmp = true;
             				}
             				else {
-HXLINE( 242)					_hx_tmp = false;
+HXLINE( 241)					_hx_tmp = false;
             				}
-HXLINE( 241)				if (_hx_tmp) {
-HXLINE( 241)					_g->push(v);
+HXLINE( 240)				if (_hx_tmp) {
+HXLINE( 240)					_g->push(v);
             				}
             			}
             		}
-HXDLIN( 241)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_g->length);
-HXDLIN( 241)		{
-HXLINE( 241)			int _g2 = 0;
-HXDLIN( 241)			int _g3 = _g->length;
-HXDLIN( 241)			while((_g2 < _g3)){
-HXLINE( 241)				_g2 = (_g2 + 1);
-HXDLIN( 241)				int i = (_g2 - 1);
-HXDLIN( 241)				{
-HXLINE( 244)					 ::borogove::Node child = _hx_array_unsafe_get(_g,i);
-HXLINE( 241)					 ::borogove::Stanza inValue;
-HXLINE( 244)					if ((child->_hx_getIndex() == 0)) {
-HXLINE( 241)						inValue = child->_hx_getObject(0).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 240)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_g->length);
+HXDLIN( 240)		{
+HXLINE( 240)			int _g2 = 0;
+HXDLIN( 240)			int _g3 = _g->length;
+HXDLIN( 240)			while((_g2 < _g3)){
+HXLINE( 240)				_g2 = (_g2 + 1);
+HXDLIN( 240)				int i = (_g2 - 1);
+HXDLIN( 240)				{
+HXLINE( 243)					 ::borogove::Node child = _hx_array_unsafe_get(_g,i);
+HXLINE( 240)					 ::borogove::Stanza inValue;
+HXLINE( 243)					if ((child->_hx_getIndex() == 0)) {
+HXLINE( 240)						inValue = child->_hx_getObject(0).StaticCast<  ::borogove::Stanza >();
             					}
             					else {
-HXLINE( 241)						inValue = null();
+HXLINE( 240)						inValue = null();
             					}
-HXDLIN( 241)					result->__unsafe_set(i,inValue);
+HXDLIN( 240)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN( 241)		::Array< ::Dynamic> tags = result;
-HXLINE( 249)		bool _hx_tmp1;
-HXDLIN( 249)		if (::hx::IsNull( name )) {
-HXLINE( 249)			_hx_tmp1 = ::hx::IsNotNull( xmlns );
+HXDLIN( 240)		::Array< ::Dynamic> tags = result;
+HXLINE( 248)		bool _hx_tmp1;
+HXDLIN( 248)		if (::hx::IsNull( name )) {
+HXLINE( 248)			_hx_tmp1 = ::hx::IsNotNull( xmlns );
             		}
             		else {
-HXLINE( 249)			_hx_tmp1 = true;
-            		}
-HXDLIN( 249)		if (_hx_tmp1) {
-HXLINE( 250)			::String ourXmlns = ( (::String)(::Reflect_obj::field(this->attr,HX_("xmlns",dc,31,74,60))) );
-HXLINE( 251)			::Array< ::Dynamic> _g4 = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 251)			{
-HXLINE( 251)				int _g5 = 0;
-HXDLIN( 251)				::Array< ::Dynamic> _g6 = result;
-HXDLIN( 251)				while((_g5 < _g6->length)){
-HXLINE( 251)					 ::borogove::Stanza v1 = _g6->__get(_g5).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 251)					_g5 = (_g5 + 1);
-HXLINE( 252)					::String childXmlns = ( (::String)(::Reflect_obj::field(v1->attr,HX_("xmlns",dc,31,74,60))) );
-HXLINE( 251)					bool tags1;
-HXLINE( 253)					bool tags2;
-HXDLIN( 253)					if (::hx::IsNotNull( name )) {
-HXLINE( 253)						tags2 = (v1->name == name);
+HXLINE( 248)			_hx_tmp1 = true;
+            		}
+HXDLIN( 248)		if (_hx_tmp1) {
+HXLINE( 249)			::String ourXmlns = ( (::String)(::Reflect_obj::field(this->attr,HX_("xmlns",dc,31,74,60))) );
+HXLINE( 250)			::Array< ::Dynamic> _g4 = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 250)			{
+HXLINE( 250)				int _g5 = 0;
+HXDLIN( 250)				::Array< ::Dynamic> _g6 = result;
+HXDLIN( 250)				while((_g5 < _g6->length)){
+HXLINE( 250)					 ::borogove::Stanza v1 = _g6->__get(_g5).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 250)					_g5 = (_g5 + 1);
+HXLINE( 251)					::String childXmlns = ( (::String)(::Reflect_obj::field(v1->attr,HX_("xmlns",dc,31,74,60))) );
+HXLINE( 250)					bool tags1;
+HXLINE( 252)					bool tags2;
+HXDLIN( 252)					if (::hx::IsNotNull( name )) {
+HXLINE( 252)						tags2 = (v1->name == name);
             					}
             					else {
-HXLINE( 253)						tags2 = true;
+HXLINE( 252)						tags2 = true;
             					}
-HXDLIN( 253)					if (tags2) {
-HXLINE( 254)						bool tags3;
-HXDLIN( 254)						if (::hx::IsNull( xmlns )) {
-HXLINE( 254)							if ((ourXmlns != childXmlns)) {
-HXLINE( 254)								tags3 = ::hx::IsNull( childXmlns );
+HXDLIN( 252)					if (tags2) {
+HXLINE( 253)						bool tags3;
+HXDLIN( 253)						if (::hx::IsNull( xmlns )) {
+HXLINE( 253)							if ((ourXmlns != childXmlns)) {
+HXLINE( 253)								tags3 = ::hx::IsNull( childXmlns );
             							}
             							else {
-HXLINE( 254)								tags3 = true;
+HXLINE( 253)								tags3 = true;
             							}
             						}
             						else {
-HXLINE( 254)							tags3 = false;
+HXLINE( 253)							tags3 = false;
             						}
-HXDLIN( 254)						if (!(tags3)) {
-HXLINE( 251)							tags1 = (childXmlns == xmlns);
+HXDLIN( 253)						if (!(tags3)) {
+HXLINE( 250)							tags1 = (childXmlns == xmlns);
             						}
             						else {
-HXLINE( 251)							tags1 = true;
+HXLINE( 250)							tags1 = true;
             						}
             					}
             					else {
-HXLINE( 251)						tags1 = false;
+HXLINE( 250)						tags1 = false;
             					}
-HXDLIN( 251)					if (tags1) {
-HXLINE( 251)						_g4->push(v1);
+HXDLIN( 250)					if (tags1) {
+HXLINE( 250)						_g4->push(v1);
             					}
             				}
             			}
-HXDLIN( 251)			tags = _g4;
+HXDLIN( 250)			tags = _g4;
             		}
-HXLINE( 258)		return tags;
+HXLINE( 257)		return tags;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Stanza_obj,allTags,return )
 
 ::Array< ::String > Stanza_obj::allText(){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_262_allText)
-HXDLIN( 262)		::Array< ::Dynamic> _this = this->children;
-HXDLIN( 262)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 262)		{
-HXDLIN( 262)			int _g1 = 0;
-HXDLIN( 262)			while((_g1 < _this->length)){
-HXDLIN( 262)				 ::borogove::Node v = _this->__get(_g1).StaticCast<  ::borogove::Node >();
-HXDLIN( 262)				_g1 = (_g1 + 1);
-HXLINE( 263)				bool _hx_tmp;
-HXDLIN( 263)				if ((v->_hx_getIndex() == 1)) {
-HXLINE( 263)					_hx_tmp = true;
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_261_allText)
+HXDLIN( 261)		::Array< ::Dynamic> _this = this->children;
+HXDLIN( 261)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 261)		{
+HXDLIN( 261)			int _g1 = 0;
+HXDLIN( 261)			while((_g1 < _this->length)){
+HXDLIN( 261)				 ::borogove::Node v = _this->__get(_g1).StaticCast<  ::borogove::Node >();
+HXDLIN( 261)				_g1 = (_g1 + 1);
+HXLINE( 262)				bool _hx_tmp;
+HXDLIN( 262)				if ((v->_hx_getIndex() == 1)) {
+HXLINE( 262)					_hx_tmp = true;
             				}
             				else {
-HXLINE( 263)					_hx_tmp = false;
+HXLINE( 262)					_hx_tmp = false;
             				}
-HXLINE( 262)				if (_hx_tmp) {
-HXDLIN( 262)					_g->push(v);
+HXLINE( 261)				if (_hx_tmp) {
+HXDLIN( 261)					_g->push(v);
             				}
             			}
             		}
-HXDLIN( 262)		::Array< ::String > result = ::Array_obj< ::String >::__new(_g->length);
-HXDLIN( 262)		{
-HXDLIN( 262)			int _g2 = 0;
-HXDLIN( 262)			int _g3 = _g->length;
-HXDLIN( 262)			while((_g2 < _g3)){
-HXDLIN( 262)				_g2 = (_g2 + 1);
-HXDLIN( 262)				int i = (_g2 - 1);
-HXDLIN( 262)				{
-HXLINE( 265)					 ::borogove::Node child = _hx_array_unsafe_get(_g,i);
-HXLINE( 262)					::String inValue;
-HXLINE( 265)					if ((child->_hx_getIndex() == 1)) {
-HXDLIN( 262)						inValue = child->_hx_getString(0);
+HXDLIN( 261)		::Array< ::String > result = ::Array_obj< ::String >::__new(_g->length);
+HXDLIN( 261)		{
+HXDLIN( 261)			int _g2 = 0;
+HXDLIN( 261)			int _g3 = _g->length;
+HXDLIN( 261)			while((_g2 < _g3)){
+HXDLIN( 261)				_g2 = (_g2 + 1);
+HXDLIN( 261)				int i = (_g2 - 1);
+HXDLIN( 261)				{
+HXLINE( 264)					 ::borogove::Node child = _hx_array_unsafe_get(_g,i);
+HXLINE( 261)					::String inValue;
+HXLINE( 264)					if ((child->_hx_getIndex() == 1)) {
+HXDLIN( 261)						inValue = child->_hx_getString(0);
             					}
             					else {
-HXDLIN( 262)						inValue = null();
+HXDLIN( 261)						inValue = null();
             					}
-HXDLIN( 262)					result->__unsafe_set(i,inValue);
+HXDLIN( 261)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN( 262)		return result;
+HXDLIN( 261)		return result;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Stanza_obj,allText,return )
 
  ::borogove::Stanza Stanza_obj::getFirstChild(){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_273_getFirstChild)
-HXDLIN( 273)		return this->allTags(null(),null())->__get(0).StaticCast<  ::borogove::Stanza >();
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_272_getFirstChild)
+HXDLIN( 272)		return this->allTags(null(),null())->__get(0).StaticCast<  ::borogove::Stanza >();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Stanza_obj,getFirstChild,return )
 
 ::String Stanza_obj::getErrorText(){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_276_getErrorText)
-HXLINE( 277)		if ((( (::String)(::Reflect_obj::field(this->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
-HXLINE( 278)			 ::borogove::StanzaError error = this->getError();
-HXLINE( 279)			::String tmp;
-HXDLIN( 279)			if (::hx::IsNotNull( error )) {
-HXLINE( 279)				tmp = error->text;
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_275_getErrorText)
+HXLINE( 276)		if ((( (::String)(::Reflect_obj::field(this->attr,HX_("type",ba,f2,08,4d))) ) == HX_("error",c8,cb,29,73))) {
+HXLINE( 277)			 ::borogove::StanzaError error = this->getError();
+HXLINE( 278)			::String tmp;
+HXDLIN( 278)			if (::hx::IsNotNull( error )) {
+HXLINE( 278)				tmp = error->text;
             			}
             			else {
-HXLINE( 279)				tmp = null();
+HXLINE( 278)				tmp = null();
             			}
-HXDLIN( 279)			::String tmp1;
-HXDLIN( 279)			if (::hx::IsNotNull( tmp )) {
-HXLINE( 279)				tmp1 = tmp;
+HXDLIN( 278)			::String tmp1;
+HXDLIN( 278)			if (::hx::IsNotNull( tmp )) {
+HXLINE( 278)				tmp1 = tmp;
             			}
             			else {
-HXLINE( 279)				if (::hx::IsNotNull( error )) {
-HXLINE( 279)					tmp1 = error->condition;
+HXLINE( 278)				if (::hx::IsNotNull( error )) {
+HXLINE( 278)					tmp1 = error->condition;
             				}
             				else {
-HXLINE( 279)					tmp1 = null();
+HXLINE( 278)					tmp1 = null();
             				}
             			}
-HXDLIN( 279)			::String tmp2;
-HXDLIN( 279)			if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 279)				tmp2 = tmp1;
+HXDLIN( 278)			::String tmp2;
+HXDLIN( 278)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 278)				tmp2 = tmp1;
             			}
             			else {
-HXLINE( 279)				if (::hx::IsNotNull( error )) {
-HXLINE( 279)					tmp2 = error->type;
+HXLINE( 278)				if (::hx::IsNotNull( error )) {
+HXLINE( 278)					tmp2 = error->type;
             				}
             				else {
-HXLINE( 279)					tmp2 = null();
+HXLINE( 278)					tmp2 = null();
             				}
             			}
-HXDLIN( 279)			if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 279)				return tmp2;
+HXDLIN( 278)			if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 278)				return tmp2;
             			}
             			else {
-HXLINE( 279)				return HX_("error",c8,cb,29,73);
+HXLINE( 278)				return HX_("error",c8,cb,29,73);
             			}
             		}
-HXLINE( 282)		return null();
+HXLINE( 281)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Stanza_obj,getErrorText,return )
 
  ::borogove::Stanza Stanza_obj::getChild(::String name,::String xmlns){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_285_getChild)
-HXLINE( 286)		::Reflect_obj::field(this->attr,HX_("xmlns",dc,31,74,60));
-HXLINE( 295)		::Array< ::Dynamic> tags = this->allTags(name,xmlns);
-HXLINE( 296)		if ((tags->length == 0)) {
-HXLINE( 297)			return null();
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_284_getChild)
+HXLINE( 285)		::Reflect_obj::field(this->attr,HX_("xmlns",dc,31,74,60));
+HXLINE( 294)		::Array< ::Dynamic> tags = this->allTags(name,xmlns);
+HXLINE( 295)		if ((tags->length == 0)) {
+HXLINE( 296)			return null();
             		}
-HXLINE( 299)		return tags->__get(0).StaticCast<  ::borogove::Stanza >();
+HXLINE( 298)		return tags->__get(0).StaticCast<  ::borogove::Stanza >();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Stanza_obj,getChild,return )
 
 ::String Stanza_obj::getChildText(::String name,::String xmlns){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_302_getChildText)
-HXLINE( 303)		 ::borogove::Stanza child = this->getChild(name,xmlns);
-HXLINE( 304)		if (::hx::IsNull( child )) {
-HXLINE( 305)			return null();
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_301_getChildText)
+HXLINE( 302)		 ::borogove::Stanza child = this->getChild(name,xmlns);
+HXLINE( 303)		if (::hx::IsNull( child )) {
+HXLINE( 304)			return null();
             		}
-HXLINE( 307)		return child->getText();
+HXLINE( 306)		return child->getText();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Stanza_obj,getChildText,return )
 
 bool Stanza_obj::hasChild(::String name,::String xmlns){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_311_hasChild)
-HXDLIN( 311)		return ::hx::IsNotNull( this->getChild(name,xmlns) );
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_310_hasChild)
+HXDLIN( 310)		return ::hx::IsNotNull( this->getChild(name,xmlns) );
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Stanza_obj,hasChild,return )
 
 ::String Stanza_obj::getText(){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_315_getText)
-HXDLIN( 315)		return this->allText()->join(HX_("",00,00,00,00));
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_314_getText)
+HXDLIN( 314)		return this->allText()->join(HX_("",00,00,00,00));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Stanza_obj,getText,return )
 
  ::borogove::Node Stanza_obj::find(::String path){
-            	HX_GC_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_318_find)
-HXLINE( 319)		int pos = 0;
-HXLINE( 320)		int len = path.length;
-HXLINE( 321)		 ::borogove::Stanza cursor = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 323)		do {
-HXLINE( 324)			::String xmlns = null();
-HXLINE( 325)			::String _hx_char = path.charAt(pos);
-HXLINE( 326)			if ((_hx_char == HX_("@",40,00,00,00))) {
-HXLINE( 327)				 ::Dynamic this1 = cursor->attr;
-HXDLIN( 327)				return ::borogove::Node_obj::CData(( (::String)(::Reflect_obj::field(this1,path.substr((pos + 1),null()))) ));
+            	HX_GC_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_317_find)
+HXLINE( 318)		int pos = 0;
+HXLINE( 319)		int len = path.length;
+HXLINE( 320)		 ::borogove::Stanza cursor = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 322)		do {
+HXLINE( 323)			::String xmlns = null();
+HXLINE( 324)			::String _hx_char = path.charAt(pos);
+HXLINE( 325)			if ((_hx_char == HX_("@",40,00,00,00))) {
+HXLINE( 326)				 ::Dynamic this1 = cursor->attr;
+HXDLIN( 326)				return ::borogove::Node_obj::CData(( (::String)(::Reflect_obj::field(this1,path.substr((pos + 1),null()))) ));
             			}
             			else {
-HXLINE( 328)				if ((_hx_char == HX_("{",7b,00,00,00))) {
-HXLINE( 329)					xmlns = path.substring((pos + 1),path.indexOf(HX_("}",7d,00,00,00),(pos + 1)));
-HXLINE( 330)					pos = (pos + (xmlns.length + 2));
+HXLINE( 327)				if ((_hx_char == HX_("{",7b,00,00,00))) {
+HXLINE( 328)					xmlns = path.substring((pos + 1),path.indexOf(HX_("}",7d,00,00,00),(pos + 1)));
+HXLINE( 329)					pos = (pos + (xmlns.length + 2));
             				}
             			}
-HXLINE( 332)			 ::EReg reName =  ::EReg_obj::__alloc( HX_CTX ,HX_("([^@/#]*)([/#]?)",cd,f2,19,5a),HX_("",00,00,00,00));
-HXLINE( 333)			if (!(reName->matchSub(path,pos,null()))) {
-HXLINE( 334)				HX_STACK_DO_THROW( ::haxe::Exception_obj::__alloc( HX_CTX ,(HX_("Invalid path to Stanza.find(): ",c6,3a,06,10) + path),null(),null()));
+HXLINE( 331)			 ::EReg reName =  ::EReg_obj::__alloc( HX_CTX ,HX_("([^@/#]*)([/#]?)",cd,f2,19,5a),HX_("",00,00,00,00));
+HXLINE( 332)			if (!(reName->matchSub(path,pos,null()))) {
+HXLINE( 333)				HX_STACK_DO_THROW( ::haxe::Exception_obj::__alloc( HX_CTX ,(HX_("Invalid path to Stanza.find(): ",c6,3a,06,10) + path),null(),null()));
             			}
-HXLINE( 336)			::String name = reName->matched(1);
-HXDLIN( 336)			::String text = reName->matched(2);
-HXLINE( 337)			int pos1 = ( (int)(reName->matchedPos()->__Field(HX_("pos",94,5d,55,00),::hx::paccDynamic)) );
-HXDLIN( 337)			pos = ( (int)((pos1 + reName->matchedPos()->__Field(HX_("len",d5,4b,52,00),::hx::paccDynamic))) );
-HXLINE( 338)			if ((name == HX_("",00,00,00,00))) {
-HXLINE( 339)				name = null();
+HXLINE( 335)			::String name = reName->matched(1);
+HXDLIN( 335)			::String text = reName->matched(2);
+HXLINE( 336)			int pos1 = ( (int)(reName->matchedPos()->__Field(HX_("pos",94,5d,55,00),::hx::paccDynamic)) );
+HXDLIN( 336)			pos = ( (int)((pos1 + reName->matchedPos()->__Field(HX_("len",d5,4b,52,00),::hx::paccDynamic))) );
+HXLINE( 337)			if ((name == HX_("",00,00,00,00))) {
+HXLINE( 338)				name = null();
             			}
-HXLINE( 341)			if ((pos == len)) {
-HXLINE( 342)				if ((text == HX_("#",23,00,00,00))) {
-HXLINE( 343)					::String text1 = cursor->getChildText(name,xmlns);
-HXLINE( 344)					if (::hx::IsNull( text1 )) {
-HXLINE( 345)						return null();
+HXLINE( 340)			if ((pos == len)) {
+HXLINE( 341)				if ((text == HX_("#",23,00,00,00))) {
+HXLINE( 342)					::String text1 = cursor->getChildText(name,xmlns);
+HXLINE( 343)					if (::hx::IsNull( text1 )) {
+HXLINE( 344)						return null();
             					}
-HXLINE( 347)					return ::borogove::Node_obj::CData(text1);
+HXLINE( 346)					return ::borogove::Node_obj::CData(text1);
             				}
-HXLINE( 349)				return ::borogove::Node_obj::Element(cursor->getChild(name,xmlns));
+HXLINE( 348)				return ::borogove::Node_obj::Element(cursor->getChild(name,xmlns));
             			}
-HXLINE( 351)			cursor = cursor->getChild(name,xmlns);
+HXLINE( 350)			cursor = cursor->getChild(name,xmlns);
             		} while(::hx::IsNotNull( cursor ));
 ;
-HXLINE( 353)		return null();
+HXLINE( 352)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Stanza_obj,find,return )
 
  ::borogove::Stanza Stanza_obj::findChild(::String path){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_356_findChild)
-HXLINE( 357)		 ::borogove::Node result = this->find(path);
-HXLINE( 358)		if (::hx::IsNull( result )) {
-HXLINE( 359)			return null();
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_355_findChild)
+HXLINE( 356)		 ::borogove::Node result = this->find(path);
+HXLINE( 357)		if (::hx::IsNull( result )) {
+HXLINE( 358)			return null();
             		}
-HXLINE( 361)		if (::hx::IsNull( result )) {
-HXLINE( 363)			return null();
+HXLINE( 360)		if (::hx::IsNull( result )) {
+HXLINE( 362)			return null();
             		}
             		else {
-HXLINE( 361)			if ((result->_hx_getIndex() == 0)) {
-HXLINE( 362)				return result->_hx_getObject(0).StaticCast<  ::borogove::Stanza >();
+HXLINE( 360)			if ((result->_hx_getIndex() == 0)) {
+HXLINE( 361)				return result->_hx_getObject(0).StaticCast<  ::borogove::Stanza >();
             			}
             			else {
-HXLINE( 363)				return null();
+HXLINE( 362)				return null();
             			}
             		}
-HXLINE( 361)		return null();
+HXLINE( 360)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Stanza_obj,findChild,return )
 
 ::String Stanza_obj::findText(::String path){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_367_findText)
-HXLINE( 368)		 ::borogove::Node result = this->find(path);
-HXLINE( 369)		if (::hx::IsNull( result )) {
-HXLINE( 370)			return null();
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_366_findText)
+HXLINE( 367)		 ::borogove::Node result = this->find(path);
+HXLINE( 368)		if (::hx::IsNull( result )) {
+HXLINE( 369)			return null();
             		}
-HXLINE( 372)		if (::hx::IsNull( result )) {
-HXLINE( 374)			return null();
+HXLINE( 371)		if (::hx::IsNull( result )) {
+HXLINE( 373)			return null();
             		}
             		else {
-HXLINE( 372)			if ((result->_hx_getIndex() == 1)) {
-HXLINE( 373)				return result->_hx_getString(0);
+HXLINE( 371)			if ((result->_hx_getIndex() == 1)) {
+HXLINE( 372)				return result->_hx_getString(0);
             			}
             			else {
-HXLINE( 374)				return null();
+HXLINE( 373)				return null();
             			}
             		}
-HXLINE( 372)		return null();
+HXLINE( 371)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Stanza_obj,findText,return )
 
  ::borogove::Stanza Stanza_obj::traverse( ::Dynamic f){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_378_traverse)
-HXLINE( 379)		if (!(( (bool)(f(::hx::ObjectPtr<OBJ_>(this))) ))) {
-HXLINE( 380)			int _g = 0;
-HXDLIN( 380)			::Array< ::Dynamic> _g1 = this->allTags(null(),null());
-HXDLIN( 380)			while((_g < _g1->length)){
-HXLINE( 380)				 ::borogove::Stanza child = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 380)				_g = (_g + 1);
-HXLINE( 381)				child->traverse(f);
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_377_traverse)
+HXLINE( 378)		if (!(( (bool)(f(::hx::ObjectPtr<OBJ_>(this))) ))) {
+HXLINE( 379)			int _g = 0;
+HXDLIN( 379)			::Array< ::Dynamic> _g1 = this->allTags(null(),null());
+HXDLIN( 379)			while((_g < _g1->length)){
+HXLINE( 379)				 ::borogove::Stanza child = _g1->__get(_g).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 379)				_g = (_g + 1);
+HXLINE( 380)				child->traverse(f);
             			}
             		}
-HXLINE( 384)		return ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 383)		return ::hx::ObjectPtr<OBJ_>(this);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Stanza_obj,traverse,return )
 
+ ::Dynamic Stanza_obj::reduce( ::Dynamic stanza, ::Dynamic text){
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_387_reduce)
+HXDLIN( 387)		::Array< ::Dynamic> _this = this->children;
+HXDLIN( 387)		::cpp::VirtualArray result = ::cpp::VirtualArray_obj::__new(_this->length);
+HXDLIN( 387)		{
+HXDLIN( 387)			int _g = 0;
+HXDLIN( 387)			int _g1 = _this->length;
+HXDLIN( 387)			while((_g < _g1)){
+HXDLIN( 387)				_g = (_g + 1);
+HXDLIN( 387)				int i = (_g - 1);
+HXDLIN( 387)				{
+HXDLIN( 387)					 ::borogove::Node c = _hx_array_unsafe_get(_this,i);
+HXDLIN( 387)					 ::Dynamic inValue;
+HXDLIN( 387)					switch((int)(c->_hx_getIndex())){
+            						case (int)0: {
+HXDLIN( 387)							inValue = c->_hx_getObject(0).StaticCast<  ::borogove::Stanza >()->reduce(stanza,text);
+            						}
+            						break;
+            						case (int)1: {
+HXDLIN( 387)							inValue = text(c->_hx_getString(0));
+            						}
+            						break;
+            					}
+HXDLIN( 387)					result->__unsafe_set(i,inValue);
+            				}
+            			}
+            		}
+HXDLIN( 387)		return stanza(::hx::ObjectPtr<OBJ_>(this),result);
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(Stanza_obj,reduce,return )
+
  ::borogove::StanzaError Stanza_obj::getError(){
-            	HX_GC_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_387_getError)
-HXLINE( 388)		 ::borogove::Stanza errorTag = this->getChild(HX_("error",c8,cb,29,73),null());
-HXLINE( 389)		if (::hx::IsNull( errorTag )) {
-HXLINE( 390)			return null();
+            	HX_GC_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_393_getError)
+HXLINE( 394)		 ::borogove::Stanza errorTag = this->getChild(HX_("error",c8,cb,29,73),null());
+HXLINE( 395)		if (::hx::IsNull( errorTag )) {
+HXLINE( 396)			return null();
             		}
-HXLINE( 393)		::String _hx_tmp = ( (::String)(::Reflect_obj::field(errorTag->attr,HX_("type",ba,f2,08,4d))) );
-HXLINE( 394)		 ::borogove::Stanza tmp = errorTag->getChild(null(),HX_("urn:ietf:params:xml:ns:xmpp-stanzas",27,f2,3d,30));
-HXDLIN( 394)		::String _hx_tmp1;
-HXDLIN( 394)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 394)			_hx_tmp1 = tmp->name;
+HXLINE( 399)		::String _hx_tmp = ( (::String)(::Reflect_obj::field(errorTag->attr,HX_("type",ba,f2,08,4d))) );
+HXLINE( 400)		 ::borogove::Stanza tmp = errorTag->getChild(null(),HX_("urn:ietf:params:xml:ns:xmpp-stanzas",27,f2,3d,30));
+HXDLIN( 400)		::String _hx_tmp1;
+HXDLIN( 400)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 400)			_hx_tmp1 = tmp->name;
             		}
             		else {
-HXLINE( 394)			_hx_tmp1 = null();
+HXLINE( 400)			_hx_tmp1 = null();
             		}
-HXLINE( 392)		return  ::borogove::StanzaError_obj::__alloc( HX_CTX ,_hx_tmp,_hx_tmp1,errorTag->getChildText(HX_("text",ad,cc,f9,4c),HX_("urn:ietf:params:xml:ns:xmpp-stanzas",27,f2,3d,30)));
+HXLINE( 398)		return  ::borogove::StanzaError_obj::__alloc( HX_CTX ,_hx_tmp,_hx_tmp1,errorTag->getChildText(HX_("text",ad,cc,f9,4c),HX_("urn:ietf:params:xml:ns:xmpp-stanzas",27,f2,3d,30)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Stanza_obj,getError,return )
 
 void Stanza_obj::removeChild( ::borogove::Stanza remove){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_400_removeChild)
-HXDLIN( 400)		::Array< ::Dynamic> _this = this->children;
-HXDLIN( 400)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 400)		{
-HXDLIN( 400)			int _g1 = 0;
-HXDLIN( 400)			while((_g1 < _this->length)){
-HXDLIN( 400)				 ::borogove::Node v = _this->__get(_g1).StaticCast<  ::borogove::Node >();
-HXDLIN( 400)				_g1 = (_g1 + 1);
-HXLINE( 401)				bool _hx_tmp;
-HXDLIN( 401)				if ((v->_hx_getIndex() == 0)) {
-HXLINE( 401)					_hx_tmp = ::hx::IsInstanceNotEq( remove,v->_hx_getObject(0).StaticCast<  ::borogove::Stanza >() );
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_406_removeChild)
+HXDLIN( 406)		::Array< ::Dynamic> _this = this->children;
+HXDLIN( 406)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 406)		{
+HXDLIN( 406)			int _g1 = 0;
+HXDLIN( 406)			while((_g1 < _this->length)){
+HXDLIN( 406)				 ::borogove::Node v = _this->__get(_g1).StaticCast<  ::borogove::Node >();
+HXDLIN( 406)				_g1 = (_g1 + 1);
+HXLINE( 407)				bool _hx_tmp;
+HXDLIN( 407)				if ((v->_hx_getIndex() == 0)) {
+HXLINE( 407)					_hx_tmp = ::hx::IsInstanceNotEq( remove,v->_hx_getObject(0).StaticCast<  ::borogove::Stanza >() );
             				}
             				else {
-HXLINE( 401)					_hx_tmp = true;
+HXLINE( 407)					_hx_tmp = true;
             				}
-HXLINE( 400)				if (_hx_tmp) {
-HXDLIN( 400)					_g->push(v);
+HXLINE( 406)				if (_hx_tmp) {
+HXDLIN( 406)					_g->push(v);
             				}
             			}
             		}
-HXDLIN( 400)		this->children = _g;
+HXDLIN( 406)		this->children = _g;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Stanza_obj,removeChild,(void))
 
 void Stanza_obj::removeChildren(::String name,::String xmlns_){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_410_removeChildren)
-HXLINE( 411)		this->serialized = null();
-HXLINE( 413)		bool _hx_tmp;
-HXDLIN( 413)		if (::hx::IsNull( name )) {
-HXLINE( 413)			_hx_tmp = ::hx::IsNull( xmlns_ );
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_416_removeChildren)
+HXLINE( 417)		this->serialized = null();
+HXLINE( 419)		bool _hx_tmp;
+HXDLIN( 419)		if (::hx::IsNull( name )) {
+HXLINE( 419)			_hx_tmp = ::hx::IsNull( xmlns_ );
             		}
             		else {
-HXLINE( 413)			_hx_tmp = false;
+HXLINE( 419)			_hx_tmp = false;
             		}
-HXDLIN( 413)		if (_hx_tmp) {
-HXLINE( 414)			this->children = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 415)			return;
+HXDLIN( 419)		if (_hx_tmp) {
+HXLINE( 420)			this->children = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 421)			return;
             		}
-HXLINE( 418)		::String xmlns;
-HXDLIN( 418)		if (::hx::IsNotNull( xmlns_ )) {
-HXLINE( 418)			xmlns = xmlns_;
+HXLINE( 424)		::String xmlns;
+HXDLIN( 424)		if (::hx::IsNotNull( xmlns_ )) {
+HXLINE( 424)			xmlns = xmlns_;
             		}
             		else {
-HXLINE( 418)			xmlns = ( (::String)(::Reflect_obj::field(this->attr,HX_("xmlns",dc,31,74,60))) );
-            		}
-HXLINE( 419)		::Array< ::Dynamic> _this = this->children;
-HXDLIN( 419)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 419)		{
-HXLINE( 419)			int _g1 = 0;
-HXDLIN( 419)			while((_g1 < _this->length)){
-HXLINE( 419)				 ::borogove::Node v = _this->__get(_g1).StaticCast<  ::borogove::Node >();
-HXDLIN( 419)				_g1 = (_g1 + 1);
-HXLINE( 420)				bool _hx_tmp1;
-HXDLIN( 420)				if ((v->_hx_getIndex() == 0)) {
-HXLINE( 421)					 ::borogove::Stanza _g2 = v->_hx_getObject(0).StaticCast<  ::borogove::Stanza >();
-HXLINE( 422)					bool _hx_tmp2;
-HXDLIN( 422)					bool _hx_tmp3;
-HXDLIN( 422)					if (::hx::IsNotNull( name )) {
-HXLINE( 422)						_hx_tmp3 = (_g2->name == name);
+HXLINE( 424)			xmlns = ( (::String)(::Reflect_obj::field(this->attr,HX_("xmlns",dc,31,74,60))) );
+            		}
+HXLINE( 425)		::Array< ::Dynamic> _this = this->children;
+HXDLIN( 425)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 425)		{
+HXLINE( 425)			int _g1 = 0;
+HXDLIN( 425)			while((_g1 < _this->length)){
+HXLINE( 425)				 ::borogove::Node v = _this->__get(_g1).StaticCast<  ::borogove::Node >();
+HXDLIN( 425)				_g1 = (_g1 + 1);
+HXLINE( 426)				bool _hx_tmp1;
+HXDLIN( 426)				if ((v->_hx_getIndex() == 0)) {
+HXLINE( 427)					 ::borogove::Stanza _g2 = v->_hx_getObject(0).StaticCast<  ::borogove::Stanza >();
+HXLINE( 428)					bool _hx_tmp2;
+HXDLIN( 428)					bool _hx_tmp3;
+HXDLIN( 428)					if (::hx::IsNotNull( name )) {
+HXLINE( 428)						_hx_tmp3 = (_g2->name == name);
             					}
             					else {
-HXLINE( 422)						_hx_tmp3 = true;
+HXLINE( 428)						_hx_tmp3 = true;
             					}
-HXDLIN( 422)					if (_hx_tmp3) {
-HXLINE( 422)						::String tmp = ( (::String)(::Reflect_obj::field(_g2->attr,HX_("xmlns",dc,31,74,60))) );
-HXDLIN( 422)						::String _hx_tmp4;
-HXDLIN( 422)						if (::hx::IsNotNull( tmp )) {
-HXLINE( 422)							_hx_tmp4 = tmp;
+HXDLIN( 428)					if (_hx_tmp3) {
+HXLINE( 428)						::String tmp = ( (::String)(::Reflect_obj::field(_g2->attr,HX_("xmlns",dc,31,74,60))) );
+HXDLIN( 428)						::String _hx_tmp4;
+HXDLIN( 428)						if (::hx::IsNotNull( tmp )) {
+HXLINE( 428)							_hx_tmp4 = tmp;
             						}
             						else {
-HXLINE( 422)							_hx_tmp4 = xmlns;
+HXLINE( 428)							_hx_tmp4 = xmlns;
             						}
-HXDLIN( 422)						_hx_tmp2 = (_hx_tmp4 == xmlns);
+HXDLIN( 428)						_hx_tmp2 = (_hx_tmp4 == xmlns);
             					}
             					else {
-HXLINE( 422)						_hx_tmp2 = false;
+HXLINE( 428)						_hx_tmp2 = false;
             					}
-HXLINE( 420)					_hx_tmp1 = !(_hx_tmp2);
+HXLINE( 426)					_hx_tmp1 = !(_hx_tmp2);
             				}
             				else {
-HXLINE( 420)					_hx_tmp1 = true;
+HXLINE( 426)					_hx_tmp1 = true;
             				}
-HXLINE( 419)				if (_hx_tmp1) {
-HXLINE( 419)					_g->push(v);
+HXLINE( 425)				if (_hx_tmp1) {
+HXLINE( 425)					_g->push(v);
             				}
             			}
             		}
-HXDLIN( 419)		this->children = _g;
+HXDLIN( 425)		this->children = _g;
             	}
 
 
@@ -747,14 +781,14 @@ HXLINE( 130)		return stanza;
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Stanza_obj,parse,return )
 
 bool Stanza_obj::parseXmlBool(::String x){
-            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_430_parseXmlBool)
-HXDLIN( 430)		if ((x != HX_("true",4e,a7,03,4d))) {
-HXDLIN( 430)			return (x == HX_("1",31,00,00,00));
+            	HX_STACKFRAME(&_hx_pos_f25e9a34e2b06c56_436_parseXmlBool)
+HXDLIN( 436)		if ((x != HX_("true",4e,a7,03,4d))) {
+HXDLIN( 436)			return (x == HX_("1",31,00,00,00));
             		}
             		else {
-HXDLIN( 430)			return true;
+HXDLIN( 436)			return true;
             		}
-HXDLIN( 430)		return false;
+HXDLIN( 436)		return false;
             	}
 
 
@@ -819,6 +853,9 @@ void Stanza_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"reset") ) { return ::hx::Val( reset_dyn() ); }
 		if (HX_FIELD_EQ(inName,"clone") ) { return ::hx::Val( clone_dyn() ); }
 		break;
+	case 6:
+		if (HX_FIELD_EQ(inName,"reduce") ) { return ::hx::Val( reduce_dyn() ); }
+		break;
 	case 7:
 		if (HX_FIELD_EQ(inName,"textTag") ) { return ::hx::Val( textTag_dyn() ); }
 		if (HX_FIELD_EQ(inName,"allTags") ) { return ::hx::Val( allTags_dyn() ); }
@@ -954,6 +991,7 @@ static ::String Stanza_obj_sMemberFields[] = {
 	HX_("findChild",a3,da,b0,34),
 	HX_("findText",86,d9,8d,9f),
 	HX_("traverse",b2,7d,6a,6c),
+	HX_("reduce",a6,2d,9a,fe),
 	HX_("getError",52,db,00,d3),
 	HX_("removeChild",b8,86,ed,43),
 	HX_("removeChildren",a3,55,c0,3a),
diff --git a/Sources/c_borogove/src/borogove/Status.cpp b/Sources/c_borogove/src/borogove/Status.cpp
new file mode 100644
index 0000000..30d9c66
--- /dev/null
+++ b/Sources/c_borogove/src/borogove/Status.cpp
@@ -0,0 +1,227 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_borogove_Stanza
+#include <borogove/Stanza.h>
+#endif
+#ifndef INCLUDED_borogove_Status
+#include <borogove/Status.h>
+#endif
+
+HX_DEFINE_STACK_FRAME(_hx_pos_1e3dc2b0d4179260_20_new,"borogove.Status","new",0xbf588571,"borogove.Status.new","borogove/Status.hx",20,0x40932afe)
+HX_LOCAL_STACK_FRAME(_hx_pos_c82280c5737a8ee0_478_emoji__fromC,"borogove.Status","emoji__fromC",0x1a453e82,"borogove.Status.emoji__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_c82280c5737a8ee0_478_text__fromC,"borogove.Status","text__fromC",0x9364f17d,"borogove.Status.text__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_1e3dc2b0d4179260_29_toString,"borogove.Status","toString",0xef4b1dfb,"borogove.Status.toString","borogove/Status.hx",29,0x40932afe)
+HX_LOCAL_STACK_FRAME(_hx_pos_1e3dc2b0d4179260_33_toStanza,"borogove.Status","toStanza",0xe412531f,"borogove.Status.toStanza","borogove/Status.hx",33,0x40932afe)
+HX_LOCAL_STACK_FRAME(_hx_pos_1e3dc2b0d4179260_13_boot,"borogove.Status","boot",0xa6353e01,"borogove.Status.boot","borogove/Status.hx",13,0x40932afe)
+namespace borogove{
+
+void Status_obj::__construct(::String emoji,::String text){
+            	HX_STACKFRAME(&_hx_pos_1e3dc2b0d4179260_20_new)
+HXLINE(  21)		this->emoji = emoji;
+HXLINE(  22)		this->text = text;
+            	}
+
+Dynamic Status_obj::__CreateEmpty() { return new Status_obj; }
+
+void *Status_obj::_hx_vtable = 0;
+
+Dynamic Status_obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< Status_obj > _hx_result = new Status_obj();
+	_hx_result->__construct(inArgs[0],inArgs[1]);
+	return _hx_result;
+}
+
+bool Status_obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x6af3a8f3;
+}
+
+::String Status_obj::emoji__fromC(){
+            	HX_STACKFRAME(&_hx_pos_c82280c5737a8ee0_478_emoji__fromC)
+HXDLIN( 478)		return this->emoji;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Status_obj,emoji__fromC,return )
+
+::String Status_obj::text__fromC(){
+            	HX_STACKFRAME(&_hx_pos_c82280c5737a8ee0_478_text__fromC)
+HXDLIN( 478)		return this->text;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Status_obj,text__fromC,return )
+
+::String Status_obj::toString(){
+            	HX_STACKFRAME(&_hx_pos_1e3dc2b0d4179260_29_toString)
+HXDLIN(  29)		::String _hx_tmp;
+HXDLIN(  29)		bool _hx_tmp1;
+HXDLIN(  29)		if ((this->emoji != HX_("",00,00,00,00))) {
+HXDLIN(  29)			_hx_tmp1 = (this->text == HX_("",00,00,00,00));
+            		}
+            		else {
+HXDLIN(  29)			_hx_tmp1 = true;
+            		}
+HXDLIN(  29)		if (_hx_tmp1) {
+HXDLIN(  29)			_hx_tmp = HX_("",00,00,00,00);
+            		}
+            		else {
+HXDLIN(  29)			_hx_tmp = HX_(" ",20,00,00,00);
+            		}
+HXDLIN(  29)		return ((this->emoji + _hx_tmp) + this->text);
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Status_obj,toString,return )
+
+ ::borogove::Stanza Status_obj::toStanza(){
+            	HX_GC_STACKFRAME(&_hx_pos_1e3dc2b0d4179260_33_toStanza)
+HXLINE(  34)		 ::borogove::Stanza s =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("activity",cf,2d,b2,e5), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("http://jabber.org/protocol/activity",43,2c,6e,94))));
+HXLINE(  35)		if ((this->text != HX_("",00,00,00,00))) {
+HXLINE(  35)			s->textTag(HX_("text",ad,cc,f9,4c),this->text,null());
+            		}
+HXLINE(  36)		if ((this->emoji == HX_("",00,00,00,00))) {
+HXLINE(  37)			s->tag(HX_("undefined",90,3e,0a,9d),null())->tag(HX_("other",d0,66,76,36),null())->up()->up();
+            		}
+            		else {
+HXLINE(  39)			s->tag(HX_("undefined",90,3e,0a,9d),null())->textTag(HX_("emoji",86,6f,d9,6f),this->emoji, ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("https://ns.borogove.dev/",0d,36,29,bd))))->up();
+            		}
+HXLINE(  41)		return s;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Status_obj,toStanza,return )
+
+
+::hx::ObjectPtr< Status_obj > Status_obj::__new(::String emoji,::String text) {
+	::hx::ObjectPtr< Status_obj > __this = new Status_obj();
+	__this->__construct(emoji,text);
+	return __this;
+}
+
+::hx::ObjectPtr< Status_obj > Status_obj::__alloc(::hx::Ctx *_hx_ctx,::String emoji,::String text) {
+	Status_obj *__this = (Status_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Status_obj), true, "borogove.Status"));
+	*(void **)__this = Status_obj::_hx_vtable;
+	__this->__construct(emoji,text);
+	return __this;
+}
+
+Status_obj::Status_obj()
+{
+}
+
+void Status_obj::__Mark(HX_MARK_PARAMS)
+{
+	HX_MARK_BEGIN_CLASS(Status);
+	HX_MARK_MEMBER_NAME(emoji,"emoji");
+	HX_MARK_MEMBER_NAME(text,"text");
+	HX_MARK_END_CLASS();
+}
+
+void Status_obj::__Visit(HX_VISIT_PARAMS)
+{
+	HX_VISIT_MEMBER_NAME(emoji,"emoji");
+	HX_VISIT_MEMBER_NAME(text,"text");
+}
+
+::hx::Val Status_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 4:
+		if (HX_FIELD_EQ(inName,"text") ) { return ::hx::Val( text ); }
+		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"emoji") ) { return ::hx::Val( emoji ); }
+		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"toString") ) { return ::hx::Val( toString_dyn() ); }
+		if (HX_FIELD_EQ(inName,"toStanza") ) { return ::hx::Val( toStanza_dyn() ); }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"text__fromC") ) { return ::hx::Val( text__fromC_dyn() ); }
+		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"emoji__fromC") ) { return ::hx::Val( emoji__fromC_dyn() ); }
+	}
+	return super::__Field(inName,inCallProp);
+}
+
+::hx::Val Status_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 4:
+		if (HX_FIELD_EQ(inName,"text") ) { text=inValue.Cast< ::String >(); return inValue; }
+		break;
+	case 5:
+		if (HX_FIELD_EQ(inName,"emoji") ) { emoji=inValue.Cast< ::String >(); return inValue; }
+	}
+	return super::__SetField(inName,inValue,inCallProp);
+}
+
+void Status_obj::__GetFields(Array< ::String> &outFields)
+{
+	outFields->push(HX_("emoji",86,6f,d9,6f));
+	outFields->push(HX_("text",ad,cc,f9,4c));
+	super::__GetFields(outFields);
+};
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo Status_obj_sMemberStorageInfo[] = {
+	{::hx::fsString,(int)offsetof(Status_obj,emoji),HX_("emoji",86,6f,d9,6f)},
+	{::hx::fsString,(int)offsetof(Status_obj,text),HX_("text",ad,cc,f9,4c)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+static ::hx::StaticInfo *Status_obj_sStaticStorageInfo = 0;
+#endif
+
+static ::String Status_obj_sMemberFields[] = {
+	HX_("emoji",86,6f,d9,6f),
+	HX_("emoji__fromC",b3,9d,16,6e),
+	HX_("text",ad,cc,f9,4c),
+	HX_("text__fromC",6c,43,1b,7f),
+	HX_("toString",ac,d0,6e,38),
+	HX_("toStanza",d0,05,36,2d),
+	::String(null()) };
+
+::hx::Class Status_obj::__mClass;
+
+void Status_obj::__register()
+{
+	Status_obj _hx_dummy;
+	Status_obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("borogove.Status",ff,f8,92,bc);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &::hx::Class_obj::GetNoStaticField;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(0 /* sStaticFields */);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(Status_obj_sMemberFields);
+	__mClass->mCanCast = ::hx::TCanCast< Status_obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = Status_obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = Status_obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+void Status_obj::__boot()
+{
+{
+            	HX_STACKFRAME(&_hx_pos_1e3dc2b0d4179260_13_boot)
+HXDLIN(  13)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("emoji__fromC",b3,9d,16,6e), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(1,HX_("text__fromC",6c,43,1b,7f), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null()))))));
+            	}
+}
+
+} // end namespace borogove
diff --git a/Sources/c_borogove/src/borogove/Symbol.cpp b/Sources/c_borogove/src/borogove/Symbol.cpp
index 6e4dd74..489ebcd 100644
--- a/Sources/c_borogove/src/borogove/Symbol.cpp
+++ b/Sources/c_borogove/src/borogove/Symbol.cpp
@@ -11,39 +11,39 @@
 #include <borogove/Symbol.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_b016c9f5c51dd47b_119_new,"borogove.Symbol","new",0x31f85897,"borogove.Symbol.new","borogove/EmojiUtil.hx",119,0xaaf41424)
+HX_DEFINE_STACK_FRAME(_hx_pos_b016c9f5c51dd47b_127_new,"borogove.Symbol","new",0x31f85897,"borogove.Symbol.new","borogove/EmojiUtil.hx",127,0xaaf41424)
 namespace borogove{
 
 void Symbol_obj::__construct(::Array< int > codepoints){
-            	HX_GC_STACKFRAME(&_hx_pos_b016c9f5c51dd47b_119_new)
-HXLINE( 120)		 ::StringBuf builder =  ::StringBuf_obj::__alloc( HX_CTX );
-HXLINE( 121)		{
-HXLINE( 121)			int _g = 0;
-HXDLIN( 121)			while((_g < codepoints->length)){
-HXLINE( 121)				int codepoint = codepoints->__get(_g);
-HXDLIN( 121)				_g = (_g + 1);
-HXLINE( 122)				if ((codepoint >= 127)) {
-HXLINE( 122)					::String x = ::String::fromCharCode(codepoint);
-HXDLIN( 122)					if (::hx::IsNotNull( builder->charBuf )) {
-HXLINE( 122)						builder->flush();
+            	HX_GC_STACKFRAME(&_hx_pos_b016c9f5c51dd47b_127_new)
+HXLINE( 128)		 ::StringBuf builder =  ::StringBuf_obj::__alloc( HX_CTX );
+HXLINE( 129)		{
+HXLINE( 129)			int _g = 0;
+HXDLIN( 129)			while((_g < codepoints->length)){
+HXLINE( 129)				int codepoint = codepoints->__get(_g);
+HXDLIN( 129)				_g = (_g + 1);
+HXLINE( 130)				if ((codepoint >= 127)) {
+HXLINE( 130)					::String x = ::String::fromCharCode(codepoint);
+HXDLIN( 130)					if (::hx::IsNotNull( builder->charBuf )) {
+HXLINE( 130)						builder->flush();
             					}
-HXDLIN( 122)					if (::hx::IsNull( builder->b )) {
-HXLINE( 122)						builder->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(x));
+HXDLIN( 130)					if (::hx::IsNull( builder->b )) {
+HXLINE( 130)						builder->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(x));
             					}
             					else {
-HXLINE( 122)						::Array< ::String > builder1 = builder->b;
-HXDLIN( 122)						builder1->push(::Std_obj::string(x));
+HXLINE( 130)						::Array< ::String > builder1 = builder->b;
+HXDLIN( 130)						builder1->push(::Std_obj::string(x));
             					}
             				}
             				else {
-HXLINE( 122)					if (::hx::IsNull( builder->charBuf )) {
-HXLINE( 122)						builder->charBuf = ::Array_obj< char >::__new();
+HXLINE( 130)					if (::hx::IsNull( builder->charBuf )) {
+HXLINE( 130)						builder->charBuf = ::Array_obj< char >::__new();
             					}
-HXDLIN( 122)					builder->charBuf->push(codepoint);
+HXDLIN( 130)					builder->charBuf->push(codepoint);
             				}
             			}
             		}
-HXLINE( 124)		this->value = builder->toString();
+HXLINE( 132)		this->value = builder->toString();
             	}
 
 bool Symbol_obj::_hx_isInstanceOf(int inClassId) {
diff --git a/Sources/c_borogove/src/borogove/UnicodeBlocks.cpp b/Sources/c_borogove/src/borogove/UnicodeBlocks.cpp
index e390d22..511237c 100644
--- a/Sources/c_borogove/src/borogove/UnicodeBlocks.cpp
+++ b/Sources/c_borogove/src/borogove/UnicodeBlocks.cpp
@@ -8,13 +8,13 @@
 #include <borogove/UnicodeSet.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_f2edb68ad8134649_217_new,"borogove.UnicodeBlocks","new",0x396cdd48,"borogove.UnicodeBlocks.new","borogove/EmojiUtil.hx",217,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_f2edb68ad8134649_220_contains,"borogove.UnicodeBlocks","contains",0x63e28437,"borogove.UnicodeBlocks.contains","borogove/EmojiUtil.hx",220,0xaaf41424)
+HX_DEFINE_STACK_FRAME(_hx_pos_f2edb68ad8134649_225_new,"borogove.UnicodeBlocks","new",0x396cdd48,"borogove.UnicodeBlocks.new","borogove/EmojiUtil.hx",225,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_f2edb68ad8134649_228_contains,"borogove.UnicodeBlocks","contains",0x63e28437,"borogove.UnicodeBlocks.contains","borogove/EmojiUtil.hx",228,0xaaf41424)
 namespace borogove{
 
 void UnicodeBlocks_obj::__construct(::Array< ::Dynamic> sets){
-            	HX_STACKFRAME(&_hx_pos_f2edb68ad8134649_217_new)
-HXDLIN( 217)		this->unicodeSets = sets->copy();
+            	HX_STACKFRAME(&_hx_pos_f2edb68ad8134649_225_new)
+HXDLIN( 225)		this->unicodeSets = sets->copy();
             	}
 
 Dynamic UnicodeBlocks_obj::__CreateEmpty() { return new UnicodeBlocks_obj; }
@@ -48,19 +48,19 @@ void *UnicodeBlocks_obj::_hx_getInterface(int inHash) {
 }
 
 bool UnicodeBlocks_obj::contains(int codepoint){
-            	HX_STACKFRAME(&_hx_pos_f2edb68ad8134649_220_contains)
-HXLINE( 221)		{
-HXLINE( 221)			int _g = 0;
-HXDLIN( 221)			::Array< ::Dynamic> _g1 = this->unicodeSets;
-HXDLIN( 221)			while((_g < _g1->length)){
-HXLINE( 221)				::Dynamic unicodeSet = _g1->__get(_g);
-HXDLIN( 221)				_g = (_g + 1);
-HXLINE( 222)				if (::borogove::UnicodeSet_obj::contains(unicodeSet,codepoint)) {
-HXLINE( 223)					return true;
+            	HX_STACKFRAME(&_hx_pos_f2edb68ad8134649_228_contains)
+HXLINE( 229)		{
+HXLINE( 229)			int _g = 0;
+HXDLIN( 229)			::Array< ::Dynamic> _g1 = this->unicodeSets;
+HXDLIN( 229)			while((_g < _g1->length)){
+HXLINE( 229)				::Dynamic unicodeSet = _g1->__get(_g);
+HXDLIN( 229)				_g = (_g + 1);
+HXLINE( 230)				if (::borogove::UnicodeSet_obj::contains(unicodeSet,codepoint)) {
+HXLINE( 231)					return true;
             				}
             			}
             		}
-HXLINE( 226)		return false;
+HXLINE( 234)		return false;
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/UnicodeList.cpp b/Sources/c_borogove/src/borogove/UnicodeList.cpp
index 57e05ae..7c19fda 100644
--- a/Sources/c_borogove/src/borogove/UnicodeList.cpp
+++ b/Sources/c_borogove/src/borogove/UnicodeList.cpp
@@ -8,13 +8,13 @@
 #include <borogove/UnicodeSet.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_566685102370b44c_238_new,"borogove.UnicodeList","new",0x16e44320,"borogove.UnicodeList.new","borogove/EmojiUtil.hx",238,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_566685102370b44c_242_contains,"borogove.UnicodeList","contains",0xbf92ef5f,"borogove.UnicodeList.contains","borogove/EmojiUtil.hx",242,0xaaf41424)
+HX_DEFINE_STACK_FRAME(_hx_pos_566685102370b44c_246_new,"borogove.UnicodeList","new",0x16e44320,"borogove.UnicodeList.new","borogove/EmojiUtil.hx",246,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_566685102370b44c_250_contains,"borogove.UnicodeList","contains",0xbf92ef5f,"borogove.UnicodeList.contains","borogove/EmojiUtil.hx",250,0xaaf41424)
 namespace borogove{
 
 void UnicodeList_obj::__construct(::Array< int > codes){
-            	HX_STACKFRAME(&_hx_pos_566685102370b44c_238_new)
-HXDLIN( 238)		this->list = codes->copy();
+            	HX_STACKFRAME(&_hx_pos_566685102370b44c_246_new)
+HXDLIN( 246)		this->list = codes->copy();
             	}
 
 Dynamic UnicodeList_obj::__CreateEmpty() { return new UnicodeList_obj; }
@@ -48,8 +48,8 @@ void *UnicodeList_obj::_hx_getInterface(int inHash) {
 }
 
 bool UnicodeList_obj::contains(int codepoint){
-            	HX_STACKFRAME(&_hx_pos_566685102370b44c_242_contains)
-HXDLIN( 242)		return this->list->contains(codepoint);
+            	HX_STACKFRAME(&_hx_pos_566685102370b44c_250_contains)
+HXDLIN( 250)		return this->list->contains(codepoint);
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/UnicodeRange.cpp b/Sources/c_borogove/src/borogove/UnicodeRange.cpp
index 0fae099..2c25788 100644
--- a/Sources/c_borogove/src/borogove/UnicodeRange.cpp
+++ b/Sources/c_borogove/src/borogove/UnicodeRange.cpp
@@ -8,14 +8,14 @@
 #include <borogove/UnicodeSet.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_9e738d11a74a8160_250_new,"borogove.UnicodeRange","new",0x971f605f,"borogove.UnicodeRange.new","borogove/EmojiUtil.hx",250,0xaaf41424)
-HX_LOCAL_STACK_FRAME(_hx_pos_9e738d11a74a8160_256_contains,"borogove.UnicodeRange","contains",0x136a6dc0,"borogove.UnicodeRange.contains","borogove/EmojiUtil.hx",256,0xaaf41424)
+HX_DEFINE_STACK_FRAME(_hx_pos_9e738d11a74a8160_258_new,"borogove.UnicodeRange","new",0x971f605f,"borogove.UnicodeRange.new","borogove/EmojiUtil.hx",258,0xaaf41424)
+HX_LOCAL_STACK_FRAME(_hx_pos_9e738d11a74a8160_264_contains,"borogove.UnicodeRange","contains",0x136a6dc0,"borogove.UnicodeRange.contains","borogove/EmojiUtil.hx",264,0xaaf41424)
 namespace borogove{
 
 void UnicodeRange_obj::__construct(int lower,int upper){
-            	HX_STACKFRAME(&_hx_pos_9e738d11a74a8160_250_new)
-HXLINE( 251)		this->lower = lower;
-HXLINE( 252)		this->upper = upper;
+            	HX_STACKFRAME(&_hx_pos_9e738d11a74a8160_258_new)
+HXLINE( 259)		this->lower = lower;
+HXLINE( 260)		this->upper = upper;
             	}
 
 Dynamic UnicodeRange_obj::__CreateEmpty() { return new UnicodeRange_obj; }
@@ -49,14 +49,14 @@ void *UnicodeRange_obj::_hx_getInterface(int inHash) {
 }
 
 bool UnicodeRange_obj::contains(int codePoint){
-            	HX_STACKFRAME(&_hx_pos_9e738d11a74a8160_256_contains)
-HXDLIN( 256)		if ((codePoint >= this->lower)) {
-HXDLIN( 256)			return (codePoint <= this->upper);
+            	HX_STACKFRAME(&_hx_pos_9e738d11a74a8160_264_contains)
+HXDLIN( 264)		if ((codePoint >= this->lower)) {
+HXDLIN( 264)			return (codePoint <= this->upper);
             		}
             		else {
-HXDLIN( 256)			return false;
+HXDLIN( 264)			return false;
             		}
-HXDLIN( 256)		return false;
+HXDLIN( 264)		return false;
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/Util.cpp b/Sources/c_borogove/src/borogove/Util.cpp
index 29a3fd2..13a9ae8 100644
--- a/Sources/c_borogove/src/borogove/Util.cpp
+++ b/Sources/c_borogove/src/borogove/Util.cpp
@@ -8,9 +8,9 @@
 #include <borogove/Util.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_00eec5fd061edd1c_152_findLastIndex,"borogove.Util","findLastIndex",0x92392d44,"borogove.Util.findLastIndex","borogove/Util.hx",152,0x66194bae)
-HX_LOCAL_STACK_FRAME(_hx_pos_00eec5fd061edd1c_177_convertIndex,"borogove.Util","convertIndex",0xe062cf5e,"borogove.Util.convertIndex","borogove/Util.hx",177,0x66194bae)
-HX_LOCAL_STACK_FRAME(_hx_pos_00eec5fd061edd1c_204_capitalize,"borogove.Util","capitalize",0xdbf39f2b,"borogove.Util.capitalize","borogove/Util.hx",204,0x66194bae)
+HX_LOCAL_STACK_FRAME(_hx_pos_00eec5fd061edd1c_178_findLastIndex,"borogove.Util","findLastIndex",0x92392d44,"borogove.Util.findLastIndex","borogove/Util.hx",178,0x66194bae)
+HX_LOCAL_STACK_FRAME(_hx_pos_00eec5fd061edd1c_207_convertIndex,"borogove.Util","convertIndex",0xe062cf5e,"borogove.Util.convertIndex","borogove/Util.hx",207,0x66194bae)
+HX_LOCAL_STACK_FRAME(_hx_pos_00eec5fd061edd1c_234_capitalize,"borogove.Util","capitalize",0xdbf39f2b,"borogove.Util.capitalize","borogove/Util.hx",234,0x66194bae)
 namespace borogove{
 
 void Util_obj::__construct() { }
@@ -31,72 +31,72 @@ bool Util_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 int Util_obj::findLastIndex(::cpp::VirtualArray it, ::Dynamic f){
-            	HX_STACKFRAME(&_hx_pos_00eec5fd061edd1c_152_findLastIndex)
-HXLINE( 156)		int i = (it->get_length() - 1);
-HXLINE( 157)		while((i > -1)){
-HXLINE( 158)			if (( (bool)(f(it->__get(i))) )) {
-HXLINE( 159)				return i;
+            	HX_STACKFRAME(&_hx_pos_00eec5fd061edd1c_178_findLastIndex)
+HXLINE( 182)		int i = (it->get_length() - 1);
+HXLINE( 183)		while((i > -1)){
+HXLINE( 184)			if (( (bool)(f(it->__get(i))) )) {
+HXLINE( 185)				return i;
             			}
-HXLINE( 160)			i = (i - 1);
+HXLINE( 186)			i = (i - 1);
             		}
-HXLINE( 162)		return -1;
+HXLINE( 188)		return -1;
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC2(Util_obj,findLastIndex,return )
 
 int Util_obj::convertIndex(::String u,int index){
-            	HX_STACKFRAME(&_hx_pos_00eec5fd061edd1c_177_convertIndex)
-HXLINE( 178)		::String s = u;
-HXLINE( 179)		int unicodeOffset = 0;
-HXLINE( 180)		int nativeOffset = 0;
-HXLINE( 181)		while((nativeOffset < s.length)){
-HXLINE( 182)			if ((nativeOffset == index)) {
-HXLINE( 183)				return unicodeOffset;
+            	HX_STACKFRAME(&_hx_pos_00eec5fd061edd1c_207_convertIndex)
+HXLINE( 208)		::String s = u;
+HXLINE( 209)		int unicodeOffset = 0;
+HXLINE( 210)		int nativeOffset = 0;
+HXLINE( 211)		while((nativeOffset < s.length)){
+HXLINE( 212)			if ((nativeOffset == index)) {
+HXLINE( 213)				return unicodeOffset;
             			}
-HXLINE( 185)			nativeOffset = (nativeOffset + 1);
-HXDLIN( 185)			int index1 = (nativeOffset - 1);
-HXDLIN( 185)			int c = s.cca(index1);
-HXDLIN( 185)			bool _hx_tmp;
-HXDLIN( 185)			if ((c >= 55296)) {
-HXLINE( 185)				_hx_tmp = (c <= 56319);
+HXLINE( 215)			nativeOffset = (nativeOffset + 1);
+HXDLIN( 215)			int index1 = (nativeOffset - 1);
+HXDLIN( 215)			int c = s.cca(index1);
+HXDLIN( 215)			bool _hx_tmp;
+HXDLIN( 215)			if ((c >= 55296)) {
+HXLINE( 215)				_hx_tmp = (c <= 56319);
             			}
             			else {
-HXLINE( 185)				_hx_tmp = false;
+HXLINE( 215)				_hx_tmp = false;
             			}
-HXDLIN( 185)			if (_hx_tmp) {
-HXLINE( 185)				c = (((c - 55232) << 10) | (s.cca((index1 + 1)) & 1023));
+HXDLIN( 215)			if (_hx_tmp) {
+HXLINE( 215)				c = (((c - 55232) << 10) | (s.cca((index1 + 1)) & 1023));
             			}
-HXLINE( 186)			if ((c >= 65536)) {
-HXLINE( 187)				nativeOffset = (nativeOffset + 1);
+HXLINE( 216)			if ((c >= 65536)) {
+HXLINE( 217)				nativeOffset = (nativeOffset + 1);
             			}
-HXLINE( 189)			unicodeOffset = (unicodeOffset + 1);
+HXLINE( 219)			unicodeOffset = (unicodeOffset + 1);
             		}
-HXLINE( 192)		if ((nativeOffset == index)) {
-HXLINE( 193)			return unicodeOffset;
+HXLINE( 222)		if ((nativeOffset == index)) {
+HXLINE( 223)			return unicodeOffset;
             		}
-HXLINE( 196)		HX_STACK_DO_THROW(HX_("No matching index",4e,b8,b1,51));
-HXDLIN( 196)		return 0;
+HXLINE( 226)		HX_STACK_DO_THROW(HX_("No matching index",4e,b8,b1,51));
+HXDLIN( 226)		return 0;
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC2(Util_obj,convertIndex,return )
 
 ::String Util_obj::capitalize(::String s){
-            	HX_STACKFRAME(&_hx_pos_00eec5fd061edd1c_204_capitalize)
-HXLINE( 205)		bool _hx_tmp;
-HXDLIN( 205)		if (::hx::IsNotNull( s )) {
-HXLINE( 205)			_hx_tmp = (s.length == 0);
+            	HX_STACKFRAME(&_hx_pos_00eec5fd061edd1c_234_capitalize)
+HXLINE( 235)		bool _hx_tmp;
+HXDLIN( 235)		if (::hx::IsNotNull( s )) {
+HXLINE( 235)			_hx_tmp = (s.length == 0);
             		}
             		else {
-HXLINE( 205)			_hx_tmp = true;
+HXLINE( 235)			_hx_tmp = true;
             		}
-HXDLIN( 205)		if (_hx_tmp) {
-HXLINE( 205)			return s;
+HXDLIN( 235)		if (_hx_tmp) {
+HXLINE( 235)			return s;
             		}
-HXLINE( 207)		::String u = s;
-HXLINE( 209)		::String first = ::_UnicodeString::UnicodeString_Impl__obj::charAt(u,0).toUpperCase();
-HXLINE( 212)		return (first + ::_UnicodeString::UnicodeString_Impl__obj::substr(u,1,(::_UnicodeString::UnicodeString_Impl__obj::get_length(u) - 1)));
+HXLINE( 237)		::String u = s;
+HXLINE( 239)		::String first = ::_UnicodeString::UnicodeString_Impl__obj::charAt(u,0).toUpperCase();
+HXLINE( 242)		return (first + ::_UnicodeString::UnicodeString_Impl__obj::substr(u,1,(::_UnicodeString::UnicodeString_Impl__obj::get_length(u) - 1)));
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/XEP0393.cpp b/Sources/c_borogove/src/borogove/XEP0393.cpp
index 63a5299..0668f46 100644
--- a/Sources/c_borogove/src/borogove/XEP0393.cpp
+++ b/Sources/c_borogove/src/borogove/XEP0393.cpp
@@ -1,9 +1,6 @@
 // Generated by Haxe 4.3.3
 #include <hxcpp.h>
 
-#ifndef INCLUDED_EReg
-#include <EReg.h>
-#endif
 #ifndef INCLUDED_Reflect
 #include <Reflect.h>
 #endif
@@ -35,48 +32,58 @@
 #include <borogove/XEP0393.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_8_parse,"borogove.XEP0393","parse",0x6c67f618,"borogove.XEP0393.parse","borogove/XEP0393.hx",8,0xa99def4c)
-HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_18_render,"borogove.XEP0393","render",0x86302dd1,"borogove.XEP0393.render","borogove/XEP0393.hx",18,0xa99def4c)
-static const ::String _hx_array_data_52379c93_4[] = {
-	HX_("\n```\n",b4,74,bf,01),
-};
+HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_9_parse,"borogove.XEP0393","parse",0x6c67f618,"borogove.XEP0393.parse","borogove/XEP0393.hx",9,0xa99def4c)
+HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_19_render,"borogove.XEP0393","render",0x86302dd1,"borogove.XEP0393.render","borogove/XEP0393.hx",19,0xa99def4c)
 static const ::String _hx_array_data_52379c93_5[] = {
-	HX_("*",2a,00,00,00),
+	HX_("blockquote",cf,56,28,a2),HX_("pre",23,60,55,00),HX_("div",51,3d,4c,00),HX_("p",70,00,00,00),
 };
 static const ::String _hx_array_data_52379c93_6[] = {
-	HX_("_",5f,00,00,00),
+	HX_("\n",0a,00,00,00),
 };
 static const ::String _hx_array_data_52379c93_7[] = {
-	HX_("~",7e,00,00,00),
+	HX_("*",2a,00,00,00),
 };
 static const ::String _hx_array_data_52379c93_8[] = {
-	HX_("`",60,00,00,00),
+	HX_("_",5f,00,00,00),
 };
 static const ::String _hx_array_data_52379c93_9[] = {
-	HX_("*",2a,00,00,00),
+	HX_("~",7e,00,00,00),
 };
 static const ::String _hx_array_data_52379c93_10[] = {
-	HX_("_",5f,00,00,00),
+	HX_("`",60,00,00,00),
 };
 static const ::String _hx_array_data_52379c93_11[] = {
-	HX_("~",7e,00,00,00),
+	HX_("*",2a,00,00,00),
 };
 static const ::String _hx_array_data_52379c93_12[] = {
-	HX_("`",60,00,00,00),
+	HX_("_",5f,00,00,00),
 };
 static const ::String _hx_array_data_52379c93_13[] = {
-	HX_("\n",0a,00,00,00),
+	HX_("~",7e,00,00,00),
 };
 static const ::String _hx_array_data_52379c93_14[] = {
+	HX_("`",60,00,00,00),
+};
+static const ::String _hx_array_data_52379c93_15[] = {
+	HX_("blockquote",cf,56,28,a2),HX_("pre",23,60,55,00),HX_("div",51,3d,4c,00),HX_("p",70,00,00,00),
+};
+static const ::String _hx_array_data_52379c93_16[] = {
+	HX_("\n",0a,00,00,00),
+};
+static const ::String _hx_array_data_52379c93_17[] = {
+	HX_("\n",0a,00,00,00),
+};
+static const ::String _hx_array_data_52379c93_18[] = {
 	HX_("```\n",aa,a7,bd,3f),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_85_renderNode,"borogove.XEP0393","renderNode",0xf0ed2073,"borogove.XEP0393.renderNode","borogove/XEP0393.hx",85,0xa99def4c)
-HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_91_parseSpans,"borogove.XEP0393","parseSpans",0xb620f931,"borogove.XEP0393.parseSpans","borogove/XEP0393.hx",91,0xa99def4c)
-HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_143_parseSpan,"borogove.XEP0393","parseSpan",0xc76ae902,"borogove.XEP0393.parseSpan","borogove/XEP0393.hx",143,0xa99def4c)
-HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_163_parseBlock,"borogove.XEP0393","parseBlock",0xe9b6d815,"borogove.XEP0393.parseBlock","borogove/XEP0393.hx",163,0xa99def4c)
-HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_176_parseQuote,"borogove.XEP0393","parseQuote",0x92ac8604,"borogove.XEP0393.parseQuote","borogove/XEP0393.hx",176,0xa99def4c)
-HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_203_parsePreformatted,"borogove.XEP0393","parsePreformatted",0x5333f4b1,"borogove.XEP0393.parsePreformatted","borogove/XEP0393.hx",203,0xa99def4c)
-HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_229_isSpace,"borogove.XEP0393","isSpace",0x82cf99a1,"borogove.XEP0393.isSpace","borogove/XEP0393.hx",229,0xa99def4c)
+HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_134_renderNode,"borogove.XEP0393","renderNode",0xf0ed2073,"borogove.XEP0393.renderNode","borogove/XEP0393.hx",134,0xa99def4c)
+HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_140_parseSpans,"borogove.XEP0393","parseSpans",0xb620f931,"borogove.XEP0393.parseSpans","borogove/XEP0393.hx",140,0xa99def4c)
+HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_191_mergeSpans,"borogove.XEP0393","mergeSpans",0xce05a48c,"borogove.XEP0393.mergeSpans","borogove/XEP0393.hx",191,0xa99def4c)
+HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_209_parseSpan,"borogove.XEP0393","parseSpan",0xc76ae902,"borogove.XEP0393.parseSpan","borogove/XEP0393.hx",209,0xa99def4c)
+HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_229_parseBlock,"borogove.XEP0393","parseBlock",0xe9b6d815,"borogove.XEP0393.parseBlock","borogove/XEP0393.hx",229,0xa99def4c)
+HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_258_parseQuote,"borogove.XEP0393","parseQuote",0x92ac8604,"borogove.XEP0393.parseQuote","borogove/XEP0393.hx",258,0xa99def4c)
+HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_288_parsePreformatted,"borogove.XEP0393","parsePreformatted",0x5333f4b1,"borogove.XEP0393.parsePreformatted","borogove/XEP0393.hx",288,0xa99def4c)
+HX_LOCAL_STACK_FRAME(_hx_pos_db68028455a3ae0e_332_isSpace,"borogove.XEP0393","isSpace",0x82cf99a1,"borogove.XEP0393.isSpace","borogove/XEP0393.hx",332,0xa99def4c)
 namespace borogove{
 
 void XEP0393_obj::__construct() { }
@@ -97,377 +104,508 @@ bool XEP0393_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::Array< ::Dynamic> XEP0393_obj::parse(::String styled){
-            	HX_STACKFRAME(&_hx_pos_db68028455a3ae0e_8_parse)
-HXLINE(   9)		::Array< ::Dynamic> blocks = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(  10)		while((::_UnicodeString::UnicodeString_Impl__obj::get_length(styled) > 0)){
-HXLINE(  11)			 ::Dynamic result = ::borogove::XEP0393_obj::parseBlock(styled);
-HXLINE(  12)			styled = ( (::String)(result->__Field(HX_("rest",14,5b,a7,4b),::hx::paccDynamic)) );
-HXLINE(  13)			blocks->push( ::Dynamic(result->__Field(HX_("block",4d,75,fc,b4),::hx::paccDynamic)));
-            		}
-HXLINE(  15)		return blocks;
+            	HX_STACKFRAME(&_hx_pos_db68028455a3ae0e_9_parse)
+HXLINE(  10)		::Array< ::Dynamic> blocks = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(  11)		while((::_UnicodeString::UnicodeString_Impl__obj::get_length(styled) > 0)){
+HXLINE(  12)			 ::Dynamic result = ::borogove::XEP0393_obj::parseBlock(styled);
+HXLINE(  13)			styled = ( (::String)(result->__Field(HX_("rest",14,5b,a7,4b),::hx::paccDynamic)) );
+HXLINE(  14)			blocks->push( ::Dynamic(result->__Field(HX_("block",4d,75,fc,b4),::hx::paccDynamic)));
+            		}
+HXLINE(  16)		return blocks;
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(XEP0393_obj,parse,return )
 
-::String XEP0393_obj::render( ::borogove::Stanza xhtml,::hx::Null< bool >  __o_inPre){
+::String XEP0393_obj::render( ::borogove::Stanza xhtml,::hx::Null< bool >  __o_inPre,::hx::Null< bool >  __o_followNewline,::hx::Null< bool >  __o_hasOpenBracket){
             		bool inPre = __o_inPre.Default(false);
-            	HX_GC_STACKFRAME(&_hx_pos_db68028455a3ae0e_18_render)
-HXLINE(  19)		if ((xhtml->name == HX_("br",d0,55,00,00))) {
-HXLINE(  20)			return HX_("\n",0a,00,00,00);
+            		bool followNewline = __o_followNewline.Default(true);
+            		bool hasOpenBracket = __o_hasOpenBracket.Default(false);
+            	HX_GC_STACKFRAME(&_hx_pos_db68028455a3ae0e_19_render)
+HXLINE(  20)		if ((xhtml->name == HX_("br",d0,55,00,00))) {
+HXLINE(  21)			return HX_("\n",0a,00,00,00);
             		}
-HXLINE(  23)		if ((xhtml->name == HX_("img",03,0c,50,00))) {
-HXLINE(  24)			::String tmp = ( (::String)(::Reflect_obj::field(xhtml->attr,HX_("alt",29,f9,49,00))) );
-HXDLIN(  24)			if (::hx::IsNotNull( tmp )) {
-HXLINE(  24)				return tmp;
+HXLINE(  24)		if ((xhtml->name == HX_("img",03,0c,50,00))) {
+HXLINE(  25)			::String tmp = ( (::String)(::Reflect_obj::field(xhtml->attr,HX_("alt",29,f9,49,00))) );
+HXDLIN(  25)			if (::hx::IsNotNull( tmp )) {
+HXLINE(  25)				return tmp;
             			}
             			else {
-HXLINE(  24)				return HX_("",00,00,00,00);
+HXLINE(  25)				return HX_("",00,00,00,00);
             			}
             		}
-HXLINE(  27)		 ::StringBuf s =  ::StringBuf_obj::__alloc( HX_CTX );
-HXLINE(  29)		if ((xhtml->name == HX_("pre",23,60,55,00))) {
-HXLINE(  30)			if (::hx::IsNotNull( s->charBuf )) {
-HXLINE(  30)				s->flush();
+HXLINE(  28)		 ::StringBuf s =  ::StringBuf_obj::__alloc( HX_CTX );
+HXLINE(  29)		bool endsWithNewline = true;
+HXLINE(  31)		bool _hx_tmp;
+HXDLIN(  31)		if (!(followNewline)) {
+HXLINE(  31)			_hx_tmp = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_5,4)->contains(xhtml->name);
+            		}
+            		else {
+HXLINE(  31)			_hx_tmp = false;
+            		}
+HXDLIN(  31)		if (_hx_tmp) {
+HXLINE(  32)			{
+HXLINE(  32)				if (::hx::IsNotNull( s->charBuf )) {
+HXLINE(  32)					s->flush();
+            				}
+HXDLIN(  32)				if (::hx::IsNull( s->b )) {
+HXLINE(  32)					s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_6,1);
+            				}
+            				else {
+HXLINE(  32)					s->b->push(HX_("\n",0a,00,00,00));
+            				}
             			}
-HXDLIN(  30)			if (::hx::IsNull( s->b )) {
-HXLINE(  30)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_4,1);
+HXLINE(  33)			endsWithNewline = true;
+            		}
+HXLINE(  36)		if ((xhtml->name == HX_("pre",23,60,55,00))) {
+HXLINE(  37)			 ::borogove::Stanza code = xhtml->getChild(HX_("code",2d,b1,c4,41),null());
+HXLINE(  38)			::String lang = HX_("",00,00,00,00);
+HXLINE(  39)			bool _hx_tmp1;
+HXDLIN(  39)			if (::hx::IsNotNull( code )) {
+HXLINE(  39)				_hx_tmp1 = (xhtml->children->length == 1);
             			}
             			else {
-HXLINE(  30)				s->b->push(HX_("\n```\n",b4,74,bf,01));
+HXLINE(  39)				_hx_tmp1 = false;
+            			}
+HXDLIN(  39)			if (_hx_tmp1) {
+HXLINE(  40)				::String className;
+HXDLIN(  40)				::String tmp1 = ( (::String)(::Reflect_obj::field(code->attr,HX_("class",38,78,58,48))) );
+HXDLIN(  40)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE(  40)					className = tmp1;
+            				}
+            				else {
+HXLINE(  40)					className = HX_("",00,00,00,00);
+            				}
+HXLINE(  41)				if (::StringTools_obj::startsWith(className,HX_("language-",d5,cc,3e,55))) {
+HXLINE(  42)					lang = className.substr(9,null());
+            				}
+            			}
+HXLINE(  45)			{
+HXLINE(  45)				::String x = ((HX_("```",60,2c,49,00) + lang) + HX_("\n",0a,00,00,00));
+HXDLIN(  45)				if (::hx::IsNotNull( s->charBuf )) {
+HXLINE(  45)					s->flush();
+            				}
+HXDLIN(  45)				if (::hx::IsNull( s->b )) {
+HXLINE(  45)					s->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(x));
+            				}
+            				else {
+HXLINE(  45)					::Array< ::String > s1 = s->b;
+HXDLIN(  45)					s1->push(::Std_obj::string(x));
+            				}
             			}
+HXLINE(  46)			endsWithNewline = true;
             		}
-HXLINE(  33)		bool _hx_tmp;
-HXDLIN(  33)		if ((xhtml->name != HX_("b",62,00,00,00))) {
-HXLINE(  33)			_hx_tmp = (xhtml->name == HX_("strong",57,b6,34,11));
+HXLINE(  49)		bool _hx_tmp2;
+HXDLIN(  49)		if ((xhtml->name != HX_("b",62,00,00,00))) {
+HXLINE(  49)			_hx_tmp2 = (xhtml->name == HX_("strong",57,b6,34,11));
             		}
             		else {
-HXLINE(  33)			_hx_tmp = true;
+HXLINE(  49)			_hx_tmp2 = true;
             		}
-HXDLIN(  33)		if (_hx_tmp) {
-HXLINE(  34)			if (::hx::IsNotNull( s->charBuf )) {
-HXLINE(  34)				s->flush();
-            			}
-HXDLIN(  34)			if (::hx::IsNull( s->b )) {
-HXLINE(  34)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_5,1);
-            			}
-            			else {
-HXLINE(  34)				s->b->push(HX_("*",2a,00,00,00));
+HXDLIN(  49)		if (_hx_tmp2) {
+HXLINE(  50)			{
+HXLINE(  50)				if (::hx::IsNotNull( s->charBuf )) {
+HXLINE(  50)					s->flush();
+            				}
+HXDLIN(  50)				if (::hx::IsNull( s->b )) {
+HXLINE(  50)					s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_7,1);
+            				}
+            				else {
+HXLINE(  50)					s->b->push(HX_("*",2a,00,00,00));
+            				}
             			}
+HXLINE(  51)			endsWithNewline = false;
             		}
-HXLINE(  37)		bool _hx_tmp1;
-HXDLIN(  37)		if ((xhtml->name != HX_("i",69,00,00,00))) {
-HXLINE(  37)			_hx_tmp1 = (xhtml->name == HX_("em",68,58,00,00));
+HXLINE(  54)		bool _hx_tmp3;
+HXDLIN(  54)		if ((xhtml->name != HX_("i",69,00,00,00))) {
+HXLINE(  54)			_hx_tmp3 = (xhtml->name == HX_("em",68,58,00,00));
             		}
             		else {
-HXLINE(  37)			_hx_tmp1 = true;
+HXLINE(  54)			_hx_tmp3 = true;
             		}
-HXDLIN(  37)		if (_hx_tmp1) {
-HXLINE(  38)			if (::hx::IsNotNull( s->charBuf )) {
-HXLINE(  38)				s->flush();
-            			}
-HXDLIN(  38)			if (::hx::IsNull( s->b )) {
-HXLINE(  38)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_6,1);
-            			}
-            			else {
-HXLINE(  38)				s->b->push(HX_("_",5f,00,00,00));
+HXDLIN(  54)		if (_hx_tmp3) {
+HXLINE(  55)			{
+HXLINE(  55)				if (::hx::IsNotNull( s->charBuf )) {
+HXLINE(  55)					s->flush();
+            				}
+HXDLIN(  55)				if (::hx::IsNull( s->b )) {
+HXLINE(  55)					s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_8,1);
+            				}
+            				else {
+HXLINE(  55)					s->b->push(HX_("_",5f,00,00,00));
+            				}
             			}
+HXLINE(  56)			endsWithNewline = false;
             		}
-HXLINE(  41)		bool _hx_tmp2;
-HXDLIN(  41)		if ((xhtml->name != HX_("s",73,00,00,00))) {
-HXLINE(  41)			_hx_tmp2 = (xhtml->name == HX_("del",cb,39,4c,00));
+HXLINE(  59)		bool _hx_tmp4;
+HXDLIN(  59)		if ((xhtml->name != HX_("s",73,00,00,00))) {
+HXLINE(  59)			_hx_tmp4 = (xhtml->name == HX_("del",cb,39,4c,00));
             		}
             		else {
-HXLINE(  41)			_hx_tmp2 = true;
+HXLINE(  59)			_hx_tmp4 = true;
             		}
-HXDLIN(  41)		if (_hx_tmp2) {
-HXLINE(  42)			if (::hx::IsNotNull( s->charBuf )) {
-HXLINE(  42)				s->flush();
-            			}
-HXDLIN(  42)			if (::hx::IsNull( s->b )) {
-HXLINE(  42)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_7,1);
-            			}
-            			else {
-HXLINE(  42)				s->b->push(HX_("~",7e,00,00,00));
+HXDLIN(  59)		if (_hx_tmp4) {
+HXLINE(  60)			{
+HXLINE(  60)				if (::hx::IsNotNull( s->charBuf )) {
+HXLINE(  60)					s->flush();
+            				}
+HXDLIN(  60)				if (::hx::IsNull( s->b )) {
+HXLINE(  60)					s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_9,1);
+            				}
+            				else {
+HXLINE(  60)					s->b->push(HX_("~",7e,00,00,00));
+            				}
             			}
+HXLINE(  61)			endsWithNewline = false;
             		}
-HXLINE(  45)		bool _hx_tmp3;
-HXDLIN(  45)		if (!(inPre)) {
-HXLINE(  45)			if ((xhtml->name != HX_("tt",80,65,00,00))) {
-HXLINE(  45)				_hx_tmp3 = (xhtml->name == HX_("code",2d,b1,c4,41));
+HXLINE(  64)		bool _hx_tmp5;
+HXDLIN(  64)		if (!(inPre)) {
+HXLINE(  64)			if ((xhtml->name != HX_("tt",80,65,00,00))) {
+HXLINE(  64)				_hx_tmp5 = (xhtml->name == HX_("code",2d,b1,c4,41));
             			}
             			else {
-HXLINE(  45)				_hx_tmp3 = true;
+HXLINE(  64)				_hx_tmp5 = true;
             			}
             		}
             		else {
-HXLINE(  45)			_hx_tmp3 = false;
+HXLINE(  64)			_hx_tmp5 = false;
             		}
-HXDLIN(  45)		if (_hx_tmp3) {
-HXLINE(  46)			if (::hx::IsNotNull( s->charBuf )) {
-HXLINE(  46)				s->flush();
+HXDLIN(  64)		if (_hx_tmp5) {
+HXLINE(  65)			{
+HXLINE(  65)				if (::hx::IsNotNull( s->charBuf )) {
+HXLINE(  65)					s->flush();
+            				}
+HXDLIN(  65)				if (::hx::IsNull( s->b )) {
+HXLINE(  65)					s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_10,1);
+            				}
+            				else {
+HXLINE(  65)					s->b->push(HX_("`",60,00,00,00));
+            				}
             			}
-HXDLIN(  46)			if (::hx::IsNull( s->b )) {
-HXLINE(  46)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_8,1);
+HXLINE(  66)			endsWithNewline = false;
+            		}
+HXLINE(  69)		if ((xhtml->name == HX_("a",61,00,00,00))) {
+HXLINE(  70)			::String href;
+HXDLIN(  70)			::String tmp2 = ( (::String)(::Reflect_obj::field(xhtml->attr,HX_("href",eb,09,15,45))) );
+HXDLIN(  70)			if (::hx::IsNotNull( tmp2 )) {
+HXLINE(  70)				href = tmp2;
             			}
             			else {
-HXLINE(  46)				s->b->push(HX_("`",60,00,00,00));
-            			}
-            		}
-HXLINE(  49)		{
-HXLINE(  49)			int _g = 0;
-HXDLIN(  49)			::Array< ::Dynamic> _g1 = xhtml->children;
-HXDLIN(  49)			while((_g < _g1->length)){
-HXLINE(  49)				 ::borogove::Node child = _g1->__get(_g).StaticCast<  ::borogove::Node >();
-HXDLIN(  49)				_g = (_g + 1);
-HXLINE(  50)				{
-HXLINE(  50)					::String x = ::borogove::XEP0393_obj::renderNode(child,(xhtml->name == HX_("pre",23,60,55,00)));
-HXDLIN(  50)					if (::hx::IsNotNull( s->charBuf )) {
-HXLINE(  50)						s->flush();
+HXLINE(  70)				href = HX_("",00,00,00,00);
+            			}
+HXLINE(  71)			 ::StringBuf textBuf =  ::StringBuf_obj::__alloc( HX_CTX );
+HXLINE(  72)			{
+HXLINE(  72)				int _g = 0;
+HXDLIN(  72)				::Array< ::Dynamic> _g1 = xhtml->children;
+HXDLIN(  72)				while((_g < _g1->length)){
+HXLINE(  72)					 ::borogove::Node child = _g1->__get(_g).StaticCast<  ::borogove::Node >();
+HXDLIN(  72)					_g = (_g + 1);
+HXLINE(  73)					::String rendered = ::borogove::XEP0393_obj::renderNode(child,inPre,endsWithNewline,null());
+HXLINE(  74)					{
+HXLINE(  74)						if (::hx::IsNotNull( textBuf->charBuf )) {
+HXLINE(  74)							textBuf->flush();
+            						}
+HXDLIN(  74)						if (::hx::IsNull( textBuf->b )) {
+HXLINE(  74)							textBuf->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(rendered));
+            						}
+            						else {
+HXLINE(  74)							::Array< ::String > textBuf1 = textBuf->b;
+HXDLIN(  74)							textBuf1->push(::Std_obj::string(rendered));
+            						}
             					}
-HXDLIN(  50)					if (::hx::IsNull( s->b )) {
-HXLINE(  50)						s->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(x));
+HXLINE(  75)					endsWithNewline = ::StringTools_obj::endsWith(rendered,HX_("\n",0a,00,00,00));
+            				}
+            			}
+HXLINE(  77)			::String text = textBuf->toString();
+HXLINE(  78)			if ((text == href)) {
+HXLINE(  78)				if (hasOpenBracket) {
+HXLINE(  78)					return href;
+            				}
+            				else {
+HXLINE(  78)					return ((HX_("<",3c,00,00,00) + href) + HX_(">",3e,00,00,00));
+            				}
+            			}
+HXLINE(  79)			if (::StringTools_obj::endsWith(href,text)) {
+HXLINE(  79)				return text;
+            			}
+HXLINE(  80)			return ((((HX_("",00,00,00,00) + text) + HX_(" <",1c,1c,00,00)) + href) + HX_(">",3e,00,00,00));
+            		}
+HXLINE(  83)		::String lastRendered = HX_("",00,00,00,00);
+HXLINE(  84)		{
+HXLINE(  84)			int _g2 = 0;
+HXDLIN(  84)			::Array< ::Dynamic> _g3 = xhtml->children;
+HXDLIN(  84)			while((_g2 < _g3->length)){
+HXLINE(  84)				 ::borogove::Node child1 = _g3->__get(_g2).StaticCast<  ::borogove::Node >();
+HXDLIN(  84)				_g2 = (_g2 + 1);
+HXLINE(  85)				bool rendered1 = (xhtml->name == HX_("pre",23,60,55,00));
+HXDLIN(  85)				::String rendered2 = ::borogove::XEP0393_obj::renderNode(child1,rendered1,endsWithNewline,::StringTools_obj::endsWith(lastRendered,HX_("<",3c,00,00,00)));
+HXLINE(  86)				{
+HXLINE(  86)					if (::hx::IsNotNull( s->charBuf )) {
+HXLINE(  86)						s->flush();
+            					}
+HXDLIN(  86)					if (::hx::IsNull( s->b )) {
+HXLINE(  86)						s->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(rendered2));
             					}
             					else {
-HXLINE(  50)						::Array< ::String > s1 = s->b;
-HXDLIN(  50)						s1->push(::Std_obj::string(x));
+HXLINE(  86)						::Array< ::String > s2 = s->b;
+HXDLIN(  86)						s2->push(::Std_obj::string(rendered2));
             					}
             				}
+HXLINE(  87)				lastRendered = rendered2;
+HXLINE(  88)				endsWithNewline = ::StringTools_obj::endsWith(rendered2,HX_("\n",0a,00,00,00));
             			}
             		}
-HXLINE(  53)		bool _hx_tmp4;
-HXDLIN(  53)		if ((xhtml->name != HX_("b",62,00,00,00))) {
-HXLINE(  53)			_hx_tmp4 = (xhtml->name == HX_("strong",57,b6,34,11));
+HXLINE(  91)		bool _hx_tmp6;
+HXDLIN(  91)		if ((xhtml->name != HX_("b",62,00,00,00))) {
+HXLINE(  91)			_hx_tmp6 = (xhtml->name == HX_("strong",57,b6,34,11));
             		}
             		else {
-HXLINE(  53)			_hx_tmp4 = true;
+HXLINE(  91)			_hx_tmp6 = true;
             		}
-HXDLIN(  53)		if (_hx_tmp4) {
-HXLINE(  54)			if (::hx::IsNotNull( s->charBuf )) {
-HXLINE(  54)				s->flush();
-            			}
-HXDLIN(  54)			if (::hx::IsNull( s->b )) {
-HXLINE(  54)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_9,1);
-            			}
-            			else {
-HXLINE(  54)				s->b->push(HX_("*",2a,00,00,00));
+HXDLIN(  91)		if (_hx_tmp6) {
+HXLINE(  92)			{
+HXLINE(  92)				if (::hx::IsNotNull( s->charBuf )) {
+HXLINE(  92)					s->flush();
+            				}
+HXDLIN(  92)				if (::hx::IsNull( s->b )) {
+HXLINE(  92)					s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_11,1);
+            				}
+            				else {
+HXLINE(  92)					s->b->push(HX_("*",2a,00,00,00));
+            				}
             			}
+HXLINE(  93)			endsWithNewline = false;
             		}
-HXLINE(  57)		bool _hx_tmp5;
-HXDLIN(  57)		if ((xhtml->name != HX_("i",69,00,00,00))) {
-HXLINE(  57)			_hx_tmp5 = (xhtml->name == HX_("em",68,58,00,00));
+HXLINE(  96)		bool _hx_tmp7;
+HXDLIN(  96)		if ((xhtml->name != HX_("i",69,00,00,00))) {
+HXLINE(  96)			_hx_tmp7 = (xhtml->name == HX_("em",68,58,00,00));
             		}
             		else {
-HXLINE(  57)			_hx_tmp5 = true;
+HXLINE(  96)			_hx_tmp7 = true;
             		}
-HXDLIN(  57)		if (_hx_tmp5) {
-HXLINE(  58)			if (::hx::IsNotNull( s->charBuf )) {
-HXLINE(  58)				s->flush();
-            			}
-HXDLIN(  58)			if (::hx::IsNull( s->b )) {
-HXLINE(  58)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_10,1);
-            			}
-            			else {
-HXLINE(  58)				s->b->push(HX_("_",5f,00,00,00));
+HXDLIN(  96)		if (_hx_tmp7) {
+HXLINE(  97)			{
+HXLINE(  97)				if (::hx::IsNotNull( s->charBuf )) {
+HXLINE(  97)					s->flush();
+            				}
+HXDLIN(  97)				if (::hx::IsNull( s->b )) {
+HXLINE(  97)					s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_12,1);
+            				}
+            				else {
+HXLINE(  97)					s->b->push(HX_("_",5f,00,00,00));
+            				}
             			}
+HXLINE(  98)			endsWithNewline = false;
             		}
-HXLINE(  61)		bool _hx_tmp6;
-HXDLIN(  61)		if ((xhtml->name != HX_("s",73,00,00,00))) {
-HXLINE(  61)			_hx_tmp6 = (xhtml->name == HX_("del",cb,39,4c,00));
+HXLINE( 101)		bool _hx_tmp8;
+HXDLIN( 101)		if ((xhtml->name != HX_("s",73,00,00,00))) {
+HXLINE( 101)			_hx_tmp8 = (xhtml->name == HX_("del",cb,39,4c,00));
             		}
             		else {
-HXLINE(  61)			_hx_tmp6 = true;
+HXLINE( 101)			_hx_tmp8 = true;
             		}
-HXDLIN(  61)		if (_hx_tmp6) {
-HXLINE(  62)			if (::hx::IsNotNull( s->charBuf )) {
-HXLINE(  62)				s->flush();
-            			}
-HXDLIN(  62)			if (::hx::IsNull( s->b )) {
-HXLINE(  62)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_11,1);
-            			}
-            			else {
-HXLINE(  62)				s->b->push(HX_("~",7e,00,00,00));
+HXDLIN( 101)		if (_hx_tmp8) {
+HXLINE( 102)			{
+HXLINE( 102)				if (::hx::IsNotNull( s->charBuf )) {
+HXLINE( 102)					s->flush();
+            				}
+HXDLIN( 102)				if (::hx::IsNull( s->b )) {
+HXLINE( 102)					s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_13,1);
+            				}
+            				else {
+HXLINE( 102)					s->b->push(HX_("~",7e,00,00,00));
+            				}
             			}
+HXLINE( 103)			endsWithNewline = false;
             		}
-HXLINE(  65)		bool _hx_tmp7;
-HXDLIN(  65)		if (!(inPre)) {
-HXLINE(  65)			if ((xhtml->name != HX_("tt",80,65,00,00))) {
-HXLINE(  65)				_hx_tmp7 = (xhtml->name == HX_("code",2d,b1,c4,41));
+HXLINE( 106)		bool _hx_tmp9;
+HXDLIN( 106)		if (!(inPre)) {
+HXLINE( 106)			if ((xhtml->name != HX_("tt",80,65,00,00))) {
+HXLINE( 106)				_hx_tmp9 = (xhtml->name == HX_("code",2d,b1,c4,41));
             			}
             			else {
-HXLINE(  65)				_hx_tmp7 = true;
+HXLINE( 106)				_hx_tmp9 = true;
             			}
             		}
             		else {
-HXLINE(  65)			_hx_tmp7 = false;
+HXLINE( 106)			_hx_tmp9 = false;
             		}
-HXDLIN(  65)		if (_hx_tmp7) {
-HXLINE(  66)			if (::hx::IsNotNull( s->charBuf )) {
-HXLINE(  66)				s->flush();
-            			}
-HXDLIN(  66)			if (::hx::IsNull( s->b )) {
-HXLINE(  66)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_12,1);
-            			}
-            			else {
-HXLINE(  66)				s->b->push(HX_("`",60,00,00,00));
+HXDLIN( 106)		if (_hx_tmp9) {
+HXLINE( 107)			{
+HXLINE( 107)				if (::hx::IsNotNull( s->charBuf )) {
+HXLINE( 107)					s->flush();
+            				}
+HXDLIN( 107)				if (::hx::IsNull( s->b )) {
+HXLINE( 107)					s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_14,1);
+            				}
+            				else {
+HXLINE( 107)					s->b->push(HX_("`",60,00,00,00));
+            				}
             			}
+HXLINE( 108)			endsWithNewline = false;
             		}
-HXLINE(  69)		bool _hx_tmp8;
-HXDLIN(  69)		bool _hx_tmp9;
-HXDLIN(  69)		bool _hx_tmp10;
-HXDLIN(  69)		if ((xhtml->name != HX_("blockquote",cf,56,28,a2))) {
-HXLINE(  69)			_hx_tmp10 = (xhtml->name == HX_("p",70,00,00,00));
+HXLINE( 111)		bool _hx_tmp10;
+HXDLIN( 111)		if (!(endsWithNewline)) {
+HXLINE( 111)			_hx_tmp10 = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_15,4)->contains(xhtml->name);
             		}
             		else {
-HXLINE(  69)			_hx_tmp10 = true;
+HXLINE( 111)			_hx_tmp10 = false;
             		}
-HXDLIN(  69)		if (!(_hx_tmp10)) {
-HXLINE(  69)			_hx_tmp9 = (xhtml->name == HX_("div",51,3d,4c,00));
-            		}
-            		else {
-HXLINE(  69)			_hx_tmp9 = true;
+HXDLIN( 111)		if (_hx_tmp10) {
+HXLINE( 112)			if (::hx::IsNotNull( s->charBuf )) {
+HXLINE( 112)				s->flush();
+            			}
+HXDLIN( 112)			if (::hx::IsNull( s->b )) {
+HXLINE( 112)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_16,1);
+            			}
+            			else {
+HXLINE( 112)				s->b->push(HX_("\n",0a,00,00,00));
+            			}
             		}
-HXDLIN(  69)		if (!(_hx_tmp9)) {
-HXLINE(  69)			_hx_tmp8 = (xhtml->name == HX_("pre",23,60,55,00));
+HXLINE( 116)		bool _hx_tmp11;
+HXDLIN( 116)		if ((xhtml->name == HX_("p",70,00,00,00))) {
+HXLINE( 116)			_hx_tmp11 = (( (::String)(::Reflect_obj::field(xhtml->attr,HX_("class",38,78,58,48))) ) != HX_("tight",de,34,31,10));
             		}
             		else {
-HXLINE(  69)			_hx_tmp8 = true;
+HXLINE( 116)			_hx_tmp11 = false;
             		}
-HXDLIN(  69)		if (_hx_tmp8) {
-HXLINE(  70)			if (::hx::IsNotNull( s->charBuf )) {
-HXLINE(  70)				s->flush();
+HXDLIN( 116)		if (_hx_tmp11) {
+HXLINE( 117)			if (::hx::IsNotNull( s->charBuf )) {
+HXLINE( 117)				s->flush();
             			}
-HXDLIN(  70)			if (::hx::IsNull( s->b )) {
-HXLINE(  70)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_13,1);
+HXDLIN( 117)			if (::hx::IsNull( s->b )) {
+HXLINE( 117)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_17,1);
             			}
             			else {
-HXLINE(  70)				s->b->push(HX_("\n",0a,00,00,00));
+HXLINE( 117)				s->b->push(HX_("\n",0a,00,00,00));
             			}
             		}
-HXLINE(  73)		if ((xhtml->name == HX_("pre",23,60,55,00))) {
-HXLINE(  74)			if (::hx::IsNotNull( s->charBuf )) {
-HXLINE(  74)				s->flush();
+HXLINE( 120)		if ((xhtml->name == HX_("pre",23,60,55,00))) {
+HXLINE( 121)			if (::hx::IsNotNull( s->charBuf )) {
+HXLINE( 121)				s->flush();
             			}
-HXDLIN(  74)			if (::hx::IsNull( s->b )) {
-HXLINE(  74)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_14,1);
+HXDLIN( 121)			if (::hx::IsNull( s->b )) {
+HXLINE( 121)				s->b = ::Array_obj< ::String >::fromData( _hx_array_data_52379c93_18,1);
             			}
             			else {
-HXLINE(  74)				s->b->push(HX_("```\n",aa,a7,bd,3f));
+HXLINE( 121)				s->b->push(HX_("```\n",aa,a7,bd,3f));
             			}
             		}
-HXLINE(  77)		if ((xhtml->name == HX_("blockquote",cf,56,28,a2))) {
-HXLINE(  78)			 ::EReg _hx_tmp11 =  ::EReg_obj::__alloc( HX_CTX ,HX_("^",5e,00,00,00),HX_("gm",26,5a,00,00));
-HXDLIN(  78)			return _hx_tmp11->replace(s->toString(),HX_("> ",22,36,00,00));
+HXLINE( 125)		if ((xhtml->name == HX_("blockquote",cf,56,28,a2))) {
+HXLINE( 126)			::String inner = s->toString();
+HXLINE( 127)			return ((HX_("> ",22,36,00,00) + inner.substr(0,(inner.length - 1)).split(HX_("\n",0a,00,00,00))->join(HX_("\n> ",ac,cc,07,00))) + HX_("\n\n",c0,08,00,00));
             		}
-HXLINE(  81)		return s->toString();
+HXLINE( 130)		return s->toString();
             	}
 
 
-STATIC_HX_DEFINE_DYNAMIC_FUNC2(XEP0393_obj,render,return )
+STATIC_HX_DEFINE_DYNAMIC_FUNC4(XEP0393_obj,render,return )
 
-::String XEP0393_obj::renderNode( ::borogove::Node xhtml,::hx::Null< bool >  __o_inPre){
+::String XEP0393_obj::renderNode( ::borogove::Node xhtml,::hx::Null< bool >  __o_inPre,::hx::Null< bool >  __o_followNewline,::hx::Null< bool >  __o_hasOpenBracket){
             		bool inPre = __o_inPre.Default(false);
-            	HX_STACKFRAME(&_hx_pos_db68028455a3ae0e_85_renderNode)
-HXDLIN(  85)		switch((int)(xhtml->_hx_getIndex())){
+            		bool followNewline = __o_followNewline.Default(true);
+            		bool hasOpenBracket = __o_hasOpenBracket.Default(false);
+            	HX_STACKFRAME(&_hx_pos_db68028455a3ae0e_134_renderNode)
+HXDLIN( 134)		switch((int)(xhtml->_hx_getIndex())){
             			case (int)0: {
-HXLINE(  86)				return ::borogove::XEP0393_obj::render(xhtml->_hx_getObject(0).StaticCast<  ::borogove::Stanza >(),inPre);
+HXLINE( 135)				return ::borogove::XEP0393_obj::render(xhtml->_hx_getObject(0).StaticCast<  ::borogove::Stanza >(),inPre,followNewline,hasOpenBracket);
             			}
             			break;
             			case (int)1: {
-HXLINE(  87)				return xhtml->_hx_getString(0);
+HXLINE( 136)				return xhtml->_hx_getString(0);
             			}
             			break;
             		}
-HXLINE(  85)		return null();
+HXLINE( 134)		return null();
             	}
 
 
-STATIC_HX_DEFINE_DYNAMIC_FUNC2(XEP0393_obj,renderNode,return )
+STATIC_HX_DEFINE_DYNAMIC_FUNC4(XEP0393_obj,renderNode,return )
 
  ::Dynamic XEP0393_obj::parseSpans(::String styled){
-            	HX_STACKFRAME(&_hx_pos_db68028455a3ae0e_91_parseSpans)
-HXLINE(  92)		::Array< ::Dynamic> spans = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE(  93)		int start = 0;
-HXLINE(  94)		 ::Dynamic nextLink = null();
-HXLINE(  95)		int styledLength = ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled);
-HXLINE(  96)		while((start < styledLength)){
-HXLINE(  97)			::String _hx_char = ::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,start);
-HXLINE(  98)			if (::borogove::XEP0393_obj::isSpace(styled,(start + 1))) {
-HXLINE( 100)				spans->push(::borogove::Node_obj::CData(::_UnicodeString::UnicodeString_Impl__obj::substr(styled,start,2)));
-HXLINE( 101)				start = (start + 2);
+            	HX_STACKFRAME(&_hx_pos_db68028455a3ae0e_140_parseSpans)
+HXLINE( 141)		::Array< ::Dynamic> spans = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 142)		int start = 0;
+HXLINE( 143)		 ::Dynamic nextLink = null();
+HXLINE( 144)		int styledLength = ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled);
+HXLINE( 145)		while((start < styledLength)){
+HXLINE( 146)			bool _hx_tmp;
+HXDLIN( 146)			if (::hx::IsNotNull( nextLink )) {
+HXLINE( 146)				_hx_tmp = ::hx::IsGreater( start,nextLink->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic) );
             			}
             			else {
-HXLINE( 102)				bool _hx_tmp;
-HXDLIN( 102)				if ((start != 0)) {
-HXLINE( 102)					_hx_tmp = !(::borogove::XEP0393_obj::isSpace(styled,(start - 1)));
-            				}
-            				else {
-HXLINE( 102)					_hx_tmp = false;
+HXLINE( 146)				_hx_tmp = true;
+            			}
+HXDLIN( 146)			if (_hx_tmp) {
+HXLINE( 147)				nextLink = ::borogove::Autolink_obj::one(styled,start);
+HXLINE( 148)				if (::hx::IsNotNull( nextLink )) {
+HXLINE( 149)					nextLink->__SetField(HX_("start",62,74,0b,84),::borogove::Util_obj::convertIndex(styled,( (int)(nextLink->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)) )),::hx::paccDynamic);
+HXLINE( 150)					nextLink->__SetField(HX_("end",db,03,4d,00),::borogove::Util_obj::convertIndex(styled,( (int)(nextLink->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) )),::hx::paccDynamic);
             				}
-HXDLIN( 102)				if (_hx_tmp) {
-HXLINE( 104)					spans->push(::borogove::Node_obj::CData(_hx_char));
-HXLINE( 105)					start = (start + 1);
+            			}
+HXLINE( 154)			::String _hx_char = ::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,start);
+HXLINE( 155)			bool _hx_tmp1;
+HXDLIN( 155)			bool _hx_tmp2;
+HXDLIN( 155)			if (::hx::IsNotNull( nextLink )) {
+HXLINE( 155)				_hx_tmp2 = ::hx::IsEq( nextLink->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic),start );
+            			}
+            			else {
+HXLINE( 155)				_hx_tmp2 = false;
+            			}
+HXDLIN( 155)			if (_hx_tmp2) {
+HXLINE( 155)				_hx_tmp1 = ::hx::IsNotNull( nextLink->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic) );
+            			}
+            			else {
+HXLINE( 155)				_hx_tmp1 = false;
+            			}
+HXDLIN( 155)			if (_hx_tmp1) {
+HXLINE( 156)				spans->push( ::Dynamic(nextLink->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic)));
+HXLINE( 157)				start = ( (int)(nextLink->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) );
+            			}
+            			else {
+HXLINE( 158)				if (::borogove::XEP0393_obj::isSpace(styled,(start + 1))) {
+HXLINE( 160)					spans->push(::borogove::Node_obj::CData(::_UnicodeString::UnicodeString_Impl__obj::substr(styled,start,2)));
+HXLINE( 161)					start = (start + 2);
             				}
             				else {
-HXLINE( 106)					if ((_hx_char == HX_("*",2a,00,00,00))) {
-HXLINE( 107)						 ::Dynamic parsed = ::borogove::XEP0393_obj::parseSpan(HX_("strong",57,b6,34,11),HX_("*",2a,00,00,00),styled,start);
-HXLINE( 108)						spans->push( ::Dynamic(parsed->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic)));
-HXLINE( 109)						start = ( (int)(parsed->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) );
+HXLINE( 162)					bool _hx_tmp3;
+HXDLIN( 162)					if ((start != 0)) {
+HXLINE( 162)						_hx_tmp3 = !(::borogove::XEP0393_obj::isSpace(styled,(start - 1)));
             					}
             					else {
-HXLINE( 110)						if ((_hx_char == HX_("_",5f,00,00,00))) {
-HXLINE( 111)							 ::Dynamic parsed1 = ::borogove::XEP0393_obj::parseSpan(HX_("em",68,58,00,00),HX_("_",5f,00,00,00),styled,start);
-HXLINE( 112)							spans->push( ::Dynamic(parsed1->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic)));
-HXLINE( 113)							start = ( (int)(parsed1->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) );
+HXLINE( 162)						_hx_tmp3 = false;
+            					}
+HXDLIN( 162)					if (_hx_tmp3) {
+HXLINE( 164)						spans->push(::borogove::Node_obj::CData(_hx_char));
+HXLINE( 165)						start = (start + 1);
+            					}
+            					else {
+HXLINE( 166)						if ((_hx_char == HX_("*",2a,00,00,00))) {
+HXLINE( 167)							 ::Dynamic parsed = ::borogove::XEP0393_obj::parseSpan(HX_("strong",57,b6,34,11),HX_("*",2a,00,00,00),styled,start);
+HXLINE( 168)							spans->push( ::Dynamic(parsed->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic)));
+HXLINE( 169)							start = ( (int)(parsed->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) );
             						}
             						else {
-HXLINE( 114)							if ((_hx_char == HX_("~",7e,00,00,00))) {
-HXLINE( 115)								 ::Dynamic parsed2 = ::borogove::XEP0393_obj::parseSpan(HX_("s",73,00,00,00),HX_("~",7e,00,00,00),styled,start);
-HXLINE( 116)								spans->push( ::Dynamic(parsed2->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic)));
-HXLINE( 117)								start = ( (int)(parsed2->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) );
+HXLINE( 170)							if ((_hx_char == HX_("_",5f,00,00,00))) {
+HXLINE( 171)								 ::Dynamic parsed1 = ::borogove::XEP0393_obj::parseSpan(HX_("em",68,58,00,00),HX_("_",5f,00,00,00),styled,start);
+HXLINE( 172)								spans->push( ::Dynamic(parsed1->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic)));
+HXLINE( 173)								start = ( (int)(parsed1->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) );
             							}
             							else {
-HXLINE( 118)								if ((_hx_char == HX_("`",60,00,00,00))) {
-HXLINE( 120)									 ::Dynamic parsed3 = ::borogove::XEP0393_obj::parseSpan(HX_("tt",80,65,00,00),HX_("`",60,00,00,00),styled,start);
-HXLINE( 121)									spans->push( ::Dynamic(parsed3->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic)));
-HXLINE( 122)									start = ( (int)(parsed3->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) );
+HXLINE( 174)								if ((_hx_char == HX_("~",7e,00,00,00))) {
+HXLINE( 175)									 ::Dynamic parsed2 = ::borogove::XEP0393_obj::parseSpan(HX_("s",73,00,00,00),HX_("~",7e,00,00,00),styled,start);
+HXLINE( 176)									spans->push( ::Dynamic(parsed2->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic)));
+HXLINE( 177)									start = ( (int)(parsed2->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) );
             								}
             								else {
-HXLINE( 124)									bool _hx_tmp1;
-HXDLIN( 124)									if (::hx::IsNotNull( nextLink )) {
-HXLINE( 124)										_hx_tmp1 = ::hx::IsGreater( start,nextLink->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic) );
+HXLINE( 178)									if ((_hx_char == HX_("`",60,00,00,00))) {
+HXLINE( 180)										 ::Dynamic parsed3 = ::borogove::XEP0393_obj::parseSpan(HX_("tt",80,65,00,00),HX_("`",60,00,00,00),styled,start);
+HXLINE( 181)										spans->push( ::Dynamic(parsed3->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic)));
+HXLINE( 182)										start = ( (int)(parsed3->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) );
             									}
             									else {
-HXLINE( 124)										_hx_tmp1 = true;
-            									}
-HXDLIN( 124)									if (_hx_tmp1) {
-HXLINE( 125)										nextLink = ::borogove::Autolink_obj::one(styled,start);
-HXLINE( 126)										if (::hx::IsNotNull( nextLink )) {
-HXLINE( 127)											nextLink->__SetField(HX_("start",62,74,0b,84),::borogove::Util_obj::convertIndex(styled,( (int)(nextLink->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic)) )),::hx::paccDynamic);
-HXLINE( 128)											nextLink->__SetField(HX_("end",db,03,4d,00),::borogove::Util_obj::convertIndex(styled,( (int)(nextLink->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) )),::hx::paccDynamic);
-            										}
-            									}
-HXLINE( 131)									bool _hx_tmp2;
-HXDLIN( 131)									bool _hx_tmp3;
-HXDLIN( 131)									if (::hx::IsNotNull( nextLink )) {
-HXLINE( 131)										_hx_tmp3 = ::hx::IsEq( nextLink->__Field(HX_("start",62,74,0b,84),::hx::paccDynamic),start );
-            									}
-            									else {
-HXLINE( 131)										_hx_tmp3 = false;
-            									}
-HXDLIN( 131)									if (_hx_tmp3) {
-HXLINE( 131)										_hx_tmp2 = ::hx::IsNotNull( nextLink->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic) );
-            									}
-            									else {
-HXLINE( 131)										_hx_tmp2 = false;
-            									}
-HXDLIN( 131)									if (_hx_tmp2) {
-HXLINE( 132)										spans->push( ::Dynamic(nextLink->__Field(HX_("span",ca,da,58,4c),::hx::paccDynamic)));
-HXLINE( 133)										start = ( (int)(nextLink->__Field(HX_("end",db,03,4d,00),::hx::paccDynamic)) );
-            									}
-            									else {
-HXLINE( 135)										spans->push(::borogove::Node_obj::CData(_hx_char));
-HXLINE( 136)										start = (start + 1);
+HXLINE( 184)										spans->push(::borogove::Node_obj::CData(_hx_char));
+HXLINE( 185)										start = (start + 1);
             									}
             								}
             							}
@@ -476,167 +614,231 @@ HXLINE( 136)										start = (start + 1);
             				}
             			}
             		}
-HXLINE( 140)		return spans;
+HXLINE( 188)		return ::borogove::XEP0393_obj::mergeSpans(spans);
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(XEP0393_obj,parseSpans,return )
 
+::Array< ::Dynamic> XEP0393_obj::mergeSpans(::Array< ::Dynamic> spans){
+            	HX_STACKFRAME(&_hx_pos_db68028455a3ae0e_191_mergeSpans)
+HXLINE( 192)		::Array< ::Dynamic> mergedSpans = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 193)		{
+HXLINE( 193)			int _g = 0;
+HXDLIN( 193)			while((_g < spans->length)){
+HXLINE( 193)				 ::borogove::Node span = spans->__get(_g).StaticCast<  ::borogove::Node >();
+HXDLIN( 193)				_g = (_g + 1);
+HXLINE( 194)				if ((mergedSpans->length > 0)) {
+HXLINE( 195)					 ::borogove::Node last = mergedSpans->__get((mergedSpans->length - 1)).StaticCast<  ::borogove::Node >();
+HXLINE( 196)					if ((last->_hx_getIndex() == 1)) {
+HXLINE( 196)						if ((span->_hx_getIndex() == 1)) {
+HXLINE( 198)							mergedSpans[(mergedSpans->length - 1)] = ::borogove::Node_obj::CData((last->_hx_getString(0) + span->_hx_getString(0)));
+            						}
+            						else {
+HXLINE( 200)							mergedSpans->push(span);
+            						}
+            					}
+            					else {
+HXLINE( 200)						mergedSpans->push(span);
+            					}
+            				}
+            				else {
+HXLINE( 203)					mergedSpans->push(span);
+            				}
+            			}
+            		}
+HXLINE( 206)		return mergedSpans;
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(XEP0393_obj,mergeSpans,return )
+
  ::Dynamic XEP0393_obj::parseSpan(::String tagName,::String marker,::String styled,int start){
-            	HX_GC_STACKFRAME(&_hx_pos_db68028455a3ae0e_143_parseSpan)
-HXLINE( 144)		int end = (start + 1);
-HXLINE( 145)		while(true){
-HXLINE( 145)			bool _hx_tmp;
-HXDLIN( 145)			if ((end < ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled))) {
-HXLINE( 145)				_hx_tmp = (::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) != marker);
+            	HX_GC_STACKFRAME(&_hx_pos_db68028455a3ae0e_209_parseSpan)
+HXLINE( 210)		int end = (start + 1);
+HXLINE( 211)		while(true){
+HXLINE( 211)			bool _hx_tmp;
+HXDLIN( 211)			if ((end < ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled))) {
+HXLINE( 211)				_hx_tmp = (::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) != marker);
             			}
             			else {
-HXLINE( 145)				_hx_tmp = false;
+HXLINE( 211)				_hx_tmp = false;
             			}
-HXDLIN( 145)			if (!(_hx_tmp)) {
-HXLINE( 145)				goto _hx_goto_18;
+HXDLIN( 211)			if (!(_hx_tmp)) {
+HXLINE( 211)				goto _hx_goto_24;
             			}
-HXLINE( 146)			if (::borogove::XEP0393_obj::isSpace(styled,end)) {
-HXLINE( 146)				end = (end + 1);
+HXLINE( 212)			if (::borogove::XEP0393_obj::isSpace(styled,end)) {
+HXLINE( 212)				end = (end + 1);
             			}
-HXLINE( 147)			end = (end + 1);
+HXLINE( 213)			end = (end + 1);
             		}
-            		_hx_goto_18:;
-HXLINE( 149)		if ((end == (start + 1))) {
-HXLINE( 151)			return  ::Dynamic(::hx::Anon_obj::Create(2)
+            		_hx_goto_24:;
+HXLINE( 215)		if ((end == (start + 1))) {
+HXLINE( 217)			return  ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("end",db,03,4d,00),(end + 1))
             				->setFixed(1,HX_("span",ca,da,58,4c),::borogove::Node_obj::CData(::_UnicodeString::UnicodeString_Impl__obj::substr(styled,start,2))));
             		}
             		else {
-HXLINE( 152)			if ((::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) != marker)) {
-HXLINE( 154)				return  ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 218)			if ((::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) != marker)) {
+HXLINE( 220)				return  ::Dynamic(::hx::Anon_obj::Create(2)
             					->setFixed(0,HX_("end",db,03,4d,00),end)
             					->setFixed(1,HX_("span",ca,da,58,4c),::borogove::Node_obj::CData(::_UnicodeString::UnicodeString_Impl__obj::substr(styled,start,(end - start)))));
             			}
             			else {
-HXLINE( 155)				if ((marker == HX_("`",60,00,00,00))) {
-HXLINE( 156)					 ::borogove::Stanza _hx_tmp1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,tagName,null());
-HXDLIN( 156)					return  ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 221)				if ((marker == HX_("`",60,00,00,00))) {
+HXLINE( 222)					 ::borogove::Stanza _hx_tmp1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,tagName,null());
+HXDLIN( 222)					return  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("end",db,03,4d,00),(end + 1))
             						->setFixed(1,HX_("span",ca,da,58,4c),::borogove::Node_obj::Element(_hx_tmp1->text(::_UnicodeString::UnicodeString_Impl__obj::substr(styled,(start + 1),((end - start) - 1))))));
             				}
             				else {
-HXLINE( 158)					 ::borogove::Stanza _hx_tmp2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,tagName,null());
-HXDLIN( 158)					return  ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 224)					 ::borogove::Stanza _hx_tmp2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,tagName,null());
+HXDLIN( 224)					return  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("end",db,03,4d,00),(end + 1))
             						->setFixed(1,HX_("span",ca,da,58,4c),::borogove::Node_obj::Element(_hx_tmp2->addChildNodes(::borogove::XEP0393_obj::parseSpans(::_UnicodeString::UnicodeString_Impl__obj::substr(styled,(start + 1),((end - start) - 1)))))));
             				}
             			}
             		}
-HXLINE( 149)		return null();
+HXLINE( 215)		return null();
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC4(XEP0393_obj,parseSpan,return )
 
  ::Dynamic XEP0393_obj::parseBlock(::String styled){
-            	HX_GC_STACKFRAME(&_hx_pos_db68028455a3ae0e_163_parseBlock)
-HXDLIN( 163)		if ((::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,0) == HX_(">",3e,00,00,00))) {
-HXLINE( 164)			return ::borogove::XEP0393_obj::parseQuote(styled);
+            	HX_GC_STACKFRAME(&_hx_pos_db68028455a3ae0e_229_parseBlock)
+HXDLIN( 229)		if ((::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,0) == HX_(">",3e,00,00,00))) {
+HXLINE( 230)			return ::borogove::XEP0393_obj::parseQuote(styled);
             		}
             		else {
-HXLINE( 165)			if ((::_UnicodeString::UnicodeString_Impl__obj::substr(styled,0,3) == HX_("```",60,2c,49,00))) {
-HXLINE( 166)				return ::borogove::XEP0393_obj::parsePreformatted(styled);
+HXLINE( 231)			if ((::_UnicodeString::UnicodeString_Impl__obj::substr(styled,0,3) == HX_("```",60,2c,49,00))) {
+HXLINE( 232)				return ::borogove::XEP0393_obj::parsePreformatted(styled);
             			}
             			else {
-HXLINE( 168)				int end = 0;
-HXLINE( 169)				int styledLength = ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled);
-HXLINE( 170)				while(true){
-HXLINE( 170)					bool _hx_tmp;
-HXDLIN( 170)					if ((end < styledLength)) {
-HXLINE( 170)						_hx_tmp = (::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) != HX_("\n",0a,00,00,00));
+HXLINE( 234)				int end = 0;
+HXLINE( 235)				::Array< ::Dynamic> nodes = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 236)				bool tight = false;
+HXLINE( 237)				int styledLength = ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled);
+HXLINE( 238)				while((end < styledLength)){
+HXLINE( 239)					int lineEnd = end;
+HXLINE( 240)					while(true){
+HXLINE( 240)						bool _hx_tmp;
+HXDLIN( 240)						if ((lineEnd < styledLength)) {
+HXLINE( 240)							_hx_tmp = (::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,lineEnd) != HX_("\n",0a,00,00,00));
+            						}
+            						else {
+HXLINE( 240)							_hx_tmp = false;
+            						}
+HXDLIN( 240)						if (!(_hx_tmp)) {
+HXLINE( 240)							goto _hx_goto_27;
+            						}
+HXDLIN( 240)						lineEnd = (lineEnd + 1);
+            					}
+            					_hx_goto_27:;
+HXLINE( 241)					if ((nodes->length > 0)) {
+HXLINE( 241)						nodes->push(::borogove::Node_obj::Element( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("br",d0,55,00,00),null())));
+            					}
+HXLINE( 242)					{
+HXLINE( 242)						 ::Dynamic span = ::borogove::XEP0393_obj::parseSpans(::_UnicodeString::UnicodeString_Impl__obj::substr(styled,end,(lineEnd - end)))->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 242)						while(( (bool)(span->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 242)							nodes->push(span->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+            						}
+            					}
+HXLINE( 243)					end = (lineEnd + 1);
+HXLINE( 244)					if ((::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) == HX_("\n",0a,00,00,00))) {
+HXLINE( 245)						end = (end + 1);
+HXLINE( 246)						goto _hx_goto_26;
+            					}
+HXLINE( 248)					bool _hx_tmp1;
+HXDLIN( 248)					if ((::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) != HX_(">",3e,00,00,00))) {
+HXLINE( 248)						_hx_tmp1 = (::_UnicodeString::UnicodeString_Impl__obj::substr(styled,end,3) == HX_("```",60,2c,49,00));
             					}
             					else {
-HXLINE( 170)						_hx_tmp = false;
+HXLINE( 248)						_hx_tmp1 = true;
             					}
-HXDLIN( 170)					if (!(_hx_tmp)) {
-HXLINE( 170)						goto _hx_goto_20;
+HXDLIN( 248)					if (_hx_tmp1) {
+HXLINE( 249)						tight = true;
+HXLINE( 250)						goto _hx_goto_26;
             					}
-HXDLIN( 170)					end = (end + 1);
             				}
-            				_hx_goto_20:;
-HXLINE( 171)				bool _hx_tmp1;
-HXDLIN( 171)				if ((end < styledLength)) {
-HXLINE( 171)					_hx_tmp1 = (::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) == HX_("\n",0a,00,00,00));
+            				_hx_goto_26:;
+HXLINE( 254)				 ::Dynamic _hx_tmp2;
+HXDLIN( 254)				if (tight) {
+HXLINE( 254)					_hx_tmp2 =  ::Dynamic(::hx::Anon_obj::Create(1)
+            						->setFixed(0,HX_("class",38,78,58,48),HX_("tight",de,34,31,10)));
             				}
             				else {
-HXLINE( 171)					_hx_tmp1 = false;
+HXLINE( 254)					_hx_tmp2 =  ::Dynamic(::hx::Anon_obj::Create(0));
             				}
-HXDLIN( 171)				if (_hx_tmp1) {
-HXLINE( 171)					end = (end + 1);
-            				}
-HXLINE( 172)				 ::borogove::Stanza _hx_tmp2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("div",51,3d,4c,00),null());
-HXDLIN( 172)				 ::borogove::Stanza _hx_tmp3 = _hx_tmp2->addChildNodes(::borogove::XEP0393_obj::parseSpans(::_UnicodeString::UnicodeString_Impl__obj::substr(styled,0,end)));
-HXDLIN( 172)				return  ::Dynamic(::hx::Anon_obj::Create(2)
+HXDLIN( 254)				 ::borogove::Stanza _hx_tmp3 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("p",70,00,00,00),_hx_tmp2)->addChildNodes(nodes);
+HXDLIN( 254)				return  ::Dynamic(::hx::Anon_obj::Create(2)
             					->setFixed(0,HX_("block",4d,75,fc,b4),_hx_tmp3)
             					->setFixed(1,HX_("rest",14,5b,a7,4b),::_UnicodeString::UnicodeString_Impl__obj::substr(styled,end,null())));
             			}
             		}
-HXLINE( 163)		return null();
+HXLINE( 229)		return null();
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(XEP0393_obj,parseBlock,return )
 
  ::Dynamic XEP0393_obj::parseQuote(::String styled){
-            	HX_GC_STACKFRAME(&_hx_pos_db68028455a3ae0e_176_parseQuote)
-HXLINE( 177)		::Array< ::String > lines = ::Array_obj< ::String >::__new(0);
-HXLINE( 178)		::String line = HX_("",00,00,00,00);
-HXLINE( 179)		int end = 1;
-HXLINE( 181)		while((end < ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled))){
-HXLINE( 182)			bool _hx_tmp;
-HXDLIN( 182)			if ((::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) != HX_("\n",0a,00,00,00))) {
-HXLINE( 182)				_hx_tmp = ::borogove::XEP0393_obj::isSpace(styled,end);
+            	HX_GC_STACKFRAME(&_hx_pos_db68028455a3ae0e_258_parseQuote)
+HXLINE( 259)		::Array< ::String > lines = ::Array_obj< ::String >::__new(0);
+HXLINE( 260)		::String line = HX_("",00,00,00,00);
+HXLINE( 261)		int end = 1;
+HXLINE( 263)		while((end < ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled))){
+HXLINE( 264)			bool _hx_tmp;
+HXDLIN( 264)			if ((::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) != HX_("\n",0a,00,00,00))) {
+HXLINE( 264)				_hx_tmp = ::borogove::XEP0393_obj::isSpace(styled,end);
             			}
             			else {
-HXLINE( 182)				_hx_tmp = false;
+HXLINE( 264)				_hx_tmp = false;
             			}
-HXDLIN( 182)			if (_hx_tmp) {
-HXLINE( 182)				end = (end + 1);
+HXDLIN( 264)			if (_hx_tmp) {
+HXLINE( 264)				end = (end + 1);
             			}
-HXLINE( 183)			while(true){
-HXLINE( 183)				bool _hx_tmp1;
-HXDLIN( 183)				if ((end < ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled))) {
-HXLINE( 183)					_hx_tmp1 = (::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) != HX_("\n",0a,00,00,00));
+HXLINE( 265)			while(true){
+HXLINE( 265)				bool _hx_tmp1;
+HXDLIN( 265)				if ((end < ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled))) {
+HXLINE( 265)					_hx_tmp1 = (::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) != HX_("\n",0a,00,00,00));
             				}
             				else {
-HXLINE( 183)					_hx_tmp1 = false;
+HXLINE( 265)					_hx_tmp1 = false;
             				}
-HXDLIN( 183)				if (!(_hx_tmp1)) {
-HXLINE( 183)					goto _hx_goto_23;
+HXDLIN( 265)				if (!(_hx_tmp1)) {
+HXLINE( 265)					goto _hx_goto_31;
             				}
-HXLINE( 184)				line = (line + ::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end));
-HXLINE( 185)				end = (end + 1);
+HXLINE( 266)				line = (line + ::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end));
+HXLINE( 267)				end = (end + 1);
             			}
-            			_hx_goto_23:;
-HXLINE( 187)			bool _hx_tmp2;
-HXDLIN( 187)			if ((end < ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled))) {
-HXLINE( 187)				_hx_tmp2 = (::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) == HX_("\n",0a,00,00,00));
+            			_hx_goto_31:;
+HXLINE( 269)			bool _hx_tmp2;
+HXDLIN( 269)			if ((end < ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled))) {
+HXLINE( 269)				_hx_tmp2 = (::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) == HX_("\n",0a,00,00,00));
             			}
             			else {
-HXLINE( 187)				_hx_tmp2 = false;
+HXLINE( 269)				_hx_tmp2 = false;
             			}
-HXDLIN( 187)			if (_hx_tmp2) {
-HXLINE( 188)				end = (end + 1);
+HXDLIN( 269)			if (_hx_tmp2) {
+HXLINE( 270)				end = (end + 1);
             			}
-HXLINE( 190)			lines->push((line + HX_("\n",0a,00,00,00)));
-HXLINE( 191)			line = HX_("",00,00,00,00);
-HXLINE( 192)			if ((::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) == HX_(">",3e,00,00,00))) {
-HXLINE( 193)				end = (end + 1);
+HXLINE( 272)			lines->push((line + HX_("\n",0a,00,00,00)));
+HXLINE( 273)			line = HX_("",00,00,00,00);
+HXLINE( 274)			if ((::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) == HX_(">",3e,00,00,00))) {
+HXLINE( 275)				end = (end + 1);
             			}
             			else {
-HXLINE( 195)				goto _hx_goto_22;
+HXLINE( 277)				goto _hx_goto_30;
             			}
             		}
-            		_hx_goto_22:;
-HXLINE( 199)		 ::borogove::Stanza _hx_tmp3 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("blockquote",cf,56,28,a2),null());
-HXDLIN( 199)		 ::borogove::Stanza _hx_tmp4 = _hx_tmp3->addChildren(::borogove::XEP0393_obj::parse(lines->join(HX_("",00,00,00,00))));
-HXDLIN( 199)		return  ::Dynamic(::hx::Anon_obj::Create(2)
+            		_hx_goto_30:;
+HXLINE( 281)		if ((::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) == HX_("\n",0a,00,00,00))) {
+HXLINE( 282)			end = (end + 1);
+            		}
+HXLINE( 285)		 ::borogove::Stanza _hx_tmp3 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("blockquote",cf,56,28,a2),null());
+HXDLIN( 285)		 ::borogove::Stanza _hx_tmp4 = _hx_tmp3->addChildren(::borogove::XEP0393_obj::parse(lines->join(HX_("",00,00,00,00))));
+HXDLIN( 285)		return  ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("block",4d,75,fc,b4),_hx_tmp4)
             			->setFixed(1,HX_("rest",14,5b,a7,4b),::_UnicodeString::UnicodeString_Impl__obj::substr(styled,end,null())));
             	}
@@ -645,60 +847,72 @@ HXDLIN( 199)		return  ::Dynamic(::hx::Anon_obj::Create(2)
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(XEP0393_obj,parseQuote,return )
 
  ::Dynamic XEP0393_obj::parsePreformatted(::String styled){
-            	HX_GC_STACKFRAME(&_hx_pos_db68028455a3ae0e_203_parsePreformatted)
-HXLINE( 204)		::Array< ::String > lines = ::Array_obj< ::String >::__new(0);
-HXLINE( 205)		::String line = null();
-HXLINE( 206)		int end = 0;
-HXLINE( 207)		int styledLength = ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled);
-HXLINE( 208)		while((end < styledLength)){
-HXLINE( 209)			while(true){
-HXLINE( 209)				bool _hx_tmp;
-HXDLIN( 209)				if ((end < styledLength)) {
-HXLINE( 209)					_hx_tmp = (::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) != HX_("\n",0a,00,00,00));
+            	HX_GC_STACKFRAME(&_hx_pos_db68028455a3ae0e_288_parsePreformatted)
+HXLINE( 289)		::Array< ::String > lines = ::Array_obj< ::String >::__new(0);
+HXLINE( 290)		::String line = HX_("",00,00,00,00);
+HXLINE( 291)		::String lang = null();
+HXLINE( 292)		int end = 0;
+HXLINE( 293)		int styledLength = ::_UnicodeString::UnicodeString_Impl__obj::get_length(styled);
+HXLINE( 294)		while((end < styledLength)){
+HXLINE( 295)			while(true){
+HXLINE( 295)				bool _hx_tmp;
+HXDLIN( 295)				if ((end < styledLength)) {
+HXLINE( 295)					_hx_tmp = (::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) != HX_("\n",0a,00,00,00));
             				}
             				else {
-HXLINE( 209)					_hx_tmp = false;
-            				}
-HXDLIN( 209)				if (!(_hx_tmp)) {
-HXLINE( 209)					goto _hx_goto_26;
+HXLINE( 295)					_hx_tmp = false;
             				}
-HXLINE( 210)				if (::hx::IsNotNull( line )) {
-HXLINE( 210)					line = (line + ::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end));
+HXDLIN( 295)				if (!(_hx_tmp)) {
+HXLINE( 295)					goto _hx_goto_34;
             				}
-HXLINE( 211)				end = (end + 1);
+HXLINE( 296)				line = (line + ::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end));
+HXLINE( 297)				end = (end + 1);
             			}
-            			_hx_goto_26:;
-HXLINE( 213)			bool _hx_tmp1;
-HXDLIN( 213)			if ((end < styledLength)) {
-HXLINE( 213)				_hx_tmp1 = (::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) == HX_("\n",0a,00,00,00));
+            			_hx_goto_34:;
+HXLINE( 299)			bool _hx_tmp1;
+HXDLIN( 299)			if ((end < styledLength)) {
+HXLINE( 299)				_hx_tmp1 = (::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) == HX_("\n",0a,00,00,00));
             			}
             			else {
-HXLINE( 213)				_hx_tmp1 = false;
+HXLINE( 299)				_hx_tmp1 = false;
             			}
-HXDLIN( 213)			if (_hx_tmp1) {
-HXLINE( 214)				end = (end + 1);
+HXDLIN( 299)			if (_hx_tmp1) {
+HXLINE( 300)				end = (end + 1);
             			}
-HXLINE( 216)			if (::hx::IsNotNull( line )) {
-HXLINE( 216)				lines->push((line + HX_("\n",0a,00,00,00)));
+HXLINE( 303)			if (::hx::IsNull( lang )) {
+HXLINE( 304)				lang = ::StringTools_obj::trim(line.substr(3,null()));
+            			}
+            			else {
+HXLINE( 306)				lines->push((line + HX_("\n",0a,00,00,00)));
             			}
-HXLINE( 217)			line = HX_("",00,00,00,00);
-HXLINE( 218)			bool _hx_tmp2;
-HXDLIN( 218)			if ((::_UnicodeString::UnicodeString_Impl__obj::substr(styled,end,4) != HX_("```\n",aa,a7,bd,3f))) {
-HXLINE( 218)				_hx_tmp2 = (::_UnicodeString::UnicodeString_Impl__obj::substr(styled,end,null()) == HX_("```",60,2c,49,00));
+HXLINE( 308)			line = HX_("",00,00,00,00);
+HXLINE( 310)			bool _hx_tmp2;
+HXDLIN( 310)			if ((::_UnicodeString::UnicodeString_Impl__obj::substr(styled,end,4) != HX_("```\n",aa,a7,bd,3f))) {
+HXLINE( 310)				_hx_tmp2 = (::_UnicodeString::UnicodeString_Impl__obj::substr(styled,end,null()) == HX_("```",60,2c,49,00));
             			}
             			else {
-HXLINE( 218)				_hx_tmp2 = true;
+HXLINE( 310)				_hx_tmp2 = true;
             			}
-HXDLIN( 218)			if (_hx_tmp2) {
-HXLINE( 219)				end = (end + 4);
-HXLINE( 220)				goto _hx_goto_25;
+HXDLIN( 310)			if (_hx_tmp2) {
+HXLINE( 311)				end = (end + 4);
+HXLINE( 312)				goto _hx_goto_33;
             			}
             		}
-            		_hx_goto_25:;
-HXLINE( 224)		 ::borogove::Stanza _hx_tmp3 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("pre",23,60,55,00),null());
-HXDLIN( 224)		 ::borogove::Stanza _hx_tmp4 = _hx_tmp3->text(lines->join(HX_("",00,00,00,00)));
-HXDLIN( 224)		return  ::Dynamic(::hx::Anon_obj::Create(2)
-            			->setFixed(0,HX_("block",4d,75,fc,b4),_hx_tmp4)
+            		_hx_goto_33:;
+HXLINE( 316)		if ((::_UnicodeString::UnicodeString_Impl__obj::charAt(styled,end) == HX_("\n",0a,00,00,00))) {
+HXLINE( 317)			end = (end + 1);
+            		}
+HXLINE( 320)		 ::borogove::Stanza block =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("pre",23,60,55,00),null());
+HXLINE( 321)		if ((lang != HX_("",00,00,00,00))) {
+HXLINE( 322)			 ::borogove::Stanza _hx_tmp3 = block->tag(HX_("code",2d,b1,c4,41), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(0,HX_("class",38,78,58,48),(HX_("language-",d5,cc,3e,55) + lang))));
+HXDLIN( 322)			_hx_tmp3->text(lines->join(HX_("",00,00,00,00)));
+            		}
+            		else {
+HXLINE( 324)			block->text(lines->join(HX_("",00,00,00,00)));
+            		}
+HXLINE( 327)		return  ::Dynamic(::hx::Anon_obj::Create(2)
+            			->setFixed(0,HX_("block",4d,75,fc,b4),block)
             			->setFixed(1,HX_("rest",14,5b,a7,4b),::_UnicodeString::UnicodeString_Impl__obj::substr(styled,end,null())));
             	}
 
@@ -706,8 +920,8 @@ HXDLIN( 224)		return  ::Dynamic(::hx::Anon_obj::Create(2)
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(XEP0393_obj,parsePreformatted,return )
 
 bool XEP0393_obj::isSpace(::String s,int pos){
-            	HX_STACKFRAME(&_hx_pos_db68028455a3ae0e_229_isSpace)
-HXDLIN( 229)		return ::StringTools_obj::isSpace(::_UnicodeString::UnicodeString_Impl__obj::charAt(s,pos),0);
+            	HX_STACKFRAME(&_hx_pos_db68028455a3ae0e_332_isSpace)
+HXDLIN( 332)		return ::StringTools_obj::isSpace(::_UnicodeString::UnicodeString_Impl__obj::charAt(s,pos),0);
             	}
 
 
@@ -736,6 +950,7 @@ bool XEP0393_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::P
 	case 10:
 		if (HX_FIELD_EQ(inName,"renderNode") ) { outValue = renderNode_dyn(); return true; }
 		if (HX_FIELD_EQ(inName,"parseSpans") ) { outValue = parseSpans_dyn(); return true; }
+		if (HX_FIELD_EQ(inName,"mergeSpans") ) { outValue = mergeSpans_dyn(); return true; }
 		if (HX_FIELD_EQ(inName,"parseBlock") ) { outValue = parseBlock_dyn(); return true; }
 		if (HX_FIELD_EQ(inName,"parseQuote") ) { outValue = parseQuote_dyn(); return true; }
 		break;
@@ -757,6 +972,7 @@ static ::String XEP0393_obj_sStaticFields[] = {
 	HX_("render",56,6b,29,05),
 	HX_("renderNode",78,04,14,e6),
 	HX_("parseSpans",36,dd,47,ab),
+	HX_("mergeSpans",91,88,2c,c3),
 	HX_("parseSpan",9d,2c,ff,d3),
 	HX_("parseBlock",1a,bc,dd,de),
 	HX_("parseQuote",09,6a,d3,87),
diff --git a/Sources/c_borogove/src/borogove/_Chat/Chat_Fields_.cpp b/Sources/c_borogove/src/borogove/_Chat/Chat_Fields_.cpp
new file mode 100644
index 0000000..e679c27
--- /dev/null
+++ b/Sources/c_borogove/src/borogove/_Chat/Chat_Fields_.cpp
@@ -0,0 +1,116 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_borogove__Chat_Chat_Fields_
+#include <borogove/_Chat/Chat_Fields_.h>
+#endif
+
+HX_LOCAL_STACK_FRAME(_hx_pos_4c0b07cf507a9a36_35_boot,"borogove._Chat.Chat_Fields_","boot",0x0587c73d,"borogove._Chat.Chat_Fields_.boot","borogove/Chat.hx",35,0x1763ae98)
+namespace borogove{
+namespace _Chat{
+
+void Chat_Fields__obj::__construct() { }
+
+Dynamic Chat_Fields__obj::__CreateEmpty() { return new Chat_Fields__obj; }
+
+void *Chat_Fields__obj::_hx_vtable = 0;
+
+Dynamic Chat_Fields__obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< Chat_Fields__obj > _hx_result = new Chat_Fields__obj();
+	_hx_result->__construct();
+	return _hx_result;
+}
+
+bool Chat_Fields__obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x6a4e85b5;
+}
+
+::String Chat_Fields__obj::nullSentinel;
+
+
+Chat_Fields__obj::Chat_Fields__obj()
+{
+}
+
+bool Chat_Fields__obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 12:
+		if (HX_FIELD_EQ(inName,"nullSentinel") ) { outValue = ( nullSentinel ); return true; }
+	}
+	return false;
+}
+
+bool Chat_Fields__obj::__SetStatic(const ::String &inName,Dynamic &ioValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 12:
+		if (HX_FIELD_EQ(inName,"nullSentinel") ) { nullSentinel=ioValue.Cast< ::String >(); return true; }
+	}
+	return false;
+}
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo *Chat_Fields__obj_sMemberStorageInfo = 0;
+static ::hx::StaticInfo Chat_Fields__obj_sStaticStorageInfo[] = {
+	{::hx::fsString,(void *) &Chat_Fields__obj::nullSentinel,HX_("nullSentinel",8b,0a,f6,41)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+#endif
+
+static void Chat_Fields__obj_sMarkStatics(HX_MARK_PARAMS) {
+	HX_MARK_MEMBER_NAME(Chat_Fields__obj::nullSentinel,"nullSentinel");
+};
+
+#ifdef HXCPP_VISIT_ALLOCS
+static void Chat_Fields__obj_sVisitStatics(HX_VISIT_PARAMS) {
+	HX_VISIT_MEMBER_NAME(Chat_Fields__obj::nullSentinel,"nullSentinel");
+};
+
+#endif
+
+::hx::Class Chat_Fields__obj::__mClass;
+
+static ::String Chat_Fields__obj_sStaticFields[] = {
+	HX_("nullSentinel",8b,0a,f6,41),
+	::String(null())
+};
+
+void Chat_Fields__obj::__register()
+{
+	Chat_Fields__obj _hx_dummy;
+	Chat_Fields__obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("borogove._Chat.Chat_Fields_",43,f9,44,e8);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &Chat_Fields__obj::__GetStatic;
+	__mClass->mSetStaticField = &Chat_Fields__obj::__SetStatic;
+	__mClass->mMarkFunc = Chat_Fields__obj_sMarkStatics;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(Chat_Fields__obj_sStaticFields);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(0 /* sMemberFields */);
+	__mClass->mCanCast = ::hx::TCanCast< Chat_Fields__obj >;
+#ifdef HXCPP_VISIT_ALLOCS
+	__mClass->mVisitFunc = Chat_Fields__obj_sVisitStatics;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = Chat_Fields__obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = Chat_Fields__obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+void Chat_Fields__obj::__boot()
+{
+{
+            	HX_STACKFRAME(&_hx_pos_4c0b07cf507a9a36_35_boot)
+HXDLIN(  35)		nullSentinel = HX_("65e2ca3a-a13e-490c-bfe6-9c6b4c8651d0",04,a5,44,4c);
+            	}
+}
+
+} // end namespace borogove
+} // end namespace _Chat
diff --git a/Sources/c_borogove/src/borogove/_DataForm/DataForm_Impl_.cpp b/Sources/c_borogove/src/borogove/_DataForm/DataForm_Impl_.cpp
index 6875a18..0d7737f 100644
--- a/Sources/c_borogove/src/borogove/_DataForm/DataForm_Impl_.cpp
+++ b/Sources/c_borogove/src/borogove/_DataForm/DataForm_Impl_.cpp
@@ -14,7 +14,7 @@
 #include <haxe/Log.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_a4f53da467a636c2_37_field,"borogove._DataForm.DataForm_Impl_","field",0xe4ae26c8,"borogove._DataForm.DataForm_Impl_.field","borogove/DataForm.hx",37,0x710703a2)
+HX_LOCAL_STACK_FRAME(_hx_pos_a4f53da467a636c2_40_field,"borogove._DataForm.DataForm_Impl_","field",0xe4ae26c8,"borogove._DataForm.DataForm_Impl_.field","borogove/DataForm.hx",40,0x710703a2)
 namespace borogove{
 namespace _DataForm{
 
@@ -36,31 +36,31 @@ bool DataForm_Impl__obj::_hx_isInstanceOf(int inClassId) {
 }
 
  ::borogove::Stanza DataForm_Impl__obj::field( ::borogove::Stanza this1,::String name){
-            	HX_STACKFRAME(&_hx_pos_a4f53da467a636c2_37_field)
-HXLINE(  38)		::Array< ::Dynamic> _this = this1->allTags(HX_("field",ba,94,93,00),null());
-HXDLIN(  38)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN(  38)		{
-HXLINE(  38)			int _g1 = 0;
-HXDLIN(  38)			while((_g1 < _this->length)){
-HXLINE(  38)				 ::borogove::Stanza v = _this->__get(_g1).StaticCast<  ::borogove::Stanza >();
-HXDLIN(  38)				_g1 = (_g1 + 1);
-HXDLIN(  38)				::String tmp = ( (::String)(::Reflect_obj::field(v->attr,HX_("var",e7,de,59,00))) );
-HXDLIN(  38)				::String _hx_tmp;
-HXDLIN(  38)				if (::hx::IsNotNull( tmp )) {
-HXLINE(  38)					_hx_tmp = tmp;
+            	HX_STACKFRAME(&_hx_pos_a4f53da467a636c2_40_field)
+HXLINE(  41)		::Array< ::Dynamic> _this = this1->allTags(HX_("field",ba,94,93,00),null());
+HXDLIN(  41)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN(  41)		{
+HXLINE(  41)			int _g1 = 0;
+HXDLIN(  41)			while((_g1 < _this->length)){
+HXLINE(  41)				 ::borogove::Stanza v = _this->__get(_g1).StaticCast<  ::borogove::Stanza >();
+HXDLIN(  41)				_g1 = (_g1 + 1);
+HXDLIN(  41)				::String tmp = ( (::String)(::Reflect_obj::field(v->attr,HX_("var",e7,de,59,00))) );
+HXDLIN(  41)				::String _hx_tmp;
+HXDLIN(  41)				if (::hx::IsNotNull( tmp )) {
+HXLINE(  41)					_hx_tmp = tmp;
             				}
             				else {
-HXLINE(  38)					_hx_tmp = HX_("",00,00,00,00);
+HXLINE(  41)					_hx_tmp = HX_("",00,00,00,00);
             				}
-HXDLIN(  38)				if ((_hx_tmp == name)) {
-HXLINE(  38)					_g->push(v);
+HXDLIN(  41)				if ((_hx_tmp == name)) {
+HXLINE(  41)					_g->push(v);
             				}
             			}
             		}
-HXLINE(  39)		if ((_g->length > 1)) {
-HXLINE(  40)			::haxe::Log_obj::trace((HX_("Multiple fields matching ",4c,70,ff,c5) + name),::hx::SourceInfo(HX_("borogove/DataForm.hx",a2,03,07,71),40,HX_("borogove._DataForm.DataForm_Impl_",fc,d3,2e,49),HX_("field",ba,94,93,00)));
+HXLINE(  42)		if ((_g->length > 1)) {
+HXLINE(  43)			::haxe::Log_obj::trace((HX_("Multiple fields matching ",4c,70,ff,c5) + name),::hx::SourceInfo(HX_("borogove/DataForm.hx",a2,03,07,71),43,HX_("borogove._DataForm.DataForm_Impl_",fc,d3,2e,49),HX_("field",ba,94,93,00)));
             		}
-HXLINE(  42)		return _g->__get(0).StaticCast<  ::borogove::Stanza >();
+HXLINE(  45)		return _g->__get(0).StaticCast<  ::borogove::Stanza >();
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/_DataForm/Field_Impl_.cpp b/Sources/c_borogove/src/borogove/_DataForm/Field_Impl_.cpp
index e04deee..72e7b55 100644
--- a/Sources/c_borogove/src/borogove/_DataForm/Field_Impl_.cpp
+++ b/Sources/c_borogove/src/borogove/_DataForm/Field_Impl_.cpp
@@ -11,13 +11,13 @@
 #include <borogove/_DataForm/Field_Impl_.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_4f5145cd5a0b59c7_72_get_value,"borogove._DataForm.Field_Impl_","get_value",0x95f920a6,"borogove._DataForm.Field_Impl_.get_value","borogove/DataForm.hx",72,0x710703a2)
-HX_LOCAL_STACK_FRAME(_hx_pos_4f5145cd5a0b59c7_84_set_value,"borogove._DataForm.Field_Impl_","set_value",0x794a0cb2,"borogove._DataForm.Field_Impl_.set_value","borogove/DataForm.hx",84,0x710703a2)
-HX_LOCAL_STACK_FRAME(_hx_pos_4f5145cd5a0b59c7_105_get_datatype,"borogove._DataForm.Field_Impl_","get_datatype",0xf3c5f3cf,"borogove._DataForm.Field_Impl_.get_datatype","borogove/DataForm.hx",105,0x710703a2)
+HX_LOCAL_STACK_FRAME(_hx_pos_4f5145cd5a0b59c7_75_get_value,"borogove._DataForm.Field_Impl_","get_value",0x95f920a6,"borogove._DataForm.Field_Impl_.get_value","borogove/DataForm.hx",75,0x710703a2)
+HX_LOCAL_STACK_FRAME(_hx_pos_4f5145cd5a0b59c7_87_set_value,"borogove._DataForm.Field_Impl_","set_value",0x794a0cb2,"borogove._DataForm.Field_Impl_.set_value","borogove/DataForm.hx",87,0x710703a2)
+HX_LOCAL_STACK_FRAME(_hx_pos_4f5145cd5a0b59c7_108_get_datatype,"borogove._DataForm.Field_Impl_","get_datatype",0xf3c5f3cf,"borogove._DataForm.Field_Impl_.get_datatype","borogove/DataForm.hx",108,0x710703a2)
 static const ::String _hx_array_data_f99683cc_5[] = {
 	HX_("jid-single",50,8e,f5,83),HX_("jid-multi",b1,73,6d,1a),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_4f5145cd5a0b59c7_118_get_options,"borogove._DataForm.Field_Impl_","get_options",0x4e914bd3,"borogove._DataForm.Field_Impl_.get_options","borogove/DataForm.hx",118,0x710703a2)
+HX_LOCAL_STACK_FRAME(_hx_pos_4f5145cd5a0b59c7_121_get_options,"borogove._DataForm.Field_Impl_","get_options",0x4e914bd3,"borogove._DataForm.Field_Impl_.get_options","borogove/DataForm.hx",121,0x710703a2)
 namespace borogove{
 namespace _DataForm{
 
@@ -39,85 +39,85 @@ bool Field_Impl__obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::Array< ::String > Field_Impl__obj::get_value( ::borogove::Stanza this1){
-            	HX_STACKFRAME(&_hx_pos_4f5145cd5a0b59c7_72_get_value)
-HXLINE(  73)		bool isbool = (::borogove::_DataForm::Field_Impl__obj::get_datatype(this1) == HX_("xs:boolean",a9,21,c7,58));
-HXLINE(  74)		::Array< ::Dynamic> _this = this1->allTags(HX_("value",71,7f,b8,31),null());
-HXDLIN(  74)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN(  74)		{
-HXLINE(  74)			int _g = 0;
-HXDLIN(  74)			int _g1 = _this->length;
-HXDLIN(  74)			while((_g < _g1)){
-HXLINE(  74)				_g = (_g + 1);
-HXDLIN(  74)				int i = (_g - 1);
-HXDLIN(  74)				{
-HXLINE(  75)					::String txt = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
-HXLINE(  74)					::String inValue;
-HXLINE(  76)					if (isbool) {
-HXLINE(  77)						if (::borogove::Stanza_obj::parseXmlBool(txt)) {
-HXLINE(  74)							inValue = HX_("true",4e,a7,03,4d);
+            	HX_STACKFRAME(&_hx_pos_4f5145cd5a0b59c7_75_get_value)
+HXLINE(  76)		bool isbool = (::borogove::_DataForm::Field_Impl__obj::get_datatype(this1) == HX_("xs:boolean",a9,21,c7,58));
+HXLINE(  77)		::Array< ::Dynamic> _this = this1->allTags(HX_("value",71,7f,b8,31),null());
+HXDLIN(  77)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN(  77)		{
+HXLINE(  77)			int _g = 0;
+HXDLIN(  77)			int _g1 = _this->length;
+HXDLIN(  77)			while((_g < _g1)){
+HXLINE(  77)				_g = (_g + 1);
+HXDLIN(  77)				int i = (_g - 1);
+HXDLIN(  77)				{
+HXLINE(  78)					::String txt = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->getText();
+HXLINE(  77)					::String inValue;
+HXLINE(  79)					if (isbool) {
+HXLINE(  80)						if (::borogove::Stanza_obj::parseXmlBool(txt)) {
+HXLINE(  77)							inValue = HX_("true",4e,a7,03,4d);
             						}
             						else {
-HXLINE(  74)							inValue = HX_("false",a3,35,4f,fb);
+HXLINE(  77)							inValue = HX_("false",a3,35,4f,fb);
             						}
             					}
             					else {
-HXLINE(  74)						inValue = txt;
+HXLINE(  77)						inValue = txt;
             					}
-HXDLIN(  74)					result->__unsafe_set(i,inValue);
+HXDLIN(  77)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN(  74)		return result;
+HXDLIN(  77)		return result;
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Field_Impl__obj,get_value,return )
 
 ::Array< ::String > Field_Impl__obj::set_value( ::borogove::Stanza this1,::Array< ::String > val){
-            	HX_STACKFRAME(&_hx_pos_4f5145cd5a0b59c7_84_set_value)
-HXLINE(  85)		this1->removeChildren(HX_("value",71,7f,b8,31),null());
-HXLINE(  86)		{
-HXLINE(  86)			int _g = 0;
-HXDLIN(  86)			while((_g < val->length)){
-HXLINE(  86)				::String v = val->__get(_g);
-HXDLIN(  86)				_g = (_g + 1);
-HXLINE(  87)				this1->textTag(HX_("value",71,7f,b8,31),v,null());
+            	HX_STACKFRAME(&_hx_pos_4f5145cd5a0b59c7_87_set_value)
+HXLINE(  88)		this1->removeChildren(HX_("value",71,7f,b8,31),null());
+HXLINE(  89)		{
+HXLINE(  89)			int _g = 0;
+HXDLIN(  89)			while((_g < val->length)){
+HXLINE(  89)				::String v = val->__get(_g);
+HXDLIN(  89)				_g = (_g + 1);
+HXLINE(  90)				this1->textTag(HX_("value",71,7f,b8,31),v,null());
             			}
             		}
-HXLINE(  89)		return val;
+HXLINE(  92)		return val;
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC2(Field_Impl__obj,set_value,return )
 
 ::String Field_Impl__obj::get_datatype( ::borogove::Stanza this1){
-            	HX_STACKFRAME(&_hx_pos_4f5145cd5a0b59c7_105_get_datatype)
-HXLINE( 106)		 ::borogove::Stanza validate = this1->getChild(HX_("validate",96,d0,e3,04),HX_("http://jabber.org/protocol/xdata-validate",55,3c,d4,d4));
-HXLINE( 107)		bool _hx_tmp;
-HXDLIN( 107)		if (::hx::IsNotNull( validate )) {
-HXLINE( 107)			_hx_tmp = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(validate->attr,HX_("datatype",e4,a5,a3,a1))) ) );
+            	HX_STACKFRAME(&_hx_pos_4f5145cd5a0b59c7_108_get_datatype)
+HXLINE( 109)		 ::borogove::Stanza validate = this1->getChild(HX_("validate",96,d0,e3,04),HX_("http://jabber.org/protocol/xdata-validate",55,3c,d4,d4));
+HXLINE( 110)		bool _hx_tmp;
+HXDLIN( 110)		if (::hx::IsNotNull( validate )) {
+HXLINE( 110)			_hx_tmp = ::hx::IsNotNull( ( (::String)(::Reflect_obj::field(validate->attr,HX_("datatype",e4,a5,a3,a1))) ) );
             		}
             		else {
-HXLINE( 107)			_hx_tmp = false;
+HXLINE( 110)			_hx_tmp = false;
             		}
-HXDLIN( 107)		if (_hx_tmp) {
-HXLINE( 108)			return ( (::String)(::Reflect_obj::field(validate->attr,HX_("datatype",e4,a5,a3,a1))) );
+HXDLIN( 110)		if (_hx_tmp) {
+HXLINE( 111)			return ( (::String)(::Reflect_obj::field(validate->attr,HX_("datatype",e4,a5,a3,a1))) );
             		}
-HXLINE( 110)		if (::Array_obj< ::String >::fromData( _hx_array_data_f99683cc_5,2)->contains(( (::String)(::Reflect_obj::field(this1->attr,HX_("type",ba,f2,08,4d))) ))) {
-HXLINE( 111)			return HX_("jid",c5,ca,50,00);
+HXLINE( 113)		if (::Array_obj< ::String >::fromData( _hx_array_data_f99683cc_5,2)->contains(( (::String)(::Reflect_obj::field(this1->attr,HX_("type",ba,f2,08,4d))) ))) {
+HXLINE( 114)			return HX_("jid",c5,ca,50,00);
             		}
-HXLINE( 113)		if ((( (::String)(::Reflect_obj::field(this1->attr,HX_("type",ba,f2,08,4d))) ) == HX_("boolean",a8,ea,fe,7d))) {
-HXLINE( 113)			return HX_("xs:boolean",a9,21,c7,58);
+HXLINE( 116)		if ((( (::String)(::Reflect_obj::field(this1->attr,HX_("type",ba,f2,08,4d))) ) == HX_("boolean",a8,ea,fe,7d))) {
+HXLINE( 116)			return HX_("xs:boolean",a9,21,c7,58);
             		}
-HXLINE( 114)		return HX_("xs:string",f0,8c,df,0f);
+HXLINE( 117)		return HX_("xs:string",f0,8c,df,0f);
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Field_Impl__obj,get_datatype,return )
 
 ::Array< ::Dynamic> Field_Impl__obj::get_options( ::borogove::Stanza this1){
-            	HX_STACKFRAME(&_hx_pos_4f5145cd5a0b59c7_118_get_options)
-HXDLIN( 118)		return this1->allTags(HX_("option",75,d3,7a,2b),null());
+            	HX_STACKFRAME(&_hx_pos_4f5145cd5a0b59c7_121_get_options)
+HXDLIN( 121)		return this1->allTags(HX_("option",75,d3,7a,2b),null());
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/_Presence/Presence_Impl_.cpp b/Sources/c_borogove/src/borogove/_Presence/Presence_Impl_.cpp
new file mode 100644
index 0000000..a553332
--- /dev/null
+++ b/Sources/c_borogove/src/borogove/_Presence/Presence_Impl_.cpp
@@ -0,0 +1,343 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_Reflect
+#include <Reflect.h>
+#endif
+#ifndef INCLUDED_Std
+#include <Std.h>
+#endif
+#ifndef INCLUDED_borogove_Caps
+#include <borogove/Caps.h>
+#endif
+#ifndef INCLUDED_borogove_Hash
+#include <borogove/Hash.h>
+#endif
+#ifndef INCLUDED_borogove_Role
+#include <borogove/Role.h>
+#endif
+#ifndef INCLUDED_borogove_Stanza
+#include <borogove/Stanza.h>
+#endif
+#ifndef INCLUDED_borogove__Presence_Presence_Impl_
+#include <borogove/_Presence/Presence_Impl_.h>
+#endif
+
+HX_LOCAL_STACK_FRAME(_hx_pos_b686ec129cbf220d_31__new,"borogove._Presence.Presence_Impl_","_new",0x025878b3,"borogove._Presence.Presence_Impl_._new","borogove/Presence.hx",31,0xe43e7c15)
+HX_LOCAL_STACK_FRAME(_hx_pos_b686ec129cbf220d_42_get_capsNode,"borogove._Presence.Presence_Impl_","get_capsNode",0xd956301e,"borogove._Presence.Presence_Impl_.get_capsNode","borogove/Presence.hx",42,0xe43e7c15)
+HX_LOCAL_STACK_FRAME(_hx_pos_b686ec129cbf220d_47_get_ver,"borogove._Presence.Presence_Impl_","get_ver",0x1388a6e8,"borogove._Presence.Presence_Impl_.get_ver","borogove/Presence.hx",47,0xe43e7c15)
+HX_LOCAL_STACK_FRAME(_hx_pos_b686ec129cbf220d_53_get_mucUser,"borogove._Presence.Presence_Impl_","get_mucUser",0x15c2deeb,"borogove._Presence.Presence_Impl_.get_mucUser","borogove/Presence.hx",53,0xe43e7c15)
+HX_LOCAL_STACK_FRAME(_hx_pos_b686ec129cbf220d_57_get_hats,"borogove._Presence.Presence_Impl_","get_hats",0xfac56093,"borogove._Presence.Presence_Impl_.get_hats","borogove/Presence.hx",57,0xe43e7c15)
+HX_LOCAL_STACK_FRAME(_hx_pos_b686ec129cbf220d_60_get_avatarHash,"borogove._Presence.Presence_Impl_","get_avatarHash",0x5ca962a2,"borogove._Presence.Presence_Impl_.get_avatarHash","borogove/Presence.hx",60,0xe43e7c15)
+HX_LOCAL_STACK_FRAME(_hx_pos_b686ec129cbf220d_66_get_type,"borogove._Presence.Presence_Impl_","get_type",0x02c62295,"borogove._Presence.Presence_Impl_.get_type","borogove/Presence.hx",66,0xe43e7c15)
+HX_LOCAL_STACK_FRAME(_hx_pos_b686ec129cbf220d_69_get_show,"borogove._Presence.Presence_Impl_","get_show",0x021004d8,"borogove._Presence.Presence_Impl_.get_show","borogove/Presence.hx",69,0xe43e7c15)
+HX_LOCAL_STACK_FRAME(_hx_pos_b686ec129cbf220d_81_get_priority,"borogove._Presence.Presence_Impl_","get_priority",0x818034bf,"borogove._Presence.Presence_Impl_.get_priority","borogove/Presence.hx",81,0xe43e7c15)
+namespace borogove{
+namespace _Presence{
+
+void Presence_Impl__obj::__construct() { }
+
+Dynamic Presence_Impl__obj::__CreateEmpty() { return new Presence_Impl__obj; }
+
+void *Presence_Impl__obj::_hx_vtable = 0;
+
+Dynamic Presence_Impl__obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< Presence_Impl__obj > _hx_result = new Presence_Impl__obj();
+	_hx_result->__construct();
+	return _hx_result;
+}
+
+bool Presence_Impl__obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x2cdd82ec;
+}
+
+ ::borogove::Stanza Presence_Impl__obj::_new( ::borogove::Caps caps, ::borogove::Stanza mucUser, ::borogove::Hash avatarHash){
+            	HX_GC_STACKFRAME(&_hx_pos_b686ec129cbf220d_31__new)
+HXLINE(  32)		 ::borogove::Stanza stanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("presence",3b,52,d7,66), ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("jabber:client",21,64,c5,e4))));
+HXLINE(  33)		if (::hx::IsNotNull( caps )) {
+HXLINE(  33)			caps->addC(stanza);
+            		}
+HXLINE(  34)		if (::hx::IsNotNull( mucUser )) {
+HXLINE(  34)			stanza->addChild(mucUser);
+            		}
+HXLINE(  35)		if (::hx::IsNotNull( avatarHash )) {
+HXLINE(  36)			 ::borogove::Stanza _hx_tmp = stanza->tag(HX_("x",78,00,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("vcard-temp:x:update",6a,98,84,45))));
+HXDLIN(  36)			_hx_tmp->textTag(HX_("photo",b2,c8,f3,c1),avatarHash->toHex(),null())->up();
+            		}
+HXLINE(  31)		return stanza;
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC3(Presence_Impl__obj,_new,return )
+
+::String Presence_Impl__obj::get_capsNode( ::borogove::Stanza this1){
+            	HX_STACKFRAME(&_hx_pos_b686ec129cbf220d_42_get_capsNode)
+HXLINE(  43)		 ::borogove::Stanza c = this1->getChild(HX_("c",63,00,00,00),HX_("http://jabber.org/protocol/caps",95,d0,90,e2));
+HXLINE(  44)		 ::Dynamic tmp;
+HXDLIN(  44)		if (::hx::IsNotNull( c )) {
+HXLINE(  44)			tmp = c->attr;
+            		}
+            		else {
+HXLINE(  44)			tmp = null();
+            		}
+HXDLIN(  44)		if (::hx::IsNotNull( tmp )) {
+HXLINE(  44)			return ( (::String)(::Reflect_obj::field(tmp,HX_("node",02,0a,0a,49))) );
+            		}
+            		else {
+HXLINE(  44)			return null();
+            		}
+HXDLIN(  44)		return null();
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Presence_Impl__obj,get_capsNode,return )
+
+::String Presence_Impl__obj::get_ver( ::borogove::Stanza this1){
+            	HX_STACKFRAME(&_hx_pos_b686ec129cbf220d_47_get_ver)
+HXLINE(  48)		 ::borogove::Stanza c = this1->getChild(HX_("c",63,00,00,00),HX_("http://jabber.org/protocol/caps",95,d0,90,e2));
+HXLINE(  49)		 ::Dynamic tmp;
+HXDLIN(  49)		if (::hx::IsNotNull( c )) {
+HXLINE(  49)			tmp = c->attr;
+            		}
+            		else {
+HXLINE(  49)			tmp = null();
+            		}
+HXDLIN(  49)		if (::hx::IsNotNull( tmp )) {
+HXLINE(  49)			return ( (::String)(::Reflect_obj::field(tmp,HX_("ver",63,e2,59,00))) );
+            		}
+            		else {
+HXLINE(  49)			return null();
+            		}
+HXDLIN(  49)		return null();
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Presence_Impl__obj,get_ver,return )
+
+ ::borogove::Stanza Presence_Impl__obj::get_mucUser( ::borogove::Stanza this1){
+            	HX_STACKFRAME(&_hx_pos_b686ec129cbf220d_53_get_mucUser)
+HXDLIN(  53)		return this1->getChild(HX_("x",78,00,00,00),HX_("http://jabber.org/protocol/muc#user",87,74,8e,14));
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Presence_Impl__obj,get_mucUser,return )
+
+::Array< ::Dynamic> Presence_Impl__obj::get_hats( ::borogove::Stanza this1){
+            	HX_GC_STACKFRAME(&_hx_pos_b686ec129cbf220d_57_get_hats)
+HXDLIN(  57)		::Array< ::Dynamic> _this;
+HXDLIN(  57)		 ::borogove::Stanza tmp = this1->getChild(HX_("hats",b8,30,08,45),HX_("urn:xmpp:hats:0",8a,fe,c7,65));
+HXDLIN(  57)		::Array< ::Dynamic> tmp1;
+HXDLIN(  57)		if (::hx::IsNotNull( tmp )) {
+HXDLIN(  57)			tmp1 = tmp->allTags(HX_("hat",5b,3f,4f,00),null());
+            		}
+            		else {
+HXDLIN(  57)			tmp1 = null();
+            		}
+HXDLIN(  57)		if (::hx::IsNotNull( tmp1 )) {
+HXDLIN(  57)			_this = tmp1;
+            		}
+            		else {
+HXDLIN(  57)			_this = ::Array_obj< ::Dynamic>::__new(0);
+            		}
+HXDLIN(  57)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_this->length);
+HXDLIN(  57)		{
+HXDLIN(  57)			int _g = 0;
+HXDLIN(  57)			int _g1 = _this->length;
+HXDLIN(  57)			while((_g < _g1)){
+HXDLIN(  57)				_g = (_g + 1);
+HXDLIN(  57)				int i = (_g - 1);
+HXDLIN(  57)				{
+HXDLIN(  57)					 ::borogove::Stanza hat = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) );
+HXDLIN(  57)					::String inValue;
+HXDLIN(  57)					::String tmp2 = ( (::String)(::Reflect_obj::field(hat->attr,HX_("uri",6c,2b,59,00))) );
+HXDLIN(  57)					if (::hx::IsNotNull( tmp2 )) {
+HXDLIN(  57)						inValue = tmp2;
+            					}
+            					else {
+HXDLIN(  57)						inValue = HX_("",00,00,00,00);
+            					}
+HXDLIN(  57)					::String tmp3 = ( (::String)(::Reflect_obj::field(hat->attr,HX_("title",98,15,3b,10))) );
+HXDLIN(  57)					::String inValue1;
+HXDLIN(  57)					if (::hx::IsNotNull( tmp3 )) {
+HXDLIN(  57)						inValue1 = tmp3;
+            					}
+            					else {
+HXDLIN(  57)						inValue1 = HX_("",00,00,00,00);
+            					}
+HXDLIN(  57)					result->__unsafe_set(i, ::borogove::Role_obj::__alloc( HX_CTX ,inValue,inValue1));
+            				}
+            			}
+            		}
+HXDLIN(  57)		return result;
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Presence_Impl__obj,get_hats,return )
+
+ ::borogove::Hash Presence_Impl__obj::get_avatarHash( ::borogove::Stanza this1){
+            	HX_STACKFRAME(&_hx_pos_b686ec129cbf220d_60_get_avatarHash)
+HXLINE(  61)		::String avatarSha1Hex = this1->findText(HX_("{vcard-temp:x:update}x/photo#",f6,a1,33,28));
+HXLINE(  62)		bool _hx_tmp;
+HXDLIN(  62)		if (::hx::IsNotNull( avatarSha1Hex )) {
+HXLINE(  62)			_hx_tmp = (avatarSha1Hex == HX_("",00,00,00,00));
+            		}
+            		else {
+HXLINE(  62)			_hx_tmp = true;
+            		}
+HXDLIN(  62)		if (_hx_tmp) {
+HXLINE(  62)			return null();
+            		}
+            		else {
+HXLINE(  62)			return ::borogove::Hash_obj::fromHex(HX_("sha-1",90,a8,1c,7c),avatarSha1Hex);
+            		}
+HXDLIN(  62)		return null();
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Presence_Impl__obj,get_avatarHash,return )
+
+::String Presence_Impl__obj::get_type( ::borogove::Stanza this1){
+            	HX_STACKFRAME(&_hx_pos_b686ec129cbf220d_66_get_type)
+HXDLIN(  66)		return ( (::String)(::Reflect_obj::field(this1->attr,HX_("type",ba,f2,08,4d))) );
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Presence_Impl__obj,get_type,return )
+
+int Presence_Impl__obj::get_show( ::borogove::Stanza this1){
+            	HX_STACKFRAME(&_hx_pos_b686ec129cbf220d_69_get_show)
+HXLINE(  70)		if ((( (::String)(::Reflect_obj::field(this1->attr,HX_("type",ba,f2,08,4d))) ) == HX_("unavailable",50,e0,29,fd))) {
+HXLINE(  70)			return 4;
+            		}
+HXLINE(  72)		::String _g = this1->getChildText(HX_("show",fd,d4,52,4c),null());
+HXDLIN(  72)		if (::hx::IsNull( _g )) {
+HXLINE(  76)			return 0;
+            		}
+            		else {
+HXLINE(  72)			::String _hx_switch_0 = _g;
+            			if (  (_hx_switch_0==HX_("away",6e,53,78,40)) ){
+HXLINE(  73)				return 1;
+HXDLIN(  73)				goto _hx_goto_8;
+            			}
+            			if (  (_hx_switch_0==HX_("dnd",9a,41,4c,00)) ){
+HXLINE(  74)				return 2;
+HXDLIN(  74)				goto _hx_goto_8;
+            			}
+            			if (  (_hx_switch_0==HX_("xa",e9,68,00,00)) ){
+HXLINE(  75)				return 3;
+HXDLIN(  75)				goto _hx_goto_8;
+            			}
+            			/* default */{
+HXLINE(  76)				return 0;
+            			}
+            			_hx_goto_8:;
+            		}
+HXLINE(  72)		return null();
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Presence_Impl__obj,get_show,return )
+
+int Presence_Impl__obj::get_priority( ::borogove::Stanza this1){
+            	HX_STACKFRAME(&_hx_pos_b686ec129cbf220d_81_get_priority)
+HXDLIN(  81)		::String tmp = this1->getChildText(HX_("priority",64,7b,3e,bb),null());
+HXDLIN(  81)		::String tmp1;
+HXDLIN(  81)		if (::hx::IsNotNull( tmp )) {
+HXDLIN(  81)			tmp1 = tmp;
+            		}
+            		else {
+HXDLIN(  81)			tmp1 = HX_("0",30,00,00,00);
+            		}
+HXDLIN(  81)		 ::Dynamic tmp2 = ::Std_obj::parseInt(tmp1);
+HXDLIN(  81)		if (::hx::IsNotNull( tmp2 )) {
+HXDLIN(  81)			return ( (int)(tmp2) );
+            		}
+            		else {
+HXDLIN(  81)			return 0;
+            		}
+HXDLIN(  81)		return 0;
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Presence_Impl__obj,get_priority,return )
+
+
+Presence_Impl__obj::Presence_Impl__obj()
+{
+}
+
+bool Presence_Impl__obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 4:
+		if (HX_FIELD_EQ(inName,"_new") ) { outValue = _new_dyn(); return true; }
+		break;
+	case 7:
+		if (HX_FIELD_EQ(inName,"get_ver") ) { outValue = get_ver_dyn(); return true; }
+		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"get_hats") ) { outValue = get_hats_dyn(); return true; }
+		if (HX_FIELD_EQ(inName,"get_type") ) { outValue = get_type_dyn(); return true; }
+		if (HX_FIELD_EQ(inName,"get_show") ) { outValue = get_show_dyn(); return true; }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"get_mucUser") ) { outValue = get_mucUser_dyn(); return true; }
+		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"get_capsNode") ) { outValue = get_capsNode_dyn(); return true; }
+		if (HX_FIELD_EQ(inName,"get_priority") ) { outValue = get_priority_dyn(); return true; }
+		break;
+	case 14:
+		if (HX_FIELD_EQ(inName,"get_avatarHash") ) { outValue = get_avatarHash_dyn(); return true; }
+	}
+	return false;
+}
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo *Presence_Impl__obj_sMemberStorageInfo = 0;
+static ::hx::StaticInfo *Presence_Impl__obj_sStaticStorageInfo = 0;
+#endif
+
+::hx::Class Presence_Impl__obj::__mClass;
+
+static ::String Presence_Impl__obj_sStaticFields[] = {
+	HX_("_new",61,15,1f,3f),
+	HX_("get_capsNode",cc,2a,2e,c8),
+	HX_("get_ver",fa,aa,ce,26),
+	HX_("get_mucUser",fd,53,91,3b),
+	HX_("get_hats",41,ec,c2,c4),
+	HX_("get_avatarHash",d0,e4,77,ad),
+	HX_("get_type",43,ae,c3,cc),
+	HX_("get_show",86,90,0d,cc),
+	HX_("get_priority",6d,2f,58,70),
+	::String(null())
+};
+
+void Presence_Impl__obj::__register()
+{
+	Presence_Impl__obj _hx_dummy;
+	Presence_Impl__obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("borogove._Presence.Presence_Impl_",5c,be,f9,89);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &Presence_Impl__obj::__GetStatic;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(Presence_Impl__obj_sStaticFields);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(0 /* sMemberFields */);
+	__mClass->mCanCast = ::hx::TCanCast< Presence_Impl__obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = Presence_Impl__obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = Presence_Impl__obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+} // end namespace borogove
+} // end namespace _Presence
diff --git a/Sources/c_borogove/src/borogove/_Profile/Profile_Fields_.cpp b/Sources/c_borogove/src/borogove/_Profile/Profile_Fields_.cpp
index 5c1511b..0fe1091 100644
--- a/Sources/c_borogove/src/borogove/_Profile/Profile_Fields_.cpp
+++ b/Sources/c_borogove/src/borogove/_Profile/Profile_Fields_.cpp
@@ -11,7 +11,7 @@
 #include <haxe/ds/StringMap.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_a302548d9b0113f3_96_boot,"borogove._Profile.Profile_Fields_","boot",0x6a815687,"borogove._Profile.Profile_Fields_.boot","borogove/Profile.hx",96,0x841e40c3)
+HX_LOCAL_STACK_FRAME(_hx_pos_a302548d9b0113f3_123_boot,"borogove._Profile.Profile_Fields_","boot",0x6a815687,"borogove._Profile.Profile_Fields_.boot","borogove/Profile.hx",123,0x841e40c3)
 namespace borogove{
 namespace _Profile{
 
@@ -115,46 +115,46 @@ void Profile_Fields__obj::__boot()
 {
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(0)
             		 ::haxe::ds::StringMap _hx_run(){
-            			HX_GC_STACKFRAME(&_hx_pos_a302548d9b0113f3_96_boot)
-HXDLIN(  96)			 ::haxe::ds::StringMap _g =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXDLIN(  96)			_g->set(HX_("source",db,b0,31,32),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("kind",54,e1,09,47),HX_("text",ad,cc,f9,4c));
-HXDLIN(  96)			_g->set(HX_("fn",48,59,00,00),HX_("text",ad,cc,f9,4c));
-HXDLIN(  96)			_g->set(HX_("nickname",6e,fb,2e,1c),HX_("text",ad,cc,f9,4c));
-HXDLIN(  96)			_g->set(HX_("photo",b2,c8,f3,c1),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("bday",3a,1f,13,41),HX_("date",2e,56,63,42));
-HXDLIN(  96)			_g->set(HX_("anniversary",50,ea,9d,0a),HX_("date",2e,56,63,42));
-HXDLIN(  96)			_g->set(HX_("tel",db,5d,58,00),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("email",1c,cf,ce,6f),HX_("text",ad,cc,f9,4c));
-HXDLIN(  96)			_g->set(HX_("impp",e4,7e,ba,45),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("lang",ee,05,ad,47),HX_("language-tag",a5,80,2b,6a));
-HXDLIN(  96)			_g->set(HX_("tz",86,65,00,00),HX_("text",ad,cc,f9,4c));
-HXDLIN(  96)			_g->set(HX_("geo",91,80,4e,00),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("title",98,15,3b,10),HX_("text",ad,cc,f9,4c));
-HXDLIN(  96)			_g->set(HX_("role",76,eb,ae,4b),HX_("text",ad,cc,f9,4c));
-HXDLIN(  96)			_g->set(HX_("logo",6b,9f,b7,47),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("org",e4,9d,54,00),HX_("text",ad,cc,f9,4c));
-HXDLIN(  96)			_g->set(HX_("member",5a,e2,b5,04),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("related",eb,09,57,56),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("categories",dc,9a,ff,00),HX_("text",ad,cc,f9,4c));
-HXDLIN(  96)			_g->set(HX_("note",f2,17,0a,49),HX_("text",ad,cc,f9,4c));
-HXDLIN(  96)			_g->set(HX_("prodid",32,77,51,b5),HX_("text",ad,cc,f9,4c));
-HXDLIN(  96)			_g->set(HX_("rev",63,d9,56,00),HX_("timestamp",d6,d4,ce,a5));
-HXDLIN(  96)			_g->set(HX_("sound",cf,8c,cc,80),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("uid",90,23,59,00),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("url",6f,2b,59,00),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("version",18,e7,f1,7c),HX_("text",ad,cc,f9,4c));
-HXDLIN(  96)			_g->set(HX_("key",9f,89,51,00),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("fburl",b3,3f,ff,fb),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("caladruri",2b,73,ea,72),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("caluri",1e,34,ef,b6),HX_("uri",6c,2b,59,00));
-HXDLIN(  96)			_g->set(HX_("pronouns",0c,83,09,8c),HX_("text",ad,cc,f9,4c));
-HXDLIN(  96)			return _g;
+            			HX_GC_STACKFRAME(&_hx_pos_a302548d9b0113f3_123_boot)
+HXDLIN( 123)			 ::haxe::ds::StringMap _g =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXDLIN( 123)			_g->set(HX_("source",db,b0,31,32),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("kind",54,e1,09,47),HX_("text",ad,cc,f9,4c));
+HXDLIN( 123)			_g->set(HX_("fn",48,59,00,00),HX_("text",ad,cc,f9,4c));
+HXDLIN( 123)			_g->set(HX_("nickname",6e,fb,2e,1c),HX_("text",ad,cc,f9,4c));
+HXDLIN( 123)			_g->set(HX_("photo",b2,c8,f3,c1),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("bday",3a,1f,13,41),HX_("date",2e,56,63,42));
+HXDLIN( 123)			_g->set(HX_("anniversary",50,ea,9d,0a),HX_("date",2e,56,63,42));
+HXDLIN( 123)			_g->set(HX_("tel",db,5d,58,00),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("email",1c,cf,ce,6f),HX_("text",ad,cc,f9,4c));
+HXDLIN( 123)			_g->set(HX_("impp",e4,7e,ba,45),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("lang",ee,05,ad,47),HX_("language-tag",a5,80,2b,6a));
+HXDLIN( 123)			_g->set(HX_("tz",86,65,00,00),HX_("text",ad,cc,f9,4c));
+HXDLIN( 123)			_g->set(HX_("geo",91,80,4e,00),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("title",98,15,3b,10),HX_("text",ad,cc,f9,4c));
+HXDLIN( 123)			_g->set(HX_("role",76,eb,ae,4b),HX_("text",ad,cc,f9,4c));
+HXDLIN( 123)			_g->set(HX_("logo",6b,9f,b7,47),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("org",e4,9d,54,00),HX_("text",ad,cc,f9,4c));
+HXDLIN( 123)			_g->set(HX_("member",5a,e2,b5,04),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("related",eb,09,57,56),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("categories",dc,9a,ff,00),HX_("text",ad,cc,f9,4c));
+HXDLIN( 123)			_g->set(HX_("note",f2,17,0a,49),HX_("text",ad,cc,f9,4c));
+HXDLIN( 123)			_g->set(HX_("prodid",32,77,51,b5),HX_("text",ad,cc,f9,4c));
+HXDLIN( 123)			_g->set(HX_("rev",63,d9,56,00),HX_("timestamp",d6,d4,ce,a5));
+HXDLIN( 123)			_g->set(HX_("sound",cf,8c,cc,80),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("uid",90,23,59,00),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("url",6f,2b,59,00),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("version",18,e7,f1,7c),HX_("text",ad,cc,f9,4c));
+HXDLIN( 123)			_g->set(HX_("key",9f,89,51,00),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("fburl",b3,3f,ff,fb),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("caladruri",2b,73,ea,72),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("caluri",1e,34,ef,b6),HX_("uri",6c,2b,59,00));
+HXDLIN( 123)			_g->set(HX_("pronouns",0c,83,09,8c),HX_("text",ad,cc,f9,4c));
+HXDLIN( 123)			return _g;
             		}
             		HX_END_LOCAL_FUNC0(return)
 
-            	HX_STACKFRAME(&_hx_pos_a302548d9b0113f3_96_boot)
-HXDLIN(  96)		TYPES = ( ( ::haxe::ds::StringMap)( ::Dynamic(new _hx_Closure_0())()) );
+            	HX_STACKFRAME(&_hx_pos_a302548d9b0113f3_123_boot)
+HXDLIN( 123)		TYPES = ( ( ::haxe::ds::StringMap)( ::Dynamic(new _hx_Closure_0())()) );
             	}
 }
 
diff --git a/Sources/c_borogove/src/borogove/_Util/Util_Fields_.cpp b/Sources/c_borogove/src/borogove/_Util/Util_Fields_.cpp
index 044a095..7426d20 100644
--- a/Sources/c_borogove/src/borogove/_Util/Util_Fields_.cpp
+++ b/Sources/c_borogove/src/borogove/_Util/Util_Fields_.cpp
@@ -59,12 +59,12 @@
 #include <tink/http/_Fetch/FetchResponse_Impl_.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_1e0430250bb3af17_30_xmppLinkHeader,"borogove._Util.Util_Fields_","xmppLinkHeader",0x9fac46c7,"borogove._Util.Util_Fields_.xmppLinkHeader","borogove/Util.hx",30,0x66194bae)
-HX_LOCAL_STACK_FRAME(_hx_pos_1e0430250bb3af17_28_xmppLinkHeader,"borogove._Util.Util_Fields_","xmppLinkHeader",0x9fac46c7,"borogove._Util.Util_Fields_.xmppLinkHeader","borogove/Util.hx",28,0x66194bae)
-HX_LOCAL_STACK_FRAME(_hx_pos_1e0430250bb3af17_27_xmppLinkHeader,"borogove._Util.Util_Fields_","xmppLinkHeader",0x9fac46c7,"borogove._Util.Util_Fields_.xmppLinkHeader","borogove/Util.hx",27,0x66194bae)
-HX_LOCAL_STACK_FRAME(_hx_pos_1e0430250bb3af17_80_downcast,"borogove._Util.Util_Fields_","downcast",0x608fd4ec,"borogove._Util.Util_Fields_.downcast","borogove/Util.hx",80,0x66194bae)
-HX_LOCAL_STACK_FRAME(_hx_pos_1e0430250bb3af17_85_xmlEscape,"borogove._Util.Util_Fields_","xmlEscape",0x2f61ed8d,"borogove._Util.Util_Fields_.xmlEscape","borogove/Util.hx",85,0x66194bae)
-HX_LOCAL_STACK_FRAME(_hx_pos_1e0430250bb3af17_89_uriDecode,"borogove._Util.Util_Fields_","uriDecode",0xe1dca28f,"borogove._Util.Util_Fields_.uriDecode","borogove/Util.hx",89,0x66194bae)
+HX_LOCAL_STACK_FRAME(_hx_pos_1e0430250bb3af17_55_xmppLinkHeader,"borogove._Util.Util_Fields_","xmppLinkHeader",0x9fac46c7,"borogove._Util.Util_Fields_.xmppLinkHeader","borogove/Util.hx",55,0x66194bae)
+HX_LOCAL_STACK_FRAME(_hx_pos_1e0430250bb3af17_53_xmppLinkHeader,"borogove._Util.Util_Fields_","xmppLinkHeader",0x9fac46c7,"borogove._Util.Util_Fields_.xmppLinkHeader","borogove/Util.hx",53,0x66194bae)
+HX_LOCAL_STACK_FRAME(_hx_pos_1e0430250bb3af17_52_xmppLinkHeader,"borogove._Util.Util_Fields_","xmppLinkHeader",0x9fac46c7,"borogove._Util.Util_Fields_.xmppLinkHeader","borogove/Util.hx",52,0x66194bae)
+HX_LOCAL_STACK_FRAME(_hx_pos_1e0430250bb3af17_105_downcast,"borogove._Util.Util_Fields_","downcast",0x608fd4ec,"borogove._Util.Util_Fields_.downcast","borogove/Util.hx",105,0x66194bae)
+HX_LOCAL_STACK_FRAME(_hx_pos_1e0430250bb3af17_111_xmlEscape,"borogove._Util.Util_Fields_","xmlEscape",0x2f61ed8d,"borogove._Util.Util_Fields_.xmlEscape","borogove/Util.hx",111,0x66194bae)
+HX_LOCAL_STACK_FRAME(_hx_pos_1e0430250bb3af17_115_uriDecode,"borogove._Util.Util_Fields_","uriDecode",0xe1dca28f,"borogove._Util.Util_Fields_.uriDecode","borogove/Util.hx",115,0x66194bae)
 namespace borogove{
 namespace _Util{
 
@@ -90,101 +90,101 @@ bool Util_Fields__obj::_hx_isInstanceOf(int inClassId) {
             		void _hx_run( ::Dynamic resolve, ::Dynamic reject){
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,resolve, ::Dynamic,reject) HXARGC(1)
             			void _hx_run( ::tink::core::Outcome o){
-            				HX_GC_STACKFRAME(&_hx_pos_1e0430250bb3af17_30_xmppLinkHeader)
-HXLINE(  30)				switch((int)(o->_hx_getIndex())){
+            				HX_GC_STACKFRAME(&_hx_pos_1e0430250bb3af17_55_xmppLinkHeader)
+HXLINE(  55)				switch((int)(o->_hx_getIndex())){
             					case (int)0: {
-HXLINE(  32)						 ::EReg regex =  ::EReg_obj::__alloc( HX_CTX ,HX_("<(xmpp:[^>]+)>",05,26,e1,e4),HX_("",00,00,00,00));
-HXLINE(  33)						{
-HXLINE(  33)							int _g = 0;
-HXDLIN(  33)							 ::tink::http::ResponseHeaderBase res = ( ( ::tink::http::ResponseHeaderBase)(( ( ::tink::http::Message)(o->_hx_getObject(0)) )->header) );
-HXDLIN(  33)							::Array< ::String > _g1 = res->get(HX_("link",fa,17,b3,47).toLowerCase());
-HXDLIN(  33)							while((_g < _g1->length)){
-HXLINE(  33)								::String link = _g1->__get(_g);
-HXDLIN(  33)								_g = (_g + 1);
-HXLINE(  34)								if (regex->match(link)) {
-HXLINE(  35)									 ::Dynamic resolve1 = resolve;
-HXDLIN(  35)									resolve1(regex->matched(1));
-HXLINE(  36)									return;
+HXLINE(  57)						 ::EReg regex =  ::EReg_obj::__alloc( HX_CTX ,HX_("<(xmpp:[^>]+)>",05,26,e1,e4),HX_("",00,00,00,00));
+HXLINE(  58)						{
+HXLINE(  58)							int _g = 0;
+HXDLIN(  58)							 ::tink::http::ResponseHeaderBase res = ( ( ::tink::http::ResponseHeaderBase)(( ( ::tink::http::Message)(o->_hx_getObject(0)) )->header) );
+HXDLIN(  58)							::Array< ::String > _g1 = res->get(HX_("link",fa,17,b3,47).toLowerCase());
+HXDLIN(  58)							while((_g < _g1->length)){
+HXLINE(  58)								::String link = _g1->__get(_g);
+HXDLIN(  58)								_g = (_g + 1);
+HXLINE(  59)								if (regex->match(link)) {
+HXLINE(  60)									 ::Dynamic resolve1 = resolve;
+HXDLIN(  60)									resolve1(regex->matched(1));
+HXLINE(  61)									return;
             								}
             							}
             						}
-HXLINE(  39)						reject(null());
+HXLINE(  64)						reject(null());
             					}
             					break;
             					case (int)1: {
-HXLINE(  41)						reject(o->_hx_getObject(0));
+HXLINE(  66)						reject(o->_hx_getObject(0));
             					}
             					break;
             				}
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-            			HX_STACKFRAME(&_hx_pos_1e0430250bb3af17_28_xmppLinkHeader)
-HXLINE(  28)			 ::Dynamic url1 = ::tink::_Url::Url_Impl__obj::fromString(url);
-HXDLIN(  28)			::tink::http::_Fetch::FetchResponse_Impl__obj::all(::tink::http::Fetch_obj::fetch(url1, ::Dynamic(::hx::Anon_obj::Create(1)
+            			HX_STACKFRAME(&_hx_pos_1e0430250bb3af17_53_xmppLinkHeader)
+HXLINE(  53)			 ::Dynamic url1 = ::tink::_Url::Url_Impl__obj::fromString(url);
+HXDLIN(  53)			::tink::http::_Fetch::FetchResponse_Impl__obj::all(::tink::http::Fetch_obj::fetch(url1, ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("method",e1,f6,5a,09),HX_("HEAD",20,f1,cb,2f)))))->handle( ::Dynamic(new _hx_Closure_0(resolve,reject)));
             		}
             		HX_END_LOCAL_FUNC2((void))
 
-            	HX_STACKFRAME(&_hx_pos_1e0430250bb3af17_27_xmppLinkHeader)
-HXDLIN(  27)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(url)));
+            	HX_STACKFRAME(&_hx_pos_1e0430250bb3af17_52_xmppLinkHeader)
+HXDLIN(  52)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_1(url)));
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Util_Fields__obj,xmppLinkHeader,return )
 
  ::Dynamic Util_Fields__obj::downcast( ::Dynamic value,::hx::Class c){
-            	HX_STACKFRAME(&_hx_pos_1e0430250bb3af17_80_downcast)
-HXDLIN(  80)		return ::Std_obj::downcast(value,c);
+            	HX_STACKFRAME(&_hx_pos_1e0430250bb3af17_105_downcast)
+HXDLIN( 105)		return ::Std_obj::downcast(value,c);
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC2(Util_Fields__obj,downcast,return )
 
 ::String Util_Fields__obj::xmlEscape(::String s){
-            	HX_STACKFRAME(&_hx_pos_1e0430250bb3af17_85_xmlEscape)
-HXDLIN(  85)		return ::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(s,HX_("&",26,00,00,00),HX_("&amp;",dd,d4,aa,21)),HX_("<",3c,00,00,00),HX_("&lt;",4d,74,70,19)),HX_(">",3e,00,00,00),HX_("&gt;",08,a9,6c,19));
+            	HX_STACKFRAME(&_hx_pos_1e0430250bb3af17_111_xmlEscape)
+HXDLIN( 111)		return ::StringTools_obj::replace(::StringTools_obj::replace(::StringTools_obj::replace(s,HX_("&",26,00,00,00),HX_("&amp;",dd,d4,aa,21)),HX_("<",3c,00,00,00),HX_("&lt;",4d,74,70,19)),HX_(">",3e,00,00,00),HX_("&gt;",08,a9,6c,19));
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Util_Fields__obj,xmlEscape,return )
 
 ::String Util_Fields__obj::uriDecode(::String s){
-            	HX_GC_STACKFRAME(&_hx_pos_1e0430250bb3af17_89_uriDecode)
-HXLINE( 104)		 ::haxe::io::BytesBuffer bytes =  ::haxe::io::BytesBuffer_obj::__alloc( HX_CTX );
-HXLINE( 105)		int i = 0;
-HXLINE( 107)		while((i < s.length)){
-HXLINE( 108)			::String c = s.charAt(i);
-HXLINE( 109)			bool _hx_tmp;
-HXDLIN( 109)			if ((c == HX_("%",25,00,00,00))) {
-HXLINE( 109)				_hx_tmp = ((i + 2) < s.length);
+            	HX_GC_STACKFRAME(&_hx_pos_1e0430250bb3af17_115_uriDecode)
+HXLINE( 130)		 ::haxe::io::BytesBuffer bytes =  ::haxe::io::BytesBuffer_obj::__alloc( HX_CTX );
+HXLINE( 131)		int i = 0;
+HXLINE( 133)		while((i < s.length)){
+HXLINE( 134)			::String c = s.charAt(i);
+HXLINE( 135)			bool _hx_tmp;
+HXDLIN( 135)			if ((c == HX_("%",25,00,00,00))) {
+HXLINE( 135)				_hx_tmp = ((i + 2) < s.length);
             			}
             			else {
-HXLINE( 109)				_hx_tmp = false;
+HXLINE( 135)				_hx_tmp = false;
             			}
-HXDLIN( 109)			if (_hx_tmp) {
-HXLINE( 110)				 ::Dynamic value = ::Std_obj::parseInt((HX_("0x",48,2a,00,00) + s.substr((i + 1),2)));
-HXLINE( 111)				if (::hx::IsNotNull( value )) {
-HXLINE( 112)					bytes->b->push(( (int)(value) ));
-HXLINE( 113)					i = (i + 3);
-HXLINE( 114)					continue;
+HXDLIN( 135)			if (_hx_tmp) {
+HXLINE( 136)				 ::Dynamic value = ::Std_obj::parseInt((HX_("0x",48,2a,00,00) + s.substr((i + 1),2)));
+HXLINE( 137)				if (::hx::IsNotNull( value )) {
+HXLINE( 138)					bytes->b->push(( (int)(value) ));
+HXLINE( 139)					i = (i + 3);
+HXLINE( 140)					continue;
             				}
             			}
-HXLINE( 117)			{
-HXLINE( 117)				 ::haxe::io::Bytes src = ::haxe::io::Bytes_obj::ofString(c,::haxe::io::Encoding_obj::UTF8_dyn());
-HXDLIN( 117)				::Array< unsigned char > b2 = src->b;
-HXDLIN( 117)				{
-HXLINE( 117)					int _g = 0;
-HXDLIN( 117)					int _g1 = src->length;
-HXDLIN( 117)					while((_g < _g1)){
-HXLINE( 117)						_g = (_g + 1);
-HXDLIN( 117)						bytes->b->push(b2->__get((_g - 1)));
+HXLINE( 143)			{
+HXLINE( 143)				 ::haxe::io::Bytes src = ::haxe::io::Bytes_obj::ofString(c,::haxe::io::Encoding_obj::UTF8_dyn());
+HXDLIN( 143)				::Array< unsigned char > b2 = src->b;
+HXDLIN( 143)				{
+HXLINE( 143)					int _g = 0;
+HXDLIN( 143)					int _g1 = src->length;
+HXDLIN( 143)					while((_g < _g1)){
+HXLINE( 143)						_g = (_g + 1);
+HXDLIN( 143)						bytes->b->push(b2->__get((_g - 1)));
             					}
             				}
             			}
-HXLINE( 118)			i = (i + 1);
+HXLINE( 144)			i = (i + 1);
             		}
-HXLINE( 121)		return bytes->getBytes()->toString();
+HXLINE( 147)		return bytes->getBytes()->toString();
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/calls/AudioFormat.cpp b/Sources/c_borogove/src/borogove/calls/AudioFormat.cpp
index 9d08fbf..6320b15 100644
--- a/Sources/c_borogove/src/borogove/calls/AudioFormat.cpp
+++ b/Sources/c_borogove/src/borogove/calls/AudioFormat.cpp
@@ -6,8 +6,8 @@
 #endif
 
 HX_DEFINE_STACK_FRAME(_hx_pos_9a23c46bf262f096_329_new,"borogove.calls.AudioFormat","new",0x8681a099,"borogove.calls.AudioFormat.new","borogove/calls/PeerConnection.cpp.hx",329,0x6b4179c1)
-HX_LOCAL_STACK_FRAME(_hx_pos_6d6c0ff9b6d661fc_450_clockRate__fromC,"borogove.calls.AudioFormat","clockRate__fromC",0x08165e92,"borogove.calls.AudioFormat.clockRate__fromC","HaxeCBridge.hx",450,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_6d6c0ff9b6d661fc_450_channels__fromC,"borogove.calls.AudioFormat","channels__fromC",0x42cc71e2,"borogove.calls.AudioFormat.channels__fromC","HaxeCBridge.hx",450,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_6d6c0ff9b6d661fc_478_clockRate__fromC,"borogove.calls.AudioFormat","clockRate__fromC",0x08165e92,"borogove.calls.AudioFormat.clockRate__fromC","HaxeCBridge.hx",478,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_6d6c0ff9b6d661fc_478_channels__fromC,"borogove.calls.AudioFormat","channels__fromC",0x42cc71e2,"borogove.calls.AudioFormat.channels__fromC","HaxeCBridge.hx",478,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_9a23c46bf262f096_322_boot,"borogove.calls.AudioFormat","boot",0x2303e5d9,"borogove.calls.AudioFormat.boot","borogove/calls/PeerConnection.cpp.hx",322,0x6b4179c1)
 namespace borogove{
 namespace calls{
@@ -36,16 +36,16 @@ bool AudioFormat_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 int AudioFormat_obj::clockRate__fromC(){
-            	HX_STACKFRAME(&_hx_pos_6d6c0ff9b6d661fc_450_clockRate__fromC)
-HXDLIN( 450)		return this->clockRate;
+            	HX_STACKFRAME(&_hx_pos_6d6c0ff9b6d661fc_478_clockRate__fromC)
+HXDLIN( 478)		return this->clockRate;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(AudioFormat_obj,clockRate__fromC,return )
 
 int AudioFormat_obj::channels__fromC(){
-            	HX_STACKFRAME(&_hx_pos_6d6c0ff9b6d661fc_450_channels__fromC)
-HXDLIN( 450)		return this->channels;
+            	HX_STACKFRAME(&_hx_pos_6d6c0ff9b6d661fc_478_channels__fromC)
+HXDLIN( 478)		return this->channels;
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/calls/IncomingProposedSession.cpp b/Sources/c_borogove/src/borogove/calls/IncomingProposedSession.cpp
index d10412c..2c9e9ce 100644
--- a/Sources/c_borogove/src/borogove/calls/IncomingProposedSession.cpp
+++ b/Sources/c_borogove/src/borogove/calls/IncomingProposedSession.cpp
@@ -59,36 +59,36 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_74_new,"borogove.calls.IncomingProposedSession","new",0x1258db76,"borogove.calls.IncomingProposedSession.new","borogove/calls/Session.hx",74,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_94_ring,"borogove.calls.IncomingProposedSession","ring",0xfe0f07da,"borogove.calls.IncomingProposedSession.ring","borogove/calls/Session.hx",94,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_88_ring,"borogove.calls.IncomingProposedSession","ring",0xfe0f07da,"borogove.calls.IncomingProposedSession.ring","borogove/calls/Session.hx",88,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_106_hangup,"borogove.calls.IncomingProposedSession","hangup",0x4afe58f7,"borogove.calls.IncomingProposedSession.hangup","borogove/calls/Session.hx",106,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_99_hangup,"borogove.calls.IncomingProposedSession","hangup",0x4afe58f7,"borogove.calls.IncomingProposedSession.hangup","borogove/calls/Session.hx",99,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_114_retract,"borogove.calls.IncomingProposedSession","retract",0x08713017,"borogove.calls.IncomingProposedSession.retract","borogove/calls/Session.hx",114,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_118_terminate,"borogove.calls.IncomingProposedSession","terminate",0xe089b1f7,"borogove.calls.IncomingProposedSession.terminate","borogove/calls/Session.hx",118,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_122_contentAdd,"borogove.calls.IncomingProposedSession","contentAdd",0xc1b58a12,"borogove.calls.IncomingProposedSession.contentAdd","borogove/calls/Session.hx",122,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_126_contentAccept,"borogove.calls.IncomingProposedSession","contentAccept",0x2cffc7b7,"borogove.calls.IncomingProposedSession.contentAccept","borogove/calls/Session.hx",126,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_129_transportInfo,"borogove.calls.IncomingProposedSession","transportInfo",0x02cd3f4d,"borogove.calls.IncomingProposedSession.transportInfo","borogove/calls/Session.hx",129,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_140_accept,"borogove.calls.IncomingProposedSession","accept",0x9e0519b2,"borogove.calls.IncomingProposedSession.accept","borogove/calls/Session.hx",140,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_134_accept,"borogove.calls.IncomingProposedSession","accept",0x9e0519b2,"borogove.calls.IncomingProposedSession.accept","borogove/calls/Session.hx",134,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_151_initiate,"borogove.calls.IncomingProposedSession","initiate",0x943c6f83,"borogove.calls.IncomingProposedSession.initiate","borogove/calls/Session.hx",151,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_163_addMedia,"borogove.calls.IncomingProposedSession","addMedia",0xb3c6302d,"borogove.calls.IncomingProposedSession.addMedia","borogove/calls/Session.hx",163,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_168_callStatus,"borogove.calls.IncomingProposedSession","callStatus",0xaf03e21a,"borogove.calls.IncomingProposedSession.callStatus","borogove/calls/Session.hx",168,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_173_audioTracks,"borogove.calls.IncomingProposedSession","audioTracks",0xb3746e14,"borogove.calls.IncomingProposedSession.audioTracks","borogove/calls/Session.hx",173,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_178_videoTracks,"borogove.calls.IncomingProposedSession","videoTracks",0x5d6bd379,"borogove.calls.IncomingProposedSession.videoTracks","borogove/calls/Session.hx",178,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_183_dtmf,"borogove.calls.IncomingProposedSession","dtmf",0xf4d66313,"borogove.calls.IncomingProposedSession.dtmf","borogove/calls/Session.hx",183,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_187_get_sid,"borogove.calls.IncomingProposedSession","get_sid",0x3283b5bb,"borogove.calls.IncomingProposedSession.get_sid","borogove/calls/Session.hx",187,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_191_get_chatId,"borogove.calls.IncomingProposedSession","get_chatId",0x25d69846,"borogove.calls.IncomingProposedSession.get_chatId","borogove/calls/Session.hx",191,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_74_boot,"borogove.calls.IncomingProposedSession","boot",0xf3802c5c,"borogove.calls.IncomingProposedSession.boot","borogove/calls/Session.hx",74,0x33a79030)
+HX_DEFINE_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_75_new,"borogove.calls.IncomingProposedSession","new",0x1258db76,"borogove.calls.IncomingProposedSession.new","borogove/calls/Session.hx",75,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_95_ring,"borogove.calls.IncomingProposedSession","ring",0xfe0f07da,"borogove.calls.IncomingProposedSession.ring","borogove/calls/Session.hx",95,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_89_ring,"borogove.calls.IncomingProposedSession","ring",0xfe0f07da,"borogove.calls.IncomingProposedSession.ring","borogove/calls/Session.hx",89,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_107_hangup,"borogove.calls.IncomingProposedSession","hangup",0x4afe58f7,"borogove.calls.IncomingProposedSession.hangup","borogove/calls/Session.hx",107,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_100_hangup,"borogove.calls.IncomingProposedSession","hangup",0x4afe58f7,"borogove.calls.IncomingProposedSession.hangup","borogove/calls/Session.hx",100,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_115_retract,"borogove.calls.IncomingProposedSession","retract",0x08713017,"borogove.calls.IncomingProposedSession.retract","borogove/calls/Session.hx",115,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_119_terminate,"borogove.calls.IncomingProposedSession","terminate",0xe089b1f7,"borogove.calls.IncomingProposedSession.terminate","borogove/calls/Session.hx",119,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_123_contentAdd,"borogove.calls.IncomingProposedSession","contentAdd",0xc1b58a12,"borogove.calls.IncomingProposedSession.contentAdd","borogove/calls/Session.hx",123,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_127_contentAccept,"borogove.calls.IncomingProposedSession","contentAccept",0x2cffc7b7,"borogove.calls.IncomingProposedSession.contentAccept","borogove/calls/Session.hx",127,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_130_transportInfo,"borogove.calls.IncomingProposedSession","transportInfo",0x02cd3f4d,"borogove.calls.IncomingProposedSession.transportInfo","borogove/calls/Session.hx",130,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_141_accept,"borogove.calls.IncomingProposedSession","accept",0x9e0519b2,"borogove.calls.IncomingProposedSession.accept","borogove/calls/Session.hx",141,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_135_accept,"borogove.calls.IncomingProposedSession","accept",0x9e0519b2,"borogove.calls.IncomingProposedSession.accept","borogove/calls/Session.hx",135,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_152_initiate,"borogove.calls.IncomingProposedSession","initiate",0x943c6f83,"borogove.calls.IncomingProposedSession.initiate","borogove/calls/Session.hx",152,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_164_addMedia,"borogove.calls.IncomingProposedSession","addMedia",0xb3c6302d,"borogove.calls.IncomingProposedSession.addMedia","borogove/calls/Session.hx",164,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_169_callStatus,"borogove.calls.IncomingProposedSession","callStatus",0xaf03e21a,"borogove.calls.IncomingProposedSession.callStatus","borogove/calls/Session.hx",169,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_174_audioTracks,"borogove.calls.IncomingProposedSession","audioTracks",0xb3746e14,"borogove.calls.IncomingProposedSession.audioTracks","borogove/calls/Session.hx",174,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_179_videoTracks,"borogove.calls.IncomingProposedSession","videoTracks",0x5d6bd379,"borogove.calls.IncomingProposedSession.videoTracks","borogove/calls/Session.hx",179,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_184_dtmf,"borogove.calls.IncomingProposedSession","dtmf",0xf4d66313,"borogove.calls.IncomingProposedSession.dtmf","borogove/calls/Session.hx",184,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_188_get_sid,"borogove.calls.IncomingProposedSession","get_sid",0x3283b5bb,"borogove.calls.IncomingProposedSession.get_sid","borogove/calls/Session.hx",188,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_192_get_chatId,"borogove.calls.IncomingProposedSession","get_chatId",0x25d69846,"borogove.calls.IncomingProposedSession.get_chatId","borogove/calls/Session.hx",192,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_8bd69e9bff10ec02_75_boot,"borogove.calls.IncomingProposedSession","boot",0xf3802c5c,"borogove.calls.IncomingProposedSession.boot","borogove/calls/Session.hx",75,0x33a79030)
 namespace borogove{
 namespace calls{
 
 void IncomingProposedSession_obj::__construct( ::borogove::Client client, ::borogove::JID from,::String sid){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_74_new)
-HXLINE(  80)		this->accepted = false;
-HXLINE(  83)		this->client = client;
-HXLINE(  84)		this->from = from;
-HXLINE(  85)		this->_sid = sid;
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_75_new)
+HXLINE(  81)		this->accepted = false;
+HXLINE(  84)		this->client = client;
+HXLINE(  85)		this->from = from;
+HXLINE(  86)		this->_sid = sid;
             	}
 
 Dynamic IncomingProposedSession_obj::__CreateEmpty() { return new IncomingProposedSession_obj; }
@@ -138,19 +138,19 @@ void *IncomingProposedSession_obj::_hx_getInterface(int inHash) {
 void IncomingProposedSession_obj::ring(){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::calls::IncomingProposedSession,_gthis) HXARGC(1)
             		void _hx_run(::Array< ::Dynamic> stored){
-            			HX_GC_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_94_ring)
-HXLINE(  94)			_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),1);
+            			HX_GC_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_95_ring)
+HXLINE(  95)			_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),1);
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_88_ring)
-HXDLIN(  88)		 ::borogove::calls::IncomingProposedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(  91)		 ::borogove::Stanza event =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("ringing",32,9b,80,1a), ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_GC_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_89_ring)
+HXDLIN(  89)		 ::borogove::calls::IncomingProposedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(  92)		 ::borogove::Stanza event =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("ringing",32,9b,80,1a), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("id",db,5b,00,00),this->get_sid())
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07))));
-HXLINE(  92)		 ::borogove::ChatMessage msg = ::borogove::calls::_Session::Session_Fields__obj::mkCallMessage(this->from,this->client->jid,event);
-HXLINE(  93)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,msg)), ::Dynamic(new _hx_Closure_0(_gthis)),null());
-HXLINE(  96)		this->client->trigger(HX_("call/ring",01,8e,91,54), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(  93)		 ::borogove::ChatMessage msg = ::borogove::calls::_Session::Session_Fields__obj::mkCallMessage(this->from,this->client,event);
+HXLINE(  94)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,msg)), ::Dynamic(new _hx_Closure_0(_gthis)),null());
+HXLINE(  97)		this->client->trigger(HX_("call/ring",01,8e,91,54), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("session",56,17,98,93),::hx::ObjectPtr<OBJ_>(this))));
             	}
 
@@ -160,29 +160,29 @@ HX_DEFINE_DYNAMIC_FUNC0(IncomingProposedSession_obj,ring,(void))
 void IncomingProposedSession_obj::hangup(){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::calls::IncomingProposedSession,_gthis) HXARGC(1)
             		void _hx_run(::Array< ::Dynamic> stored){
-            			HX_GC_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_106_hangup)
-HXLINE( 106)			_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),1);
+            			HX_GC_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_107_hangup)
+HXLINE( 107)			_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),1);
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_99_hangup)
-HXDLIN(  99)		 ::borogove::calls::IncomingProposedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 103)		 ::borogove::Stanza event =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("reject",5f,51,85,02), ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_GC_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_100_hangup)
+HXDLIN( 100)		 ::borogove::calls::IncomingProposedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 104)		 ::borogove::Stanza event =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("reject",5f,51,85,02), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("id",db,5b,00,00),this->get_sid())
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07))));
-HXLINE( 104)		 ::borogove::ChatMessage msg = ::borogove::calls::_Session::Session_Fields__obj::mkCallMessage(this->from,this->client->jid,event);
-HXLINE( 105)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,msg)), ::Dynamic(new _hx_Closure_0(_gthis)),null());
-HXLINE( 108)		{
-HXLINE( 108)			 ::borogove::Client tmp = this->client;
-HXDLIN( 108)			 ::borogove::Chat tmp1 = tmp->getChat(this->get_chatId());
-HXDLIN( 108)			if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 108)				::Dynamic this1 = tmp1->jingleSessions;
-HXDLIN( 108)				( ( ::haxe::ds::StringMap)(this1) )->remove(this->get_sid());
+HXLINE( 105)		 ::borogove::ChatMessage msg = ::borogove::calls::_Session::Session_Fields__obj::mkCallMessage(this->from,this->client,event);
+HXLINE( 106)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,msg)), ::Dynamic(new _hx_Closure_0(_gthis)),null());
+HXLINE( 109)		{
+HXLINE( 109)			 ::borogove::Client tmp = this->client;
+HXDLIN( 109)			 ::borogove::Chat tmp1 = tmp->getChat(this->get_chatId());
+HXDLIN( 109)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 109)				::Dynamic this1 = tmp1->jingleSessions;
+HXDLIN( 109)				( ( ::haxe::ds::StringMap)(this1) )->remove(this->get_sid());
             			}
             		}
-HXLINE( 109)		 ::borogove::Client _hx_tmp = this->client;
-HXDLIN( 109)		::String _hx_tmp1 = this->get_chatId();
-HXDLIN( 109)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 110)		 ::borogove::Client _hx_tmp = this->client;
+HXDLIN( 110)		::String _hx_tmp1 = this->get_chatId();
+HXDLIN( 110)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("chatId",d3,04,77,b7),_hx_tmp1)
             			->setFixed(1,HX_("sid",0e,9f,57,00),this->get_sid())));
             	}
@@ -191,10 +191,10 @@ HXDLIN( 109)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::
 HX_DEFINE_DYNAMIC_FUNC0(IncomingProposedSession_obj,hangup,(void))
 
 void IncomingProposedSession_obj::retract(){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_114_retract)
-HXDLIN( 114)		 ::borogove::Client _hx_tmp = this->client;
-HXDLIN( 114)		::String _hx_tmp1 = this->get_chatId();
-HXDLIN( 114)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_115_retract)
+HXDLIN( 115)		 ::borogove::Client _hx_tmp = this->client;
+HXDLIN( 115)		::String _hx_tmp1 = this->get_chatId();
+HXDLIN( 115)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("chatId",d3,04,77,b7),_hx_tmp1)
             			->setFixed(1,HX_("sid",0e,9f,57,00),this->get_sid())));
             	}
@@ -203,61 +203,61 @@ HXDLIN( 114)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::
 HX_DEFINE_DYNAMIC_FUNC0(IncomingProposedSession_obj,retract,(void))
 
 void IncomingProposedSession_obj::terminate(){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_118_terminate)
-HXDLIN( 118)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN( 118)		::String _hx_tmp1 = (HX_("Tried to terminate before session-initiate: ",a9,d4,f3,a4) + this->get_sid());
-HXDLIN( 118)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_119_terminate)
+HXDLIN( 119)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN( 119)		::String _hx_tmp1 = (HX_("Tried to terminate before session-initiate: ",a9,d4,f3,a4) + this->get_sid());
+HXDLIN( 119)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
             			->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.calls.IncomingProposedSession",84,a8,44,af))
             			->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)))
             			->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("terminate",61,32,d2,fd))
             			->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/calls/Session.hx",30,90,a7,33))
-            			->setFixed(4,HX_("lineNumber",dd,81,22,76),118)));
+            			->setFixed(4,HX_("lineNumber",dd,81,22,76),119)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(IncomingProposedSession_obj,terminate,(void))
 
 void IncomingProposedSession_obj::contentAdd( ::borogove::Stanza _){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_122_contentAdd)
-HXDLIN( 122)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN( 122)		::String _hx_tmp1 = (HX_("Got content-add before session-initiate: ",10,d3,fa,8a) + this->get_sid());
-HXDLIN( 122)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_123_contentAdd)
+HXDLIN( 123)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN( 123)		::String _hx_tmp1 = (HX_("Got content-add before session-initiate: ",10,d3,fa,8a) + this->get_sid());
+HXDLIN( 123)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
             			->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.calls.IncomingProposedSession",84,a8,44,af))
             			->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)))
             			->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("contentAdd",68,66,dd,43))
             			->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/calls/Session.hx",30,90,a7,33))
-            			->setFixed(4,HX_("lineNumber",dd,81,22,76),122)));
+            			->setFixed(4,HX_("lineNumber",dd,81,22,76),123)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(IncomingProposedSession_obj,contentAdd,(void))
 
 void IncomingProposedSession_obj::contentAccept( ::borogove::Stanza _){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_126_contentAccept)
-HXDLIN( 126)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN( 126)		::String _hx_tmp1 = (HX_("Got content-accept before session-initiate: ",47,72,87,71) + this->get_sid());
-HXDLIN( 126)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_127_contentAccept)
+HXDLIN( 127)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN( 127)		::String _hx_tmp1 = (HX_("Got content-accept before session-initiate: ",47,72,87,71) + this->get_sid());
+HXDLIN( 127)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
             			->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.calls.IncomingProposedSession",84,a8,44,af))
             			->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)))
             			->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("contentAccept",21,c5,01,e1))
             			->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/calls/Session.hx",30,90,a7,33))
-            			->setFixed(4,HX_("lineNumber",dd,81,22,76),126)));
+            			->setFixed(4,HX_("lineNumber",dd,81,22,76),127)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(IncomingProposedSession_obj,contentAccept,(void))
 
 ::Dynamic IncomingProposedSession_obj::transportInfo( ::borogove::Stanza _){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_129_transportInfo)
-HXLINE( 130)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN( 130)		::String _hx_tmp1 = (HX_("Got transport-info before session-initiate: ",bd,bd,9d,08) + this->get_sid());
-HXDLIN( 130)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_130_transportInfo)
+HXLINE( 131)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN( 131)		::String _hx_tmp1 = (HX_("Got transport-info before session-initiate: ",bd,bd,9d,08) + this->get_sid());
+HXDLIN( 131)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
             			->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.calls.IncomingProposedSession",84,a8,44,af))
             			->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)))
             			->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("transportInfo",b7,3c,cf,b6))
             			->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/calls/Session.hx",30,90,a7,33))
-            			->setFixed(4,HX_("lineNumber",dd,81,22,76),130)));
-HXLINE( 131)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            			->setFixed(4,HX_("lineNumber",dd,81,22,76),131)));
+HXLINE( 132)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             	}
 
 
@@ -266,11 +266,11 @@ HX_DEFINE_DYNAMIC_FUNC1(IncomingProposedSession_obj,transportInfo,return )
 void IncomingProposedSession_obj::accept(){
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::calls::IncomingProposedSession,_gthis, ::borogove::Stanza,event, ::borogove::ChatMessage,msg) HXARGC(1)
             		void _hx_run(::Array< ::Dynamic> stored){
-            			HX_GC_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_140_accept)
-HXLINE( 141)			_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),1);
-HXLINE( 142)			 ::borogove::Client _gthis1 = _gthis->client;
-HXLINE( 143)			::String _hx_tmp = _gthis->from->asString();
-HXLINE( 142)			_gthis1->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(3)
+            			HX_GC_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_141_accept)
+HXLINE( 142)			_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),1);
+HXLINE( 143)			 ::borogove::Client _gthis1 = _gthis->client;
+HXLINE( 144)			::String _hx_tmp = _gthis->from->asString();
+HXLINE( 143)			_gthis1->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(3)
             				->setFixed(0,HX_("id",db,5b,00,00),msg->versions->__get(0).StaticCast<  ::borogove::ChatMessage >()->localId)
             				->setFixed(1,HX_("to",7b,65,00,00),_hx_tmp)
             				->setFixed(2,HX_("type",ba,f2,08,4d),HX_("chat",d8,5e,bf,41))))->addChild(event)->tag(HX_("store",e1,13,16,84), ::Dynamic(::hx::Anon_obj::Create(1)
@@ -278,94 +278,94 @@ HXLINE( 142)			_gthis1->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_134_accept)
-HXDLIN( 134)		 ::borogove::calls::IncomingProposedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 135)		if (this->accepted) {
-HXLINE( 135)			return;
+            	HX_GC_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_135_accept)
+HXDLIN( 135)		 ::borogove::calls::IncomingProposedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 136)		if (this->accepted) {
+HXLINE( 136)			return;
             		}
-HXLINE( 136)		this->accepted = true;
-HXLINE( 137)		 ::borogove::Client _hx_tmp = this->client;
-HXDLIN( 137)		_hx_tmp->sendPresence(this->from->asString(),null());
-HXLINE( 138)		 ::borogove::Stanza event =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("proceed",2e,96,4a,f1), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 137)		this->accepted = true;
+HXLINE( 138)		 ::borogove::Client _hx_tmp = this->client;
+HXDLIN( 138)		_hx_tmp->sendPresence(this->from->asString(),null());
+HXLINE( 139)		 ::borogove::Stanza event =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("proceed",2e,96,4a,f1), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("id",db,5b,00,00),this->get_sid())
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07))));
-HXLINE( 139)		 ::borogove::ChatMessage msg = ::borogove::calls::_Session::Session_Fields__obj::mkCallMessage(this->from,this->client->jid,event);
-HXLINE( 140)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,msg)), ::Dynamic(new _hx_Closure_0(_gthis,event,msg)),null());
+HXLINE( 140)		 ::borogove::ChatMessage msg = ::borogove::calls::_Session::Session_Fields__obj::mkCallMessage(this->from,this->client,event);
+HXLINE( 141)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,msg)), ::Dynamic(new _hx_Closure_0(_gthis,event,msg)),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(IncomingProposedSession_obj,accept,(void))
 
  ::borogove::calls::InitiatedSession IncomingProposedSession_obj::initiate( ::borogove::Stanza stanza){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_151_initiate)
-HXLINE( 153)		 ::borogove::calls::InitiatedSession session = ::borogove::calls::InitiatedSession_obj::fromSessionInitiate(this->client,stanza);
-HXLINE( 154)		::String _hx_tmp = session->get_sid();
-HXDLIN( 154)		if ((_hx_tmp != this->get_sid())) {
-HXLINE( 154)			HX_STACK_DO_THROW(HX_("id mismatch",33,05,74,bd));
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_152_initiate)
+HXLINE( 154)		 ::borogove::calls::InitiatedSession session = ::borogove::calls::InitiatedSession_obj::fromSessionInitiate(this->client,stanza);
+HXLINE( 155)		::String _hx_tmp = session->get_sid();
+HXDLIN( 155)		if ((_hx_tmp != this->get_sid())) {
+HXLINE( 155)			HX_STACK_DO_THROW(HX_("id mismatch",33,05,74,bd));
             		}
-HXLINE( 155)		if (!(this->accepted)) {
-HXLINE( 155)			HX_STACK_DO_THROW(HX_("trying to initiate unaccepted session",b1,34,34,a4));
+HXLINE( 156)		if (!(this->accepted)) {
+HXLINE( 156)			HX_STACK_DO_THROW(HX_("trying to initiate unaccepted session",b1,34,34,a4));
             		}
-HXLINE( 156)		session->accept();
-HXLINE( 157)		this->client->trigger(HX_("call/updateStatus",6c,f5,e6,ec), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 157)		session->accept();
+HXLINE( 158)		this->client->trigger(HX_("call/updateStatus",6c,f5,e6,ec), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("session",56,17,98,93),session)));
-HXLINE( 158)		return session;
+HXLINE( 159)		return session;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(IncomingProposedSession_obj,initiate,return )
 
 void IncomingProposedSession_obj::addMedia(::Array< ::Dynamic> _){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_163_addMedia)
-HXDLIN( 163)		HX_STACK_DO_THROW(HX_("Cannot add media before call starts",aa,0a,79,d5));
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_164_addMedia)
+HXDLIN( 164)		HX_STACK_DO_THROW(HX_("Cannot add media before call starts",aa,0a,79,d5));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(IncomingProposedSession_obj,addMedia,(void))
 
 int IncomingProposedSession_obj::callStatus(){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_168_callStatus)
-HXDLIN( 168)		return 1;
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_169_callStatus)
+HXDLIN( 169)		return 1;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(IncomingProposedSession_obj,callStatus,return )
 
 ::Array< ::Dynamic> IncomingProposedSession_obj::audioTracks(){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_173_audioTracks)
-HXDLIN( 173)		return ::Array_obj< ::Dynamic>::__new(0);
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_174_audioTracks)
+HXDLIN( 174)		return ::Array_obj< ::Dynamic>::__new(0);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(IncomingProposedSession_obj,audioTracks,return )
 
 ::Array< ::Dynamic> IncomingProposedSession_obj::videoTracks(){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_178_videoTracks)
-HXDLIN( 178)		return ::Array_obj< ::Dynamic>::__new(0);
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_179_videoTracks)
+HXDLIN( 179)		return ::Array_obj< ::Dynamic>::__new(0);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(IncomingProposedSession_obj,videoTracks,return )
 
  ::borogove::calls::DTMFSender IncomingProposedSession_obj::dtmf(){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_183_dtmf)
-HXDLIN( 183)		return null();
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_184_dtmf)
+HXDLIN( 184)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(IncomingProposedSession_obj,dtmf,return )
 
 ::String IncomingProposedSession_obj::get_sid(){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_187_get_sid)
-HXDLIN( 187)		return this->_sid;
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_188_get_sid)
+HXDLIN( 188)		return this->_sid;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(IncomingProposedSession_obj,get_sid,return )
 
 ::String IncomingProposedSession_obj::get_chatId(){
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_191_get_chatId)
-HXDLIN( 191)		return this->from->asBare()->asString();
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_192_get_chatId)
+HXDLIN( 192)		return this->from->asBare()->asString();
             	}
 
 
@@ -554,8 +554,8 @@ void IncomingProposedSession_obj::__register()
 void IncomingProposedSession_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_74_boot)
-HXDLIN(  74)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_8bd69e9bff10ec02_75_boot)
+HXDLIN(  75)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(5)
             				->setFixed(0,HX_("videoTracks",63,c2,24,be), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
diff --git a/Sources/c_borogove/src/borogove/calls/InitiatedSession.cpp b/Sources/c_borogove/src/borogove/calls/InitiatedSession.cpp
index f4761c6..d7715b3 100644
--- a/Sources/c_borogove/src/borogove/calls/InitiatedSession.cpp
+++ b/Sources/c_borogove/src/borogove/calls/InitiatedSession.cpp
@@ -10,6 +10,9 @@
 #ifndef INCLUDED_Std
 #include <Std.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_Caps
 #include <borogove/Caps.h>
 #endif
@@ -31,9 +34,6 @@
 #ifndef INCLUDED_borogove_EventResult
 #include <borogove/EventResult.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
-#endif
 #ifndef INCLUDED_borogove_JID
 #include <borogove/JID.h>
 #endif
@@ -101,85 +101,85 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_7acc2c8020739c2c_330_new,"borogove.calls.InitiatedSession","new",0x27873263,"borogove.calls.InitiatedSession.new","borogove/calls/Session.hx",330,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_372_get_sid,"borogove.calls.InitiatedSession","get_sid",0x628c8728,"borogove.calls.InitiatedSession.get_sid","borogove/calls/Session.hx",372,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_376_get_chatId,"borogove.calls.InitiatedSession","get_chatId",0x1872a8f9,"borogove.calls.InitiatedSession.get_chatId","borogove/calls/Session.hx",376,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_381_ring,"borogove.calls.InitiatedSession","ring",0x716cc04d,"borogove.calls.InitiatedSession.ring","borogove/calls/Session.hx",381,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_386_retract,"borogove.calls.InitiatedSession","retract",0x387a0184,"borogove.calls.InitiatedSession.retract","borogove/calls/Session.hx",386,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_393_accept,"borogove.calls.InitiatedSession","accept",0xee9814e5,"borogove.calls.InitiatedSession.accept","borogove/calls/Session.hx",393,0x33a79030)
+HX_DEFINE_STACK_FRAME(_hx_pos_7acc2c8020739c2c_331_new,"borogove.calls.InitiatedSession","new",0x27873263,"borogove.calls.InitiatedSession.new","borogove/calls/Session.hx",331,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_373_get_sid,"borogove.calls.InitiatedSession","get_sid",0x628c8728,"borogove.calls.InitiatedSession.get_sid","borogove/calls/Session.hx",373,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_377_get_chatId,"borogove.calls.InitiatedSession","get_chatId",0x1872a8f9,"borogove.calls.InitiatedSession.get_chatId","borogove/calls/Session.hx",377,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_382_ring,"borogove.calls.InitiatedSession","ring",0x716cc04d,"borogove.calls.InitiatedSession.ring","borogove/calls/Session.hx",382,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_387_retract,"borogove.calls.InitiatedSession","retract",0x387a0184,"borogove.calls.InitiatedSession.retract","borogove/calls/Session.hx",387,0x33a79030)
 HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_394_accept,"borogove.calls.InitiatedSession","accept",0xee9814e5,"borogove.calls.InitiatedSession.accept","borogove/calls/Session.hx",394,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_390_accept,"borogove.calls.InitiatedSession","accept",0xee9814e5,"borogove.calls.InitiatedSession.accept","borogove/calls/Session.hx",390,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_399_hangup,"borogove.calls.InitiatedSession","hangup",0x9b91542a,"borogove.calls.InitiatedSession.hangup","borogove/calls/Session.hx",399,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_410_initiate,"borogove.calls.InitiatedSession","initiate",0x6beadd76,"borogove.calls.InitiatedSession.initiate","borogove/calls/Session.hx",410,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_431_terminate,"borogove.calls.InitiatedSession","terminate",0xc17b78a4,"borogove.calls.InitiatedSession.terminate","borogove/calls/Session.hx",431,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_416_terminate,"borogove.calls.InitiatedSession","terminate",0xc17b78a4,"borogove.calls.InitiatedSession.terminate","borogove/calls/Session.hx",416,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_395_accept,"borogove.calls.InitiatedSession","accept",0xee9814e5,"borogove.calls.InitiatedSession.accept","borogove/calls/Session.hx",395,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_391_accept,"borogove.calls.InitiatedSession","accept",0xee9814e5,"borogove.calls.InitiatedSession.accept","borogove/calls/Session.hx",391,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_400_hangup,"borogove.calls.InitiatedSession","hangup",0x9b91542a,"borogove.calls.InitiatedSession.hangup","borogove/calls/Session.hx",400,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_411_initiate,"borogove.calls.InitiatedSession","initiate",0x6beadd76,"borogove.calls.InitiatedSession.initiate","borogove/calls/Session.hx",411,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_432_terminate,"borogove.calls.InitiatedSession","terminate",0xc17b78a4,"borogove.calls.InitiatedSession.terminate","borogove/calls/Session.hx",432,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_417_terminate,"borogove.calls.InitiatedSession","terminate",0xc17b78a4,"borogove.calls.InitiatedSession.terminate","borogove/calls/Session.hx",417,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_467_contentAdd,"borogove.calls.InitiatedSession","contentAdd",0xb4519ac5,"borogove.calls.InitiatedSession.contentAdd","borogove/calls/Session.hx",467,0x33a79030)
 HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_466_contentAdd,"borogove.calls.InitiatedSession","contentAdd",0xb4519ac5,"borogove.calls.InitiatedSession.contentAdd","borogove/calls/Session.hx",466,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_465_contentAdd,"borogove.calls.InitiatedSession","contentAdd",0xb4519ac5,"borogove.calls.InitiatedSession.contentAdd","borogove/calls/Session.hx",465,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_460_contentAdd,"borogove.calls.InitiatedSession","contentAdd",0xb4519ac5,"borogove.calls.InitiatedSession.contentAdd","borogove/calls/Session.hx",460,0x33a79030)
 HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_459_contentAdd,"borogove.calls.InitiatedSession","contentAdd",0xb4519ac5,"borogove.calls.InitiatedSession.contentAdd","borogove/calls/Session.hx",459,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_458_contentAdd,"borogove.calls.InitiatedSession","contentAdd",0xb4519ac5,"borogove.calls.InitiatedSession.contentAdd","borogove/calls/Session.hx",458,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_443_contentAdd,"borogove.calls.InitiatedSession","contentAdd",0xb4519ac5,"borogove.calls.InitiatedSession.contentAdd","borogove/calls/Session.hx",443,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_444_contentAdd,"borogove.calls.InitiatedSession","contentAdd",0xb4519ac5,"borogove.calls.InitiatedSession.contentAdd","borogove/calls/Session.hx",444,0x33a79030)
 static const bool _hx_array_data_ac07c4f1_21[] = {
 	0,
 };
 static const bool _hx_array_data_ac07c4f1_22[] = {
 	0,
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_450_contentAdd,"borogove.calls.InitiatedSession","contentAdd",0xb4519ac5,"borogove.calls.InitiatedSession.contentAdd","borogove/calls/Session.hx",450,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_483_contentAccept,"borogove.calls.InitiatedSession","contentAccept",0xcd9ee8e4,"borogove.calls.InitiatedSession.contentAccept","borogove/calls/Session.hx",483,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_510_transportInfo,"borogove.calls.InitiatedSession","transportInfo",0xa36c607a,"borogove.calls.InitiatedSession.transportInfo","borogove/calls/Session.hx",510,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_496_transportInfo,"borogove.calls.InitiatedSession","transportInfo",0xa36c607a,"borogove.calls.InitiatedSession.transportInfo","borogove/calls/Session.hx",496,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_514_addMedia,"borogove.calls.InitiatedSession","addMedia",0x8b749e20,"borogove.calls.InitiatedSession.addMedia","borogove/calls/Session.hx",514,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_529_callStatus,"borogove.calls.InitiatedSession","callStatus",0xa19ff2cd,"borogove.calls.InitiatedSession.callStatus","borogove/calls/Session.hx",529,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_539_audioTracks,"borogove.calls.InitiatedSession","audioTracks",0x0966fa01,"borogove.calls.InitiatedSession.audioTracks","borogove/calls/Session.hx",539,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_547_videoTracks,"borogove.calls.InitiatedSession","videoTracks",0xb35e5f66,"borogove.calls.InitiatedSession.videoTracks","borogove/calls/Session.hx",547,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_557_dtmf,"borogove.calls.InitiatedSession","dtmf",0x68341b86,"borogove.calls.InitiatedSession.dtmf","borogove/calls/Session.hx",557,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_555_dtmf,"borogove.calls.InitiatedSession","dtmf",0x68341b86,"borogove.calls.InitiatedSession.dtmf","borogove/calls/Session.hx",555,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_572_sendIceCandidate,"borogove.calls.InitiatedSession","sendIceCandidate",0xc418ccfd,"borogove.calls.InitiatedSession.sendIceCandidate","borogove/calls/Session.hx",572,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_584_sendIceCandidate,"borogove.calls.InitiatedSession","sendIceCandidate",0xc418ccfd,"borogove.calls.InitiatedSession.sendIceCandidate","borogove/calls/Session.hx",584,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_562_sendIceCandidate,"borogove.calls.InitiatedSession","sendIceCandidate",0xc418ccfd,"borogove.calls.InitiatedSession.sendIceCandidate","borogove/calls/Session.hx",562,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_451_contentAdd,"borogove.calls.InitiatedSession","contentAdd",0xb4519ac5,"borogove.calls.InitiatedSession.contentAdd","borogove/calls/Session.hx",451,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_484_contentAccept,"borogove.calls.InitiatedSession","contentAccept",0xcd9ee8e4,"borogove.calls.InitiatedSession.contentAccept","borogove/calls/Session.hx",484,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_511_transportInfo,"borogove.calls.InitiatedSession","transportInfo",0xa36c607a,"borogove.calls.InitiatedSession.transportInfo","borogove/calls/Session.hx",511,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_497_transportInfo,"borogove.calls.InitiatedSession","transportInfo",0xa36c607a,"borogove.calls.InitiatedSession.transportInfo","borogove/calls/Session.hx",497,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_515_addMedia,"borogove.calls.InitiatedSession","addMedia",0x8b749e20,"borogove.calls.InitiatedSession.addMedia","borogove/calls/Session.hx",515,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_530_callStatus,"borogove.calls.InitiatedSession","callStatus",0xa19ff2cd,"borogove.calls.InitiatedSession.callStatus","borogove/calls/Session.hx",530,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_540_audioTracks,"borogove.calls.InitiatedSession","audioTracks",0x0966fa01,"borogove.calls.InitiatedSession.audioTracks","borogove/calls/Session.hx",540,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_548_videoTracks,"borogove.calls.InitiatedSession","videoTracks",0xb35e5f66,"borogove.calls.InitiatedSession.videoTracks","borogove/calls/Session.hx",548,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_558_dtmf,"borogove.calls.InitiatedSession","dtmf",0x68341b86,"borogove.calls.InitiatedSession.dtmf","borogove/calls/Session.hx",558,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_556_dtmf,"borogove.calls.InitiatedSession","dtmf",0x68341b86,"borogove.calls.InitiatedSession.dtmf","borogove/calls/Session.hx",556,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_573_sendIceCandidate,"borogove.calls.InitiatedSession","sendIceCandidate",0xc418ccfd,"borogove.calls.InitiatedSession.sendIceCandidate","borogove/calls/Session.hx",573,0x33a79030)
 HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_585_sendIceCandidate,"borogove.calls.InitiatedSession","sendIceCandidate",0xc418ccfd,"borogove.calls.InitiatedSession.sendIceCandidate","borogove/calls/Session.hx",585,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_563_sendIceCandidate,"borogove.calls.InitiatedSession","sendIceCandidate",0xc418ccfd,"borogove.calls.InitiatedSession.sendIceCandidate","borogove/calls/Session.hx",563,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_586_sendIceCandidate,"borogove.calls.InitiatedSession","sendIceCandidate",0xc418ccfd,"borogove.calls.InitiatedSession.sendIceCandidate","borogove/calls/Session.hx",586,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_598_supplyMedia,"borogove.calls.InitiatedSession","supplyMedia",0x9002a938,"borogove.calls.InitiatedSession.supplyMedia","borogove/calls/Session.hx",598,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_606_supplyMedia,"borogove.calls.InitiatedSession","supplyMedia",0x9002a938,"borogove.calls.InitiatedSession.supplyMedia","borogove/calls/Session.hx",606,0x33a79030)
 HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_597_supplyMedia,"borogove.calls.InitiatedSession","supplyMedia",0x9002a938,"borogove.calls.InitiatedSession.supplyMedia","borogove/calls/Session.hx",597,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_605_supplyMedia,"borogove.calls.InitiatedSession","supplyMedia",0x9002a938,"borogove.calls.InitiatedSession.supplyMedia","borogove/calls/Session.hx",605,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_596_supplyMedia,"borogove.calls.InitiatedSession","supplyMedia",0x9002a938,"borogove.calls.InitiatedSession.supplyMedia","borogove/calls/Session.hx",596,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_a639e4155ff9c820_339_supplyMedia__fromC,"borogove.calls.InitiatedSession","supplyMedia__fromC",0x9589de41,"borogove.calls.InitiatedSession.supplyMedia__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_623_setupPeerConnection,"borogove.calls.InitiatedSession","setupPeerConnection",0x8ac53fc0,"borogove.calls.InitiatedSession.setupPeerConnection","borogove/calls/Session.hx",623,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_625_setupPeerConnection,"borogove.calls.InitiatedSession","setupPeerConnection",0x8ac53fc0,"borogove.calls.InitiatedSession.setupPeerConnection","borogove/calls/Session.hx",625,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_627_setupPeerConnection,"borogove.calls.InitiatedSession","setupPeerConnection",0x8ac53fc0,"borogove.calls.InitiatedSession.setupPeerConnection","borogove/calls/Session.hx",627,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_629_setupPeerConnection,"borogove.calls.InitiatedSession","setupPeerConnection",0x8ac53fc0,"borogove.calls.InitiatedSession.setupPeerConnection","borogove/calls/Session.hx",629,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_620_setupPeerConnection,"borogove.calls.InitiatedSession","setupPeerConnection",0x8ac53fc0,"borogove.calls.InitiatedSession.setupPeerConnection","borogove/calls/Session.hx",620,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_615_setupPeerConnection,"borogove.calls.InitiatedSession","setupPeerConnection",0x8ac53fc0,"borogove.calls.InitiatedSession.setupPeerConnection","borogove/calls/Session.hx",615,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_646_setupLocalDescription,"borogove.calls.InitiatedSession","setupLocalDescription",0x25437cb1,"borogove.calls.InitiatedSession.setupLocalDescription","borogove/calls/Session.hx",646,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_a639e4155ff9c820_354_supplyMedia__fromC,"borogove.calls.InitiatedSession","supplyMedia__fromC",0x9589de41,"borogove.calls.InitiatedSession.supplyMedia__fromC","HaxeCBridge.hx",354,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_624_setupPeerConnection,"borogove.calls.InitiatedSession","setupPeerConnection",0x8ac53fc0,"borogove.calls.InitiatedSession.setupPeerConnection","borogove/calls/Session.hx",624,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_626_setupPeerConnection,"borogove.calls.InitiatedSession","setupPeerConnection",0x8ac53fc0,"borogove.calls.InitiatedSession.setupPeerConnection","borogove/calls/Session.hx",626,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_628_setupPeerConnection,"borogove.calls.InitiatedSession","setupPeerConnection",0x8ac53fc0,"borogove.calls.InitiatedSession.setupPeerConnection","borogove/calls/Session.hx",628,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_630_setupPeerConnection,"borogove.calls.InitiatedSession","setupPeerConnection",0x8ac53fc0,"borogove.calls.InitiatedSession.setupPeerConnection","borogove/calls/Session.hx",630,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_621_setupPeerConnection,"borogove.calls.InitiatedSession","setupPeerConnection",0x8ac53fc0,"borogove.calls.InitiatedSession.setupPeerConnection","borogove/calls/Session.hx",621,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_616_setupPeerConnection,"borogove.calls.InitiatedSession","setupPeerConnection",0x8ac53fc0,"borogove.calls.InitiatedSession.setupPeerConnection","borogove/calls/Session.hx",616,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_647_setupLocalDescription,"borogove.calls.InitiatedSession","setupLocalDescription",0x25437cb1,"borogove.calls.InitiatedSession.setupLocalDescription","borogove/calls/Session.hx",647,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_652_setupLocalDescription,"borogove.calls.InitiatedSession","setupLocalDescription",0x25437cb1,"borogove.calls.InitiatedSession.setupLocalDescription","borogove/calls/Session.hx",652,0x33a79030)
 HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_651_setupLocalDescription,"borogove.calls.InitiatedSession","setupLocalDescription",0x25437cb1,"borogove.calls.InitiatedSession.setupLocalDescription","borogove/calls/Session.hx",651,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_655_setupLocalDescription,"borogove.calls.InitiatedSession","setupLocalDescription",0x25437cb1,"borogove.calls.InitiatedSession.setupLocalDescription","borogove/calls/Session.hx",655,0x33a79030)
 HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_650_setupLocalDescription,"borogove.calls.InitiatedSession","setupLocalDescription",0x25437cb1,"borogove.calls.InitiatedSession.setupLocalDescription","borogove/calls/Session.hx",650,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_654_setupLocalDescription,"borogove.calls.InitiatedSession","setupLocalDescription",0x25437cb1,"borogove.calls.InitiatedSession.setupLocalDescription","borogove/calls/Session.hx",654,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_649_setupLocalDescription,"borogove.calls.InitiatedSession","setupLocalDescription",0x25437cb1,"borogove.calls.InitiatedSession.setupLocalDescription","borogove/calls/Session.hx",649,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_662_setupLocalDescription,"borogove.calls.InitiatedSession","setupLocalDescription",0x25437cb1,"borogove.calls.InitiatedSession.setupLocalDescription","borogove/calls/Session.hx",662,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_645_setupLocalDescription,"borogove.calls.InitiatedSession","setupLocalDescription",0x25437cb1,"borogove.calls.InitiatedSession.setupLocalDescription","borogove/calls/Session.hx",645,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_690_onPeerConnection,"borogove.calls.InitiatedSession","onPeerConnection",0xb35109fc,"borogove.calls.InitiatedSession.onPeerConnection","borogove/calls/Session.hx",690,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_696_onPeerConnection,"borogove.calls.InitiatedSession","onPeerConnection",0xb35109fc,"borogove.calls.InitiatedSession.onPeerConnection","borogove/calls/Session.hx",696,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_663_setupLocalDescription,"borogove.calls.InitiatedSession","setupLocalDescription",0x25437cb1,"borogove.calls.InitiatedSession.setupLocalDescription","borogove/calls/Session.hx",663,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_646_setupLocalDescription,"borogove.calls.InitiatedSession","setupLocalDescription",0x25437cb1,"borogove.calls.InitiatedSession.setupLocalDescription","borogove/calls/Session.hx",646,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_691_onPeerConnection,"borogove.calls.InitiatedSession","onPeerConnection",0xb35109fc,"borogove.calls.InitiatedSession.onPeerConnection","borogove/calls/Session.hx",691,0x33a79030)
 HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_697_onPeerConnection,"borogove.calls.InitiatedSession","onPeerConnection",0xb35109fc,"borogove.calls.InitiatedSession.onPeerConnection","borogove/calls/Session.hx",697,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_688_onPeerConnection,"borogove.calls.InitiatedSession","onPeerConnection",0xb35109fc,"borogove.calls.InitiatedSession.onPeerConnection","borogove/calls/Session.hx",688,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_359_fromSessionInitiate,"borogove.calls.InitiatedSession","fromSessionInitiate",0xba506588,"borogove.calls.InitiatedSession.fromSessionInitiate","borogove/calls/Session.hx",359,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_330_boot,"borogove.calls.InitiatedSession","boot",0x66dde4cf,"borogove.calls.InitiatedSession.boot","borogove/calls/Session.hx",330,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_698_onPeerConnection,"borogove.calls.InitiatedSession","onPeerConnection",0xb35109fc,"borogove.calls.InitiatedSession.onPeerConnection","borogove/calls/Session.hx",698,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_689_onPeerConnection,"borogove.calls.InitiatedSession","onPeerConnection",0xb35109fc,"borogove.calls.InitiatedSession.onPeerConnection","borogove/calls/Session.hx",689,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_360_fromSessionInitiate,"borogove.calls.InitiatedSession","fromSessionInitiate",0xba506588,"borogove.calls.InitiatedSession.fromSessionInitiate","borogove/calls/Session.hx",360,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_7acc2c8020739c2c_331_boot,"borogove.calls.InitiatedSession","boot",0x66dde4cf,"borogove.calls.InitiatedSession.boot","borogove/calls/Session.hx",331,0x33a79030)
 namespace borogove{
 namespace calls{
 
 void InitiatedSession_obj::__construct( ::borogove::Client client, ::borogove::JID counterpart,::String sid, ::borogove::calls::SessionDescription remoteDescription){
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_330_new)
-HXLINE( 347)		this->candidatesDone = null();
-HXLINE( 345)		this->afterMedia = null();
-HXLINE( 344)		this->accepted = false;
-HXLINE( 343)		this->queuedOutboundCandidate = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 342)		this->queuedInboundTransportInfo = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 341)		this->peerDtlsSetup = HX_("actpass",23,e7,c3,6b);
-HXLINE( 340)		this->pc = null();
-HXLINE( 339)		this->localDescription = null();
-HXLINE( 338)		this->remoteDescription = null();
-HXLINE( 351)		this->client = client;
-HXLINE( 352)		this->counterpart = counterpart;
-HXLINE( 353)		this->_sid = sid;
-HXLINE( 354)		this->remoteDescription = remoteDescription;
-HXLINE( 355)		this->initiator = ::hx::IsNull( remoteDescription );
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_331_new)
+HXLINE( 348)		this->candidatesDone = null();
+HXLINE( 346)		this->afterMedia = null();
+HXLINE( 345)		this->accepted = false;
+HXLINE( 344)		this->queuedOutboundCandidate = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 343)		this->queuedInboundTransportInfo = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 342)		this->peerDtlsSetup = HX_("actpass",23,e7,c3,6b);
+HXLINE( 341)		this->pc = null();
+HXLINE( 340)		this->localDescription = null();
+HXLINE( 339)		this->remoteDescription = null();
+HXLINE( 352)		this->client = client;
+HXLINE( 353)		this->counterpart = counterpart;
+HXLINE( 354)		this->_sid = sid;
+HXLINE( 355)		this->remoteDescription = remoteDescription;
+HXLINE( 356)		this->initiator = ::hx::IsNull( remoteDescription );
             	}
 
 Dynamic InitiatedSession_obj::__CreateEmpty() { return new InitiatedSession_obj; }
@@ -230,24 +230,24 @@ void *InitiatedSession_obj::_hx_getInterface(int inHash) {
 }
 
 ::String InitiatedSession_obj::get_sid(){
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_372_get_sid)
-HXDLIN( 372)		return this->_sid;
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_373_get_sid)
+HXDLIN( 373)		return this->_sid;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(InitiatedSession_obj,get_sid,return )
 
 ::String InitiatedSession_obj::get_chatId(){
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_376_get_chatId)
-HXDLIN( 376)		return this->counterpart->asBare()->asString();
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_377_get_chatId)
+HXDLIN( 377)		return this->counterpart->asBare()->asString();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(InitiatedSession_obj,get_chatId,return )
 
 void InitiatedSession_obj::ring(){
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_381_ring)
-HXDLIN( 381)		this->client->trigger(HX_("call/ring",01,8e,91,54), ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_382_ring)
+HXDLIN( 382)		this->client->trigger(HX_("call/ring",01,8e,91,54), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("session",56,17,98,93),::hx::ObjectPtr<OBJ_>(this))));
             	}
 
@@ -255,15 +255,15 @@ HXDLIN( 381)		this->client->trigger(HX_("call/ring",01,8e,91,54), ::Dynamic(::hx
 HX_DEFINE_DYNAMIC_FUNC0(InitiatedSession_obj,ring,(void))
 
 void InitiatedSession_obj::retract(){
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_386_retract)
-HXDLIN( 386)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN( 386)		::String _hx_tmp1 = (HX_("Tried to retract session in wrong state: ",e1,1c,0c,db) + this->get_sid());
-HXDLIN( 386)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_387_retract)
+HXDLIN( 387)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN( 387)		::String _hx_tmp1 = (HX_("Tried to retract session in wrong state: ",e1,1c,0c,db) + this->get_sid());
+HXDLIN( 387)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
             			->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.calls.InitiatedSession",f1,c4,07,ac))
             			->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)))
             			->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("retract",01,e2,b9,fc))
             			->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/calls/Session.hx",30,90,a7,33))
-            			->setFixed(4,HX_("lineNumber",dd,81,22,76),386)));
+            			->setFixed(4,HX_("lineNumber",dd,81,22,76),387)));
             	}
 
 
@@ -272,33 +272,33 @@ HX_DEFINE_DYNAMIC_FUNC0(InitiatedSession_obj,retract,(void))
 void InitiatedSession_obj::accept(){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		bool _hx_run( ::borogove::calls::Media m){
-            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_393_accept)
-HXLINE( 393)			return (m->media == HX_("audio",d6,78,80,27));
+            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_394_accept)
+HXLINE( 394)			return (m->media == HX_("audio",d6,78,80,27));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             		bool _hx_run( ::borogove::calls::Media m){
-            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_394_accept)
-HXLINE( 394)			return (m->media == HX_("video",7b,14,fc,36));
+            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_395_accept)
+HXLINE( 395)			return (m->media == HX_("video",7b,14,fc,36));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_390_accept)
-HXLINE( 391)		bool _hx_tmp;
-HXDLIN( 391)		if (!(this->accepted)) {
-HXLINE( 391)			_hx_tmp = ::hx::IsNull( this->remoteDescription );
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_391_accept)
+HXLINE( 392)		bool _hx_tmp;
+HXDLIN( 392)		if (!(this->accepted)) {
+HXLINE( 392)			_hx_tmp = ::hx::IsNull( this->remoteDescription );
             		}
             		else {
-HXLINE( 391)			_hx_tmp = true;
+HXLINE( 392)			_hx_tmp = true;
             		}
-HXDLIN( 391)		if (_hx_tmp) {
-HXLINE( 391)			return;
+HXDLIN( 392)		if (_hx_tmp) {
+HXLINE( 392)			return;
             		}
-HXLINE( 392)		this->accepted = true;
-HXLINE( 393)		bool audio = ::hx::IsNotNull( ::Lambda_obj::find(this->remoteDescription->media, ::Dynamic(new _hx_Closure_0())) );
-HXLINE( 394)		bool video = ::hx::IsNotNull( ::Lambda_obj::find(this->remoteDescription->media, ::Dynamic(new _hx_Closure_1())) );
-HXLINE( 395)		this->client->trigger(HX_("call/media",73,5d,1d,c7), ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE( 393)		this->accepted = true;
+HXLINE( 394)		bool audio = ::hx::IsNotNull( ::Lambda_obj::find(this->remoteDescription->media, ::Dynamic(new _hx_Closure_0())) );
+HXLINE( 395)		bool video = ::hx::IsNotNull( ::Lambda_obj::find(this->remoteDescription->media, ::Dynamic(new _hx_Closure_1())) );
+HXLINE( 396)		this->client->trigger(HX_("call/media",73,5d,1d,c7), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("session",56,17,98,93),::hx::ObjectPtr<OBJ_>(this))
             			->setFixed(1,HX_("audio",d6,78,80,27),audio)
             			->setFixed(2,HX_("video",7b,14,fc,36),video)));
@@ -308,30 +308,30 @@ HXLINE( 395)		this->client->trigger(HX_("call/media",73,5d,1d,c7), ::Dynamic(::h
 HX_DEFINE_DYNAMIC_FUNC0(InitiatedSession_obj,accept,(void))
 
 void InitiatedSession_obj::hangup(){
-            	HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_399_hangup)
-HXLINE( 400)		 ::borogove::Client _hx_tmp = this->client;
-HXLINE( 401)		::String _hx_tmp1 = this->counterpart->asString();
-HXDLIN( 401)		 ::borogove::Stanza _hx_tmp2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
-            			->setFixed(0,HX_("id",db,5b,00,00),::borogove::ID_obj::medium())
+            	HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_400_hangup)
+HXLINE( 401)		 ::borogove::Client _hx_tmp = this->client;
+HXLINE( 402)		::String _hx_tmp1 = this->counterpart->asString();
+HXDLIN( 402)		 ::borogove::Stanza _hx_tmp2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
+            			->setFixed(0,HX_("id",db,5b,00,00),::_UUIDv7::UUIDv7_Fields__obj::uuidv7())
             			->setFixed(1,HX_("to",7b,65,00,00),_hx_tmp1)
             			->setFixed(2,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))));
-HXLINE( 400)		_hx_tmp->sendStanza(_hx_tmp2->tag(HX_("jingle",31,27,eb,1f), ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE( 401)		_hx_tmp->sendStanza(_hx_tmp2->tag(HX_("jingle",31,27,eb,1f), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("sid",0e,9f,57,00),this->get_sid())
             			->setFixed(1,HX_("action",b6,3b,46,16),HX_("session-terminate",6a,23,dc,12))
             			->setFixed(2,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:jingle:1",44,c4,fe,f7))))->tag(HX_("reason",c4,0f,9d,fc),null())->tag(HX_("success",c3,25,4e,b8),null())->up()->up()->up());
-HXLINE( 406)		this->terminate();
+HXLINE( 407)		this->terminate();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(InitiatedSession_obj,hangup,(void))
 
  ::borogove::calls::OutgoingSession InitiatedSession_obj::initiate( ::borogove::Stanza stanza){
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_410_initiate)
-HXLINE( 411)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN( 411)		::String _hx_tmp1 = (HX_("Trying to initiate already initiated session: ",84,56,c8,79) + this->get_sid());
-HXDLIN( 411)		_hx_tmp(_hx_tmp1,::hx::SourceInfo(HX_("borogove/calls/Session.hx",30,90,a7,33),411,HX_("borogove.calls.InitiatedSession",f1,c4,07,ac),HX_("initiate",59,6a,8f,5f)));
-HXLINE( 412)		HX_STACK_DO_THROW(HX_("already initiated",63,a5,36,1a));
-HXDLIN( 412)		return null();
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_411_initiate)
+HXLINE( 412)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN( 412)		::String _hx_tmp1 = (HX_("Trying to initiate already initiated session: ",84,56,c8,79) + this->get_sid());
+HXDLIN( 412)		_hx_tmp(_hx_tmp1,::hx::SourceInfo(HX_("borogove/calls/Session.hx",30,90,a7,33),412,HX_("borogove.calls.InitiatedSession",f1,c4,07,ac),HX_("initiate",59,6a,8f,5f)));
+HXLINE( 413)		HX_STACK_DO_THROW(HX_("already initiated",63,a5,36,1a));
+HXDLIN( 413)		return null();
             	}
 
 
@@ -340,11 +340,11 @@ HX_DEFINE_DYNAMIC_FUNC1(InitiatedSession_obj,initiate,return )
 void InitiatedSession_obj::terminate(){
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::calls::InitiatedSession,_gthis, ::borogove::Stanza,event, ::borogove::ChatMessage,msg) HXARGC(1)
             		void _hx_run(::Array< ::Dynamic> stored){
-            			HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_431_terminate)
-HXLINE( 432)			_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),1);
-HXLINE( 433)			 ::borogove::Client _gthis1 = _gthis->client;
-HXLINE( 434)			::String _hx_tmp = _gthis->counterpart->asString();
-HXLINE( 433)			_gthis1->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(3)
+            			HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_432_terminate)
+HXLINE( 433)			_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),1);
+HXLINE( 434)			 ::borogove::Client _gthis1 = _gthis->client;
+HXLINE( 435)			::String _hx_tmp = _gthis->counterpart->asString();
+HXLINE( 434)			_gthis1->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(3)
             				->setFixed(0,HX_("id",db,5b,00,00),msg->versions->__get(0).StaticCast<  ::borogove::ChatMessage >()->localId)
             				->setFixed(1,HX_("to",7b,65,00,00),_hx_tmp)
             				->setFixed(2,HX_("type",ba,f2,08,4d),HX_("chat",d8,5e,bf,41))))->addChild(event)->tag(HX_("store",e1,13,16,84), ::Dynamic(::hx::Anon_obj::Create(1)
@@ -352,48 +352,48 @@ HXLINE( 433)			_gthis1->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_416_terminate)
-HXDLIN( 416)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 417)		 ::borogove::Client _hx_tmp = this->client;
-HXDLIN( 417)		::String _hx_tmp1 = this->get_chatId();
-HXDLIN( 417)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_417_terminate)
+HXDLIN( 417)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 418)		 ::borogove::Client _hx_tmp = this->client;
+HXDLIN( 418)		::String _hx_tmp1 = this->get_chatId();
+HXDLIN( 418)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("chatId",d3,04,77,b7),_hx_tmp1)
             			->setFixed(1,HX_("sid",0e,9f,57,00),this->get_sid())));
-HXLINE( 419)		if (::hx::IsNull( this->pc )) {
-HXLINE( 419)			return;
+HXLINE( 420)		if (::hx::IsNull( this->pc )) {
+HXLINE( 420)			return;
             		}
-HXLINE( 420)		 ::borogove::calls::PeerConnection oldPc = this->pc;
-HXLINE( 421)		this->pc = null();
-HXLINE( 422)		oldPc->close();
-HXLINE( 423)		{
-HXLINE( 423)			int _g = 0;
-HXDLIN( 423)			::Array< ::Dynamic> _g1 = oldPc->getTransceivers();
-HXDLIN( 423)			while((_g < _g1->length)){
-HXLINE( 423)				 ::Dynamic tranceiver = _g1->__get(_g);
-HXDLIN( 423)				_g = (_g + 1);
-HXLINE( 424)				bool _hx_tmp2;
-HXDLIN( 424)				if (::hx::IsNotNull( tranceiver->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic) )) {
-HXLINE( 424)					_hx_tmp2 = ::hx::IsNotNull(  ::Dynamic(tranceiver->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic) );
+HXLINE( 421)		 ::borogove::calls::PeerConnection oldPc = this->pc;
+HXLINE( 422)		this->pc = null();
+HXLINE( 423)		oldPc->close();
+HXLINE( 424)		{
+HXLINE( 424)			int _g = 0;
+HXDLIN( 424)			::Array< ::Dynamic> _g1 = oldPc->getTransceivers();
+HXDLIN( 424)			while((_g < _g1->length)){
+HXLINE( 424)				 ::Dynamic tranceiver = _g1->__get(_g);
+HXDLIN( 424)				_g = (_g + 1);
+HXLINE( 425)				bool _hx_tmp2;
+HXDLIN( 425)				if (::hx::IsNotNull( tranceiver->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic) )) {
+HXLINE( 425)					_hx_tmp2 = ::hx::IsNotNull(  ::Dynamic(tranceiver->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic) );
             				}
             				else {
-HXLINE( 424)					_hx_tmp2 = false;
+HXLINE( 425)					_hx_tmp2 = false;
             				}
-HXDLIN( 424)				if (_hx_tmp2) {
-HXLINE( 425)					( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(tranceiver->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->stop();
+HXDLIN( 425)				if (_hx_tmp2) {
+HXLINE( 426)					( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(tranceiver->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->stop();
             				}
             			}
             		}
-HXLINE( 429)		 ::borogove::Stanza event =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("finish",53,40,7f,86), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 430)		 ::borogove::Stanza event =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("finish",53,40,7f,86), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("id",db,5b,00,00),this->get_sid())
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07))));
-HXLINE( 430)		 ::borogove::ChatMessage msg = ::borogove::calls::_Session::Session_Fields__obj::mkCallMessage(this->counterpart,this->client->jid,event);
-HXLINE( 431)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,msg)), ::Dynamic(new _hx_Closure_0(_gthis,event,msg)),null());
-HXLINE( 439)		{
-HXLINE( 439)			 ::borogove::Client tmp = this->client;
-HXDLIN( 439)			 ::borogove::Chat tmp1 = tmp->getChat(this->get_chatId());
-HXDLIN( 439)			if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 439)				::Dynamic this1 = tmp1->jingleSessions;
-HXDLIN( 439)				( ( ::haxe::ds::StringMap)(this1) )->remove(this->get_sid());
+HXLINE( 431)		 ::borogove::ChatMessage msg = ::borogove::calls::_Session::Session_Fields__obj::mkCallMessage(this->counterpart,this->client,event);
+HXLINE( 432)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,msg)), ::Dynamic(new _hx_Closure_0(_gthis,event,msg)),null());
+HXLINE( 440)		{
+HXLINE( 440)			 ::borogove::Client tmp = this->client;
+HXDLIN( 440)			 ::borogove::Chat tmp1 = tmp->getChat(this->get_chatId());
+HXDLIN( 440)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 440)				::Dynamic this1 = tmp1->jingleSessions;
+HXDLIN( 440)				( ( ::haxe::ds::StringMap)(this1) )->remove(this->get_sid());
             			}
             		}
             	}
@@ -412,108 +412,108 @@ void InitiatedSession_obj::contentAdd( ::borogove::Stanza stanza){
             					bool _hx_run( ::borogove::calls::Media m){
             						HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::calls::Media,m) HXARGC(1)
             						bool _hx_run( ::borogove::calls::Media addM){
-            							HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_466_contentAdd)
-HXLINE( 466)							return (addM->mid == m->mid);
+            							HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_467_contentAdd)
+HXLINE( 467)							return (addM->mid == m->mid);
             						}
             						HX_END_LOCAL_FUNC1(return)
 
-            						HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_466_contentAdd)
-HXLINE( 466)						::String _hx_tmp = ( (::String)(::Reflect_obj::field(m->contentElement(false)->attr,HX_("senders",1e,f7,a9,a8))) );
-HXDLIN( 466)						return (_hx_tmp != ( (::String)(::Reflect_obj::field(( ( ::borogove::calls::Media)(::Lambda_obj::find(addThis->media, ::Dynamic(new _hx_Closure_1(m)))) )->contentElement(false)->attr,HX_("senders",1e,f7,a9,a8))) ));
+            						HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_467_contentAdd)
+HXLINE( 467)						::String _hx_tmp = ( (::String)(::Reflect_obj::field(m->contentElement(false)->attr,HX_("senders",1e,f7,a9,a8))) );
+HXDLIN( 467)						return (_hx_tmp != ( (::String)(::Reflect_obj::field(( ( ::borogove::calls::Media)(::Lambda_obj::find(addThis->media, ::Dynamic(new _hx_Closure_1(m)))) )->contentElement(false)->attr,HX_("senders",1e,f7,a9,a8))) ));
             					}
             					HX_END_LOCAL_FUNC1(return)
 
-            					HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_465_contentAdd)
-HXLINE( 465)					if (::hx::IsNotNull( ::Lambda_obj::find(gonnaAccept->media, ::Dynamic(new _hx_Closure_2(addThis))) )) {
-HXLINE( 468)						if (::hx::IsNull( _gthis->counterpart )) {
-HXLINE( 468)							HX_STACK_DO_THROW(HX_("no counterpart?",af,8b,69,9d));
-            						}
-HXLINE( 469)						::String modify = _gthis->get_sid();
-HXDLIN( 469)						 ::borogove::Stanza modify1 = gonnaAccept->toStanza(HX_("content-modify",4e,70,8f,a8),modify,_gthis->initiator);
-HXLINE( 470)						{
-HXLINE( 470)							 ::Dynamic this1 = modify1->attr;
-HXDLIN( 470)							::Reflect_obj::setField(this1,HX_("to",7b,65,00,00),_gthis->counterpart->asString());
+            					HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_466_contentAdd)
+HXLINE( 466)					if (::hx::IsNotNull( ::Lambda_obj::find(gonnaAccept->media, ::Dynamic(new _hx_Closure_2(addThis))) )) {
+HXLINE( 469)						if (::hx::IsNull( _gthis->counterpart )) {
+HXLINE( 469)							HX_STACK_DO_THROW(HX_("no counterpart?",af,8b,69,9d));
             						}
+HXLINE( 470)						::String modify = _gthis->get_sid();
+HXDLIN( 470)						 ::borogove::Stanza modify1 = gonnaAccept->toStanza(HX_("content-modify",4e,70,8f,a8),modify,_gthis->initiator);
 HXLINE( 471)						{
-HXLINE( 471)							 ::Dynamic this2 = modify1->attr;
-HXDLIN( 471)							::Reflect_obj::setField(this2,HX_("id",db,5b,00,00),::borogove::ID_obj::medium());
+HXLINE( 471)							 ::Dynamic this1 = modify1->attr;
+HXDLIN( 471)							::Reflect_obj::setField(this1,HX_("to",7b,65,00,00),_gthis->counterpart->asString());
             						}
-HXLINE( 472)						_gthis->client->sendStanza(modify1);
+HXLINE( 472)						{
+HXLINE( 472)							 ::Dynamic this2 = modify1->attr;
+HXDLIN( 472)							::Reflect_obj::setField(this2,HX_("id",db,5b,00,00),::_UUIDv7::UUIDv7_Fields__obj::uuidv7());
+            						}
+HXLINE( 473)						_gthis->client->sendStanza(modify1);
             					}
             				}
             				HX_END_LOCAL_FUNC1((void))
 
-            				HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_459_contentAdd)
-HXLINE( 460)				 ::borogove::calls::InitiatedSession _gthis1 = _gthis;
-HXLINE( 462)				::Array< ::Dynamic> _this = addThis->media;
-HXDLIN( 462)				::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN( 462)				{
-HXLINE( 462)					int _g = 0;
-HXDLIN( 462)					int _g1 = _this->length;
-HXDLIN( 462)					while((_g < _g1)){
-HXLINE( 462)						_g = (_g + 1);
-HXDLIN( 462)						int i = (_g - 1);
-HXDLIN( 462)						{
-HXLINE( 462)							::String inValue = ( ( ::borogove::calls::Media)(_hx_array_unsafe_get(_this,i)) )->mid;
-HXDLIN( 462)							result->__unsafe_set(i,inValue);
+            				HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_460_contentAdd)
+HXLINE( 461)				 ::borogove::calls::InitiatedSession _gthis1 = _gthis;
+HXLINE( 463)				::Array< ::Dynamic> _this = addThis->media;
+HXDLIN( 463)				::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN( 463)				{
+HXLINE( 463)					int _g = 0;
+HXDLIN( 463)					int _g1 = _this->length;
+HXDLIN( 463)					while((_g < _g1)){
+HXLINE( 463)						_g = (_g + 1);
+HXDLIN( 463)						int i = (_g - 1);
+HXDLIN( 463)						{
+HXLINE( 463)							::String inValue = ( ( ::borogove::calls::Media)(_hx_array_unsafe_get(_this,i)) )->mid;
+HXDLIN( 463)							result->__unsafe_set(i,inValue);
             						}
             					}
             				}
-HXLINE( 460)				_gthis1->setupLocalDescription(HX_("content-accept",dc,ee,cb,f2),result,false, ::Dynamic(new _hx_Closure_3(_gthis,addThis)));
-HXLINE( 476)				_gthis->afterMedia = null();
+HXLINE( 461)				_gthis1->setupLocalDescription(HX_("content-accept",dc,ee,cb,f2),result,false, ::Dynamic(new _hx_Closure_3(_gthis,addThis)));
+HXLINE( 477)				_gthis->afterMedia = null();
             			}
             			HX_END_LOCAL_FUNC0((void))
 
-            			HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_458_contentAdd)
-HXLINE( 459)			_gthis->afterMedia =  ::Dynamic(new _hx_Closure_4(_gthis,addThis));
-HXLINE( 478)			return _gthis->client->trigger(HX_("call/media",73,5d,1d,c7), ::Dynamic(::hx::Anon_obj::Create(3)
+            			HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_459_contentAdd)
+HXLINE( 460)			_gthis->afterMedia =  ::Dynamic(new _hx_Closure_4(_gthis,addThis));
+HXLINE( 479)			return _gthis->client->trigger(HX_("call/media",73,5d,1d,c7), ::Dynamic(::hx::Anon_obj::Create(3)
             				->setFixed(0,HX_("session",56,17,98,93),_gthis)
             				->setFixed(1,HX_("audio",d6,78,80,27),audio->__get(0))
             				->setFixed(2,HX_("video",7b,14,fc,36),video->__get(0))));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_443_contentAdd)
-HXDLIN( 443)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 444)		if (::hx::IsNull( this->remoteDescription )) {
-HXLINE( 444)			HX_STACK_DO_THROW(HX_("Got content-add before session-accept",59,44,5e,1c));
+            	HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_444_contentAdd)
+HXDLIN( 444)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 445)		if (::hx::IsNull( this->remoteDescription )) {
+HXLINE( 445)			HX_STACK_DO_THROW(HX_("Got content-add before session-accept",59,44,5e,1c));
             		}
-HXLINE( 446)		 ::borogove::calls::SessionDescription addThis = ::borogove::calls::SessionDescription_obj::fromStanza(stanza,this->initiator,this->remoteDescription);
-HXLINE( 447)		::Array< bool > video = ::Array_obj< bool >::fromData( _hx_array_data_ac07c4f1_21,1);
-HXLINE( 448)		::Array< bool > audio = ::Array_obj< bool >::fromData( _hx_array_data_ac07c4f1_22,1);
-HXLINE( 449)		{
-HXLINE( 449)			int _g = 0;
-HXDLIN( 449)			::Array< ::Dynamic> _g1 = addThis->media;
-HXDLIN( 449)			while((_g < _g1->length)){
+HXLINE( 447)		 ::borogove::calls::SessionDescription addThis = ::borogove::calls::SessionDescription_obj::fromStanza(stanza,this->initiator,this->remoteDescription);
+HXLINE( 448)		::Array< bool > video = ::Array_obj< bool >::fromData( _hx_array_data_ac07c4f1_21,1);
+HXLINE( 449)		::Array< bool > audio = ::Array_obj< bool >::fromData( _hx_array_data_ac07c4f1_22,1);
+HXLINE( 450)		{
+HXLINE( 450)			int _g = 0;
+HXDLIN( 450)			::Array< ::Dynamic> _g1 = addThis->media;
+HXDLIN( 450)			while((_g < _g1->length)){
             				HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             				bool _hx_run( ::borogove::calls::Attribute attr){
-            					HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_450_contentAdd)
-HXLINE( 450)					if ((attr->key != HX_("sendrecv",6e,1e,9c,f4))) {
-HXLINE( 450)						return (attr->key == HX_("sendonly",b4,56,a7,f2));
+            					HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_451_contentAdd)
+HXLINE( 451)					if ((attr->key != HX_("sendrecv",6e,1e,9c,f4))) {
+HXLINE( 451)						return (attr->key == HX_("sendonly",b4,56,a7,f2));
             					}
             					else {
-HXLINE( 450)						return true;
+HXLINE( 451)						return true;
             					}
-HXDLIN( 450)					return false;
+HXDLIN( 451)					return false;
             				}
             				HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 449)				 ::borogove::calls::Media m = _g1->__get(_g).StaticCast<  ::borogove::calls::Media >();
-HXDLIN( 449)				_g = (_g + 1);
-HXLINE( 450)				if (::Lambda_obj::exists(m->attributes, ::Dynamic(new _hx_Closure_0()))) {
-HXLINE( 451)					if ((m->media == HX_("video",7b,14,fc,36))) {
-HXLINE( 451)						video[0] = true;
+HXLINE( 450)				 ::borogove::calls::Media m = _g1->__get(_g).StaticCast<  ::borogove::calls::Media >();
+HXDLIN( 450)				_g = (_g + 1);
+HXLINE( 451)				if (::Lambda_obj::exists(m->attributes, ::Dynamic(new _hx_Closure_0()))) {
+HXLINE( 452)					if ((m->media == HX_("video",7b,14,fc,36))) {
+HXLINE( 452)						video[0] = true;
             					}
-HXLINE( 452)					if ((m->media == HX_("audio",d6,78,80,27))) {
-HXLINE( 452)						audio[0] = true;
+HXLINE( 453)					if ((m->media == HX_("audio",d6,78,80,27))) {
+HXLINE( 453)						audio[0] = true;
             					}
             				}
-HXLINE( 454)				m->attributes->push( ::borogove::calls::Attribute_obj::__alloc( HX_CTX ,HX_("setup",7d,ae,2f,7a),this->peerDtlsSetup));
+HXLINE( 455)				m->attributes->push( ::borogove::calls::Attribute_obj::__alloc( HX_CTX ,HX_("setup",7d,ae,2f,7a),this->peerDtlsSetup));
             			}
             		}
-HXLINE( 456)		this->remoteDescription = this->remoteDescription->addContent(addThis);
-HXLINE( 458)		 ::borogove::calls::PeerConnection _hx_tmp = this->pc;
-HXDLIN( 458)		::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->setRemoteDescription( ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 457)		this->remoteDescription = this->remoteDescription->addContent(addThis);
+HXLINE( 459)		 ::borogove::calls::PeerConnection _hx_tmp = this->pc;
+HXDLIN( 459)		::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->setRemoteDescription( ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("sdp",bf,9a,57,00),this->remoteDescription->toSdp())
             			->setFixed(1,HX_("type",ba,f2,08,4d),cpp::Struct(rtc::Description::Type::Offer)))), ::Dynamic(new _hx_Closure_5(video,_gthis,addThis,audio)),null());
             	}
@@ -522,23 +522,23 @@ HXDLIN( 458)		::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->setRemoteDe
 HX_DEFINE_DYNAMIC_FUNC1(InitiatedSession_obj,contentAdd,(void))
 
 void InitiatedSession_obj::contentAccept( ::borogove::Stanza stanza){
-            	HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_483_contentAccept)
-HXLINE( 484)		if (::hx::IsNull( this->remoteDescription )) {
-HXLINE( 484)			HX_STACK_DO_THROW(HX_("Got content-accept before session-accept",10,3c,4f,73));
+            	HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_484_contentAccept)
+HXLINE( 485)		if (::hx::IsNull( this->remoteDescription )) {
+HXLINE( 485)			HX_STACK_DO_THROW(HX_("Got content-accept before session-accept",10,3c,4f,73));
             		}
-HXLINE( 487)		 ::borogove::calls::SessionDescription addThis = ::borogove::calls::SessionDescription_obj::fromStanza(stanza,!(this->initiator),this->remoteDescription);
-HXLINE( 488)		{
-HXLINE( 488)			int _g = 0;
-HXDLIN( 488)			::Array< ::Dynamic> _g1 = addThis->media;
-HXDLIN( 488)			while((_g < _g1->length)){
-HXLINE( 488)				 ::borogove::calls::Media m = _g1->__get(_g).StaticCast<  ::borogove::calls::Media >();
-HXDLIN( 488)				_g = (_g + 1);
-HXLINE( 489)				m->attributes->push( ::borogove::calls::Attribute_obj::__alloc( HX_CTX ,HX_("setup",7d,ae,2f,7a),this->peerDtlsSetup));
+HXLINE( 488)		 ::borogove::calls::SessionDescription addThis = ::borogove::calls::SessionDescription_obj::fromStanza(stanza,!(this->initiator),this->remoteDescription);
+HXLINE( 489)		{
+HXLINE( 489)			int _g = 0;
+HXDLIN( 489)			::Array< ::Dynamic> _g1 = addThis->media;
+HXDLIN( 489)			while((_g < _g1->length)){
+HXLINE( 489)				 ::borogove::calls::Media m = _g1->__get(_g).StaticCast<  ::borogove::calls::Media >();
+HXDLIN( 489)				_g = (_g + 1);
+HXLINE( 490)				m->attributes->push( ::borogove::calls::Attribute_obj::__alloc( HX_CTX ,HX_("setup",7d,ae,2f,7a),this->peerDtlsSetup));
             			}
             		}
-HXLINE( 491)		this->remoteDescription = this->remoteDescription->addContent(addThis);
-HXLINE( 492)		 ::borogove::calls::PeerConnection _hx_tmp = this->pc;
-HXDLIN( 492)		_hx_tmp->setRemoteDescription( ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 492)		this->remoteDescription = this->remoteDescription->addContent(addThis);
+HXLINE( 493)		 ::borogove::calls::PeerConnection _hx_tmp = this->pc;
+HXDLIN( 493)		_hx_tmp->setRemoteDescription( ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("sdp",bf,9a,57,00),this->remoteDescription->toSdp())
             			->setFixed(1,HX_("type",ba,f2,08,4d),cpp::Struct(rtc::Description::Type::Answer))));
             	}
@@ -549,249 +549,249 @@ HX_DEFINE_DYNAMIC_FUNC1(InitiatedSession_obj,contentAccept,(void))
 ::Dynamic InitiatedSession_obj::transportInfo( ::borogove::Stanza stanza){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		void _hx_run(::cpp::VirtualArray _){
-            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_510_transportInfo)
-HXLINE( 510)			return;
+            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_511_transportInfo)
+HXLINE( 511)			return;
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_496_transportInfo)
-HXDLIN( 496)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 497)		bool _hx_tmp;
-HXDLIN( 497)		if (::hx::IsNotNull( this->pc )) {
-HXLINE( 497)			_hx_tmp = ::hx::IsNull( this->remoteDescription );
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_497_transportInfo)
+HXDLIN( 497)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 498)		bool _hx_tmp;
+HXDLIN( 498)		if (::hx::IsNotNull( this->pc )) {
+HXLINE( 498)			_hx_tmp = ::hx::IsNull( this->remoteDescription );
             		}
             		else {
-HXLINE( 497)			_hx_tmp = true;
+HXLINE( 498)			_hx_tmp = true;
             		}
-HXDLIN( 497)		if (_hx_tmp) {
-HXLINE( 498)			this->queuedInboundTransportInfo->push(stanza);
-HXLINE( 499)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+HXDLIN( 498)		if (_hx_tmp) {
+HXLINE( 499)			this->queuedInboundTransportInfo->push(stanza);
+HXLINE( 500)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             		}
-HXLINE( 502)		::Array< ::Dynamic> _this = ::borogove::calls::IceCandidate_obj::fromStanza(stanza);
-HXDLIN( 502)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_this->length);
-HXDLIN( 502)		{
-HXLINE( 502)			int _g = 0;
-HXDLIN( 502)			int _g1 = _this->length;
-HXDLIN( 502)			while((_g < _g1)){
-HXLINE( 502)				_g = (_g + 1);
-HXDLIN( 502)				int i = (_g - 1);
-HXDLIN( 502)				{
-HXLINE( 502)					 ::borogove::calls::IceCandidate candidate = ( ( ::borogove::calls::IceCandidate)(_hx_array_unsafe_get(_this,i)) );
-HXLINE( 503)					int index = _gthis->remoteDescription->identificationTags->indexOf(candidate->sdpMid,null());
-HXLINE( 504)					 ::borogove::calls::PeerConnection _gthis1 = _gthis->pc;
-HXLINE( 505)					::String inValue = candidate->toSdp();
-HXLINE( 507)					 ::Dynamic inValue1;
-HXDLIN( 507)					if ((index < 0)) {
-HXLINE( 507)						inValue1 = null();
+HXLINE( 503)		::Array< ::Dynamic> _this = ::borogove::calls::IceCandidate_obj::fromStanza(stanza);
+HXDLIN( 503)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_this->length);
+HXDLIN( 503)		{
+HXLINE( 503)			int _g = 0;
+HXDLIN( 503)			int _g1 = _this->length;
+HXDLIN( 503)			while((_g < _g1)){
+HXLINE( 503)				_g = (_g + 1);
+HXDLIN( 503)				int i = (_g - 1);
+HXDLIN( 503)				{
+HXLINE( 503)					 ::borogove::calls::IceCandidate candidate = ( ( ::borogove::calls::IceCandidate)(_hx_array_unsafe_get(_this,i)) );
+HXLINE( 504)					int index = _gthis->remoteDescription->identificationTags->indexOf(candidate->sdpMid,null());
+HXLINE( 505)					 ::borogove::calls::PeerConnection _gthis1 = _gthis->pc;
+HXLINE( 506)					::String inValue = candidate->toSdp();
+HXLINE( 508)					 ::Dynamic inValue1;
+HXDLIN( 508)					if ((index < 0)) {
+HXLINE( 508)						inValue1 = null();
             					}
             					else {
-HXLINE( 507)						inValue1 = index;
+HXLINE( 508)						inValue1 = index;
             					}
-HXLINE( 502)					::Dynamic inValue2 = _gthis1->addIceCandidate( ::Dynamic(::hx::Anon_obj::Create(4)
+HXLINE( 503)					::Dynamic inValue2 = _gthis1->addIceCandidate( ::Dynamic(::hx::Anon_obj::Create(4)
             						->setFixed(0,HX_("usernameFragment",06,a8,37,89),candidate->ufrag)
             						->setFixed(1,HX_("candidate",43,34,d8,d0),inValue)
             						->setFixed(2,HX_("sdpMid",09,30,5f,d9),candidate->sdpMid)
             						->setFixed(3,HX_("sdpMLineIndex",f0,ab,d6,e2),inValue1)));
-HXDLIN( 502)					result->__unsafe_set(i,inValue2);
+HXDLIN( 503)					result->__unsafe_set(i,inValue2);
             				}
             			}
             		}
-HXDLIN( 502)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(result), ::Dynamic(new _hx_Closure_0()),null());
+HXDLIN( 503)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(result), ::Dynamic(new _hx_Closure_0()),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(InitiatedSession_obj,transportInfo,return )
 
 void InitiatedSession_obj::addMedia(::Array< ::Dynamic> streams){
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_514_addMedia)
-HXLINE( 515)		if (::hx::IsNull( this->pc )) {
-HXLINE( 515)			HX_STACK_DO_THROW(HX_("tried to add media before PeerConnection exists",25,49,19,b2));
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_515_addMedia)
+HXLINE( 516)		if (::hx::IsNull( this->pc )) {
+HXLINE( 516)			HX_STACK_DO_THROW(HX_("tried to add media before PeerConnection exists",25,49,19,b2));
             		}
-HXLINE( 517)		::Array< ::Dynamic> _this = this->localDescription->media;
-HXDLIN( 517)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN( 517)		{
-HXLINE( 517)			int _g = 0;
-HXDLIN( 517)			int _g1 = _this->length;
-HXDLIN( 517)			while((_g < _g1)){
-HXLINE( 517)				_g = (_g + 1);
-HXDLIN( 517)				int i = (_g - 1);
-HXDLIN( 517)				{
-HXLINE( 517)					::String inValue = ( ( ::borogove::calls::Media)(_hx_array_unsafe_get(_this,i)) )->mid;
-HXDLIN( 517)					result->__unsafe_set(i,inValue);
+HXLINE( 518)		::Array< ::Dynamic> _this = this->localDescription->media;
+HXDLIN( 518)		::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN( 518)		{
+HXLINE( 518)			int _g = 0;
+HXDLIN( 518)			int _g1 = _this->length;
+HXDLIN( 518)			while((_g < _g1)){
+HXLINE( 518)				_g = (_g + 1);
+HXDLIN( 518)				int i = (_g - 1);
+HXDLIN( 518)				{
+HXLINE( 518)					::String inValue = ( ( ::borogove::calls::Media)(_hx_array_unsafe_get(_this,i)) )->mid;
+HXDLIN( 518)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXLINE( 518)		{
-HXLINE( 518)			int _g2 = 0;
-HXDLIN( 518)			while((_g2 < streams->length)){
-HXLINE( 518)				 ::borogove::calls::MediaStream stream = streams->__get(_g2).StaticCast<  ::borogove::calls::MediaStream >();
-HXDLIN( 518)				_g2 = (_g2 + 1);
-HXLINE( 519)				{
-HXLINE( 519)					int _g3 = 0;
-HXDLIN( 519)					::Array< ::Dynamic> _g4 = stream->getTracks();
-HXDLIN( 519)					while((_g3 < _g4->length)){
-HXLINE( 519)						 ::borogove::calls::MediaStreamTrack track = _g4->__get(_g3).StaticCast<  ::borogove::calls::MediaStreamTrack >();
-HXDLIN( 519)						_g3 = (_g3 + 1);
-HXLINE( 520)						this->pc->addTrack(track,stream);
+HXLINE( 519)		{
+HXLINE( 519)			int _g2 = 0;
+HXDLIN( 519)			while((_g2 < streams->length)){
+HXLINE( 519)				 ::borogove::calls::MediaStream stream = streams->__get(_g2).StaticCast<  ::borogove::calls::MediaStream >();
+HXDLIN( 519)				_g2 = (_g2 + 1);
+HXLINE( 520)				{
+HXLINE( 520)					int _g3 = 0;
+HXDLIN( 520)					::Array< ::Dynamic> _g4 = stream->getTracks();
+HXDLIN( 520)					while((_g3 < _g4->length)){
+HXLINE( 520)						 ::borogove::calls::MediaStreamTrack track = _g4->__get(_g3).StaticCast<  ::borogove::calls::MediaStreamTrack >();
+HXDLIN( 520)						_g3 = (_g3 + 1);
+HXLINE( 521)						this->pc->addTrack(track,stream);
             					}
             				}
             			}
             		}
-HXLINE( 524)		this->setupLocalDescription(HX_("content-add",cd,a9,a1,10),result,true,null());
+HXLINE( 525)		this->setupLocalDescription(HX_("content-add",cd,a9,a1,10),result,true,null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(InitiatedSession_obj,addMedia,(void))
 
 int InitiatedSession_obj::callStatus(){
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_529_callStatus)
-HXDLIN( 529)		bool _hx_tmp;
-HXDLIN( 529)		bool _hx_tmp1;
-HXDLIN( 529)		if (::hx::IsNotNull( this->pc )) {
-HXDLIN( 529)			_hx_tmp1 = (this->pc->get_connectionState() == HX_("connecting",38,9f,12,f5));
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_530_callStatus)
+HXDLIN( 530)		bool _hx_tmp;
+HXDLIN( 530)		bool _hx_tmp1;
+HXDLIN( 530)		if (::hx::IsNotNull( this->pc )) {
+HXDLIN( 530)			_hx_tmp1 = (this->pc->get_connectionState() == HX_("connecting",38,9f,12,f5));
             		}
             		else {
-HXDLIN( 529)			_hx_tmp1 = true;
+HXDLIN( 530)			_hx_tmp1 = true;
             		}
-HXDLIN( 529)		if (!(_hx_tmp1)) {
-HXDLIN( 529)			_hx_tmp = (this->pc->get_connectionState() == HX_("new",60,d0,53,00));
+HXDLIN( 530)		if (!(_hx_tmp1)) {
+HXDLIN( 530)			_hx_tmp = (this->pc->get_connectionState() == HX_("new",60,d0,53,00));
             		}
             		else {
-HXDLIN( 529)			_hx_tmp = true;
+HXDLIN( 530)			_hx_tmp = true;
             		}
-HXDLIN( 529)		if (_hx_tmp) {
-HXLINE( 530)			return 3;
+HXDLIN( 530)		if (_hx_tmp) {
+HXLINE( 531)			return 3;
             		}
             		else {
-HXLINE( 531)			bool _hx_tmp2;
-HXDLIN( 531)			if ((this->pc->get_connectionState() != HX_("failed",bd,c5,fe,e7))) {
-HXLINE( 531)				_hx_tmp2 = (this->pc->get_connectionState() == HX_("closed",ac,a9,51,0e));
+HXLINE( 532)			bool _hx_tmp2;
+HXDLIN( 532)			if ((this->pc->get_connectionState() != HX_("failed",bd,c5,fe,e7))) {
+HXLINE( 532)				_hx_tmp2 = (this->pc->get_connectionState() == HX_("closed",ac,a9,51,0e));
             			}
             			else {
-HXLINE( 531)				_hx_tmp2 = true;
+HXLINE( 532)				_hx_tmp2 = true;
             			}
-HXDLIN( 531)			if (_hx_tmp2) {
-HXLINE( 532)				return 5;
+HXDLIN( 532)			if (_hx_tmp2) {
+HXLINE( 533)				return 5;
             			}
             			else {
-HXLINE( 534)				return 4;
+HXLINE( 535)				return 4;
             			}
             		}
-HXLINE( 529)		return null();
+HXLINE( 530)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(InitiatedSession_obj,callStatus,return )
 
 ::Array< ::Dynamic> InitiatedSession_obj::audioTracks(){
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_539_audioTracks)
-HXLINE( 540)		if (::hx::IsNull( this->pc )) {
-HXLINE( 540)			return ::Array_obj< ::Dynamic>::__new(0);
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_540_audioTracks)
+HXLINE( 541)		if (::hx::IsNull( this->pc )) {
+HXLINE( 541)			return ::Array_obj< ::Dynamic>::__new(0);
             		}
-HXLINE( 541)		::Array< ::Dynamic> _this = this->pc->getTransceivers();
-HXDLIN( 541)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 541)		{
-HXLINE( 541)			int _g1 = 0;
-HXDLIN( 541)			while((_g1 < _this->length)){
-HXLINE( 541)				 ::Dynamic v = _this->__get(_g1);
-HXDLIN( 541)				_g1 = (_g1 + 1);
-HXLINE( 542)				bool _hx_tmp;
-HXDLIN( 542)				bool _hx_tmp1;
-HXDLIN( 542)				bool _hx_tmp2;
-HXDLIN( 542)				if (::hx::IsNotNull( v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic) )) {
-HXLINE( 542)					_hx_tmp2 = ::hx::IsNotNull(  ::Dynamic(v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic) );
+HXLINE( 542)		::Array< ::Dynamic> _this = this->pc->getTransceivers();
+HXDLIN( 542)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 542)		{
+HXLINE( 542)			int _g1 = 0;
+HXDLIN( 542)			while((_g1 < _this->length)){
+HXLINE( 542)				 ::Dynamic v = _this->__get(_g1);
+HXDLIN( 542)				_g1 = (_g1 + 1);
+HXLINE( 543)				bool _hx_tmp;
+HXDLIN( 543)				bool _hx_tmp1;
+HXDLIN( 543)				bool _hx_tmp2;
+HXDLIN( 543)				if (::hx::IsNotNull( v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic) )) {
+HXLINE( 543)					_hx_tmp2 = ::hx::IsNotNull(  ::Dynamic(v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic) );
             				}
             				else {
-HXLINE( 542)					_hx_tmp2 = false;
+HXLINE( 543)					_hx_tmp2 = false;
             				}
-HXDLIN( 542)				if (_hx_tmp2) {
-HXLINE( 542)					_hx_tmp1 = (( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->get_kind() == HX_("audio",d6,78,80,27));
+HXDLIN( 543)				if (_hx_tmp2) {
+HXLINE( 543)					_hx_tmp1 = (( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->get_kind() == HX_("audio",d6,78,80,27));
             				}
             				else {
-HXLINE( 542)					_hx_tmp1 = false;
+HXLINE( 543)					_hx_tmp1 = false;
             				}
-HXDLIN( 542)				if (_hx_tmp1) {
-HXLINE( 542)					_hx_tmp = !(( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->get_muted());
+HXDLIN( 543)				if (_hx_tmp1) {
+HXLINE( 543)					_hx_tmp = !(( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->get_muted());
             				}
             				else {
-HXLINE( 542)					_hx_tmp = false;
+HXLINE( 543)					_hx_tmp = false;
             				}
-HXLINE( 541)				if (_hx_tmp) {
-HXLINE( 541)					_g->push(v);
+HXLINE( 542)				if (_hx_tmp) {
+HXLINE( 542)					_g->push(v);
             				}
             			}
             		}
-HXDLIN( 541)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_g->length);
-HXDLIN( 541)		{
-HXLINE( 541)			int _g2 = 0;
-HXDLIN( 541)			int _g3 = _g->length;
-HXDLIN( 541)			while((_g2 < _g3)){
-HXLINE( 541)				_g2 = (_g2 + 1);
-HXDLIN( 541)				int i = (_g2 - 1);
-HXDLIN( 541)				{
-HXLINE( 541)					 ::borogove::calls::MediaStreamTrack inValue = ( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(_hx_array_unsafe_get(_g,i)->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) );
-HXDLIN( 541)					result->__unsafe_set(i,inValue);
+HXDLIN( 542)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_g->length);
+HXDLIN( 542)		{
+HXLINE( 542)			int _g2 = 0;
+HXDLIN( 542)			int _g3 = _g->length;
+HXDLIN( 542)			while((_g2 < _g3)){
+HXLINE( 542)				_g2 = (_g2 + 1);
+HXDLIN( 542)				int i = (_g2 - 1);
+HXDLIN( 542)				{
+HXLINE( 542)					 ::borogove::calls::MediaStreamTrack inValue = ( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(_hx_array_unsafe_get(_g,i)->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) );
+HXDLIN( 542)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN( 541)		return result;
+HXDLIN( 542)		return result;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(InitiatedSession_obj,audioTracks,return )
 
 ::Array< ::Dynamic> InitiatedSession_obj::videoTracks(){
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_547_videoTracks)
-HXLINE( 548)		if (::hx::IsNull( this->pc )) {
-HXLINE( 548)			return ::Array_obj< ::Dynamic>::__new(0);
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_548_videoTracks)
+HXLINE( 549)		if (::hx::IsNull( this->pc )) {
+HXLINE( 549)			return ::Array_obj< ::Dynamic>::__new(0);
             		}
-HXLINE( 549)		::Array< ::Dynamic> _this = this->pc->getTransceivers();
-HXDLIN( 549)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 549)		{
-HXLINE( 549)			int _g1 = 0;
-HXDLIN( 549)			while((_g1 < _this->length)){
-HXLINE( 549)				 ::Dynamic v = _this->__get(_g1);
-HXDLIN( 549)				_g1 = (_g1 + 1);
-HXLINE( 550)				bool _hx_tmp;
-HXDLIN( 550)				bool _hx_tmp1;
-HXDLIN( 550)				bool _hx_tmp2;
-HXDLIN( 550)				if (::hx::IsNotNull( v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic) )) {
-HXLINE( 550)					_hx_tmp2 = ::hx::IsNotNull(  ::Dynamic(v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic) );
+HXLINE( 550)		::Array< ::Dynamic> _this = this->pc->getTransceivers();
+HXDLIN( 550)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 550)		{
+HXLINE( 550)			int _g1 = 0;
+HXDLIN( 550)			while((_g1 < _this->length)){
+HXLINE( 550)				 ::Dynamic v = _this->__get(_g1);
+HXDLIN( 550)				_g1 = (_g1 + 1);
+HXLINE( 551)				bool _hx_tmp;
+HXDLIN( 551)				bool _hx_tmp1;
+HXDLIN( 551)				bool _hx_tmp2;
+HXDLIN( 551)				if (::hx::IsNotNull( v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic) )) {
+HXLINE( 551)					_hx_tmp2 = ::hx::IsNotNull(  ::Dynamic(v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic) );
             				}
             				else {
-HXLINE( 550)					_hx_tmp2 = false;
+HXLINE( 551)					_hx_tmp2 = false;
             				}
-HXDLIN( 550)				if (_hx_tmp2) {
-HXLINE( 550)					_hx_tmp1 = (( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->get_kind() == HX_("video",7b,14,fc,36));
+HXDLIN( 551)				if (_hx_tmp2) {
+HXLINE( 551)					_hx_tmp1 = (( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->get_kind() == HX_("video",7b,14,fc,36));
             				}
             				else {
-HXLINE( 550)					_hx_tmp1 = false;
+HXLINE( 551)					_hx_tmp1 = false;
             				}
-HXDLIN( 550)				if (_hx_tmp1) {
-HXLINE( 550)					_hx_tmp = !(( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->get_muted());
+HXDLIN( 551)				if (_hx_tmp1) {
+HXLINE( 551)					_hx_tmp = !(( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(v->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->get_muted());
             				}
             				else {
-HXLINE( 550)					_hx_tmp = false;
+HXLINE( 551)					_hx_tmp = false;
             				}
-HXLINE( 549)				if (_hx_tmp) {
-HXLINE( 549)					_g->push(v);
+HXLINE( 550)				if (_hx_tmp) {
+HXLINE( 550)					_g->push(v);
             				}
             			}
             		}
-HXDLIN( 549)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_g->length);
-HXDLIN( 549)		{
-HXLINE( 549)			int _g2 = 0;
-HXDLIN( 549)			int _g3 = _g->length;
-HXDLIN( 549)			while((_g2 < _g3)){
-HXLINE( 549)				_g2 = (_g2 + 1);
-HXDLIN( 549)				int i = (_g2 - 1);
-HXDLIN( 549)				{
-HXLINE( 549)					 ::borogove::calls::MediaStreamTrack inValue = ( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(_hx_array_unsafe_get(_g,i)->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) );
-HXDLIN( 549)					result->__unsafe_set(i,inValue);
+HXDLIN( 550)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_g->length);
+HXDLIN( 550)		{
+HXLINE( 550)			int _g2 = 0;
+HXDLIN( 550)			int _g3 = _g->length;
+HXDLIN( 550)			while((_g2 < _g3)){
+HXLINE( 550)				_g2 = (_g2 + 1);
+HXDLIN( 550)				int i = (_g2 - 1);
+HXDLIN( 550)				{
+HXLINE( 550)					 ::borogove::calls::MediaStreamTrack inValue = ( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(_hx_array_unsafe_get(_g,i)->__Field(HX_("receiver",2f,45,fd,e2),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) );
+HXDLIN( 550)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN( 549)		return result;
+HXDLIN( 550)		return result;
             	}
 
 
@@ -800,40 +800,40 @@ HX_DEFINE_DYNAMIC_FUNC0(InitiatedSession_obj,videoTracks,return )
  ::borogove::calls::DTMFSender InitiatedSession_obj::dtmf(){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		bool _hx_run( ::Dynamic t){
-            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_557_dtmf)
-HXLINE( 557)			bool transceiver;
-HXDLIN( 557)			bool transceiver1;
-HXDLIN( 557)			if (::hx::IsNotNull( t->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic) )) {
-HXLINE( 557)				transceiver1 = ::hx::IsNotNull(  ::Dynamic(t->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic) );
+            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_558_dtmf)
+HXLINE( 558)			bool transceiver;
+HXDLIN( 558)			bool transceiver1;
+HXDLIN( 558)			if (::hx::IsNotNull( t->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic) )) {
+HXLINE( 558)				transceiver1 = ::hx::IsNotNull(  ::Dynamic(t->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic) );
             			}
             			else {
-HXLINE( 557)				transceiver1 = false;
+HXLINE( 558)				transceiver1 = false;
             			}
-HXDLIN( 557)			if (transceiver1) {
-HXLINE( 557)				transceiver = (( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(t->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->get_kind() == HX_("audio",d6,78,80,27));
+HXDLIN( 558)			if (transceiver1) {
+HXLINE( 558)				transceiver = (( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(t->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->get_kind() == HX_("audio",d6,78,80,27));
             			}
             			else {
-HXLINE( 557)				transceiver = false;
+HXLINE( 558)				transceiver = false;
             			}
-HXDLIN( 557)			if (transceiver) {
-HXLINE( 557)				return !(( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(t->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->get_muted());
+HXDLIN( 558)			if (transceiver) {
+HXLINE( 558)				return !(( ( ::borogove::calls::MediaStreamTrack)( ::Dynamic(t->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic))->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)) )->get_muted());
             			}
             			else {
-HXLINE( 557)				return false;
+HXLINE( 558)				return false;
             			}
-HXDLIN( 557)			return false;
+HXDLIN( 558)			return false;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_555_dtmf)
-HXLINE( 556)		if (::hx::IsNull( this->pc )) {
-HXLINE( 556)			return null();
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_556_dtmf)
+HXLINE( 557)		if (::hx::IsNull( this->pc )) {
+HXLINE( 557)			return null();
             		}
-HXLINE( 557)		 ::Dynamic transceiver = ::Lambda_obj::find(this->pc->getTransceivers(), ::Dynamic(new _hx_Closure_0()));
-HXLINE( 558)		if (::hx::IsNull( transceiver )) {
-HXLINE( 558)			return null();
+HXLINE( 558)		 ::Dynamic transceiver = ::Lambda_obj::find(this->pc->getTransceivers(), ::Dynamic(new _hx_Closure_0()));
+HXLINE( 559)		if (::hx::IsNull( transceiver )) {
+HXLINE( 559)			return null();
             		}
-HXLINE( 559)		return ( ( ::borogove::calls::DTMFSender)( ::Dynamic(transceiver->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic))->__Field(HX_("dtmf",e9,ba,71,42),::hx::paccDynamic)) );
+HXLINE( 560)		return ( ( ::borogove::calls::DTMFSender)( ::Dynamic(transceiver->__Field(HX_("sender",b5,c7,84,6b),::hx::paccDynamic))->__Field(HX_("dtmf",e9,ba,71,42),::hx::paccDynamic)) );
             	}
 
 
@@ -842,77 +842,77 @@ HX_DEFINE_DYNAMIC_FUNC0(InitiatedSession_obj,dtmf,return )
 void InitiatedSession_obj::sendIceCandidate( ::Dynamic candidate){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,candidate) HXARGC(1)
             		bool _hx_run( ::borogove::calls::Media media){
-            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_572_sendIceCandidate)
-HXLINE( 572)			return ::hx::IsEq( media->mid,candidate->__Field(HX_("sdpMid",09,30,5f,d9),::hx::paccDynamic) );
+            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_573_sendIceCandidate)
+HXLINE( 573)			return ::hx::IsEq( media->mid,candidate->__Field(HX_("sdpMid",09,30,5f,d9),::hx::paccDynamic) );
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             		bool _hx_run( ::borogove::calls::Attribute attr){
-            			HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_584_sendIceCandidate)
-HXLINE( 584)			return (attr->key == HX_("ice-pwd",3b,03,2f,e9));
+            			HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_585_sendIceCandidate)
+HXLINE( 585)			return (attr->key == HX_("ice-pwd",3b,03,2f,e9));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_562_sendIceCandidate)
-HXLINE( 563)		bool _hx_tmp;
-HXDLIN( 563)		if (::hx::IsNotNull( candidate )) {
-HXLINE( 563)			_hx_tmp = ::hx::IsEq( candidate->__Field(HX_("candidate",43,34,d8,d0),::hx::paccDynamic),HX_("",00,00,00,00) );
+            	HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_563_sendIceCandidate)
+HXLINE( 564)		bool _hx_tmp;
+HXDLIN( 564)		if (::hx::IsNotNull( candidate )) {
+HXLINE( 564)			_hx_tmp = ::hx::IsEq( candidate->__Field(HX_("candidate",43,34,d8,d0),::hx::paccDynamic),HX_("",00,00,00,00) );
             		}
             		else {
-HXLINE( 563)			_hx_tmp = true;
+HXLINE( 564)			_hx_tmp = true;
             		}
-HXDLIN( 563)		if (_hx_tmp) {
-HXLINE( 564)			if (::hx::IsNotNull( this->candidatesDone )) {
-HXLINE( 564)				this->candidatesDone();
+HXDLIN( 564)		if (_hx_tmp) {
+HXLINE( 565)			if (::hx::IsNotNull( this->candidatesDone )) {
+HXLINE( 565)				this->candidatesDone();
             			}
-HXLINE( 565)			return;
+HXLINE( 566)			return;
             		}
-HXLINE( 567)		if (::hx::IsNotNull( this->candidatesDone )) {
-HXLINE( 567)			return;
+HXLINE( 568)		if (::hx::IsNotNull( this->candidatesDone )) {
+HXLINE( 568)			return;
             		}
-HXLINE( 568)		if (::hx::IsNull( this->localDescription )) {
-HXLINE( 569)			this->queuedOutboundCandidate->push(candidate);
-HXLINE( 570)			return;
+HXLINE( 569)		if (::hx::IsNull( this->localDescription )) {
+HXLINE( 570)			this->queuedOutboundCandidate->push(candidate);
+HXLINE( 571)			return;
             		}
-HXLINE( 572)		 ::borogove::calls::Media media = ( ( ::borogove::calls::Media)(::Lambda_obj::find(this->localDescription->media, ::Dynamic(new _hx_Closure_0(candidate)))) );
-HXLINE( 573)		if (::hx::IsNull( media )) {
-HXLINE( 573)			HX_STACK_DO_THROW( ::Dynamic((HX_("Unknown media: ",d4,41,45,83) + candidate->__Field(HX_("sdpMid",09,30,5f,d9),::hx::paccDynamic))));
+HXLINE( 573)		 ::borogove::calls::Media media = ( ( ::borogove::calls::Media)(::Lambda_obj::find(this->localDescription->media, ::Dynamic(new _hx_Closure_0(candidate)))) );
+HXLINE( 574)		if (::hx::IsNull( media )) {
+HXLINE( 574)			HX_STACK_DO_THROW( ::Dynamic((HX_("Unknown media: ",d4,41,45,83) + candidate->__Field(HX_("sdpMid",09,30,5f,d9),::hx::paccDynamic))));
             		}
-HXLINE( 576)		::String media1 = media->mid;
-HXLINE( 577)		::String media2 = media->media;
-HXLINE( 578)		::String media3 = media->connectionData;
-HXLINE( 579)		::String media4 = media->port;
-HXLINE( 580)		::String media5 = media->protocol;
-HXLINE( 582)		 ::borogove::calls::Attribute transportInfo = ::borogove::calls::Attribute_obj::parse(( (::String)(candidate->__Field(HX_("candidate",43,34,d8,d0),::hx::paccDynamic)) ));
-HXLINE( 583)		 ::borogove::calls::Attribute transportInfo1 =  ::borogove::calls::Attribute_obj::__alloc( HX_CTX ,HX_("ice-ufrag",65,c2,31,ab),( (::String)(candidate->__Field(HX_("usernameFragment",06,a8,37,89),::hx::paccDynamic)) ));
-HXLINE( 584)		 ::borogove::calls::Attribute tmp = ( ( ::borogove::calls::Attribute)(::Lambda_obj::find(media->attributes, ::Dynamic(new _hx_Closure_1()))) );
-HXDLIN( 584)		 ::borogove::calls::Attribute transportInfo2;
-HXDLIN( 584)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 584)			transportInfo2 = tmp;
+HXLINE( 577)		::String media1 = media->mid;
+HXLINE( 578)		::String media2 = media->media;
+HXLINE( 579)		::String media3 = media->connectionData;
+HXLINE( 580)		::String media4 = media->port;
+HXLINE( 581)		::String media5 = media->protocol;
+HXLINE( 583)		 ::borogove::calls::Attribute transportInfo = ::borogove::calls::Attribute_obj::parse(( (::String)(candidate->__Field(HX_("candidate",43,34,d8,d0),::hx::paccDynamic)) ));
+HXLINE( 584)		 ::borogove::calls::Attribute transportInfo1 =  ::borogove::calls::Attribute_obj::__alloc( HX_CTX ,HX_("ice-ufrag",65,c2,31,ab),( (::String)(candidate->__Field(HX_("usernameFragment",06,a8,37,89),::hx::paccDynamic)) ));
+HXLINE( 585)		 ::borogove::calls::Attribute tmp = ( ( ::borogove::calls::Attribute)(::Lambda_obj::find(media->attributes, ::Dynamic(new _hx_Closure_1()))) );
+HXDLIN( 585)		 ::borogove::calls::Attribute transportInfo2;
+HXDLIN( 585)		if (::hx::IsNotNull( tmp )) {
+HXLINE( 585)			transportInfo2 = tmp;
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(1)
             			bool _hx_run( ::borogove::calls::Attribute attr){
-            				HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_585_sendIceCandidate)
-HXLINE( 585)				return (attr->key == HX_("ice-pwd",3b,03,2f,e9));
+            				HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_586_sendIceCandidate)
+HXLINE( 586)				return (attr->key == HX_("ice-pwd",3b,03,2f,e9));
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 584)			transportInfo2 = ( ( ::borogove::calls::Attribute)(::Lambda_obj::find(this->localDescription->attributes, ::Dynamic(new _hx_Closure_2()))) );
-            		}
-HXLINE( 575)		 ::borogove::calls::Media transportInfo3 =  ::borogove::calls::Media_obj::__alloc( HX_CTX ,media1,media2,media3,media4,media5,::Array_obj< ::Dynamic>::__new(3)->init(0,transportInfo)->init(1,transportInfo1)->init(2,transportInfo2),media->formats);
-HXLINE( 589)		::String transportInfo4 = this->get_sid();
-HXLINE( 574)		 ::borogove::Stanza transportInfo5 =  ::borogove::calls::TransportInfo_obj::__alloc( HX_CTX ,transportInfo3,transportInfo4)->toStanza(this->initiator);
-HXLINE( 591)		{
-HXLINE( 591)			 ::Dynamic this1 = transportInfo5->attr;
-HXDLIN( 591)			::Reflect_obj::setField(this1,HX_("to",7b,65,00,00),this->counterpart->asString());
+HXLINE( 585)			transportInfo2 = ( ( ::borogove::calls::Attribute)(::Lambda_obj::find(this->localDescription->attributes, ::Dynamic(new _hx_Closure_2()))) );
             		}
+HXLINE( 576)		 ::borogove::calls::Media transportInfo3 =  ::borogove::calls::Media_obj::__alloc( HX_CTX ,media1,media2,media3,media4,media5,::Array_obj< ::Dynamic>::__new(3)->init(0,transportInfo)->init(1,transportInfo1)->init(2,transportInfo2),media->formats);
+HXLINE( 590)		::String transportInfo4 = this->get_sid();
+HXLINE( 575)		 ::borogove::Stanza transportInfo5 =  ::borogove::calls::TransportInfo_obj::__alloc( HX_CTX ,transportInfo3,transportInfo4)->toStanza(this->initiator);
 HXLINE( 592)		{
-HXLINE( 592)			 ::Dynamic this2 = transportInfo5->attr;
-HXDLIN( 592)			::Reflect_obj::setField(this2,HX_("id",db,5b,00,00),::borogove::ID_obj::medium());
+HXLINE( 592)			 ::Dynamic this1 = transportInfo5->attr;
+HXDLIN( 592)			::Reflect_obj::setField(this1,HX_("to",7b,65,00,00),this->counterpart->asString());
             		}
-HXLINE( 593)		this->client->sendStanza(transportInfo5);
+HXLINE( 593)		{
+HXLINE( 593)			 ::Dynamic this2 = transportInfo5->attr;
+HXDLIN( 593)			::Reflect_obj::setField(this2,HX_("id",db,5b,00,00),::_UUIDv7::UUIDv7_Fields__obj::uuidv7());
+            		}
+HXLINE( 594)		this->client->sendStanza(transportInfo5);
             	}
 
 
@@ -921,75 +921,75 @@ HX_DEFINE_DYNAMIC_FUNC1(InitiatedSession_obj,sendIceCandidate,(void))
 void InitiatedSession_obj::supplyMedia(::Array< ::Dynamic> streams){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::calls::InitiatedSession,_gthis,::Array< ::Dynamic>,streams) HXARGC(0)
             		void _hx_run(){
-            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_597_supplyMedia)
-HXLINE( 598)			{
-HXLINE( 598)				int _g = 0;
-HXDLIN( 598)				while((_g < streams->length)){
-HXLINE( 598)					 ::borogove::calls::MediaStream stream = streams->__get(_g).StaticCast<  ::borogove::calls::MediaStream >();
-HXDLIN( 598)					_g = (_g + 1);
-HXLINE( 599)					{
-HXLINE( 599)						int _g1 = 0;
-HXDLIN( 599)						::Array< ::Dynamic> _g2 = stream->getTracks();
-HXDLIN( 599)						while((_g1 < _g2->length)){
-HXLINE( 599)							 ::borogove::calls::MediaStreamTrack track = _g2->__get(_g1).StaticCast<  ::borogove::calls::MediaStreamTrack >();
-HXDLIN( 599)							_g1 = (_g1 + 1);
-HXLINE( 600)							_gthis->pc->addTrack(track,stream);
+            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_598_supplyMedia)
+HXLINE( 599)			{
+HXLINE( 599)				int _g = 0;
+HXDLIN( 599)				while((_g < streams->length)){
+HXLINE( 599)					 ::borogove::calls::MediaStream stream = streams->__get(_g).StaticCast<  ::borogove::calls::MediaStream >();
+HXDLIN( 599)					_g = (_g + 1);
+HXLINE( 600)					{
+HXLINE( 600)						int _g1 = 0;
+HXDLIN( 600)						::Array< ::Dynamic> _g2 = stream->getTracks();
+HXDLIN( 600)						while((_g1 < _g2->length)){
+HXLINE( 600)							 ::borogove::calls::MediaStreamTrack track = _g2->__get(_g1).StaticCast<  ::borogove::calls::MediaStreamTrack >();
+HXDLIN( 600)							_g1 = (_g1 + 1);
+HXLINE( 601)							_gthis->pc->addTrack(track,stream);
             						}
             					}
             				}
             			}
-HXLINE( 604)			if (::hx::IsNull( _gthis->afterMedia )) {
+HXLINE( 605)			if (::hx::IsNull( _gthis->afterMedia )) {
             				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::calls::InitiatedSession,_gthis) HXARGC(1)
             				void _hx_run( ::Dynamic e){
-            					HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_605_supplyMedia)
-HXLINE( 606)					 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN( 606)					::String _hx_tmp1;
-HXDLIN( 606)					if (::hx::IsNull( e )) {
-HXLINE( 606)						_hx_tmp1 = HX_("null",87,9e,0e,49);
+            					HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_606_supplyMedia)
+HXLINE( 607)					 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN( 607)					::String _hx_tmp1;
+HXDLIN( 607)					if (::hx::IsNull( e )) {
+HXLINE( 607)						_hx_tmp1 = HX_("null",87,9e,0e,49);
             					}
             					else {
-HXLINE( 606)						_hx_tmp1 = ::Std_obj::string(e);
+HXLINE( 607)						_hx_tmp1 = ::Std_obj::string(e);
             					}
-HXDLIN( 606)					_hx_tmp(HX_("supplyMedia error",9d,f9,a0,33), ::Dynamic(::hx::Anon_obj::Create(5)
+HXDLIN( 607)					_hx_tmp(HX_("supplyMedia error",9d,f9,a0,33), ::Dynamic(::hx::Anon_obj::Create(5)
             						->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.calls.InitiatedSession",f1,c4,07,ac))
             						->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,_hx_tmp1))
             						->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("supplyMedia",35,0c,c9,9a))
             						->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/calls/Session.hx",30,90,a7,33))
-            						->setFixed(4,HX_("lineNumber",dd,81,22,76),606)));
-HXLINE( 607)					_gthis->pc->close();
+            						->setFixed(4,HX_("lineNumber",dd,81,22,76),607)));
+HXLINE( 608)					_gthis->pc->close();
             				}
             				HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 605)				::thenshim::PromiseTools_obj::catch_(_gthis->onPeerConnection(), ::Dynamic(new _hx_Closure_0(_gthis)));
+HXLINE( 606)				::thenshim::PromiseTools_obj::catch_(_gthis->onPeerConnection(), ::Dynamic(new _hx_Closure_0(_gthis)));
             			}
             			else {
-HXLINE( 610)				_gthis->afterMedia();
+HXLINE( 611)				_gthis->afterMedia();
             			}
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_596_supplyMedia)
-HXDLIN( 596)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 597)		this->setupPeerConnection( ::Dynamic(new _hx_Closure_1(_gthis,streams)));
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_597_supplyMedia)
+HXDLIN( 597)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 598)		this->setupPeerConnection( ::Dynamic(new _hx_Closure_1(_gthis,streams)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(InitiatedSession_obj,supplyMedia,(void))
 
 void InitiatedSession_obj::supplyMedia__fromC(::cpp::Pointer< void* > streams,size_t streams__len){
-            	HX_STACKFRAME(&_hx_pos_a639e4155ff9c820_339_supplyMedia__fromC)
-HXLINE( 282)		::Array< ::Dynamic> _hx_tmp;
-HXDLIN( 282)		if (::hx::IsNull( streams )) {
-HXLINE( 282)			_hx_tmp = null();
+            	HX_STACKFRAME(&_hx_pos_a639e4155ff9c820_354_supplyMedia__fromC)
+HXLINE( 302)		::Array< ::Dynamic> _hx_tmp;
+HXDLIN( 302)		if (::hx::IsNull( streams )) {
+HXLINE( 302)			_hx_tmp = ::Array_obj< ::Dynamic>::__new(0);
             		}
             		else {
-HXLINE( 282)			::cpp::Pointer<  ::borogove::calls::MediaStream > _this = streams->reinterpret();
-HXDLIN( 282)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new();
-HXDLIN( 282)			::cpp::Pointer<  ::borogove::calls::MediaStream > tmp = _this;
-HXDLIN( 282)			result->setUnmanagedData(tmp,( (int)(streams__len) ));
-HXDLIN( 282)			_hx_tmp = result->copy();
+HXLINE( 302)			::cpp::Pointer<  ::borogove::calls::MediaStream > _this = streams->reinterpret();
+HXDLIN( 302)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new();
+HXDLIN( 302)			::cpp::Pointer<  ::borogove::calls::MediaStream > tmp = _this;
+HXDLIN( 302)			result->setUnmanagedData(tmp,( (int)(streams__len) ));
+HXDLIN( 302)			_hx_tmp = result->copy();
             		}
-HXLINE( 339)		this->supplyMedia(_hx_tmp);
+HXLINE( 354)		this->supplyMedia(_hx_tmp);
             	}
 
 
@@ -1000,8 +1000,8 @@ void InitiatedSession_obj::setupPeerConnection( ::Dynamic callback){
             		void _hx_run(::Array< ::Dynamic> servers){
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::calls::InitiatedSession,_gthis) HXARGC(1)
             			void _hx_run( ::Dynamic event){
-            				HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_623_setupPeerConnection)
-HXLINE( 623)				_gthis->client->trigger(HX_("call/track",1a,e7,80,d7), ::Dynamic(::hx::Anon_obj::Create(3)
+            				HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_624_setupPeerConnection)
+HXLINE( 624)				_gthis->client->trigger(HX_("call/track",1a,e7,80,d7), ::Dynamic(::hx::Anon_obj::Create(3)
             					->setFixed(0,HX_("session",56,17,98,93),_gthis)
             					->setFixed(1,HX_("streams",f3,db,44,f6), ::Dynamic(event->__Field(HX_("streams",f3,db,44,f6),::hx::paccDynamic)))
             					->setFixed(2,HX_("track",8b,8e,1f,16), ::Dynamic(event->__Field(HX_("track",8b,8e,1f,16),::hx::paccDynamic)))));
@@ -1010,76 +1010,76 @@ HXLINE( 623)				_gthis->client->trigger(HX_("call/track",1a,e7,80,d7), ::Dynamic
 
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             			void _hx_run( ::Dynamic event){
-            				HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_625_setupPeerConnection)
-HXLINE( 625)				::haxe::Log_obj::trace(HX_("renegotiate",2b,b9,fb,a1), ::Dynamic(::hx::Anon_obj::Create(5)
+            				HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_626_setupPeerConnection)
+HXLINE( 626)				::haxe::Log_obj::trace(HX_("renegotiate",2b,b9,fb,a1), ::Dynamic(::hx::Anon_obj::Create(5)
             					->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.calls.InitiatedSession",f1,c4,07,ac))
             					->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,event))
             					->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("setupPeerConnection",bd,67,52,ae))
             					->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/calls/Session.hx",30,90,a7,33))
-            					->setFixed(4,HX_("lineNumber",dd,81,22,76),625)));
+            					->setFixed(4,HX_("lineNumber",dd,81,22,76),626)));
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::borogove::calls::InitiatedSession,_gthis) HXARGC(1)
             			void _hx_run( ::Dynamic event){
-            				HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_627_setupPeerConnection)
-HXLINE( 627)				_gthis->sendIceCandidate(event->__Field(HX_("candidate",43,34,d8,d0),::hx::paccDynamic));
+            				HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_628_setupPeerConnection)
+HXLINE( 628)				_gthis->sendIceCandidate(event->__Field(HX_("candidate",43,34,d8,d0),::hx::paccDynamic));
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_3, ::borogove::calls::InitiatedSession,_gthis) HXARGC(1)
             			void _hx_run( ::Dynamic event){
-            				HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_629_setupPeerConnection)
-HXLINE( 630)				if (::hx::IsNotNull( _gthis->pc )) {
-HXLINE( 630)					_gthis->client->trigger(HX_("call/updateStatus",6c,f5,e6,ec), ::Dynamic(::hx::Anon_obj::Create(1)
+            				HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_630_setupPeerConnection)
+HXLINE( 631)				if (::hx::IsNotNull( _gthis->pc )) {
+HXLINE( 631)					_gthis->client->trigger(HX_("call/updateStatus",6c,f5,e6,ec), ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("session",56,17,98,93),_gthis)));
             				}
-HXLINE( 631)				bool _hx_tmp;
-HXDLIN( 631)				if (::hx::IsNotNull( _gthis->pc )) {
-HXLINE( 631)					if ((_gthis->pc->get_connectionState() != HX_("closed",ac,a9,51,0e))) {
-HXLINE( 631)						_hx_tmp = (_gthis->pc->get_connectionState() == HX_("failed",bd,c5,fe,e7));
+HXLINE( 632)				bool _hx_tmp;
+HXDLIN( 632)				if (::hx::IsNotNull( _gthis->pc )) {
+HXLINE( 632)					if ((_gthis->pc->get_connectionState() != HX_("closed",ac,a9,51,0e))) {
+HXLINE( 632)						_hx_tmp = (_gthis->pc->get_connectionState() == HX_("failed",bd,c5,fe,e7));
             					}
             					else {
-HXLINE( 631)						_hx_tmp = true;
+HXLINE( 632)						_hx_tmp = true;
             					}
             				}
             				else {
-HXLINE( 631)					_hx_tmp = false;
+HXLINE( 632)					_hx_tmp = false;
             				}
-HXDLIN( 631)				if (_hx_tmp) {
-HXLINE( 632)					 ::borogove::Client _gthis1 = _gthis->client;
-HXLINE( 633)					::String _hx_tmp1 = _gthis->counterpart->asString();
-HXDLIN( 633)					 ::borogove::Stanza _hx_tmp2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
-            						->setFixed(0,HX_("id",db,5b,00,00),::borogove::ID_obj::medium())
+HXDLIN( 632)				if (_hx_tmp) {
+HXLINE( 633)					 ::borogove::Client _gthis1 = _gthis->client;
+HXLINE( 634)					::String _hx_tmp1 = _gthis->counterpart->asString();
+HXDLIN( 634)					 ::borogove::Stanza _hx_tmp2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
+            						->setFixed(0,HX_("id",db,5b,00,00),::_UUIDv7::UUIDv7_Fields__obj::uuidv7())
             						->setFixed(1,HX_("to",7b,65,00,00),_hx_tmp1)
             						->setFixed(2,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))));
-HXLINE( 632)					_gthis1->sendStanza(_hx_tmp2->tag(HX_("jingle",31,27,eb,1f), ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE( 633)					_gthis1->sendStanza(_hx_tmp2->tag(HX_("jingle",31,27,eb,1f), ::Dynamic(::hx::Anon_obj::Create(3)
             						->setFixed(0,HX_("sid",0e,9f,57,00),_gthis->get_sid())
             						->setFixed(1,HX_("action",b6,3b,46,16),HX_("session-terminate",6a,23,dc,12))
             						->setFixed(2,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:jingle:1",44,c4,fe,f7))))->tag(HX_("reason",c4,0f,9d,fc),null())->tag(HX_("connectivity-error",f2,07,09,18),null())->up()->up()->up());
-HXLINE( 638)					_gthis->terminate();
+HXLINE( 639)					_gthis->terminate();
             				}
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-            			HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_620_setupPeerConnection)
-HXLINE( 621)			_gthis->pc =  ::borogove::calls::PeerConnection_obj::__alloc( HX_CTX , ::Dynamic(::hx::Anon_obj::Create(1)
+            			HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_621_setupPeerConnection)
+HXLINE( 622)			_gthis->pc =  ::borogove::calls::PeerConnection_obj::__alloc( HX_CTX , ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("iceServers",45,14,49,d2),servers)),null());
-HXLINE( 622)			_gthis->pc->addEventListener(HX_("track",8b,8e,1f,16), ::Dynamic(new _hx_Closure_0(_gthis)));
-HXLINE( 625)			_gthis->pc->addEventListener(HX_("negotiationneeded",d6,4d,d0,53), ::Dynamic(new _hx_Closure_1()));
-HXLINE( 626)			_gthis->pc->addEventListener(HX_("icecandidate",98,ef,c0,7b), ::Dynamic(new _hx_Closure_2(_gthis)));
-HXLINE( 629)			_gthis->pc->addEventListener(HX_("connectionstatechange",e3,a2,87,36), ::Dynamic(new _hx_Closure_3(_gthis)));
-HXLINE( 641)			callback();
+HXLINE( 623)			_gthis->pc->addEventListener(HX_("track",8b,8e,1f,16), ::Dynamic(new _hx_Closure_0(_gthis)));
+HXLINE( 626)			_gthis->pc->addEventListener(HX_("negotiationneeded",d6,4d,d0,53), ::Dynamic(new _hx_Closure_1()));
+HXLINE( 627)			_gthis->pc->addEventListener(HX_("icecandidate",98,ef,c0,7b), ::Dynamic(new _hx_Closure_2(_gthis)));
+HXLINE( 630)			_gthis->pc->addEventListener(HX_("connectionstatechange",e3,a2,87,36), ::Dynamic(new _hx_Closure_3(_gthis)));
+HXLINE( 642)			callback();
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_615_setupPeerConnection)
-HXDLIN( 615)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 616)		if (::hx::IsNotNull( this->pc )) {
-HXLINE( 617)			callback();
-HXLINE( 618)			return;
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_616_setupPeerConnection)
+HXDLIN( 616)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 617)		if (::hx::IsNotNull( this->pc )) {
+HXLINE( 618)			callback();
+HXLINE( 619)			return;
             		}
-HXLINE( 620)		this->client->getIceServers( ::Dynamic(new _hx_Closure_4(_gthis,callback)));
+HXLINE( 621)		this->client->getIceServers( ::Dynamic(new _hx_Closure_4(_gthis,callback)));
             	}
 
 
@@ -1088,116 +1088,116 @@ HX_DEFINE_DYNAMIC_FUNC1(InitiatedSession_obj,setupPeerConnection,(void))
 ::Dynamic InitiatedSession_obj::setupLocalDescription(::String type,::Array< ::String > filterMedia, ::Dynamic __o_filterOut, ::Dynamic beforeSend){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_4, ::borogove::calls::InitiatedSession,_gthis,::String,type) HXARGC(1)
             		::Dynamic _hx_run( ::Dynamic _){
-            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_646_setupLocalDescription)
-HXLINE( 647)			 ::borogove::Client _gthis1 = _gthis->client;
-HXDLIN( 647)			::String caps = _gthis->counterpart->asBare()->asString();
-HXDLIN( 647)			 ::borogove::Caps caps1 = _gthis1->getDirectChat(caps,null())->getResourceCaps(_gthis->counterpart->resource);
-HXLINE( 648)			bool _hx_tmp;
-HXDLIN( 648)			bool _hx_tmp1;
-HXDLIN( 648)			if ((type != HX_("session-initiate",70,2d,30,f7))) {
-HXLINE( 648)				_hx_tmp1 = (type == HX_("session-accept",5f,92,e7,a8));
+            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_647_setupLocalDescription)
+HXLINE( 648)			 ::borogove::Client _gthis1 = _gthis->client;
+HXDLIN( 648)			::String caps = _gthis->counterpart->asBare()->asString();
+HXDLIN( 648)			 ::borogove::Caps caps1 = _gthis1->getDirectChat(caps,null())->getResourceCaps(_gthis->counterpart->resource);
+HXLINE( 649)			bool _hx_tmp;
+HXDLIN( 649)			bool _hx_tmp1;
+HXDLIN( 649)			if ((type != HX_("session-initiate",70,2d,30,f7))) {
+HXLINE( 649)				_hx_tmp1 = (type == HX_("session-accept",5f,92,e7,a8));
             			}
             			else {
-HXLINE( 648)				_hx_tmp1 = true;
+HXLINE( 649)				_hx_tmp1 = true;
             			}
-HXDLIN( 648)			if (_hx_tmp1) {
-HXLINE( 648)				_hx_tmp = caps1->features->contains(HX_("urn:ietf:rfc:3264",2b,35,57,2c));
+HXDLIN( 649)			if (_hx_tmp1) {
+HXLINE( 649)				_hx_tmp = caps1->features->contains(HX_("urn:ietf:rfc:3264",2b,35,57,2c));
             			}
             			else {
-HXLINE( 648)				_hx_tmp = false;
+HXLINE( 649)				_hx_tmp = false;
             			}
-HXDLIN( 648)			if (_hx_tmp) {
+HXDLIN( 649)			if (_hx_tmp) {
             				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_3, ::borogove::calls::InitiatedSession,_gthis) HXARGC(2)
             				void _hx_run( ::Dynamic resolve, ::Dynamic reject){
             					HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::calls::InitiatedSession,_gthis, ::Dynamic,resolve) HXARGC(0)
             					void _hx_run(){
             						HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(0)
             						void _hx_run(){
-            							HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_651_setupLocalDescription)
+            							HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_652_setupLocalDescription)
             						}
             						HX_END_LOCAL_FUNC0((void))
 
-            						HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_650_setupLocalDescription)
-HXLINE( 651)						_gthis->candidatesDone =  ::Dynamic(new _hx_Closure_0());
-HXLINE( 652)						resolve(false);
+            						HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_651_setupLocalDescription)
+HXLINE( 652)						_gthis->candidatesDone =  ::Dynamic(new _hx_Closure_0());
+HXLINE( 653)						resolve(false);
             					}
             					HX_END_LOCAL_FUNC0((void))
 
             					HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_2, ::Dynamic,resolve, ::haxe::Timer,timeout) HXARGC(0)
             					void _hx_run(){
-            						HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_654_setupLocalDescription)
-HXLINE( 655)						timeout->stop();
-HXLINE( 656)						resolve(true);
+            						HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_655_setupLocalDescription)
+HXLINE( 656)						timeout->stop();
+HXLINE( 657)						resolve(true);
             					}
             					HX_END_LOCAL_FUNC0((void))
 
-            					HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_649_setupLocalDescription)
-HXLINE( 650)					 ::haxe::Timer timeout = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_1(_gthis,resolve)),3000);
-HXLINE( 654)					_gthis->candidatesDone =  ::Dynamic(new _hx_Closure_2(resolve,timeout));
+            					HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_650_setupLocalDescription)
+HXLINE( 651)					 ::haxe::Timer timeout = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_1(_gthis,resolve)),3000);
+HXLINE( 655)					_gthis->candidatesDone =  ::Dynamic(new _hx_Closure_2(resolve,timeout));
             				}
             				HX_END_LOCAL_FUNC2((void))
 
-HXLINE( 649)				return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_3(_gthis)));
+HXLINE( 650)				return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_3(_gthis)));
             			}
             			else {
-HXLINE( 660)				return null();
+HXLINE( 661)				return null();
             			}
-HXLINE( 648)			return null();
+HXLINE( 649)			return null();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_5, ::borogove::calls::InitiatedSession,_gthis,::String,type, ::Dynamic,beforeSend, ::Dynamic,filterOut,::Array< ::String >,filterMedia) HXARGC(1)
             		void _hx_run(bool _){
-            			HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_662_setupLocalDescription)
-HXLINE( 663)			_gthis->localDescription = ::borogove::calls::SessionDescription_obj::parse(( (::String)(_gthis->pc->get_localDescription()->__Field(HX_("sdp",bf,9a,57,00),::hx::paccDynamic)) ));
-HXLINE( 664)			 ::borogove::calls::SessionDescription descriptionToSend = _gthis->localDescription;
-HXLINE( 665)			if (::hx::IsNotNull( filterMedia )) {
-HXLINE( 667)				int descriptionToSend1 = descriptionToSend->version;
-HXLINE( 668)				::String descriptionToSend2 = descriptionToSend->name;
-HXLINE( 669)				::Array< ::Dynamic> _this = descriptionToSend->media;
-HXDLIN( 669)				::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 669)				{
-HXLINE( 669)					int _g1 = 0;
-HXDLIN( 669)					while((_g1 < _this->length)){
-HXLINE( 669)						 ::borogove::calls::Media v = _this->__get(_g1).StaticCast<  ::borogove::calls::Media >();
-HXDLIN( 669)						_g1 = (_g1 + 1);
-HXDLIN( 669)						bool descriptionToSend3;
-HXDLIN( 669)						if (( (bool)(filterOut) )) {
-HXLINE( 669)							descriptionToSend3 = !(filterMedia->contains(v->mid));
+            			HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_663_setupLocalDescription)
+HXLINE( 664)			_gthis->localDescription = ::borogove::calls::SessionDescription_obj::parse(( (::String)(_gthis->pc->get_localDescription()->__Field(HX_("sdp",bf,9a,57,00),::hx::paccDynamic)) ));
+HXLINE( 665)			 ::borogove::calls::SessionDescription descriptionToSend = _gthis->localDescription;
+HXLINE( 666)			if (::hx::IsNotNull( filterMedia )) {
+HXLINE( 668)				int descriptionToSend1 = descriptionToSend->version;
+HXLINE( 669)				::String descriptionToSend2 = descriptionToSend->name;
+HXLINE( 670)				::Array< ::Dynamic> _this = descriptionToSend->media;
+HXDLIN( 670)				::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 670)				{
+HXLINE( 670)					int _g1 = 0;
+HXDLIN( 670)					while((_g1 < _this->length)){
+HXLINE( 670)						 ::borogove::calls::Media v = _this->__get(_g1).StaticCast<  ::borogove::calls::Media >();
+HXDLIN( 670)						_g1 = (_g1 + 1);
+HXDLIN( 670)						bool descriptionToSend3;
+HXDLIN( 670)						if (( (bool)(filterOut) )) {
+HXLINE( 670)							descriptionToSend3 = !(filterMedia->contains(v->mid));
             						}
             						else {
-HXLINE( 669)							descriptionToSend3 = filterMedia->contains(v->mid);
+HXLINE( 670)							descriptionToSend3 = filterMedia->contains(v->mid);
             						}
-HXDLIN( 669)						if (descriptionToSend3) {
-HXLINE( 669)							_g->push(v);
+HXDLIN( 670)						if (descriptionToSend3) {
+HXLINE( 670)							_g->push(v);
             						}
             					}
             				}
-HXLINE( 666)				descriptionToSend =  ::borogove::calls::SessionDescription_obj::__alloc( HX_CTX ,descriptionToSend1,descriptionToSend2,_g,descriptionToSend->attributes,descriptionToSend->identificationTags);
-            			}
-HXLINE( 674)			if (::hx::IsNotNull( beforeSend )) {
-HXLINE( 674)				beforeSend(descriptionToSend);
+HXLINE( 667)				descriptionToSend =  ::borogove::calls::SessionDescription_obj::__alloc( HX_CTX ,descriptionToSend1,descriptionToSend2,_g,descriptionToSend->attributes,descriptionToSend->identificationTags);
             			}
-HXLINE( 675)			::String type1 = type;
-HXDLIN( 675)			::String sessionAccept = _gthis->get_sid();
-HXDLIN( 675)			 ::borogove::Stanza sessionAccept1 = descriptionToSend->toStanza(type1,sessionAccept,_gthis->initiator);
-HXLINE( 676)			{
-HXLINE( 676)				 ::Dynamic this1 = sessionAccept1->attr;
-HXDLIN( 676)				::Reflect_obj::setField(this1,HX_("to",7b,65,00,00),_gthis->counterpart->asString());
+HXLINE( 675)			if (::hx::IsNotNull( beforeSend )) {
+HXLINE( 675)				beforeSend(descriptionToSend);
             			}
+HXLINE( 676)			::String type1 = type;
+HXDLIN( 676)			::String sessionAccept = _gthis->get_sid();
+HXDLIN( 676)			 ::borogove::Stanza sessionAccept1 = descriptionToSend->toStanza(type1,sessionAccept,_gthis->initiator);
 HXLINE( 677)			{
-HXLINE( 677)				 ::Dynamic this2 = sessionAccept1->attr;
-HXDLIN( 677)				::Reflect_obj::setField(this2,HX_("id",db,5b,00,00),::borogove::ID_obj::medium());
+HXLINE( 677)				 ::Dynamic this1 = sessionAccept1->attr;
+HXDLIN( 677)				::Reflect_obj::setField(this1,HX_("to",7b,65,00,00),_gthis->counterpart->asString());
             			}
-HXLINE( 678)			_gthis->client->sendStanza(sessionAccept1);
-HXLINE( 680)			::Array< ::Dynamic> outboundCandidate = _gthis->queuedOutboundCandidate->copy();
-HXLINE( 681)			_gthis->queuedOutboundCandidate->resize(0);
-HXLINE( 682)			{
-HXLINE( 682)				int _g2 = 0;
-HXDLIN( 682)				while((_g2 < outboundCandidate->length)){
-HXLINE( 682)					 ::Dynamic candidate = outboundCandidate->__get(_g2);
-HXDLIN( 682)					_g2 = (_g2 + 1);
-HXLINE( 683)					_gthis->sendIceCandidate(candidate);
+HXLINE( 678)			{
+HXLINE( 678)				 ::Dynamic this2 = sessionAccept1->attr;
+HXDLIN( 678)				::Reflect_obj::setField(this2,HX_("id",db,5b,00,00),::_UUIDv7::UUIDv7_Fields__obj::uuidv7());
+            			}
+HXLINE( 679)			_gthis->client->sendStanza(sessionAccept1);
+HXLINE( 681)			::Array< ::Dynamic> outboundCandidate = _gthis->queuedOutboundCandidate->copy();
+HXLINE( 682)			_gthis->queuedOutboundCandidate->resize(0);
+HXLINE( 683)			{
+HXLINE( 683)				int _g2 = 0;
+HXDLIN( 683)				while((_g2 < outboundCandidate->length)){
+HXLINE( 683)					 ::Dynamic candidate = outboundCandidate->__get(_g2);
+HXDLIN( 683)					_g2 = (_g2 + 1);
+HXLINE( 684)					_gthis->sendIceCandidate(candidate);
             				}
             			}
             		}
@@ -1205,9 +1205,9 @@ HXLINE( 683)					_gthis->sendIceCandidate(candidate);
 
             		 ::Dynamic filterOut = __o_filterOut;
             		if (::hx::IsNull(__o_filterOut)) filterOut = false;
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_645_setupLocalDescription)
-HXDLIN( 645)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 646)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->pc->setLocalDescription(null()), ::Dynamic(new _hx_Closure_4(_gthis,type)),null()), ::Dynamic(new _hx_Closure_5(_gthis,type,beforeSend,filterOut,filterMedia)),null());
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_646_setupLocalDescription)
+HXDLIN( 646)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 647)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->pc->setLocalDescription(null()), ::Dynamic(new _hx_Closure_4(_gthis,type)),null()), ::Dynamic(new _hx_Closure_5(_gthis,type,beforeSend,filterOut,filterMedia)),null());
             	}
 
 
@@ -1216,52 +1216,52 @@ HX_DEFINE_DYNAMIC_FUNC4(InitiatedSession_obj,setupLocalDescription,return )
 ::Dynamic InitiatedSession_obj::onPeerConnection(){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::calls::InitiatedSession,_gthis) HXARGC(1)
             		::Array< ::Dynamic> _hx_run( ::Dynamic _){
-            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_690_onPeerConnection)
-HXLINE( 691)			::Array< ::Dynamic> inboundTransportInfo = _gthis->queuedInboundTransportInfo->copy();
-HXLINE( 692)			_gthis->queuedInboundTransportInfo->resize(0);
-HXLINE( 693)			 ::Dynamic f = _gthis->transportInfo_dyn();
-HXDLIN( 693)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(inboundTransportInfo->length);
-HXDLIN( 693)			{
-HXLINE( 693)				int _g = 0;
-HXDLIN( 693)				int _g1 = inboundTransportInfo->length;
-HXDLIN( 693)				while((_g < _g1)){
-HXLINE( 693)					_g = (_g + 1);
-HXDLIN( 693)					int i = (_g - 1);
-HXDLIN( 693)					{
-HXLINE( 693)						::Dynamic inValue = f(_hx_array_unsafe_get(inboundTransportInfo,i));
-HXDLIN( 693)						result->__unsafe_set(i,inValue);
+            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_691_onPeerConnection)
+HXLINE( 692)			::Array< ::Dynamic> inboundTransportInfo = _gthis->queuedInboundTransportInfo->copy();
+HXLINE( 693)			_gthis->queuedInboundTransportInfo->resize(0);
+HXLINE( 694)			 ::Dynamic f = _gthis->transportInfo_dyn();
+HXDLIN( 694)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(inboundTransportInfo->length);
+HXDLIN( 694)			{
+HXLINE( 694)				int _g = 0;
+HXDLIN( 694)				int _g1 = inboundTransportInfo->length;
+HXDLIN( 694)				while((_g < _g1)){
+HXLINE( 694)					_g = (_g + 1);
+HXDLIN( 694)					int i = (_g - 1);
+HXDLIN( 694)					{
+HXLINE( 694)						::Dynamic inValue = f(_hx_array_unsafe_get(inboundTransportInfo,i));
+HXDLIN( 694)						result->__unsafe_set(i,inValue);
             					}
             				}
             			}
-HXDLIN( 693)			return result;
+HXDLIN( 694)			return result;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::calls::InitiatedSession,_gthis) HXARGC(1)
             		::Dynamic _hx_run(::Array< ::Dynamic> _){
-            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_696_onPeerConnection)
-HXLINE( 696)			return _gthis->setupLocalDescription(HX_("session-accept",5f,92,e7,a8),null(),null(),null());
+            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_697_onPeerConnection)
+HXLINE( 697)			return _gthis->setupLocalDescription(HX_("session-accept",5f,92,e7,a8),null(),null(),null());
             		}
             		HX_END_LOCAL_FUNC1(return)
 
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::borogove::calls::InitiatedSession,_gthis) HXARGC(1)
             		::String _hx_run( ::Dynamic _){
-            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_697_onPeerConnection)
-HXLINE( 698)			::String _hx_tmp;
-HXDLIN( 698)			if ((_gthis->localDescription->getDtlsSetup() == HX_("active",c6,41,46,16))) {
-HXLINE( 698)				_hx_tmp = HX_("passive",a7,47,6a,7d);
+            			HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_698_onPeerConnection)
+HXLINE( 699)			::String _hx_tmp;
+HXDLIN( 699)			if ((_gthis->localDescription->getDtlsSetup() == HX_("active",c6,41,46,16))) {
+HXLINE( 699)				_hx_tmp = HX_("passive",a7,47,6a,7d);
             			}
             			else {
-HXLINE( 698)				_hx_tmp = HX_("active",c6,41,46,16);
+HXLINE( 699)				_hx_tmp = HX_("active",c6,41,46,16);
             			}
-HXLINE( 697)			return (_gthis->peerDtlsSetup = _hx_tmp);
+HXLINE( 698)			return (_gthis->peerDtlsSetup = _hx_tmp);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_688_onPeerConnection)
-HXDLIN( 688)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 689)		 ::borogove::calls::PeerConnection _hx_tmp = this->pc;
-HXDLIN( 689)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->setRemoteDescription( ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_689_onPeerConnection)
+HXDLIN( 689)		 ::borogove::calls::InitiatedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 690)		 ::borogove::calls::PeerConnection _hx_tmp = this->pc;
+HXDLIN( 690)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->setRemoteDescription( ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("sdp",bf,9a,57,00),this->remoteDescription->toSdp())
             			->setFixed(1,HX_("type",ba,f2,08,4d),cpp::Struct(rtc::Description::Type::Offer)))), ::Dynamic(new _hx_Closure_0(_gthis)),null()), ::Dynamic(new _hx_Closure_1(_gthis)),null()), ::Dynamic(new _hx_Closure_2(_gthis)),null());
             	}
@@ -1270,13 +1270,13 @@ HXDLIN( 689)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_
 HX_DEFINE_DYNAMIC_FUNC0(InitiatedSession_obj,onPeerConnection,return )
 
  ::borogove::calls::InitiatedSession InitiatedSession_obj::fromSessionInitiate( ::borogove::Client client, ::borogove::Stanza stanza){
-            	HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_359_fromSessionInitiate)
-HXLINE( 360)		 ::borogove::Stanza jingle = stanza->getChild(HX_("jingle",31,27,eb,1f),HX_("urn:xmpp:jingle:1",44,c4,fe,f7));
-HXLINE( 363)		 ::borogove::JID session = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
-HXLINE( 364)		::String session1 = ( (::String)(::Reflect_obj::field(jingle->attr,HX_("sid",0e,9f,57,00))) );
-HXLINE( 361)		 ::borogove::calls::InitiatedSession session2 =  ::borogove::calls::InitiatedSession_obj::__alloc( HX_CTX ,client,session,session1,::borogove::calls::SessionDescription_obj::fromStanza(stanza,false,null()));
-HXLINE( 367)		session2->transportInfo(stanza);
-HXLINE( 368)		return session2;
+            	HX_GC_STACKFRAME(&_hx_pos_7acc2c8020739c2c_360_fromSessionInitiate)
+HXLINE( 361)		 ::borogove::Stanza jingle = stanza->getChild(HX_("jingle",31,27,eb,1f),HX_("urn:xmpp:jingle:1",44,c4,fe,f7));
+HXLINE( 364)		 ::borogove::JID session = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
+HXLINE( 365)		::String session1 = ( (::String)(::Reflect_obj::field(jingle->attr,HX_("sid",0e,9f,57,00))) );
+HXLINE( 362)		 ::borogove::calls::InitiatedSession session2 =  ::borogove::calls::InitiatedSession_obj::__alloc( HX_CTX ,client,session,session1,::borogove::calls::SessionDescription_obj::fromStanza(stanza,false,null()));
+HXLINE( 368)		session2->transportInfo(stanza);
+HXLINE( 369)		return session2;
             	}
 
 
@@ -1590,8 +1590,8 @@ void InitiatedSession_obj::__register()
 void InitiatedSession_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_330_boot)
-HXDLIN( 330)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_7acc2c8020739c2c_331_boot)
+HXDLIN( 331)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(11)
             				->setFixed(0,HX_("supplyMedia",35,0c,c9,9a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
diff --git a/Sources/c_borogove/src/borogove/calls/MediaStream.cpp b/Sources/c_borogove/src/borogove/calls/MediaStream.cpp
index f1976b8..c362d31 100644
--- a/Sources/c_borogove/src/borogove/calls/MediaStream.cpp
+++ b/Sources/c_borogove/src/borogove/calls/MediaStream.cpp
@@ -9,11 +9,11 @@
 #define INCLUDED_0e487a29b6aa8a9b
 #include "rtc/rtc.hpp"
 #endif
-#ifndef INCLUDED__HaxeCBridge_Internal
-#include <_HaxeCBridge/Internal.h>
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_calls_MediaStream
 #include <borogove/calls/MediaStream.h>
@@ -21,17 +21,11 @@
 #ifndef INCLUDED_borogove_calls_MediaStreamTrack
 #include <borogove/calls/MediaStreamTrack.h>
 #endif
-#ifndef INCLUDED_cpp_Int64Map
-#include <cpp/Int64Map.h>
-#endif
-#ifndef INCLUDED_haxe_IMap
-#include <haxe/IMap.h>
-#endif
 
 HX_DEFINE_STACK_FRAME(_hx_pos_fac155ba84f4ed7c_647_new,"borogove.calls.MediaStream","new",0xd95367f0,"borogove.calls.MediaStream.new","borogove/calls/PeerConnection.cpp.hx",647,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_fac155ba84f4ed7c_667_addTrack,"borogove.calls.MediaStream","addTrack",0x30fdb31a,"borogove.calls.MediaStream.addTrack","borogove/calls/PeerConnection.cpp.hx",667,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_fac155ba84f4ed7c_671_getTracks,"borogove.calls.MediaStream","getTracks",0x7131584e,"borogove.calls.MediaStream.getTracks","borogove/calls/PeerConnection.cpp.hx",671,0x6b4179c1)
-HX_LOCAL_STACK_FRAME(_hx_pos_9bd441a08c23c4d5_335_getTracks__fromC,"borogove.calls.MediaStream","getTracks__fromC",0xbc74ddeb,"borogove.calls.MediaStream.getTracks__fromC","HaxeCBridge.hx",335,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_9bd441a08c23c4d5_363_getTracks__fromC,"borogove.calls.MediaStream","getTracks__fromC",0xbc74ddeb,"borogove.calls.MediaStream.getTracks__fromC","HaxeCBridge.hx",363,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_fac155ba84f4ed7c_652_makeAudio,"borogove.calls.MediaStream","makeAudio",0xaa769398,"borogove.calls.MediaStream.makeAudio","borogove/calls/PeerConnection.cpp.hx",652,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_fac155ba84f4ed7c_646_boot,"borogove.calls.MediaStream","boot",0x47c08aa2,"borogove.calls.MediaStream.boot","borogove/calls/PeerConnection.cpp.hx",646,0x6b4179c1)
 namespace borogove{
@@ -74,57 +68,19 @@ HXDLIN( 671)		return this->tracks;
 HX_DEFINE_DYNAMIC_FUNC0(MediaStream_obj,getTracks,return )
 
 size_t MediaStream_obj::getTracks__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_9bd441a08c23c4d5_335_getTracks__fromC)
-HXDLIN( 335)		::Array< ::Dynamic> out = this->getTracks();
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g = 0;
-HXDLIN( 335)				while((_g < out->length)){
-HXDLIN( 335)					 ::borogove::calls::MediaStreamTrack el = out->__get(_g).StaticCast<  ::borogove::calls::MediaStreamTrack >();
-HXDLIN( 335)					_g = (_g + 1);
-HXDLIN( 335)					{
-HXDLIN( 335)						 ::Dynamic haxeObject = el;
-HXDLIN( 335)						void* ptr = haxeObject.mPtr;
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXDLIN( 335)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)out->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXDLIN( 335)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),out));
-HXDLIN( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_9bd441a08c23c4d5_363_getTracks__fromC)
+HXDLIN( 363)		::Array< ::Dynamic> out = this->getTracks();
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
  ::borogove::calls::MediaStream MediaStream_obj::makeAudio(){
             	HX_GC_STACKFRAME(&_hx_pos_fac155ba84f4ed7c_652_makeAudio)
-HXLINE( 653)		 rtc::Description::Audio audio =  rtc::Description::Audio(::hx::StdString(::borogove::ID_obj::tiny()),cpp::Struct(rtc::Description::Direction::SendRecv));
+HXLINE( 653)		 rtc::Description::Audio audio =  rtc::Description::Audio(::hx::StdString(::_UUIDv7::UUIDv7_Fields__obj::uuidv7()),cpp::Struct(rtc::Description::Direction::SendRecv));
 HXLINE( 654)		audio.addOpusCodec(107);
 HXLINE( 655)		audio.addPCMUCodec(0);
 HXLINE( 656)		audio.addAudioCodec(101,::hx::StdString(HX_("telephone-event/8000",36,ae,10,93)));
diff --git a/Sources/c_borogove/src/borogove/calls/MediaStreamTrack.cpp b/Sources/c_borogove/src/borogove/calls/MediaStreamTrack.cpp
index 5e2f4cb..449cb95 100644
--- a/Sources/c_borogove/src/borogove/calls/MediaStreamTrack.cpp
+++ b/Sources/c_borogove/src/borogove/calls/MediaStreamTrack.cpp
@@ -31,6 +31,9 @@
 #ifndef INCLUDED_Std
 #include <Std.h>
 #endif
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
+#endif
 #ifndef INCLUDED__HaxeCBridge_Internal
 #include <_HaxeCBridge/Internal.h>
 #endif
@@ -68,28 +71,28 @@
 HX_DEFINE_STACK_FRAME(_hx_pos_306b50e70c93d428_376_new,"borogove.calls.MediaStreamTrack","new",0x7b5fd11f,"borogove.calls.MediaStreamTrack.new","borogove/calls/PeerConnection.cpp.hx",376,0x6b4179c1)
 HX_DEFINE_STACK_FRAME(_hx_pos_306b50e70c93d428_380_new,"borogove.calls.MediaStreamTrack","new",0x7b5fd11f,"borogove.calls.MediaStreamTrack.new","borogove/calls/PeerConnection.cpp.hx",380,0x6b4179c1)
 HX_DEFINE_STACK_FRAME(_hx_pos_306b50e70c93d428_339_new,"borogove.calls.MediaStreamTrack","new",0x7b5fd11f,"borogove.calls.MediaStreamTrack.new","borogove/calls/PeerConnection.cpp.hx",339,0x6b4179c1)
-HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_398_id__fromC,"borogove.calls.MediaStreamTrack","id__fromC",0xa034affd,"borogove.calls.MediaStreamTrack.id__fromC","HaxeCBridge.hx",398,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_398_muted__fromC,"borogove.calls.MediaStreamTrack","muted__fromC",0x42c9e3cf,"borogove.calls.MediaStreamTrack.muted__fromC","HaxeCBridge.hx",398,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_398_kind__fromC,"borogove.calls.MediaStreamTrack","kind__fromC",0xf1077964,"borogove.calls.MediaStreamTrack.kind__fromC","HaxeCBridge.hx",398,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_385_supportedAudioFormats__fromC,"borogove.calls.MediaStreamTrack","supportedAudioFormats__fromC",0x708971e6,"borogove.calls.MediaStreamTrack.supportedAudioFormats__fromC","HaxeCBridge.hx",385,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_426_id__fromC,"borogove.calls.MediaStreamTrack","id__fromC",0xa034affd,"borogove.calls.MediaStreamTrack.id__fromC","HaxeCBridge.hx",426,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_426_muted__fromC,"borogove.calls.MediaStreamTrack","muted__fromC",0x42c9e3cf,"borogove.calls.MediaStreamTrack.muted__fromC","HaxeCBridge.hx",426,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_426_kind__fromC,"borogove.calls.MediaStreamTrack","kind__fromC",0xf1077964,"borogove.calls.MediaStreamTrack.kind__fromC","HaxeCBridge.hx",426,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_413_supportedAudioFormats__fromC,"borogove.calls.MediaStreamTrack","supportedAudioFormats__fromC",0x708971e6,"borogove.calls.MediaStreamTrack.supportedAudioFormats__fromC","HaxeCBridge.hx",413,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_403_get_id,"borogove.calls.MediaStreamTrack","get_id",0x15e3b3c5,"borogove.calls.MediaStreamTrack.get_id","borogove/calls/PeerConnection.cpp.hx",403,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_410_get_kind,"borogove.calls.MediaStreamTrack","get_kind",0x1e6287be,"borogove.calls.MediaStreamTrack.get_kind","borogove/calls/PeerConnection.cpp.hx",410,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_411_get_muted,"borogove.calls.MediaStreamTrack","get_muted",0xa69485c1,"borogove.calls.MediaStreamTrack.get_muted","borogove/calls/PeerConnection.cpp.hx",411,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_413_get_supportedAudioFormats,"borogove.calls.MediaStreamTrack","get_supportedAudioFormats",0xeadaf8ca,"borogove.calls.MediaStreamTrack.get_supportedAudioFormats","borogove/calls/PeerConnection.cpp.hx",413,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_440_set_track,"borogove.calls.MediaStreamTrack","set_track",0x8fa970ed,"borogove.calls.MediaStreamTrack.set_track","borogove/calls/PeerConnection.cpp.hx",440,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_474_addPCMListener,"borogove.calls.MediaStreamTrack","addPCMListener",0x656a6eae,"borogove.calls.MediaStreamTrack.addPCMListener","borogove/calls/PeerConnection.cpp.hx",474,0x6b4179c1)
-HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_272_addPCMListener__fromC,"borogove.calls.MediaStreamTrack","addPCMListener__fromC",0x7a15538b,"borogove.calls.MediaStreamTrack.addPCMListener__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_339_addPCMListener__fromC,"borogove.calls.MediaStreamTrack","addPCMListener__fromC",0x7a15538b,"borogove.calls.MediaStreamTrack.addPCMListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_282_addPCMListener__fromC,"borogove.calls.MediaStreamTrack","addPCMListener__fromC",0x7a15538b,"borogove.calls.MediaStreamTrack.addPCMListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_354_addPCMListener__fromC,"borogove.calls.MediaStreamTrack","addPCMListener__fromC",0x7a15538b,"borogove.calls.MediaStreamTrack.addPCMListener__fromC","HaxeCBridge.hx",354,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_499_onFrame,"borogove.calls.MediaStreamTrack","onFrame",0x8755e2cd,"borogove.calls.MediaStreamTrack.onFrame","borogove/calls/PeerConnection.cpp.hx",499,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_533_addReadyForPCMListener,"borogove.calls.MediaStreamTrack","addReadyForPCMListener",0x5fd175e8,"borogove.calls.MediaStreamTrack.addReadyForPCMListener","borogove/calls/PeerConnection.cpp.hx",533,0x6b4179c1)
-HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_272_addReadyForPCMListener__fromC,"borogove.calls.MediaStreamTrack","addReadyForPCMListener__fromC",0x011b0791,"borogove.calls.MediaStreamTrack.addReadyForPCMListener__fromC","HaxeCBridge.hx",272,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_339_addReadyForPCMListener__fromC,"borogove.calls.MediaStreamTrack","addReadyForPCMListener__fromC",0x011b0791,"borogove.calls.MediaStreamTrack.addReadyForPCMListener__fromC","HaxeCBridge.hx",339,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_282_addReadyForPCMListener__fromC,"borogove.calls.MediaStreamTrack","addReadyForPCMListener__fromC",0x011b0791,"borogove.calls.MediaStreamTrack.addReadyForPCMListener__fromC","HaxeCBridge.hx",282,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_354_addReadyForPCMListener__fromC,"borogove.calls.MediaStreamTrack","addReadyForPCMListener__fromC",0x011b0791,"borogove.calls.MediaStreamTrack.addReadyForPCMListener__fromC","HaxeCBridge.hx",354,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_540_notifyReadyForData,"borogove.calls.MediaStreamTrack","notifyReadyForData",0xc7f10a3a,"borogove.calls.MediaStreamTrack.notifyReadyForData","borogove/calls/PeerConnection.cpp.hx",540,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_544_notifyReadyForData,"borogove.calls.MediaStreamTrack","notifyReadyForData",0xc7f10a3a,"borogove.calls.MediaStreamTrack.notifyReadyForData","borogove/calls/PeerConnection.cpp.hx",544,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_564_writePCM,"borogove.calls.MediaStreamTrack","writePCM",0x7b93825c,"borogove.calls.MediaStreamTrack.writePCM","borogove/calls/PeerConnection.cpp.hx",564,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_569_writePCM,"borogove.calls.MediaStreamTrack","writePCM",0x7b93825c,"borogove.calls.MediaStreamTrack.writePCM","borogove/calls/PeerConnection.cpp.hx",569,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_563_writePCM,"borogove.calls.MediaStreamTrack","writePCM",0x7b93825c,"borogove.calls.MediaStreamTrack.writePCM","borogove/calls/PeerConnection.cpp.hx",563,0x6b4179c1)
-HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_339_writePCM__fromC,"borogove.calls.MediaStreamTrack","writePCM__fromC",0x09ce319d,"borogove.calls.MediaStreamTrack.writePCM__fromC","HaxeCBridge.hx",339,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_1f66e5b64430fc7f_354_writePCM__fromC,"borogove.calls.MediaStreamTrack","writePCM__fromC",0x09ce319d,"borogove.calls.MediaStreamTrack.writePCM__fromC","HaxeCBridge.hx",354,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_612_onAudioLoop,"borogove.calls.MediaStreamTrack","onAudioLoop",0x52d9a8fa,"borogove.calls.MediaStreamTrack.onAudioLoop","borogove/calls/PeerConnection.cpp.hx",612,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_616_write,"borogove.calls.MediaStreamTrack","write",0x26f65b5e,"borogove.calls.MediaStreamTrack.write","borogove/calls/PeerConnection.cpp.hx",616,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_628_advanceTimestamp,"borogove.calls.MediaStreamTrack","advanceTimestamp",0xdd6abfd5,"borogove.calls.MediaStreamTrack.advanceTimestamp","borogove/calls/PeerConnection.cpp.hx",628,0x6b4179c1)
@@ -98,11 +101,11 @@ HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_367_fromTrack,"borogove.calls.Medi
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_480_pcmToUlaw,"borogove.calls.MediaStreamTrack","pcmToUlaw",0x27495ae1,"borogove.calls.MediaStreamTrack.pcmToUlaw","borogove/calls/PeerConnection.cpp.hx",480,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_339_boot,"borogove.calls.MediaStreamTrack","boot",0x70902a93,"borogove.calls.MediaStreamTrack.boot","borogove/calls/PeerConnection.cpp.hx",339,0x6b4179c1)
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_477_boot,"borogove.calls.MediaStreamTrack","boot",0x70902a93,"borogove.calls.MediaStreamTrack.boot","borogove/calls/PeerConnection.cpp.hx",477,0x6b4179c1)
-static const short _hx_array_data_338355ad_39[] = {
+static const short _hx_array_data_338355ad_38[] = {
 	(short)-32124,(short)-31100,(short)-30076,(short)-29052,(short)-28028,(short)-27004,(short)-25980,(short)-24956,(short)-23932,(short)-22908,(short)-21884,(short)-20860,(short)-19836,(short)-18812,(short)-17788,(short)-16764,(short)-15996,(short)-15484,(short)-14972,(short)-14460,(short)-13948,(short)-13436,(short)-12924,(short)-12412,(short)-11900,(short)-11388,(short)-10876,(short)-10364,(short)-9852,(short)-9340,(short)-8828,(short)-8316,(short)-7932,(short)-7676,(short)-7420,(short)-7164,(short)-6908,(short)-6652,(short)-6396,(short)-6140,(short)-5884,(short)-5628,(short)-5372,(short)-5116,(short)-4860,(short)-4604,(short)-4348,(short)-4092,(short)-3900,(short)-3772,(short)-3644,(short)-3516,(short)-3388,(short)-3260,(short)-3132,(short)-3004,(short)-2876,(short)-2748,(short)-2620,(short)-2492,(short)-2364,(short)-2236,(short)-2108,(short)-1980,(short)-1884,(short)-1820,(short)-1756,(short)-1692,(short)-1628,(short)-1564,(short)-1500,(short)-1436,(short)-1372,(short)-1308,(short)-1244,(short)-1180,(short)-1116,(short)-1052,(short)-988,(short)-924,(short)-876,(short)-844,(short)-812,(short)-780,(short)-748,(short)-716,(short)-684,(short)-652,(short)-620,(short)-588,(short)-556,(short)-524,(short)-492,(short)-460,(short)-428,(short)-396,(short)-372,(short)-356,(short)-340,(short)-324,(short)-308,(short)-292,(short)-276,(short)-260,(short)-244,(short)-228,(short)-212,(short)-196,(short)-180,(short)-164,(short)-148,(short)-132,(short)-120,(short)-112,(short)-104,(short)-96,(short)-88,(short)-80,(short)-72,(short)-64,(short)-56,(short)-48,(short)-40,(short)-32,(short)-24,(short)-16,(short)-8,(short)0,(short)32124,(short)31100,(short)30076,(short)29052,(short)28028,(short)27004,(short)25980,(short)24956,(short)23932,(short)22908,(short)21884,(short)20860,(short)19836,(short)18812,(short)17788,(short)16764,(short)15996,(short)15484,(short)14972,(short)14460,(short)13948,(short)13436,(short)12924,(short)12412,(short)11900,(short)11388,(short)10876,(short)10364,(short)9852,(short)9340,(short)8828,(short)8316,(short)7932,(short)7676,(short)7420,(short)7164,(short)6908,(short)6652,(short)6396,(short)6140,(short)5884,(short)5628,(short)5372,(short)5116,(short)4860,(short)4604,(short)4348,(short)4092,(short)3900,(short)3772,(short)3644,(short)3516,(short)3388,(short)3260,(short)3132,(short)3004,(short)2876,(short)2748,(short)2620,(short)2492,(short)2364,(short)2236,(short)2108,(short)1980,(short)1884,(short)1820,(short)1756,(short)1692,(short)1628,(short)1564,(short)1500,(short)1436,(short)1372,(short)1308,(short)1244,(short)1180,(short)1116,(short)1052,(short)988,(short)924,(short)876,(short)844,(short)812,(short)780,(short)748,(short)716,(short)684,(short)652,(short)620,(short)588,(short)556,(short)524,(short)492,(short)460,(short)428,(short)396,(short)372,(short)356,(short)340,(short)324,(short)308,(short)292,(short)276,(short)260,(short)244,(short)228,(short)212,(short)196,(short)180,(short)164,(short)148,(short)132,(short)120,(short)112,(short)104,(short)96,(short)88,(short)80,(short)72,(short)64,(short)56,(short)48,(short)40,(short)32,(short)24,(short)16,(short)8,(short)0,
 };
 HX_LOCAL_STACK_FRAME(_hx_pos_306b50e70c93d428_478_boot,"borogove.calls.MediaStreamTrack","boot",0x70902a93,"borogove.calls.MediaStreamTrack.boot","borogove/calls/PeerConnection.cpp.hx",478,0x6b4179c1)
-static const unsigned char _hx_array_data_338355ad_41[] = {
+static const unsigned char _hx_array_data_338355ad_40[] = {
 	(unsigned char)0,(unsigned char)1,(unsigned char)2,(unsigned char)2,(unsigned char)3,(unsigned char)3,(unsigned char)3,(unsigned char)3,(unsigned char)4,(unsigned char)4,(unsigned char)4,(unsigned char)4,(unsigned char)4,(unsigned char)4,(unsigned char)4,(unsigned char)4,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)5,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)6,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,(unsigned char)7,
 };
 namespace borogove{
@@ -196,75 +199,37 @@ bool MediaStreamTrack_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String MediaStreamTrack_obj::id__fromC(){
-            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_398_id__fromC)
-HXDLIN( 398)		return this->get_id();
+            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_426_id__fromC)
+HXDLIN( 426)		return this->get_id();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(MediaStreamTrack_obj,id__fromC,return )
 
 bool MediaStreamTrack_obj::muted__fromC(){
-            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_398_muted__fromC)
-HXDLIN( 398)		return this->get_muted();
+            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_426_muted__fromC)
+HXDLIN( 426)		return this->get_muted();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(MediaStreamTrack_obj,muted__fromC,return )
 
 ::String MediaStreamTrack_obj::kind__fromC(){
-            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_398_kind__fromC)
-HXDLIN( 398)		return this->get_kind();
+            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_426_kind__fromC)
+HXDLIN( 426)		return this->get_kind();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(MediaStreamTrack_obj,kind__fromC,return )
 
 size_t MediaStreamTrack_obj::supportedAudioFormats__fromC(void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_385_supportedAudioFormats__fromC)
-HXDLIN( 385)		::Array< ::Dynamic> x = this->get_supportedAudioFormats();
-HXDLIN( 385)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 385)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 385)			{
-HXDLIN( 385)				int _g = 0;
-HXDLIN( 385)				while((_g < x->length)){
-HXDLIN( 385)					 ::borogove::calls::AudioFormat el = x->__get(_g).StaticCast<  ::borogove::calls::AudioFormat >();
-HXDLIN( 385)					_g = (_g + 1);
-HXDLIN( 385)					{
-HXDLIN( 385)						 ::Dynamic haxeObject = el;
-HXDLIN( 385)						void* ptr = haxeObject.mPtr;
-HXDLIN( 385)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 385)						{
-HXDLIN( 385)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 385)							if (::hx::IsNull( store )) {
-HXDLIN( 385)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 385)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 385)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 385)			void** ptr1 = (void**)x->getBase();
-HXDLIN( 385)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 385)			{
-HXDLIN( 385)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 385)				if (::hx::IsNull( store1 )) {
-HXDLIN( 385)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),x));
-HXDLIN( 385)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 385)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 385)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_413_supportedAudioFormats__fromC)
+HXDLIN( 413)		::Array< ::Dynamic> x = this->get_supportedAudioFormats();
+HXDLIN( 413)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 413)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 413)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(x));
             		}
-HXDLIN( 385)		return ( (size_t)(x->length) );
+HXDLIN( 413)		return ( (size_t)(x->length) );
             	}
 
 
@@ -426,30 +391,43 @@ HX_DEFINE_DYNAMIC_FUNC1(MediaStreamTrack_obj,addPCMListener,(void))
 void MediaStreamTrack_obj::addPCMListener__fromC(::cpp::Function< void  (short*,size_t,int,int,void*) > callback,void* callback__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,void*,callback__context,::cpp::Function< void  (short* HX_COMMA size_t HX_COMMA int HX_COMMA int HX_COMMA void*) >,callback) HXARGC(3)
             		void _hx_run(::Array< short > a0,int a1,int a2){
-            			HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_272_addPCMListener__fromC)
-HXLINE( 243)			void** ptr = (void**)a0->getBase();
-HXDLIN( 243)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 243)			{
-HXLINE( 243)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 243)				if (::hx::IsNull( store )) {
-HXLINE( 243)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            			HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_282_addPCMListener__fromC)
+HXLINE( 251)			void** ptr = (void**)a0->getBase();
+HXDLIN( 251)			::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 251)			{
+HXLINE( 251)				 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 251)				if (::hx::IsNull( store )) {
+HXLINE( 251)					store =  ::Dynamic(::hx::Anon_obj::Create(2)
             						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             						->setFixed(1,HX_("value",71,7f,b8,31),a0));
-HXDLIN( 243)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 251)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             				}
             				else {
-HXLINE( 243)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 251)					::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             				}
             			}
-HXDLIN( 243)			int xl0 = a0->length;
-HXLINE( 258)			__hxcpp_enter_gc_free_zone();
-HXLINE( 261)			callback(( (short*)(ptr) ),( (size_t)(xl0) ),a1,a2,callback__context);
-HXLINE( 265)			__hxcpp_exit_gc_free_zone();
+HXDLIN( 251)			int xl0;
+HXDLIN( 251)			 ::Dynamic tmp;
+HXDLIN( 251)			if (::hx::IsNotNull( a0 )) {
+HXLINE( 251)				tmp = a0->length;
+            			}
+            			else {
+HXLINE( 251)				tmp = null();
+            			}
+HXDLIN( 251)			if (::hx::IsNotNull( tmp )) {
+HXLINE( 251)				xl0 = ( (int)(tmp) );
+            			}
+            			else {
+HXLINE( 251)				xl0 = -1;
+            			}
+HXLINE( 266)			__hxcpp_enter_gc_free_zone();
+HXLINE( 269)			callback(( (short*)(ptr) ),( (size_t)(xl0) ),a1,a2,callback__context);
+HXLINE( 273)			__hxcpp_exit_gc_free_zone();
             		}
             		HX_END_LOCAL_FUNC3((void))
 
-            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_339_addPCMListener__fromC)
-HXDLIN( 339)		this->addPCMListener( ::Dynamic(new _hx_Closure_0(callback__context,callback)));
+            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_354_addPCMListener__fromC)
+HXDLIN( 354)		this->addPCMListener( ::Dynamic(new _hx_Closure_0(callback__context,callback)));
             	}
 
 
@@ -537,15 +515,15 @@ HX_DEFINE_DYNAMIC_FUNC1(MediaStreamTrack_obj,addReadyForPCMListener,(void))
 void MediaStreamTrack_obj::addReadyForPCMListener__fromC(::cpp::Function< void  (void*) > callback,void* callback__context){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,void*,callback__context,::cpp::Function< void  (void*) >,callback) HXARGC(0)
             		void _hx_run(){
-            			HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_272_addReadyForPCMListener__fromC)
-HXLINE( 258)			__hxcpp_enter_gc_free_zone();
-HXLINE( 261)			callback(callback__context);
-HXLINE( 265)			__hxcpp_exit_gc_free_zone();
+            			HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_282_addReadyForPCMListener__fromC)
+HXLINE( 266)			__hxcpp_enter_gc_free_zone();
+HXLINE( 269)			callback(callback__context);
+HXLINE( 273)			__hxcpp_exit_gc_free_zone();
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_339_addReadyForPCMListener__fromC)
-HXDLIN( 339)		this->addReadyForPCMListener( ::Dynamic(new _hx_Closure_0(callback__context,callback)));
+            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_354_addReadyForPCMListener__fromC)
+HXDLIN( 354)		this->addReadyForPCMListener( ::Dynamic(new _hx_Closure_0(callback__context,callback)));
             	}
 
 
@@ -699,19 +677,19 @@ HXLINE( 569)		this->eventLoop->run( ::Dynamic(new _hx_Closure_1(pcm,_gthis,chann
 HX_DEFINE_DYNAMIC_FUNC3(MediaStreamTrack_obj,writePCM,(void))
 
 void MediaStreamTrack_obj::writePCM__fromC(::cpp::Pointer< short > pcm,size_t pcm__len,int clockRate,int channels){
-            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_339_writePCM__fromC)
-HXLINE( 282)		::Array< short > _hx_tmp;
-HXDLIN( 282)		if (::hx::IsNull( pcm )) {
-HXLINE( 282)			_hx_tmp = null();
+            	HX_STACKFRAME(&_hx_pos_1f66e5b64430fc7f_354_writePCM__fromC)
+HXLINE( 302)		::Array< short > _hx_tmp;
+HXDLIN( 302)		if (::hx::IsNull( pcm )) {
+HXLINE( 302)			_hx_tmp = ::Array_obj< short >::__new(0);
             		}
             		else {
-HXLINE( 282)			::cpp::Pointer< short > _this = pcm->reinterpret();
-HXDLIN( 282)			::Array< short > result = ::Array_obj< short >::__new();
-HXDLIN( 282)			::cpp::Pointer< short > tmp = _this;
-HXDLIN( 282)			result->setUnmanagedData(tmp,( (int)(pcm__len) ));
-HXDLIN( 282)			_hx_tmp = result->copy();
+HXLINE( 302)			::cpp::Pointer< short > _this = pcm->reinterpret();
+HXDLIN( 302)			::Array< short > result = ::Array_obj< short >::__new();
+HXDLIN( 302)			::cpp::Pointer< short > tmp = _this;
+HXDLIN( 302)			result->setUnmanagedData(tmp,( (int)(pcm__len) ));
+HXDLIN( 302)			_hx_tmp = result->copy();
             		}
-HXLINE( 339)		this->writePCM(_hx_tmp,clockRate,channels);
+HXLINE( 354)		this->writePCM(_hx_tmp,clockRate,channels);
             	}
 
 
@@ -1149,11 +1127,11 @@ HXDLIN( 339)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             	}
 {
             	HX_STACKFRAME(&_hx_pos_306b50e70c93d428_477_boot)
-HXDLIN( 477)		ULAW_DECODE = ::Array_obj< short >::fromData( _hx_array_data_338355ad_39,256);
+HXDLIN( 477)		ULAW_DECODE = ::Array_obj< short >::fromData( _hx_array_data_338355ad_38,256);
             	}
 {
             	HX_STACKFRAME(&_hx_pos_306b50e70c93d428_478_boot)
-HXDLIN( 478)		ULAW_EXP = ::Array_obj< unsigned char >::fromData( _hx_array_data_338355ad_41,128);
+HXDLIN( 478)		ULAW_EXP = ::Array_obj< unsigned char >::fromData( _hx_array_data_338355ad_40,128);
             	}
 }
 
diff --git a/Sources/c_borogove/src/borogove/calls/OutgoingProposedSession.cpp b/Sources/c_borogove/src/borogove/calls/OutgoingProposedSession.cpp
index 06eb3f0..eea39f2 100644
--- a/Sources/c_borogove/src/borogove/calls/OutgoingProposedSession.cpp
+++ b/Sources/c_borogove/src/borogove/calls/OutgoingProposedSession.cpp
@@ -7,6 +7,9 @@
 #ifndef INCLUDED_Std
 #include <Std.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_Chat
 #include <borogove/Chat.h>
 #endif
@@ -22,9 +25,6 @@
 #ifndef INCLUDED_borogove_EventResult
 #include <borogove/EventResult.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
-#endif
 #ifndef INCLUDED_borogove_JID
 #include <borogove/JID.h>
 #endif
@@ -71,36 +71,36 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_d2a3c174e5a36893_195_new,"borogove.calls.OutgoingProposedSession","new",0xf8b58fb0,"borogove.calls.OutgoingProposedSession.new","borogove/calls/Session.hx",195,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_223_propose,"borogove.calls.OutgoingProposedSession","propose",0xcfa5a64e,"borogove.calls.OutgoingProposedSession.propose","borogove/calls/Session.hx",223,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_212_propose,"borogove.calls.OutgoingProposedSession","propose",0xcfa5a64e,"borogove.calls.OutgoingProposedSession.propose","borogove/calls/Session.hx",212,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_236_hangup,"borogove.calls.OutgoingProposedSession","hangup",0xe6e084fd,"borogove.calls.OutgoingProposedSession.hangup","borogove/calls/Session.hx",236,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_233_hangup,"borogove.calls.OutgoingProposedSession","hangup",0xe6e084fd,"borogove.calls.OutgoingProposedSession.hangup","borogove/calls/Session.hx",233,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_251_retract,"borogove.calls.OutgoingProposedSession","retract",0xd2758951,"borogove.calls.OutgoingProposedSession.retract","borogove/calls/Session.hx",251,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_256_terminate,"borogove.calls.OutgoingProposedSession","terminate",0x77424db1,"borogove.calls.OutgoingProposedSession.terminate","borogove/calls/Session.hx",256,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_261_contentAdd,"borogove.calls.OutgoingProposedSession","contentAdd",0x0c853118,"borogove.calls.OutgoingProposedSession.contentAdd","borogove/calls/Session.hx",261,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_266_contentAccept,"borogove.calls.OutgoingProposedSession","contentAccept",0xb429c871,"borogove.calls.OutgoingProposedSession.contentAccept","borogove/calls/Session.hx",266,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_270_transportInfo,"borogove.calls.OutgoingProposedSession","transportInfo",0x89f74007,"borogove.calls.OutgoingProposedSession.transportInfo","borogove/calls/Session.hx",270,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_277_accept,"borogove.calls.OutgoingProposedSession","accept",0x39e745b8,"borogove.calls.OutgoingProposedSession.accept","borogove/calls/Session.hx",277,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_281_initiate,"borogove.calls.OutgoingProposedSession","initiate",0x8e062909,"borogove.calls.OutgoingProposedSession.initiate","borogove/calls/Session.hx",281,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_294_addMedia,"borogove.calls.OutgoingProposedSession","addMedia",0xad8fe9b3,"borogove.calls.OutgoingProposedSession.addMedia","borogove/calls/Session.hx",294,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_298_callStatus,"borogove.calls.OutgoingProposedSession","callStatus",0xf9d38920,"borogove.calls.OutgoingProposedSession.callStatus","borogove/calls/Session.hx",298,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_303_audioTracks,"borogove.calls.OutgoingProposedSession","audioTracks",0xde56ec4e,"borogove.calls.OutgoingProposedSession.audioTracks","borogove/calls/Session.hx",303,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_308_videoTracks,"borogove.calls.OutgoingProposedSession","videoTracks",0x884e51b3,"borogove.calls.OutgoingProposedSession.videoTracks","borogove/calls/Session.hx",308,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_313_dtmf,"borogove.calls.OutgoingProposedSession","dtmf",0x9f976199,"borogove.calls.OutgoingProposedSession.dtmf","borogove/calls/Session.hx",313,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_317_get_sid,"borogove.calls.OutgoingProposedSession","get_sid",0xfc880ef5,"borogove.calls.OutgoingProposedSession.get_sid","borogove/calls/Session.hx",317,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_321_get_chatId,"borogove.calls.OutgoingProposedSession","get_chatId",0x70a63f4c,"borogove.calls.OutgoingProposedSession.get_chatId","borogove/calls/Session.hx",321,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_195_boot,"borogove.calls.OutgoingProposedSession","boot",0x9e412ae2,"borogove.calls.OutgoingProposedSession.boot","borogove/calls/Session.hx",195,0x33a79030)
+HX_DEFINE_STACK_FRAME(_hx_pos_d2a3c174e5a36893_196_new,"borogove.calls.OutgoingProposedSession","new",0xf8b58fb0,"borogove.calls.OutgoingProposedSession.new","borogove/calls/Session.hx",196,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_224_propose,"borogove.calls.OutgoingProposedSession","propose",0xcfa5a64e,"borogove.calls.OutgoingProposedSession.propose","borogove/calls/Session.hx",224,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_213_propose,"borogove.calls.OutgoingProposedSession","propose",0xcfa5a64e,"borogove.calls.OutgoingProposedSession.propose","borogove/calls/Session.hx",213,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_237_hangup,"borogove.calls.OutgoingProposedSession","hangup",0xe6e084fd,"borogove.calls.OutgoingProposedSession.hangup","borogove/calls/Session.hx",237,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_234_hangup,"borogove.calls.OutgoingProposedSession","hangup",0xe6e084fd,"borogove.calls.OutgoingProposedSession.hangup","borogove/calls/Session.hx",234,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_252_retract,"borogove.calls.OutgoingProposedSession","retract",0xd2758951,"borogove.calls.OutgoingProposedSession.retract","borogove/calls/Session.hx",252,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_257_terminate,"borogove.calls.OutgoingProposedSession","terminate",0x77424db1,"borogove.calls.OutgoingProposedSession.terminate","borogove/calls/Session.hx",257,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_262_contentAdd,"borogove.calls.OutgoingProposedSession","contentAdd",0x0c853118,"borogove.calls.OutgoingProposedSession.contentAdd","borogove/calls/Session.hx",262,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_267_contentAccept,"borogove.calls.OutgoingProposedSession","contentAccept",0xb429c871,"borogove.calls.OutgoingProposedSession.contentAccept","borogove/calls/Session.hx",267,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_271_transportInfo,"borogove.calls.OutgoingProposedSession","transportInfo",0x89f74007,"borogove.calls.OutgoingProposedSession.transportInfo","borogove/calls/Session.hx",271,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_278_accept,"borogove.calls.OutgoingProposedSession","accept",0x39e745b8,"borogove.calls.OutgoingProposedSession.accept","borogove/calls/Session.hx",278,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_282_initiate,"borogove.calls.OutgoingProposedSession","initiate",0x8e062909,"borogove.calls.OutgoingProposedSession.initiate","borogove/calls/Session.hx",282,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_295_addMedia,"borogove.calls.OutgoingProposedSession","addMedia",0xad8fe9b3,"borogove.calls.OutgoingProposedSession.addMedia","borogove/calls/Session.hx",295,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_299_callStatus,"borogove.calls.OutgoingProposedSession","callStatus",0xf9d38920,"borogove.calls.OutgoingProposedSession.callStatus","borogove/calls/Session.hx",299,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_304_audioTracks,"borogove.calls.OutgoingProposedSession","audioTracks",0xde56ec4e,"borogove.calls.OutgoingProposedSession.audioTracks","borogove/calls/Session.hx",304,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_309_videoTracks,"borogove.calls.OutgoingProposedSession","videoTracks",0x884e51b3,"borogove.calls.OutgoingProposedSession.videoTracks","borogove/calls/Session.hx",309,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_314_dtmf,"borogove.calls.OutgoingProposedSession","dtmf",0x9f976199,"borogove.calls.OutgoingProposedSession.dtmf","borogove/calls/Session.hx",314,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_318_get_sid,"borogove.calls.OutgoingProposedSession","get_sid",0xfc880ef5,"borogove.calls.OutgoingProposedSession.get_sid","borogove/calls/Session.hx",318,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_322_get_chatId,"borogove.calls.OutgoingProposedSession","get_chatId",0x70a63f4c,"borogove.calls.OutgoingProposedSession.get_chatId","borogove/calls/Session.hx",322,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_d2a3c174e5a36893_196_boot,"borogove.calls.OutgoingProposedSession","boot",0x9e412ae2,"borogove.calls.OutgoingProposedSession.boot","borogove/calls/Session.hx",196,0x33a79030)
 namespace borogove{
 namespace calls{
 
 void OutgoingProposedSession_obj::__construct( ::borogove::Client client, ::borogove::JID to){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_195_new)
-HXLINE( 202)		this->video = false;
-HXLINE( 201)		this->audio = false;
-HXLINE( 206)		this->client = client;
-HXLINE( 207)		this->to = to;
-HXLINE( 208)		this->_sid = ::borogove::ID_obj::_hx_long();
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_196_new)
+HXLINE( 203)		this->video = false;
+HXLINE( 202)		this->audio = false;
+HXLINE( 207)		this->client = client;
+HXLINE( 208)		this->to = to;
+HXLINE( 209)		this->_sid = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
             	}
 
 Dynamic OutgoingProposedSession_obj::__CreateEmpty() { return new OutgoingProposedSession_obj; }
@@ -153,38 +153,38 @@ void *OutgoingProposedSession_obj::_hx_getInterface(int inHash) {
 void OutgoingProposedSession_obj::propose(bool audio,bool video){
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::calls::OutgoingProposedSession,_gthis, ::borogove::Stanza,event, ::borogove::ChatMessage,msg) HXARGC(1)
             		 ::borogove::EventResult _hx_run(::Array< ::Dynamic> stored){
-            			HX_GC_STACKFRAME(&_hx_pos_d2a3c174e5a36893_223_propose)
-HXLINE( 224)			::String stanza = _gthis->to->asString();
-HXDLIN( 224)			 ::borogove::Stanza stanza1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(3)
+            			HX_GC_STACKFRAME(&_hx_pos_d2a3c174e5a36893_224_propose)
+HXLINE( 225)			::String stanza = _gthis->to->asString();
+HXDLIN( 225)			 ::borogove::Stanza stanza1 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(3)
             				->setFixed(0,HX_("id",db,5b,00,00),msg->localId)
             				->setFixed(1,HX_("to",7b,65,00,00),stanza)
             				->setFixed(2,HX_("type",ba,f2,08,4d),HX_("chat",d8,5e,bf,41))))->addChild(event)->tag(HX_("store",e1,13,16,84), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:hints",70,b3,d6,fe))));
-HXLINE( 227)			_gthis->client->sendStanza(stanza1);
-HXLINE( 228)			_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),0);
-HXLINE( 229)			return _gthis->client->trigger(HX_("call/ringing",81,75,54,f9),_gthis);
+HXLINE( 228)			_gthis->client->sendStanza(stanza1);
+HXLINE( 229)			_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),0);
+HXLINE( 230)			return _gthis->client->trigger(HX_("call/ringing",81,75,54,f9),_gthis);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_d2a3c174e5a36893_212_propose)
-HXDLIN( 212)		 ::borogove::calls::OutgoingProposedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 213)		this->audio = audio;
-HXLINE( 214)		this->video = video;
-HXLINE( 215)		 ::borogove::Stanza event =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("propose",fe,fe,e9,f9), ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_GC_STACKFRAME(&_hx_pos_d2a3c174e5a36893_213_propose)
+HXDLIN( 213)		 ::borogove::calls::OutgoingProposedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 214)		this->audio = audio;
+HXLINE( 215)		this->video = video;
+HXLINE( 216)		 ::borogove::Stanza event =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("propose",fe,fe,e9,f9), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("id",db,5b,00,00),this->get_sid())
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07))));
-HXLINE( 216)		if (audio) {
-HXLINE( 217)			event->tag(HX_("description",fc,08,1d,5f), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 217)		if (audio) {
+HXLINE( 218)			event->tag(HX_("description",fc,08,1d,5f), ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("media",e4,04,bc,05),HX_("audio",d6,78,80,27))
             				->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:jingle:apps:rtp:1",ea,41,fe,5c))))->up();
             		}
-HXLINE( 219)		if (video) {
-HXLINE( 220)			event->tag(HX_("description",fc,08,1d,5f), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 220)		if (video) {
+HXLINE( 221)			event->tag(HX_("description",fc,08,1d,5f), ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("media",e4,04,bc,05),HX_("video",7b,14,fc,36))
             				->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:jingle:apps:rtp:1",ea,41,fe,5c))))->up();
             		}
-HXLINE( 222)		 ::borogove::ChatMessage msg = ::borogove::calls::_Session::Session_Fields__obj::mkCallMessage(this->to,this->client->jid,event);
-HXLINE( 223)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,msg)), ::Dynamic(new _hx_Closure_0(_gthis,event,msg)),null());
+HXLINE( 223)		 ::borogove::ChatMessage msg = ::borogove::calls::_Session::Session_Fields__obj::mkCallMessage(this->to,this->client,event);
+HXLINE( 224)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,msg)), ::Dynamic(new _hx_Closure_0(_gthis,event,msg)),null());
             	}
 
 
@@ -193,36 +193,36 @@ HX_DEFINE_DYNAMIC_FUNC2(OutgoingProposedSession_obj,propose,(void))
 void OutgoingProposedSession_obj::hangup(){
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::calls::OutgoingProposedSession,_gthis, ::borogove::Stanza,event, ::borogove::ChatMessage,msg) HXARGC(1)
             		void _hx_run(::Array< ::Dynamic> stored){
-            			HX_GC_STACKFRAME(&_hx_pos_d2a3c174e5a36893_236_hangup)
-HXLINE( 237)			 ::borogove::Client _gthis1 = _gthis->client;
-HXLINE( 238)			::String _hx_tmp = _gthis->to->asString();
-HXLINE( 237)			_gthis1->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(3)
+            			HX_GC_STACKFRAME(&_hx_pos_d2a3c174e5a36893_237_hangup)
+HXLINE( 238)			 ::borogove::Client _gthis1 = _gthis->client;
+HXLINE( 239)			::String _hx_tmp = _gthis->to->asString();
+HXLINE( 238)			_gthis1->sendStanza( ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("message",c7,35,11,9a), ::Dynamic(::hx::Anon_obj::Create(3)
             				->setFixed(0,HX_("id",db,5b,00,00),msg->versions->__get(0).StaticCast<  ::borogove::ChatMessage >()->localId)
             				->setFixed(1,HX_("to",7b,65,00,00),_hx_tmp)
             				->setFixed(2,HX_("type",ba,f2,08,4d),HX_("chat",d8,5e,bf,41))))->addChild(event)->tag(HX_("store",e1,13,16,84), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:hints",70,b3,d6,fe)))));
-HXLINE( 242)			_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),1);
+HXLINE( 243)			_gthis->client->notifyMessageHandlers(stored->__get(0).StaticCast<  ::borogove::ChatMessage >(),1);
             		}
             		HX_END_LOCAL_FUNC1((void))
 
-            	HX_GC_STACKFRAME(&_hx_pos_d2a3c174e5a36893_233_hangup)
-HXDLIN( 233)		 ::borogove::calls::OutgoingProposedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 234)		 ::borogove::Stanza event =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("retract",01,e2,b9,fc), ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_GC_STACKFRAME(&_hx_pos_d2a3c174e5a36893_234_hangup)
+HXDLIN( 234)		 ::borogove::calls::OutgoingProposedSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 235)		 ::borogove::Stanza event =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("retract",01,e2,b9,fc), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("id",db,5b,00,00),this->get_sid())
             			->setFixed(1,HX_("xmlns",dc,31,74,60),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07))));
-HXLINE( 235)		 ::borogove::ChatMessage msg = ::borogove::calls::_Session::Session_Fields__obj::mkCallMessage(this->to,this->client->jid,event);
-HXLINE( 236)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,msg)), ::Dynamic(new _hx_Closure_0(_gthis,event,msg)),null());
-HXLINE( 244)		{
-HXLINE( 244)			 ::borogove::Client tmp = this->client;
-HXDLIN( 244)			 ::borogove::Chat tmp1 = tmp->getChat(this->get_chatId());
-HXDLIN( 244)			if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 244)				::Dynamic this1 = tmp1->jingleSessions;
-HXDLIN( 244)				( ( ::haxe::ds::StringMap)(this1) )->remove(this->get_sid());
+HXLINE( 236)		 ::borogove::ChatMessage msg = ::borogove::calls::_Session::Session_Fields__obj::mkCallMessage(this->to,this->client,event);
+HXLINE( 237)		::thenshim::_Promise::Promise_Impl__obj::then(this->client->storeMessages(::Array_obj< ::Dynamic>::__new(1)->init(0,msg)), ::Dynamic(new _hx_Closure_0(_gthis,event,msg)),null());
+HXLINE( 245)		{
+HXLINE( 245)			 ::borogove::Client tmp = this->client;
+HXDLIN( 245)			 ::borogove::Chat tmp1 = tmp->getChat(this->get_chatId());
+HXDLIN( 245)			if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 245)				::Dynamic this1 = tmp1->jingleSessions;
+HXDLIN( 245)				( ( ::haxe::ds::StringMap)(this1) )->remove(this->get_sid());
             			}
             		}
-HXLINE( 245)		 ::borogove::Client _hx_tmp = this->client;
-HXDLIN( 245)		::String _hx_tmp1 = this->get_chatId();
-HXDLIN( 245)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::Anon_obj::Create(2)
+HXLINE( 246)		 ::borogove::Client _hx_tmp = this->client;
+HXDLIN( 246)		::String _hx_tmp1 = this->get_chatId();
+HXDLIN( 246)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("chatId",d3,04,77,b7),_hx_tmp1)
             			->setFixed(1,HX_("sid",0e,9f,57,00),this->get_sid())));
             	}
@@ -231,10 +231,10 @@ HXDLIN( 245)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::
 HX_DEFINE_DYNAMIC_FUNC0(OutgoingProposedSession_obj,hangup,(void))
 
 void OutgoingProposedSession_obj::retract(){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_251_retract)
-HXDLIN( 251)		 ::borogove::Client _hx_tmp = this->client;
-HXDLIN( 251)		::String _hx_tmp1 = this->get_chatId();
-HXDLIN( 251)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_252_retract)
+HXDLIN( 252)		 ::borogove::Client _hx_tmp = this->client;
+HXDLIN( 252)		::String _hx_tmp1 = this->get_chatId();
+HXDLIN( 252)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("chatId",d3,04,77,b7),_hx_tmp1)
             			->setFixed(1,HX_("sid",0e,9f,57,00),this->get_sid())));
             	}
@@ -243,160 +243,160 @@ HXDLIN( 251)		_hx_tmp->trigger(HX_("call/retract",50,bc,8d,db), ::Dynamic(::hx::
 HX_DEFINE_DYNAMIC_FUNC0(OutgoingProposedSession_obj,retract,(void))
 
 void OutgoingProposedSession_obj::terminate(){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_256_terminate)
-HXDLIN( 256)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN( 256)		::String _hx_tmp1 = (HX_("Tried to terminate before session-initiate: ",a9,d4,f3,a4) + this->get_sid());
-HXDLIN( 256)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_257_terminate)
+HXDLIN( 257)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN( 257)		::String _hx_tmp1 = (HX_("Tried to terminate before session-initiate: ",a9,d4,f3,a4) + this->get_sid());
+HXDLIN( 257)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
             			->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.calls.OutgoingProposedSession",be,37,f0,b1))
             			->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)))
             			->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("terminate",61,32,d2,fd))
             			->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/calls/Session.hx",30,90,a7,33))
-            			->setFixed(4,HX_("lineNumber",dd,81,22,76),256)));
+            			->setFixed(4,HX_("lineNumber",dd,81,22,76),257)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(OutgoingProposedSession_obj,terminate,(void))
 
 void OutgoingProposedSession_obj::contentAdd( ::borogove::Stanza _){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_261_contentAdd)
-HXDLIN( 261)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN( 261)		::String _hx_tmp1 = (HX_("Got content-add before session-initiate: ",10,d3,fa,8a) + this->get_sid());
-HXDLIN( 261)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_262_contentAdd)
+HXDLIN( 262)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN( 262)		::String _hx_tmp1 = (HX_("Got content-add before session-initiate: ",10,d3,fa,8a) + this->get_sid());
+HXDLIN( 262)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
             			->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.calls.OutgoingProposedSession",be,37,f0,b1))
             			->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)))
             			->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("contentAdd",68,66,dd,43))
             			->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/calls/Session.hx",30,90,a7,33))
-            			->setFixed(4,HX_("lineNumber",dd,81,22,76),261)));
+            			->setFixed(4,HX_("lineNumber",dd,81,22,76),262)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(OutgoingProposedSession_obj,contentAdd,(void))
 
 void OutgoingProposedSession_obj::contentAccept( ::borogove::Stanza _){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_266_contentAccept)
-HXDLIN( 266)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN( 266)		::String _hx_tmp1 = (HX_("Got content-accept before session-initiate: ",47,72,87,71) + this->get_sid());
-HXDLIN( 266)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_267_contentAccept)
+HXDLIN( 267)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN( 267)		::String _hx_tmp1 = (HX_("Got content-accept before session-initiate: ",47,72,87,71) + this->get_sid());
+HXDLIN( 267)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
             			->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.calls.OutgoingProposedSession",be,37,f0,b1))
             			->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)))
             			->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("contentAccept",21,c5,01,e1))
             			->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/calls/Session.hx",30,90,a7,33))
-            			->setFixed(4,HX_("lineNumber",dd,81,22,76),266)));
+            			->setFixed(4,HX_("lineNumber",dd,81,22,76),267)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(OutgoingProposedSession_obj,contentAccept,(void))
 
 ::Dynamic OutgoingProposedSession_obj::transportInfo( ::borogove::Stanza _){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_270_transportInfo)
-HXLINE( 271)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN( 271)		::String _hx_tmp1 = (HX_("Got transport-info before session-initiate: ",bd,bd,9d,08) + this->get_sid());
-HXDLIN( 271)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_271_transportInfo)
+HXLINE( 272)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN( 272)		::String _hx_tmp1 = (HX_("Got transport-info before session-initiate: ",bd,bd,9d,08) + this->get_sid());
+HXDLIN( 272)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
             			->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.calls.OutgoingProposedSession",be,37,f0,b1))
             			->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)))
             			->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("transportInfo",b7,3c,cf,b6))
             			->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/calls/Session.hx",30,90,a7,33))
-            			->setFixed(4,HX_("lineNumber",dd,81,22,76),271)));
-HXLINE( 272)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            			->setFixed(4,HX_("lineNumber",dd,81,22,76),272)));
+HXLINE( 273)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(OutgoingProposedSession_obj,transportInfo,return )
 
 void OutgoingProposedSession_obj::accept(){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_277_accept)
-HXDLIN( 277)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
-HXDLIN( 277)		::String _hx_tmp1 = (HX_("Tried to accept before initiate: ",77,4a,a0,ec) + this->get_sid());
-HXDLIN( 277)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_278_accept)
+HXDLIN( 278)		 ::Dynamic _hx_tmp = ::haxe::Log_obj::trace;
+HXDLIN( 278)		::String _hx_tmp1 = (HX_("Tried to accept before initiate: ",77,4a,a0,ec) + this->get_sid());
+HXDLIN( 278)		_hx_tmp(_hx_tmp1, ::Dynamic(::hx::Anon_obj::Create(5)
             			->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.calls.OutgoingProposedSession",be,37,f0,b1))
             			->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,::hx::ObjectPtr<OBJ_>(this)))
             			->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("accept",08,93,06,0b))
             			->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/calls/Session.hx",30,90,a7,33))
-            			->setFixed(4,HX_("lineNumber",dd,81,22,76),277)));
+            			->setFixed(4,HX_("lineNumber",dd,81,22,76),278)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(OutgoingProposedSession_obj,accept,(void))
 
  ::borogove::calls::OutgoingSession OutgoingProposedSession_obj::initiate( ::borogove::Stanza stanza){
-            	HX_GC_STACKFRAME(&_hx_pos_d2a3c174e5a36893_281_initiate)
-HXLINE( 282)		 ::borogove::Stanza jmi = stanza->getChild(HX_("proceed",2e,96,4a,f1),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
-HXLINE( 283)		if (::hx::IsNull( jmi )) {
-HXLINE( 283)			HX_STACK_DO_THROW((HX_("no jmi: ",4d,b1,bc,b7) + ::Std_obj::string(stanza)));
+            	HX_GC_STACKFRAME(&_hx_pos_d2a3c174e5a36893_282_initiate)
+HXLINE( 283)		 ::borogove::Stanza jmi = stanza->getChild(HX_("proceed",2e,96,4a,f1),HX_("urn:xmpp:jingle-message:0",fd,20,a5,07));
+HXLINE( 284)		if (::hx::IsNull( jmi )) {
+HXLINE( 284)			HX_STACK_DO_THROW((HX_("no jmi: ",4d,b1,bc,b7) + ::Std_obj::string(stanza)));
             		}
-HXLINE( 284)		::String _hx_tmp = ( (::String)(::Reflect_obj::field(jmi->attr,HX_("id",db,5b,00,00))) );
-HXDLIN( 284)		if ((_hx_tmp != this->get_sid())) {
-HXLINE( 284)			::String _hx_tmp1 = ((HX_("sid doesn't match: ",3b,d7,99,76) + ( (::String)(::Reflect_obj::field(jmi->attr,HX_("id",db,5b,00,00))) )) + HX_(" vs ",23,c2,80,15));
-HXDLIN( 284)			HX_STACK_DO_THROW((_hx_tmp1 + this->get_sid()));
+HXLINE( 285)		::String _hx_tmp = ( (::String)(::Reflect_obj::field(jmi->attr,HX_("id",db,5b,00,00))) );
+HXDLIN( 285)		if ((_hx_tmp != this->get_sid())) {
+HXLINE( 285)			::String _hx_tmp1 = ((HX_("sid doesn't match: ",3b,d7,99,76) + ( (::String)(::Reflect_obj::field(jmi->attr,HX_("id",db,5b,00,00))) )) + HX_(" vs ",23,c2,80,15));
+HXDLIN( 285)			HX_STACK_DO_THROW((_hx_tmp1 + this->get_sid()));
             		}
-HXLINE( 285)		 ::borogove::Client _hx_tmp2 = this->client;
-HXDLIN( 285)		_hx_tmp2->sendPresence(this->to->asString(),null());
-HXLINE( 286)		 ::borogove::Client session = this->client;
-HXDLIN( 286)		 ::borogove::JID session1 = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
-HXDLIN( 286)		 ::borogove::calls::OutgoingSession session2 =  ::borogove::calls::OutgoingSession_obj::__alloc( HX_CTX ,session,session1,this->get_sid());
-HXLINE( 287)		this->client->trigger(HX_("call/media",73,5d,1d,c7), ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE( 286)		 ::borogove::Client _hx_tmp2 = this->client;
+HXDLIN( 286)		_hx_tmp2->sendPresence(this->to->asString(),null());
+HXLINE( 287)		 ::borogove::Client session = this->client;
+HXDLIN( 287)		 ::borogove::JID session1 = ::borogove::JID_obj::parse(( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) ));
+HXDLIN( 287)		 ::borogove::calls::OutgoingSession session2 =  ::borogove::calls::OutgoingSession_obj::__alloc( HX_CTX ,session,session1,this->get_sid());
+HXLINE( 288)		this->client->trigger(HX_("call/media",73,5d,1d,c7), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("session",56,17,98,93),session2)
             			->setFixed(1,HX_("audio",d6,78,80,27),this->audio)
             			->setFixed(2,HX_("video",7b,14,fc,36),this->video)));
-HXLINE( 288)		this->client->trigger(HX_("call/updateStatus",6c,f5,e6,ec), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 289)		this->client->trigger(HX_("call/updateStatus",6c,f5,e6,ec), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("session",56,17,98,93),session2)));
-HXLINE( 289)		return session2;
+HXLINE( 290)		return session2;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(OutgoingProposedSession_obj,initiate,return )
 
 void OutgoingProposedSession_obj::addMedia(::Array< ::Dynamic> _){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_294_addMedia)
-HXDLIN( 294)		HX_STACK_DO_THROW(HX_("Cannot add media before call starts",aa,0a,79,d5));
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_295_addMedia)
+HXDLIN( 295)		HX_STACK_DO_THROW(HX_("Cannot add media before call starts",aa,0a,79,d5));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(OutgoingProposedSession_obj,addMedia,(void))
 
 int OutgoingProposedSession_obj::callStatus(){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_298_callStatus)
-HXDLIN( 298)		return 2;
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_299_callStatus)
+HXDLIN( 299)		return 2;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(OutgoingProposedSession_obj,callStatus,return )
 
 ::Array< ::Dynamic> OutgoingProposedSession_obj::audioTracks(){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_303_audioTracks)
-HXDLIN( 303)		return ::Array_obj< ::Dynamic>::__new(0);
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_304_audioTracks)
+HXDLIN( 304)		return ::Array_obj< ::Dynamic>::__new(0);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(OutgoingProposedSession_obj,audioTracks,return )
 
 ::Array< ::Dynamic> OutgoingProposedSession_obj::videoTracks(){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_308_videoTracks)
-HXDLIN( 308)		return ::Array_obj< ::Dynamic>::__new(0);
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_309_videoTracks)
+HXDLIN( 309)		return ::Array_obj< ::Dynamic>::__new(0);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(OutgoingProposedSession_obj,videoTracks,return )
 
  ::borogove::calls::DTMFSender OutgoingProposedSession_obj::dtmf(){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_313_dtmf)
-HXDLIN( 313)		return null();
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_314_dtmf)
+HXDLIN( 314)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(OutgoingProposedSession_obj,dtmf,return )
 
 ::String OutgoingProposedSession_obj::get_sid(){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_317_get_sid)
-HXDLIN( 317)		return this->_sid;
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_318_get_sid)
+HXDLIN( 318)		return this->_sid;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(OutgoingProposedSession_obj,get_sid,return )
 
 ::String OutgoingProposedSession_obj::get_chatId(){
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_321_get_chatId)
-HXDLIN( 321)		return this->to->asBare()->asString();
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_322_get_chatId)
+HXDLIN( 322)		return this->to->asBare()->asString();
             	}
 
 
@@ -598,8 +598,8 @@ void OutgoingProposedSession_obj::__register()
 void OutgoingProposedSession_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_195_boot)
-HXDLIN( 195)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_d2a3c174e5a36893_196_boot)
+HXDLIN( 196)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(5)
             				->setFixed(0,HX_("videoTracks",63,c2,24,be), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
diff --git a/Sources/c_borogove/src/borogove/calls/OutgoingSession.cpp b/Sources/c_borogove/src/borogove/calls/OutgoingSession.cpp
index ac3d911..433cef5 100644
--- a/Sources/c_borogove/src/borogove/calls/OutgoingSession.cpp
+++ b/Sources/c_borogove/src/borogove/calls/OutgoingSession.cpp
@@ -35,17 +35,17 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_1c185be5f9e73669_705_new,"borogove.calls.OutgoingSession","new",0x9e6d83b6,"borogove.calls.OutgoingSession.new","borogove/calls/Session.hx",705,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_1c185be5f9e73669_709_onPeerConnection,"borogove.calls.OutgoingSession","onPeerConnection",0x5a3e20c9,"borogove.calls.OutgoingSession.onPeerConnection","borogove/calls/Session.hx",709,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_1c185be5f9e73669_716_initiate,"borogove.calls.OutgoingSession","initiate",0x4b1ddf43,"borogove.calls.OutgoingSession.initiate","borogove/calls/Session.hx",716,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_1c185be5f9e73669_712_initiate,"borogove.calls.OutgoingSession","initiate",0x4b1ddf43,"borogove.calls.OutgoingSession.initiate","borogove/calls/Session.hx",712,0x33a79030)
-HX_LOCAL_STACK_FRAME(_hx_pos_1c185be5f9e73669_721_callStatus,"borogove.calls.OutgoingSession","callStatus",0xf4f0c1da,"borogove.calls.OutgoingSession.callStatus","borogove/calls/Session.hx",721,0x33a79030)
+HX_DEFINE_STACK_FRAME(_hx_pos_1c185be5f9e73669_706_new,"borogove.calls.OutgoingSession","new",0x9e6d83b6,"borogove.calls.OutgoingSession.new","borogove/calls/Session.hx",706,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_1c185be5f9e73669_710_onPeerConnection,"borogove.calls.OutgoingSession","onPeerConnection",0x5a3e20c9,"borogove.calls.OutgoingSession.onPeerConnection","borogove/calls/Session.hx",710,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_1c185be5f9e73669_717_initiate,"borogove.calls.OutgoingSession","initiate",0x4b1ddf43,"borogove.calls.OutgoingSession.initiate","borogove/calls/Session.hx",717,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_1c185be5f9e73669_713_initiate,"borogove.calls.OutgoingSession","initiate",0x4b1ddf43,"borogove.calls.OutgoingSession.initiate","borogove/calls/Session.hx",713,0x33a79030)
+HX_LOCAL_STACK_FRAME(_hx_pos_1c185be5f9e73669_722_callStatus,"borogove.calls.OutgoingSession","callStatus",0xf4f0c1da,"borogove.calls.OutgoingSession.callStatus","borogove/calls/Session.hx",722,0x33a79030)
 namespace borogove{
 namespace calls{
 
 void OutgoingSession_obj::__construct( ::borogove::Client client, ::borogove::JID counterpart,::String sid){
-            	HX_STACKFRAME(&_hx_pos_1c185be5f9e73669_705_new)
-HXDLIN( 705)		super::__construct(client,counterpart,sid,null());
+            	HX_STACKFRAME(&_hx_pos_1c185be5f9e73669_706_new)
+HXDLIN( 706)		super::__construct(client,counterpart,sid,null());
             	}
 
 Dynamic OutgoingSession_obj::__CreateEmpty() { return new OutgoingSession_obj; }
@@ -68,47 +68,47 @@ bool OutgoingSession_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::Dynamic OutgoingSession_obj::onPeerConnection(){
-            	HX_STACKFRAME(&_hx_pos_1c185be5f9e73669_709_onPeerConnection)
-HXDLIN( 709)		return this->setupLocalDescription(HX_("session-initiate",70,2d,30,f7),null(),null(),null());
+            	HX_STACKFRAME(&_hx_pos_1c185be5f9e73669_710_onPeerConnection)
+HXDLIN( 710)		return this->setupLocalDescription(HX_("session-initiate",70,2d,30,f7),null(),null(),null());
             	}
 
 
  ::borogove::calls::OutgoingSession OutgoingSession_obj::initiate( ::borogove::Stanza stanza){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::calls::OutgoingSession,_gthis, ::borogove::Stanza,stanza) HXARGC(1)
             		::Dynamic _hx_run( ::Dynamic _){
-            			HX_STACKFRAME(&_hx_pos_1c185be5f9e73669_716_initiate)
-HXLINE( 716)			return _gthis->transportInfo(stanza);
+            			HX_STACKFRAME(&_hx_pos_1c185be5f9e73669_717_initiate)
+HXLINE( 717)			return _gthis->transportInfo(stanza);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_1c185be5f9e73669_712_initiate)
-HXDLIN( 712)		 ::borogove::calls::OutgoingSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 713)		this->remoteDescription = ::borogove::calls::SessionDescription_obj::fromStanza(stanza,true,null());
-HXLINE( 714)		this->peerDtlsSetup = this->remoteDescription->getDtlsSetup();
-HXLINE( 715)		 ::borogove::calls::PeerConnection _hx_tmp = this->pc;
-HXDLIN( 715)		::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->setRemoteDescription( ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_1c185be5f9e73669_713_initiate)
+HXDLIN( 713)		 ::borogove::calls::OutgoingSession _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 714)		this->remoteDescription = ::borogove::calls::SessionDescription_obj::fromStanza(stanza,true,null());
+HXLINE( 715)		this->peerDtlsSetup = this->remoteDescription->getDtlsSetup();
+HXLINE( 716)		 ::borogove::calls::PeerConnection _hx_tmp = this->pc;
+HXDLIN( 716)		::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->setRemoteDescription( ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("sdp",bf,9a,57,00),this->remoteDescription->toSdp())
             			->setFixed(1,HX_("type",ba,f2,08,4d),cpp::Struct(rtc::Description::Type::Answer)))), ::Dynamic(new _hx_Closure_0(_gthis,stanza)),null());
-HXLINE( 717)		return ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 718)		return ::hx::ObjectPtr<OBJ_>(this);
             	}
 
 
 int OutgoingSession_obj::callStatus(){
-            	HX_STACKFRAME(&_hx_pos_1c185be5f9e73669_721_callStatus)
-HXDLIN( 721)		bool _hx_tmp;
-HXDLIN( 721)		if (::hx::IsNotNull( this->pc )) {
-HXDLIN( 721)			_hx_tmp = ::hx::IsNull( this->remoteDescription );
+            	HX_STACKFRAME(&_hx_pos_1c185be5f9e73669_722_callStatus)
+HXDLIN( 722)		bool _hx_tmp;
+HXDLIN( 722)		if (::hx::IsNotNull( this->pc )) {
+HXDLIN( 722)			_hx_tmp = ::hx::IsNull( this->remoteDescription );
             		}
             		else {
-HXDLIN( 721)			_hx_tmp = true;
+HXDLIN( 722)			_hx_tmp = true;
             		}
-HXDLIN( 721)		if (_hx_tmp) {
-HXLINE( 722)			return 2;
+HXDLIN( 722)		if (_hx_tmp) {
+HXLINE( 723)			return 2;
             		}
             		else {
-HXLINE( 724)			return this->super::callStatus();
+HXLINE( 725)			return this->super::callStatus();
             		}
-HXLINE( 721)		return null();
+HXLINE( 722)		return null();
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/calls/PeerConnection.cpp b/Sources/c_borogove/src/borogove/calls/PeerConnection.cpp
index d7d7dcb..630bca4 100644
--- a/Sources/c_borogove/src/borogove/calls/PeerConnection.cpp
+++ b/Sources/c_borogove/src/borogove/calls/PeerConnection.cpp
@@ -12,6 +12,9 @@
 #ifndef INCLUDED_Lambda
 #include <Lambda.h>
 #endif
+#ifndef INCLUDED_Sys
+#include <Sys.h>
+#endif
 #ifndef INCLUDED_borogove_calls_DTMFSender
 #include <borogove/calls/DTMFSender.h>
 #endif
@@ -83,7 +86,9 @@ HXLINE( 801)		this->trackListeners = ::Array_obj< ::Dynamic>::__new(0);
 HXLINE( 800)		this->remoteMedia =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
 HXLINE( 799)		this->tracks =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
 HXLINE( 798)		this->waitingOnLocal = null();
-HXLINE( 811)		rtc::InitLogger(rtc::LogLevel::Verbose);;
+HXLINE( 810)		if (::hx::IsNotNull( ::Sys_obj::getEnv(HX_("BOROGOVE_WEBRTC_DEBUG",9f,1e,98,13)) )) {
+HXLINE( 811)			rtc::InitLogger(rtc::LogLevel::Verbose);;
+            		}
 HXLINE( 813)		this->mainLoop = ::sys::thread::_Thread::Thread_Impl__obj::get_events(::sys::thread::_Thread::HaxeThread_obj::current());
 HXLINE( 814)		rtc::Configuration configRaw;;
 HXLINE( 815)		::cpp::Pointer<  rtc::Configuration > config = &configRaw;
diff --git a/Sources/c_borogove/src/borogove/calls/Session__Companion.cpp b/Sources/c_borogove/src/borogove/calls/Session__Companion.cpp
index 3163d6f..9eaa3c2 100644
--- a/Sources/c_borogove/src/borogove/calls/Session__Companion.cpp
+++ b/Sources/c_borogove/src/borogove/calls/Session__Companion.cpp
@@ -1,8 +1,8 @@
 // Generated by Haxe 4.3.3
 #include <hxcpp.h>
 
-#ifndef INCLUDED__HaxeCBridge_Internal
-#include <_HaxeCBridge/Internal.h>
+#ifndef INCLUDED__HaxeCBridge_HaxeArray_Impl_
+#include <_HaxeCBridge/HaxeArray_Impl_.h>
 #endif
 #ifndef INCLUDED_borogove_calls_DTMFSender
 #include <borogove/calls/DTMFSender.h>
@@ -19,22 +19,16 @@
 #ifndef INCLUDED_borogove_calls_Session__Companion
 #include <borogove/calls/Session__Companion.h>
 #endif
-#ifndef INCLUDED_cpp_Int64Map
-#include <cpp/Int64Map.h>
-#endif
-#ifndef INCLUDED_haxe_IMap
-#include <haxe/IMap.h>
-#endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_398_sid__fromC,"borogove.calls.Session__Companion","sid__fromC",0xb4d809dd,"borogove.calls.Session__Companion.sid__fromC","HaxeCBridge.hx",398,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_398_chatId__fromC,"borogove.calls.Session__Companion","chatId__fromC",0x15871c94,"borogove.calls.Session__Companion.chatId__fromC","HaxeCBridge.hx",398,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_339_accept__fromC,"borogove.calls.Session__Companion","accept__fromC",0xb496eeff,"borogove.calls.Session__Companion.accept__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_339_hangup__fromC,"borogove.calls.Session__Companion","hangup__fromC",0x5d6c525a,"borogove.calls.Session__Companion.hangup__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_339_addMedia__fromC,"borogove.calls.Session__Companion","addMedia__fromC",0x547edbe4,"borogove.calls.Session__Companion.addMedia__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_339_callStatus__fromC,"borogove.calls.Session__Companion","callStatus__fromC",0xa6b1df97,"borogove.calls.Session__Companion.callStatus__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_335_audioTracks__fromC,"borogove.calls.Session__Companion","audioTracks__fromC",0x5ab3ebed,"borogove.calls.Session__Companion.audioTracks__fromC","HaxeCBridge.hx",335,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_335_videoTracks__fromC,"borogove.calls.Session__Companion","videoTracks__fromC",0x658a2d28,"borogove.calls.Session__Companion.videoTracks__fromC","HaxeCBridge.hx",335,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_339_dtmf__fromC,"borogove.calls.Session__Companion","dtmf__fromC",0x85e815be,"borogove.calls.Session__Companion.dtmf__fromC","HaxeCBridge.hx",339,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_426_sid__fromC,"borogove.calls.Session__Companion","sid__fromC",0xb4d809dd,"borogove.calls.Session__Companion.sid__fromC","HaxeCBridge.hx",426,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_426_chatId__fromC,"borogove.calls.Session__Companion","chatId__fromC",0x15871c94,"borogove.calls.Session__Companion.chatId__fromC","HaxeCBridge.hx",426,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_354_accept__fromC,"borogove.calls.Session__Companion","accept__fromC",0xb496eeff,"borogove.calls.Session__Companion.accept__fromC","HaxeCBridge.hx",354,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_354_hangup__fromC,"borogove.calls.Session__Companion","hangup__fromC",0x5d6c525a,"borogove.calls.Session__Companion.hangup__fromC","HaxeCBridge.hx",354,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_354_addMedia__fromC,"borogove.calls.Session__Companion","addMedia__fromC",0x547edbe4,"borogove.calls.Session__Companion.addMedia__fromC","HaxeCBridge.hx",354,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_367_callStatus__fromC,"borogove.calls.Session__Companion","callStatus__fromC",0xa6b1df97,"borogove.calls.Session__Companion.callStatus__fromC","HaxeCBridge.hx",367,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_363_audioTracks__fromC,"borogove.calls.Session__Companion","audioTracks__fromC",0x5ab3ebed,"borogove.calls.Session__Companion.audioTracks__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_363_videoTracks__fromC,"borogove.calls.Session__Companion","videoTracks__fromC",0x658a2d28,"borogove.calls.Session__Companion.videoTracks__fromC","HaxeCBridge.hx",363,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_7f8492da277c5647_367_dtmf__fromC,"borogove.calls.Session__Companion","dtmf__fromC",0x85e815be,"borogove.calls.Session__Companion.dtmf__fromC","HaxeCBridge.hx",367,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_92536cee04e1ee39_30_boot,"borogove.calls.Session__Companion","boot",0x3ae4ad64,"borogove.calls.Session__Companion.boot","borogove/calls/Session.hx",30,0x33a79030)
 namespace borogove{
 namespace calls{
@@ -57,165 +51,89 @@ bool Session__Companion_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::String Session__Companion_obj::sid__fromC(::Dynamic _hx___self){
-            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_398_sid__fromC)
-HXDLIN( 398)		return ::borogove::calls::Session_obj::get_sid(_hx___self);
+            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_426_sid__fromC)
+HXDLIN( 426)		return ::borogove::calls::Session_obj::get_sid(_hx___self);
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Session__Companion_obj,sid__fromC,return )
 
 ::String Session__Companion_obj::chatId__fromC(::Dynamic _hx___self){
-            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_398_chatId__fromC)
-HXDLIN( 398)		return ::borogove::calls::Session_obj::get_chatId(_hx___self);
+            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_426_chatId__fromC)
+HXDLIN( 426)		return ::borogove::calls::Session_obj::get_chatId(_hx___self);
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Session__Companion_obj,chatId__fromC,return )
 
 void Session__Companion_obj::accept__fromC(::Dynamic self){
-            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_339_accept__fromC)
-HXDLIN( 339)		::borogove::calls::Session_obj::accept(self);
+            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_354_accept__fromC)
+HXDLIN( 354)		::borogove::calls::Session_obj::accept(self);
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Session__Companion_obj,accept__fromC,(void))
 
 void Session__Companion_obj::hangup__fromC(::Dynamic self){
-            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_339_hangup__fromC)
-HXDLIN( 339)		::borogove::calls::Session_obj::hangup(self);
+            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_354_hangup__fromC)
+HXDLIN( 354)		::borogove::calls::Session_obj::hangup(self);
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Session__Companion_obj,hangup__fromC,(void))
 
 void Session__Companion_obj::addMedia__fromC(::Dynamic self,::cpp::Pointer< void* > streams,size_t streams__len){
-            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_339_addMedia__fromC)
-HXLINE( 282)		::Array< ::Dynamic> _hx_tmp;
-HXDLIN( 282)		if (::hx::IsNull( streams )) {
-HXLINE( 282)			_hx_tmp = null();
+            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_354_addMedia__fromC)
+HXLINE( 302)		::Array< ::Dynamic> _hx_tmp;
+HXDLIN( 302)		if (::hx::IsNull( streams )) {
+HXLINE( 302)			_hx_tmp = ::Array_obj< ::Dynamic>::__new(0);
             		}
             		else {
-HXLINE( 282)			::cpp::Pointer<  ::borogove::calls::MediaStream > _this = streams->reinterpret();
-HXDLIN( 282)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new();
-HXDLIN( 282)			::cpp::Pointer<  ::borogove::calls::MediaStream > tmp = _this;
-HXDLIN( 282)			result->setUnmanagedData(tmp,( (int)(streams__len) ));
-HXDLIN( 282)			_hx_tmp = result->copy();
+HXLINE( 302)			::cpp::Pointer<  ::borogove::calls::MediaStream > _this = streams->reinterpret();
+HXDLIN( 302)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new();
+HXDLIN( 302)			::cpp::Pointer<  ::borogove::calls::MediaStream > tmp = _this;
+HXDLIN( 302)			result->setUnmanagedData(tmp,( (int)(streams__len) ));
+HXDLIN( 302)			_hx_tmp = result->copy();
             		}
-HXLINE( 339)		::borogove::calls::Session_obj::addMedia(self,_hx_tmp);
+HXLINE( 354)		::borogove::calls::Session_obj::addMedia(self,_hx_tmp);
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC3(Session__Companion_obj,addMedia__fromC,(void))
 
 int Session__Companion_obj::callStatus__fromC(::Dynamic self){
-            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_339_callStatus__fromC)
-HXDLIN( 339)		return ::borogove::calls::Session_obj::callStatus(self);
+            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_367_callStatus__fromC)
+HXDLIN( 367)		return ::borogove::calls::Session_obj::callStatus(self);
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Session__Companion_obj,callStatus__fromC,return )
 
 size_t Session__Companion_obj::audioTracks__fromC(::Dynamic self,void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_335_audioTracks__fromC)
-HXDLIN( 335)		::Array< ::Dynamic> out = ::borogove::calls::Session_obj::audioTracks(self);
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g = 0;
-HXDLIN( 335)				while((_g < out->length)){
-HXDLIN( 335)					 ::borogove::calls::MediaStreamTrack el = out->__get(_g).StaticCast<  ::borogove::calls::MediaStreamTrack >();
-HXDLIN( 335)					_g = (_g + 1);
-HXDLIN( 335)					{
-HXDLIN( 335)						 ::Dynamic haxeObject = el;
-HXDLIN( 335)						void* ptr = haxeObject.mPtr;
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXDLIN( 335)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)out->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXDLIN( 335)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),out));
-HXDLIN( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_363_audioTracks__fromC)
+HXDLIN( 363)		::Array< ::Dynamic> out = ::borogove::calls::Session_obj::audioTracks(self);
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
 size_t Session__Companion_obj::videoTracks__fromC(::Dynamic self,void*** outPtr){
-            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_335_videoTracks__fromC)
-HXDLIN( 335)		::Array< ::Dynamic> out = ::borogove::calls::Session_obj::videoTracks(self);
-HXDLIN( 335)		if (::hx::IsNotNull( outPtr )) {
-HXDLIN( 335)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
-HXDLIN( 335)			{
-HXDLIN( 335)				int _g = 0;
-HXDLIN( 335)				while((_g < out->length)){
-HXDLIN( 335)					 ::borogove::calls::MediaStreamTrack el = out->__get(_g).StaticCast<  ::borogove::calls::MediaStreamTrack >();
-HXDLIN( 335)					_g = (_g + 1);
-HXDLIN( 335)					{
-HXDLIN( 335)						 ::Dynamic haxeObject = el;
-HXDLIN( 335)						void* ptr = haxeObject.mPtr;
-HXDLIN( 335)						::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 335)						{
-HXDLIN( 335)							 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 335)							if (::hx::IsNull( store )) {
-HXDLIN( 335)								store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            									->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            									->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 335)								::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            							}
-            							else {
-HXDLIN( 335)								::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            							}
-            						}
-            					}
-            				}
-            			}
-HXDLIN( 335)			void** ptr1 = (void**)out->getBase();
-HXDLIN( 335)			::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 335)			{
-HXDLIN( 335)				 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 335)				if (::hx::IsNull( store1 )) {
-HXDLIN( 335)					store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            						->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            						->setFixed(1,HX_("value",71,7f,b8,31),out));
-HXDLIN( 335)					::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            				}
-            				else {
-HXDLIN( 335)					::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            				}
-            			}
-HXDLIN( 335)			_hx_tmp->set_ref(ptr1);
+            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_363_videoTracks__fromC)
+HXDLIN( 363)		::Array< ::Dynamic> out = ::borogove::calls::Session_obj::videoTracks(self);
+HXDLIN( 363)		if (::hx::IsNotNull( outPtr )) {
+HXDLIN( 363)			::cpp::Pointer< void** > _hx_tmp = ::cpp::Pointer_obj::fromRaw(outPtr);
+HXDLIN( 363)			_hx_tmp->set_ref(::_HaxeCBridge::HaxeArray_Impl__obj::fromNullableArrayT(out));
             		}
-HXDLIN( 335)		return ( (size_t)(out->length) );
+HXDLIN( 363)		return ( (size_t)(out->length) );
             	}
 
 
  ::borogove::calls::DTMFSender Session__Companion_obj::dtmf__fromC(::Dynamic self){
-            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_339_dtmf__fromC)
-HXDLIN( 339)		return ::borogove::calls::Session_obj::dtmf(self);
+            	HX_STACKFRAME(&_hx_pos_7f8492da277c5647_367_dtmf__fromC)
+HXDLIN( 367)		return ::borogove::calls::Session_obj::dtmf(self);
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/calls/_Session/Session_Fields_.cpp b/Sources/c_borogove/src/borogove/calls/_Session/Session_Fields_.cpp
index 647d4b4..67ff62c 100644
--- a/Sources/c_borogove/src/borogove/calls/_Session/Session_Fields_.cpp
+++ b/Sources/c_borogove/src/borogove/calls/_Session/Session_Fields_.cpp
@@ -7,17 +7,26 @@
 #ifndef INCLUDED_Reflect
 #include <Reflect.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_ChatMessage
 #include <borogove/ChatMessage.h>
 #endif
 #ifndef INCLUDED_borogove_ChatMessageBuilder
 #include <borogove/ChatMessageBuilder.h>
 #endif
+#ifndef INCLUDED_borogove_Client
+#include <borogove/Client.h>
+#endif
 #ifndef INCLUDED_borogove_Date
 #include <borogove/Date.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED_borogove_EventEmitter
+#include <borogove/EventEmitter.h>
+#endif
+#ifndef INCLUDED_borogove_Html
+#include <borogove/Html.h>
 #endif
 #ifndef INCLUDED_borogove_JID
 #include <borogove/JID.h>
@@ -51,25 +60,26 @@ bool Session_Fields__obj::_hx_isInstanceOf(int inClassId) {
 	return inClassId==(int)0x00000001 || inClassId==(int)0x2e838196;
 }
 
- ::borogove::ChatMessage Session_Fields__obj::mkCallMessage( ::borogove::JID to, ::borogove::JID from, ::borogove::Stanza event){
+ ::borogove::ChatMessage Session_Fields__obj::mkCallMessage( ::borogove::JID to, ::borogove::Client client, ::borogove::Stanza event){
             	HX_GC_STACKFRAME(&_hx_pos_d89d9de038d31b1d_54_mkCallMessage)
 HXLINE(  55)		 ::borogove::ChatMessageBuilder m =  ::borogove::ChatMessageBuilder_obj::__alloc( HX_CTX );
 HXLINE(  56)		m->type = 1;
 HXLINE(  57)		m->to = to;
 HXLINE(  58)		m->recipients = ::Array_obj< ::Dynamic>::__new(1)->init(0,to->asBare());
-HXLINE(  59)		m->from = from;
+HXLINE(  59)		m->from = client->jid;
 HXLINE(  60)		m->sender = m->from->asBare();
 HXLINE(  61)		m->replyTo = ::Array_obj< ::Dynamic>::__new(1)->init(0,m->sender);
 HXLINE(  62)		m->direction = 1;
-HXLINE(  63)		m->text = (HX_("call ",c2,71,1b,41) + event->name);
+HXLINE(  63)		m->setBody(::borogove::Html_obj::text((HX_("call ",c2,71,1b,41) + event->name)));
 HXLINE(  64)		m->timestamp = ::borogove::Date_obj::format(::Date_obj::now());
 HXLINE(  65)		m->payloads->push(event);
-HXLINE(  66)		m->localId = ::borogove::ID_obj::_hx_long();
+HXLINE(  66)		m->localId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  67)		if ((event->name != HX_("propose",fe,fe,e9,f9))) {
 HXLINE(  68)			m->versions = ::Array_obj< ::Dynamic>::__new(1)->init(0,m->build());
             		}
 HXLINE(  70)		m->localId = ( (::String)(::Reflect_obj::field(event->attr,HX_("id",db,5b,00,00))) );
-HXLINE(  71)		return m->build();
+HXLINE(  71)		m->sortId = client->nextSortId();
+HXLINE(  72)		return m->build();
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/persistence/Dummy.cpp b/Sources/c_borogove/src/borogove/persistence/Dummy.cpp
index 79a627f..1a20cf8 100644
--- a/Sources/c_borogove/src/borogove/persistence/Dummy.cpp
+++ b/Sources/c_borogove/src/borogove/persistence/Dummy.cpp
@@ -10,6 +10,15 @@
 #ifndef INCLUDED_borogove_ChatMessage
 #include <borogove/ChatMessage.h>
 #endif
+#ifndef INCLUDED_borogove_EventEmitter
+#include <borogove/EventEmitter.h>
+#endif
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
+#endif
+#ifndef INCLUDED_borogove_MemberUpdate
+#include <borogove/MemberUpdate.h>
+#endif
 #ifndef INCLUDED_borogove_Persistence
 #include <borogove/Persistence.h>
 #endif
@@ -30,31 +39,36 @@
 #endif
 
 HX_DEFINE_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_30_new,"borogove.persistence.Dummy","new",0x6443be1e,"borogove.persistence.Dummy.new","borogove/persistence/Dummy.hx",30,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_34_lastId,"borogove.persistence.Dummy","lastId",0xf55dc8d3,"borogove.persistence.Dummy.lastId","borogove/persistence/Dummy.hx",34,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_34_syncPoint,"borogove.persistence.Dummy","syncPoint",0x55a2d033,"borogove.persistence.Dummy.syncPoint","borogove/persistence/Dummy.hx",34,0x240ebe94)
 HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_38_storeChats,"borogove.persistence.Dummy","storeChats",0x323ab0fc,"borogove.persistence.Dummy.storeChats","borogove/persistence/Dummy.hx",38,0x240ebe94)
 HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_42_getChats,"borogove.persistence.Dummy","getChats",0x2b8e2fa7,"borogove.persistence.Dummy.getChats","borogove/persistence/Dummy.hx",42,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_47_storeMessages,"borogove.persistence.Dummy","storeMessages",0xbccbb90b,"borogove.persistence.Dummy.storeMessages","borogove/persistence/Dummy.hx",47,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_51_updateMessage,"borogove.persistence.Dummy","updateMessage",0x388d61fc,"borogove.persistence.Dummy.updateMessage","borogove/persistence/Dummy.hx",51,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_56_getMessage,"borogove.persistence.Dummy","getMessage",0x987b21d3,"borogove.persistence.Dummy.getMessage","borogove/persistence/Dummy.hx",56,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_61_getMessagesBefore,"borogove.persistence.Dummy","getMessagesBefore",0x5f1a2fdf,"borogove.persistence.Dummy.getMessagesBefore","borogove/persistence/Dummy.hx",61,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_66_getMessagesAfter,"borogove.persistence.Dummy","getMessagesAfter",0xdd1516bc,"borogove.persistence.Dummy.getMessagesAfter","borogove/persistence/Dummy.hx",66,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_71_getMessagesAround,"borogove.persistence.Dummy","getMessagesAround",0x7aebd3ad,"borogove.persistence.Dummy.getMessagesAround","borogove/persistence/Dummy.hx",71,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_76_getChatsUnreadDetails,"borogove.persistence.Dummy","getChatsUnreadDetails",0x6c7f0a2c,"borogove.persistence.Dummy.getChatsUnreadDetails","borogove/persistence/Dummy.hx",76,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_81_storeReaction,"borogove.persistence.Dummy","storeReaction",0x7e82c7e8,"borogove.persistence.Dummy.storeReaction","borogove/persistence/Dummy.hx",81,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_86_updateMessageStatus,"borogove.persistence.Dummy","updateMessageStatus",0x6bfd624e,"borogove.persistence.Dummy.updateMessageStatus","borogove/persistence/Dummy.hx",86,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_91_hasMedia,"borogove.persistence.Dummy","hasMedia",0x1817d0ac,"borogove.persistence.Dummy.hasMedia","borogove/persistence/Dummy.hx",91,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_96_storeMedia,"borogove.persistence.Dummy","storeMedia",0xf2431745,"borogove.persistence.Dummy.storeMedia","borogove/persistence/Dummy.hx",96,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_100_removeMedia,"borogove.persistence.Dummy","removeMedia",0x7c40bdbe,"borogove.persistence.Dummy.removeMedia","borogove/persistence/Dummy.hx",100,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_104_storeCaps,"borogove.persistence.Dummy","storeCaps",0x5ae530e0,"borogove.persistence.Dummy.storeCaps","borogove/persistence/Dummy.hx",104,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_108_getCaps,"borogove.persistence.Dummy","getCaps",0xf9497095,"borogove.persistence.Dummy.getCaps","borogove/persistence/Dummy.hx",108,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_112_storeLogin,"borogove.persistence.Dummy","storeLogin",0x657aebca,"borogove.persistence.Dummy.storeLogin","borogove/persistence/Dummy.hx",112,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_116_getLogin,"borogove.persistence.Dummy","getLogin",0x5ece6a75,"borogove.persistence.Dummy.getLogin","borogove/persistence/Dummy.hx",116,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_120_removeAccount,"borogove.persistence.Dummy","removeAccount",0x4d222007,"borogove.persistence.Dummy.removeAccount","borogove/persistence/Dummy.hx",120,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_124_listAccounts,"borogove.persistence.Dummy","listAccounts",0xc457ec26,"borogove.persistence.Dummy.listAccounts","borogove/persistence/Dummy.hx",124,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_128_storeStreamManagement,"borogove.persistence.Dummy","storeStreamManagement",0x74dc5262,"borogove.persistence.Dummy.storeStreamManagement","borogove/persistence/Dummy.hx",128,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_132_getStreamManagement,"borogove.persistence.Dummy","getStreamManagement",0xc93bcd97,"borogove.persistence.Dummy.getStreamManagement","borogove/persistence/Dummy.hx",132,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_136_storeService,"borogove.persistence.Dummy","storeService",0x6c6648d6,"borogove.persistence.Dummy.storeService","borogove/persistence/Dummy.hx",136,0x240ebe94)
-HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_140_findServicesWithFeature,"borogove.persistence.Dummy","findServicesWithFeature",0x6b47cf57,"borogove.persistence.Dummy.findServicesWithFeature","borogove/persistence/Dummy.hx",140,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_47_storeMembers,"borogove.persistence.Dummy","storeMembers",0x84a9597a,"borogove.persistence.Dummy.storeMembers","borogove/persistence/Dummy.hx",47,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_52_storeMemberUpdates,"borogove.persistence.Dummy","storeMemberUpdates",0x6de94271,"borogove.persistence.Dummy.storeMemberUpdates","borogove/persistence/Dummy.hx",52,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_57_clearMemberPresence,"borogove.persistence.Dummy","clearMemberPresence",0x022b66e0,"borogove.persistence.Dummy.clearMemberPresence","borogove/persistence/Dummy.hx",57,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_62_getMembers,"borogove.persistence.Dummy","getMembers",0x18da18e5,"borogove.persistence.Dummy.getMembers","borogove/persistence/Dummy.hx",62,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_67_getMemberDetails,"borogove.persistence.Dummy","getMemberDetails",0x38b2fe94,"borogove.persistence.Dummy.getMemberDetails","borogove/persistence/Dummy.hx",67,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_72_storeMessages,"borogove.persistence.Dummy","storeMessages",0xbccbb90b,"borogove.persistence.Dummy.storeMessages","borogove/persistence/Dummy.hx",72,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_76_updateMessage,"borogove.persistence.Dummy","updateMessage",0x388d61fc,"borogove.persistence.Dummy.updateMessage","borogove/persistence/Dummy.hx",76,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_81_getMessage,"borogove.persistence.Dummy","getMessage",0x987b21d3,"borogove.persistence.Dummy.getMessage","borogove/persistence/Dummy.hx",81,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_86_getMessagesBefore,"borogove.persistence.Dummy","getMessagesBefore",0x5f1a2fdf,"borogove.persistence.Dummy.getMessagesBefore","borogove/persistence/Dummy.hx",86,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_91_getMessagesAfter,"borogove.persistence.Dummy","getMessagesAfter",0xdd1516bc,"borogove.persistence.Dummy.getMessagesAfter","borogove/persistence/Dummy.hx",91,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_96_getMessagesAround,"borogove.persistence.Dummy","getMessagesAround",0x7aebd3ad,"borogove.persistence.Dummy.getMessagesAround","borogove/persistence/Dummy.hx",96,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_101_getChatsUnreadDetails,"borogove.persistence.Dummy","getChatsUnreadDetails",0x6c7f0a2c,"borogove.persistence.Dummy.getChatsUnreadDetails","borogove/persistence/Dummy.hx",101,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_106_storeReaction,"borogove.persistence.Dummy","storeReaction",0x7e82c7e8,"borogove.persistence.Dummy.storeReaction","borogove/persistence/Dummy.hx",106,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_111_updateMessageStatus,"borogove.persistence.Dummy","updateMessageStatus",0x6bfd624e,"borogove.persistence.Dummy.updateMessageStatus","borogove/persistence/Dummy.hx",111,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_116_hasMedia,"borogove.persistence.Dummy","hasMedia",0x1817d0ac,"borogove.persistence.Dummy.hasMedia","borogove/persistence/Dummy.hx",116,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_121_storeMedia,"borogove.persistence.Dummy","storeMedia",0xf2431745,"borogove.persistence.Dummy.storeMedia","borogove/persistence/Dummy.hx",121,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_126_removeMedia,"borogove.persistence.Dummy","removeMedia",0x7c40bdbe,"borogove.persistence.Dummy.removeMedia","borogove/persistence/Dummy.hx",126,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_130_storeCaps,"borogove.persistence.Dummy","storeCaps",0x5ae530e0,"borogove.persistence.Dummy.storeCaps","borogove/persistence/Dummy.hx",130,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_134_getCaps,"borogove.persistence.Dummy","getCaps",0xf9497095,"borogove.persistence.Dummy.getCaps","borogove/persistence/Dummy.hx",134,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_139_storeLogin,"borogove.persistence.Dummy","storeLogin",0x657aebca,"borogove.persistence.Dummy.storeLogin","borogove/persistence/Dummy.hx",139,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_144_getLogin,"borogove.persistence.Dummy","getLogin",0x5ece6a75,"borogove.persistence.Dummy.getLogin","borogove/persistence/Dummy.hx",144,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_149_removeAccount,"borogove.persistence.Dummy","removeAccount",0x4d222007,"borogove.persistence.Dummy.removeAccount","borogove/persistence/Dummy.hx",149,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_154_listAccounts,"borogove.persistence.Dummy","listAccounts",0xc457ec26,"borogove.persistence.Dummy.listAccounts","borogove/persistence/Dummy.hx",154,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_159_storeStreamManagement,"borogove.persistence.Dummy","storeStreamManagement",0x74dc5262,"borogove.persistence.Dummy.storeStreamManagement","borogove/persistence/Dummy.hx",159,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_164_getStreamManagement,"borogove.persistence.Dummy","getStreamManagement",0xc93bcd97,"borogove.persistence.Dummy.getStreamManagement","borogove/persistence/Dummy.hx",164,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_168_storeService,"borogove.persistence.Dummy","storeService",0x6c6648d6,"borogove.persistence.Dummy.storeService","borogove/persistence/Dummy.hx",168,0x240ebe94)
+HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_172_findServicesWithFeature,"borogove.persistence.Dummy","findServicesWithFeature",0x6b47cf57,"borogove.persistence.Dummy.findServicesWithFeature","borogove/persistence/Dummy.hx",172,0x240ebe94)
 HX_LOCAL_STACK_FRAME(_hx_pos_95dfb57bb5df11b7_24_boot,"borogove.persistence.Dummy","boot",0x4f1b9cb4,"borogove.persistence.Dummy.boot","borogove/persistence/Dummy.hx",24,0x240ebe94)
 namespace borogove{
 namespace persistence{
@@ -79,28 +93,33 @@ bool Dummy_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 static ::borogove::Persistence_obj _hx_borogove_persistence_Dummy__hx_borogove_Persistence= {
-	( ::Dynamic (::hx::Object::*)(::String,::String))&::borogove::persistence::Dummy_obj::lastId,
+	( ::Dynamic (::hx::Object::*)(::String,::String))&::borogove::persistence::Dummy_obj::syncPoint,
 	( void (::hx::Object::*)(::String,::Array< ::Dynamic>))&::borogove::persistence::Dummy_obj::storeChats,
 	( ::Dynamic (::hx::Object::*)(::String))&::borogove::persistence::Dummy_obj::getChats,
+	( ::Dynamic (::hx::Object::*)(::String,::String,::Array< ::Dynamic>))&::borogove::persistence::Dummy_obj::storeMembers,
+	( ::Dynamic (::hx::Object::*)(::String, ::borogove::Chat,::Array< ::Dynamic>,bool))&::borogove::persistence::Dummy_obj::storeMemberUpdates,
+	( ::Dynamic (::hx::Object::*)(::String,::String))&::borogove::persistence::Dummy_obj::clearMemberPresence,
+	( ::Dynamic (::hx::Object::*)(::String, ::borogove::Chat,bool))&::borogove::persistence::Dummy_obj::getMembers,
+	( ::Dynamic (::hx::Object::*)(::String, ::borogove::Chat,::Array< ::String >))&::borogove::persistence::Dummy_obj::getMemberDetails,
 	( ::Dynamic (::hx::Object::*)(::String,::Array< ::Dynamic>))&::borogove::persistence::Dummy_obj::getChatsUnreadDetails,
 	( ::Dynamic (::hx::Object::*)(::String, ::borogove::ReactionUpdate))&::borogove::persistence::Dummy_obj::storeReaction,
 	( ::Dynamic (::hx::Object::*)(::String,::Array< ::Dynamic>))&::borogove::persistence::Dummy_obj::storeMessages,
 	( void (::hx::Object::*)(::String, ::borogove::ChatMessage))&::borogove::persistence::Dummy_obj::updateMessage,
 	( ::Dynamic (::hx::Object::*)(::String,::String,int,::String))&::borogove::persistence::Dummy_obj::updateMessageStatus,
 	( ::Dynamic (::hx::Object::*)(::String,::String,::String,::String))&::borogove::persistence::Dummy_obj::getMessage,
-	( ::Dynamic (::hx::Object::*)(::String,::String,::String,::String))&::borogove::persistence::Dummy_obj::getMessagesBefore,
-	( ::Dynamic (::hx::Object::*)(::String,::String,::String,::String))&::borogove::persistence::Dummy_obj::getMessagesAfter,
-	( ::Dynamic (::hx::Object::*)(::String,::String,::String,::String))&::borogove::persistence::Dummy_obj::getMessagesAround,
+	( ::Dynamic (::hx::Object::*)(::String,::String, ::borogove::ChatMessage))&::borogove::persistence::Dummy_obj::getMessagesBefore,
+	( ::Dynamic (::hx::Object::*)(::String,::String, ::borogove::ChatMessage))&::borogove::persistence::Dummy_obj::getMessagesAfter,
+	( ::Dynamic (::hx::Object::*)(::String, ::borogove::ChatMessage))&::borogove::persistence::Dummy_obj::getMessagesAround,
 	( ::Dynamic (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::Dummy_obj::hasMedia,
 	( ::Dynamic (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::Dummy_obj::storeMedia,
-	( void (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::Dummy_obj::removeMedia,
+	( ::Dynamic (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::Dummy_obj::removeMedia,
 	( void (::hx::Object::*)( ::borogove::Caps))&::borogove::persistence::Dummy_obj::storeCaps,
 	( ::Dynamic (::hx::Object::*)(::String))&::borogove::persistence::Dummy_obj::getCaps,
-	( void (::hx::Object::*)(::String,::String,::String,::String))&::borogove::persistence::Dummy_obj::storeLogin,
+	( ::Dynamic (::hx::Object::*)(::String,::String,::String,::String))&::borogove::persistence::Dummy_obj::storeLogin,
 	( ::Dynamic (::hx::Object::*)(::String))&::borogove::persistence::Dummy_obj::getLogin,
-	( void (::hx::Object::*)(::String,bool))&::borogove::persistence::Dummy_obj::removeAccount,
+	( ::Dynamic (::hx::Object::*)(::String,bool))&::borogove::persistence::Dummy_obj::removeAccount,
 	( ::Dynamic (::hx::Object::*)())&::borogove::persistence::Dummy_obj::listAccounts,
-	( void (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::Dummy_obj::storeStreamManagement,
+	( ::Dynamic (::hx::Object::*)(::String,::Array< unsigned char >,::String))&::borogove::persistence::Dummy_obj::storeStreamManagement,
 	( ::Dynamic (::hx::Object::*)(::String))&::borogove::persistence::Dummy_obj::getStreamManagement,
 	( void (::hx::Object::*)(::String,::String,::String,::String, ::borogove::Caps))&::borogove::persistence::Dummy_obj::storeService,
 	( ::Dynamic (::hx::Object::*)(::String,::String))&::borogove::persistence::Dummy_obj::findServicesWithFeature,
@@ -117,13 +136,13 @@ void *Dummy_obj::_hx_getInterface(int inHash) {
 	#endif
 }
 
-::Dynamic Dummy_obj::lastId(::String accountId,::String chatId){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_34_lastId)
+::Dynamic Dummy_obj::syncPoint(::String accountId,::String chatId){
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_34_syncPoint)
 HXDLIN(  34)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,lastId,return )
+HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,syncPoint,return )
 
 void Dummy_obj::storeChats(::String accountId,::Array< ::Dynamic> chat){
             	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_38_storeChats)
@@ -140,125 +159,167 @@ HXDLIN(  42)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_ob
 
 HX_DEFINE_DYNAMIC_FUNC1(Dummy_obj,getChats,return )
 
+::Dynamic Dummy_obj::storeMembers(::String accountId,::String chatId,::Array< ::Dynamic> chat){
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_47_storeMembers)
+HXDLIN(  47)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(false);
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC3(Dummy_obj,storeMembers,return )
+
+::Dynamic Dummy_obj::storeMemberUpdates(::String accountId, ::borogove::Chat chat,::Array< ::Dynamic> updates,bool isFullList){
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_52_storeMemberUpdates)
+HXDLIN(  52)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC4(Dummy_obj,storeMemberUpdates,return )
+
+::Dynamic Dummy_obj::clearMemberPresence(::String accountId,::String chatId){
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_57_clearMemberPresence)
+HXDLIN(  57)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(false);
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,clearMemberPresence,return )
+
+::Dynamic Dummy_obj::getMembers(::String accountId, ::borogove::Chat chat,bool forModerator){
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_62_getMembers)
+HXDLIN(  62)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC3(Dummy_obj,getMembers,return )
+
+::Dynamic Dummy_obj::getMemberDetails(::String accountId, ::borogove::Chat chat,::Array< ::String > ids){
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_67_getMemberDetails)
+HXDLIN(  67)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC3(Dummy_obj,getMemberDetails,return )
+
 ::Dynamic Dummy_obj::storeMessages(::String accountId,::Array< ::Dynamic> messages){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_47_storeMessages)
-HXDLIN(  47)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(messages);
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_72_storeMessages)
+HXDLIN(  72)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(messages);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,storeMessages,return )
 
 void Dummy_obj::updateMessage(::String accountId, ::borogove::ChatMessage message){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_51_updateMessage)
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_76_updateMessage)
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,updateMessage,(void))
 
 ::Dynamic Dummy_obj::getMessage(::String accountId,::String chatId,::String serverId,::String localId){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_56_getMessage)
-HXDLIN(  56)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_81_getMessage)
+HXDLIN(  81)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC4(Dummy_obj,getMessage,return )
 
-::Dynamic Dummy_obj::getMessagesBefore(::String accountId,::String chatId,::String beforeId,::String beforeTime){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_61_getMessagesBefore)
-HXDLIN(  61)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+::Dynamic Dummy_obj::getMessagesBefore(::String accountId,::String chatId, ::borogove::ChatMessage before){
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_86_getMessagesBefore)
+HXDLIN(  86)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC4(Dummy_obj,getMessagesBefore,return )
+HX_DEFINE_DYNAMIC_FUNC3(Dummy_obj,getMessagesBefore,return )
 
-::Dynamic Dummy_obj::getMessagesAfter(::String accountId,::String chatId,::String afterId,::String afterTime){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_66_getMessagesAfter)
-HXDLIN(  66)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+::Dynamic Dummy_obj::getMessagesAfter(::String accountId,::String chatId, ::borogove::ChatMessage after){
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_91_getMessagesAfter)
+HXDLIN(  91)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC4(Dummy_obj,getMessagesAfter,return )
+HX_DEFINE_DYNAMIC_FUNC3(Dummy_obj,getMessagesAfter,return )
 
-::Dynamic Dummy_obj::getMessagesAround(::String accountId,::String chatId,::String aroundId,::String aroundTime){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_71_getMessagesAround)
-HXDLIN(  71)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+::Dynamic Dummy_obj::getMessagesAround(::String accountId, ::borogove::ChatMessage around){
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_96_getMessagesAround)
+HXDLIN(  96)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC4(Dummy_obj,getMessagesAround,return )
+HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,getMessagesAround,return )
 
 ::Dynamic Dummy_obj::getChatsUnreadDetails(::String accountId,::Array< ::Dynamic> chats){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_76_getChatsUnreadDetails)
-HXDLIN(  76)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_101_getChatsUnreadDetails)
+HXDLIN( 101)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,getChatsUnreadDetails,return )
 
 ::Dynamic Dummy_obj::storeReaction(::String accountId, ::borogove::ReactionUpdate update){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_81_storeReaction)
-HXDLIN(  81)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_106_storeReaction)
+HXDLIN( 106)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,storeReaction,return )
 
 ::Dynamic Dummy_obj::updateMessageStatus(::String accountId,::String localId,int status,::String statusText){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_86_updateMessageStatus)
-HXDLIN(  86)		return ::thenshim::_Promise::Promise_Impl__obj::reject(HX_("Dummy cannot updateMessageStatus",0b,f6,b0,c2));
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_111_updateMessageStatus)
+HXDLIN( 111)		return ::thenshim::_Promise::Promise_Impl__obj::reject(HX_("Dummy cannot updateMessageStatus",0b,f6,b0,c2));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC4(Dummy_obj,updateMessageStatus,return )
 
 ::Dynamic Dummy_obj::hasMedia(::String hashAlgorithm,::Array< unsigned char > hash){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_91_hasMedia)
-HXDLIN(  91)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(false);
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_116_hasMedia)
+HXDLIN( 116)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(false);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,hasMedia,return )
 
 ::Dynamic Dummy_obj::storeMedia(::String mime,::Array< unsigned char > bd){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_96_storeMedia)
-HXDLIN(  96)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(false);
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_121_storeMedia)
+HXDLIN( 121)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(false);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,storeMedia,return )
 
-void Dummy_obj::removeMedia(::String hashAlgorithm,::Array< unsigned char > hash){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_100_removeMedia)
+::Dynamic Dummy_obj::removeMedia(::String hashAlgorithm,::Array< unsigned char > hash){
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_126_removeMedia)
+HXDLIN( 126)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(false);
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,removeMedia,(void))
+HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,removeMedia,return )
 
 void Dummy_obj::storeCaps( ::borogove::Caps caps){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_104_storeCaps)
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_130_storeCaps)
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Dummy_obj,storeCaps,(void))
 
 ::Dynamic Dummy_obj::getCaps(::String ver){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_108_getCaps)
-HXDLIN( 108)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_134_getCaps)
+HXDLIN( 134)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Dummy_obj,getCaps,return )
 
-void Dummy_obj::storeLogin(::String login,::String clientId,::String displayName,::String token){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_112_storeLogin)
+::Dynamic Dummy_obj::storeLogin(::String login,::String clientId,::String displayName,::String token){
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_139_storeLogin)
+HXDLIN( 139)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(false);
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC4(Dummy_obj,storeLogin,(void))
+HX_DEFINE_DYNAMIC_FUNC4(Dummy_obj,storeLogin,return )
 
 ::Dynamic Dummy_obj::getLogin(::String login){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_116_getLogin)
-HXDLIN( 116)		return ::thenshim::_Promise::Promise_Impl__obj::resolve( ::Dynamic(::hx::Anon_obj::Create(4)
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_144_getLogin)
+HXDLIN( 144)		return ::thenshim::_Promise::Promise_Impl__obj::resolve( ::Dynamic(::hx::Anon_obj::Create(4)
             			->setFixed(0,HX_("fastCount",93,fc,67,a5),0)
             			->setFixed(1,HX_("token",f9,82,2b,14),null())
             			->setFixed(2,HX_("clientId",06,73,8f,15),null())
@@ -268,46 +329,50 @@ HXDLIN( 116)		return ::thenshim::_Promise::Promise_Impl__obj::resolve( ::Dynamic
 
 HX_DEFINE_DYNAMIC_FUNC1(Dummy_obj,getLogin,return )
 
-void Dummy_obj::removeAccount(::String accountId,bool completely){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_120_removeAccount)
+::Dynamic Dummy_obj::removeAccount(::String accountId,bool completely){
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_149_removeAccount)
+HXDLIN( 149)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(false);
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,removeAccount,(void))
+HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,removeAccount,return )
 
 ::Dynamic Dummy_obj::listAccounts(){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_124_listAccounts)
-HXDLIN( 124)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::String >::__new(0));
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_154_listAccounts)
+HXDLIN( 154)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::String >::__new(0));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Dummy_obj,listAccounts,return )
 
-void Dummy_obj::storeStreamManagement(::String accountId,::Array< unsigned char > sm){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_128_storeStreamManagement)
+::Dynamic Dummy_obj::storeStreamManagement(::String accountId,::Array< unsigned char > sm,::String sortId){
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_159_storeStreamManagement)
+HXDLIN( 159)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(false);
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Dummy_obj,storeStreamManagement,(void))
+HX_DEFINE_DYNAMIC_FUNC3(Dummy_obj,storeStreamManagement,return )
 
 ::Dynamic Dummy_obj::getStreamManagement(::String accountId){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_132_getStreamManagement)
-HXDLIN( 132)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_164_getStreamManagement)
+HXDLIN( 164)		return ::thenshim::_Promise::Promise_Impl__obj::resolve( ::Dynamic(::hx::Anon_obj::Create(2)
+            			->setFixed(0,HX_("sm",9a,64,00,00),null())
+            			->setFixed(1,HX_("sortId",d9,7a,37,30),HX_("a ",9f,54,00,00))));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Dummy_obj,getStreamManagement,return )
 
 void Dummy_obj::storeService(::String accountId,::String serviceId,::String name,::String node, ::borogove::Caps caps){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_136_storeService)
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_168_storeService)
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC5(Dummy_obj,storeService,(void))
 
 ::Dynamic Dummy_obj::findServicesWithFeature(::String accountId,::String feature){
-            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_140_findServicesWithFeature)
-HXDLIN( 140)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+            	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_172_findServicesWithFeature)
+HXDLIN( 172)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
             	}
 
 
@@ -334,9 +399,6 @@ Dummy_obj::Dummy_obj()
 ::hx::Val Dummy_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
 {
 	switch(inName.length) {
-	case 6:
-		if (HX_FIELD_EQ(inName,"lastId") ) { return ::hx::Val( lastId_dyn() ); }
-		break;
 	case 7:
 		if (HX_FIELD_EQ(inName,"getCaps") ) { return ::hx::Val( getCaps_dyn() ); }
 		break;
@@ -346,10 +408,12 @@ Dummy_obj::Dummy_obj()
 		if (HX_FIELD_EQ(inName,"getLogin") ) { return ::hx::Val( getLogin_dyn() ); }
 		break;
 	case 9:
+		if (HX_FIELD_EQ(inName,"syncPoint") ) { return ::hx::Val( syncPoint_dyn() ); }
 		if (HX_FIELD_EQ(inName,"storeCaps") ) { return ::hx::Val( storeCaps_dyn() ); }
 		break;
 	case 10:
 		if (HX_FIELD_EQ(inName,"storeChats") ) { return ::hx::Val( storeChats_dyn() ); }
+		if (HX_FIELD_EQ(inName,"getMembers") ) { return ::hx::Val( getMembers_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getMessage") ) { return ::hx::Val( getMessage_dyn() ); }
 		if (HX_FIELD_EQ(inName,"storeMedia") ) { return ::hx::Val( storeMedia_dyn() ); }
 		if (HX_FIELD_EQ(inName,"storeLogin") ) { return ::hx::Val( storeLogin_dyn() ); }
@@ -358,6 +422,7 @@ Dummy_obj::Dummy_obj()
 		if (HX_FIELD_EQ(inName,"removeMedia") ) { return ::hx::Val( removeMedia_dyn() ); }
 		break;
 	case 12:
+		if (HX_FIELD_EQ(inName,"storeMembers") ) { return ::hx::Val( storeMembers_dyn() ); }
 		if (HX_FIELD_EQ(inName,"listAccounts") ) { return ::hx::Val( listAccounts_dyn() ); }
 		if (HX_FIELD_EQ(inName,"storeService") ) { return ::hx::Val( storeService_dyn() ); }
 		break;
@@ -368,13 +433,18 @@ Dummy_obj::Dummy_obj()
 		if (HX_FIELD_EQ(inName,"removeAccount") ) { return ::hx::Val( removeAccount_dyn() ); }
 		break;
 	case 16:
+		if (HX_FIELD_EQ(inName,"getMemberDetails") ) { return ::hx::Val( getMemberDetails_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getMessagesAfter") ) { return ::hx::Val( getMessagesAfter_dyn() ); }
 		break;
 	case 17:
 		if (HX_FIELD_EQ(inName,"getMessagesBefore") ) { return ::hx::Val( getMessagesBefore_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getMessagesAround") ) { return ::hx::Val( getMessagesAround_dyn() ); }
 		break;
+	case 18:
+		if (HX_FIELD_EQ(inName,"storeMemberUpdates") ) { return ::hx::Val( storeMemberUpdates_dyn() ); }
+		break;
 	case 19:
+		if (HX_FIELD_EQ(inName,"clearMemberPresence") ) { return ::hx::Val( clearMemberPresence_dyn() ); }
 		if (HX_FIELD_EQ(inName,"updateMessageStatus") ) { return ::hx::Val( updateMessageStatus_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getStreamManagement") ) { return ::hx::Val( getStreamManagement_dyn() ); }
 		break;
@@ -394,9 +464,14 @@ static ::hx::StaticInfo *Dummy_obj_sStaticStorageInfo = 0;
 #endif
 
 static ::String Dummy_obj_sMemberFields[] = {
-	HX_("lastId",d1,0b,c5,54),
+	HX_("syncPoint",f5,ff,94,98),
 	HX_("storeChats",fa,4a,32,83),
 	HX_("getChats",25,ae,8a,a5),
+	HX_("storeMembers",f8,ee,39,b6),
+	HX_("storeMemberUpdates",6f,0a,28,a1),
+	HX_("clearMemberPresence",22,9d,db,a5),
+	HX_("getMembers",e3,b2,d1,69),
+	HX_("getMemberDetails",12,2b,2f,b3),
 	HX_("storeMessages",cd,f1,bd,e9),
 	HX_("updateMessage",be,9a,7f,65),
 	HX_("getMessage",d1,bb,72,e9),
@@ -451,7 +526,7 @@ void Dummy_obj::__boot()
 {
             	HX_STACKFRAME(&_hx_pos_95dfb57bb5df11b7_24_boot)
 HXDLIN(  24)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(25)
+            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(30)
             				->setFixed(0,HX_("storeChats",fa,4a,32,83), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
             				->setFixed(1,HX_("getChatsUnreadDetails",ee,d4,5a,85), ::Dynamic(::hx::Anon_obj::Create(1)
@@ -460,47 +535,57 @@ HXDLIN(  24)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
             				->setFixed(3,HX_("hasMedia",2a,4f,14,92), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(4,HX_("storeCaps",a2,60,d7,9d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(4,HX_("syncPoint",f5,ff,94,98), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(5,HX_("storeCaps",a2,60,d7,9d), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(6,HX_("storeService",54,de,f6,9d), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(7,HX_("storeMemberUpdates",6f,0a,28,a1), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(8,HX_("getChats",25,ae,8a,a5), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(9,HX_("clearMemberPresence",22,9d,db,a5), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(5,HX_("storeService",54,de,f6,9d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(10,HX_("storeReaction",aa,00,75,ab), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(6,HX_("getChats",25,ae,8a,a5), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(11,HX_("getMemberDetails",12,2b,2f,b3), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(7,HX_("storeReaction",aa,00,75,ab), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(12,HX_("storeMembers",f8,ee,39,b6), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(8,HX_("storeLogin",c8,85,72,b6), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(13,HX_("storeLogin",c8,85,72,b6), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(9,HX_("getLogin",f3,e8,ca,d8), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(14,HX_("getLogin",f3,e8,ca,d8), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(10,HX_("getMessage",d1,bb,72,e9), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(15,HX_("getMessage",d1,bb,72,e9), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(11,HX_("storeMessages",cd,f1,bd,e9), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(16,HX_("storeMessages",cd,f1,bd,e9), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(12,HX_("listAccounts",a4,81,e8,f5), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(17,HX_("listAccounts",a4,81,e8,f5), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(13,HX_("removeMedia",00,e2,ef,03), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(18,HX_("removeMedia",00,e2,ef,03), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(14,HX_("updateMessageStatus",90,98,ad,0f), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(19,HX_("updateMessageStatus",90,98,ad,0f), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(15,HX_("getMessagesBefore",a1,f1,44,11), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(20,HX_("getMessagesBefore",a1,f1,44,11), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(16,HX_("getCaps",d7,cb,3c,14), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(21,HX_("getCaps",d7,cb,3c,14), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(17,HX_("getMessagesAround",6f,95,16,2d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(22,HX_("getMessagesAround",6f,95,16,2d), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(18,HX_("storeMedia",43,b1,3a,43), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(23,HX_("storeMedia",43,b1,3a,43), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(19,HX_("findServicesWithFeature",99,4e,bd,4a), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(24,HX_("findServicesWithFeature",99,4e,bd,4a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(20,HX_("lastId",d1,0b,c5,54), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(25,HX_("getMessagesAfter",3a,43,91,57), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(21,HX_("getMessagesAfter",3a,43,91,57), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(26,HX_("updateMessage",be,9a,7f,65), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(22,HX_("updateMessage",be,9a,7f,65), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(27,HX_("getMembers",e3,b2,d1,69), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(23,HX_("getStreamManagement",d9,03,ec,6c), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(28,HX_("getStreamManagement",d9,03,ec,6c), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(24,HX_("removeAccount",c9,58,14,7a), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(29,HX_("removeAccount",c9,58,14,7a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null()))))));
             	}
 }
diff --git a/Sources/c_borogove/src/borogove/persistence/KeyValueStore.cpp b/Sources/c_borogove/src/borogove/persistence/KeyValueStore.cpp
index e154127..b154352 100644
--- a/Sources/c_borogove/src/borogove/persistence/KeyValueStore.cpp
+++ b/Sources/c_borogove/src/borogove/persistence/KeyValueStore.cpp
@@ -8,7 +8,7 @@
 #include <thenshim/Thenable.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_dc2e6e2f2a1ce966_13_boot,"borogove.persistence.KeyValueStore","boot",0xfabcd84d,"borogove.persistence.KeyValueStore.boot","borogove/persistence/KeyValueStore.hx",13,0xd30803ed)
+HX_LOCAL_STACK_FRAME(_hx_pos_dc2e6e2f2a1ce966_14_boot,"borogove.persistence.KeyValueStore","boot",0xfabcd84d,"borogove.persistence.KeyValueStore.boot","borogove/persistence/KeyValueStore.hx",14,0xd30803ed)
 namespace borogove{
 namespace persistence{
 
@@ -33,8 +33,8 @@ void KeyValueStore_obj::__register()
 void KeyValueStore_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_dc2e6e2f2a1ce966_13_boot)
-HXDLIN(  13)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_dc2e6e2f2a1ce966_14_boot)
+HXDLIN(  14)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(2)
             				->setFixed(0,HX_("get",96,80,4e,00), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
diff --git a/Sources/c_borogove/src/borogove/persistence/KeyValueStore__Companion.cpp b/Sources/c_borogove/src/borogove/persistence/KeyValueStore__Companion.cpp
index a9f468a..37d7b93 100644
--- a/Sources/c_borogove/src/borogove/persistence/KeyValueStore__Companion.cpp
+++ b/Sources/c_borogove/src/borogove/persistence/KeyValueStore__Companion.cpp
@@ -23,9 +23,9 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_27d859e4fa2ade45_337_get__fromC,"borogove.persistence.KeyValueStore__Companion","get__fromC",0xaa1e1bf8,"borogove.persistence.KeyValueStore__Companion.get__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_27d859e4fa2ade45_337_set__fromC,"borogove.persistence.KeyValueStore__Companion","set__fromC",0xad9bba6c,"borogove.persistence.KeyValueStore__Companion.set__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_fd6baaf5e59319b7_13_boot,"borogove.persistence.KeyValueStore__Companion","boot",0x48a173c7,"borogove.persistence.KeyValueStore__Companion.boot","borogove/persistence/KeyValueStore.hx",13,0xd30803ed)
+HX_LOCAL_STACK_FRAME(_hx_pos_27d859e4fa2ade45_365_get__fromC,"borogove.persistence.KeyValueStore__Companion","get__fromC",0xaa1e1bf8,"borogove.persistence.KeyValueStore__Companion.get__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_27d859e4fa2ade45_365_set__fromC,"borogove.persistence.KeyValueStore__Companion","set__fromC",0xad9bba6c,"borogove.persistence.KeyValueStore__Companion.set__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_fd6baaf5e59319b7_14_boot,"borogove.persistence.KeyValueStore__Companion","boot",0x48a173c7,"borogove.persistence.KeyValueStore__Companion.boot","borogove/persistence/KeyValueStore.hx",14,0xd30803ed)
 namespace borogove{
 namespace persistence{
 
@@ -47,66 +47,66 @@ bool KeyValueStore__Companion_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 void KeyValueStore__Companion_obj::get__fromC(::Dynamic self,::String k,::cpp::Function< void  (const char*,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_27d859e4fa2ade45_337_get__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			::borogove::persistence::KeyValueStore_obj::get(self,k);
+            	HX_STACKFRAME(&_hx_pos_27d859e4fa2ade45_365_get__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			::borogove::persistence::KeyValueStore_obj::get(self,k);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (const char* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(::String v){
-            				HX_STACKFRAME(&_hx_pos_27d859e4fa2ade45_337_get__fromC)
-HXDLIN( 337)				::cpp::Function< void  (const char*,void*) > handler1 = handler;
-HXLINE( 312)				const char* cStrPtr = v.utf8_str();
-HXDLIN( 312)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 312)				{
-HXLINE( 312)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 312)					if (::hx::IsNull( store )) {
-HXLINE( 312)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            				HX_STACKFRAME(&_hx_pos_27d859e4fa2ade45_365_get__fromC)
+HXDLIN( 365)				::cpp::Function< void  (const char*,void*) > handler1 = handler;
+HXLINE( 332)				const char* cStrPtr = v.utf8_str();
+HXDLIN( 332)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
+HXDLIN( 332)				{
+HXLINE( 332)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 332)					if (::hx::IsNull( store )) {
+HXLINE( 332)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             							->setFixed(1,HX_("value",71,7f,b8,31),v));
-HXDLIN( 312)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 332)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             					}
             					else {
-HXLINE( 312)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 332)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             					}
             				}
-HXLINE( 337)				handler1(cStrPtr,handler__context);
+HXLINE( 365)				handler1(cStrPtr,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (const char* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_27d859e4fa2ade45_337_get__fromC)
-HXDLIN( 337)				handler(null(),handler__context);
+            				HX_STACKFRAME(&_hx_pos_27d859e4fa2ade45_365_get__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::persistence::KeyValueStore_obj::get(self,k), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::persistence::KeyValueStore_obj::get(self,k), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
 void KeyValueStore__Companion_obj::set__fromC(::Dynamic self,::String k,::String v,::cpp::Function< void  (bool,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_27d859e4fa2ade45_337_set__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			::borogove::persistence::KeyValueStore_obj::set(self,k,v);
+            	HX_STACKFRAME(&_hx_pos_27d859e4fa2ade45_365_set__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			::borogove::persistence::KeyValueStore_obj::set(self,k,v);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(bool v){
-            				HX_STACKFRAME(&_hx_pos_27d859e4fa2ade45_337_set__fromC)
-HXDLIN( 337)				handler(v,handler__context);
+            				HX_STACKFRAME(&_hx_pos_27d859e4fa2ade45_365_set__fromC)
+HXDLIN( 365)				handler(v,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_27d859e4fa2ade45_337_set__fromC)
-HXDLIN( 337)				handler(false,handler__context);
+            				HX_STACKFRAME(&_hx_pos_27d859e4fa2ade45_365_set__fromC)
+HXDLIN( 365)				handler(false,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::persistence::KeyValueStore_obj::set(self,k,v), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::persistence::KeyValueStore_obj::set(self,k,v), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
@@ -149,8 +149,8 @@ void KeyValueStore__Companion_obj::__register()
 void KeyValueStore__Companion_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_fd6baaf5e59319b7_13_boot)
-HXDLIN(  13)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_fd6baaf5e59319b7_14_boot)
+HXDLIN(  14)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("obj",f7,8f,54,00), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("HaxeCBridge.name",13,6a,03,0e),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("borogove_persistence_KeyValueStore",11,f7,15,a2)))))
             			->setFixed(1,HX_("statics",05,3c,65,36), ::Dynamic(::hx::Anon_obj::Create(2)
diff --git a/Sources/c_borogove/src/borogove/persistence/MediaStoreFS.cpp b/Sources/c_borogove/src/borogove/persistence/MediaStoreFS.cpp
index fd8200c..ab70bff 100644
--- a/Sources/c_borogove/src/borogove/persistence/MediaStoreFS.cpp
+++ b/Sources/c_borogove/src/borogove/persistence/MediaStoreFS.cpp
@@ -41,26 +41,25 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_62805e222ed8ef0e_17_new,"borogove.persistence.MediaStoreFS","new",0x45ebbe58,"borogove.persistence.MediaStoreFS.new","borogove/persistence/MediaStoreFS.hx",17,0xb4eb58d6)
-HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_32_setKV,"borogove.persistence.MediaStoreFS","setKV",0x4818e5c5,"borogove.persistence.MediaStoreFS.setKV","borogove/persistence/MediaStoreFS.hx",32,0xb4eb58d6)
-HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_41_getMediaPath,"borogove.persistence.MediaStoreFS","getMediaPath",0xc292883b,"borogove.persistence.MediaStoreFS.getMediaPath","borogove/persistence/MediaStoreFS.hx",41,0xb4eb58d6)
-HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_51_getMediaPath,"borogove.persistence.MediaStoreFS","getMediaPath",0xc292883b,"borogove.persistence.MediaStoreFS.getMediaPath","borogove/persistence/MediaStoreFS.hx",51,0xb4eb58d6)
-HX_LOCAL_STACK_FRAME(_hx_pos_959a077022e6b8e5_337_getMediaPath__fromC,"borogove.persistence.MediaStoreFS","getMediaPath__fromC",0xffdb359e,"borogove.persistence.MediaStoreFS.getMediaPath__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_65_hasMedia,"borogove.persistence.MediaStoreFS","hasMedia",0x6622be32,"borogove.persistence.MediaStoreFS.hasMedia","borogove/persistence/MediaStoreFS.hx",65,0xb4eb58d6)
+HX_DEFINE_STACK_FRAME(_hx_pos_62805e222ed8ef0e_18_new,"borogove.persistence.MediaStoreFS","new",0x45ebbe58,"borogove.persistence.MediaStoreFS.new","borogove/persistence/MediaStoreFS.hx",18,0xb4eb58d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_33_setKV,"borogove.persistence.MediaStoreFS","setKV",0x4818e5c5,"borogove.persistence.MediaStoreFS.setKV","borogove/persistence/MediaStoreFS.hx",33,0xb4eb58d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_42_getMediaPath,"borogove.persistence.MediaStoreFS","getMediaPath",0xc292883b,"borogove.persistence.MediaStoreFS.getMediaPath","borogove/persistence/MediaStoreFS.hx",42,0xb4eb58d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_52_getMediaPath,"borogove.persistence.MediaStoreFS","getMediaPath",0xc292883b,"borogove.persistence.MediaStoreFS.getMediaPath","borogove/persistence/MediaStoreFS.hx",52,0xb4eb58d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_959a077022e6b8e5_365_getMediaPath__fromC,"borogove.persistence.MediaStoreFS","getMediaPath__fromC",0xffdb359e,"borogove.persistence.MediaStoreFS.getMediaPath__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_66_hasMedia,"borogove.persistence.MediaStoreFS","hasMedia",0x6622be32,"borogove.persistence.MediaStoreFS.hasMedia","borogove/persistence/MediaStoreFS.hx",66,0xb4eb58d6)
 HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_72_removeMedia,"borogove.persistence.MediaStoreFS","removeMedia",0x109a87f8,"borogove.persistence.MediaStoreFS.removeMedia","borogove/persistence/MediaStoreFS.hx",72,0xb4eb58d6)
-HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_71_removeMedia,"borogove.persistence.MediaStoreFS","removeMedia",0x109a87f8,"borogove.persistence.MediaStoreFS.removeMedia","borogove/persistence/MediaStoreFS.hx",71,0xb4eb58d6)
-HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_85_storeMedia,"borogove.persistence.MediaStoreFS","storeMedia",0x0b08f24b,"borogove.persistence.MediaStoreFS.storeMedia","borogove/persistence/MediaStoreFS.hx",85,0xb4eb58d6)
-HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_77_storeMedia,"borogove.persistence.MediaStoreFS","storeMedia",0x0b08f24b,"borogove.persistence.MediaStoreFS.storeMedia","borogove/persistence/MediaStoreFS.hx",77,0xb4eb58d6)
-HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_88_set,"borogove.persistence.MediaStoreFS","set",0x45ef899a,"borogove.persistence.MediaStoreFS.set","borogove/persistence/MediaStoreFS.hx",88,0xb4eb58d6)
-HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_94_get,"borogove.persistence.MediaStoreFS","get",0x45e66e8e,"borogove.persistence.MediaStoreFS.get","borogove/persistence/MediaStoreFS.hx",94,0xb4eb58d6)
-HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_17_boot,"borogove.persistence.MediaStoreFS","boot",0xe073cf3a,"borogove.persistence.MediaStoreFS.boot","borogove/persistence/MediaStoreFS.hx",17,0xb4eb58d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_87_storeMedia,"borogove.persistence.MediaStoreFS","storeMedia",0x0b08f24b,"borogove.persistence.MediaStoreFS.storeMedia","borogove/persistence/MediaStoreFS.hx",87,0xb4eb58d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_79_storeMedia,"borogove.persistence.MediaStoreFS","storeMedia",0x0b08f24b,"borogove.persistence.MediaStoreFS.storeMedia","borogove/persistence/MediaStoreFS.hx",79,0xb4eb58d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_90_set,"borogove.persistence.MediaStoreFS","set",0x45ef899a,"borogove.persistence.MediaStoreFS.set","borogove/persistence/MediaStoreFS.hx",90,0xb4eb58d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_96_get,"borogove.persistence.MediaStoreFS","get",0x45e66e8e,"borogove.persistence.MediaStoreFS.get","borogove/persistence/MediaStoreFS.hx",96,0xb4eb58d6)
+HX_LOCAL_STACK_FRAME(_hx_pos_62805e222ed8ef0e_18_boot,"borogove.persistence.MediaStoreFS","boot",0xe073cf3a,"borogove.persistence.MediaStoreFS.boot","borogove/persistence/MediaStoreFS.hx",18,0xb4eb58d6)
 namespace borogove{
 namespace persistence{
 
 void MediaStoreFS_obj::__construct(::String path){
-            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_17_new)
-HXLINE(  19)		this->kv = null();
-HXLINE(  27)		this->blobpath = path;
+            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_18_new)
+HXLINE(  20)		this->kv = null();
+HXLINE(  28)		this->blobpath = path;
             	}
 
 Dynamic MediaStoreFS_obj::__CreateEmpty() { return new MediaStoreFS_obj; }
@@ -80,7 +79,7 @@ bool MediaStoreFS_obj::_hx_isInstanceOf(int inClassId) {
 
 static ::borogove::persistence::MediaStore_obj _hx_borogove_persistence_MediaStoreFS__hx_borogove_persistence_MediaStore= {
 	( ::Dynamic (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::MediaStoreFS_obj::hasMedia,
-	( void (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::MediaStoreFS_obj::removeMedia,
+	( ::Dynamic (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::MediaStoreFS_obj::removeMedia,
 	( ::Dynamic (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::MediaStoreFS_obj::storeMedia,
 	( void (::hx::Object::*)(::Dynamic))&::borogove::persistence::MediaStoreFS_obj::setKV,
 };
@@ -97,93 +96,93 @@ void *MediaStoreFS_obj::_hx_getInterface(int inHash) {
 }
 
 void MediaStoreFS_obj::setKV(::Dynamic kv){
-            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_32_setKV)
-HXDLIN(  32)		this->kv = kv;
+            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_33_setKV)
+HXDLIN(  33)		this->kv = kv;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(MediaStoreFS_obj,setKV,(void))
 
 ::Dynamic MediaStoreFS_obj::getMediaPath(::String uri){
-            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_41_getMediaPath)
-HXDLIN(  41)		 ::borogove::persistence::MediaStoreFS _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(  42)		 ::borogove::Hash hash = ::borogove::Hash_obj::fromUri(uri);
-HXLINE(  43)		if ((hash->algorithm == HX_("sha-256",32,dd,04,3b))) {
-HXLINE(  44)			::String path = (this->blobpath + HX_("/f",57,29,00,00));
-HXDLIN(  44)			::String path1 = (path + hash->toHex());
-HXLINE(  45)			if (::sys::FileSystem_obj::exists(path1)) {
-HXLINE(  46)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(::sys::FileSystem_obj::absolutePath(path1));
+            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_42_getMediaPath)
+HXDLIN(  42)		 ::borogove::persistence::MediaStoreFS _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(  43)		 ::borogove::Hash hash = ::borogove::Hash_obj::fromUri(uri);
+HXLINE(  44)		if ((hash->algorithm == HX_("sha-256",32,dd,04,3b))) {
+HXLINE(  45)			::String path = (this->blobpath + HX_("/f",57,29,00,00));
+HXDLIN(  45)			::String path1 = (path + hash->toHex());
+HXLINE(  46)			if (::sys::FileSystem_obj::exists(path1)) {
+HXLINE(  47)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(::sys::FileSystem_obj::absolutePath(path1));
             			}
             			else {
-HXLINE(  48)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+HXLINE(  49)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             			}
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::MediaStoreFS,_gthis) HXARGC(1)
             			::Dynamic _hx_run(::String sha256uri){
-            				HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_51_getMediaPath)
-HXLINE(  52)				 ::borogove::Hash sha256;
-HXDLIN(  52)				if (::hx::IsNull( sha256uri )) {
-HXLINE(  52)					sha256 = null();
+            				HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_52_getMediaPath)
+HXLINE(  53)				 ::borogove::Hash sha256;
+HXDLIN(  53)				if (::hx::IsNull( sha256uri )) {
+HXLINE(  53)					sha256 = null();
             				}
             				else {
-HXLINE(  52)					sha256 = ::borogove::Hash_obj::fromUri(sha256uri);
+HXLINE(  53)					sha256 = ::borogove::Hash_obj::fromUri(sha256uri);
             				}
-HXLINE(  53)				if (::hx::IsNull( sha256 )) {
-HXLINE(  54)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+HXLINE(  54)				if (::hx::IsNull( sha256 )) {
+HXLINE(  55)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             				}
             				else {
-HXLINE(  56)					 ::borogove::persistence::MediaStoreFS _gthis1 = _gthis;
-HXDLIN(  56)					return _gthis1->getMediaPath(sha256->toUri());
+HXLINE(  57)					 ::borogove::persistence::MediaStoreFS _gthis1 = _gthis;
+HXDLIN(  57)					return _gthis1->getMediaPath(sha256->toUri());
             				}
-HXLINE(  53)				return null();
+HXLINE(  54)				return null();
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-HXLINE(  51)			return ::thenshim::_Promise::Promise_Impl__obj::then(this->get(hash->serializeUri()), ::Dynamic(new _hx_Closure_0(_gthis)),null());
+HXLINE(  52)			return ::thenshim::_Promise::Promise_Impl__obj::then(this->get(hash->serializeUri()), ::Dynamic(new _hx_Closure_0(_gthis)),null());
             		}
-HXLINE(  43)		return null();
+HXLINE(  44)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(MediaStoreFS_obj,getMediaPath,return )
 
 void MediaStoreFS_obj::getMediaPath__fromC(::String uri,::cpp::Function< void  (const char*,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_959a077022e6b8e5_337_getMediaPath__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			this->getMediaPath(uri);
+            	HX_STACKFRAME(&_hx_pos_959a077022e6b8e5_365_getMediaPath__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->getMediaPath(uri);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (const char* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(::String v){
-            				HX_STACKFRAME(&_hx_pos_959a077022e6b8e5_337_getMediaPath__fromC)
-HXDLIN( 337)				::cpp::Function< void  (const char*,void*) > handler1 = handler;
-HXLINE( 312)				const char* cStrPtr = v.utf8_str();
-HXDLIN( 312)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 312)				{
-HXLINE( 312)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 312)					if (::hx::IsNull( store )) {
-HXLINE( 312)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            				HX_STACKFRAME(&_hx_pos_959a077022e6b8e5_365_getMediaPath__fromC)
+HXDLIN( 365)				::cpp::Function< void  (const char*,void*) > handler1 = handler;
+HXLINE( 332)				const char* cStrPtr = v.utf8_str();
+HXDLIN( 332)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
+HXDLIN( 332)				{
+HXLINE( 332)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 332)					if (::hx::IsNull( store )) {
+HXLINE( 332)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             							->setFixed(1,HX_("value",71,7f,b8,31),v));
-HXDLIN( 312)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 332)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             					}
             					else {
-HXLINE( 312)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 332)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             					}
             				}
-HXLINE( 337)				handler1(cStrPtr,handler__context);
+HXLINE( 365)				handler1(cStrPtr,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (const char* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_959a077022e6b8e5_337_getMediaPath__fromC)
-HXDLIN( 337)				handler(null(),handler__context);
+            				HX_STACKFRAME(&_hx_pos_959a077022e6b8e5_365_getMediaPath__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->getMediaPath(uri), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->getMediaPath(uri), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
@@ -191,74 +190,75 @@ HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->getMediaPath(
 ::Dynamic MediaStoreFS_obj::hasMedia(::String hashAlgorithm,::Array< unsigned char > hash){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		bool _hx_run(::String path){
-            			HX_GC_STACKFRAME(&_hx_pos_62805e222ed8ef0e_65_hasMedia)
-HXDLIN(  65)			return ::hx::IsNotNull( path );
+            			HX_GC_STACKFRAME(&_hx_pos_62805e222ed8ef0e_66_hasMedia)
+HXDLIN(  66)			return ::hx::IsNotNull( path );
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_62805e222ed8ef0e_65_hasMedia)
-HXDLIN(  65)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->getMediaPath( ::borogove::Hash_obj::__alloc( HX_CTX ,hashAlgorithm,hash)->toUri()), ::Dynamic(new _hx_Closure_0()),null());
+            	HX_GC_STACKFRAME(&_hx_pos_62805e222ed8ef0e_66_hasMedia)
+HXDLIN(  66)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->getMediaPath( ::borogove::Hash_obj::__alloc( HX_CTX ,hashAlgorithm,hash)->toUri()), ::Dynamic(new _hx_Closure_0()),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(MediaStoreFS_obj,hasMedia,return )
 
-void MediaStoreFS_obj::removeMedia(::String hashAlgorithm,::Array< unsigned char > hash){
+::Dynamic MediaStoreFS_obj::removeMedia(::String hashAlgorithm,::Array< unsigned char > hash){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
-            		void _hx_run(::String path){
+            		bool _hx_run(::String path){
             			HX_GC_STACKFRAME(&_hx_pos_62805e222ed8ef0e_72_removeMedia)
-HXLINE(  72)			if (::hx::IsNotNull( path )) {
-HXLINE(  72)				::sys::FileSystem_obj::deleteFile(path);
+HXLINE(  73)			if (::hx::IsNotNull( path )) {
+HXLINE(  73)				::sys::FileSystem_obj::deleteFile(path);
             			}
+HXLINE(  74)			return true;
             		}
-            		HX_END_LOCAL_FUNC1((void))
+            		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_62805e222ed8ef0e_71_removeMedia)
-HXDLIN(  71)		::thenshim::_Promise::Promise_Impl__obj::then(this->getMediaPath( ::borogove::Hash_obj::__alloc( HX_CTX ,hashAlgorithm,hash)->toUri()), ::Dynamic(new _hx_Closure_0()),null());
+            	HX_GC_STACKFRAME(&_hx_pos_62805e222ed8ef0e_72_removeMedia)
+HXDLIN(  72)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->getMediaPath( ::borogove::Hash_obj::__alloc( HX_CTX ,hashAlgorithm,hash)->toUri()), ::Dynamic(new _hx_Closure_0()),null());
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(MediaStoreFS_obj,removeMedia,(void))
+HX_DEFINE_DYNAMIC_FUNC2(MediaStoreFS_obj,removeMedia,return )
 
 ::Dynamic MediaStoreFS_obj::storeMedia(::String mime,::Array< unsigned char > bd){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		bool _hx_run(::Array< bool > _){
-            			HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_85_storeMedia)
-HXLINE(  85)			return true;
+            			HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_87_storeMedia)
+HXLINE(  87)			return true;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_77_storeMedia)
-HXLINE(  78)		 ::haxe::io::Bytes bytes = ::haxe::io::Bytes_obj::ofData(bd);
-HXLINE(  79)		 ::borogove::Hash sha1 = ::borogove::Hash_obj::sha1(bytes);
-HXLINE(  80)		 ::borogove::Hash sha256 = ::borogove::Hash_obj::sha256(bytes);
-HXLINE(  81)		::String _hx_tmp = (this->blobpath + HX_("/f",57,29,00,00));
-HXDLIN(  81)		::sys::io::File_obj::saveBytes((_hx_tmp + sha256->toHex()),bytes);
-HXLINE(  83)		::String _hx_tmp1 = sha1->serializeUri();
-HXDLIN(  83)		::Dynamic _hx_tmp2 = this->set(_hx_tmp1,sha256->serializeUri());
-HXLINE(  82)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(::Array_obj< ::Dynamic>::__new(2)->init(0,_hx_tmp2)->init(1,this->set((sha256->serializeUri() + HX_("#contentType",50,39,a7,27)),mime))), ::Dynamic(new _hx_Closure_0()),null());
+            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_79_storeMedia)
+HXLINE(  80)		 ::haxe::io::Bytes bytes = ::haxe::io::Bytes_obj::ofData(bd);
+HXLINE(  81)		 ::borogove::Hash sha1 = ::borogove::Hash_obj::sha1(bytes);
+HXLINE(  82)		 ::borogove::Hash sha256 = ::borogove::Hash_obj::sha256(bytes);
+HXLINE(  83)		::String _hx_tmp = (this->blobpath + HX_("/f",57,29,00,00));
+HXDLIN(  83)		::sys::io::File_obj::saveBytes((_hx_tmp + sha256->toHex()),bytes);
+HXLINE(  85)		::String _hx_tmp1 = sha1->serializeUri();
+HXDLIN(  85)		::Dynamic _hx_tmp2 = this->set(_hx_tmp1,sha256->serializeUri());
+HXLINE(  84)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(::Array_obj< ::Dynamic>::__new(2)->init(0,_hx_tmp2)->init(1,this->set((sha256->serializeUri() + HX_("#contentType",50,39,a7,27)),mime))), ::Dynamic(new _hx_Closure_0()),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(MediaStoreFS_obj,storeMedia,return )
 
 ::Dynamic MediaStoreFS_obj::set(::String k,::String v){
-            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_88_set)
-HXLINE(  89)		if (::hx::IsNull( this->kv )) {
-HXLINE(  89)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_90_set)
+HXLINE(  91)		if (::hx::IsNull( this->kv )) {
+HXLINE(  91)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             		}
-HXLINE(  91)		return ::borogove::persistence::KeyValueStore_obj::set(this->kv,k,v);
+HXLINE(  93)		return ::borogove::persistence::KeyValueStore_obj::set(this->kv,k,v);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(MediaStoreFS_obj,set,return )
 
 ::Dynamic MediaStoreFS_obj::get(::String k){
-            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_94_get)
-HXLINE(  95)		if (::hx::IsNull( this->kv )) {
-HXLINE(  95)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_96_get)
+HXLINE(  97)		if (::hx::IsNull( this->kv )) {
+HXLINE(  97)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             		}
-HXLINE(  97)		return ::borogove::persistence::KeyValueStore_obj::get(this->kv,k);
+HXLINE(  99)		return ::borogove::persistence::KeyValueStore_obj::get(this->kv,k);
             	}
 
 
@@ -393,8 +393,8 @@ void MediaStoreFS_obj::__register()
 void MediaStoreFS_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_17_boot)
-HXDLIN(  17)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_62805e222ed8ef0e_18_boot)
+HXDLIN(  18)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(5)
             				->setFixed(0,HX_("hasMedia",2a,4f,14,92), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
diff --git a/Sources/c_borogove/src/borogove/persistence/MediaStore__Companion.cpp b/Sources/c_borogove/src/borogove/persistence/MediaStore__Companion.cpp
index de552b8..605a300 100644
--- a/Sources/c_borogove/src/borogove/persistence/MediaStore__Companion.cpp
+++ b/Sources/c_borogove/src/borogove/persistence/MediaStore__Companion.cpp
@@ -14,9 +14,9 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_LOCAL_STACK_FRAME(_hx_pos_c575748a802f6ed4_337_hasMedia__fromC,"borogove.persistence.MediaStore__Companion","hasMedia__fromC",0x97101834,"borogove.persistence.MediaStore__Companion.hasMedia__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_c575748a802f6ed4_339_removeMedia__fromC,"borogove.persistence.MediaStore__Companion","removeMedia__fromC",0x96ebc5f4,"borogove.persistence.MediaStore__Companion.removeMedia__fromC","HaxeCBridge.hx",339,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_c575748a802f6ed4_337_storeMedia__fromC,"borogove.persistence.MediaStore__Companion","storeMedia__fromC",0xe3958e7b,"borogove.persistence.MediaStore__Companion.storeMedia__fromC","HaxeCBridge.hx",337,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_c575748a802f6ed4_365_hasMedia__fromC,"borogove.persistence.MediaStore__Companion","hasMedia__fromC",0x97101834,"borogove.persistence.MediaStore__Companion.hasMedia__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_c575748a802f6ed4_365_removeMedia__fromC,"borogove.persistence.MediaStore__Companion","removeMedia__fromC",0x96ebc5f4,"borogove.persistence.MediaStore__Companion.removeMedia__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_c575748a802f6ed4_365_storeMedia__fromC,"borogove.persistence.MediaStore__Companion","storeMedia__fromC",0xe3958e7b,"borogove.persistence.MediaStore__Companion.storeMedia__fromC","HaxeCBridge.hx",365,0xa18550d8)
 HX_LOCAL_STACK_FRAME(_hx_pos_b0d3af2db2f3f894_14_boot,"borogove.persistence.MediaStore__Companion","boot",0x45562a6d,"borogove.persistence.MediaStore__Companion.boot","borogove/persistence/MediaStore.hx",14,0xf16bbcc3)
 namespace borogove{
 namespace persistence{
@@ -39,114 +39,142 @@ bool MediaStore__Companion_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 void MediaStore__Companion_obj::hasMedia__fromC(::Dynamic self,::String hashAlgorithm,::cpp::Pointer< unsigned char > hash,size_t hash__len,::cpp::Function< void  (bool,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_337_hasMedia__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXLINE( 282)			::Array< unsigned char > _hx_tmp;
-HXDLIN( 282)			if (::hx::IsNull( hash )) {
-HXLINE( 282)				_hx_tmp = null();
+            	HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_365_hasMedia__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXLINE( 302)			::Array< unsigned char > _hx_tmp;
+HXDLIN( 302)			if (::hx::IsNull( hash )) {
+HXLINE( 302)				_hx_tmp = ::Array_obj< unsigned char >::__new(0);
             			}
             			else {
-HXLINE( 282)				::cpp::Pointer< unsigned char > _this = hash->reinterpret();
-HXDLIN( 282)				::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
-HXDLIN( 282)				::cpp::Pointer< unsigned char > tmp = _this;
-HXDLIN( 282)				result->setUnmanagedData(tmp,( (int)(hash__len) ));
-HXDLIN( 282)				_hx_tmp = result->copy();
+HXLINE( 302)				::cpp::Pointer< unsigned char > _this = hash->reinterpret();
+HXDLIN( 302)				::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)				::cpp::Pointer< unsigned char > tmp = _this;
+HXDLIN( 302)				result->setUnmanagedData(tmp,( (int)(hash__len) ));
+HXDLIN( 302)				_hx_tmp = result->copy();
             			}
-HXLINE( 337)			::borogove::persistence::MediaStore_obj::hasMedia(self,hashAlgorithm,_hx_tmp);
+HXLINE( 365)			::borogove::persistence::MediaStore_obj::hasMedia(self,hashAlgorithm,_hx_tmp);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(bool v){
-            				HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_337_hasMedia__fromC)
-HXDLIN( 337)				handler(v,handler__context);
+            				HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_365_hasMedia__fromC)
+HXDLIN( 365)				handler(v,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_337_hasMedia__fromC)
-HXDLIN( 337)				handler(false,handler__context);
+            				HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_365_hasMedia__fromC)
+HXDLIN( 365)				handler(false,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 282)			::Array< unsigned char > _hx_tmp1;
-HXDLIN( 282)			if (::hx::IsNull( hash )) {
-HXLINE( 282)				_hx_tmp1 = null();
+HXLINE( 302)			::Array< unsigned char > _hx_tmp1;
+HXDLIN( 302)			if (::hx::IsNull( hash )) {
+HXLINE( 302)				_hx_tmp1 = ::Array_obj< unsigned char >::__new(0);
             			}
             			else {
-HXLINE( 282)				::cpp::Pointer< unsigned char > _this1 = hash->reinterpret();
-HXDLIN( 282)				::Array< unsigned char > result1 = ::Array_obj< unsigned char >::__new();
-HXDLIN( 282)				::cpp::Pointer< unsigned char > tmp1 = _this1;
-HXDLIN( 282)				result1->setUnmanagedData(tmp1,( (int)(hash__len) ));
-HXDLIN( 282)				_hx_tmp1 = result1->copy();
+HXLINE( 302)				::cpp::Pointer< unsigned char > _this1 = hash->reinterpret();
+HXDLIN( 302)				::Array< unsigned char > result1 = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)				::cpp::Pointer< unsigned char > tmp1 = _this1;
+HXDLIN( 302)				result1->setUnmanagedData(tmp1,( (int)(hash__len) ));
+HXDLIN( 302)				_hx_tmp1 = result1->copy();
             			}
-HXLINE( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::persistence::MediaStore_obj::hasMedia(self,hashAlgorithm,_hx_tmp1), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXLINE( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::persistence::MediaStore_obj::hasMedia(self,hashAlgorithm,_hx_tmp1), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
-void MediaStore__Companion_obj::removeMedia__fromC(::Dynamic self,::String hashAlgorithm,::cpp::Pointer< unsigned char > hash,size_t hash__len){
-            	HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_339_removeMedia__fromC)
-HXLINE( 282)		::Array< unsigned char > _hx_tmp;
-HXDLIN( 282)		if (::hx::IsNull( hash )) {
-HXLINE( 282)			_hx_tmp = null();
+void MediaStore__Companion_obj::removeMedia__fromC(::Dynamic self,::String hashAlgorithm,::cpp::Pointer< unsigned char > hash,size_t hash__len,::cpp::Function< void  (bool,void*) > handler,void* handler__context){
+            	HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_365_removeMedia__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXLINE( 302)			::Array< unsigned char > _hx_tmp;
+HXDLIN( 302)			if (::hx::IsNull( hash )) {
+HXLINE( 302)				_hx_tmp = ::Array_obj< unsigned char >::__new(0);
+            			}
+            			else {
+HXLINE( 302)				::cpp::Pointer< unsigned char > _this = hash->reinterpret();
+HXDLIN( 302)				::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)				::cpp::Pointer< unsigned char > tmp = _this;
+HXDLIN( 302)				result->setUnmanagedData(tmp,( (int)(hash__len) ));
+HXDLIN( 302)				_hx_tmp = result->copy();
+            			}
+HXLINE( 365)			::borogove::persistence::MediaStore_obj::removeMedia(self,hashAlgorithm,_hx_tmp);
             		}
             		else {
-HXLINE( 282)			::cpp::Pointer< unsigned char > _this = hash->reinterpret();
-HXDLIN( 282)			::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
-HXDLIN( 282)			::cpp::Pointer< unsigned char > tmp = _this;
-HXDLIN( 282)			result->setUnmanagedData(tmp,( (int)(hash__len) ));
-HXDLIN( 282)			_hx_tmp = result->copy();
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run(bool v){
+            				HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_365_removeMedia__fromC)
+HXDLIN( 365)				handler(v,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
+            			void _hx_run( ::Dynamic e){
+            				HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_365_removeMedia__fromC)
+HXDLIN( 365)				handler(false,handler__context);
+            			}
+            			HX_END_LOCAL_FUNC1((void))
+
+HXLINE( 302)			::Array< unsigned char > _hx_tmp1;
+HXDLIN( 302)			if (::hx::IsNull( hash )) {
+HXLINE( 302)				_hx_tmp1 = ::Array_obj< unsigned char >::__new(0);
+            			}
+            			else {
+HXLINE( 302)				::cpp::Pointer< unsigned char > _this1 = hash->reinterpret();
+HXDLIN( 302)				::Array< unsigned char > result1 = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)				::cpp::Pointer< unsigned char > tmp1 = _this1;
+HXDLIN( 302)				result1->setUnmanagedData(tmp1,( (int)(hash__len) ));
+HXDLIN( 302)				_hx_tmp1 = result1->copy();
+            			}
+HXLINE( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::persistence::MediaStore_obj::removeMedia(self,hashAlgorithm,_hx_tmp1), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
-HXLINE( 339)		::borogove::persistence::MediaStore_obj::removeMedia(self,hashAlgorithm,_hx_tmp);
             	}
 
 
-STATIC_HX_DEFINE_DYNAMIC_FUNC4(MediaStore__Companion_obj,removeMedia__fromC,(void))
-
 void MediaStore__Companion_obj::storeMedia__fromC(::Dynamic self,::String mime,::cpp::Pointer< unsigned char > bytes,size_t bytes__len,::cpp::Function< void  (bool,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_337_storeMedia__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXLINE( 282)			::Array< unsigned char > _hx_tmp;
-HXDLIN( 282)			if (::hx::IsNull( bytes )) {
-HXLINE( 282)				_hx_tmp = null();
+            	HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_365_storeMedia__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXLINE( 302)			::Array< unsigned char > _hx_tmp;
+HXDLIN( 302)			if (::hx::IsNull( bytes )) {
+HXLINE( 302)				_hx_tmp = ::Array_obj< unsigned char >::__new(0);
             			}
             			else {
-HXLINE( 282)				::cpp::Pointer< unsigned char > _this = bytes->reinterpret();
-HXDLIN( 282)				::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
-HXDLIN( 282)				::cpp::Pointer< unsigned char > tmp = _this;
-HXDLIN( 282)				result->setUnmanagedData(tmp,( (int)(bytes__len) ));
-HXDLIN( 282)				_hx_tmp = result->copy();
+HXLINE( 302)				::cpp::Pointer< unsigned char > _this = bytes->reinterpret();
+HXDLIN( 302)				::Array< unsigned char > result = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)				::cpp::Pointer< unsigned char > tmp = _this;
+HXDLIN( 302)				result->setUnmanagedData(tmp,( (int)(bytes__len) ));
+HXDLIN( 302)				_hx_tmp = result->copy();
             			}
-HXLINE( 337)			::borogove::persistence::MediaStore_obj::storeMedia(self,mime,_hx_tmp);
+HXLINE( 365)			::borogove::persistence::MediaStore_obj::storeMedia(self,mime,_hx_tmp);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run(bool v){
-            				HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_337_storeMedia__fromC)
-HXDLIN( 337)				handler(v,handler__context);
+            				HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_365_storeMedia__fromC)
+HXDLIN( 365)				handler(v,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (bool HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_337_storeMedia__fromC)
-HXDLIN( 337)				handler(false,handler__context);
+            				HX_STACKFRAME(&_hx_pos_c575748a802f6ed4_365_storeMedia__fromC)
+HXDLIN( 365)				handler(false,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXLINE( 282)			::Array< unsigned char > _hx_tmp1;
-HXDLIN( 282)			if (::hx::IsNull( bytes )) {
-HXLINE( 282)				_hx_tmp1 = null();
+HXLINE( 302)			::Array< unsigned char > _hx_tmp1;
+HXDLIN( 302)			if (::hx::IsNull( bytes )) {
+HXLINE( 302)				_hx_tmp1 = ::Array_obj< unsigned char >::__new(0);
             			}
             			else {
-HXLINE( 282)				::cpp::Pointer< unsigned char > _this1 = bytes->reinterpret();
-HXDLIN( 282)				::Array< unsigned char > result1 = ::Array_obj< unsigned char >::__new();
-HXDLIN( 282)				::cpp::Pointer< unsigned char > tmp1 = _this1;
-HXDLIN( 282)				result1->setUnmanagedData(tmp1,( (int)(bytes__len) ));
-HXDLIN( 282)				_hx_tmp1 = result1->copy();
+HXLINE( 302)				::cpp::Pointer< unsigned char > _this1 = bytes->reinterpret();
+HXDLIN( 302)				::Array< unsigned char > result1 = ::Array_obj< unsigned char >::__new();
+HXDLIN( 302)				::cpp::Pointer< unsigned char > tmp1 = _this1;
+HXDLIN( 302)				result1->setUnmanagedData(tmp1,( (int)(bytes__len) ));
+HXDLIN( 302)				_hx_tmp1 = result1->copy();
             			}
-HXLINE( 337)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::persistence::MediaStore_obj::storeMedia(self,mime,_hx_tmp1), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXLINE( 365)			::thenshim::_Promise::Promise_Impl__obj::then(::borogove::persistence::MediaStore_obj::storeMedia(self,mime,_hx_tmp1), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
@@ -156,15 +184,6 @@ MediaStore__Companion_obj::MediaStore__Companion_obj()
 {
 }
 
-bool MediaStore__Companion_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
-{
-	switch(inName.length) {
-	case 18:
-		if (HX_FIELD_EQ(inName,"removeMedia__fromC") ) { outValue = removeMedia__fromC_dyn(); return true; }
-	}
-	return false;
-}
-
 #ifdef HXCPP_SCRIPTABLE
 static ::hx::StorageInfo *MediaStore__Companion_obj_sMemberStorageInfo = 0;
 static ::hx::StaticInfo *MediaStore__Companion_obj_sStaticStorageInfo = 0;
@@ -172,11 +191,6 @@ static ::hx::StaticInfo *MediaStore__Companion_obj_sStaticStorageInfo = 0;
 
 ::hx::Class MediaStore__Companion_obj::__mClass;
 
-static ::String MediaStore__Companion_obj_sStaticFields[] = {
-	HX_("removeMedia__fromC",79,ce,9c,e1),
-	::String(null())
-};
-
 void MediaStore__Companion_obj::__register()
 {
 	MediaStore__Companion_obj _hx_dummy;
@@ -186,9 +200,9 @@ void MediaStore__Companion_obj::__register()
 	__mClass->mSuper = &super::__SGetClass();
 	__mClass->mConstructEmpty = &__CreateEmpty;
 	__mClass->mConstructArgs = &__Create;
-	__mClass->mGetStaticField = &MediaStore__Companion_obj::__GetStatic;
+	__mClass->mGetStaticField = &::hx::Class_obj::GetNoStaticField;
 	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
-	__mClass->mStatics = ::hx::Class_obj::dupFunctions(MediaStore__Companion_obj_sStaticFields);
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(0 /* sStaticFields */);
 	__mClass->mMembers = ::hx::Class_obj::dupFunctions(0 /* sMemberFields */);
 	__mClass->mCanCast = ::hx::TCanCast< MediaStore__Companion_obj >;
 #ifdef HXCPP_SCRIPTABLE
diff --git a/Sources/c_borogove/src/borogove/persistence/Sqlite.cpp b/Sources/c_borogove/src/borogove/persistence/Sqlite.cpp
index 7ee27cf..6f4e526 100644
--- a/Sources/c_borogove/src/borogove/persistence/Sqlite.cpp
+++ b/Sources/c_borogove/src/borogove/persistence/Sqlite.cpp
@@ -25,12 +25,24 @@
 #ifndef INCLUDED_ValueType
 #include <ValueType.h>
 #endif
+#ifndef INCLUDED__FractionalIndexing_FractionalIndexing_Fields_
+#include <_FractionalIndexing/FractionalIndexing_Fields_.h>
+#endif
 #ifndef INCLUDED__HaxeCBridge_Internal
 #include <_HaxeCBridge/Internal.h>
 #endif
+#ifndef INCLUDED_borogove_AsyncLock
+#include <borogove/AsyncLock.h>
+#endif
+#ifndef INCLUDED_borogove_AvailableChat
+#include <borogove/AvailableChat.h>
+#endif
 #ifndef INCLUDED_borogove_Caps
 #include <borogove/Caps.h>
 #endif
+#ifndef INCLUDED_borogove_CapsRepo
+#include <borogove/CapsRepo.h>
+#endif
 #ifndef INCLUDED_borogove_Channel
 #include <borogove/Channel.h>
 #endif
@@ -43,12 +55,12 @@
 #ifndef INCLUDED_borogove_ChatMessageBuilder
 #include <borogove/ChatMessageBuilder.h>
 #endif
-#ifndef INCLUDED_borogove_Config
-#include <borogove/Config.h>
-#endif
 #ifndef INCLUDED_borogove_CustomEmojiReaction
 #include <borogove/CustomEmojiReaction.h>
 #endif
+#ifndef INCLUDED_borogove_EventEmitter
+#include <borogove/EventEmitter.h>
+#endif
 #ifndef INCLUDED_borogove_Hash
 #include <borogove/Hash.h>
 #endif
@@ -61,24 +73,36 @@
 #ifndef INCLUDED_borogove_JsonPrinter
 #include <borogove/JsonPrinter.h>
 #endif
+#ifndef INCLUDED_borogove_Member
+#include <borogove/Member.h>
+#endif
+#ifndef INCLUDED_borogove_MemberUpdate
+#include <borogove/MemberUpdate.h>
+#endif
 #ifndef INCLUDED_borogove_Persistence
 #include <borogove/Persistence.h>
 #endif
-#ifndef INCLUDED_borogove_Presence
-#include <borogove/Presence.h>
-#endif
 #ifndef INCLUDED_borogove_Reaction
 #include <borogove/Reaction.h>
 #endif
 #ifndef INCLUDED_borogove_ReactionUpdate
 #include <borogove/ReactionUpdate.h>
 #endif
+#ifndef INCLUDED_borogove_Role
+#include <borogove/Role.h>
+#endif
 #ifndef INCLUDED_borogove_SerializedChat
 #include <borogove/SerializedChat.h>
 #endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
+#ifndef INCLUDED_borogove_Status
+#include <borogove/Status.h>
+#endif
+#ifndef INCLUDED_borogove__Chat_Chat_Fields_
+#include <borogove/_Chat/Chat_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_persistence_KeyValueStore
 #include <borogove/persistence/KeyValueStore.h>
 #endif
@@ -131,267 +155,467 @@
 #include <thenshim/_Promise/Promise_Impl_.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_84_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",84,0x605e3eb4)
-static const ::String _hx_array_data_99390348_1[] = {
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_87_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",87,0x605e3eb4)
+static const ::String _hx_array_data_99390348_2[] = {
 	HX_("CREATE TABLE messages (\n\t\t\t\t\t\t\taccount_id TEXT NOT NULL,\n\t\t\t\t\t\t\tmam_id TEXT NOT NULL,\n\t\t\t\t\t\t\tmam_by TEXT NOT NULL,\n\t\t\t\t\t\t\tstanza_id TEXT NOT NULL,\n\t\t\t\t\t\t\tcorrection_id TEXT NOT NULL,\n\t\t\t\t\t\t\tsync_point INTEGER NOT NULL,\n\t\t\t\t\t\t\tchat_id TEXT NOT NULL,\n\t\t\t\t\t\t\tsender_id TEXT NOT NULL,\n\t\t\t\t\t\t\tcreated_at INTEGER NOT NULL,\n\t\t\t\t\t\t\tstatus INTEGER NOT NULL,\n\t\t\t\t\t\t\tdirection INTEGER NOT NULL,\n\t\t\t\t\t\t\ttype INTEGER NOT NULL,\n\t\t\t\t\t\t\tstanza TEXT NOT NULL,\n\t\t\t\t\t\t\tPRIMARY KEY (account_id, mam_id, mam_by, stanza_id)\n\t\t\t\t\t\t) STRICT",83,96,ac,55),HX_("CREATE INDEX messages_created_at ON messages (account_id, chat_id, created_at)",0a,a5,34,74),HX_("CREATE INDEX messages_correction_id ON messages (correction_id)",1d,cc,3a,55),HX_("CREATE TABLE chats (\n\t\t\t\t\t\t\taccount_id TEXT NOT NULL,\n\t\t\t\t\t\t\tchat_id TEXT NOT NULL,\n\t\t\t\t\t\t\ttrusted INTEGER NOT NULL,\n\t\t\t\t\t\t\tavatar_sha1 BLOB,\n\t\t\t\t\t\t\tfn TEXT,\n\t\t\t\t\t\t\tui_state INTEGER NOT NULL,\n\t\t\t\t\t\t\tblocked INTEGER NOT NULL,\n\t\t\t\t\t\t\textensions TEXT,\n\t\t\t\t\t\t\tread_up_to_id TEXT,\n\t\t\t\t\t\t\tread_up_to_by TEXT,\n\t\t\t\t\t\t\tcaps_ver BLOB,\n\t\t\t\t\t\t\tpresence BLOB NOT NULL,\n\t\t\t\t\t\t\tclass TEXT NOT NULL,\n\t\t\t\t\t\t\tPRIMARY KEY (account_id, chat_id)\n\t\t\t\t\t\t) STRICT",d7,57,b5,98),HX_("CREATE TABLE keyvaluepairs (\n\t\t\t\t\t\t\tk TEXT NOT NULL PRIMARY KEY,\n\t\t\t\t\t\t\tv TEXT NOT NULL\n\t\t\t\t\t\t) STRICT",7d,57,c4,25),HX_("CREATE TABLE caps (\n\t\t\t\t\t\t\tsha1 BLOB NOT NULL PRIMARY KEY,\n\t\t\t\t\t\t\tcaps BLOB NOT NULL\n\t\t\t\t\t\t) STRICT",82,72,8b,39),HX_("CREATE TABLE services (\n\t\t\t\t\t\t\taccount_id TEXT NOT NULL,\n\t\t\t\t\t\t\tservice_id TEXT NOT NULL,\n\t\t\t\t\t\t\tname TEXT,\n\t\t\t\t\t\t\tnode TEXT,\n\t\t\t\t\t\t\tcaps BLOB NOT NULL,\n\t\t\t\t\t\t\tPRIMARY KEY (account_id, service_id)\n\t\t\t\t\t\t) STRICT",e9,e5,5a,93),HX_("CREATE TABLE accounts (\n\t\t\t\t\t\t\taccount_id TEXT NOT NULL,\n\t\t\t\t\t\t\tclient_id TEXT NOT NULL,\n\t\t\t\t\t\t\tdisplay_name TEXT,\n\t\t\t\t\t\t\ttoken TEXT,\n\t\t\t\t\t\t\tfast_count INTEGER NOT NULL DEFAULT 0,\n\t\t\t\t\t\t\tsm_state BLOB,\n\t\t\t\t\t\t\tPRIMARY KEY (account_id)\n\t\t\t\t\t\t) STRICT",e5,e4,e8,18),HX_("CREATE TABLE reactions (\n\t\t\t\t\t\t\taccount_id TEXT NOT NULL,\n\t\t\t\t\t\t\tupdate_id TEXT NOT NULL,\n\t\t\t\t\t\t\tmam_id TEXT,\n\t\t\t\t\t\t\tmam_by TEXT,\n\t\t\t\t\t\t\tstanza_id TEXT,\n\t\t\t\t\t\t\tchat_id TEXT NOT NULL,\n\t\t\t\t\t\t\tsender_id TEXT NOT NULL,\n\t\t\t\t\t\t\tcreated_at INTEGER NOT NULL,\n\t\t\t\t\t\t\treactions BLOB NOT NULL,\n\t\t\t\t\t\t\tkind INTEGER NOT NULL,\n\t\t\t\t\t\t\tPRIMARY KEY (account_id, chat_id, sender_id, update_id)\n\t\t\t\t\t\t) STRICT",f2,b7,82,71),HX_("PRAGMA user_version = 1",36,cd,bd,7c),
 };
-HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_161_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",161,0x605e3eb4)
-static const ::String _hx_array_data_99390348_3[] = {
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_164_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",164,0x605e3eb4)
+static const ::String _hx_array_data_99390348_4[] = {
 	HX_("ALTER TABLE chats ADD COLUMN notifications_filtered INTEGER",96,4b,fd,cd),HX_("ALTER TABLE chats ADD COLUMN notify_mention INTEGER NOT NULL DEFAULT 0",c9,7b,58,0e),HX_("ALTER TABLE chats ADD COLUMN notify_reply INTEGER NOT NULL DEFAULT 0",89,06,a6,fc),HX_("PRAGMA user_version = 2",37,cd,bd,7c),
 };
-HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_169_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",169,0x605e3eb4)
-static const ::String _hx_array_data_99390348_5[] = {
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_172_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",172,0x605e3eb4)
+static const ::String _hx_array_data_99390348_6[] = {
 	HX_("ALTER TABLE messages ADD COLUMN status_text TEXT",26,26,af,2d),HX_("PRAGMA user_version = 3",38,cd,bd,7c),
 };
-HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_175_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",175,0x605e3eb4)
-static const ::String _hx_array_data_99390348_7[] = {
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_178_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",178,0x605e3eb4)
+static const ::String _hx_array_data_99390348_8[] = {
 	HX_("CREATE INDEX messages_stanza_id on messages (account_id, stanza_id)",5e,17,3a,20),HX_("PRAGMA user_version = 4",39,cd,bd,7c),
 };
-HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_181_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",181,0x605e3eb4)
-static const ::String _hx_array_data_99390348_9[] = {
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_184_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",184,0x605e3eb4)
+static const ::String _hx_array_data_99390348_10[] = {
 	HX_("CREATE INDEX messages_mam_id on messages (account_id, chat_id, mam_id)",ea,dd,5f,aa),HX_("PRAGMA user_version = 5",3a,cd,bd,7c),
 };
-HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_82_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",82,0x605e3eb4)
-HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_81_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",81,0x605e3eb4)
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_190_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",190,0x605e3eb4)
 static const ::String _hx_array_data_99390348_12[] = {
-	HX_("PRAGMA user_version",c8,0f,11,60),
+	HX_("ALTER TABLE chats ADD COLUMN bookmarked INTEGER NOT NULL DEFAULT 0",08,c6,d1,b9),HX_("PRAGMA user_version = 6",3b,cd,bd,7c),
+};
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_196_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",196,0x605e3eb4)
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_203_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",203,0x605e3eb4)
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_207_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",207,0x605e3eb4)
+static const ::String _hx_array_data_99390348_16[] = {
+	HX_("SELECT ROWID FROM messages ORDER BY created_at",14,94,7d,7f),
 };
-HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_31_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",31,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_194_get,"borogove.persistence.Sqlite","get",0xf1069870,"borogove.persistence.Sqlite.get","borogove/persistence/Sqlite.hx",194,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_204_set,"borogove.persistence.Sqlite","set",0xf10fb37c,"borogove.persistence.Sqlite.set","borogove/persistence/Sqlite.hx",204,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_205_set,"borogove.persistence.Sqlite","set",0xf10fb37c,"borogove.persistence.Sqlite.set","borogove/persistence/Sqlite.hx",205,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_207_set,"borogove.persistence.Sqlite","set",0xf10fb37c,"borogove.persistence.Sqlite.set","borogove/persistence/Sqlite.hx",207,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_232_lastId,"borogove.persistence.Sqlite","lastId",0x6b0dd837,"borogove.persistence.Sqlite.lastId","borogove/persistence/Sqlite.hx",232,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_212_lastId,"borogove.persistence.Sqlite","lastId",0x6b0dd837,"borogove.persistence.Sqlite.lastId","borogove/persistence/Sqlite.hx",212,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_249_storeChats,"borogove.persistence.Sqlite","storeChats",0xd6b04260,"borogove.persistence.Sqlite.storeChats","borogove/persistence/Sqlite.hx",249,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_248_storeChats,"borogove.persistence.Sqlite","storeChats",0xd6b04260,"borogove.persistence.Sqlite.storeChats","borogove/persistence/Sqlite.hx",248,0x605e3eb4)
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_220_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",220,0x605e3eb4)
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_208_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",208,0x605e3eb4)
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_216_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",216,0x605e3eb4)
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_222_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",222,0x605e3eb4)
+static const ::String _hx_array_data_99390348_21[] = {
+	HX_("PRAGMA user_version = 8",3d,cd,bd,7c),
+};
+static const ::String _hx_array_data_99390348_22[] = {
+	HX_("ALTER TABLE messages ADD COLUMN sort_id TEXT NOT NULL DEFAULT 'a '",90,4a,7e,63),HX_("CREATE INDEX messages_sort_id ON messages (account_id, chat_id, sort_id)",92,70,88,c2),
+};
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_226_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",226,0x605e3eb4)
+static const ::String _hx_array_data_99390348_24[] = {
+	HX_("ALTER TABLE chats ADD COLUMN meta BLOB NOT NULL DEFAULT X'0C'",0c,0c,a1,c8),HX_("PRAGMA user_version = 9",3e,cd,bd,7c),
+};
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_233_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",233,0x605e3eb4)
+static const ::String _hx_array_data_99390348_26[] = {
+	HX_("ALTER TABLE accounts ADD COLUMN sort_id TEXT NOT NULL DEFAULT 'a '",6a,de,fe,aa),HX_("PRAGMA user_version = 10",3a,c2,55,a9),
+};
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_239_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",239,0x605e3eb4)
+static const ::String _hx_array_data_99390348_28[] = {
+	HX_("CREATE TABLE members (\n\t\t\t\t\t\t\taccount_id TEXT NOT NULL,\n\t\t\t\t\t\t\tchat_id TEXT NOT NULL,\n\t\t\t\t\t\t\tmember_id TEXT NOT NULL,\n\t\t\t\t\t\t\tdisplay_name TEXT,\n\t\t\t\t\t\t\tphoto_uri TEXT,\n\t\t\t\t\t\t\tis_self INTEGER NOT NULL,\n\t\t\t\t\t\t\tchat TEXT,\n\t\t\t\t\t\t\troles BLOB NOT NULL,\n\t\t\t\t\t\t\tpresence BLOB NOT NULL,\n\t\t\t\t\t\t\tjid TEXT,\n\t\t\t\t\t\t\tPRIMARY KEY (account_id, member_id)\n\t\t\t\t\t\t) STRICT",a0,1c,e3,3e),HX_("CREATE INDEX members_chats ON members (account_id, chat_id, is_self, jid)",01,f5,76,e5),HX_("ALTER TABLE chats DROP COLUMN presence",15,e1,b4,ae),HX_("PRAGMA user_version = 11",3b,c2,55,a9),
+};
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_259_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",259,0x605e3eb4)
 static const ::String _hx_array_data_99390348_30[] = {
+	HX_("CREATE INDEX messages_sync_point ON messages (account_id, mam_by, sort_id DESC) WHERE sync_point",e5,a4,cc,f3),HX_("PRAGMA user_version = 12",3c,c2,55,a9),
+};
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_85_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",85,0x605e3eb4)
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_84_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",84,0x605e3eb4)
+static const ::String _hx_array_data_99390348_33[] = {
+	HX_("PRAGMA user_version",c8,0f,11,60),
+};
+HX_DEFINE_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_34_new,"borogove.persistence.Sqlite","new",0xf10be83a,"borogove.persistence.Sqlite.new","borogove/persistence/Sqlite.hx",34,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_272_get,"borogove.persistence.Sqlite","get",0xf1069870,"borogove.persistence.Sqlite.get","borogove/persistence/Sqlite.hx",272,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_282_set,"borogove.persistence.Sqlite","set",0xf10fb37c,"borogove.persistence.Sqlite.set","borogove/persistence/Sqlite.hx",282,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_283_set,"borogove.persistence.Sqlite","set",0xf10fb37c,"borogove.persistence.Sqlite.set","borogove/persistence/Sqlite.hx",283,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_285_set,"borogove.persistence.Sqlite","set",0xf10fb37c,"borogove.persistence.Sqlite.set","borogove/persistence/Sqlite.hx",285,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_301_syncPoint,"borogove.persistence.Sqlite","syncPoint",0xba3f774f,"borogove.persistence.Sqlite.syncPoint","borogove/persistence/Sqlite.hx",301,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_290_syncPoint,"borogove.persistence.Sqlite","syncPoint",0xba3f774f,"borogove.persistence.Sqlite.syncPoint","borogove/persistence/Sqlite.hx",290,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_317_storeChats,"borogove.persistence.Sqlite","storeChats",0xd6b04260,"borogove.persistence.Sqlite.storeChats","borogove/persistence/Sqlite.hx",317,0x605e3eb4)
+static const ::String _hx_array_data_99390348_50[] = {
 	HX_("INSERT OR REPLACE INTO chats VALUES ",3b,7d,10,d4),
 };
-static const ::String _hx_array_data_99390348_31[] = {
+static const ::String _hx_array_data_99390348_51[] = {
 	HX_(",",2c,00,00,00),
 };
-static const ::String _hx_array_data_99390348_32[] = {
-	HX_("(?,?,?,?,?,?,?,?,?,?,?,jsonb(?),?,?,?,?)",4e,16,2e,3d),
+static const ::String _hx_array_data_99390348_52[] = {
+	HX_("(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,jsonb(?))",f9,da,31,c1),
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_343_storeChats,"borogove.persistence.Sqlite","storeChats",0xd6b04260,"borogove.persistence.Sqlite.storeChats","borogove/persistence/Sqlite.hx",343,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_308_storeChats,"borogove.persistence.Sqlite","storeChats",0xd6b04260,"borogove.persistence.Sqlite.storeChats","borogove/persistence/Sqlite.hx",308,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_356_serializePresenceMap,"borogove.persistence.Sqlite","serializePresenceMap",0x1aed0007,"borogove.persistence.Sqlite.serializePresenceMap","borogove/persistence/Sqlite.hx",356,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_367_hydratePresenceMap,"borogove.persistence.Sqlite","hydratePresenceMap",0xdd91e2b4,"borogove.persistence.Sqlite.hydratePresenceMap","borogove/persistence/Sqlite.hx",367,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_379_hydrateStoredMember,"borogove.persistence.Sqlite","hydrateStoredMember",0x227dd92a,"borogove.persistence.Sqlite.hydrateStoredMember","borogove/persistence/Sqlite.hx",379,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_425_chatPresenceAndMembersForName,"borogove.persistence.Sqlite","chatPresenceAndMembersForName",0x57ea40f9,"borogove.persistence.Sqlite.chatPresenceAndMembersForName","borogove/persistence/Sqlite.hx",425,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_446_chatPresenceAndMembersForName,"borogove.persistence.Sqlite","chatPresenceAndMembersForName",0x57ea40f9,"borogove.persistence.Sqlite.chatPresenceAndMembersForName","borogove/persistence/Sqlite.hx",446,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_460_chatPresenceAndMembersForName,"borogove.persistence.Sqlite","chatPresenceAndMembersForName",0x57ea40f9,"borogove.persistence.Sqlite.chatPresenceAndMembersForName","borogove/persistence/Sqlite.hx",460,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_468_chatPresenceAndMembersForName,"borogove.persistence.Sqlite","chatPresenceAndMembersForName",0x57ea40f9,"borogove.persistence.Sqlite.chatPresenceAndMembersForName","borogove/persistence/Sqlite.hx",468,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_407_chatPresenceAndMembersForName,"borogove.persistence.Sqlite","chatPresenceAndMembersForName",0x57ea40f9,"borogove.persistence.Sqlite.chatPresenceAndMembersForName","borogove/persistence/Sqlite.hx",407,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_507_storeMembers,"borogove.persistence.Sqlite","storeMembers",0x5eb10bde,"borogove.persistence.Sqlite.storeMembers","borogove/persistence/Sqlite.hx",507,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_480_storeMembers,"borogove.persistence.Sqlite","storeMembers",0x5eb10bde,"borogove.persistence.Sqlite.storeMembers","borogove/persistence/Sqlite.hx",480,0x605e3eb4)
+static const ::String _hx_array_data_99390348_73[] = {
+	HX_("INSERT OR REPLACE INTO members VALUES ",f9,ed,eb,41),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_239_storeChats,"borogove.persistence.Sqlite","storeChats",0xd6b04260,"borogove.persistence.Sqlite.storeChats","borogove/persistence/Sqlite.hx",239,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_315_getChats,"borogove.persistence.Sqlite","getChats",0x78ebe00b,"borogove.persistence.Sqlite.getChats","borogove/persistence/Sqlite.hx",315,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_319_getChats,"borogove.persistence.Sqlite","getChats",0x78ebe00b,"borogove.persistence.Sqlite.getChats","borogove/persistence/Sqlite.hx",319,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_302_getChats,"borogove.persistence.Sqlite","getChats",0x78ebe00b,"borogove.persistence.Sqlite.getChats","borogove/persistence/Sqlite.hx",302,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_320_getChats,"borogove.persistence.Sqlite","getChats",0x78ebe00b,"borogove.persistence.Sqlite.getChats","borogove/persistence/Sqlite.hx",320,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_298_getChats,"borogove.persistence.Sqlite","getChats",0x78ebe00b,"borogove.persistence.Sqlite.getChats","borogove/persistence/Sqlite.hx",298,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_385_storeMessages,"borogove.persistence.Sqlite","storeMessages",0xa9801e27,"borogove.persistence.Sqlite.storeMessages","borogove/persistence/Sqlite.hx",385,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_400_storeMessages,"borogove.persistence.Sqlite","storeMessages",0xa9801e27,"borogove.persistence.Sqlite.storeMessages","borogove/persistence/Sqlite.hx",400,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_349_storeMessages,"borogove.persistence.Sqlite","storeMessages",0xa9801e27,"borogove.persistence.Sqlite.storeMessages","borogove/persistence/Sqlite.hx",349,0x605e3eb4)
-static const ::String _hx_array_data_99390348_56[] = {
-	HX_("DELETE FROM messages WHERE account_id=? AND direction=? AND chat_id IN (",a1,9c,a2,06),
+static const ::String _hx_array_data_99390348_74[] = {
+	HX_(",",2c,00,00,00),
 };
-static const ::String _hx_array_data_99390348_57[] = {
-	HX_(") AND stanza_id IN (",e8,da,d3,eb),
+static const ::String _hx_array_data_99390348_75[] = {
+	HX_("(?,?,?,?,?,?,?,jsonb(?),jsonb(?),?)",cd,39,fd,64),
 };
-static const ::String _hx_array_data_99390348_58[] = {
-	HX_(")",29,00,00,00),
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_537_storeMemberUpdates,"borogove.persistence.Sqlite","storeMemberUpdates",0x3224d7d5,"borogove.persistence.Sqlite.storeMemberUpdates","borogove/persistence/Sqlite.hx",537,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_535_storeMemberUpdates,"borogove.persistence.Sqlite","storeMemberUpdates",0x3224d7d5,"borogove.persistence.Sqlite.storeMemberUpdates","borogove/persistence/Sqlite.hx",535,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_538_storeMemberUpdates,"borogove.persistence.Sqlite","storeMemberUpdates",0x3224d7d5,"borogove.persistence.Sqlite.storeMemberUpdates","borogove/persistence/Sqlite.hx",538,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_546_storeMemberUpdates,"borogove.persistence.Sqlite","storeMemberUpdates",0x3224d7d5,"borogove.persistence.Sqlite.storeMemberUpdates","borogove/persistence/Sqlite.hx",546,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_553_storeMemberUpdates,"borogove.persistence.Sqlite","storeMemberUpdates",0x3224d7d5,"borogove.persistence.Sqlite.storeMemberUpdates","borogove/persistence/Sqlite.hx",553,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_555_storeMemberUpdates,"borogove.persistence.Sqlite","storeMemberUpdates",0x3224d7d5,"borogove.persistence.Sqlite.storeMemberUpdates","borogove/persistence/Sqlite.hx",555,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_511_storeMemberUpdates,"borogove.persistence.Sqlite","storeMemberUpdates",0x3224d7d5,"borogove.persistence.Sqlite.storeMemberUpdates","borogove/persistence/Sqlite.hx",511,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_526_storeMemberUpdates,"borogove.persistence.Sqlite","storeMemberUpdates",0x3224d7d5,"borogove.persistence.Sqlite.storeMemberUpdates","borogove/persistence/Sqlite.hx",526,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_519_storeMemberUpdates,"borogove.persistence.Sqlite","storeMemberUpdates",0x3224d7d5,"borogove.persistence.Sqlite.storeMemberUpdates","borogove/persistence/Sqlite.hx",519,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_528_storeMemberUpdates,"borogove.persistence.Sqlite","storeMemberUpdates",0x3224d7d5,"borogove.persistence.Sqlite.storeMemberUpdates","borogove/persistence/Sqlite.hx",528,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_518_storeMemberUpdates,"borogove.persistence.Sqlite","storeMemberUpdates",0x3224d7d5,"borogove.persistence.Sqlite.storeMemberUpdates","borogove/persistence/Sqlite.hx",518,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_578_clearMemberPresence,"borogove.persistence.Sqlite","clearMemberPresence",0xf21288fc,"borogove.persistence.Sqlite.clearMemberPresence","borogove/persistence/Sqlite.hx",578,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_573_clearMemberPresence,"borogove.persistence.Sqlite","clearMemberPresence",0xf21288fc,"borogove.persistence.Sqlite.clearMemberPresence","borogove/persistence/Sqlite.hx",573,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_600_getMembers,"borogove.persistence.Sqlite","getMembers",0xbd4faa49,"borogove.persistence.Sqlite.getMembers","borogove/persistence/Sqlite.hx",600,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_582_getMembers,"borogove.persistence.Sqlite","getMembers",0xbd4faa49,"borogove.persistence.Sqlite.getMembers","borogove/persistence/Sqlite.hx",582,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_622_getMemberDetails,"borogove.persistence.Sqlite","getMemberDetails",0x098db2f8,"borogove.persistence.Sqlite.getMemberDetails","borogove/persistence/Sqlite.hx",622,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_614_getMemberDetails,"borogove.persistence.Sqlite","getMemberDetails",0x098db2f8,"borogove.persistence.Sqlite.getMemberDetails","borogove/persistence/Sqlite.hx",614,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_640_searchMessages,"borogove.persistence.Sqlite","searchMessages",0x6d157eba,"borogove.persistence.Sqlite.searchMessages","borogove/persistence/Sqlite.hx",640,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_633_searchMessages,"borogove.persistence.Sqlite","searchMessages",0x6d157eba,"borogove.persistence.Sqlite.searchMessages","borogove/persistence/Sqlite.hx",633,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_649_getChats,"borogove.persistence.Sqlite","getChats",0x78ebe00b,"borogove.persistence.Sqlite.getChats","borogove/persistence/Sqlite.hx",649,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_650_getChats,"borogove.persistence.Sqlite","getChats",0x78ebe00b,"borogove.persistence.Sqlite.getChats","borogove/persistence/Sqlite.hx",650,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_648_getChats,"borogove.persistence.Sqlite","getChats",0x78ebe00b,"borogove.persistence.Sqlite.getChats","borogove/persistence/Sqlite.hx",648,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_644_getChats,"borogove.persistence.Sqlite","getChats",0x78ebe00b,"borogove.persistence.Sqlite.getChats","borogove/persistence/Sqlite.hx",644,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_713_storeMessages,"borogove.persistence.Sqlite","storeMessages",0xa9801e27,"borogove.persistence.Sqlite.storeMessages","borogove/persistence/Sqlite.hx",713,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_715_storeMessages,"borogove.persistence.Sqlite","storeMessages",0xa9801e27,"borogove.persistence.Sqlite.storeMessages","borogove/persistence/Sqlite.hx",715,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_717_storeMessages,"borogove.persistence.Sqlite","storeMessages",0xa9801e27,"borogove.persistence.Sqlite.storeMessages","borogove/persistence/Sqlite.hx",717,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_699_storeMessages,"borogove.persistence.Sqlite","storeMessages",0xa9801e27,"borogove.persistence.Sqlite.storeMessages","borogove/persistence/Sqlite.hx",699,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_672_storeMessages,"borogove.persistence.Sqlite","storeMessages",0xa9801e27,"borogove.persistence.Sqlite.storeMessages","borogove/persistence/Sqlite.hx",672,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_726_updateMessage,"borogove.persistence.Sqlite","updateMessage",0x2541c718,"borogove.persistence.Sqlite.updateMessage","borogove/persistence/Sqlite.hx",726,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_760_fetchFromStub,"borogove.persistence.Sqlite","fetchFromStub",0x727b8a6c,"borogove.persistence.Sqlite.fetchFromStub","borogove/persistence/Sqlite.hx",760,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_729_fetchFromStub,"borogove.persistence.Sqlite","fetchFromStub",0x727b8a6c,"borogove.persistence.Sqlite.fetchFromStub","borogove/persistence/Sqlite.hx",729,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_787_getMessage,"borogove.persistence.Sqlite","getMessage",0x3cf0b337,"borogove.persistence.Sqlite.getMessage","borogove/persistence/Sqlite.hx",787,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_794_getMessage,"borogove.persistence.Sqlite","getMessage",0x3cf0b337,"borogove.persistence.Sqlite.getMessage","borogove/persistence/Sqlite.hx",794,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_788_getMessage,"borogove.persistence.Sqlite","getMessage",0x3cf0b337,"borogove.persistence.Sqlite.getMessage","borogove/persistence/Sqlite.hx",788,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_793_getMessage,"borogove.persistence.Sqlite","getMessage",0x3cf0b337,"borogove.persistence.Sqlite.getMessage","borogove/persistence/Sqlite.hx",793,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_776_getMessage,"borogove.persistence.Sqlite","getMessage",0x3cf0b337,"borogove.persistence.Sqlite.getMessage","borogove/persistence/Sqlite.hx",776,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_e0e41eef74e41160_365_getMessage__fromC,"borogove.persistence.Sqlite","getMessage__fromC",0x419ea222,"borogove.persistence.Sqlite.getMessage__fromC","HaxeCBridge.hx",365,0xa18550d8)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_842_getMessages,"borogove.persistence.Sqlite","getMessages",0x15ac1d5c,"borogove.persistence.Sqlite.getMessages","borogove/persistence/Sqlite.hx",842,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_865_getMessages,"borogove.persistence.Sqlite","getMessages",0x15ac1d5c,"borogove.persistence.Sqlite.getMessages","borogove/persistence/Sqlite.hx",865,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_869_getMessages,"borogove.persistence.Sqlite","getMessages",0x15ac1d5c,"borogove.persistence.Sqlite.getMessages","borogove/persistence/Sqlite.hx",869,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_888_getMessages,"borogove.persistence.Sqlite","getMessages",0x15ac1d5c,"borogove.persistence.Sqlite.getMessages","borogove/persistence/Sqlite.hx",888,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_899_getMessages,"borogove.persistence.Sqlite","getMessages",0x15ac1d5c,"borogove.persistence.Sqlite.getMessages","borogove/persistence/Sqlite.hx",899,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_798_getMessages,"borogove.persistence.Sqlite","getMessages",0x15ac1d5c,"borogove.persistence.Sqlite.getMessages","borogove/persistence/Sqlite.hx",798,0x605e3eb4)
+static const ::String _hx_array_data_99390348_147[] = {
+	HX_("WITH page AS (SELECT stanza_id, mam_id FROM messages where account_id=? AND chat_id=? AND (stanza_id IS NULL OR stanza_id='' OR stanza_id=correction_id) AND type<>?",1a,43,cb,8f),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_408_updateMessage,"borogove.persistence.Sqlite","updateMessage",0x2541c718,"borogove.persistence.Sqlite.updateMessage","borogove/persistence/Sqlite.hx",408,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_431_getMessage,"borogove.persistence.Sqlite","getMessage",0x3cf0b337,"borogove.persistence.Sqlite.getMessage","borogove/persistence/Sqlite.hx",431,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_438_getMessage,"borogove.persistence.Sqlite","getMessage",0x3cf0b337,"borogove.persistence.Sqlite.getMessage","borogove/persistence/Sqlite.hx",438,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_432_getMessage,"borogove.persistence.Sqlite","getMessage",0x3cf0b337,"borogove.persistence.Sqlite.getMessage","borogove/persistence/Sqlite.hx",432,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_437_getMessage,"borogove.persistence.Sqlite","getMessage",0x3cf0b337,"borogove.persistence.Sqlite.getMessage","borogove/persistence/Sqlite.hx",437,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_420_getMessage,"borogove.persistence.Sqlite","getMessage",0x3cf0b337,"borogove.persistence.Sqlite.getMessage","borogove/persistence/Sqlite.hx",420,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_e0e41eef74e41160_337_getMessage__fromC,"borogove.persistence.Sqlite","getMessage__fromC",0x419ea222,"borogove.persistence.Sqlite.getMessage__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_479_getMessages,"borogove.persistence.Sqlite","getMessages",0x15ac1d5c,"borogove.persistence.Sqlite.getMessages","borogove/persistence/Sqlite.hx",479,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_492_getMessages,"borogove.persistence.Sqlite","getMessages",0x15ac1d5c,"borogove.persistence.Sqlite.getMessages","borogove/persistence/Sqlite.hx",492,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_442_getMessages,"borogove.persistence.Sqlite","getMessages",0x15ac1d5c,"borogove.persistence.Sqlite.getMessages","borogove/persistence/Sqlite.hx",442,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_497_getMessagesBefore,"borogove.persistence.Sqlite","getMessagesBefore",0x4d9d52fb,"borogove.persistence.Sqlite.getMessagesBefore","borogove/persistence/Sqlite.hx",497,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_502_getMessagesAfter,"borogove.persistence.Sqlite","getMessagesAfter",0xadefcb20,"borogove.persistence.Sqlite.getMessagesAfter","borogove/persistence/Sqlite.hx",502,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_518_getMessagesAround,"borogove.persistence.Sqlite","getMessagesAround",0x696ef6c9,"borogove.persistence.Sqlite.getMessagesAround","borogove/persistence/Sqlite.hx",518,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_522_getMessagesAround,"borogove.persistence.Sqlite","getMessagesAround",0x696ef6c9,"borogove.persistence.Sqlite.getMessagesAround","borogove/persistence/Sqlite.hx",522,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_506_getMessagesAround,"borogove.persistence.Sqlite","getMessagesAround",0x696ef6c9,"borogove.persistence.Sqlite.getMessagesAround","borogove/persistence/Sqlite.hx",506,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_509_getMessagesAround,"borogove.persistence.Sqlite","getMessagesAround",0x696ef6c9,"borogove.persistence.Sqlite.getMessagesAround","borogove/persistence/Sqlite.hx",509,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_512_getMessagesAround,"borogove.persistence.Sqlite","getMessagesAround",0x696ef6c9,"borogove.persistence.Sqlite.getMessagesAround","borogove/persistence/Sqlite.hx",512,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_530_getChatUnreadDetails,"borogove.persistence.Sqlite","getChatUnreadDetails",0x2c7619cb,"borogove.persistence.Sqlite.getChatUnreadDetails","borogove/persistence/Sqlite.hx",530,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_526_getChatUnreadDetails,"borogove.persistence.Sqlite","getChatUnreadDetails",0x2c7619cb,"borogove.persistence.Sqlite.getChatUnreadDetails","borogove/persistence/Sqlite.hx",526,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_538_getChatsUnreadDetails,"borogove.persistence.Sqlite","getChatsUnreadDetails",0x7e07eb48,"borogove.persistence.Sqlite.getChatsUnreadDetails","borogove/persistence/Sqlite.hx",538,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_556_storeReaction,"borogove.persistence.Sqlite","storeReaction",0x6b372d04,"borogove.persistence.Sqlite.storeReaction","borogove/persistence/Sqlite.hx",556,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_547_storeReaction,"borogove.persistence.Sqlite","storeReaction",0x6b372d04,"borogove.persistence.Sqlite.storeReaction","borogove/persistence/Sqlite.hx",547,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_566_updateMessageStatus,"borogove.persistence.Sqlite","updateMessageStatus",0x5be4846a,"borogove.persistence.Sqlite.updateMessageStatus","borogove/persistence/Sqlite.hx",566,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_571_updateMessageStatus,"borogove.persistence.Sqlite","updateMessageStatus",0x5be4846a,"borogove.persistence.Sqlite.updateMessageStatus","borogove/persistence/Sqlite.hx",571,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_576_updateMessageStatus,"borogove.persistence.Sqlite","updateMessageStatus",0x5be4846a,"borogove.persistence.Sqlite.updateMessageStatus","borogove/persistence/Sqlite.hx",576,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_578_updateMessageStatus,"borogove.persistence.Sqlite","updateMessageStatus",0x5be4846a,"borogove.persistence.Sqlite.updateMessageStatus","borogove/persistence/Sqlite.hx",578,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_561_updateMessageStatus,"borogove.persistence.Sqlite","updateMessageStatus",0x5be4846a,"borogove.persistence.Sqlite.updateMessageStatus","borogove/persistence/Sqlite.hx",561,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_583_hasMedia,"borogove.persistence.Sqlite","hasMedia",0x65758110,"borogove.persistence.Sqlite.hasMedia","borogove/persistence/Sqlite.hx",583,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_588_removeMedia,"borogove.persistence.Sqlite","removeMedia",0xbeaa63da,"borogove.persistence.Sqlite.removeMedia","borogove/persistence/Sqlite.hx",588,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_593_storeMedia,"borogove.persistence.Sqlite","storeMedia",0x96b8a8a9,"borogove.persistence.Sqlite.storeMedia","borogove/persistence/Sqlite.hx",593,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_598_storeCaps,"borogove.persistence.Sqlite","storeCaps",0xbf81d7fc,"borogove.persistence.Sqlite.storeCaps","borogove/persistence/Sqlite.hx",598,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_601_storeCapsSet,"borogove.persistence.Sqlite","storeCapsSet",0xeacfa106,"borogove.persistence.Sqlite.storeCapsSet","borogove/persistence/Sqlite.hx",601,0x605e3eb4)
-static const ::String _hx_array_data_99390348_108[] = {
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_904_getMessagesBefore,"borogove.persistence.Sqlite","getMessagesBefore",0x4d9d52fb,"borogove.persistence.Sqlite.getMessagesBefore","borogove/persistence/Sqlite.hx",904,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_909_getMessagesAfter,"borogove.persistence.Sqlite","getMessagesAfter",0xadefcb20,"borogove.persistence.Sqlite.getMessagesAfter","borogove/persistence/Sqlite.hx",909,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_918_getMessagesAround,"borogove.persistence.Sqlite","getMessagesAround",0x696ef6c9,"borogove.persistence.Sqlite.getMessagesAround","borogove/persistence/Sqlite.hx",918,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_913_getMessagesAround,"borogove.persistence.Sqlite","getMessagesAround",0x696ef6c9,"borogove.persistence.Sqlite.getMessagesAround","borogove/persistence/Sqlite.hx",913,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_925_getChatUnreadDetails,"borogove.persistence.Sqlite","getChatUnreadDetails",0x2c7619cb,"borogove.persistence.Sqlite.getChatUnreadDetails","borogove/persistence/Sqlite.hx",925,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_921_getChatUnreadDetails,"borogove.persistence.Sqlite","getChatUnreadDetails",0x2c7619cb,"borogove.persistence.Sqlite.getChatUnreadDetails","borogove/persistence/Sqlite.hx",921,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_933_getChatsUnreadDetails,"borogove.persistence.Sqlite","getChatsUnreadDetails",0x7e07eb48,"borogove.persistence.Sqlite.getChatsUnreadDetails","borogove/persistence/Sqlite.hx",933,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_951_storeReaction,"borogove.persistence.Sqlite","storeReaction",0x6b372d04,"borogove.persistence.Sqlite.storeReaction","borogove/persistence/Sqlite.hx",951,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_942_storeReaction,"borogove.persistence.Sqlite","storeReaction",0x6b372d04,"borogove.persistence.Sqlite.storeReaction","borogove/persistence/Sqlite.hx",942,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_962_updateMessageStatus,"borogove.persistence.Sqlite","updateMessageStatus",0x5be4846a,"borogove.persistence.Sqlite.updateMessageStatus","borogove/persistence/Sqlite.hx",962,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_967_updateMessageStatus,"borogove.persistence.Sqlite","updateMessageStatus",0x5be4846a,"borogove.persistence.Sqlite.updateMessageStatus","borogove/persistence/Sqlite.hx",967,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_969_updateMessageStatus,"borogove.persistence.Sqlite","updateMessageStatus",0x5be4846a,"borogove.persistence.Sqlite.updateMessageStatus","borogove/persistence/Sqlite.hx",969,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_958_updateMessageStatus,"borogove.persistence.Sqlite","updateMessageStatus",0x5be4846a,"borogove.persistence.Sqlite.updateMessageStatus","borogove/persistence/Sqlite.hx",958,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_956_updateMessageStatus,"borogove.persistence.Sqlite","updateMessageStatus",0x5be4846a,"borogove.persistence.Sqlite.updateMessageStatus","borogove/persistence/Sqlite.hx",956,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_978_hasMedia,"borogove.persistence.Sqlite","hasMedia",0x65758110,"borogove.persistence.Sqlite.hasMedia","borogove/persistence/Sqlite.hx",978,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_983_removeMedia,"borogove.persistence.Sqlite","removeMedia",0xbeaa63da,"borogove.persistence.Sqlite.removeMedia","borogove/persistence/Sqlite.hx",983,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_988_storeMedia,"borogove.persistence.Sqlite","storeMedia",0x96b8a8a9,"borogove.persistence.Sqlite.storeMedia","borogove/persistence/Sqlite.hx",988,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_992_storeCaps,"borogove.persistence.Sqlite","storeCaps",0xbf81d7fc,"borogove.persistence.Sqlite.storeCaps","borogove/persistence/Sqlite.hx",992,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_998_storeCapsSet,"borogove.persistence.Sqlite","storeCapsSet",0xeacfa106,"borogove.persistence.Sqlite.storeCapsSet","borogove/persistence/Sqlite.hx",998,0x605e3eb4)
+static const ::String _hx_array_data_99390348_175[] = {
 	HX_("INSERT OR IGNORE INTO caps VALUES ",27,4b,68,bf),
 };
-static const ::String _hx_array_data_99390348_109[] = {
+static const ::String _hx_array_data_99390348_176[] = {
 	HX_(",",2c,00,00,00),
 };
-static const ::String _hx_array_data_99390348_110[] = {
+static const ::String _hx_array_data_99390348_177[] = {
 	HX_("(?,jsonb(?))",1c,61,06,9e),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_627_getCaps,"borogove.persistence.Sqlite","getCaps",0x7da6d8b1,"borogove.persistence.Sqlite.getCaps","borogove/persistence/Sqlite.hx",627,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_618_getCaps,"borogove.persistence.Sqlite","getCaps",0x7da6d8b1,"borogove.persistence.Sqlite.getCaps","borogove/persistence/Sqlite.hx",618,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_637_storeLogin,"borogove.persistence.Sqlite","storeLogin",0x09f07d2e,"borogove.persistence.Sqlite.storeLogin","borogove/persistence/Sqlite.hx",637,0x605e3eb4)
-static const ::String _hx_array_data_99390348_115[] = {
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1024_getCaps,"borogove.persistence.Sqlite","getCaps",0x7da6d8b1,"borogove.persistence.Sqlite.getCaps","borogove/persistence/Sqlite.hx",1024,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1015_getCaps,"borogove.persistence.Sqlite","getCaps",0x7da6d8b1,"borogove.persistence.Sqlite.getCaps","borogove/persistence/Sqlite.hx",1015,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1056_storeLogin,"borogove.persistence.Sqlite","storeLogin",0x09f07d2e,"borogove.persistence.Sqlite.storeLogin","borogove/persistence/Sqlite.hx",1056,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1034_storeLogin,"borogove.persistence.Sqlite","storeLogin",0x09f07d2e,"borogove.persistence.Sqlite.storeLogin","borogove/persistence/Sqlite.hx",1034,0x605e3eb4)
+static const ::String _hx_array_data_99390348_183[] = {
 	HX_("INSERT INTO accounts (account_id, client_id, display_name",03,b0,6a,0b),
 };
-static const ::String _hx_array_data_99390348_116[] = {
+static const ::String _hx_array_data_99390348_184[] = {
 	HX_(", token, fast_count",a5,56,e4,ae),
 };
-static const ::String _hx_array_data_99390348_117[] = {
+static const ::String _hx_array_data_99390348_185[] = {
 	HX_(") VALUES (?,?,?",c4,1c,e3,67),
 };
-static const ::String _hx_array_data_99390348_118[] = {
+static const ::String _hx_array_data_99390348_186[] = {
 	HX_(",?",93,26,00,00),
 };
-static const ::String _hx_array_data_99390348_119[] = {
+static const ::String _hx_array_data_99390348_187[] = {
 	HX_(",0",84,26,00,00),
 };
-static const ::String _hx_array_data_99390348_120[] = {
+static const ::String _hx_array_data_99390348_188[] = {
 	HX_(") ON CONFLICT DO UPDATE SET client_id=?",cd,99,0c,96),
 };
-static const ::String _hx_array_data_99390348_121[] = {
+static const ::String _hx_array_data_99390348_189[] = {
 	HX_(", display_name=?",7e,ad,5b,0f),
 };
-static const ::String _hx_array_data_99390348_122[] = {
+static const ::String _hx_array_data_99390348_190[] = {
 	HX_(", token=?",a7,78,19,80),
 };
-static const ::String _hx_array_data_99390348_123[] = {
+static const ::String _hx_array_data_99390348_191[] = {
 	HX_(", fast_count=0",73,a8,4f,82),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_667_getLogin,"borogove.persistence.Sqlite","getLogin",0xac2c1ad9,"borogove.persistence.Sqlite.getLogin","borogove/persistence/Sqlite.hx",667,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_663_getLogin,"borogove.persistence.Sqlite","getLogin",0xac2c1ad9,"borogove.persistence.Sqlite.getLogin","borogove/persistence/Sqlite.hx",663,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_686_removeAccount,"borogove.persistence.Sqlite","removeAccount",0x39d68523,"borogove.persistence.Sqlite.removeAccount","borogove/persistence/Sqlite.hx",686,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_704_listAccounts,"borogove.persistence.Sqlite","listAccounts",0x9e5f9e8a,"borogove.persistence.Sqlite.listAccounts","borogove/persistence/Sqlite.hx",704,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_703_listAccounts,"borogove.persistence.Sqlite","listAccounts",0x9e5f9e8a,"borogove.persistence.Sqlite.listAccounts","borogove/persistence/Sqlite.hx",703,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_e0e41eef74e41160_337_listAccounts__fromC,"borogove.persistence.Sqlite","listAccounts__fromC",0xe40e172f,"borogove.persistence.Sqlite.listAccounts__fromC","HaxeCBridge.hx",337,0xa18550d8)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_711_storeStreamManagement,"borogove.persistence.Sqlite","storeStreamManagement",0x8665337e,"borogove.persistence.Sqlite.storeStreamManagement","borogove/persistence/Sqlite.hx",711,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_718_storeStreamManagement,"borogove.persistence.Sqlite","storeStreamManagement",0x8665337e,"borogove.persistence.Sqlite.storeStreamManagement","borogove/persistence/Sqlite.hx",718,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_727_getStreamManagement,"borogove.persistence.Sqlite","getStreamManagement",0xb922efb3,"borogove.persistence.Sqlite.getStreamManagement","borogove/persistence/Sqlite.hx",727,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_737_storeService,"borogove.persistence.Sqlite","storeService",0x466dfb3a,"borogove.persistence.Sqlite.storeService","borogove/persistence/Sqlite.hx",737,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_752_findServicesWithFeature,"borogove.persistence.Sqlite","findServicesWithFeature",0x99a02f73,"borogove.persistence.Sqlite.findServicesWithFeature","borogove/persistence/Sqlite.hx",752,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_747_findServicesWithFeature,"borogove.persistence.Sqlite","findServicesWithFeature",0x99a02f73,"borogove.persistence.Sqlite.findServicesWithFeature","borogove/persistence/Sqlite.hx",747,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_771_hydrateReactions,"borogove.persistence.Sqlite","hydrateReactions",0x7d654d7d,"borogove.persistence.Sqlite.hydrateReactions","borogove/persistence/Sqlite.hx",771,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_799_fetchReactions,"borogove.persistence.Sqlite","fetchReactions",0x688fe376,"borogove.persistence.Sqlite.fetchReactions","borogove/persistence/Sqlite.hx",799,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_783_fetchReactions,"borogove.persistence.Sqlite","fetchReactions",0x688fe376,"borogove.persistence.Sqlite.fetchReactions","borogove/persistence/Sqlite.hx",783,0x605e3eb4)
-static const ::String _hx_array_data_99390348_159[] = {
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1064_getLogin,"borogove.persistence.Sqlite","getLogin",0xac2c1ad9,"borogove.persistence.Sqlite.getLogin","borogove/persistence/Sqlite.hx",1064,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1060_getLogin,"borogove.persistence.Sqlite","getLogin",0xac2c1ad9,"borogove.persistence.Sqlite.getLogin","borogove/persistence/Sqlite.hx",1060,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1085_removeAccount,"borogove.persistence.Sqlite","removeAccount",0x39d68523,"borogove.persistence.Sqlite.removeAccount","borogove/persistence/Sqlite.hx",1085,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1093_removeAccount,"borogove.persistence.Sqlite","removeAccount",0x39d68523,"borogove.persistence.Sqlite.removeAccount","borogove/persistence/Sqlite.hx",1093,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1084_removeAccount,"borogove.persistence.Sqlite","removeAccount",0x39d68523,"borogove.persistence.Sqlite.removeAccount","borogove/persistence/Sqlite.hx",1084,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1105_listAccounts,"borogove.persistence.Sqlite","listAccounts",0x9e5f9e8a,"borogove.persistence.Sqlite.listAccounts","borogove/persistence/Sqlite.hx",1105,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1104_listAccounts,"borogove.persistence.Sqlite","listAccounts",0x9e5f9e8a,"borogove.persistence.Sqlite.listAccounts","borogove/persistence/Sqlite.hx",1104,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1113_storeStreamManagement,"borogove.persistence.Sqlite","storeStreamManagement",0x8665337e,"borogove.persistence.Sqlite.storeStreamManagement","borogove/persistence/Sqlite.hx",1113,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1121_storeStreamManagement,"borogove.persistence.Sqlite","storeStreamManagement",0x8665337e,"borogove.persistence.Sqlite.storeStreamManagement","borogove/persistence/Sqlite.hx",1121,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1125_storeStreamManagement,"borogove.persistence.Sqlite","storeStreamManagement",0x8665337e,"borogove.persistence.Sqlite.storeStreamManagement","borogove/persistence/Sqlite.hx",1125,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1134_getStreamManagement,"borogove.persistence.Sqlite","getStreamManagement",0xb922efb3,"borogove.persistence.Sqlite.getStreamManagement","borogove/persistence/Sqlite.hx",1134,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1144_storeService,"borogove.persistence.Sqlite","storeService",0x466dfb3a,"borogove.persistence.Sqlite.storeService","borogove/persistence/Sqlite.hx",1144,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1159_findServicesWithFeature,"borogove.persistence.Sqlite","findServicesWithFeature",0x99a02f73,"borogove.persistence.Sqlite.findServicesWithFeature","borogove/persistence/Sqlite.hx",1159,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1154_findServicesWithFeature,"borogove.persistence.Sqlite","findServicesWithFeature",0x99a02f73,"borogove.persistence.Sqlite.findServicesWithFeature","borogove/persistence/Sqlite.hx",1154,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1178_hydrateReactions,"borogove.persistence.Sqlite","hydrateReactions",0x7d654d7d,"borogove.persistence.Sqlite.hydrateReactions","borogove/persistence/Sqlite.hx",1178,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1206_fetchReactions,"borogove.persistence.Sqlite","fetchReactions",0x688fe376,"borogove.persistence.Sqlite.fetchReactions","borogove/persistence/Sqlite.hx",1206,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1190_fetchReactions,"borogove.persistence.Sqlite","fetchReactions",0x688fe376,"borogove.persistence.Sqlite.fetchReactions","borogove/persistence/Sqlite.hx",1190,0x605e3eb4)
+static const ::String _hx_array_data_99390348_226[] = {
 	HX_("SELECT kind, chat_id, mam_id, mam_by, stanza_id, sender_id, json(reactions) AS reactions FROM reactions WHERE 1=0",d2,04,de,a3),
 };
-static const ::String _hx_array_data_99390348_160[] = {
+static const ::String _hx_array_data_99390348_227[] = {
 	HX_(" OR (mam_id=? AND mam_by=?)",0f,bb,c5,e5),
 };
-static const ::String _hx_array_data_99390348_161[] = {
+static const ::String _hx_array_data_99390348_228[] = {
 	HX_(" OR stanza_id=?",6a,1d,f2,5b),
 };
-static const ::String _hx_array_data_99390348_162[] = {
+static const ::String _hx_array_data_99390348_229[] = {
 	HX_(" ORDER BY created_at, ROWID",00,65,8d,0e),
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_867_hydrateReplyTo,"borogove.persistence.Sqlite","hydrateReplyTo",0xa56a0758,"borogove.persistence.Sqlite.hydrateReplyTo","borogove/persistence/Sqlite.hx",867,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_869_hydrateReplyTo,"borogove.persistence.Sqlite","hydrateReplyTo",0xa56a0758,"borogove.persistence.Sqlite.hydrateReplyTo","borogove/persistence/Sqlite.hx",869,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_836_hydrateReplyTo,"borogove.persistence.Sqlite","hydrateReplyTo",0xa56a0758,"borogove.persistence.Sqlite.hydrateReplyTo","borogove/persistence/Sqlite.hx",836,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_881_hydrateMessages,"borogove.persistence.Sqlite","hydrateMessages",0x24719359,"borogove.persistence.Sqlite.hydrateMessages","borogove/persistence/Sqlite.hx",881,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_884_hydrateMessages,"borogove.persistence.Sqlite","hydrateMessages",0x24719359,"borogove.persistence.Sqlite.hydrateMessages","borogove/persistence/Sqlite.hx",884,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_915_hydrateMessages,"borogove.persistence.Sqlite","hydrateMessages",0x24719359,"borogove.persistence.Sqlite.hydrateMessages","borogove/persistence/Sqlite.hx",915,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_905_hydrateMessages,"borogove.persistence.Sqlite","hydrateMessages",0x24719359,"borogove.persistence.Sqlite.hydrateMessages","borogove/persistence/Sqlite.hx",905,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_923_hydrateCaps,"borogove.persistence.Sqlite","hydrateCaps",0x4e204c2e,"borogove.persistence.Sqlite.hydrateCaps","borogove/persistence/Sqlite.hx",923,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_37_prepare,"borogove.persistence.Sqlite","prepare",0xa1479e61,"borogove.persistence.Sqlite.prepare","borogove/persistence/Sqlite.hx",37,0x605e3eb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_31_boot,"borogove.persistence.Sqlite","boot",0xf1784b18,"borogove.persistence.Sqlite.boot","borogove/persistence/Sqlite.hx",31,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1274_hydrateReplyTo,"borogove.persistence.Sqlite","hydrateReplyTo",0xa56a0758,"borogove.persistence.Sqlite.hydrateReplyTo","borogove/persistence/Sqlite.hx",1274,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1276_hydrateReplyTo,"borogove.persistence.Sqlite","hydrateReplyTo",0xa56a0758,"borogove.persistence.Sqlite.hydrateReplyTo","borogove/persistence/Sqlite.hx",1276,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1243_hydrateReplyTo,"borogove.persistence.Sqlite","hydrateReplyTo",0xa56a0758,"borogove.persistence.Sqlite.hydrateReplyTo","borogove/persistence/Sqlite.hx",1243,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1288_hydrateMessages,"borogove.persistence.Sqlite","hydrateMessages",0x24719359,"borogove.persistence.Sqlite.hydrateMessages","borogove/persistence/Sqlite.hx",1288,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1291_hydrateMessages,"borogove.persistence.Sqlite","hydrateMessages",0x24719359,"borogove.persistence.Sqlite.hydrateMessages","borogove/persistence/Sqlite.hx",1291,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1323_hydrateMessages,"borogove.persistence.Sqlite","hydrateMessages",0x24719359,"borogove.persistence.Sqlite.hydrateMessages","borogove/persistence/Sqlite.hx",1323,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1313_hydrateMessages,"borogove.persistence.Sqlite","hydrateMessages",0x24719359,"borogove.persistence.Sqlite.hydrateMessages","borogove/persistence/Sqlite.hx",1313,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_1331_hydrateCaps,"borogove.persistence.Sqlite","hydrateCaps",0x4e204c2e,"borogove.persistence.Sqlite.hydrateCaps","borogove/persistence/Sqlite.hx",1331,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_41_prepare,"borogove.persistence.Sqlite","prepare",0xa1479e61,"borogove.persistence.Sqlite.prepare","borogove/persistence/Sqlite.hx",41,0x605e3eb4)
+HX_LOCAL_STACK_FRAME(_hx_pos_4648627e4fbfb4d7_34_boot,"borogove.persistence.Sqlite","boot",0xf1784b18,"borogove.persistence.Sqlite.boot","borogove/persistence/Sqlite.hx",34,0x605e3eb4)
 namespace borogove{
 namespace persistence{
 
 void Sqlite_obj::__construct(::String dbfile,::Dynamic media){
-            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_6) HXARGC(1)
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_18) HXARGC(1)
             		::Dynamic _hx_run( ::Dynamic exec){
-            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_5, ::Dynamic,exec) HXARGC(1)
+            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_17, ::Dynamic,exec) HXARGC(1)
             			::Dynamic _hx_run( ::haxe::iterators::ArrayIterator iter){
             				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,exec,int,version) HXARGC(1)
             				::Dynamic _hx_run( ::Dynamic _){
-            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_84_new)
-HXLINE(  85)					if ((version < 1)) {
-HXLINE(  86)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_1,10));
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_87_new)
+HXLINE(  88)					if ((version < 1)) {
+HXLINE(  89)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_2,10));
             					}
-HXLINE( 160)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+HXLINE( 163)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             				}
             				HX_END_LOCAL_FUNC1(return)
 
             				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::Dynamic,exec,int,version) HXARGC(1)
             				::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
-            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_161_new)
-HXLINE( 162)					if ((version < 2)) {
-HXLINE( 163)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_3,4));
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_164_new)
+HXLINE( 165)					if ((version < 2)) {
+HXLINE( 166)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_4,4));
             					}
-HXLINE( 168)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+HXLINE( 171)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             				}
             				HX_END_LOCAL_FUNC1(return)
 
             				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_2, ::Dynamic,exec,int,version) HXARGC(1)
             				::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
-            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_169_new)
-HXLINE( 170)					if ((version < 3)) {
-HXLINE( 171)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_5,2));
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_172_new)
+HXLINE( 173)					if ((version < 3)) {
+HXLINE( 174)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_6,2));
             					}
-HXLINE( 174)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+HXLINE( 177)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             				}
             				HX_END_LOCAL_FUNC1(return)
 
             				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_3, ::Dynamic,exec,int,version) HXARGC(1)
             				::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
-            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_175_new)
-HXLINE( 176)					if ((version < 4)) {
-HXLINE( 177)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_7,2));
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_178_new)
+HXLINE( 179)					if ((version < 4)) {
+HXLINE( 180)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_8,2));
             					}
-HXLINE( 180)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+HXLINE( 183)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             				}
             				HX_END_LOCAL_FUNC1(return)
 
             				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_4, ::Dynamic,exec,int,version) HXARGC(1)
             				::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
-            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_181_new)
-HXLINE( 182)					if ((version < 5)) {
-HXLINE( 183)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_9,2));
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_184_new)
+HXLINE( 185)					if ((version < 5)) {
+HXLINE( 186)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_10,2));
+            					}
+HXLINE( 189)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_5, ::Dynamic,exec,int,version) HXARGC(1)
+            				::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_190_new)
+HXLINE( 191)					if ((version < 6)) {
+HXLINE( 192)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_12,2));
+            					}
+HXLINE( 195)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_6, ::Dynamic,exec,int,version) HXARGC(1)
+            				::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_196_new)
+HXLINE( 197)					if ((version < 7)) {
+HXLINE( 198)						return exec(::Array_obj< ::String >::__new(3)->init(0,HX_("DELETE FROM messages WHERE rowid IN (SELECT rowid FROM (select rowid, ROW_NUMBER() OVER (PARTITION BY account_id, stanza_id ORDER BY (mam_id <> '') DESC, rowid DESC) AS rn FROM messages WHERE direction=1 AND stanza_id<>'') WHERE rn<>1)",a7,3d,cf,20))->init(1,(HX_("CREATE UNIQUE INDEX messages_stanza_id_sent_unique ON messages (account_id, stanza_id) WHERE stanza_id<>'' AND direction=",9b,b1,a7,f0) + HX_("1",31,00,00,00)))->init(2,HX_("PRAGMA user_version = 7",3c,cd,bd,7c)));
+            					}
+HXLINE( 202)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_12, ::Dynamic,exec,int,version) HXARGC(1)
+            				::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_203_new)
+HXLINE( 204)					if ((version < 8)) {
+            						HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_7, ::Dynamic,exec) HXARGC(1)
+            						::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            							HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_207_new)
+HXLINE( 207)							return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_16,1));
+            						}
+            						HX_END_LOCAL_FUNC1(return)
+
+            						HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_10, ::Dynamic,exec) HXARGC(1)
+            						::Dynamic _hx_run( ::haxe::iterators::ArrayIterator rows){
+            							HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_9, ::Dynamic,exec,::Array< ::Dynamic>,toInsert) HXARGC(1)
+            							::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            								HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_220_new)
+HXLINE( 220)								if ((toInsert->__get(0).StaticCast< ::Array< ::String > >()->length < 1)) {
+HXLINE( 220)									return null();
+            								}
+            								else {
+HXLINE( 220)									return exec(toInsert->__get(0).StaticCast< ::Array< ::String > >());
+            								}
+            							}
+            							HX_END_LOCAL_FUNC1(return)
+
+            							HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_208_new)
+HXLINE( 209)							::Dynamic promise = ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+HXLINE( 210)							::Array< ::Dynamic> toInsert = ::Array_obj< ::Dynamic>::__new(1)->init(0,::Array_obj< ::String >::__new(0));
+HXLINE( 211)							::String sortId = HX_("a ",9f,54,00,00);
+HXLINE( 212)							while((rows->current < rows->array->get_length())){
+HXLINE( 212)								 ::Dynamic row = rows->array->__get(rows->current++);
+HXLINE( 213)								sortId = ::_FractionalIndexing::FractionalIndexing_Fields__obj::between(sortId,null(),HX_(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",6f,61,48,0a));
+HXLINE( 214)								::Array< ::String > toInsert1 = toInsert->__get(0).StaticCast< ::Array< ::String > >();
+HXDLIN( 214)								::String _hx_tmp = ((HX_("UPDATE messages SET sort_id='",6b,00,c7,78) + ::StringTools_obj::replace(sortId,HX_("'",27,00,00,00),HX_("''",20,22,00,00))) + HX_("' WHERE ROWID=",1a,f5,65,79));
+HXDLIN( 214)								toInsert1->push( ::Dynamic((_hx_tmp + row->__Field(HX_("rowid",75,78,67,ed),::hx::paccDynamic))));
+HXLINE( 215)								if ((toInsert->__get(0).StaticCast< ::Array< ::String > >()->length >= 10000)) {
+            									HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_8, ::Dynamic,exec,::Array< ::Dynamic>,toInsert) HXARGC(1)
+            									::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            										HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_216_new)
+HXLINE( 216)										return exec(toInsert->__get(0).StaticCast< ::Array< ::String > >());
+            									}
+            									HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 216)									promise = ::thenshim::_Promise::Promise_Impl__obj::then(promise, ::Dynamic(new _hx_Closure_8(exec,toInsert)),null());
+HXLINE( 217)									toInsert[0] = ::Array_obj< ::String >::__new(0);
+            								}
+            							}
+HXLINE( 220)							return ::thenshim::_Promise::Promise_Impl__obj::then(promise, ::Dynamic(new _hx_Closure_9(exec,toInsert)),null());
+            						}
+            						HX_END_LOCAL_FUNC1(return)
+
+            						HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_11, ::Dynamic,exec) HXARGC(1)
+            						::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            							HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_222_new)
+HXLINE( 222)							return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_21,1));
+            						}
+            						HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 205)						return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_22,2)), ::Dynamic(new _hx_Closure_7(exec)),null()), ::Dynamic(new _hx_Closure_10(exec)),null()), ::Dynamic(new _hx_Closure_11(exec)),null());
+            					}
+HXLINE( 225)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_13, ::Dynamic,exec,int,version) HXARGC(1)
+            				::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_226_new)
+HXLINE( 227)					if ((version < 9)) {
+HXLINE( 229)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_24,2));
+            					}
+HXLINE( 232)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_14, ::Dynamic,exec,int,version) HXARGC(1)
+            				::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_233_new)
+HXLINE( 234)					if ((version < 10)) {
+HXLINE( 235)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_26,2));
+            					}
+HXLINE( 238)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_15, ::Dynamic,exec,int,version) HXARGC(1)
+            				::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_239_new)
+HXLINE( 240)					if ((version < 11)) {
+HXLINE( 241)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_28,4));
+            					}
+HXLINE( 258)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_16, ::Dynamic,exec,int,version) HXARGC(1)
+            				::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_259_new)
+HXLINE( 260)					if ((version < 12)) {
+HXLINE( 261)						return exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_30,2));
             					}
-HXLINE( 186)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+HXLINE( 264)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             				}
             				HX_END_LOCAL_FUNC1(return)
 
-            				HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_82_new)
-HXLINE(  83)				int version;
-HXDLIN(  83)				 ::Dynamic tmp = iter->array->__get(iter->current++);
-HXDLIN(  83)				 ::Dynamic tmp1;
-HXDLIN(  83)				if (::hx::IsNotNull( tmp )) {
-HXLINE(  83)					tmp1 =  ::Dynamic(tmp->__Field(HX_("user_version",e4,95,f3,73),::hx::paccDynamic));
+            				HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_85_new)
+HXLINE(  86)				int version;
+HXDLIN(  86)				 ::Dynamic tmp = iter->array->__get(iter->current++);
+HXDLIN(  86)				 ::Dynamic tmp1;
+HXDLIN(  86)				if (::hx::IsNotNull( tmp )) {
+HXLINE(  86)					tmp1 =  ::Dynamic(tmp->__Field(HX_("user_version",e4,95,f3,73),::hx::paccDynamic));
             				}
             				else {
-HXLINE(  83)					tmp1 = null();
+HXLINE(  86)					tmp1 = null();
             				}
-HXDLIN(  83)				 ::Dynamic tmp2 = ::Std_obj::parseInt(( (::String)(tmp1) ));
-HXDLIN(  83)				if (::hx::IsNotNull( tmp2 )) {
-HXLINE(  83)					version = ( (int)(tmp2) );
+HXDLIN(  86)				 ::Dynamic tmp2 = ::Std_obj::parseInt(( (::String)(tmp1) ));
+HXDLIN(  86)				if (::hx::IsNotNull( tmp2 )) {
+HXLINE(  86)					version = ( (int)(tmp2) );
             				}
             				else {
-HXLINE(  83)					version = 0;
+HXLINE(  86)					version = 0;
             				}
-HXLINE(  84)				return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::resolve(null()), ::Dynamic(new _hx_Closure_0(exec,version)),null()), ::Dynamic(new _hx_Closure_1(exec,version)),null()), ::Dynamic(new _hx_Closure_2(exec,version)),null()), ::Dynamic(new _hx_Closure_3(exec,version)),null()), ::Dynamic(new _hx_Closure_4(exec,version)),null());
+HXLINE(  87)				return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::resolve(null()), ::Dynamic(new _hx_Closure_0(exec,version)),null()), ::Dynamic(new _hx_Closure_1(exec,version)),null()), ::Dynamic(new _hx_Closure_2(exec,version)),null()), ::Dynamic(new _hx_Closure_3(exec,version)),null()), ::Dynamic(new _hx_Closure_4(exec,version)),null()), ::Dynamic(new _hx_Closure_5(exec,version)),null()), ::Dynamic(new _hx_Closure_6(exec,version)),null()), ::Dynamic(new _hx_Closure_12(exec,version)),null()), ::Dynamic(new _hx_Closure_13(exec,version)),null()), ::Dynamic(new _hx_Closure_14(exec,version)),null()), ::Dynamic(new _hx_Closure_15(exec,version)),null()), ::Dynamic(new _hx_Closure_16(exec,version)),null());
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_81_new)
-HXLINE(  81)			return ::thenshim::_Promise::Promise_Impl__obj::then(exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_12,1)), ::Dynamic(new _hx_Closure_5(exec)),null());
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_84_new)
+HXLINE(  84)			return ::thenshim::_Promise::Promise_Impl__obj::then(exec(::Array_obj< ::String >::fromData( _hx_array_data_99390348_33,1)), ::Dynamic(new _hx_Closure_17(exec)),null());
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_31_new)
-HXLINE( 709)		this->smStoreNext = null();
-HXLINE( 708)		this->smStoreInProgress = false;
-HXLINE( 236)		this->storeChatTimer = null();
-HXLINE( 235)		this->storeChatBuffer =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE(  79)		this->media = media;
-HXLINE(  80)		::borogove::persistence::MediaStore_obj::setKV(media,::hx::ObjectPtr<OBJ_>(this));
-HXLINE(  81)		this->db =  ::borogove::persistence::SqliteDriver_obj::__alloc( HX_CTX ,dbfile, ::Dynamic(new _hx_Closure_6()));
+            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_34_new)
+HXLINE(1111)		this->smStoreIdNext = HX_("a ",9f,54,00,00);
+HXLINE(1110)		this->smStoreNext = null();
+HXLINE(1109)		this->smStoreInProgress = false;
+HXLINE( 305)		this->storeChatTimer = null();
+HXLINE( 304)		this->storeChatBuffer =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(  37)		this->storeMessagesSerialized =  ::borogove::AsyncLock_obj::__alloc( HX_CTX );
+HXLINE(  82)		this->media = media;
+HXLINE(  83)		::borogove::persistence::MediaStore_obj::setKV(media,::hx::ObjectPtr<OBJ_>(this));
+HXLINE(  84)		this->db =  ::borogove::persistence::SqliteDriver_obj::__alloc( HX_CTX ,dbfile, ::Dynamic(new _hx_Closure_18()));
             	}
 
 Dynamic Sqlite_obj::__CreateEmpty() { return new Sqlite_obj; }
@@ -410,28 +634,33 @@ bool Sqlite_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 static ::borogove::Persistence_obj _hx_borogove_persistence_Sqlite__hx_borogove_Persistence= {
-	( ::Dynamic (::hx::Object::*)(::String,::String))&::borogove::persistence::Sqlite_obj::lastId,
+	( ::Dynamic (::hx::Object::*)(::String,::String))&::borogove::persistence::Sqlite_obj::syncPoint,
 	( void (::hx::Object::*)(::String,::Array< ::Dynamic>))&::borogove::persistence::Sqlite_obj::storeChats,
 	( ::Dynamic (::hx::Object::*)(::String))&::borogove::persistence::Sqlite_obj::getChats,
+	( ::Dynamic (::hx::Object::*)(::String,::String,::Array< ::Dynamic>))&::borogove::persistence::Sqlite_obj::storeMembers,
+	( ::Dynamic (::hx::Object::*)(::String, ::borogove::Chat,::Array< ::Dynamic>,bool))&::borogove::persistence::Sqlite_obj::storeMemberUpdates,
+	( ::Dynamic (::hx::Object::*)(::String,::String))&::borogove::persistence::Sqlite_obj::clearMemberPresence,
+	( ::Dynamic (::hx::Object::*)(::String, ::borogove::Chat,bool))&::borogove::persistence::Sqlite_obj::getMembers,
+	( ::Dynamic (::hx::Object::*)(::String, ::borogove::Chat,::Array< ::String >))&::borogove::persistence::Sqlite_obj::getMemberDetails,
 	( ::Dynamic (::hx::Object::*)(::String,::Array< ::Dynamic>))&::borogove::persistence::Sqlite_obj::getChatsUnreadDetails,
 	( ::Dynamic (::hx::Object::*)(::String, ::borogove::ReactionUpdate))&::borogove::persistence::Sqlite_obj::storeReaction,
 	( ::Dynamic (::hx::Object::*)(::String,::Array< ::Dynamic>))&::borogove::persistence::Sqlite_obj::storeMessages,
 	( void (::hx::Object::*)(::String, ::borogove::ChatMessage))&::borogove::persistence::Sqlite_obj::updateMessage,
 	( ::Dynamic (::hx::Object::*)(::String,::String,int,::String))&::borogove::persistence::Sqlite_obj::updateMessageStatus,
 	( ::Dynamic (::hx::Object::*)(::String,::String,::String,::String))&::borogove::persistence::Sqlite_obj::getMessage,
-	( ::Dynamic (::hx::Object::*)(::String,::String,::String,::String))&::borogove::persistence::Sqlite_obj::getMessagesBefore,
-	( ::Dynamic (::hx::Object::*)(::String,::String,::String,::String))&::borogove::persistence::Sqlite_obj::getMessagesAfter,
-	( ::Dynamic (::hx::Object::*)(::String,::String,::String,::String))&::borogove::persistence::Sqlite_obj::getMessagesAround,
+	( ::Dynamic (::hx::Object::*)(::String,::String, ::borogove::ChatMessage))&::borogove::persistence::Sqlite_obj::getMessagesBefore,
+	( ::Dynamic (::hx::Object::*)(::String,::String, ::borogove::ChatMessage))&::borogove::persistence::Sqlite_obj::getMessagesAfter,
+	( ::Dynamic (::hx::Object::*)(::String, ::borogove::ChatMessage))&::borogove::persistence::Sqlite_obj::getMessagesAround,
 	( ::Dynamic (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::Sqlite_obj::hasMedia,
 	( ::Dynamic (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::Sqlite_obj::storeMedia,
-	( void (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::Sqlite_obj::removeMedia,
+	( ::Dynamic (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::Sqlite_obj::removeMedia,
 	( void (::hx::Object::*)( ::borogove::Caps))&::borogove::persistence::Sqlite_obj::storeCaps,
 	( ::Dynamic (::hx::Object::*)(::String))&::borogove::persistence::Sqlite_obj::getCaps,
-	( void (::hx::Object::*)(::String,::String,::String,::String))&::borogove::persistence::Sqlite_obj::storeLogin,
+	( ::Dynamic (::hx::Object::*)(::String,::String,::String,::String))&::borogove::persistence::Sqlite_obj::storeLogin,
 	( ::Dynamic (::hx::Object::*)(::String))&::borogove::persistence::Sqlite_obj::getLogin,
-	( void (::hx::Object::*)(::String,bool))&::borogove::persistence::Sqlite_obj::removeAccount,
+	( ::Dynamic (::hx::Object::*)(::String,bool))&::borogove::persistence::Sqlite_obj::removeAccount,
 	( ::Dynamic (::hx::Object::*)())&::borogove::persistence::Sqlite_obj::listAccounts,
-	( void (::hx::Object::*)(::String,::Array< unsigned char >))&::borogove::persistence::Sqlite_obj::storeStreamManagement,
+	( ::Dynamic (::hx::Object::*)(::String,::Array< unsigned char >,::String))&::borogove::persistence::Sqlite_obj::storeStreamManagement,
 	( ::Dynamic (::hx::Object::*)(::String))&::borogove::persistence::Sqlite_obj::getStreamManagement,
 	( void (::hx::Object::*)(::String,::String,::String,::String, ::borogove::Caps))&::borogove::persistence::Sqlite_obj::storeService,
 	( ::Dynamic (::hx::Object::*)(::String,::String))&::borogove::persistence::Sqlite_obj::findServicesWithFeature,
@@ -457,766 +686,1494 @@ void *Sqlite_obj::_hx_getInterface(int inHash) {
 ::Dynamic Sqlite_obj::get(::String k){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		::Dynamic _hx_run( ::haxe::iterators::ArrayIterator iter){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_194_get)
-HXLINE( 195)			while((iter->current < iter->array->get_length())){
-HXLINE( 196)				return  ::Dynamic(iter->array->__get(iter->current++)->__Field(HX_("v",76,00,00,00),::hx::paccDynamic));
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_272_get)
+HXLINE( 273)			while((iter->current < iter->array->get_length())){
+HXLINE( 274)				return  ::Dynamic(iter->array->__get(iter->current++)->__Field(HX_("v",76,00,00,00),::hx::paccDynamic));
             			}
-HXLINE( 198)			return null();
+HXLINE( 276)			return null();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_194_get)
-HXDLIN( 194)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT v FROM keyvaluepairs WHERE k=? LIMIT 1",5f,f1,14,07),::cpp::VirtualArray_obj::__new(1)->init(0,k)), ::Dynamic(new _hx_Closure_0()),null());
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_272_get)
+HXDLIN( 272)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT v FROM keyvaluepairs WHERE k=? LIMIT 1",5f,f1,14,07),::cpp::VirtualArray_obj::__new(1)->init(0,k)), ::Dynamic(new _hx_Closure_0()),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Sqlite_obj,get,return )
 
 ::Dynamic Sqlite_obj::set(::String k,::String v){
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_204_set)
-HXDLIN( 204)		if (::hx::IsNull( v )) {
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_282_set)
+HXDLIN( 282)		if (::hx::IsNull( v )) {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             			bool _hx_run( ::haxe::iterators::ArrayIterator _){
-            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_205_set)
-HXLINE( 205)				return true;
+            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_283_set)
+HXLINE( 283)				return true;
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 205)			return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("DELETE FROM keyvaluepairs WHERE k=?",1a,ab,19,78),::cpp::VirtualArray_obj::__new(1)->init(0,k)), ::Dynamic(new _hx_Closure_0()),null());
+HXLINE( 283)			return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("DELETE FROM keyvaluepairs WHERE k=?",1a,ab,19,78),::cpp::VirtualArray_obj::__new(1)->init(0,k)), ::Dynamic(new _hx_Closure_0()),null());
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             			bool _hx_run( ::haxe::iterators::ArrayIterator _){
-            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_207_set)
-HXLINE( 207)				return true;
+            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_285_set)
+HXLINE( 285)				return true;
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 207)			return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("INSERT OR REPLACE INTO keyvaluepairs VALUES (?,?)",18,81,b5,d3),::cpp::VirtualArray_obj::__new(2)->init(0,k)->init(1,v)), ::Dynamic(new _hx_Closure_1()),null());
+HXLINE( 285)			return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("INSERT OR REPLACE INTO keyvaluepairs VALUES (?,?)",18,81,b5,d3),::cpp::VirtualArray_obj::__new(2)->init(0,k)->init(1,v)), ::Dynamic(new _hx_Closure_1()),null());
             		}
-HXLINE( 204)		return null();
+HXLINE( 282)		return null();
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,set,return )
 
-::Dynamic Sqlite_obj::lastId(::String accountId,::String chatId){
-            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
-            		::String _hx_run( ::haxe::iterators::ArrayIterator iter){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_232_lastId)
-HXLINE( 232)			 ::Dynamic tmp = iter->array->__get(iter->current++);
-HXDLIN( 232)			 ::Dynamic _hx_tmp;
-HXDLIN( 232)			if (::hx::IsNotNull( tmp )) {
-HXLINE( 232)				_hx_tmp =  ::Dynamic(tmp->__Field(HX_("mam_id",01,4d,19,b7),::hx::paccDynamic));
-            			}
-            			else {
-HXLINE( 232)				_hx_tmp = null();
-            			}
-HXDLIN( 232)			return ::hx::TCast< ::String >::cast(_hx_tmp);
+::Dynamic Sqlite_obj::syncPoint(::String accountId,::String chatId){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
+            		 ::borogove::ChatMessage _hx_run( ::haxe::iterators::ArrayIterator result){
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_301_syncPoint)
+HXLINE( 301)			return _gthis->hydrateMessages(accountId,result)->__get(0).StaticCast<  ::borogove::ChatMessage >();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_212_lastId)
-HXLINE( 213)		::Array< ::String > params = ::Array_obj< ::String >::__new(1)->init(0,accountId);
-HXLINE( 214)		::String q = HX_("SELECT mam_id, MAX(row) FROM (SELECT mam_id, ROWID as row FROM messages",4c,29,a4,9b);
-HXLINE( 215)		if (::hx::IsNull( chatId )) {
-HXLINE( 217)			q = (HX_("SELECT mam_id, MAX(row) FROM (SELECT mam_id, ROWID as row FROM messages",4c,29,a4,9b) + HX_(" NOT INDEXED",84,47,c5,90));
-            		}
-HXLINE( 219)		q = (q + HX_(" WHERE mam_id IS NOT NULL AND sync_point AND account_id=?",87,3d,51,a9));
-HXLINE( 220)		if (::hx::IsNull( chatId )) {
-HXLINE( 221)			q = (q + HX_(" AND mam_by=?",48,20,9b,c4));
-HXLINE( 222)			params->push(accountId);
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_290_syncPoint)
+HXDLIN( 290)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 291)		::Array< ::String > params = ::Array_obj< ::String >::__new(1)->init(0,accountId);
+HXLINE( 292)		::String q = HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sync_point, sort_id FROM messages WHERE mam_id IS NOT NULL AND mam_id<>'' AND sync_point AND account_id=?",a9,47,05,54);
+HXLINE( 293)		if (::hx::IsNull( chatId )) {
+HXLINE( 294)			q = (HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sync_point, sort_id FROM messages WHERE mam_id IS NOT NULL AND mam_id<>'' AND sync_point AND account_id=?",a9,47,05,54) + HX_(" AND mam_by=?",48,20,9b,c4));
+HXLINE( 295)			params->push(accountId);
             		}
             		else {
-HXLINE( 224)			q = (q + HX_(" AND chat_id=?",3b,95,e7,43));
-HXLINE( 225)			params->push(chatId);
-            		}
-HXLINE( 227)		if (::hx::IsNotNull( chatId )) {
-HXLINE( 229)			q = (q + HX_(" ORDER BY created_at DESC LIMIT 1000",94,4b,2a,00));
+HXLINE( 297)			q = (HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sync_point, sort_id FROM messages WHERE mam_id IS NOT NULL AND mam_id<>'' AND sync_point AND account_id=?",a9,47,05,54) + HX_(" AND mam_by=?",48,20,9b,c4));
+HXLINE( 298)			params->push(chatId);
             		}
-HXLINE( 231)		q = (q + HX_(")",29,00,00,00));
-HXLINE( 232)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(q,params), ::Dynamic(new _hx_Closure_0()),null());
+HXLINE( 300)		q = (q + HX_(" ORDER BY sort_id DESC LIMIT 1",78,bf,6d,71));
+HXLINE( 301)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(q,params), ::Dynamic(new _hx_Closure_0(_gthis,accountId)),null());
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,lastId,return )
+HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,syncPoint,return )
 
 void Sqlite_obj::storeChats(::String accountId,::Array< ::Dynamic> chats){
-            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(0)
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_2, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(0)
             		void _hx_run(){
-            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis) HXARGC(1)
-            			 ::Dynamic _hx_run( ::borogove::Chat chat){
-            				HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_249_storeChats)
-HXLINE( 250)				 ::Dynamic storePresence =  ::Dynamic(::hx::Anon_obj::Create(0));
-HXLINE( 251)				 ::haxe::ds::ObjectMap caps =  ::haxe::ds::ObjectMap_obj::__alloc( HX_CTX );
-HXLINE( 252)				{
-HXLINE( 252)					::Dynamic this1 = chat->presence;
-HXDLIN( 252)					 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(this1);
-HXDLIN( 252)					while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 252)						::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXDLIN( 252)						 ::borogove::Presence _g_value = ( ( ::borogove::Presence)(::haxe::IMap_obj::get(this1,key)) );
-HXDLIN( 252)						{
-HXLINE( 253)							::String mapPresence;
-HXDLIN( 253)							if (::hx::IsNotNull( key )) {
-HXLINE( 253)								mapPresence = key;
-            							}
-            							else {
-HXLINE( 253)								mapPresence = HX_("",00,00,00,00);
-            							}
-HXDLIN( 253)							if (::hx::IsNull( ::Reflect_obj::field(storePresence,mapPresence) )) {
-HXLINE( 253)								::String mapPresence1;
-HXDLIN( 253)								if (::hx::IsNotNull( key )) {
-HXLINE( 253)									mapPresence1 = key;
-            								}
-            								else {
-HXLINE( 253)									mapPresence1 = HX_("",00,00,00,00);
-            								}
-HXDLIN( 253)								::Reflect_obj::setField(storePresence,mapPresence1, ::Dynamic(::hx::Anon_obj::Create(0)));
-            							}
-HXLINE( 254)							if (::hx::IsNotNull( _g_value->caps )) {
-HXLINE( 255)								{
-HXLINE( 255)									::Array< unsigned char > k = _g_value->caps->verRaw()->hash;
-HXDLIN( 255)									caps->set(k,_g_value->caps);
-            								}
-HXLINE( 256)								::String mapPresence2;
-HXDLIN( 256)								if (::hx::IsNotNull( key )) {
-HXLINE( 256)									mapPresence2 = key;
-            								}
-            								else {
-HXLINE( 256)									mapPresence2 = HX_("",00,00,00,00);
-            								}
-HXDLIN( 256)								::Reflect_obj::field(storePresence,mapPresence2)->__SetField(HX_("caps",21,1c,ba,41),_g_value->caps->ver(),::hx::paccDynamic);
-            							}
-HXLINE( 258)							if (::hx::IsNotNull( _g_value->mucUser )) {
-HXLINE( 259)								::String mapPresence3;
-HXDLIN( 259)								if (::hx::IsNotNull( key )) {
-HXLINE( 259)									mapPresence3 = key;
-            								}
-            								else {
-HXLINE( 259)									mapPresence3 = HX_("",00,00,00,00);
-            								}
-HXDLIN( 259)								::Reflect_obj::field(storePresence,mapPresence3)->__SetField(HX_("mucUser",e6,f3,96,b5),_g_value->mucUser->toString(),::hx::paccDynamic);
-            							}
-HXLINE( 261)							if (::hx::IsNotNull( _g_value->avatarHash )) {
-HXLINE( 262)								::String mapPresence4;
-HXDLIN( 262)								if (::hx::IsNotNull( key )) {
-HXLINE( 262)									mapPresence4 = key;
-            								}
-            								else {
-HXLINE( 262)									mapPresence4 = HX_("",00,00,00,00);
-            								}
-HXDLIN( 262)								::Reflect_obj::field(storePresence,mapPresence4)->__SetField(HX_("avatarHash",87,5c,82,37),_g_value->avatarHash->serializeUri(),::hx::paccDynamic);
-            							}
-            						}
-            					}
-            				}
-HXLINE( 265)				_gthis->storeCapsSet(caps);
-HXLINE( 266)				return storePresence;
-            			}
-            			HX_END_LOCAL_FUNC1(return)
-
-            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_248_storeChats)
-HXLINE( 249)			 ::Dynamic mapPresence =  ::Dynamic(new _hx_Closure_0(_gthis));
-HXLINE( 268)			 ::StringBuf q =  ::StringBuf_obj::__alloc( HX_CTX );
-HXLINE( 269)			{
-HXLINE( 269)				if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 269)					q->flush();
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_317_storeChats)
+HXLINE( 318)			 ::StringBuf q =  ::StringBuf_obj::__alloc( HX_CTX );
+HXLINE( 319)			{
+HXLINE( 319)				if (::hx::IsNotNull( q->charBuf )) {
+HXLINE( 319)					q->flush();
             				}
-HXDLIN( 269)				if (::hx::IsNull( q->b )) {
-HXLINE( 269)					q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_30,1);
+HXDLIN( 319)				if (::hx::IsNull( q->b )) {
+HXLINE( 319)					q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_50,1);
             				}
             				else {
-HXLINE( 269)					q->b->push(HX_("INSERT OR REPLACE INTO chats VALUES ",3b,7d,10,d4));
+HXLINE( 319)					q->b->push(HX_("INSERT OR REPLACE INTO chats VALUES ",3b,7d,10,d4));
             				}
             			}
-HXLINE( 270)			bool first = true;
-HXLINE( 271)			{
-HXLINE( 271)				 ::Dynamic _ = _gthis->storeChatBuffer->iterator();
-HXDLIN( 271)				while(( (bool)(_->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 271)					_->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
-HXLINE( 272)					if (!(first)) {
-HXLINE( 272)						if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 272)							q->flush();
+HXLINE( 320)			bool first = true;
+HXLINE( 321)			{
+HXLINE( 321)				 ::Dynamic _ = _gthis->storeChatBuffer->iterator();
+HXDLIN( 321)				while(( (bool)(_->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 321)					_->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
+HXLINE( 322)					if (!(first)) {
+HXLINE( 322)						if (::hx::IsNotNull( q->charBuf )) {
+HXLINE( 322)							q->flush();
             						}
-HXDLIN( 272)						if (::hx::IsNull( q->b )) {
-HXLINE( 272)							q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_31,1);
+HXDLIN( 322)						if (::hx::IsNull( q->b )) {
+HXLINE( 322)							q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_51,1);
             						}
             						else {
-HXLINE( 272)							q->b->push(HX_(",",2c,00,00,00));
+HXLINE( 322)							q->b->push(HX_(",",2c,00,00,00));
             						}
             					}
-HXLINE( 273)					first = false;
-HXLINE( 274)					{
-HXLINE( 274)						if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 274)							q->flush();
+HXLINE( 323)					first = false;
+HXLINE( 324)					{
+HXLINE( 324)						if (::hx::IsNotNull( q->charBuf )) {
+HXLINE( 324)							q->flush();
             						}
-HXDLIN( 274)						if (::hx::IsNull( q->b )) {
-HXLINE( 274)							q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_32,1);
+HXDLIN( 324)						if (::hx::IsNull( q->b )) {
+HXLINE( 324)							q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_52,1);
             						}
             						else {
-HXLINE( 274)							q->b->push(HX_("(?,?,?,?,?,?,?,?,?,?,?,jsonb(?),?,?,?,?)",4e,16,2e,3d));
-            						}
-            					}
-            				}
-            			}
-HXLINE( 276)			 ::borogove::persistence::SqliteDriver _gthis1 = _gthis->db;
-HXLINE( 277)			::String _hx_tmp = q->toString();
-HXLINE( 278)			::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 278)			{
-HXLINE( 278)				 ::Dynamic x = _gthis->storeChatBuffer->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 278)				while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 278)					 ::borogove::Chat x1 = ( ( ::borogove::Chat)(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXLINE( 279)					 ::borogove::Channel channel = ( ( ::borogove::Channel)(::Std_obj::downcast(x1,::hx::ClassOf< ::borogove::Channel >())) );
-HXLINE( 280)					if (::hx::IsNotNull( channel )) {
-HXLINE( 280)						_gthis->storeCaps(channel->disco);
-            					}
-HXLINE( 282)					::String accountId1 = accountId;
-HXDLIN( 282)					::String x2 = x1->chatId;
-HXDLIN( 282)					bool row = x1->isTrusted();
-HXDLIN( 282)					::Array< unsigned char > x3 = x1->avatarSha1;
-HXLINE( 283)					::String row1 = x1->getDisplayName();
-HXDLIN( 283)					int x4 = x1->uiState;
-HXDLIN( 283)					bool x5 = x1->isBlocked;
-HXLINE( 284)					::String row2 = x1->extensions->toString();
-HXDLIN( 284)					::String row3 = x1->readUpTo();
-HXDLIN( 284)					::String x6 = x1->readUpToBy;
-HXLINE( 285)					 ::borogove::Caps tmp;
-HXDLIN( 285)					if (::hx::IsNotNull( channel )) {
-HXLINE( 285)						tmp = channel->disco;
+HXLINE( 324)							q->b->push(HX_("(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,jsonb(?))",f9,da,31,c1));
+            						}
+            					}
+            				}
+            			}
+HXLINE( 326)			 ::borogove::persistence::SqliteDriver _gthis1 = _gthis->db;
+HXLINE( 327)			::String _hx_tmp = q->toString();
+HXLINE( 328)			::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 328)			{
+HXLINE( 328)				 ::Dynamic x = _gthis->storeChatBuffer->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 328)				while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 328)					 ::borogove::Chat x1 = ( ( ::borogove::Chat)(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXLINE( 329)					 ::borogove::Channel channel = ( ( ::borogove::Channel)(::Std_obj::downcast(x1,::hx::ClassOf< ::borogove::Channel >())) );
+HXLINE( 330)					if (::hx::IsNotNull( channel )) {
+HXLINE( 330)						_gthis->storeCaps(channel->disco);
+            					}
+HXLINE( 332)					::String accountId1 = accountId;
+HXDLIN( 332)					::String x2 = x1->chatId;
+HXDLIN( 332)					bool row = x1->isTrusted();
+HXDLIN( 332)					::Array< unsigned char > x3 = x1->avatarSha1;
+HXLINE( 333)					::String row1 = x1->getDisplayName();
+HXDLIN( 333)					int x4 = x1->uiState;
+HXDLIN( 333)					bool x5 = x1->isBlocked;
+HXLINE( 334)					::String row2 = x1->extensions->toString();
+HXDLIN( 334)					::String x6 = x1->readUpToId;
+HXDLIN( 334)					::String x7 = x1->readUpToBy;
+HXLINE( 335)					 ::borogove::Caps tmp;
+HXDLIN( 335)					if (::hx::IsNotNull( channel )) {
+HXLINE( 335)						tmp = channel->disco;
+            					}
+            					else {
+HXLINE( 335)						tmp = null();
+            					}
+HXDLIN( 335)					::Array< unsigned char > row3;
+HXDLIN( 335)					if (::hx::IsNotNull( tmp )) {
+HXLINE( 335)						row3 = tmp->verRaw()->hash;
             					}
             					else {
-HXLINE( 285)						tmp = null();
+HXLINE( 335)						row3 = null();
             					}
-HXDLIN( 285)					::Array< unsigned char > row4;
-HXDLIN( 285)					if (::hx::IsNotNull( tmp )) {
-HXLINE( 285)						row4 = tmp->verRaw()->hash;
+HXLINE( 336)					::String row4 = ( (::String)(::Type_obj::getClassName(::Type_obj::getClass(x1)).split(HX_(".",2e,00,00,00))->pop()) );
+HXLINE( 337)					bool row5 = x1->notificationsFiltered();
+HXDLIN( 337)					bool row6 = x1->notifyMention();
+HXDLIN( 337)					bool row7 = x1->notifyReply();
+HXLINE( 338)					bool x8 = x1->isBookmarked;
+HXLINE( 339)					 ::Dynamic row8 =  ::Dynamic(::hx::Anon_obj::Create(2)
+            						->setFixed(0,HX_("text",ad,cc,f9,4c),x1->status->text)
+            						->setFixed(1,HX_("emoji",86,6f,d9,6f),x1->status->emoji));
+HXLINE( 340)					::String row9;
+HXDLIN( 340)					if (::hx::IsNotNull( channel )) {
+HXLINE( 340)						row9 = channel->mavUntil;
             					}
             					else {
-HXLINE( 285)						row4 = null();
+HXLINE( 340)						row9 = null();
             					}
-HXDLIN( 285)					 ::Dynamic replacer = null();
-HXDLIN( 285)					::String space = null();
-HXDLIN( 285)					::String row5 = ::haxe::format::JsonPrinter_obj::print(mapPresence(x1),replacer,space);
-HXLINE( 286)					::String row6 = ( (::String)(::Type_obj::getClassName(::Type_obj::getClass(x1)).split(HX_(".",2e,00,00,00))->pop()) );
-HXLINE( 287)					bool row7 = x1->notificationsFiltered();
-HXDLIN( 287)					bool row8 = x1->notifyMention();
-HXLINE( 278)					_g->push(::cpp::VirtualArray_obj::__new(16)->init(0,accountId1)->init(1,x2)->init(2,row)->init(3,x3)->init(4,row1)->init(5,x4)->init(6,x5)->init(7,row2)->init(8,row3)->init(9,x6)->init(10,row4)->init(11,row5)->init(12,row6)->init(13,row7)->init(14,row8)->init(15,x1->notifyReply()));
+HXLINE( 342)					 ::Dynamic t =  ::Dynamic(::hx::Anon_obj::Create(0));
+HXLINE( 343)					{
+            						HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0,::Array< ::Dynamic>,iter_keys) HXARGC(0)
+            						bool _hx_run(){
+            							HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_343_storeChats)
+HXLINE( 343)							return ( (bool)(iter_keys->__get(0)->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) );
+            						}
+            						HX_END_LOCAL_FUNC0(return)
+
+            						HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::Array< ::Dynamic>,iter_map,::Array< ::Dynamic>,iter_keys) HXARGC(0)
+            						 ::Dynamic _hx_run(){
+            							HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_343_storeChats)
+HXLINE( 343)							::String key = ( (::String)(iter_keys->__get(0)->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN( 343)							 ::Dynamic v =  ::Dynamic(::hx::Anon_obj::Create(2)
+            								->setFixed(0,HX_("key",9f,89,51,00),key)
+            								->setFixed(1,HX_("value",71,7f,b8,31),( (::String)(::haxe::IMap_obj::get(iter_map->__get(0),key)) )));
+HXDLIN( 343)							if (::hx::IsEq( v->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic),::borogove::_Chat::Chat_Fields__obj::nullSentinel )) {
+HXLINE( 343)								return  ::Dynamic(::hx::Anon_obj::Create(2)
+            									->setFixed(0,HX_("key",9f,89,51,00),null())
+            									->setFixed(1,HX_("value",71,7f,b8,31), ::Dynamic(v->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic))));
+            							}
+            							else {
+HXLINE( 343)								return v;
+            							}
+HXDLIN( 343)							return null();
+            						}
+            						HX_END_LOCAL_FUNC0(return)
+
+HXLINE( 343)						::Array< ::Dynamic> iter_map = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 343)						::Array< ::Dynamic> iter_keys = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 343)						::Dynamic map = x1->threads;
+HXDLIN( 343)						iter_map[0] = map;
+HXDLIN( 343)						iter_keys[0] = ::haxe::IMap_obj::keys(map);
+HXDLIN( 343)						 ::Dynamic _g_hasNext =  ::Dynamic(new _hx_Closure_0(iter_keys));
+HXDLIN( 343)						 ::Dynamic _g_next =  ::Dynamic(new _hx_Closure_1(iter_map,iter_keys));
+HXDLIN( 343)						while(( (bool)(_g_hasNext()) )){
+HXLINE( 343)							 ::Dynamic _g1 = _g_next();
+HXDLIN( 343)							::String id = ( (::String)(_g1->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic)) );
+HXDLIN( 343)							{
+HXLINE( 343)								::String row10;
+HXDLIN( 343)								if (::hx::IsNotNull( id )) {
+HXLINE( 343)									row10 = id;
+            								}
+            								else {
+HXLINE( 343)									row10 = HX_("",00,00,00,00);
+            								}
+HXDLIN( 343)								::Reflect_obj::setField(t,row10, ::Dynamic(_g1->__Field(HX_("value",71,7f,b8,31),::hx::paccDynamic)));
+            							}
+            						}
+            					}
+HXLINE( 328)					_g->push(::cpp::VirtualArray_obj::__new(17)->init(0,accountId1)->init(1,x2)->init(2,row)->init(3,x3)->init(4,row1)->init(5,x4)->init(6,x5)->init(7,row2)->init(8,x6)->init(9,x7)->init(10,row3)->init(11,row4)->init(12,row5)->init(13,row6)->init(14,row7)->init(15,x8)->init(16,::borogove::JsonPrinter_obj::print( ::Dynamic(::hx::Anon_obj::Create(3)
+            						->setFixed(0,HX_("mavUntil",9c,52,56,84),row9)
+            						->setFixed(1,HX_("status",32,e7,fb,05),row8)
+            						->setFixed(2,HX_("threads",69,f6,91,53),t)),null(),null())));
             				}
             			}
-HXDLIN( 278)			::cpp::VirtualArray _g1 = ::cpp::VirtualArray_obj::__new(0);
-HXDLIN( 278)			{
-HXLINE( 278)				 ::Dynamic e = _g->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 278)				while(( (bool)(e->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 278)					 ::Dynamic x7 = e->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 278)					while(( (bool)(x7->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 278)						_g1->push(x7->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+HXDLIN( 328)			::cpp::VirtualArray _g2 = ::cpp::VirtualArray_obj::__new(0);
+HXDLIN( 328)			{
+HXLINE( 328)				 ::Dynamic e = _g->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 328)				while(( (bool)(e->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 328)					 ::Dynamic x9 = e->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 328)					while(( (bool)(x9->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 328)						_g2->push(x9->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
             					}
             				}
             			}
-HXLINE( 276)			_gthis1->exec(_hx_tmp,_g1);
-HXLINE( 292)			_gthis->storeChatTimer = null();
-HXLINE( 293)			_gthis->storeChatBuffer->clear();
+HXLINE( 326)			_gthis1->exec(_hx_tmp,_g2);
+HXLINE( 351)			_gthis->storeChatTimer = null();
+HXLINE( 352)			_gthis->storeChatBuffer->clear();
             		}
             		HX_END_LOCAL_FUNC0((void))
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_239_storeChats)
-HXDLIN( 239)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 240)		if (::hx::IsNotNull( this->storeChatTimer )) {
-HXLINE( 241)			this->storeChatTimer->stop();
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_308_storeChats)
+HXDLIN( 308)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 309)		if (::hx::IsNotNull( this->storeChatTimer )) {
+HXLINE( 310)			this->storeChatTimer->stop();
             		}
-HXLINE( 244)		{
-HXLINE( 244)			int _g = 0;
-HXDLIN( 244)			while((_g < chats->length)){
-HXLINE( 244)				 ::borogove::Chat chat = chats->__get(_g).StaticCast<  ::borogove::Chat >();
-HXDLIN( 244)				_g = (_g + 1);
-HXLINE( 245)				this->storeChatBuffer->set(((accountId + HX_("\n",0a,00,00,00)) + chat->chatId),chat);
+HXLINE( 313)		{
+HXLINE( 313)			int _g = 0;
+HXDLIN( 313)			while((_g < chats->length)){
+HXLINE( 313)				 ::borogove::Chat chat = chats->__get(_g).StaticCast<  ::borogove::Chat >();
+HXDLIN( 313)				_g = (_g + 1);
+HXLINE( 314)				this->storeChatBuffer->set(((accountId + HX_("\n",0a,00,00,00)) + chat->chatId),chat);
             			}
             		}
-HXLINE( 248)		this->storeChatTimer = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_1(_gthis,accountId)),100);
+HXLINE( 317)		this->storeChatTimer = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_2(_gthis,accountId)),100);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,storeChats,(void))
 
-::Dynamic Sqlite_obj::getChats(::String accountId){
-            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::borogove::persistence::Sqlite,_gthis) HXARGC(1)
-            		::Dynamic _hx_run( ::haxe::iterators::ArrayIterator result){
-            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::haxe::ds::ObjectMap,fetchCaps) HXARGC(0)
-            			 ::Dynamic _hx_run(){
-            				HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_315_getChats)
-HXLINE( 315)				return fetchCaps->keys();
+::String Sqlite_obj::serializePresenceMap( ::haxe::ds::StringMap presence){
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_356_serializePresenceMap)
+HXLINE( 357)		 ::Dynamic storePresence =  ::Dynamic(::hx::Anon_obj::Create(0));
+HXLINE( 358)		if (::hx::IsNull( presence )) {
+HXLINE( 358)			return ::borogove::JsonPrinter_obj::print(storePresence,null(),null());
+            		}
+HXLINE( 360)		{
+HXLINE( 360)			::Dynamic map = presence;
+HXDLIN( 360)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(map);
+HXDLIN( 360)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 360)				::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXLINE( 361)				{
+HXLINE( 361)					::String value = ( ( ::borogove::Stanza)(::haxe::IMap_obj::get(map,key)) )->toString();
+HXDLIN( 361)					::String _hx_tmp;
+HXDLIN( 361)					if (::hx::IsNotNull( key )) {
+HXLINE( 361)						_hx_tmp = key;
+            					}
+            					else {
+HXLINE( 361)						_hx_tmp = HX_("",00,00,00,00);
+            					}
+HXDLIN( 361)					::Reflect_obj::setField(storePresence,_hx_tmp,value);
+            				}
             			}
-            			HX_END_LOCAL_FUNC0(return)
+            		}
+HXLINE( 364)		return ::borogove::JsonPrinter_obj::print(storePresence,null(),null());
+            	}
 
-            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1,::cpp::VirtualArray,chats) HXARGC(1)
-            			 ::Dynamic _hx_run( ::haxe::iterators::ArrayIterator capsResult){
-            				HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_319_getChats)
-HXLINE( 319)				return  ::Dynamic(::hx::Anon_obj::Create(2)
-            					->setFixed(0,HX_("caps",21,1c,ba,41),capsResult)
-            					->setFixed(1,HX_("chats",9b,9e,b3,45),chats));
-            			}
-            			HX_END_LOCAL_FUNC1(return)
 
-            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_302_getChats)
-HXLINE( 303)			 ::haxe::ds::ObjectMap fetchCaps =  ::haxe::ds::ObjectMap_obj::__alloc( HX_CTX );
-HXLINE( 304)			::cpp::VirtualArray chats = ::cpp::VirtualArray_obj::__new(0);
-HXLINE( 305)			while((result->current < result->array->get_length())){
-HXLINE( 305)				 ::Dynamic row = result->array->__get(result->current++);
-HXLINE( 306)				 ::Dynamic capsJson;
-HXDLIN( 306)				if (::hx::IsNull( row->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic) )) {
-HXLINE( 306)					capsJson = null();
-            				}
-            				else {
-HXLINE( 306)					capsJson =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic)) ))->doParse();
-            				}
-HXLINE( 307)				 ::borogove::Caps _hx_tmp;
-HXDLIN( 307)				if (::hx::IsNull( capsJson )) {
-HXLINE( 307)					_hx_tmp = null();
-            				}
-            				else {
-HXLINE( 307)					_hx_tmp = _gthis->hydrateCaps(capsJson,( (::Array< unsigned char >)(row->__Field(HX_("caps_ver",05,68,56,1e),::hx::paccDynamic)) ));
-            				}
-HXDLIN( 307)				row->__SetField(HX_("capsObj",56,b6,8b,a6),_hx_tmp,::hx::paccDynamic);
-HXLINE( 308)				 ::Dynamic presenceJson =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("presence",3b,52,d7,66),::hx::paccDynamic)) ))->doParse();
-HXLINE( 309)				row->__SetField(HX_("presenceJson",03,fa,cd,23),presenceJson,::hx::paccDynamic);
-HXLINE( 310)				{
-HXLINE( 310)					::Array< ::String > _g_keys = ::Reflect_obj::fields(presenceJson);
-HXDLIN( 310)					int _g_index = 0;
-HXDLIN( 310)					while((_g_index < _g_keys->length)){
-HXLINE( 310)						_g_index = (_g_index + 1);
-HXDLIN( 310)						 ::Dynamic _g_value = ::Reflect_obj::field(presenceJson,_g_keys->__get((_g_index - 1)));
-HXLINE( 311)						if (::hx::IsNotNull( _g_value->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic) )) {
-HXLINE( 311)							::Array< unsigned char > k = ::haxe::crypto::Base64_obj::decode(( (::String)(_g_value->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic)) ),null())->b;
-HXDLIN( 311)							fetchCaps->set(k,true);
-            						}
+HX_DEFINE_DYNAMIC_FUNC1(Sqlite_obj,serializePresenceMap,return )
+
+ ::haxe::ds::StringMap Sqlite_obj::hydratePresenceMap(::String raw){
+            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_367_hydratePresenceMap)
+HXLINE( 368)		 ::haxe::ds::StringMap map =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 369)		bool _hx_tmp;
+HXDLIN( 369)		if (::hx::IsNotNull( raw )) {
+HXLINE( 369)			_hx_tmp = (raw == HX_("",00,00,00,00));
+            		}
+            		else {
+HXLINE( 369)			_hx_tmp = true;
+            		}
+HXDLIN( 369)		if (_hx_tmp) {
+HXLINE( 369)			return map;
+            		}
+HXLINE( 371)		 ::Dynamic parsed =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,raw)->doParse();
+HXLINE( 372)		{
+HXLINE( 372)			::Array< ::String > _g_keys = ::Reflect_obj::fields(parsed);
+HXDLIN( 372)			int _g_index = 0;
+HXDLIN( 372)			while((_g_index < _g_keys->length)){
+HXLINE( 372)				_g_index = (_g_index + 1);
+HXDLIN( 372)				::String key = _g_keys->__get((_g_index - 1));
+HXLINE( 373)				{
+HXLINE( 373)					 ::borogove::Stanza v = ::borogove::Stanza_obj::parse(( (::String)(::Reflect_obj::field(parsed,key)) ));
+HXDLIN( 373)					::String _hx_tmp1;
+HXDLIN( 373)					if ((key == HX_("",00,00,00,00))) {
+HXLINE( 373)						_hx_tmp1 = null();
+            					}
+            					else {
+HXLINE( 373)						_hx_tmp1 = key;
             					}
+HXDLIN( 373)					map->set(_hx_tmp1,v);
             				}
-HXLINE( 313)				chats->push(row);
             			}
-HXLINE( 315)			::Array< ::Dynamic> fetchCapsSha1s = ::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
-            				->setFixed(0,HX_("iterator",ee,49,9a,93), ::Dynamic(new _hx_Closure_0(fetchCaps)))));
-HXLINE( 316)			 ::borogove::persistence::SqliteDriver _gthis1 = _gthis->db;
-HXLINE( 317)			::Array< ::String > result1 = ::Array_obj< ::String >::__new(fetchCapsSha1s->length);
-HXDLIN( 317)			{
-HXLINE( 317)				int _g = 0;
-HXDLIN( 317)				int _g1 = fetchCapsSha1s->length;
-HXDLIN( 317)				while((_g < _g1)){
-HXLINE( 317)					_g = (_g + 1);
-HXDLIN( 317)					int i = (_g - 1);
-HXDLIN( 317)					{
-HXLINE( 317)						_hx_array_unsafe_get(fetchCapsSha1s,i);
-HXDLIN( 317)						result1->__unsafe_set(i,HX_("?",3f,00,00,00));
-            					}
+            		}
+HXLINE( 376)		return map;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(Sqlite_obj,hydratePresenceMap,return )
+
+ ::borogove::Member Sqlite_obj::hydrateStoredMember( ::borogove::Chat chat, ::Dynamic row){
+            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_379_hydrateStoredMember)
+HXLINE( 380)		bool _hx_tmp;
+HXDLIN( 380)		bool _hx_tmp1;
+HXDLIN( 380)		bool _hx_tmp2;
+HXDLIN( 380)		bool _hx_tmp3;
+HXDLIN( 380)		bool _hx_tmp4;
+HXDLIN( 380)		bool _hx_tmp5;
+HXDLIN( 380)		if (::hx::IsNotNull( row )) {
+HXLINE( 380)			_hx_tmp5 = ::hx::IsNull( row->__Field(HX_("member_id",e0,03,69,b8),::hx::paccDynamic) );
+            		}
+            		else {
+HXLINE( 380)			_hx_tmp5 = true;
+            		}
+HXDLIN( 380)		if (!(_hx_tmp5)) {
+HXLINE( 380)			_hx_tmp4 = ::hx::IsEq( row->__Field(HX_("member_id",e0,03,69,b8),::hx::paccDynamic),HX_("",00,00,00,00) );
+            		}
+            		else {
+HXLINE( 380)			_hx_tmp4 = true;
+            		}
+HXDLIN( 380)		if (!(_hx_tmp4)) {
+HXLINE( 380)			_hx_tmp3 = ::hx::IsNull( row->__Field(HX_("display_name",a8,f4,3b,75),::hx::paccDynamic) );
+            		}
+            		else {
+HXLINE( 380)			_hx_tmp3 = true;
+            		}
+HXDLIN( 380)		if (!(_hx_tmp3)) {
+HXLINE( 380)			_hx_tmp2 = ::hx::IsEq( row->__Field(HX_("display_name",a8,f4,3b,75),::hx::paccDynamic),HX_("",00,00,00,00) );
+            		}
+            		else {
+HXLINE( 380)			_hx_tmp2 = true;
+            		}
+HXDLIN( 380)		if (!(_hx_tmp2)) {
+HXLINE( 380)			_hx_tmp1 = ::hx::IsNull( row->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic) );
+            		}
+            		else {
+HXLINE( 380)			_hx_tmp1 = true;
+            		}
+HXDLIN( 380)		if (!(_hx_tmp1)) {
+HXLINE( 380)			_hx_tmp = ::hx::IsEq( row->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic),HX_("",00,00,00,00) );
+            		}
+            		else {
+HXLINE( 380)			_hx_tmp = true;
+            		}
+HXDLIN( 380)		if (_hx_tmp) {
+HXLINE( 381)			return null();
+            		}
+HXLINE( 384)		::cpp::VirtualArray rolesData;
+HXDLIN( 384)		if (::hx::IsNull( row->__Field(HX_("roles",3d,1c,5f,ed),::hx::paccDynamic) )) {
+HXLINE( 384)			rolesData = ::cpp::VirtualArray_obj::__new(0);
+            		}
+            		else {
+HXLINE( 384)			rolesData = ( (::cpp::VirtualArray)( ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("roles",3d,1c,5f,ed),::hx::paccDynamic)) ))->doParse()) );
+            		}
+HXLINE( 385)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(rolesData->get_length());
+HXDLIN( 385)		{
+HXLINE( 385)			int _g = 0;
+HXDLIN( 385)			int _g1 = rolesData->get_length();
+HXDLIN( 385)			while((_g < _g1)){
+HXLINE( 385)				_g = (_g + 1);
+HXDLIN( 385)				int i = (_g - 1);
+HXDLIN( 385)				{
+HXLINE( 385)					 ::Dynamic r = _hx_array_unsafe_get(rolesData,i);
+HXDLIN( 385)					result->__unsafe_set(i, ::borogove::Role_obj::__alloc( HX_CTX ,( (::String)(r->__Field(HX_("id",db,5b,00,00),::hx::paccDynamic)) ),( (::String)(r->__Field(HX_("title",98,15,3b,10),::hx::paccDynamic)) )));
             				}
             			}
-HXLINE( 316)			return ::thenshim::_Promise::Promise_Impl__obj::then(_gthis1->exec(((HX_("SELECT sha1, json(caps) AS caps FROM caps WHERE sha1 IN (",5a,e4,9c,e2) + result1->join(HX_(",",2c,00,00,00))) + HX_(")",29,00,00,00)),fetchCapsSha1s), ::Dynamic(new _hx_Closure_1(chats)),null());
             		}
-            		HX_END_LOCAL_FUNC1(return)
+HXLINE( 386)		 ::haxe::ds::StringMap presence = this->hydratePresenceMap(( (::String)(row->__Field(HX_("presence",3b,52,d7,66),::hx::paccDynamic)) ));
+HXLINE( 387)		::String chatId = ( (::String)(row->__Field(HX_("chat",d8,5e,bf,41),::hx::paccDynamic)) );
+HXLINE( 388)		 ::borogove::AvailableChat availableChat;
+HXDLIN( 388)		bool availableChat1;
+HXDLIN( 388)		if (::hx::IsNotNull( chatId )) {
+HXLINE( 388)			availableChat1 = (chatId == HX_("",00,00,00,00));
+            		}
+            		else {
+HXLINE( 388)			availableChat1 = true;
+            		}
+HXDLIN( 388)		if (availableChat1) {
+HXLINE( 388)			availableChat = null();
+            		}
+            		else {
+HXLINE( 390)			 ::Dynamic row1 =  ::Dynamic(row->__Field(HX_("display_name",a8,f4,3b,75),::hx::paccDynamic));
+HXLINE( 391)			::String availableChat2;
+HXDLIN( 391)			if (::hx::IsNull( chat )) {
+HXLINE( 391)				availableChat2 = chatId;
+            			}
+            			else {
+HXLINE( 391)				availableChat2 = (((chatId + HX_(" (via ",9a,ee,c1,21)) + chat->getDisplayName()) + HX_(")",29,00,00,00));
+            			}
+HXLINE( 388)			availableChat =  ::borogove::AvailableChat_obj::__alloc( HX_CTX ,chatId,( (::String)(row1) ),availableChat2,::borogove::CapsRepo_obj::empty);
+            		}
+HXLINE( 396)		 ::Dynamic row2 =  ::Dynamic(row->__Field(HX_("member_id",e0,03,69,b8),::hx::paccDynamic));
+HXLINE( 397)		 ::Dynamic row3 =  ::Dynamic(row->__Field(HX_("display_name",a8,f4,3b,75),::hx::paccDynamic));
+HXLINE( 398)		 ::Dynamic row4 =  ::Dynamic(row->__Field(HX_("photo_uri",1f,7a,ef,17),::hx::paccDynamic));
+HXLINE( 399)		bool _hx_tmp6 = ::hx::IsNotEq( row->__Field(HX_("is_self",41,db,b9,08),::hx::paccDynamic),0 );
+HXLINE( 401)		 ::borogove::JID _hx_tmp7;
+HXDLIN( 401)		if (::hx::IsNull( row->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic) )) {
+HXLINE( 401)			_hx_tmp7 = null();
+            		}
+            		else {
+HXLINE( 401)			_hx_tmp7 = ::borogove::JID_obj::parse(( (::String)(row->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) ));
+            		}
+HXLINE( 395)		return  ::borogove::Member_obj::__alloc( HX_CTX ,( (::String)(row2) ),( (::String)(row3) ),( (::String)(row4) ),_hx_tmp6,result,_hx_tmp7,presence,availableChat);
+            	}
 
-            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_3, ::borogove::persistence::Sqlite,_gthis) HXARGC(1)
-            		::Array< ::Dynamic> _hx_run( ::Dynamic result){
-            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_320_getChats)
-HXLINE( 321)			 ::haxe::ds::StringMap capsMap =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE( 322)			{
-HXLINE( 322)				 ::haxe::iterators::ArrayIterator _g = ( ( ::haxe::iterators::ArrayIterator)(result->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic)) );
-HXDLIN( 322)				while((_g->current < _g->array->get_length())){
-HXLINE( 322)					 ::Dynamic row = _g->array->__get(_g->current++);
-HXLINE( 323)					 ::Dynamic json =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic)) ))->doParse();
-HXLINE( 324)					{
-HXLINE( 324)						::String k = ::haxe::crypto::Base64_obj::encode(::haxe::io::Bytes_obj::ofData(( (::Array< unsigned char >)(row->__Field(HX_("sha1",85,c8,52,4c),::hx::paccDynamic)) )),null());
-HXDLIN( 324)						capsMap->set(k,_gthis->hydrateCaps(json,( (::Array< unsigned char >)(row->__Field(HX_("sha1",85,c8,52,4c),::hx::paccDynamic)) )));
-            					}
-            				}
-            			}
-HXLINE( 326)			result->__SetField(HX_("caps",21,1c,ba,41),null(),::hx::paccDynamic);
-HXLINE( 327)			::Array< ::Dynamic> chats = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 328)			 ::Dynamic row1 = null();
-HXLINE( 329)			while(true){
-HXLINE( 329)				row1 = ( (::cpp::VirtualArray)(result->__Field(HX_("chats",9b,9e,b3,45),::hx::paccDynamic)) )->pop();
-HXDLIN( 329)				if (!(::hx::IsNotNull( row1 ))) {
-HXLINE( 329)					goto _hx_goto_38;
-            				}
-HXLINE( 330)				 ::haxe::ds::StringMap presenceMap =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE( 331)				 ::Dynamic presenceJson =  ::Dynamic(row1->__Field(HX_("presenceJson",03,fa,cd,23),::hx::paccDynamic));
-HXLINE( 332)				{
-HXLINE( 332)					int _g1 = 0;
-HXDLIN( 332)					::Array< ::String > _g2 = ::Reflect_obj::fields(presenceJson);
-HXDLIN( 332)					while((_g1 < _g2->length)){
-HXLINE( 332)						::String resource = _g2->__get(_g1);
-HXDLIN( 332)						_g1 = (_g1 + 1);
-HXLINE( 333)						 ::Dynamic presence = ::Reflect_obj::field(presenceJson,resource);
-HXLINE( 334)						::Reflect_obj::deleteField(presenceJson,resource);
-HXLINE( 335)						{
-HXLINE( 336)							 ::borogove::Caps v;
-HXDLIN( 336)							if (::hx::IsNull( presence->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic) )) {
-HXLINE( 336)								v = null();
-            							}
-            							else {
-HXLINE( 336)								v = ( ( ::borogove::Caps)(capsMap->get(( (::String)(presence->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic)) ))) );
-            							}
-HXLINE( 337)							 ::borogove::Stanza v1;
-HXDLIN( 337)							bool v2;
-HXDLIN( 337)							if (::hx::IsNotNull( presence->__Field(HX_("mucUser",e6,f3,96,b5),::hx::paccDynamic) )) {
-HXLINE( 337)								v2 = ::borogove::Config_obj::constrainedMemoryMode;
-            							}
-            							else {
-HXLINE( 337)								v2 = true;
-            							}
-HXDLIN( 337)							if (v2) {
-HXLINE( 337)								v1 = null();
-            							}
-            							else {
-HXLINE( 337)								v1 = ::borogove::Stanza_obj::parse(( (::String)(presence->__Field(HX_("mucUser",e6,f3,96,b5),::hx::paccDynamic)) ));
-            							}
-HXLINE( 338)							 ::borogove::Hash v3;
-HXDLIN( 338)							if (::hx::IsNull( presence->__Field(HX_("avatarHash",87,5c,82,37),::hx::paccDynamic) )) {
-HXLINE( 338)								v3 = null();
+
+HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,hydrateStoredMember,return )
+
+::Dynamic Sqlite_obj::chatPresenceAndMembersForName(::String accountId,::cpp::VirtualArray rawChats){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_3, ::borogove::persistence::Sqlite,_gthis,::cpp::VirtualArray,rawChats) HXARGC(1)
+            		 ::haxe::ds::StringMap _hx_run( ::haxe::iterators::ArrayIterator rows){
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_425_chatPresenceAndMembersForName)
+HXLINE( 426)			 ::haxe::ds::StringMap result =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 428)			 ::haxe::ds::StringMap chatRows =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 429)			while((rows->current < rows->array->get_length())){
+HXLINE( 429)				 ::Dynamic row = rows->array->__get(rows->current++);
+HXLINE( 430)				if (!(chatRows->exists(( (::String)(row->__Field(HX_("chat_id",22,ea,bd,d0),::hx::paccDynamic)) )))) {
+HXLINE( 430)					chatRows->set(( (::String)(row->__Field(HX_("chat_id",22,ea,bd,d0),::hx::paccDynamic)) ),::cpp::VirtualArray_obj::__new(0));
+            				}
+HXLINE( 431)				( (::cpp::VirtualArray)(chatRows->get( ::Dynamic(row->__Field(HX_("chat_id",22,ea,bd,d0),::hx::paccDynamic)))) )->push(row);
+            			}
+HXLINE( 434)			{
+HXLINE( 434)				int _g = 0;
+HXDLIN( 434)				while((_g < rawChats->get_length())){
+HXLINE( 434)					 ::Dynamic rawChat = rawChats->__get(_g);
+HXDLIN( 434)					_g = (_g + 1);
+HXLINE( 435)					::String cid = ( (::String)(rawChat->__Field(HX_("chat_id",22,ea,bd,d0),::hx::paccDynamic)) );
+HXLINE( 436)					::cpp::VirtualArray members = ( (::cpp::VirtualArray)(chatRows->get(cid)) );
+HXLINE( 437)					if (::hx::IsNull( members )) {
+HXLINE( 438)						result->set(cid, ::Dynamic(::hx::Anon_obj::Create(2)
+            							->setFixed(0,HX_("membersForName",1b,56,f2,d2),null())
+            							->setFixed(1,HX_("presence",3b,52,d7,66), ::haxe::ds::StringMap_obj::__alloc( HX_CTX ))));
+HXLINE( 439)						continue;
+            					}
+HXLINE( 442)					 ::haxe::ds::StringMap presence =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 443)					::Array< ::Dynamic> membersForName = null();
+HXLINE( 445)					if (::hx::IsEq( ::Reflect_obj::field(rawChat,HX_("class",38,78,58,48)),HX_("DirectChat",c1,22,a3,05) )) {
+            						HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0,::String,cid) HXARGC(1)
+            						bool _hx_run( ::Dynamic r){
+            							HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_446_chatPresenceAndMembersForName)
+HXLINE( 446)							return ::hx::IsEq( r->__Field(HX_("member_id",e0,03,69,b8),::hx::paccDynamic),cid );
+            						}
+            						HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 446)						 ::Dynamic selfRow = ::Lambda_obj::find(members, ::Dynamic(new _hx_Closure_0(cid)));
+HXLINE( 447)						if (::hx::IsNotNull( selfRow )) {
+HXLINE( 447)							presence = _gthis->hydratePresenceMap(( (::String)(selfRow->__Field(HX_("presence",3b,52,d7,66),::hx::paccDynamic)) ));
+            						}
+            					}
+            					else {
+HXLINE( 449)						membersForName = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 451)						{
+HXLINE( 451)							int _g1 = 0;
+HXDLIN( 451)							while((_g1 < members->get_length())){
+            								HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
+            								bool _hx_run( ::Dynamic r){
+            									HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_460_chatPresenceAndMembersForName)
+HXLINE( 460)									if (::hx::IsNotEq( r->__Field(HX_("id",db,5b,00,00),::hx::paccDynamic),HX_("none",b8,12,0a,49) )) {
+HXLINE( 460)										return ::hx::IsEq( r->__Field(HX_("id",db,5b,00,00),::hx::paccDynamic),HX_("outcast",4d,1e,c5,db) );
+            									}
+            									else {
+HXLINE( 460)										return true;
+            									}
+HXDLIN( 460)									return false;
+            								}
+            								HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 451)								 ::Dynamic row1 = members->__get(_g1);
+HXDLIN( 451)								_g1 = (_g1 + 1);
+HXLINE( 452)								if (::hx::IsNotEq( row1->__Field(HX_("is_self",41,db,b9,08),::hx::paccDynamic),0 )) {
+HXLINE( 453)									presence = _gthis->hydratePresenceMap(( (::String)(row1->__Field(HX_("presence",3b,52,d7,66),::hx::paccDynamic)) ));
+HXLINE( 454)									continue;
+            								}
+HXLINE( 457)								if (::hx::IsEq( row1->__Field(HX_("member_id",e0,03,69,b8),::hx::paccDynamic),cid )) {
+HXLINE( 457)									continue;
+            								}
+HXLINE( 459)								::cpp::VirtualArray rolesData;
+HXDLIN( 459)								if (::hx::IsNotNull( row1->__Field(HX_("roles",3d,1c,5f,ed),::hx::paccDynamic) )) {
+HXLINE( 459)									rolesData = ( (::cpp::VirtualArray)( ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row1->__Field(HX_("roles",3d,1c,5f,ed),::hx::paccDynamic)) ))->doParse()) );
+            								}
+            								else {
+HXLINE( 459)									rolesData = ::cpp::VirtualArray_obj::__new(0);
+            								}
+HXLINE( 460)								if (::Lambda_obj::exists(rolesData, ::Dynamic(new _hx_Closure_1()))) {
+HXLINE( 460)									continue;
+            								}
+HXLINE( 462)								membersForName->push( ::Dynamic(::hx::Anon_obj::Create(2)
+            									->setFixed(0,HX_("id",db,5b,00,00),( (::String)(row1->__Field(HX_("member_id",e0,03,69,b8),::hx::paccDynamic)) ))
+            									->setFixed(1,HX_("displayName",ad,11,f2,30),( (::String)(row1->__Field(HX_("display_name",a8,f4,3b,75),::hx::paccDynamic)) ))));
             							}
-            							else {
-HXLINE( 338)								v3 = ::borogove::Hash_obj::fromUri(( (::String)(presence->__Field(HX_("avatarHash",87,5c,82,37),::hx::paccDynamic)) ));
+            						}
+HXLINE( 465)						if ((membersForName->length > 20)) {
+HXLINE( 466)							membersForName = null();
+            						}
+            						else {
+            							HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(2)
+            							int _hx_run( ::Dynamic a, ::Dynamic b){
+            								HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_468_chatPresenceAndMembersForName)
+HXLINE( 468)								return ::Reflect_obj::compare( ::Dynamic(a->__Field(HX_("displayName",ad,11,f2,30),::hx::paccDynamic)), ::Dynamic(b->__Field(HX_("displayName",ad,11,f2,30),::hx::paccDynamic)));
             							}
-HXLINE( 335)							presenceMap->set(resource, ::borogove::Presence_obj::__alloc( HX_CTX ,v,v1,v3));
+            							HX_END_LOCAL_FUNC2(return)
+
+HXLINE( 468)							membersForName->sort( ::Dynamic(new _hx_Closure_2()));
             						}
             					}
+HXLINE( 472)					result->set(cid, ::Dynamic(::hx::Anon_obj::Create(2)
+            						->setFixed(0,HX_("membersForName",1b,56,f2,d2),membersForName)
+            						->setFixed(1,HX_("presence",3b,52,d7,66),presence)));
             				}
-HXLINE( 342)				::String row2 = ( (::String)(row1->__Field(HX_("chat_id",22,ea,bd,d0),::hx::paccDynamic)) );
-HXDLIN( 342)				bool _hx_tmp = ::hx::IsNotEq( row1->__Field(HX_("trusted",f7,b7,a6,16),::hx::paccDynamic),0 );
-HXDLIN( 342)				::Array< unsigned char > row3 = ( (::Array< unsigned char >)(row1->__Field(HX_("avatar_sha1",ab,69,a3,a4),::hx::paccDynamic)) );
-HXDLIN( 342)				::String row4 = ( (::String)(row1->__Field(HX_("fn",48,59,00,00),::hx::paccDynamic)) );
-HXDLIN( 342)				 ::Dynamic row5 = row1->__Field(HX_("ui_state",a6,9a,4e,b2),::hx::paccDynamic);
-HXDLIN( 342)				bool _hx_tmp1 = ::hx::IsNotEq( row1->__Field(HX_("blocked",ec,7a,fe,44),::hx::paccDynamic),0 );
-HXDLIN( 342)				::String row6 = ( (::String)(row1->__Field(HX_("extensions",14,7c,70,89),::hx::paccDynamic)) );
-HXDLIN( 342)				::String row7 = ( (::String)(row1->__Field(HX_("read_up_to_id",84,60,ad,9e),::hx::paccDynamic)) );
-HXDLIN( 342)				::String row8 = ( (::String)(row1->__Field(HX_("read_up_to_by",80,5a,ad,9e),::hx::paccDynamic)) );
-HXDLIN( 342)				 ::Dynamic _hx_tmp2;
-HXDLIN( 342)				if (::hx::IsNull( row1->__Field(HX_("notifications_filtered",4e,91,57,51),::hx::paccDynamic) )) {
-HXLINE( 342)					_hx_tmp2 = null();
-            				}
-            				else {
-HXLINE( 342)					_hx_tmp2 = ::hx::IsNotEq( row1->__Field(HX_("notifications_filtered",4e,91,57,51),::hx::paccDynamic),0 );
-            				}
-HXDLIN( 342)				bool _hx_tmp3 = ::hx::IsNotEq( row1->__Field(HX_("notify_mention",34,44,26,d0),::hx::paccDynamic),0 );
-HXDLIN( 342)				bool _hx_tmp4 = ::hx::IsNotEq( row1->__Field(HX_("notify_reply",f4,e7,df,1b),::hx::paccDynamic),0 );
-HXDLIN( 342)				 ::borogove::Caps row9 = ( ( ::borogove::Caps)(row1->__Field(HX_("capsObj",56,b6,8b,a6),::hx::paccDynamic)) );
-HXDLIN( 342)				chats->push( ::borogove::SerializedChat_obj::__alloc( HX_CTX ,row2,_hx_tmp,row3,presenceMap,row4,row5,_hx_tmp1,row6,row7,row8,_hx_tmp2,_hx_tmp3,_hx_tmp4,row9,::Array_obj< int >::__new(0),( (::String)(::Reflect_obj::field(row1,HX_("class",38,78,58,48))) )));
             			}
-            			_hx_goto_38:;
-HXLINE( 344)			return chats;
+HXLINE( 475)			return result;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_298_getChats)
-HXDLIN( 298)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 299)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT chat_id, trusted, avatar_sha1, fn, ui_state, blocked, extensions, read_up_to_id, read_up_to_by, notifications_filtered, notify_mention, notify_reply, json(caps) AS caps, caps_ver, json(presence) AS presence, class FROM chats LEFT JOIN caps ON chats.caps_ver=caps.sha1 WHERE account_id=?",32,f7,06,7e),::cpp::VirtualArray_obj::__new(1)->init(0,accountId)), ::Dynamic(new _hx_Closure_2(_gthis)),null()), ::Dynamic(new _hx_Closure_3(_gthis)),null());
+            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_407_chatPresenceAndMembersForName)
+HXDLIN( 407)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 408)		if ((rawChats->get_length() < 1)) {
+HXLINE( 408)			return ::thenshim::_Promise::Promise_Impl__obj::resolve( ::haxe::ds::StringMap_obj::__alloc( HX_CTX ));
+            		}
+HXLINE( 425)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("\n\t\t\tSELECT chat_id, member_id, display_name, is_self, json(roles) AS roles, json(presence) AS presence\n\t\t\tFROM (\n\t\t\t\tSELECT chat_id, member_id, display_name, is_self, roles, presence,\n\t\t\t\t\tCASE WHEN is_self OR member_id=chat_id THEN 0\n\t\t\t\t\t\tELSE ROW_NUMBER() OVER(PARTITION BY chat_id ORDER BY display_name)\n\t\t\t\t\tEND as rn\n\t\t\t\tFROM members\n\t\t\t\tWHERE account_id = ?\n\t\t\t\t\tAND (is_self OR (display_name IS NOT NULL AND display_name<>''))\n\t\t\t) sub\n\t\t\tWHERE rn <= 23\n\t\t\tORDER BY chat_id, display_name\n\t\t",ac,2b,f6,05),::cpp::VirtualArray_obj::__new(1)->init(0,accountId)), ::Dynamic(new _hx_Closure_3(_gthis,rawChats)),null());
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC1(Sqlite_obj,getChats,return )
+HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,chatPresenceAndMembersForName,return )
 
-::Dynamic Sqlite_obj::storeMessages(::String accountId,::Array< ::Dynamic> messages){
-            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0,::Array< ::Dynamic>,messages, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
-            		::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
-            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_385_storeMessages)
-HXLINE( 385)			 ::borogove::persistence::SqliteDriver _gthis1 = _gthis->db;
-HXLINE( 386)			::Array< ::String > result = ::Array_obj< ::String >::__new(messages->length);
-HXDLIN( 386)			{
-HXLINE( 386)				int _g = 0;
-HXDLIN( 386)				int _g1 = messages->length;
-HXDLIN( 386)				while((_g < _g1)){
-HXLINE( 386)					_g = (_g + 1);
-HXDLIN( 386)					int i = (_g - 1);
-HXDLIN( 386)					{
-HXLINE( 386)						_hx_array_unsafe_get(messages,i);
-HXDLIN( 386)						result->__unsafe_set(i,HX_("(?,?,?,?,?,?,?,?,CAST(unixepoch(?, 'subsec') * 1000 AS INTEGER),?,?,?,?,?)",a3,f4,ed,ae));
-            					}
-            				}
-            			}
-HXDLIN( 386)			::String _hx_tmp = (HX_("INSERT OR REPLACE INTO messages VALUES ",28,32,a2,bc) + result->join(HX_(",",2c,00,00,00)));
-HXLINE( 387)			::Array< ::Dynamic> _g2 = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 387)			{
-HXLINE( 387)				int _g_current = 0;
-HXDLIN( 387)				::Array< ::Dynamic> _g_array = messages;
-HXDLIN( 387)				while((_g_current < _g_array->length)){
-HXLINE( 387)					_g_current = (_g_current + 1);
-HXDLIN( 387)					 ::borogove::ChatMessage x = _g_array->__get((_g_current - 1)).StaticCast<  ::borogove::ChatMessage >();
-HXLINE( 389)					 ::borogove::ChatMessage message;
-HXDLIN( 389)					if ((x->versions->length == 1)) {
-HXLINE( 389)						message = x->versions->__get(0).StaticCast<  ::borogove::ChatMessage >();
+::Dynamic Sqlite_obj::storeMembers(::String accountId,::String chatId,::Array< ::Dynamic> membersArg){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            		bool _hx_run( ::haxe::iterators::ArrayIterator _){
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_507_storeMembers)
+HXLINE( 507)			return true;
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_480_storeMembers)
+HXLINE( 481)		if ((membersArg->length < 1)) {
+HXLINE( 481)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(true);
+            		}
+HXLINE( 484)		::cpp::VirtualArray members = membersArg;
+HXLINE( 486)		 ::StringBuf q =  ::StringBuf_obj::__alloc( HX_CTX );
+HXLINE( 487)		{
+HXLINE( 487)			if (::hx::IsNotNull( q->charBuf )) {
+HXLINE( 487)				q->flush();
+            			}
+HXDLIN( 487)			if (::hx::IsNull( q->b )) {
+HXLINE( 487)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_73,1);
+            			}
+            			else {
+HXLINE( 487)				q->b->push(HX_("INSERT OR REPLACE INTO members VALUES ",f9,ed,eb,41));
+            			}
+            		}
+HXLINE( 488)		bool first = true;
+HXLINE( 489)		::cpp::VirtualArray params = ::cpp::VirtualArray_obj::__new(0);
+HXLINE( 491)		{
+HXLINE( 491)			int _g = 0;
+HXDLIN( 491)			while((_g < members->get_length())){
+HXLINE( 491)				 ::Dynamic member = members->__get(_g);
+HXDLIN( 491)				_g = (_g + 1);
+HXLINE( 492)				if (!(first)) {
+HXLINE( 492)					if (::hx::IsNotNull( q->charBuf )) {
+HXLINE( 492)						q->flush();
+            					}
+HXDLIN( 492)					if (::hx::IsNull( q->b )) {
+HXLINE( 492)						q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_74,1);
             					}
             					else {
-HXLINE( 389)						message = x;
+HXLINE( 492)						q->b->push(HX_(",",2c,00,00,00));
+            					}
+            				}
+HXLINE( 493)				first = false;
+HXLINE( 494)				{
+HXLINE( 494)					if (::hx::IsNotNull( q->charBuf )) {
+HXLINE( 494)						q->flush();
             					}
-HXLINE( 391)					::String accountId1 = accountId;
-HXDLIN( 391)					::String _hx_tmp1;
-HXDLIN( 391)					::String tmp = message->serverId;
-HXDLIN( 391)					if (::hx::IsNotNull( tmp )) {
-HXLINE( 391)						_hx_tmp1 = tmp;
+HXDLIN( 494)					if (::hx::IsNull( q->b )) {
+HXLINE( 494)						q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_75,1);
             					}
             					else {
-HXLINE( 391)						_hx_tmp1 = HX_("",00,00,00,00);
+HXLINE( 494)						q->b->push(HX_("(?,?,?,?,?,?,?,jsonb(?),jsonb(?),?)",cd,39,fd,64));
+            					}
+            				}
+HXLINE( 495)				params->push(accountId);
+HXLINE( 496)				params->push(chatId);
+HXLINE( 497)				params->push( ::Dynamic(member->__Field(HX_("id",db,5b,00,00),::hx::paccDynamic)));
+HXLINE( 498)				params->push( ::Dynamic(member->__Field(HX_("displayName",ad,11,f2,30),::hx::paccDynamic)));
+HXLINE( 499)				params->push( ::Dynamic(member->__Field(HX_("photoUri",da,15,82,60),::hx::paccDynamic)));
+HXLINE( 500)				params->push( ::Dynamic(member->__Field(HX_("isSelf",96,50,b7,69),::hx::paccDynamic)));
+HXLINE( 501)				 ::Dynamic tmp =  ::Dynamic(member->__Field(HX_("chat",d8,5e,bf,41),::hx::paccDynamic));
+HXDLIN( 501)				 ::Dynamic _hx_tmp;
+HXDLIN( 501)				if (::hx::IsNotNull( tmp )) {
+HXLINE( 501)					_hx_tmp =  ::Dynamic(tmp->__Field(HX_("chatId",d3,04,77,b7),::hx::paccDynamic));
+            				}
+            				else {
+HXLINE( 501)					_hx_tmp = null();
+            				}
+HXDLIN( 501)				params->push(_hx_tmp);
+HXLINE( 502)				params->push(::borogove::JsonPrinter_obj::print( ::Dynamic(member->__Field(HX_("roles",3d,1c,5f,ed),::hx::paccDynamic)),null(),null()));
+HXLINE( 503)				params->push(this->serializePresenceMap(( ( ::haxe::ds::StringMap)(member->__Field(HX_("presence",3b,52,d7,66),::hx::paccDynamic)) )));
+HXLINE( 504)				 ::Dynamic tmp1 =  ::Dynamic(member->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic));
+HXDLIN( 504)				 ::Dynamic _hx_tmp1;
+HXDLIN( 504)				if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 504)					_hx_tmp1 = tmp1->__Field(HX_("asString",63,33,06,a0),::hx::paccDynamic)();
+            				}
+            				else {
+HXLINE( 504)					_hx_tmp1 = null();
+            				}
+HXDLIN( 504)				params->push(_hx_tmp1);
+            			}
+            		}
+HXLINE( 507)		 ::borogove::persistence::SqliteDriver _hx_tmp2 = this->db;
+HXDLIN( 507)		return ::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp2->exec(q->toString(),params), ::Dynamic(new _hx_Closure_0()),null());
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC3(Sqlite_obj,storeMembers,return )
+
+::Dynamic Sqlite_obj::storeMemberUpdates(::String accountId, ::borogove::Chat chat,::Array< ::Dynamic> updates,bool isFullList){
+            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_5, ::borogove::persistence::Sqlite,_gthis, ::borogove::Chat,chat,::String,accountId) HXARGC(1)
+            		::Dynamic _hx_run(::Array< ::Dynamic> pseudoMembers){
+            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_4,::Array< ::Dynamic>,valid) HXARGC(1)
+            			::Array< ::Dynamic> _hx_run(bool _){
+            				HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_537_storeMemberUpdates)
+HXLINE( 537)				return valid;
+            			}
+            			HX_END_LOCAL_FUNC1(return)
+
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_535_storeMemberUpdates)
+HXLINE( 536)			::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 536)			{
+HXLINE( 536)				int _g1 = 0;
+HXDLIN( 536)				while((_g1 < pseudoMembers->length)){
+HXLINE( 536)					 ::Dynamic v = pseudoMembers->__get(_g1);
+HXDLIN( 536)					_g1 = (_g1 + 1);
+HXDLIN( 536)					if (::hx::IsNotNull( v )) {
+HXLINE( 536)						_g->push(v);
+            					}
+            				}
+            			}
+HXDLIN( 536)			::Array< ::Dynamic> valid = _g;
+HXLINE( 537)			return ::thenshim::_Promise::Promise_Impl__obj::then(_gthis->storeMembers(accountId,chat->chatId,valid), ::Dynamic(new _hx_Closure_4(valid)),null());
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            		HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_8,bool,isFullList, ::borogove::persistence::Sqlite,_gthis, ::haxe::ds::StringMap,updatedIds, ::borogove::Chat,chat,::String,accountId) HXARGC(1)
+            		::Dynamic _hx_run(::Array< ::Dynamic> valid){
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_538_storeMemberUpdates)
+HXLINE( 539)			if (!(isFullList)) {
+HXLINE( 539)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(valid);
+            			}
+HXLINE( 541)			::Array< ::String > _g = ::Array_obj< ::String >::__new(0);
+HXDLIN( 541)			{
+HXLINE( 541)				::Dynamic map = updatedIds;
+HXDLIN( 541)				 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(map);
+HXDLIN( 541)				while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 541)					::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN( 541)					::haxe::IMap_obj::get(map,key);
+HXDLIN( 541)					_g->push(key);
+            				}
+            			}
+HXLINE( 542)			if ((_g->length < 1)) {
+            				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_6,::Array< ::Dynamic>,valid) HXARGC(1)
+            				::Array< ::Dynamic> _hx_run( ::haxe::iterators::ArrayIterator _){
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_546_storeMemberUpdates)
+HXLINE( 546)					return valid;
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 543)				return ::thenshim::_Promise::Promise_Impl__obj::then(_gthis->db->exec(HX_("UPDATE members SET roles=jsonb('[]') WHERE account_id=? AND chat_id=?",22,e9,2f,b9),::cpp::VirtualArray_obj::__new(2)->init(0,accountId)->init(1,chat->chatId)), ::Dynamic(new _hx_Closure_6(valid)),null());
+            			}
+            			else {
+            				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_7,::Array< ::Dynamic>,valid) HXARGC(1)
+            				::Array< ::Dynamic> _hx_run( ::haxe::iterators::ArrayIterator _){
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_553_storeMemberUpdates)
+HXLINE( 553)					return valid;
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 548)				::Array< ::String > result = ::Array_obj< ::String >::__new(_g->length);
+HXDLIN( 548)				{
+HXLINE( 548)					int _g1 = 0;
+HXDLIN( 548)					int _g2 = _g->length;
+HXDLIN( 548)					while((_g1 < _g2)){
+HXLINE( 548)						_g1 = (_g1 + 1);
+HXDLIN( 548)						int i = (_g1 - 1);
+HXDLIN( 548)						{
+HXLINE( 548)							_hx_array_unsafe_get(_g,i);
+HXDLIN( 548)							result->__unsafe_set(i,HX_("?",3f,00,00,00));
+            						}
             					}
-HXDLIN( 391)					::String _hx_tmp2;
-HXDLIN( 391)					::String tmp1 = message->serverIdBy;
-HXDLIN( 391)					if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 391)						_hx_tmp2 = tmp1;
+            				}
+HXDLIN( 548)				::String placeholders = result->join(HX_(",",2c,00,00,00));
+HXLINE( 549)				::cpp::VirtualArray params = ::Array_obj< ::String >::__new(2)->init(0,accountId)->init(1,chat->chatId)->concat(_g);
+HXLINE( 550)				return ::thenshim::_Promise::Promise_Impl__obj::then(_gthis->db->exec(((HX_("UPDATE members SET roles=jsonb('[]') WHERE account_id=? AND chat_id=? AND member_id NOT IN (",c1,3c,90,90) + placeholders) + HX_(")",29,00,00,00)),params), ::Dynamic(new _hx_Closure_7(valid)),null());
+            			}
+HXLINE( 542)			return null();
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_9) HXARGC(1)
+            		::Array< ::Dynamic> _hx_run(::Array< ::Dynamic> valid){
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_555_storeMemberUpdates)
+HXLINE( 556)			::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 556)			{
+HXLINE( 556)				int _g1 = 0;
+HXDLIN( 556)				while((_g1 < valid->length)){
+HXLINE( 556)					 ::Dynamic v = valid->__get(_g1);
+HXDLIN( 556)					_g1 = (_g1 + 1);
+HXDLIN( 556)					bool _hx_tmp;
+HXDLIN( 556)					bool _hx_tmp1;
+HXDLIN( 556)					bool _hx_tmp2;
+HXDLIN( 556)					::String _hx_tmp3;
+HXDLIN( 556)					if (::hx::IsNotNull( v )) {
+HXLINE( 556)						_hx_tmp3 = ( (::String)(v->__Field(HX_("id",db,5b,00,00),::hx::paccDynamic)) );
             					}
             					else {
-HXLINE( 391)						_hx_tmp2 = HX_("",00,00,00,00);
+HXLINE( 556)						_hx_tmp3 = null();
             					}
-HXLINE( 392)					::String _hx_tmp3;
-HXDLIN( 392)					::String tmp2 = message->localId;
-HXDLIN( 392)					if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 392)						_hx_tmp3 = tmp2;
+HXDLIN( 556)					if (::hx::IsNotNull( _hx_tmp3 )) {
+HXLINE( 556)						::String _hx_tmp4;
+HXDLIN( 556)						if (::hx::IsNotNull( v )) {
+HXLINE( 556)							_hx_tmp4 = ( (::String)(v->__Field(HX_("displayName",ad,11,f2,30),::hx::paccDynamic)) );
+            						}
+            						else {
+HXLINE( 556)							_hx_tmp4 = null();
+            						}
+HXDLIN( 556)						_hx_tmp2 = ::hx::IsNotNull( _hx_tmp4 );
             					}
             					else {
-HXLINE( 392)						_hx_tmp3 = HX_("",00,00,00,00);
+HXLINE( 556)						_hx_tmp2 = false;
             					}
-HXDLIN( 392)					::String _hx_tmp4;
-HXDLIN( 392)					::String tmp3 = x->callSid();
-HXDLIN( 392)					::String tmp4;
-HXDLIN( 392)					if (::hx::IsNotNull( tmp3 )) {
-HXLINE( 392)						tmp4 = tmp3;
+HXDLIN( 556)					if (_hx_tmp2) {
+HXLINE( 556)						_hx_tmp1 = ::hx::IsNotEq( v->__Field(HX_("displayName",ad,11,f2,30),::hx::paccDynamic),HX_("",00,00,00,00) );
             					}
             					else {
-HXLINE( 392)						tmp4 = x->localId;
+HXLINE( 556)						_hx_tmp1 = false;
             					}
-HXDLIN( 392)					if (::hx::IsNotNull( tmp4 )) {
-HXLINE( 392)						_hx_tmp4 = tmp4;
+HXDLIN( 556)					if (_hx_tmp1) {
+HXLINE( 556)						 ::borogove::JID _hx_tmp5;
+HXDLIN( 556)						if (::hx::IsNotNull( v )) {
+HXLINE( 556)							_hx_tmp5 = ( ( ::borogove::JID)(v->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) );
+            						}
+            						else {
+HXLINE( 556)							_hx_tmp5 = null();
+            						}
+HXDLIN( 556)						_hx_tmp = ::hx::IsNotNull( _hx_tmp5 );
             					}
             					else {
-HXLINE( 392)						_hx_tmp4 = x->serverId;
+HXLINE( 556)						_hx_tmp = false;
+            					}
+HXDLIN( 556)					if (_hx_tmp) {
+HXLINE( 556)						_g->push(v);
             					}
-HXDLIN( 392)					bool correctable = x->syncPoint;
-HXLINE( 393)					::String _hx_tmp5 = x->chatId();
-HXDLIN( 393)					::String correctable1 = x->senderId;
-HXLINE( 394)					::String message1 = message->timestamp;
-HXDLIN( 394)					int message2 = message->status;
-HXDLIN( 394)					int message3 = message->direction;
-HXDLIN( 394)					int message4 = message->type;
-HXLINE( 395)					::String _hx_tmp6 = message->asStanza()->toString();
-HXLINE( 387)					_g2->push(::cpp::VirtualArray_obj::__new(14)->init(0,accountId1)->init(1,_hx_tmp1)->init(2,_hx_tmp2)->init(3,_hx_tmp3)->init(4,_hx_tmp4)->init(5,correctable)->init(6,_hx_tmp5)->init(7,correctable1)->init(8,message1)->init(9,message2)->init(10,message3)->init(11,message4)->init(12,_hx_tmp6)->init(13,message->statusText));
             				}
             			}
-HXDLIN( 387)			::cpp::VirtualArray _g3 = ::cpp::VirtualArray_obj::__new(0);
-HXDLIN( 387)			{
-HXLINE( 387)				 ::Dynamic e = _g2->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 387)				while(( (bool)(e->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 387)					 ::Dynamic x1 = e->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 387)					while(( (bool)(x1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 387)						_g3->push(x1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+HXDLIN( 556)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_g->length);
+HXDLIN( 556)			{
+HXLINE( 556)				int _g2 = 0;
+HXDLIN( 556)				int _g3 = _g->length;
+HXDLIN( 556)				while((_g2 < _g3)){
+HXLINE( 556)					_g2 = (_g2 + 1);
+HXDLIN( 556)					int i = (_g2 - 1);
+HXDLIN( 556)					{
+HXLINE( 556)						 ::Dynamic m = _hx_array_unsafe_get(_g,i);
+HXDLIN( 556)						 ::borogove::Member inValue =  ::borogove::Member_obj::__alloc( HX_CTX ,( (::String)(m->__Field(HX_("id",db,5b,00,00),::hx::paccDynamic)) ),( (::String)(m->__Field(HX_("displayName",ad,11,f2,30),::hx::paccDynamic)) ),( (::String)(m->__Field(HX_("photoUri",da,15,82,60),::hx::paccDynamic)) ),( (bool)(m->__Field(HX_("isSelf",96,50,b7,69),::hx::paccDynamic)) ),( (::Array< ::Dynamic>)(m->__Field(HX_("roles",3d,1c,5f,ed),::hx::paccDynamic)) ),( ( ::borogove::JID)(m->__Field(HX_("jid",c5,ca,50,00),::hx::paccDynamic)) ),( ( ::haxe::ds::StringMap)(m->__Field(HX_("presence",3b,52,d7,66),::hx::paccDynamic)) ),( ( ::borogove::AvailableChat)(m->__Field(HX_("chat",d8,5e,bf,41),::hx::paccDynamic)) ));
+HXDLIN( 556)						result->__unsafe_set(i,inValue);
             					}
             				}
             			}
-HXLINE( 385)			return _gthis1->exec(_hx_tmp,_g3);
+HXDLIN( 556)			return result;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            		HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_2,::Array< ::Dynamic>,messages, ::borogove::persistence::Sqlite,_gthis,::Array< ::Dynamic>,replyTos,::String,accountId) HXARGC(1)
-            		::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
-            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
-            			::Dynamic _hx_run(::Array< ::Dynamic> ms){
-            				HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_400_storeMessages)
-HXLINE( 400)				return _gthis->hydrateReactions(accountId,ms);
+            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_511_storeMemberUpdates)
+HXDLIN( 511)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 512)		 ::haxe::ds::StringMap updatedIds =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 513)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(updates->length);
+HXDLIN( 513)		{
+HXLINE( 513)			int _g = 0;
+HXDLIN( 513)			int _g1 = updates->length;
+HXDLIN( 513)			while((_g < _g1)){
+HXLINE( 513)				_g = (_g + 1);
+HXDLIN( 513)				int i = (_g - 1);
+HXDLIN( 513)				{
+            					HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_2, ::borogove::persistence::Sqlite,_gthis, ::borogove::Chat,chat,::String,accountId, ::borogove::MemberUpdate,update) HXARGC(1)
+            					::Dynamic _hx_run( ::Dynamic existing){
+            						HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
+            						::Dynamic _hx_run( ::haxe::iterators::ArrayIterator rows){
+            							HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_526_storeMemberUpdates)
+HXLINE( 526)							if ((rows->current < rows->array->get_length())) {
+HXLINE( 526)								return rows->array->__get(rows->current++);
+            							}
+            							else {
+HXLINE( 526)								return null();
+            							}
+HXDLIN( 526)							return null();
+            						}
+            						HX_END_LOCAL_FUNC1(return)
+
+            						HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_519_storeMemberUpdates)
+HXLINE( 520)						bool inValue;
+HXDLIN( 520)						if (::hx::IsNull( existing )) {
+HXLINE( 520)							inValue = ::hx::IsNull( update->jid );
+            						}
+            						else {
+HXLINE( 520)							inValue = true;
+            						}
+HXDLIN( 520)						if (inValue) {
+HXLINE( 520)							return ::thenshim::_Promise::Promise_Impl__obj::resolve(existing);
+            						}
+HXLINE( 522)						 ::borogove::persistence::SqliteDriver _gthis1 = _gthis->db;
+HXLINE( 524)						::String accountId1 = accountId;
+HXDLIN( 524)						::String chat1 = chat->chatId;
+HXLINE( 522)						return ::thenshim::_Promise::Promise_Impl__obj::then(_gthis1->exec(HX_("SELECT member_id, display_name, photo_uri, is_self, chat, json(roles) AS roles, json(presence) AS presence, jid FROM members WHERE account_id=? AND chat_id=? AND jid=? LIMIT 1",b3,21,1d,01),::cpp::VirtualArray_obj::__new(3)->init(0,accountId1)->init(1,chat1)->init(2,update->jid->asString())), ::Dynamic(new _hx_Closure_1()),null());
+            					}
+            					HX_END_LOCAL_FUNC1(return)
+
+            					HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_3, ::borogove::persistence::Sqlite,_gthis, ::haxe::ds::StringMap,updatedIds, ::borogove::Chat,chat, ::borogove::MemberUpdate,update) HXARGC(1)
+            					 ::Dynamic _hx_run( ::Dynamic existing){
+            						HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_528_storeMemberUpdates)
+HXLINE( 529)						 ::borogove::Member member = _gthis->hydrateStoredMember(chat,existing);
+HXLINE( 530)						::String knownId;
+HXDLIN( 530)						::String tmp = update->id;
+HXDLIN( 530)						if (::hx::IsNotNull( tmp )) {
+HXLINE( 530)							knownId = tmp;
+            						}
+            						else {
+HXLINE( 530)							if (::hx::IsNotNull( existing )) {
+HXLINE( 530)								knownId = ( (::String)(existing->__Field(HX_("member_id",e0,03,69,b8),::hx::paccDynamic)) );
+            							}
+            							else {
+HXLINE( 530)								knownId = null();
+            							}
+            						}
+HXLINE( 531)						bool inValue;
+HXDLIN( 531)						if (::hx::IsNotNull( knownId )) {
+HXLINE( 531)							inValue = (knownId != HX_("",00,00,00,00));
+            						}
+            						else {
+HXLINE( 531)							inValue = false;
+            						}
+HXDLIN( 531)						if (inValue) {
+HXLINE( 531)							updatedIds->set(knownId,true);
+            						}
+HXLINE( 533)						return update->applyTo(member);
+            					}
+            					HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 513)					 ::borogove::MemberUpdate update = ( ( ::borogove::MemberUpdate)(_hx_array_unsafe_get(updates,i)) );
+HXLINE( 514)					::Dynamic inValue;
+HXDLIN( 514)					if (::hx::IsNull( update->id )) {
+HXLINE( 514)						inValue = ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            					}
+            					else {
+            						HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            						::Dynamic _hx_run( ::haxe::iterators::ArrayIterator rows){
+            							HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_518_storeMemberUpdates)
+HXLINE( 518)							if ((rows->current < rows->array->get_length())) {
+HXLINE( 518)								return rows->array->__get(rows->current++);
+            							}
+            							else {
+HXLINE( 518)								return null();
+            							}
+HXDLIN( 518)							return null();
+            						}
+            						HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 514)						inValue = ::thenshim::_Promise::Promise_Impl__obj::then(_gthis->db->exec(HX_("SELECT member_id, display_name, photo_uri, is_self, chat, json(roles) AS roles, json(presence) AS presence, jid FROM members WHERE account_id=? AND member_id=? LIMIT 1",d3,cf,b4,b6),::cpp::VirtualArray_obj::__new(2)->init(0,accountId)->init(1,update->id)), ::Dynamic(new _hx_Closure_0()),null());
+            					}
+HXLINE( 513)					::Dynamic inValue1 = ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(inValue, ::Dynamic(new _hx_Closure_2(_gthis,chat,accountId,update)),null()), ::Dynamic(new _hx_Closure_3(_gthis,updatedIds,chat,update)),null());
+HXDLIN( 513)					result->__unsafe_set(i,inValue1);
+            				}
             			}
-            			HX_END_LOCAL_FUNC1(return)
+            		}
+HXDLIN( 513)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(result), ::Dynamic(new _hx_Closure_5(_gthis,chat,accountId)),null()), ::Dynamic(new _hx_Closure_8(isFullList,_gthis,updatedIds,chat,accountId)),null()), ::Dynamic(new _hx_Closure_9()),null());
+            	}
 
-            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_400_storeMessages)
-HXLINE( 400)			return ::thenshim::_Promise::Promise_Impl__obj::then(_gthis->hydrateReplyTo(accountId,messages,replyTos), ::Dynamic(new _hx_Closure_1(_gthis,accountId)),null());
+
+HX_DEFINE_DYNAMIC_FUNC4(Sqlite_obj,storeMemberUpdates,return )
+
+::Dynamic Sqlite_obj::clearMemberPresence(::String accountId,::String chatId){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            		bool _hx_run( ::haxe::iterators::ArrayIterator _){
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_578_clearMemberPresence)
+HXLINE( 578)			return true;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_349_storeMessages)
-HXDLIN( 349)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 350)		if ((messages->length < 1)) {
-HXLINE( 351)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(messages);
-            		}
-HXLINE( 354)		::Array< ::String > chatIds = ::Array_obj< ::String >::__new(0);
-HXLINE( 355)		::Array< ::String > localIds = ::Array_obj< ::String >::__new(0);
-HXLINE( 356)		::Array< ::Dynamic> replyTos = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 357)		{
-HXLINE( 357)			int _g = 0;
-HXDLIN( 357)			while((_g < messages->length)){
-HXLINE( 357)				 ::borogove::ChatMessage message = messages->__get(_g).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 357)				_g = (_g + 1);
-HXLINE( 358)				bool _hx_tmp;
-HXDLIN( 358)				if (::hx::IsNull( message->serverId )) {
-HXLINE( 358)					_hx_tmp = ::hx::IsNull( message->localId );
-            				}
-            				else {
-HXLINE( 358)					_hx_tmp = false;
-            				}
-HXDLIN( 358)				if (_hx_tmp) {
-HXLINE( 358)					HX_STACK_DO_THROW(HX_("Cannot store a message with no id",54,e5,b0,de));
-            				}
-HXLINE( 359)				bool _hx_tmp1;
-HXDLIN( 359)				if (::hx::IsNull( message->serverId )) {
-HXLINE( 359)					_hx_tmp1 = message->isIncoming();
-            				}
-            				else {
-HXLINE( 359)					_hx_tmp1 = false;
-            				}
-HXDLIN( 359)				if (_hx_tmp1) {
-HXLINE( 359)					HX_STACK_DO_THROW(HX_("Cannot store an incoming message with no server id",d7,6d,19,fb));
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_573_clearMemberPresence)
+HXLINE( 574)		::String _hx_tmp;
+HXDLIN( 574)		if (::hx::IsNull( chatId )) {
+HXLINE( 574)			_hx_tmp = HX_("UPDATE members SET presence=jsonb('{}') WHERE account_id=?",f1,87,fc,6b);
+            		}
+            		else {
+HXLINE( 574)			_hx_tmp = HX_("UPDATE members SET presence=jsonb('{}') WHERE account_id=? AND chat_id=?",ec,c0,03,23);
+            		}
+HXLINE( 577)		::cpp::VirtualArray _hx_tmp1;
+HXDLIN( 577)		if (::hx::IsNull( chatId )) {
+HXLINE( 577)			_hx_tmp1 = ::cpp::VirtualArray_obj::__new(1)->init(0,accountId);
+            		}
+            		else {
+HXLINE( 577)			_hx_tmp1 = ::cpp::VirtualArray_obj::__new(2)->init(0,accountId)->init(1,chatId);
+            		}
+HXLINE( 573)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(_hx_tmp,_hx_tmp1), ::Dynamic(new _hx_Closure_0()),null());
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,clearMemberPresence,return )
+
+::Dynamic Sqlite_obj::getMembers(::String accountId, ::borogove::Chat chat,bool forModerator){
+            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis, ::borogove::Chat,chat,bool,forModerator) HXARGC(1)
+            		::Array< ::Dynamic> _hx_run( ::haxe::iterators::ArrayIterator rows){
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_600_getMembers)
+HXLINE( 601)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 602)			while((rows->current < rows->array->get_length())){
+HXLINE( 603)				 ::borogove::Member member = _gthis->hydrateStoredMember(chat,rows->array->__get(rows->current++));
+HXLINE( 604)				if (::hx::IsNull( member )) {
+HXLINE( 604)					continue;
             				}
-HXLINE( 360)				bool _hx_tmp2;
-HXDLIN( 360)				if (::hx::IsNotNull( message->serverId )) {
-HXLINE( 360)					_hx_tmp2 = ::hx::IsNull( message->serverIdBy );
+HXLINE( 606)				result->push(member);
+            			}
+HXLINE( 608)			bool _hx_tmp;
+HXDLIN( 608)			if ((result->length > 1000)) {
+HXLINE( 608)				_hx_tmp = !(forModerator);
+            			}
+            			else {
+HXLINE( 608)				_hx_tmp = false;
+            			}
+HXDLIN( 608)			if (_hx_tmp) {
+HXLINE( 608)				::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 608)				{
+HXLINE( 608)					int _g1 = 0;
+HXDLIN( 608)					while((_g1 < result->length)){
+HXLINE( 608)						 ::borogove::Member v = result->__get(_g1).StaticCast<  ::borogove::Member >();
+HXDLIN( 608)						_g1 = (_g1 + 1);
+HXDLIN( 608)						if ((v->showPresence != 4)) {
+HXLINE( 608)							_g->push(v);
+            						}
+            					}
             				}
-            				else {
-HXLINE( 360)					_hx_tmp2 = false;
+HXDLIN( 608)				return _g;
+            			}
+HXLINE( 609)			return result;
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_582_getMembers)
+HXDLIN( 582)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 598)		int _hx_tmp;
+HXDLIN( 598)		if (forModerator) {
+HXLINE( 598)			_hx_tmp = 20000;
+            		}
+            		else {
+HXLINE( 598)			_hx_tmp = 2000;
+            		}
+HXLINE( 583)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec((HX_("SELECT\n\t\t\t\tmember_id, display_name, photo_uri, is_self, chat,\n\t\t\t\tjson(roles) AS roles, json(presence) AS presence, jid,\n\t\t\t\tCOALESCE(\n\t\t\t\t\t(SELECT MAX(CASE value->>'$.id' WHEN 'owner' THEN 4 WHEN 'admin' THEN 3 WHEN 'none' THEN 1 WHEN 'outcast' THEN 0 ELSE 2 END) FROM json_each(roles)),\n\t\t\t\t\t2\n\t\t\t\t) AS role_rank,\n\t\t\t\tCASE WHEN json(presence) NOT LIKE '% type=\\\"unavailable\\\"%' THEN 1 ELSE 0 END AS is_online\n\t\t\tFROM members\n\t\t\tWHERE\n\t\t\t\taccount_id=? AND chat_id=?\n\t\t\t\tAND (? OR NOT EXISTS (SELECT 1 FROM json_each(roles) WHERE value->>'$.id' = 'outcast'))\n\t\t\t\tAND NOT (EXISTS (SELECT 1 FROM json_each(roles) WHERE value->>'$.id' = 'none') AND NOT is_online)\n\t\t\tORDER BY role_rank DESC, is_online DESC, LOWER(display_name) ASC\n\t\t\tLIMIT ",d2,99,b7,60) + _hx_tmp),::cpp::VirtualArray_obj::__new(3)->init(0,accountId)->init(1,chat->chatId)->init(2,forModerator)), ::Dynamic(new _hx_Closure_0(_gthis,chat,forModerator)),null());
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC3(Sqlite_obj,getMembers,return )
+
+::Dynamic Sqlite_obj::getMemberDetails(::String accountId, ::borogove::Chat chat,::Array< ::String > ids){
+            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis, ::borogove::Chat,chat,::Array< ::String >,ids) HXARGC(1)
+            		::Array< ::Dynamic> _hx_run( ::haxe::iterators::ArrayIterator rows){
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_622_getMemberDetails)
+HXLINE( 623)			 ::haxe::ds::StringMap lookup =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 624)			while((rows->current < rows->array->get_length())){
+HXLINE( 624)				 ::Dynamic row = rows->array->__get(rows->current++);
+HXLINE( 625)				{
+HXLINE( 625)					::String key = ( (::String)(row->__Field(HX_("member_id",e0,03,69,b8),::hx::paccDynamic)) );
+HXDLIN( 625)					lookup->set(key,_gthis->hydrateStoredMember(chat,row));
             				}
-HXDLIN( 360)				if (_hx_tmp2) {
-HXLINE( 360)					HX_STACK_DO_THROW(HX_("Cannot store a message with a server id and no by",00,9f,b7,38));
+            			}
+HXLINE( 628)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(ids->length);
+HXDLIN( 628)			{
+HXLINE( 628)				int _g = 0;
+HXDLIN( 628)				int _g1 = ids->length;
+HXDLIN( 628)				while((_g < _g1)){
+HXLINE( 628)					_g = (_g + 1);
+HXDLIN( 628)					int i = (_g - 1);
+HXDLIN( 628)					{
+HXLINE( 628)						 ::borogove::Member inValue = ( ( ::borogove::Member)(lookup->get(_hx_array_unsafe_get(ids,i))) );
+HXDLIN( 628)						result->__unsafe_set(i,inValue);
+            					}
             				}
-HXLINE( 362)				bool _hx_tmp3;
-HXDLIN( 362)				if (!(message->isIncoming())) {
-HXLINE( 362)					_hx_tmp3 = (message->versions->length < 1);
+            			}
+HXDLIN( 628)			return result;
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_614_getMemberDetails)
+HXDLIN( 614)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 615)		if ((ids->length == 0)) {
+HXLINE( 615)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+            		}
+HXLINE( 617)		::Array< ::String > result = ::Array_obj< ::String >::__new(ids->length);
+HXDLIN( 617)		{
+HXLINE( 617)			int _g = 0;
+HXDLIN( 617)			int _g1 = ids->length;
+HXDLIN( 617)			while((_g < _g1)){
+HXLINE( 617)				_g = (_g + 1);
+HXDLIN( 617)				int i = (_g - 1);
+HXDLIN( 617)				{
+HXLINE( 617)					_hx_array_unsafe_get(ids,i);
+HXDLIN( 617)					result->__unsafe_set(i,HX_("?",3f,00,00,00));
             				}
-            				else {
-HXLINE( 362)					_hx_tmp3 = false;
+            			}
+            		}
+HXDLIN( 617)		::String placeholders = result->join(HX_(", ",74,26,00,00));
+HXLINE( 620)		::Array< ::String > params = ::Array_obj< ::String >::__new(1)->init(0,accountId)->concat(ids);
+HXLINE( 622)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(((HX_("SELECT member_id, display_name, photo_uri, is_self, chat, json(roles) AS roles, json(presence) AS presence, jid FROM members WHERE account_id = ? AND member_id IN (",ee,1d,8e,8d) + placeholders) + HX_(")",29,00,00,00)),params), ::Dynamic(new _hx_Closure_0(_gthis,chat,ids)),null());
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC3(Sqlite_obj,getMemberDetails,return )
+
+::Dynamic Sqlite_obj::searchMessages(::String accountId,::String chatId,::String q){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
+            		::Array< ::Dynamic> _hx_run( ::haxe::iterators::ArrayIterator result){
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_640_searchMessages)
+HXLINE( 640)			return _gthis->hydrateMessages(accountId,result);
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_633_searchMessages)
+HXDLIN( 633)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 634)		::String sql = HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sort_id, sync_point FROM messages WHERE account_id=? AND stanza LIKE ?",c2,96,a8,85);
+HXLINE( 635)		::Array< ::String > params = ::Array_obj< ::String >::__new(2)->init(0,accountId)->init(1,((HX_("%",25,00,00,00) + q) + HX_("%",25,00,00,00)));
+HXLINE( 636)		if (::hx::IsNotNull( chatId )) {
+HXLINE( 637)			sql = (HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sort_id, sync_point FROM messages WHERE account_id=? AND stanza LIKE ?",c2,96,a8,85) + HX_(" AND chat_id=?",3b,95,e7,43));
+HXLINE( 638)			params->push(chatId);
+            		}
+HXLINE( 640)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(sql,params), ::Dynamic(new _hx_Closure_0(_gthis,accountId)),null());
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC3(Sqlite_obj,searchMessages,return )
+
+::Dynamic Sqlite_obj::getChats(::String accountId){
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_2, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
+            		::Dynamic _hx_run( ::haxe::iterators::ArrayIterator result){
+            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::haxe::iterators::ArrayIterator,result) HXARGC(0)
+            			 ::haxe::iterators::ArrayIterator _hx_run(){
+            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_649_getChats)
+HXLINE( 649)				return result;
+            			}
+            			HX_END_LOCAL_FUNC0(return)
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::persistence::Sqlite,_gthis,::Array< ::Dynamic>,rows) HXARGC(1)
+            			::Array< ::Dynamic> _hx_run( ::haxe::ds::StringMap chatData){
+            				HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_650_getChats)
+HXLINE( 651)				::Array< ::Dynamic> chats = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 652)				{
+HXLINE( 652)					int _g = 0;
+HXDLIN( 652)					while((_g < rows->length)){
+HXLINE( 652)						 ::Dynamic row = rows->__get(_g);
+HXDLIN( 652)						_g = (_g + 1);
+HXLINE( 653)						 ::Dynamic capsJson;
+HXDLIN( 653)						if (::hx::IsNull( row->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic) )) {
+HXLINE( 653)							capsJson = null();
+            						}
+            						else {
+HXLINE( 653)							capsJson =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic)) ))->doParse();
+            						}
+HXLINE( 654)						 ::borogove::Caps _hx_tmp;
+HXDLIN( 654)						if (::hx::IsNull( capsJson )) {
+HXLINE( 654)							_hx_tmp = null();
+            						}
+            						else {
+HXLINE( 654)							_hx_tmp = _gthis->hydrateCaps(capsJson,( (::Array< unsigned char >)(row->__Field(HX_("caps_ver",05,68,56,1e),::hx::paccDynamic)) ));
+            						}
+HXDLIN( 654)						row->__SetField(HX_("capsObj",56,b6,8b,a6),_hx_tmp,::hx::paccDynamic);
+HXLINE( 656)						 ::Dynamic metaJson =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("meta",c5,4a,59,48),::hx::paccDynamic)) ))->doParse();
+HXLINE( 657)						 ::haxe::ds::StringMap threadsMap =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE( 658)						{
+HXLINE( 658)							 ::Dynamic this1;
+HXDLIN( 658)							 ::Dynamic tmp =  ::Dynamic(metaJson->__Field(HX_("threads",69,f6,91,53),::hx::paccDynamic));
+HXDLIN( 658)							if (::hx::IsNotNull( tmp )) {
+HXLINE( 658)								this1 = tmp;
+            							}
+            							else {
+HXLINE( 658)								this1 =  ::Dynamic(::hx::Anon_obj::Create(0));
+            							}
+HXDLIN( 658)							 ::Dynamic access = this1;
+HXDLIN( 658)							::Array< ::String > _g_keys = ::Reflect_obj::fields(access);
+HXDLIN( 658)							int _g_index = 0;
+HXDLIN( 658)							while((_g_index < _g_keys->length)){
+HXLINE( 658)								_g_index = (_g_index + 1);
+HXDLIN( 658)								::String key = _g_keys->__get((_g_index - 1));
+HXDLIN( 658)								::String _g_value = ( (::String)(::Reflect_obj::field(access,key)) );
+HXLINE( 659)								{
+HXLINE( 659)									::String k;
+HXDLIN( 659)									if ((key == HX_("",00,00,00,00))) {
+HXLINE( 659)										k = null();
+            									}
+            									else {
+HXLINE( 659)										k = key;
+            									}
+HXDLIN( 659)									::String _hx_tmp1;
+HXDLIN( 659)									if (::hx::IsNull( k )) {
+HXLINE( 659)										_hx_tmp1 = ::borogove::_Chat::Chat_Fields__obj::nullSentinel;
+            									}
+            									else {
+HXLINE( 659)										_hx_tmp1 = k;
+            									}
+HXDLIN( 659)									threadsMap->set(_hx_tmp1,_g_value);
+            								}
+            							}
+            						}
+HXLINE( 663)						 ::Dynamic derived = chatData->get( ::Dynamic(row->__Field(HX_("chat_id",22,ea,bd,d0),::hx::paccDynamic)));
+HXLINE( 664)						::String row1 = ( (::String)(row->__Field(HX_("chat_id",22,ea,bd,d0),::hx::paccDynamic)) );
+HXDLIN( 664)						bool _hx_tmp2 = ::hx::IsNotEq( row->__Field(HX_("trusted",f7,b7,a6,16),::hx::paccDynamic),0 );
+HXDLIN( 664)						bool _hx_tmp3 = ::hx::IsNotEq( row->__Field(HX_("bookmarked",95,fe,f6,fb),::hx::paccDynamic),0 );
+HXDLIN( 664)						::Array< unsigned char > row2 = ( (::Array< unsigned char >)(row->__Field(HX_("avatar_sha1",ab,69,a3,a4),::hx::paccDynamic)) );
+HXDLIN( 664)						 ::haxe::ds::StringMap _hx_tmp4;
+HXDLIN( 664)						 ::haxe::ds::StringMap tmp1 = ( ( ::haxe::ds::StringMap)(derived->__Field(HX_("presence",3b,52,d7,66),::hx::paccDynamic)) );
+HXDLIN( 664)						if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 664)							_hx_tmp4 = tmp1;
+            						}
+            						else {
+HXLINE( 664)							_hx_tmp4 =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+            						}
+HXDLIN( 664)						::Array< ::Dynamic> _hx_tmp5;
+HXDLIN( 664)						if (::hx::IsNotNull( derived )) {
+HXLINE( 664)							_hx_tmp5 = ( (::Array< ::Dynamic>)(derived->__Field(HX_("membersForName",1b,56,f2,d2),::hx::paccDynamic)) );
+            						}
+            						else {
+HXLINE( 664)							_hx_tmp5 = null();
+            						}
+HXDLIN( 664)						::String row3 = ( (::String)(row->__Field(HX_("fn",48,59,00,00),::hx::paccDynamic)) );
+HXDLIN( 664)						 ::Dynamic row4 = row->__Field(HX_("ui_state",a6,9a,4e,b2),::hx::paccDynamic);
+HXDLIN( 664)						bool _hx_tmp6 = ::hx::IsNotEq( row->__Field(HX_("blocked",ec,7a,fe,44),::hx::paccDynamic),0 );
+HXDLIN( 664)						 ::Dynamic tmp2 = metaJson->__Field(HX_("status",32,e7,fb,05),::hx::paccDynamic);
+HXDLIN( 664)						::String tmp3;
+HXDLIN( 664)						if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 664)							tmp3 = ( (::String)(tmp2->__Field(HX_("emoji",86,6f,d9,6f),::hx::paccDynamic)) );
+            						}
+            						else {
+HXLINE( 664)							tmp3 = null();
+            						}
+HXDLIN( 664)						::String _hx_tmp7;
+HXDLIN( 664)						if (::hx::IsNotNull( tmp3 )) {
+HXLINE( 664)							_hx_tmp7 = tmp3;
+            						}
+            						else {
+HXLINE( 664)							_hx_tmp7 = HX_("",00,00,00,00);
+            						}
+HXDLIN( 664)						 ::Dynamic tmp4 = metaJson->__Field(HX_("status",32,e7,fb,05),::hx::paccDynamic);
+HXDLIN( 664)						::String tmp5;
+HXDLIN( 664)						if (::hx::IsNotNull( tmp4 )) {
+HXLINE( 664)							tmp5 = ( (::String)(tmp4->__Field(HX_("text",ad,cc,f9,4c),::hx::paccDynamic)) );
+            						}
+            						else {
+HXLINE( 664)							tmp5 = null();
+            						}
+HXDLIN( 664)						::String _hx_tmp8;
+HXDLIN( 664)						if (::hx::IsNotNull( tmp5 )) {
+HXLINE( 664)							_hx_tmp8 = tmp5;
+            						}
+            						else {
+HXLINE( 664)							_hx_tmp8 = HX_("",00,00,00,00);
+            						}
+HXDLIN( 664)						 ::borogove::Status _hx_tmp9 =  ::borogove::Status_obj::__alloc( HX_CTX ,_hx_tmp7,_hx_tmp8);
+HXDLIN( 664)						::String row5 = ( (::String)(row->__Field(HX_("extensions",14,7c,70,89),::hx::paccDynamic)) );
+HXDLIN( 664)						::String row6 = ( (::String)(row->__Field(HX_("read_up_to_id",84,60,ad,9e),::hx::paccDynamic)) );
+HXDLIN( 664)						::String row7 = ( (::String)(row->__Field(HX_("read_up_to_by",80,5a,ad,9e),::hx::paccDynamic)) );
+HXDLIN( 664)						 ::Dynamic _hx_tmp10;
+HXDLIN( 664)						if (::hx::IsNull( row->__Field(HX_("notifications_filtered",4e,91,57,51),::hx::paccDynamic) )) {
+HXLINE( 664)							_hx_tmp10 = null();
+            						}
+            						else {
+HXLINE( 664)							_hx_tmp10 = ::hx::IsNotEq( row->__Field(HX_("notifications_filtered",4e,91,57,51),::hx::paccDynamic),0 );
+            						}
+HXDLIN( 664)						bool _hx_tmp11 = ::hx::IsNotEq( row->__Field(HX_("notify_mention",34,44,26,d0),::hx::paccDynamic),0 );
+HXDLIN( 664)						bool _hx_tmp12 = ::hx::IsNotEq( row->__Field(HX_("notify_reply",f4,e7,df,1b),::hx::paccDynamic),0 );
+HXDLIN( 664)						 ::borogove::Caps row8 = ( ( ::borogove::Caps)(row->__Field(HX_("capsObj",56,b6,8b,a6),::hx::paccDynamic)) );
+HXDLIN( 664)						::String metaJson1 = ( (::String)(metaJson->__Field(HX_("mavUntil",9c,52,56,84),::hx::paccDynamic)) );
+HXDLIN( 664)						chats->push( ::borogove::SerializedChat_obj::__alloc( HX_CTX ,row1,_hx_tmp2,_hx_tmp3,row2,_hx_tmp4,_hx_tmp5,row3,row4,_hx_tmp6,_hx_tmp9,row5,row6,row7,_hx_tmp10,_hx_tmp11,_hx_tmp12,threadsMap,row8,metaJson1,::Array_obj< int >::__new(0),( (::String)(::Reflect_obj::field(row,HX_("class",38,78,58,48))) )));
+            					}
             				}
-HXDLIN( 362)				if (_hx_tmp3) {
-HXLINE( 365)					chatIds->push(message->chatId());
-HXLINE( 366)					localIds->push(message->localId);
+HXLINE( 666)				return chats;
+            			}
+            			HX_END_LOCAL_FUNC1(return)
+
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_648_getChats)
+HXLINE( 649)			::Array< ::Dynamic> rows = ::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(0,HX_("iterator",ee,49,9a,93), ::Dynamic(new _hx_Closure_0(result)))));
+HXLINE( 650)			return ::thenshim::_Promise::Promise_Impl__obj::then(_gthis->chatPresenceAndMembersForName(accountId,rows), ::Dynamic(new _hx_Closure_1(_gthis,rows)),null());
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_644_getChats)
+HXDLIN( 644)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 645)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT chat_id, trusted, bookmarked, avatar_sha1, fn, ui_state, blocked, extensions, read_up_to_id, read_up_to_by, notifications_filtered, notify_mention, notify_reply, json(caps) AS caps, caps_ver, json(meta) AS meta, class FROM chats LEFT JOIN caps ON chats.caps_ver=caps.sha1 WHERE account_id=?",3b,68,96,e9),::cpp::VirtualArray_obj::__new(1)->init(0,accountId)), ::Dynamic(new _hx_Closure_2(_gthis,accountId)),null());
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(Sqlite_obj,getChats,return )
+
+::Dynamic Sqlite_obj::storeMessages(::String accountId,::Array< ::Dynamic> messages){
+            		HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_3,::Array< ::Dynamic>,messages, ::borogove::persistence::Sqlite,_gthis,::Array< ::Dynamic>,replyTos,::String,accountId) HXARGC(0)
+            		::Dynamic _hx_run(){
+            			HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0,::Array< ::Dynamic>,messages, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
+            			::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_713_storeMessages)
+HXLINE( 713)				::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(messages->length);
+HXDLIN( 713)				{
+HXLINE( 713)					int _g = 0;
+HXDLIN( 713)					int _g1 = messages->length;
+HXDLIN( 713)					while((_g < _g1)){
+HXLINE( 713)						_g = (_g + 1);
+HXDLIN( 713)						int i = (_g - 1);
+HXDLIN( 713)						{
+HXLINE( 713)							 ::borogove::ChatMessage m = ( ( ::borogove::ChatMessage)(_hx_array_unsafe_get(messages,i)) );
+HXDLIN( 713)							::Dynamic inValue = _gthis->fetchFromStub(accountId,m);
+HXDLIN( 713)							result->__unsafe_set(i,inValue);
+            						}
+            					}
             				}
-HXLINE( 368)				bool _hx_tmp4;
-HXDLIN( 368)				if (::hx::IsNotNull( message->replyToMessage )) {
-HXLINE( 368)					_hx_tmp4 = ::hx::IsNull( message->replyToMessage->serverIdBy );
+HXDLIN( 713)				return ::thenshim::PromiseTools_obj::all(result);
+            			}
+            			HX_END_LOCAL_FUNC1(return)
+
+            			HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_1, ::borogove::persistence::Sqlite,_gthis,::Array< ::Dynamic>,replyTos,::String,accountId) HXARGC(1)
+            			::Dynamic _hx_run(::Array< ::Dynamic> ms){
+            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_715_storeMessages)
+HXLINE( 715)				return _gthis->hydrateReplyTo(accountId,ms,replyTos);
+            			}
+            			HX_END_LOCAL_FUNC1(return)
+
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_2, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
+            			::Dynamic _hx_run(::Array< ::Dynamic> ms){
+            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_717_storeMessages)
+HXLINE( 717)				return _gthis->hydrateReactions(accountId,ms);
+            			}
+            			HX_END_LOCAL_FUNC1(return)
+
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_699_storeMessages)
+HXLINE( 699)			 ::borogove::persistence::SqliteDriver _gthis1 = _gthis->db;
+HXLINE( 700)			::Array< ::String > result = ::Array_obj< ::String >::__new(messages->length);
+HXDLIN( 700)			{
+HXLINE( 700)				int _g = 0;
+HXDLIN( 700)				int _g1 = messages->length;
+HXDLIN( 700)				while((_g < _g1)){
+HXLINE( 700)					_g = (_g + 1);
+HXDLIN( 700)					int i = (_g - 1);
+HXDLIN( 700)					{
+HXLINE( 700)						_hx_array_unsafe_get(messages,i);
+HXDLIN( 700)						result->__unsafe_set(i,HX_("(?,?,?,?,?,?,?,?,CAST(unixepoch(?, 'subsec') * 1000 AS INTEGER),?,?,?,?,?,?)",30,21,d1,bd));
+            					}
             				}
-            				else {
-HXLINE( 368)					_hx_tmp4 = false;
+            			}
+HXDLIN( 700)			::String _hx_tmp = (HX_("INSERT OR REPLACE INTO messages VALUES ",28,32,a2,bc) + result->join(HX_(",",2c,00,00,00)));
+HXLINE( 701)			::Array< ::Dynamic> _g2 = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 701)			{
+HXLINE( 701)				int _g_current = 0;
+HXDLIN( 701)				::Array< ::Dynamic> _g_array = messages;
+HXDLIN( 701)				while((_g_current < _g_array->length)){
+HXLINE( 701)					_g_current = (_g_current + 1);
+HXDLIN( 701)					 ::borogove::ChatMessage x = _g_array->__get((_g_current - 1)).StaticCast<  ::borogove::ChatMessage >();
+HXLINE( 703)					 ::borogove::ChatMessage message;
+HXDLIN( 703)					if ((x->versions->length == 1)) {
+HXLINE( 703)						message = x->versions->__get(0).StaticCast<  ::borogove::ChatMessage >();
+            					}
+            					else {
+HXLINE( 703)						message = x;
+            					}
+HXLINE( 705)					::String accountId1 = accountId;
+HXDLIN( 705)					::String _hx_tmp1;
+HXDLIN( 705)					::String tmp = message->serverId;
+HXDLIN( 705)					if (::hx::IsNotNull( tmp )) {
+HXLINE( 705)						_hx_tmp1 = tmp;
+            					}
+            					else {
+HXLINE( 705)						_hx_tmp1 = HX_("",00,00,00,00);
+            					}
+HXDLIN( 705)					::String _hx_tmp2;
+HXDLIN( 705)					::String tmp1 = message->serverIdBy;
+HXDLIN( 705)					if (::hx::IsNotNull( tmp1 )) {
+HXLINE( 705)						_hx_tmp2 = tmp1;
+            					}
+            					else {
+HXLINE( 705)						_hx_tmp2 = HX_("",00,00,00,00);
+            					}
+HXLINE( 706)					::String _hx_tmp3;
+HXDLIN( 706)					::String tmp2 = message->localId;
+HXDLIN( 706)					if (::hx::IsNotNull( tmp2 )) {
+HXLINE( 706)						_hx_tmp3 = tmp2;
+            					}
+            					else {
+HXLINE( 706)						_hx_tmp3 = HX_("",00,00,00,00);
+            					}
+HXDLIN( 706)					::String _hx_tmp4;
+HXDLIN( 706)					::String tmp3 = x->callSid();
+HXDLIN( 706)					::String tmp4;
+HXDLIN( 706)					if (::hx::IsNotNull( tmp3 )) {
+HXLINE( 706)						tmp4 = tmp3;
+            					}
+            					else {
+HXLINE( 706)						tmp4 = x->localId;
+            					}
+HXDLIN( 706)					if (::hx::IsNotNull( tmp4 )) {
+HXLINE( 706)						_hx_tmp4 = tmp4;
+            					}
+            					else {
+HXLINE( 706)						_hx_tmp4 = x->serverId;
+            					}
+HXDLIN( 706)					bool correctable = x->syncPoint;
+HXLINE( 707)					::String _hx_tmp5 = x->chatId();
+HXDLIN( 707)					::String correctable1 = x->senderId;
+HXLINE( 708)					::String message1 = message->timestamp;
+HXDLIN( 708)					int message2 = message->status;
+HXDLIN( 708)					int message3 = message->direction;
+HXDLIN( 708)					int message4 = message->type;
+HXLINE( 709)					::String _hx_tmp6 = message->asStanza()->toString();
+HXLINE( 701)					_g2->push(::cpp::VirtualArray_obj::__new(15)->init(0,accountId1)->init(1,_hx_tmp1)->init(2,_hx_tmp2)->init(3,_hx_tmp3)->init(4,_hx_tmp4)->init(5,correctable)->init(6,_hx_tmp5)->init(7,correctable1)->init(8,message1)->init(9,message2)->init(10,message3)->init(11,message4)->init(12,_hx_tmp6)->init(13,message->statusText)->init(14,message->sortId));
             				}
-HXDLIN( 368)				if (_hx_tmp4) {
-HXLINE( 369)					::Array< ::Dynamic> replyTos1 = replyTos;
-HXDLIN( 369)					::String _hx_tmp5 = message->chatId();
-HXDLIN( 369)					replyTos1->push( ::Dynamic(::hx::Anon_obj::Create(3)
-            						->setFixed(0,HX_("chatId",d3,04,77,b7),_hx_tmp5)
-            						->setFixed(1,HX_("serverId",7e,01,b2,e2),message->replyToMessage->serverId)
-            						->setFixed(2,HX_("localId",26,7a,c6,2d),message->replyToMessage->localId)));
+            			}
+HXDLIN( 701)			::cpp::VirtualArray _g3 = ::cpp::VirtualArray_obj::__new(0);
+HXDLIN( 701)			{
+HXLINE( 701)				 ::Dynamic e = _g2->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 701)				while(( (bool)(e->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 701)					 ::Dynamic x1 = e->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 701)					while(( (bool)(x1->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 701)						_g3->push(x1->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+            					}
             				}
             			}
+HXLINE( 699)			return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(_gthis1->exec(_hx_tmp,_g3), ::Dynamic(new _hx_Closure_0(messages,_gthis,accountId)),null()), ::Dynamic(new _hx_Closure_1(_gthis,replyTos,accountId)),null()), ::Dynamic(new _hx_Closure_2(_gthis,accountId)),null());
             		}
-HXLINE( 373)		::Dynamic _hx_tmp6;
-HXDLIN( 373)		bool _hx_tmp7;
-HXDLIN( 373)		if ((chatIds->length > 0)) {
-HXLINE( 373)			_hx_tmp7 = (localIds->length > 0);
-            		}
-            		else {
-HXLINE( 373)			_hx_tmp7 = false;
+            		HX_END_LOCAL_FUNC0(return)
+
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_672_storeMessages)
+HXDLIN( 672)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 673)		if ((messages->length < 1)) {
+HXLINE( 674)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(messages);
             		}
-HXDLIN( 373)		if (_hx_tmp7) {
-HXLINE( 375)			 ::StringBuf q =  ::StringBuf_obj::__alloc( HX_CTX );
-HXLINE( 376)			{
-HXLINE( 376)				if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 376)					q->flush();
+HXLINE( 677)		::Array< ::String > chatIds = ::Array_obj< ::String >::__new(0);
+HXLINE( 678)		::Array< ::String > localIds = ::Array_obj< ::String >::__new(0);
+HXLINE( 679)		::Array< ::Dynamic> replyTos = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 680)		{
+HXLINE( 680)			int _g = 0;
+HXDLIN( 680)			while((_g < messages->length)){
+HXLINE( 680)				 ::borogove::ChatMessage message = messages->__get(_g).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN( 680)				_g = (_g + 1);
+HXLINE( 681)				if (::hx::IsNull( message->sortId )) {
+HXLINE( 681)					HX_STACK_DO_THROW(HX_("Cannot store a message with no sortId",d2,b4,dc,b7));
             				}
-HXDLIN( 376)				if (::hx::IsNull( q->b )) {
-HXLINE( 376)					q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_56,1);
+HXLINE( 682)				bool _hx_tmp;
+HXDLIN( 682)				if (::hx::IsNull( message->serverId )) {
+HXLINE( 682)					_hx_tmp = ::hx::IsNull( message->localId );
             				}
             				else {
-HXLINE( 376)					q->b->push(HX_("DELETE FROM messages WHERE account_id=? AND direction=? AND chat_id IN (",a1,9c,a2,06));
-            				}
-            			}
-HXLINE( 377)			{
-HXLINE( 377)				::Array< ::String > result = ::Array_obj< ::String >::__new(chatIds->length);
-HXDLIN( 377)				{
-HXLINE( 377)					int _g1 = 0;
-HXDLIN( 377)					int _g2 = chatIds->length;
-HXDLIN( 377)					while((_g1 < _g2)){
-HXLINE( 377)						_g1 = (_g1 + 1);
-HXDLIN( 377)						int i = (_g1 - 1);
-HXDLIN( 377)						{
-HXLINE( 377)							_hx_array_unsafe_get(chatIds,i);
-HXDLIN( 377)							result->__unsafe_set(i,HX_("?",3f,00,00,00));
-            						}
-            					}
+HXLINE( 682)					_hx_tmp = false;
             				}
-HXDLIN( 377)				::String x = result->join(HX_(",",2c,00,00,00));
-HXDLIN( 377)				if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 377)					q->flush();
+HXDLIN( 682)				if (_hx_tmp) {
+HXLINE( 682)					HX_STACK_DO_THROW(HX_("Cannot store a message with no id",54,e5,b0,de));
             				}
-HXDLIN( 377)				if (::hx::IsNull( q->b )) {
-HXLINE( 377)					q->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(x));
+HXLINE( 683)				bool _hx_tmp1;
+HXDLIN( 683)				if (::hx::IsNull( message->serverId )) {
+HXLINE( 683)					_hx_tmp1 = message->isIncoming();
             				}
             				else {
-HXLINE( 377)					::Array< ::String > q1 = q->b;
-HXDLIN( 377)					q1->push(::Std_obj::string(x));
+HXLINE( 683)					_hx_tmp1 = false;
             				}
-            			}
-HXLINE( 378)			{
-HXLINE( 378)				if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 378)					q->flush();
+HXDLIN( 683)				if (_hx_tmp1) {
+HXLINE( 683)					HX_STACK_DO_THROW(HX_("Cannot store an incoming message with no server id",d7,6d,19,fb));
             				}
-HXDLIN( 378)				if (::hx::IsNull( q->b )) {
-HXLINE( 378)					q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_57,1);
+HXLINE( 684)				bool _hx_tmp2;
+HXDLIN( 684)				if (::hx::IsNotNull( message->serverId )) {
+HXLINE( 684)					_hx_tmp2 = ::hx::IsNull( message->serverIdBy );
             				}
             				else {
-HXLINE( 378)					q->b->push(HX_(") AND stanza_id IN (",e8,da,d3,eb));
-            				}
-            			}
-HXLINE( 379)			{
-HXLINE( 379)				::Array< ::String > result1 = ::Array_obj< ::String >::__new(localIds->length);
-HXDLIN( 379)				{
-HXLINE( 379)					int _g3 = 0;
-HXDLIN( 379)					int _g4 = localIds->length;
-HXDLIN( 379)					while((_g3 < _g4)){
-HXLINE( 379)						_g3 = (_g3 + 1);
-HXDLIN( 379)						int i1 = (_g3 - 1);
-HXDLIN( 379)						{
-HXLINE( 379)							_hx_array_unsafe_get(localIds,i1);
-HXDLIN( 379)							result1->__unsafe_set(i1,HX_("?",3f,00,00,00));
-            						}
-            					}
+HXLINE( 684)					_hx_tmp2 = false;
             				}
-HXDLIN( 379)				::String x1 = result1->join(HX_(",",2c,00,00,00));
-HXDLIN( 379)				if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 379)					q->flush();
+HXDLIN( 684)				if (_hx_tmp2) {
+HXLINE( 684)					HX_STACK_DO_THROW(HX_("Cannot store a message with a server id and no by",00,9f,b7,38));
             				}
-HXDLIN( 379)				if (::hx::IsNull( q->b )) {
-HXLINE( 379)					q->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(x1));
+HXLINE( 686)				bool _hx_tmp3;
+HXDLIN( 686)				if (!(message->isIncoming())) {
+HXLINE( 686)					_hx_tmp3 = (message->versions->length < 1);
             				}
             				else {
-HXLINE( 379)					::Array< ::String > q2 = q->b;
-HXDLIN( 379)					q2->push(::Std_obj::string(x1));
-            				}
-            			}
-HXLINE( 380)			{
-HXLINE( 380)				if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 380)					q->flush();
+HXLINE( 686)					_hx_tmp3 = false;
             				}
-HXDLIN( 380)				if (::hx::IsNull( q->b )) {
-HXLINE( 380)					q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_58,1);
+HXDLIN( 686)				if (_hx_tmp3) {
+HXLINE( 689)					chatIds->push(message->chatId());
+HXLINE( 690)					localIds->push(message->localId);
             				}
-            				else {
-HXLINE( 380)					q->b->push(HX_(")",29,00,00,00));
+HXLINE( 692)				if (::hx::IsNotNull( message->replyToMessage )) {
+HXLINE( 693)					::Array< ::Dynamic> replyTos1 = replyTos;
+HXDLIN( 693)					::String _hx_tmp4 = message->chatId();
+HXDLIN( 693)					replyTos1->push( ::Dynamic(::hx::Anon_obj::Create(3)
+            						->setFixed(0,HX_("chatId",d3,04,77,b7),_hx_tmp4)
+            						->setFixed(1,HX_("serverId",7e,01,b2,e2),message->replyToMessage->serverId)
+            						->setFixed(2,HX_("localId",26,7a,c6,2d),message->replyToMessage->localId)));
             				}
             			}
-HXLINE( 381)			 ::borogove::persistence::SqliteDriver _hx_tmp8 = this->db;
-HXDLIN( 381)			::String _hx_tmp9 = q->toString();
-HXLINE( 373)			_hx_tmp6 = _hx_tmp8->exec(_hx_tmp9,::cpp::VirtualArray_obj::__new(2)->init(0,accountId)->init(1,1)->concat(chatIds)->concat(localIds));
             		}
-            		else {
-HXLINE( 373)			_hx_tmp6 = ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
-            		}
-HXDLIN( 373)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp6, ::Dynamic(new _hx_Closure_0(messages,_gthis,accountId)),null()), ::Dynamic(new _hx_Closure_2(messages,_gthis,replyTos,accountId)),null());
+HXLINE( 697)		return this->storeMessagesSerialized->run( ::Dynamic(new _hx_Closure_3(messages,_gthis,replyTos,accountId)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,storeMessages,return )
 
 void Sqlite_obj::updateMessage(::String accountId, ::borogove::ChatMessage message){
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_408_updateMessage)
-HXDLIN( 408)		this->storeMessages(accountId,::Array_obj< ::Dynamic>::__new(1)->init(0,message));
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_726_updateMessage)
+HXDLIN( 726)		this->storeMessages(accountId,::Array_obj< ::Dynamic>::__new(1)->init(0,message));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,updateMessage,(void))
 
+::Dynamic Sqlite_obj::fetchFromStub(::String accountId, ::borogove::ChatMessage stub){
+            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,::String,accountId, ::borogove::ChatMessage,stub) HXARGC(1)
+            		 ::borogove::ChatMessage _hx_run( ::haxe::iterators::ArrayIterator results){
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_760_fetchFromStub)
+HXLINE( 761)			 ::Dynamic row = results->array->__get(results->current++);
+HXLINE( 762)			if (::hx::IsNull( row )) {
+HXLINE( 762)				return stub;
+            			}
+HXLINE( 763)			return _gthis->hydrateMessages(accountId, ::haxe::iterators::ArrayIterator_obj::__alloc( HX_CTX ,::Array_obj< ::Dynamic>::__new(1)->init(0,row)))->__get(0).StaticCast<  ::borogove::ChatMessage >();
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_729_fetchFromStub)
+HXDLIN( 729)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 730)		::String q = HX_("SELECT\n\t\t\tcorrection_id AS stanza_id,\n\t\t\tversions.stanza,\n\t\t\tjson_group_object(CASE WHEN versions.mam_id IS NULL OR versions.mam_id='' THEN versions.stanza_id ELSE versions.mam_id END, strftime('%FT%H:%M:%fZ', versions.created_at / 1000.0, 'unixepoch')) AS version_times,\n\t\t\tjson_group_object(CASE WHEN versions.mam_id IS NULL OR versions.mam_id='' THEN versions.stanza_id ELSE versions.mam_id END, versions.stanza) AS versions,\n\t\t\tmessages.direction,\n\t\t\tmessages.type,\n\t\t\tmessages.status,\n\t\t\tmessages.status_text,\n\t\t\tstrftime('%FT%H:%M:%fZ', messages.created_at / 1000.0, 'unixepoch') AS timestamp,\n\t\t\tmessages.sender_id,\n\t\t\tmessages.mam_id,\n\t\t\tmessages.mam_by,\n\t\t\tmessages.sort_id,\n\t\t\tmessages.sync_point,\n\t\t\tMAX(versions.created_at)\n\t\t\tFROM messages INNER JOIN messages versions USING (correction_id, sender_id) WHERE messages.account_id=? AND messages.chat_id=? AND (messages.stanza_id IS NULL OR messages.stanza_id='' OR messages.stanza_id=correction_id)",78,38,82,d4);
+HXLINE( 747)		::String accountId1 = accountId;
+HXDLIN( 747)		::Array< ::String > params = ::Array_obj< ::String >::__new(2)->init(0,accountId1)->init(1,stub->chatId());
+HXLINE( 748)		bool _hx_tmp;
+HXDLIN( 748)		if ((stub->versions->length <= 0)) {
+HXLINE( 748)			_hx_tmp = ::hx::IsNull( stub->serverId );
+            		}
+            		else {
+HXLINE( 748)			_hx_tmp = true;
+            		}
+HXDLIN( 748)		if (_hx_tmp) {
+HXLINE( 749)			q = (HX_("SELECT\n\t\t\tcorrection_id AS stanza_id,\n\t\t\tversions.stanza,\n\t\t\tjson_group_object(CASE WHEN versions.mam_id IS NULL OR versions.mam_id='' THEN versions.stanza_id ELSE versions.mam_id END, strftime('%FT%H:%M:%fZ', versions.created_at / 1000.0, 'unixepoch')) AS version_times,\n\t\t\tjson_group_object(CASE WHEN versions.mam_id IS NULL OR versions.mam_id='' THEN versions.stanza_id ELSE versions.mam_id END, versions.stanza) AS versions,\n\t\t\tmessages.direction,\n\t\t\tmessages.type,\n\t\t\tmessages.status,\n\t\t\tmessages.status_text,\n\t\t\tstrftime('%FT%H:%M:%fZ', messages.created_at / 1000.0, 'unixepoch') AS timestamp,\n\t\t\tmessages.sender_id,\n\t\t\tmessages.mam_id,\n\t\t\tmessages.mam_by,\n\t\t\tmessages.sort_id,\n\t\t\tmessages.sync_point,\n\t\t\tMAX(versions.created_at)\n\t\t\tFROM messages INNER JOIN messages versions USING (correction_id, sender_id) WHERE messages.account_id=? AND messages.chat_id=? AND (messages.stanza_id IS NULL OR messages.stanza_id='' OR messages.stanza_id=correction_id)",78,38,82,d4) + HX_(" AND correction_id=? AND sender_id=?",f3,c6,24,29));
+HXLINE( 750)			params->push(stub->localId);
+HXLINE( 751)			params->push(stub->senderId);
+            		}
+            		else {
+HXLINE( 752)			if (::hx::IsNotNull( stub->serverId )) {
+HXLINE( 753)				q = (HX_("SELECT\n\t\t\tcorrection_id AS stanza_id,\n\t\t\tversions.stanza,\n\t\t\tjson_group_object(CASE WHEN versions.mam_id IS NULL OR versions.mam_id='' THEN versions.stanza_id ELSE versions.mam_id END, strftime('%FT%H:%M:%fZ', versions.created_at / 1000.0, 'unixepoch')) AS version_times,\n\t\t\tjson_group_object(CASE WHEN versions.mam_id IS NULL OR versions.mam_id='' THEN versions.stanza_id ELSE versions.mam_id END, versions.stanza) AS versions,\n\t\t\tmessages.direction,\n\t\t\tmessages.type,\n\t\t\tmessages.status,\n\t\t\tmessages.status_text,\n\t\t\tstrftime('%FT%H:%M:%fZ', messages.created_at / 1000.0, 'unixepoch') AS timestamp,\n\t\t\tmessages.sender_id,\n\t\t\tmessages.mam_id,\n\t\t\tmessages.mam_by,\n\t\t\tmessages.sort_id,\n\t\t\tmessages.sync_point,\n\t\t\tMAX(versions.created_at)\n\t\t\tFROM messages INNER JOIN messages versions USING (correction_id, sender_id) WHERE messages.account_id=? AND messages.chat_id=? AND (messages.stanza_id IS NULL OR messages.stanza_id='' OR messages.stanza_id=correction_id)",78,38,82,d4) + HX_(" AND messages.mam_id=? AND messages.mam_by=?",74,6f,fe,39));
+HXLINE( 754)				params->push(stub->serverId);
+HXLINE( 755)				params->push(stub->serverIdBy);
+            			}
+            			else {
+HXLINE( 757)				HX_STACK_DO_THROW(HX_("No way to look up this message",be,4b,a4,e7));
+            			}
+            		}
+HXLINE( 759)		q = (q + HX_(" GROUP BY correction_id, CASE WHEN messages.type=? THEN 'call' ELSE messages.sender_id END",8a,13,81,0f));
+HXLINE( 760)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(q,params), ::Dynamic(new _hx_Closure_0(_gthis,accountId,stub)),null());
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,fetchFromStub,return )
+
 ::Dynamic Sqlite_obj::getMessage(::String accountId,::String chatId,::String serverId,::String localId){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
             		::Array< ::Dynamic> _hx_run( ::haxe::iterators::ArrayIterator result){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_431_getMessage)
-HXLINE( 431)			return _gthis->hydrateMessages(accountId,result);
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_787_getMessage)
+HXLINE( 787)			return _gthis->hydrateMessages(accountId,result);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
@@ -1224,397 +2181,537 @@ HXLINE( 431)			return _gthis->hydrateMessages(accountId,result);
             		::Dynamic _hx_run(::Array< ::Dynamic> messages){
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(1)
             			::Array< ::Dynamic> _hx_run(::Array< ::Dynamic> items){
-            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_438_getMessage)
-HXLINE( 438)				::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 438)				{
-HXLINE( 438)					int _g_current = 0;
-HXDLIN( 438)					while((_g_current < items->length)){
-HXLINE( 438)						_g_current = (_g_current + 1);
-HXDLIN( 438)						{
-HXLINE( 438)							 ::Dynamic x = items->__get((_g_current - 1)).StaticCast< ::Array< ::Dynamic> >()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 438)							while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 438)								_g->push(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_794_getMessage)
+HXLINE( 794)				::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 794)				{
+HXLINE( 794)					int _g_current = 0;
+HXDLIN( 794)					while((_g_current < items->length)){
+HXLINE( 794)						_g_current = (_g_current + 1);
+HXDLIN( 794)						{
+HXLINE( 794)							 ::Dynamic x = items->__get((_g_current - 1)).StaticCast< ::Array< ::Dynamic> >()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 794)							while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 794)								_g->push(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
             							}
             						}
             					}
             				}
-HXDLIN( 438)				return _g;
+HXDLIN( 794)				return _g;
             			}
             			HX_END_LOCAL_FUNC1(return)
 
             			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_3) HXARGC(1)
             			 ::borogove::ChatMessage _hx_run(::Array< ::Dynamic> items){
-            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_438_getMessage)
-HXLINE( 438)				if ((items->length > 0)) {
-HXLINE( 438)					return items->__get(0).StaticCast<  ::borogove::ChatMessage >();
+            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_794_getMessage)
+HXLINE( 794)				if ((items->length > 0)) {
+HXLINE( 794)					return items->__get(0).StaticCast<  ::borogove::ChatMessage >();
             				}
             				else {
-HXLINE( 438)					return null();
+HXLINE( 794)					return null();
             				}
-HXDLIN( 438)				return null();
+HXDLIN( 794)				return null();
             			}
             			HX_END_LOCAL_FUNC1(return)
 
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_432_getMessage)
-HXLINE( 432)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(messages->length);
-HXDLIN( 432)			{
-HXLINE( 432)				int _g = 0;
-HXDLIN( 432)				int _g1 = messages->length;
-HXDLIN( 432)				while((_g < _g1)){
-HXLINE( 432)					_g = (_g + 1);
-HXDLIN( 432)					int i = (_g - 1);
-HXDLIN( 432)					{
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_788_getMessage)
+HXLINE( 788)			::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(messages->length);
+HXDLIN( 788)			{
+HXLINE( 788)				int _g = 0;
+HXDLIN( 788)				int _g1 = messages->length;
+HXDLIN( 788)				while((_g < _g1)){
+HXLINE( 788)					_g = (_g + 1);
+HXDLIN( 788)					int i = (_g - 1);
+HXDLIN( 788)					{
             						HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
             						::Dynamic _hx_run(::Array< ::Dynamic> messages){
-            							HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_437_getMessage)
-HXLINE( 437)							return _gthis->hydrateReactions(accountId,messages);
+            							HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_793_getMessage)
+HXLINE( 793)							return _gthis->hydrateReactions(accountId,messages);
             						}
             						HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 433)						 ::borogove::ChatMessage message = ( ( ::borogove::ChatMessage)(_hx_array_unsafe_get(messages,i)) );
-HXDLIN( 433)						::Dynamic inValue;
-HXDLIN( 433)						if (::hx::IsNotNull( message->replyToMessage )) {
-HXLINE( 433)							inValue = _gthis->hydrateReplyTo(accountId,::Array_obj< ::Dynamic>::__new(1)->init(0,message),::Array_obj< ::Dynamic>::__new(1)->init(0, ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE( 789)						 ::borogove::ChatMessage message = ( ( ::borogove::ChatMessage)(_hx_array_unsafe_get(messages,i)) );
+HXDLIN( 789)						::Dynamic inValue;
+HXDLIN( 789)						if (::hx::IsNotNull( message->replyToMessage )) {
+HXLINE( 789)							inValue = _gthis->hydrateReplyTo(accountId,::Array_obj< ::Dynamic>::__new(1)->init(0,message),::Array_obj< ::Dynamic>::__new(1)->init(0, ::Dynamic(::hx::Anon_obj::Create(3)
             								->setFixed(0,HX_("chatId",d3,04,77,b7),chatId)
             								->setFixed(1,HX_("serverId",7e,01,b2,e2),message->replyToMessage->serverId)
             								->setFixed(2,HX_("localId",26,7a,c6,2d),message->replyToMessage->localId))));
             						}
             						else {
-HXLINE( 433)							inValue = ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(1)->init(0,message));
+HXLINE( 789)							inValue = ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(1)->init(0,message));
             						}
-HXLINE( 432)						::Dynamic inValue1 = ::thenshim::_Promise::Promise_Impl__obj::then(inValue, ::Dynamic(new _hx_Closure_1(_gthis,accountId)),null());
-HXDLIN( 432)						result->__unsafe_set(i,inValue1);
+HXLINE( 788)						::Dynamic inValue1 = ::thenshim::_Promise::Promise_Impl__obj::then(inValue, ::Dynamic(new _hx_Closure_1(_gthis,accountId)),null());
+HXDLIN( 788)						result->__unsafe_set(i,inValue1);
             					}
             				}
             			}
-HXDLIN( 432)			return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(result), ::Dynamic(new _hx_Closure_2()),null()), ::Dynamic(new _hx_Closure_3()),null());
+HXDLIN( 788)			return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(result), ::Dynamic(new _hx_Closure_2()),null()), ::Dynamic(new _hx_Closure_3()),null());
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_420_getMessage)
-HXDLIN( 420)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 421)		::String q = HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sync_point FROM messages WHERE account_id=? AND chat_id=?",95,dd,7c,85);
-HXLINE( 422)		::Array< ::String > params = ::Array_obj< ::String >::__new(2)->init(0,accountId)->init(1,chatId);
-HXLINE( 423)		if (::hx::IsNotNull( serverId )) {
-HXLINE( 424)			q = (HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sync_point FROM messages WHERE account_id=? AND chat_id=?",95,dd,7c,85) + HX_(" AND mam_id=?",4c,af,2b,c9));
-HXLINE( 425)			params->push(serverId);
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_776_getMessage)
+HXDLIN( 776)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 777)		::String q = HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sort_id, sync_point FROM messages WHERE account_id=? AND chat_id=?",45,be,36,89);
+HXLINE( 778)		::Array< ::String > params = ::Array_obj< ::String >::__new(2)->init(0,accountId)->init(1,chatId);
+HXLINE( 779)		if (::hx::IsNotNull( serverId )) {
+HXLINE( 780)			q = (HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sort_id, sync_point FROM messages WHERE account_id=? AND chat_id=?",45,be,36,89) + HX_(" AND mam_id=?",4c,af,2b,c9));
+HXLINE( 781)			params->push(serverId);
             		}
             		else {
-HXLINE( 426)			if (::hx::IsNotNull( localId )) {
-HXLINE( 427)				q = (HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sync_point FROM messages WHERE account_id=? AND chat_id=?",95,dd,7c,85) + HX_(" AND stanza_id=?",be,a8,32,e3));
-HXLINE( 428)				params->push(localId);
+HXLINE( 782)			if (::hx::IsNotNull( localId )) {
+HXLINE( 783)				q = (HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sort_id, sync_point FROM messages WHERE account_id=? AND chat_id=?",45,be,36,89) + HX_(" AND stanza_id=?",be,a8,32,e3));
+HXLINE( 784)				params->push(localId);
             			}
             		}
-HXLINE( 430)		q = (q + HX_("LIMIT 1",ec,af,c7,0e));
-HXLINE( 431)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(q,params), ::Dynamic(new _hx_Closure_0(_gthis,accountId)),null()), ::Dynamic(new _hx_Closure_4(_gthis,chatId,accountId)),null());
+HXLINE( 786)		q = (q + HX_("LIMIT 1",ec,af,c7,0e));
+HXLINE( 787)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(q,params), ::Dynamic(new _hx_Closure_0(_gthis,accountId)),null()), ::Dynamic(new _hx_Closure_4(_gthis,chatId,accountId)),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC4(Sqlite_obj,getMessage,return )
 
 void Sqlite_obj::getMessage__fromC(::String accountId,::String chatId,::String serverId,::String localId,::cpp::Function< void  (void*,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_e0e41eef74e41160_337_getMessage__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			this->getMessage(accountId,chatId,serverId,localId);
+            	HX_STACKFRAME(&_hx_pos_e0e41eef74e41160_365_getMessage__fromC)
+HXDLIN( 365)		if (::hx::IsNull( handler )) {
+HXDLIN( 365)			this->getMessage(accountId,chatId,serverId,localId);
             		}
             		else {
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::borogove::ChatMessage v){
-            				HX_STACKFRAME(&_hx_pos_e0e41eef74e41160_337_getMessage__fromC)
-HXDLIN( 337)				::cpp::Function< void  (void*,void*) > handler1 = handler;
-HXLINE( 314)				 ::Dynamic haxeObject = v;
-HXDLIN( 314)				void* ptr = haxeObject.mPtr;
-HXDLIN( 314)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
-HXDLIN( 314)				{
-HXLINE( 314)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 314)					if (::hx::IsNull( store )) {
-HXLINE( 314)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
+            				HX_STACKFRAME(&_hx_pos_e0e41eef74e41160_365_getMessage__fromC)
+HXDLIN( 365)				::cpp::Function< void  (void*,void*) > handler1 = handler;
+HXLINE( 334)				 ::Dynamic haxeObject = v;
+HXDLIN( 334)				void* ptr = haxeObject.mPtr;
+HXDLIN( 334)				::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(ptr);
+HXDLIN( 334)				{
+HXLINE( 334)					 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
+HXDLIN( 334)					if (::hx::IsNull( store )) {
+HXLINE( 334)						store =  ::Dynamic(::hx::Anon_obj::Create(2)
             							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
             							->setFixed(1,HX_("value",71,7f,b8,31),haxeObject));
-HXDLIN( 314)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
+HXDLIN( 334)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
             					}
             					else {
-HXLINE( 314)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
+HXLINE( 334)						::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
             					}
             				}
-HXLINE( 337)				handler1(ptr,handler__context);
+HXLINE( 365)				handler1(ptr,handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (void* HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
             			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_e0e41eef74e41160_337_getMessage__fromC)
-HXDLIN( 337)				handler(null(),handler__context);
+            				HX_STACKFRAME(&_hx_pos_e0e41eef74e41160_365_getMessage__fromC)
+HXDLIN( 365)				handler(null(),handler__context);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->getMessage(accountId,chatId,serverId,localId), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
+HXDLIN( 365)			::thenshim::_Promise::Promise_Impl__obj::then(this->getMessage(accountId,chatId,serverId,localId), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
             		}
             	}
 
 
-::Dynamic Sqlite_obj::getMessages(::String accountId,::String chatId,::String time,::String op){
-            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
-            		::Array< ::Dynamic> _hx_run( ::haxe::iterators::ArrayIterator result){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_479_getMessages)
-HXLINE( 479)			return _gthis->hydrateMessages(accountId,result);
+::Dynamic Sqlite_obj::getMessages(::String accountId,::String chatId,::String sortId,::String op,::hx::Null< bool >  __o_useTimestamp,::String timestamp){
+            		HX_BEGIN_LOCAL_FUNC_S6(::hx::LocalFunc,_hx_Closure_2,::Array< ::String >,q, ::borogove::persistence::Sqlite,_gthis,::String,op,::String,chatId,::String,timestamp,::String,accountId) HXARGC(1)
+            		::Dynamic _hx_run( ::haxe::iterators::ArrayIterator result){
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_842_getMessages)
+HXLINE( 843)			::Array< ::Dynamic> messages = _gthis->hydrateMessages(accountId,result);
+HXLINE( 844)			bool _hx_tmp;
+HXDLIN( 844)			if ((messages->length > 0)) {
+HXLINE( 844)				_hx_tmp = (messages->__get(0).StaticCast<  ::borogove::ChatMessage >()->serverIdBy == chatId);
+            			}
+            			else {
+HXLINE( 844)				_hx_tmp = false;
+            			}
+HXDLIN( 844)			if (_hx_tmp) {
+            				HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_1,::Array< ::Dynamic>,messages, ::borogove::persistence::Sqlite,_gthis,::String,op,::String,boundary,::String,accountId) HXARGC(1)
+            				::Array< ::Dynamic> _hx_run( ::haxe::iterators::ArrayIterator pmResult){
+            					HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_865_getMessages)
+HXLINE( 866)					::Array< ::Dynamic> pms = _gthis->hydrateMessages(accountId,pmResult);
+HXLINE( 867)					{
+HXLINE( 867)						int _g = 0;
+HXDLIN( 867)						while((_g < pms->length)){
+HXLINE( 867)							 ::borogove::ChatMessage pm = pms->__get(_g).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN( 867)							_g = (_g + 1);
+HXLINE( 868)							bool _hx_tmp;
+HXDLIN( 868)							if ((op != HX_("<",3c,00,00,00))) {
+HXLINE( 868)								_hx_tmp = (op == HX_("<=",81,34,00,00));
+            							}
+            							else {
+HXLINE( 868)								_hx_tmp = true;
+            							}
+HXDLIN( 868)							if (_hx_tmp) {
+            								HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::ChatMessage,pm) HXARGC(1)
+            								bool _hx_run( ::borogove::ChatMessage m){
+            									HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_869_getMessages)
+HXLINE( 869)									return (m->timestamp <= pm->timestamp);
+            								}
+            								HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 869)								int idx = ::Lambda_obj::findIndex(messages, ::Dynamic(new _hx_Closure_0(pm)));
+HXLINE( 870)								if ((idx >= 0)) {
+HXLINE( 870)									messages->insert(idx,pm);
+            								}
+            							}
+            							else {
+HXLINE( 872)								int idx1 = (messages->length - 1);
+HXLINE( 873)								while((idx1 >= 0)){
+HXLINE( 874)									if ((messages->__get(idx1).StaticCast<  ::borogove::ChatMessage >()->timestamp < pm->timestamp)) {
+HXLINE( 875)										goto _hx_goto_139;
+            									}
+HXLINE( 877)									idx1 = (idx1 - 1);
+            								}
+            								_hx_goto_139:;
+HXLINE( 879)								if ((idx1 >= 0)) {
+HXLINE( 879)									messages->insert((idx1 + 1),pm);
+            								}
+HXLINE( 881)								if ((pm->timestamp > boundary)) {
+HXLINE( 881)									goto _hx_goto_138;
+            								}
+            							}
+            						}
+            						_hx_goto_138:;
+            					}
+HXLINE( 884)					return messages;
+            				}
+            				HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 845)				::String boundary = messages->__get((messages->length - 1)).StaticCast<  ::borogove::ChatMessage >()->timestamp;
+HXLINE( 846)				::String pmQ = HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sort_id, sync_point FROM messages WHERE account_id=? AND chat_id=? AND type=?",e0,56,0e,f2);
+HXLINE( 847)				::cpp::VirtualArray pmParams = ::cpp::VirtualArray_obj::__new(3)->init(0,accountId)->init(1,chatId)->init(2,3);
+HXLINE( 849)				if (::hx::IsNotNull( timestamp )) {
+HXLINE( 850)					pmQ = (HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sort_id, sync_point FROM messages WHERE account_id=? AND chat_id=? AND type=?",e0,56,0e,f2) + ((HX_(" AND messages.created_at ",3d,a0,ae,bb) + op) + HX_(" unixepoch(?, 'subsec') * 1000",87,03,ad,d8)));
+HXLINE( 851)					pmParams->push(timestamp);
+            				}
+HXLINE( 854)				bool _hx_tmp1;
+HXDLIN( 854)				if ((op != HX_("<",3c,00,00,00))) {
+HXLINE( 854)					_hx_tmp1 = (op == HX_("<=",81,34,00,00));
+            				}
+            				else {
+HXLINE( 854)					_hx_tmp1 = true;
+            				}
+HXDLIN( 854)				if (_hx_tmp1) {
+HXLINE( 855)					pmQ = (pmQ + HX_(" AND messages.created_at > unixepoch(?, 'subsec') * 1000",a8,f2,94,01));
+HXLINE( 856)					pmParams->push(boundary);
+            				}
+HXLINE( 861)				pmQ = (pmQ + HX_(" ORDER BY messages.created_at",55,af,d5,29));
+HXLINE( 862)				bool _hx_tmp2;
+HXDLIN( 862)				if ((op != HX_("<",3c,00,00,00))) {
+HXLINE( 862)					_hx_tmp2 = (op == HX_("<=",81,34,00,00));
+            				}
+            				else {
+HXLINE( 862)					_hx_tmp2 = true;
+            				}
+HXDLIN( 862)				if (_hx_tmp2) {
+HXLINE( 862)					::Array< ::String > q1 = q;
+HXDLIN( 862)					q1[0] = (q1->__get(0) + HX_(" DESC",71,b6,f9,99));
+            				}
+HXLINE( 863)				pmQ = (pmQ + HX_(" LIMIT 50",60,62,1f,3e));
+HXLINE( 865)				return ::thenshim::_Promise::Promise_Impl__obj::then(_gthis->db->exec(pmQ,pmParams), ::Dynamic(new _hx_Closure_1(messages,_gthis,op,boundary,accountId)),null());
+            			}
+HXLINE( 887)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(messages);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_1, ::borogove::persistence::Sqlite,_gthis,::String,op,::String,accountId) HXARGC(1)
-            		::Dynamic _hx_run(::Array< ::Dynamic> iter){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_479_getMessages)
-HXLINE( 480)			::Array< ::Dynamic> arr = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 481)			::Array< ::Dynamic> replyTos = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 482)			{
-HXLINE( 482)				int _g = 0;
-HXDLIN( 482)				while((_g < iter->length)){
-HXLINE( 482)					 ::borogove::ChatMessage message = iter->__get(_g).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 482)					_g = (_g + 1);
-HXLINE( 483)					arr->push(message);
-HXLINE( 484)					bool _hx_tmp;
-HXDLIN( 484)					if (::hx::IsNotNull( message->replyToMessage )) {
-HXLINE( 484)						_hx_tmp = ::hx::IsNull( message->replyToMessage->serverIdBy );
+            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_3, ::borogove::persistence::Sqlite,_gthis,::String,op,::String,accountId) HXARGC(1)
+            		::Dynamic _hx_run(::Array< ::Dynamic> messages){
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_888_getMessages)
+HXLINE( 889)			bool _hx_tmp;
+HXDLIN( 889)			if ((op != HX_("<",3c,00,00,00))) {
+HXLINE( 889)				_hx_tmp = (op == HX_("<=",81,34,00,00));
+            			}
+            			else {
+HXLINE( 889)				_hx_tmp = true;
+            			}
+HXDLIN( 889)			if (_hx_tmp) {
+HXLINE( 890)				messages->reverse();
+            			}
+HXLINE( 892)			::Array< ::Dynamic> replyTos = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE( 893)			{
+HXLINE( 893)				int _g = 0;
+HXDLIN( 893)				while((_g < messages->length)){
+HXLINE( 893)					 ::borogove::ChatMessage message = messages->__get(_g).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN( 893)					_g = (_g + 1);
+HXLINE( 894)					bool _hx_tmp1;
+HXDLIN( 894)					if (::hx::IsNotNull( message->replyToMessage )) {
+HXLINE( 894)						_hx_tmp1 = ::hx::IsNull( message->replyToMessage->stanza );
             					}
             					else {
-HXLINE( 484)						_hx_tmp = false;
+HXLINE( 894)						_hx_tmp1 = false;
             					}
-HXDLIN( 484)					if (_hx_tmp) {
-HXLINE( 485)						::String _hx_tmp1 = message->chatId();
-HXDLIN( 485)						replyTos->push( ::Dynamic(::hx::Anon_obj::Create(3)
-            							->setFixed(0,HX_("chatId",d3,04,77,b7),_hx_tmp1)
+HXDLIN( 894)					if (_hx_tmp1) {
+HXLINE( 895)						::String _hx_tmp2 = message->chatId();
+HXDLIN( 895)						replyTos->push( ::Dynamic(::hx::Anon_obj::Create(3)
+            							->setFixed(0,HX_("chatId",d3,04,77,b7),_hx_tmp2)
             							->setFixed(1,HX_("serverId",7e,01,b2,e2),message->replyToMessage->serverId)
             							->setFixed(2,HX_("localId",26,7a,c6,2d),message->replyToMessage->localId)));
             					}
             				}
             			}
-HXLINE( 488)			bool _hx_tmp2;
-HXDLIN( 488)			if ((op != HX_("<",3c,00,00,00))) {
-HXLINE( 488)				_hx_tmp2 = (op == HX_("<=",81,34,00,00));
-            			}
-            			else {
-HXLINE( 488)				_hx_tmp2 = true;
-            			}
-HXDLIN( 488)			if (_hx_tmp2) {
-HXLINE( 489)				arr->reverse();
-            			}
-HXLINE( 491)			return _gthis->hydrateReplyTo(accountId,arr,replyTos);
+HXLINE( 898)			return _gthis->hydrateReplyTo(accountId,messages,replyTos);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_2, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
+            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_4, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
             		::Dynamic _hx_run(::Array< ::Dynamic> messages){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_492_getMessages)
-HXLINE( 492)			return _gthis->hydrateReactions(accountId,messages);
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_899_getMessages)
+HXLINE( 899)			return _gthis->hydrateReactions(accountId,messages);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_442_getMessages)
-HXDLIN( 442)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 443)		::String q = HX_("WITH page AS (SELECT stanza_id, mam_id FROM messages where account_id=? AND chat_id=? AND (stanza_id IS NULL OR stanza_id='' OR stanza_id=correction_id)",a0,7a,6e,a0);
-HXLINE( 444)		::cpp::VirtualArray params = ::cpp::VirtualArray_obj::__new(2)->init(0,accountId)->init(1,chatId);
-HXLINE( 445)		if (::hx::IsNotNull( time )) {
-HXLINE( 446)			q = (HX_("WITH page AS (SELECT stanza_id, mam_id FROM messages where account_id=? AND chat_id=? AND (stanza_id IS NULL OR stanza_id='' OR stanza_id=correction_id)",a0,7a,6e,a0) + ((HX_(" AND messages.created_at ",3d,a0,ae,bb) + op) + HX_("CAST(unixepoch(?, 'subsec') * 1000 AS INTEGER)",17,de,5d,f8)));
-HXLINE( 447)			params->push(time);
-            		}
-HXLINE( 449)		q = (q + HX_(" ORDER BY messages.created_at",55,af,d5,29));
-HXLINE( 450)		bool _hx_tmp;
-HXDLIN( 450)		if ((op != HX_("<",3c,00,00,00))) {
-HXLINE( 450)			_hx_tmp = (op == HX_("<=",81,34,00,00));
+            		bool useTimestamp = __o_useTimestamp.Default(false);
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_798_getMessages)
+HXDLIN( 798)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 799)		bool _hx_tmp;
+HXDLIN( 799)		if (useTimestamp) {
+HXLINE( 799)			_hx_tmp = ::hx::IsNull( timestamp );
             		}
             		else {
-HXLINE( 450)			_hx_tmp = true;
+HXLINE( 799)			_hx_tmp = false;
             		}
-HXDLIN( 450)		if (_hx_tmp) {
-HXLINE( 450)			q = (q + HX_(" DESC",71,b6,f9,99));
+HXDLIN( 799)		if (_hx_tmp) {
+HXLINE( 799)			HX_STACK_DO_THROW(HX_("Cannot use timestamp without specifying one",9f,88,b9,0a));
+            		}
+HXLINE( 801)		::Array< ::String > q = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_147,1);
+HXLINE( 802)		::cpp::VirtualArray params = ::cpp::VirtualArray_obj::__new(3)->init(0,accountId)->init(1,chatId)->init(2,3);
+HXLINE( 803)		if (useTimestamp) {
+HXLINE( 804)			::Array< ::String > q1 = q;
+HXDLIN( 804)			q1[0] = (q1->__get(0) + ((HX_(" AND messages.created_at ",3d,a0,ae,bb) + op) + HX_(" unixepoch(?, 'subsec') * 1000",87,03,ad,d8)));
+HXLINE( 805)			params->push(timestamp);
+HXLINE( 806)			::Array< ::String > q2 = q;
+HXDLIN( 806)			q2[0] = (q2->__get(0) + HX_(" ORDER BY messages.created_at",55,af,d5,29));
+            		}
+            		else {
+HXLINE( 807)			if (::hx::IsNotNull( sortId )) {
+HXLINE( 808)				::Array< ::String > q3 = q;
+HXDLIN( 808)				q3[0] = (q3->__get(0) + ((HX_(" AND messages.sort_id ",5d,bb,ec,0f) + op) + HX_(" ?",1f,1c,00,00)));
+HXLINE( 809)				params->push(sortId);
+HXLINE( 810)				::Array< ::String > q4 = q;
+HXDLIN( 810)				q4[0] = (q4->__get(0) + HX_(" ORDER BY messages.sort_id",51,c7,5c,e5));
+            			}
+            			else {
+HXLINE( 812)				::Array< ::String > q5 = q;
+HXDLIN( 812)				q5[0] = (q5->__get(0) + HX_(" ORDER BY messages.sort_id",51,c7,5c,e5));
+            			}
             		}
-HXLINE( 451)		q = (q + HX_(", messages.ROWID",a7,cc,85,7b));
-HXLINE( 452)		bool _hx_tmp1;
-HXDLIN( 452)		if ((op != HX_("<",3c,00,00,00))) {
-HXLINE( 452)			_hx_tmp1 = (op == HX_("<=",81,34,00,00));
+HXLINE( 814)		bool _hx_tmp1;
+HXDLIN( 814)		if ((op != HX_("<",3c,00,00,00))) {
+HXLINE( 814)			_hx_tmp1 = (op == HX_("<=",81,34,00,00));
             		}
             		else {
-HXLINE( 452)			_hx_tmp1 = true;
+HXLINE( 814)			_hx_tmp1 = true;
             		}
-HXDLIN( 452)		if (_hx_tmp1) {
-HXLINE( 452)			q = (q + HX_(" DESC",71,b6,f9,99));
+HXDLIN( 814)		if (_hx_tmp1) {
+HXLINE( 814)			::Array< ::String > q6 = q;
+HXDLIN( 814)			q6[0] = (q6->__get(0) + HX_(" DESC",71,b6,f9,99));
             		}
-HXLINE( 453)		q = (q + HX_(" LIMIT 50) ",37,de,84,8e));
-HXLINE( 454)		q = (q + HX_("SELECT\n\t\t\tcorrection_id AS stanza_id,\n\t\t\tversions.stanza,\n\t\t\tjson_group_object(CASE WHEN versions.mam_id IS NULL OR versions.mam_id='' THEN versions.stanza_id ELSE versions.mam_id END, strftime('%FT%H:%M:%fZ', versions.created_at / 1000.0, 'unixepoch')) AS version_times,\n\t\t\tjson_group_object(CASE WHEN versions.mam_id IS NULL OR versions.mam_id='' THEN versions.stanza_id ELSE versions.mam_id END, versions.stanza) AS versions,\n\t\t\tmessages.direction,\n\t\t\tmessages.type,\n\t\t\tmessages.status,\n\t\t\tmessages.status_text,\n\t\t\tstrftime('%FT%H:%M:%fZ', messages.created_at / 1000.0, 'unixepoch') AS timestamp,\n\t\t\tmessages.sender_id,\n\t\t\tmessages.mam_id,\n\t\t\tmessages.mam_by,\n\t\t\tmessages.sync_point,\n\t\t\tMAX(versions.created_at)\n\t\t\tFROM messages INNER JOIN messages versions USING (correction_id, sender_id) WHERE (messages.stanza_id, messages.mam_id) IN (SELECT * FROM page) AND messages.account_id=? AND messages.chat_id=? GROUP BY correction_id, CASE WHEN messages.type=? THEN 'call' ELSE messages.sender_id END",f2,98,71,a8));
-HXLINE( 470)		q = (q + HX_(" ORDER BY messages.created_at",55,af,d5,29));
-HXLINE( 471)		bool _hx_tmp2;
-HXDLIN( 471)		if ((op != HX_("<",3c,00,00,00))) {
-HXLINE( 471)			_hx_tmp2 = (op == HX_("<=",81,34,00,00));
+HXLINE( 815)		::Array< ::String > q7 = q;
+HXDLIN( 815)		q7[0] = (q7->__get(0) + HX_(" LIMIT 50) ",37,de,84,8e));
+HXLINE( 816)		::Array< ::String > q8 = q;
+HXDLIN( 816)		q8[0] = (q8->__get(0) + HX_("SELECT\n\t\t\tcorrection_id AS stanza_id,\n\t\t\tversions.stanza,\n\t\t\tjson_group_object(CASE WHEN versions.mam_id IS NULL OR versions.mam_id='' THEN versions.stanza_id ELSE versions.mam_id END, strftime('%FT%H:%M:%fZ', versions.created_at / 1000.0, 'unixepoch')) AS version_times,\n\t\t\tjson_group_object(CASE WHEN versions.mam_id IS NULL OR versions.mam_id='' THEN versions.stanza_id ELSE versions.mam_id END, versions.stanza) AS versions,\n\t\t\tmessages.direction,\n\t\t\tmessages.type,\n\t\t\tmessages.status,\n\t\t\tmessages.status_text,\n\t\t\tstrftime('%FT%H:%M:%fZ', messages.created_at / 1000.0, 'unixepoch') AS timestamp,\n\t\t\tmessages.sender_id,\n\t\t\tmessages.mam_id,\n\t\t\tmessages.mam_by,\n\t\t\tmessages.sort_id,\n\t\t\tmessages.sync_point,\n\t\t\tMAX(versions.created_at)\n\t\t\tFROM messages INNER JOIN messages versions USING (correction_id, sender_id) WHERE (messages.stanza_id, messages.mam_id) IN (SELECT * FROM page) AND messages.account_id=? AND messages.chat_id=? GROUP BY correction_id, CASE WHEN messages.type=? THEN 'call' ELSE messages.sender_id END",e9,6c,a5,c8));
+HXLINE( 833)		::Array< ::String > q9 = q;
+HXDLIN( 833)		q9[0] = (q9->__get(0) + HX_(" ORDER BY messages.sort_id",51,c7,5c,e5));
+HXLINE( 834)		bool _hx_tmp2;
+HXDLIN( 834)		if ((op != HX_("<",3c,00,00,00))) {
+HXLINE( 834)			_hx_tmp2 = (op == HX_("<=",81,34,00,00));
             		}
             		else {
-HXLINE( 471)			_hx_tmp2 = true;
+HXLINE( 834)			_hx_tmp2 = true;
             		}
-HXDLIN( 471)		if (_hx_tmp2) {
-HXLINE( 471)			q = (q + HX_(" DESC",71,b6,f9,99));
+HXDLIN( 834)		if (_hx_tmp2) {
+HXLINE( 834)			::Array< ::String > q10 = q;
+HXDLIN( 834)			q10[0] = (q10->__get(0) + HX_(" DESC",71,b6,f9,99));
             		}
-HXLINE( 472)		q = (q + HX_(", messages.ROWID",a7,cc,85,7b));
-HXLINE( 473)		bool _hx_tmp3;
-HXDLIN( 473)		if ((op != HX_("<",3c,00,00,00))) {
-HXLINE( 473)			_hx_tmp3 = (op == HX_("<=",81,34,00,00));
+HXLINE( 835)		::Array< ::String > q11 = q;
+HXDLIN( 835)		q11[0] = (q11->__get(0) + HX_(", messages.created_at",98,50,44,73));
+HXLINE( 836)		bool _hx_tmp3;
+HXDLIN( 836)		if ((op != HX_("<",3c,00,00,00))) {
+HXLINE( 836)			_hx_tmp3 = (op == HX_("<=",81,34,00,00));
             		}
             		else {
-HXLINE( 473)			_hx_tmp3 = true;
+HXLINE( 836)			_hx_tmp3 = true;
             		}
-HXDLIN( 473)		if (_hx_tmp3) {
-HXLINE( 473)			q = (q + HX_(" DESC",71,b6,f9,99));
+HXDLIN( 836)		if (_hx_tmp3) {
+HXLINE( 836)			::Array< ::String > q12 = q;
+HXDLIN( 836)			q12[0] = (q12->__get(0) + HX_(" DESC",71,b6,f9,99));
             		}
-HXLINE( 475)		params->push(accountId);
-HXLINE( 476)		params->push(chatId);
-HXLINE( 477)		params->push(1);
-HXLINE( 479)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(q,params), ::Dynamic(new _hx_Closure_0(_gthis,accountId)),null()), ::Dynamic(new _hx_Closure_1(_gthis,op,accountId)),null()), ::Dynamic(new _hx_Closure_2(_gthis,accountId)),null());
+HXLINE( 838)		params->push(accountId);
+HXLINE( 839)		params->push(chatId);
+HXLINE( 840)		params->push(1);
+HXLINE( 842)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(q->__get(0),params), ::Dynamic(new _hx_Closure_2(q,_gthis,op,chatId,timestamp,accountId)),null()), ::Dynamic(new _hx_Closure_3(_gthis,op,accountId)),null()), ::Dynamic(new _hx_Closure_4(_gthis,accountId)),null());
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC4(Sqlite_obj,getMessages,return )
+HX_DEFINE_DYNAMIC_FUNC6(Sqlite_obj,getMessages,return )
 
-::Dynamic Sqlite_obj::getMessagesBefore(::String accountId,::String chatId,::String beforeId,::String beforeTime){
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_497_getMessagesBefore)
-HXDLIN( 497)		return this->getMessages(accountId,chatId,beforeTime,HX_("<",3c,00,00,00));
+::Dynamic Sqlite_obj::getMessagesBefore(::String accountId,::String chatId, ::borogove::ChatMessage before){
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_904_getMessagesBefore)
+HXDLIN( 904)		::String _hx_tmp;
+HXDLIN( 904)		if (::hx::IsNotNull( before )) {
+HXDLIN( 904)			_hx_tmp = before->sortId;
+            		}
+            		else {
+HXDLIN( 904)			_hx_tmp = null();
+            		}
+HXDLIN( 904)		 ::Dynamic _hx_tmp1;
+HXDLIN( 904)		if (::hx::IsNotNull( before )) {
+HXDLIN( 904)			_hx_tmp1 = before->type;
+            		}
+            		else {
+HXDLIN( 904)			_hx_tmp1 = null();
+            		}
+HXDLIN( 904)		::String _hx_tmp2;
+HXDLIN( 904)		if (::hx::IsNotNull( before )) {
+HXDLIN( 904)			_hx_tmp2 = before->timestamp;
+            		}
+            		else {
+HXDLIN( 904)			_hx_tmp2 = null();
+            		}
+HXDLIN( 904)		return this->getMessages(accountId,chatId,_hx_tmp,HX_("<",3c,00,00,00),::hx::IsEq( _hx_tmp1,3 ),_hx_tmp2);
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC4(Sqlite_obj,getMessagesBefore,return )
+HX_DEFINE_DYNAMIC_FUNC3(Sqlite_obj,getMessagesBefore,return )
 
-::Dynamic Sqlite_obj::getMessagesAfter(::String accountId,::String chatId,::String afterId,::String afterTime){
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_502_getMessagesAfter)
-HXDLIN( 502)		return this->getMessages(accountId,chatId,afterTime,HX_(">",3e,00,00,00));
+::Dynamic Sqlite_obj::getMessagesAfter(::String accountId,::String chatId, ::borogove::ChatMessage after){
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_909_getMessagesAfter)
+HXDLIN( 909)		::String _hx_tmp;
+HXDLIN( 909)		if (::hx::IsNotNull( after )) {
+HXDLIN( 909)			_hx_tmp = after->sortId;
+            		}
+            		else {
+HXDLIN( 909)			_hx_tmp = null();
+            		}
+HXDLIN( 909)		 ::Dynamic _hx_tmp1;
+HXDLIN( 909)		if (::hx::IsNotNull( after )) {
+HXDLIN( 909)			_hx_tmp1 = after->type;
+            		}
+            		else {
+HXDLIN( 909)			_hx_tmp1 = null();
+            		}
+HXDLIN( 909)		::String _hx_tmp2;
+HXDLIN( 909)		if (::hx::IsNotNull( after )) {
+HXDLIN( 909)			_hx_tmp2 = after->timestamp;
+            		}
+            		else {
+HXDLIN( 909)			_hx_tmp2 = null();
+            		}
+HXDLIN( 909)		return this->getMessages(accountId,chatId,_hx_tmp,HX_(">",3e,00,00,00),::hx::IsEq( _hx_tmp1,3 ),_hx_tmp2);
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC4(Sqlite_obj,getMessagesAfter,return )
+HX_DEFINE_DYNAMIC_FUNC3(Sqlite_obj,getMessagesAfter,return )
 
-::Dynamic Sqlite_obj::getMessagesAround(::String accountId,::String chatId,::String aroundId,::String aroundTime){
-            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_2, ::borogove::persistence::Sqlite,_gthis,::String,chatId,::String,accountId) HXARGC(1)
-            		::Dynamic _hx_run(::String aroundTime){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_518_getMessagesAround)
-HXLINE( 519)			::Dynamic _hx_tmp = _gthis->getMessages(accountId,chatId,aroundTime,HX_("<",3c,00,00,00));
-HXLINE( 518)			return ::thenshim::PromiseTools_obj::all(::Array_obj< ::Dynamic>::__new(2)->init(0,_hx_tmp)->init(1,_gthis->getMessages(accountId,chatId,aroundTime,HX_(">=",3f,36,00,00))));
-            		}
-            		HX_END_LOCAL_FUNC1(return)
-
-            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_3) HXARGC(1)
+::Dynamic Sqlite_obj::getMessagesAround(::String accountId, ::borogove::ChatMessage around){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		::Array< ::Dynamic> _hx_run(::Array< ::Dynamic> results){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_522_getMessagesAround)
-HXLINE( 522)			::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 522)			{
-HXLINE( 522)				int _g_current = 0;
-HXDLIN( 522)				while((_g_current < results->length)){
-HXLINE( 522)					_g_current = (_g_current + 1);
-HXDLIN( 522)					{
-HXLINE( 522)						 ::Dynamic x = results->__get((_g_current - 1)).StaticCast< ::Array< ::Dynamic> >()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 522)						while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 522)							_g->push(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_918_getMessagesAround)
+HXLINE( 918)			::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 918)			{
+HXLINE( 918)				int _g_current = 0;
+HXDLIN( 918)				while((_g_current < results->length)){
+HXLINE( 918)					_g_current = (_g_current + 1);
+HXDLIN( 918)					{
+HXLINE( 918)						 ::Dynamic x = results->__get((_g_current - 1)).StaticCast< ::Array< ::Dynamic> >()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 918)						while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 918)							_g->push(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
             						}
             					}
             				}
             			}
-HXDLIN( 522)			return _g;
+HXDLIN( 918)			return _g;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_506_getMessagesAround)
-HXDLIN( 506)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 507)		::Dynamic _hx_tmp;
-HXDLIN( 507)		if (::hx::IsNull( aroundTime )) {
-            			HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_1, ::borogove::persistence::Sqlite,_gthis,::String,chatId,::String,aroundId,::String,accountId) HXARGC(1)
-            			::Dynamic _hx_run( ::borogove::ChatMessage m){
-            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_509_getMessagesAround)
-HXLINE( 509)				if (::hx::IsNotNull( m )) {
-HXLINE( 510)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(m->timestamp);
-            				}
-            				else {
-            					HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
-            					::String _hx_run( ::borogove::ChatMessage m){
-            						HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_512_getMessagesAround)
-HXLINE( 512)						if (::hx::IsNotNull( m )) {
-HXLINE( 512)							return m->timestamp;
-            						}
-            						else {
-HXLINE( 512)							return null();
-            						}
-HXDLIN( 512)						return null();
-            					}
-            					HX_END_LOCAL_FUNC1(return)
-
-HXLINE( 512)					return ::thenshim::_Promise::Promise_Impl__obj::then(_gthis->getMessage(accountId,chatId,null(),aroundId), ::Dynamic(new _hx_Closure_0()),null());
-            				}
-HXLINE( 509)				return null();
-            			}
-            			HX_END_LOCAL_FUNC1(return)
-
-HXLINE( 507)			_hx_tmp = ::thenshim::_Promise::Promise_Impl__obj::then(this->getMessage(accountId,chatId,aroundId,null()), ::Dynamic(new _hx_Closure_1(_gthis,chatId,aroundId,accountId)),null());
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_913_getMessagesAround)
+HXLINE( 914)		::String chatId = around->chatId();
+HXLINE( 916)		 ::Dynamic _hx_tmp;
+HXDLIN( 916)		if (::hx::IsNotNull( around )) {
+HXLINE( 916)			_hx_tmp = around->type;
+            		}
+            		else {
+HXLINE( 916)			_hx_tmp = null();
+            		}
+HXDLIN( 916)		::String _hx_tmp1;
+HXDLIN( 916)		if (::hx::IsNotNull( around )) {
+HXLINE( 916)			_hx_tmp1 = around->timestamp;
+            		}
+            		else {
+HXLINE( 916)			_hx_tmp1 = null();
+            		}
+HXDLIN( 916)		::Dynamic _hx_tmp2 = this->getMessages(accountId,chatId,around->sortId,HX_("<",3c,00,00,00),::hx::IsEq( _hx_tmp,3 ),_hx_tmp1);
+HXLINE( 917)		 ::Dynamic _hx_tmp3;
+HXDLIN( 917)		if (::hx::IsNotNull( around )) {
+HXLINE( 917)			_hx_tmp3 = around->type;
+            		}
+            		else {
+HXLINE( 917)			_hx_tmp3 = null();
+            		}
+HXDLIN( 917)		::String _hx_tmp4;
+HXDLIN( 917)		if (::hx::IsNotNull( around )) {
+HXLINE( 917)			_hx_tmp4 = around->timestamp;
             		}
             		else {
-HXLINE( 507)			_hx_tmp = ::thenshim::_Promise::Promise_Impl__obj::resolve(aroundTime);
+HXLINE( 917)			_hx_tmp4 = null();
             		}
-HXDLIN( 507)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp, ::Dynamic(new _hx_Closure_2(_gthis,chatId,accountId)),null()), ::Dynamic(new _hx_Closure_3()),null());
+HXLINE( 915)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::PromiseTools_obj::all(::Array_obj< ::Dynamic>::__new(2)->init(0,_hx_tmp2)->init(1,this->getMessages(accountId,chatId,around->sortId,HX_(">=",3f,36,00,00),::hx::IsEq( _hx_tmp3,3 ),_hx_tmp4))), ::Dynamic(new _hx_Closure_0()),null());
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC4(Sqlite_obj,getMessagesAround,return )
+HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,getMessagesAround,return )
 
 ::Dynamic Sqlite_obj::getChatUnreadDetails(::String accountId, ::borogove::Chat chat){
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis, ::borogove::Chat,chat,::String,accountId) HXARGC(1)
             		 ::Dynamic _hx_run( ::haxe::iterators::ArrayIterator result){
-            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_530_getChatUnreadDetails)
-HXLINE( 531)			 ::Dynamic row = result->array->__get(result->current++);
-HXLINE( 532)			::Array< ::Dynamic> lastMessage;
-HXDLIN( 532)			if (::hx::IsNull( row->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic) )) {
-HXLINE( 532)				lastMessage = ::Array_obj< ::Dynamic>::__new(0);
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_925_getChatUnreadDetails)
+HXLINE( 926)			 ::Dynamic row = result->array->__get(result->current++);
+HXLINE( 927)			::Array< ::Dynamic> lastMessage;
+HXDLIN( 927)			if (::hx::IsNull( row->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic) )) {
+HXLINE( 927)				lastMessage = ::Array_obj< ::Dynamic>::__new(0);
             			}
             			else {
-HXLINE( 532)				lastMessage = _gthis->hydrateMessages(accountId, ::haxe::iterators::ArrayIterator_obj::__alloc( HX_CTX ,::cpp::VirtualArray_obj::__new(1)->init(0,row)));
+HXLINE( 927)				lastMessage = _gthis->hydrateMessages(accountId, ::haxe::iterators::ArrayIterator_obj::__alloc( HX_CTX ,::cpp::VirtualArray_obj::__new(1)->init(0,row)));
             			}
-HXLINE( 533)			return  ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE( 928)			return  ::Dynamic(::hx::Anon_obj::Create(3)
             				->setFixed(0,HX_("message",c7,35,11,9a),lastMessage->__get(0).StaticCast<  ::borogove::ChatMessage >())
             				->setFixed(1,HX_("unreadCount",20,18,f1,a0), ::Dynamic(row->__Field(HX_("unreadCount",20,18,f1,a0),::hx::paccDynamic)))
             				->setFixed(2,HX_("chatId",d3,04,77,b7),chat->chatId));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_526_getChatUnreadDetails)
-HXDLIN( 526)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 527)		 ::borogove::persistence::SqliteDriver _hx_tmp = this->db;
-HXLINE( 529)		::String accountId1 = accountId;
-HXDLIN( 529)		::String chat1 = chat->chatId;
-HXDLIN( 529)		::String _hx_tmp1 = chat->readUpTo();
-HXLINE( 527)		return ::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->exec(HX_("WITH subq as (SELECT ROWID as row, COALESCE(MAX(created_at), 0) as created_at FROM messages where account_id=? AND chat_id=? AND (mam_id=? OR direction=?)) SELECT chat_id AS chatId, stanza, direction, type, status, status_text, sender_id, mam_id, mam_by, sync_point, CASE WHEN (SELECT row FROM subq) IS NULL THEN COUNT(*) ELSE COUNT(*) - 1 END AS unreadCount, strftime('%FT%H:%M:%fZ', MAX(messages.created_at) / 1000.0, 'unixepoch') AS timestamp FROM messages WHERE account_id=? AND chat_id=? AND (stanza_id IS NULL OR stanza_id='' OR stanza_id=correction_id) AND (messages.created_at >= (SELECT created_at FROM subq) AND (messages.created_at <> (SELECT created_at FROM subq) OR messages.ROWID = (SELECT row FROM subq)))",69,c0,d3,b0),::cpp::VirtualArray_obj::__new(6)->init(0,accountId1)->init(1,chat1)->init(2,_hx_tmp1)->init(3,1)->init(4,accountId)->init(5,chat->chatId)), ::Dynamic(new _hx_Closure_0(_gthis,chat,accountId)),null());
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_921_getChatUnreadDetails)
+HXDLIN( 921)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 922)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("WITH subq AS (SELECT ROWID AS row, COALESCE(MAX(sort_id), 'a ') AS sort_id FROM messages where account_id=? AND chat_id=? AND (mam_id=? OR direction=?)) SELECT chat_id AS chatId, stanza, direction, type, status, status_text, sender_id, mam_id, mam_by, MAX(sort_id), sync_point, CASE WHEN (SELECT row FROM subq) IS NULL THEN COUNT(*) ELSE COUNT(*) - 1 END AS unreadCount, strftime('%FT%H:%M:%fZ', messages.created_at / 1000.0, 'unixepoch') AS timestamp FROM messages WHERE account_id=? AND chat_id=? AND (stanza_id IS NULL OR stanza_id='' OR stanza_id=correction_id) AND (messages.sort_id >= (SELECT sort_id FROM subq) AND (messages.sort_id <> (SELECT sort_id FROM subq) OR messages.ROWID = (SELECT row FROM subq)))",18,7d,3b,a1),::cpp::VirtualArray_obj::__new(6)->init(0,accountId)->init(1,chat->chatId)->init(2,chat->readUpToId)->init(3,1)->init(4,accountId)->init(5,chat->chatId)), ::Dynamic(new _hx_Closure_0(_gthis,chat,accountId)),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,getChatUnreadDetails,return )
 
 ::Dynamic Sqlite_obj::getChatsUnreadDetails(::String accountId,::Array< ::Dynamic> chats){
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_538_getChatsUnreadDetails)
-HXLINE( 539)		bool _hx_tmp;
-HXDLIN( 539)		if (::hx::IsNotNull( chats )) {
-HXLINE( 539)			_hx_tmp = (chats->length < 1);
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_933_getChatsUnreadDetails)
+HXLINE( 934)		bool _hx_tmp;
+HXDLIN( 934)		if (::hx::IsNotNull( chats )) {
+HXLINE( 934)			_hx_tmp = (chats->length < 1);
             		}
             		else {
-HXLINE( 539)			_hx_tmp = true;
+HXLINE( 934)			_hx_tmp = true;
             		}
-HXDLIN( 539)		if (_hx_tmp) {
-HXLINE( 540)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
+HXDLIN( 934)		if (_hx_tmp) {
+HXLINE( 935)			return ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(0));
             		}
-HXLINE( 543)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(chats->length);
-HXDLIN( 543)		{
-HXLINE( 543)			int _g = 0;
-HXDLIN( 543)			int _g1 = chats->length;
-HXDLIN( 543)			while((_g < _g1)){
-HXLINE( 543)				_g = (_g + 1);
-HXDLIN( 543)				int i = (_g - 1);
-HXDLIN( 543)				{
-HXLINE( 543)					::Dynamic inValue = this->getChatUnreadDetails(accountId,( ( ::borogove::Chat)(_hx_array_unsafe_get(chats,i)) ));
-HXDLIN( 543)					result->__unsafe_set(i,inValue);
+HXLINE( 938)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(chats->length);
+HXDLIN( 938)		{
+HXLINE( 938)			int _g = 0;
+HXDLIN( 938)			int _g1 = chats->length;
+HXDLIN( 938)			while((_g < _g1)){
+HXLINE( 938)				_g = (_g + 1);
+HXDLIN( 938)				int i = (_g - 1);
+HXDLIN( 938)				{
+HXLINE( 938)					::Dynamic inValue = this->getChatUnreadDetails(accountId,( ( ::borogove::Chat)(_hx_array_unsafe_get(chats,i)) ));
+HXDLIN( 938)					result->__unsafe_set(i,inValue);
             				}
             			}
             		}
-HXDLIN( 543)		return ::thenshim::PromiseTools_obj::all(result);
+HXDLIN( 938)		return ::thenshim::PromiseTools_obj::all(result);
             	}
 
 
@@ -1623,233 +2720,226 @@ HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,getChatsUnreadDetails,return )
 ::Dynamic Sqlite_obj::storeReaction(::String accountId, ::borogove::ReactionUpdate update){
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,::String,accountId, ::borogove::ReactionUpdate,update) HXARGC(1)
             		::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_556_storeReaction)
-HXLINE( 556)			return _gthis->getMessage(accountId,update->chatId,update->serverId,update->localId);
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_951_storeReaction)
+HXLINE( 951)			return _gthis->getMessage(accountId,update->chatId,update->serverId,update->localId);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_547_storeReaction)
-HXDLIN( 547)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 548)		 ::borogove::persistence::SqliteDriver _hx_tmp = this->db;
-HXLINE( 551)		::String accountId1 = accountId;
-HXDLIN( 551)		::String update1 = update->updateId;
-HXDLIN( 551)		::String update2 = update->serverId;
-HXDLIN( 551)		::String update3 = update->serverIdBy;
-HXLINE( 552)		::String update4 = update->localId;
-HXDLIN( 552)		::String update5 = update->chatId;
-HXDLIN( 552)		::String update6 = update->senderId;
-HXDLIN( 552)		::String update7 = update->timestamp;
-HXLINE( 553)		::String _hx_tmp1 = ::borogove::JsonPrinter_obj::print(update->reactions,null(),null());
-HXLINE( 548)		return ::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->exec(HX_("INSERT OR REPLACE INTO reactions VALUES (?,?,?,?,?,?,?,CAST(unixepoch(?, 'subsec') * 1000 AS INTEGER),jsonb(?),?)",e2,55,57,48),::cpp::VirtualArray_obj::__new(10)->init(0,accountId1)->init(1,update1)->init(2,update2)->init(3,update3)->init(4,update4)->init(5,update5)->init(6,update6)->init(7,update7)->init(8,_hx_tmp1)->init(9,update->kind)), ::Dynamic(new _hx_Closure_0(_gthis,accountId,update)),null());
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_942_storeReaction)
+HXDLIN( 942)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 943)		 ::borogove::persistence::SqliteDriver _hx_tmp = this->db;
+HXLINE( 946)		::String accountId1 = accountId;
+HXDLIN( 946)		::String update1 = update->updateId;
+HXDLIN( 946)		::String update2 = update->serverId;
+HXDLIN( 946)		::String update3 = update->serverIdBy;
+HXLINE( 947)		::String update4 = update->localId;
+HXDLIN( 947)		::String update5 = update->chatId;
+HXDLIN( 947)		::String update6 = update->senderId;
+HXDLIN( 947)		::String update7 = update->timestamp;
+HXLINE( 948)		::String _hx_tmp1 = ::borogove::JsonPrinter_obj::print(update->reactions,null(),null());
+HXLINE( 943)		return ::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->exec(HX_("INSERT OR REPLACE INTO reactions VALUES (?,?,?,?,?,?,?,CAST(unixepoch(?, 'subsec') * 1000 AS INTEGER),jsonb(?),?)",e2,55,57,48),::cpp::VirtualArray_obj::__new(10)->init(0,accountId1)->init(1,update1)->init(2,update2)->init(3,update3)->init(4,update4)->init(5,update5)->init(6,update6)->init(7,update7)->init(8,_hx_tmp1)->init(9,update->kind)), ::Dynamic(new _hx_Closure_0(_gthis,accountId,update)),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,storeReaction,return )
 
 ::Dynamic Sqlite_obj::updateMessageStatus(::String accountId,::String localId,int status,::String statusText){
-            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,::String,localId,::String,accountId) HXARGC(1)
-            		::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_566_updateMessageStatus)
-HXLINE( 566)			return _gthis->db->exec(HX_("SELECT stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, correction_id AS stanza_id, mam_id, mam_by, sync_point FROM messages WHERE account_id=? AND stanza_id=? AND direction=? LIMIT 1",ed,02,c0,1d),::cpp::VirtualArray_obj::__new(3)->init(0,accountId)->init(1,localId)->init(2,1));
-            		}
-            		HX_END_LOCAL_FUNC1(return)
-
-            		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_2, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
-            		::Dynamic _hx_run( ::haxe::iterators::ArrayIterator result){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_571_updateMessageStatus)
-HXLINE( 571)			::Array< ::Dynamic> _this = _gthis->hydrateMessages(accountId,result);
-HXDLIN( 571)			::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new(_this->length);
-HXDLIN( 571)			{
-HXLINE( 571)				int _g = 0;
-HXDLIN( 571)				int _g1 = _this->length;
-HXDLIN( 571)				while((_g < _g1)){
-HXLINE( 571)					_g = (_g + 1);
-HXDLIN( 571)					int i = (_g - 1);
-HXDLIN( 571)					{
-            						HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
-            						::Dynamic _hx_run(::Array< ::Dynamic> messages){
-            							HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_576_updateMessageStatus)
-HXLINE( 576)							return _gthis->hydrateReactions(accountId,messages);
-            						}
-            						HX_END_LOCAL_FUNC1(return)
-
-HXLINE( 572)						 ::borogove::ChatMessage message = ( ( ::borogove::ChatMessage)(_hx_array_unsafe_get(_this,i)) );
-HXDLIN( 572)						::Dynamic inValue;
-HXDLIN( 572)						if (::hx::IsNotNull( message->replyToMessage )) {
-HXLINE( 573)							 ::borogove::persistence::Sqlite _gthis1 = _gthis;
-HXDLIN( 573)							::String accountId1 = accountId;
-HXDLIN( 573)							::String inValue1 = message->chatId();
-HXLINE( 572)							inValue = _gthis1->hydrateReplyTo(accountId1,::Array_obj< ::Dynamic>::__new(1)->init(0,message),::Array_obj< ::Dynamic>::__new(1)->init(0, ::Dynamic(::hx::Anon_obj::Create(3)
-            								->setFixed(0,HX_("chatId",d3,04,77,b7),inValue1)
-            								->setFixed(1,HX_("serverId",7e,01,b2,e2),message->replyToMessage->serverId)
-            								->setFixed(2,HX_("localId",26,7a,c6,2d),message->replyToMessage->localId))));
-            						}
-            						else {
-HXLINE( 572)							inValue = ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(1)->init(0,message));
+            		HX_BEGIN_LOCAL_FUNC_S5(::hx::LocalFunc,_hx_Closure_3, ::borogove::persistence::Sqlite,_gthis,::String,localId,::String,statusText,int,status,::String,accountId) HXARGC(0)
+            		::Dynamic _hx_run(){
+            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
+            			::Dynamic _hx_run( ::haxe::iterators::ArrayIterator result){
+            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_962_updateMessageStatus)
+HXLINE( 962)				::Array< ::Dynamic> _this = _gthis->hydrateMessages(accountId,result);
+HXDLIN( 962)				::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new(_this->length);
+HXDLIN( 962)				{
+HXLINE( 962)					int _g = 0;
+HXDLIN( 962)					int _g1 = _this->length;
+HXDLIN( 962)					while((_g < _g1)){
+HXLINE( 962)						_g = (_g + 1);
+HXDLIN( 962)						int i = (_g - 1);
+HXDLIN( 962)						{
+            							HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
+            							::Dynamic _hx_run(::Array< ::Dynamic> messages){
+            								HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_967_updateMessageStatus)
+HXLINE( 967)								return _gthis->hydrateReactions(accountId,messages);
+            							}
+            							HX_END_LOCAL_FUNC1(return)
+
+HXLINE( 962)							 ::borogove::ChatMessage message = ( ( ::borogove::ChatMessage)(_hx_array_unsafe_get(_this,i)) );
+HXLINE( 963)							::Dynamic inValue;
+HXDLIN( 963)							if (::hx::IsNotNull( message->replyToMessage )) {
+HXLINE( 964)								 ::borogove::persistence::Sqlite _gthis1 = _gthis;
+HXDLIN( 964)								::String accountId1 = accountId;
+HXDLIN( 964)								::String inValue1 = message->chatId();
+HXLINE( 963)								inValue = _gthis1->hydrateReplyTo(accountId1,::Array_obj< ::Dynamic>::__new(1)->init(0,message),::Array_obj< ::Dynamic>::__new(1)->init(0, ::Dynamic(::hx::Anon_obj::Create(3)
+            									->setFixed(0,HX_("chatId",d3,04,77,b7),inValue1)
+            									->setFixed(1,HX_("serverId",7e,01,b2,e2),message->replyToMessage->serverId)
+            									->setFixed(2,HX_("localId",26,7a,c6,2d),message->replyToMessage->localId))));
+            							}
+            							else {
+HXLINE( 963)								inValue = ::thenshim::_Promise::Promise_Impl__obj::resolve(::Array_obj< ::Dynamic>::__new(1)->init(0,message));
+            							}
+HXLINE( 962)							::Dynamic inValue2 = ::thenshim::_Promise::Promise_Impl__obj::then(inValue, ::Dynamic(new _hx_Closure_0(_gthis,accountId)),null());
+HXDLIN( 962)							result1->__unsafe_set(i,inValue2);
             						}
-HXLINE( 571)						::Dynamic inValue2 = ::thenshim::_Promise::Promise_Impl__obj::then(inValue, ::Dynamic(new _hx_Closure_1(_gthis,accountId)),null());
-HXDLIN( 571)						result1->__unsafe_set(i,inValue2);
             					}
             				}
+HXDLIN( 962)				return ::thenshim::PromiseTools_obj::all(result1);
             			}
-HXDLIN( 571)			return ::thenshim::PromiseTools_obj::all(result1);
-            		}
-            		HX_END_LOCAL_FUNC1(return)
+            			HX_END_LOCAL_FUNC1(return)
 
-            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_3) HXARGC(1)
-            		::Array< ::Dynamic> _hx_run(::Array< ::Dynamic> hydrated){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_578_updateMessageStatus)
-HXLINE( 578)			::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 578)			{
-HXLINE( 578)				int _g_current = 0;
-HXDLIN( 578)				while((_g_current < hydrated->length)){
-HXLINE( 578)					_g_current = (_g_current + 1);
-HXDLIN( 578)					{
-HXLINE( 578)						 ::Dynamic x = hydrated->__get((_g_current - 1)).StaticCast< ::Array< ::Dynamic> >()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 578)						while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 578)							_g->push(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+            			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2,::String,localId) HXARGC(1)
+            			::Dynamic _hx_run(::Array< ::Dynamic> hydrated){
+            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_969_updateMessageStatus)
+HXLINE( 970)				::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 970)				{
+HXLINE( 970)					int _g_current = 0;
+HXDLIN( 970)					while((_g_current < hydrated->length)){
+HXLINE( 970)						_g_current = (_g_current + 1);
+HXDLIN( 970)						{
+HXLINE( 970)							 ::Dynamic x = hydrated->__get((_g_current - 1)).StaticCast< ::Array< ::Dynamic> >()->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
+HXDLIN( 970)							while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE( 970)								_g->push(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)());
+            							}
             						}
             					}
             				}
+HXLINE( 971)				if ((_g->length > 0)) {
+HXLINE( 971)					return ::thenshim::_Promise::Promise_Impl__obj::resolve(_g->__get(0).StaticCast<  ::borogove::ChatMessage >());
+            				}
+            				else {
+HXLINE( 971)					return ::thenshim::_Promise::Promise_Impl__obj::reject((HX_("Message not found: ",62,21,15,ae) + localId));
+            				}
+HXDLIN( 971)				return null();
             			}
-HXDLIN( 578)			return _g;
-            		}
-            		HX_END_LOCAL_FUNC1(return)
+            			HX_END_LOCAL_FUNC1(return)
 
-            		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_4,::String,localId) HXARGC(1)
-            		::Dynamic _hx_run(::Array< ::Dynamic> hydrated){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_578_updateMessageStatus)
-HXLINE( 578)			if ((hydrated->length > 0)) {
-HXLINE( 578)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(hydrated->__get(0).StaticCast<  ::borogove::ChatMessage >());
-            			}
-            			else {
-HXLINE( 578)				return ::thenshim::_Promise::Promise_Impl__obj::reject((HX_("Message not found: ",62,21,15,ae) + localId));
-            			}
-HXDLIN( 578)			return null();
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_958_updateMessageStatus)
+HXLINE( 958)			return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(_gthis->db->exec(HX_("UPDATE messages SET status=?, status_text=? WHERE account_id=? AND stanza_id=? AND direction=? AND status <> ? AND status <> ? RETURNING stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, correction_id AS stanza_id, sort_id, mam_id, mam_by, sync_point",60,88,80,c5),::cpp::VirtualArray_obj::__new(7)->init(0,status)->init(1,statusText)->init(2,accountId)->init(3,localId)->init(4,1)->init(5,2)->init(6,3)), ::Dynamic(new _hx_Closure_1(_gthis,accountId)),null()), ::Dynamic(new _hx_Closure_2(localId)),null());
             		}
-            		HX_END_LOCAL_FUNC1(return)
+            		HX_END_LOCAL_FUNC0(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_561_updateMessageStatus)
-HXDLIN( 561)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 562)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("UPDATE messages SET status=?, status_text=? WHERE account_id=? AND stanza_id=? AND direction=? AND status <> ? AND status <> ?",71,68,f3,d1),::cpp::VirtualArray_obj::__new(7)->init(0,status)->init(1,statusText)->init(2,accountId)->init(3,localId)->init(4,1)->init(5,2)->init(6,3)), ::Dynamic(new _hx_Closure_0(_gthis,localId,accountId)),null()), ::Dynamic(new _hx_Closure_2(_gthis,accountId)),null()), ::Dynamic(new _hx_Closure_3()),null()), ::Dynamic(new _hx_Closure_4(localId)),null());
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_956_updateMessageStatus)
+HXDLIN( 956)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 957)		return this->storeMessagesSerialized->run( ::Dynamic(new _hx_Closure_3(_gthis,localId,statusText,status,accountId)));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC4(Sqlite_obj,updateMessageStatus,return )
 
 ::Dynamic Sqlite_obj::hasMedia(::String hashAlgorithm,::Array< unsigned char > hash){
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_583_hasMedia)
-HXDLIN( 583)		return ::borogove::persistence::MediaStore_obj::hasMedia(this->media,hashAlgorithm,hash);
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_978_hasMedia)
+HXDLIN( 978)		return ::borogove::persistence::MediaStore_obj::hasMedia(this->media,hashAlgorithm,hash);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,hasMedia,return )
 
-void Sqlite_obj::removeMedia(::String hashAlgorithm,::Array< unsigned char > hash){
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_588_removeMedia)
-HXDLIN( 588)		::borogove::persistence::MediaStore_obj::removeMedia(this->media,hashAlgorithm,hash);
+::Dynamic Sqlite_obj::removeMedia(::String hashAlgorithm,::Array< unsigned char > hash){
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_983_removeMedia)
+HXDLIN( 983)		return ::borogove::persistence::MediaStore_obj::removeMedia(this->media,hashAlgorithm,hash);
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,removeMedia,(void))
+HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,removeMedia,return )
 
 ::Dynamic Sqlite_obj::storeMedia(::String mime,::Array< unsigned char > bd){
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_593_storeMedia)
-HXDLIN( 593)		return ::borogove::persistence::MediaStore_obj::storeMedia(this->media,mime,bd);
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_988_storeMedia)
+HXDLIN( 988)		return ::borogove::persistence::MediaStore_obj::storeMedia(this->media,mime,bd);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,storeMedia,return )
 
 void Sqlite_obj::storeCaps( ::borogove::Caps caps){
-            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_598_storeCaps)
-HXDLIN( 598)		 ::haxe::ds::ObjectMap _g =  ::haxe::ds::ObjectMap_obj::__alloc( HX_CTX );
-HXDLIN( 598)		_g->set(caps->verRaw()->hash,caps);
-HXDLIN( 598)		this->storeCapsSet(_g);
+            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_992_storeCaps)
+HXLINE( 993)		 ::haxe::ds::ObjectMap map =  ::haxe::ds::ObjectMap_obj::__alloc( HX_CTX );
+HXLINE( 994)		map->set(caps->verRaw()->hash,caps);
+HXLINE( 995)		this->storeCapsSet(map);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Sqlite_obj,storeCaps,(void))
 
 void Sqlite_obj::storeCapsSet( ::haxe::ds::ObjectMap capsSet){
-            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_601_storeCapsSet)
-HXLINE( 602)		::cpp::VirtualArray params = ::cpp::VirtualArray_obj::__new(0);
-HXLINE( 603)		 ::StringBuf q =  ::StringBuf_obj::__alloc( HX_CTX );
-HXLINE( 604)		{
-HXLINE( 604)			if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 604)				q->flush();
+            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_998_storeCapsSet)
+HXLINE( 999)		::cpp::VirtualArray params = ::cpp::VirtualArray_obj::__new(0);
+HXLINE(1000)		 ::StringBuf q =  ::StringBuf_obj::__alloc( HX_CTX );
+HXLINE(1001)		{
+HXLINE(1001)			if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1001)				q->flush();
             			}
-HXDLIN( 604)			if (::hx::IsNull( q->b )) {
-HXLINE( 604)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_108,1);
+HXDLIN(1001)			if (::hx::IsNull( q->b )) {
+HXLINE(1001)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_175,1);
             			}
             			else {
-HXLINE( 604)				q->b->push(HX_("INSERT OR IGNORE INTO caps VALUES ",27,4b,68,bf));
+HXLINE(1001)				q->b->push(HX_("INSERT OR IGNORE INTO caps VALUES ",27,4b,68,bf));
             			}
             		}
-HXLINE( 605)		bool first = true;
-HXLINE( 606)		{
-HXLINE( 606)			::Dynamic map = capsSet;
-HXDLIN( 606)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(map);
-HXDLIN( 606)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 606)				::Array< unsigned char > key = ( (::Array< unsigned char >)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXDLIN( 606)				 ::borogove::Caps _g_value = ( ( ::borogove::Caps)(::haxe::IMap_obj::get(map,key)) );
-HXDLIN( 606)				{
-HXLINE( 607)					if (!(first)) {
-HXLINE( 607)						if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 607)							q->flush();
+HXLINE(1002)		bool first = true;
+HXLINE(1003)		{
+HXLINE(1003)			::Dynamic map = capsSet;
+HXDLIN(1003)			 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(map);
+HXDLIN(1003)			while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(1003)				::Array< unsigned char > key = ( (::Array< unsigned char >)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN(1003)				 ::borogove::Caps _g_value = ( ( ::borogove::Caps)(::haxe::IMap_obj::get(map,key)) );
+HXDLIN(1003)				{
+HXLINE(1004)					if (!(first)) {
+HXLINE(1004)						if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1004)							q->flush();
             						}
-HXDLIN( 607)						if (::hx::IsNull( q->b )) {
-HXLINE( 607)							q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_109,1);
+HXDLIN(1004)						if (::hx::IsNull( q->b )) {
+HXLINE(1004)							q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_176,1);
             						}
             						else {
-HXLINE( 607)							q->b->push(HX_(",",2c,00,00,00));
+HXLINE(1004)							q->b->push(HX_(",",2c,00,00,00));
             						}
             					}
-HXLINE( 608)					{
-HXLINE( 608)						if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 608)							q->flush();
+HXLINE(1005)					{
+HXLINE(1005)						if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1005)							q->flush();
             						}
-HXDLIN( 608)						if (::hx::IsNull( q->b )) {
-HXLINE( 608)							q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_110,1);
+HXDLIN(1005)						if (::hx::IsNull( q->b )) {
+HXLINE(1005)							q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_177,1);
             						}
             						else {
-HXLINE( 608)							q->b->push(HX_("(?,jsonb(?))",1c,61,06,9e));
-            						}
-            					}
-HXLINE( 609)					params->push(key);
-HXLINE( 610)					::String caps = _g_value->node;
-HXDLIN( 610)					::Array< ::Dynamic> caps1 = _g_value->identities;
-HXDLIN( 610)					::Array< ::String > caps2 = _g_value->features;
-HXDLIN( 610)					::Array< ::Dynamic> _this = _g_value->data;
-HXDLIN( 610)					::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
-HXDLIN( 610)					{
-HXLINE( 610)						int _g = 0;
-HXDLIN( 610)						int _g1 = _this->length;
-HXDLIN( 610)						while((_g < _g1)){
-HXLINE( 610)							_g = (_g + 1);
-HXDLIN( 610)							int i = (_g - 1);
-HXDLIN( 610)							{
-HXLINE( 610)								::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->toString();
-HXDLIN( 610)								result->__unsafe_set(i,inValue);
+HXLINE(1005)							q->b->push(HX_("(?,jsonb(?))",1c,61,06,9e));
+            						}
+            					}
+HXLINE(1006)					params->push(key);
+HXLINE(1007)					::String caps = _g_value->node;
+HXDLIN(1007)					::Array< ::Dynamic> caps1 = _g_value->identities;
+HXDLIN(1007)					::Array< ::String > caps2 = _g_value->features;
+HXDLIN(1007)					::Array< ::Dynamic> _this = _g_value->data;
+HXDLIN(1007)					::Array< ::String > result = ::Array_obj< ::String >::__new(_this->length);
+HXDLIN(1007)					{
+HXLINE(1007)						int _g = 0;
+HXDLIN(1007)						int _g1 = _this->length;
+HXDLIN(1007)						while((_g < _g1)){
+HXLINE(1007)							_g = (_g + 1);
+HXDLIN(1007)							int i = (_g - 1);
+HXDLIN(1007)							{
+HXLINE(1007)								::String inValue = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) )->toString();
+HXDLIN(1007)								result->__unsafe_set(i,inValue);
             							}
             						}
             					}
-HXDLIN( 610)					 ::Dynamic replacer = null();
-HXDLIN( 610)					::String space = null();
-HXDLIN( 610)					params->push(::haxe::format::JsonPrinter_obj::print( ::Dynamic(::hx::Anon_obj::Create(4)
+HXDLIN(1007)					 ::Dynamic replacer = null();
+HXDLIN(1007)					::String space = null();
+HXDLIN(1007)					params->push(::haxe::format::JsonPrinter_obj::print( ::Dynamic(::hx::Anon_obj::Create(4)
             						->setFixed(0,HX_("identities",1c,c5,6d,d7),caps1)
             						->setFixed(1,HX_("features",fd,6c,d7,12),caps2)
             						->setFixed(2,HX_("data",2a,56,63,42),result)
             						->setFixed(3,HX_("node",02,0a,0a,49),caps)),replacer,space));
-HXLINE( 611)					first = false;
+HXLINE(1008)					first = false;
             				}
             			}
             		}
-HXLINE( 613)		if ((params->get_length() < 1)) {
-HXLINE( 613)			return;
+HXLINE(1010)		if ((params->get_length() < 1)) {
+HXLINE(1010)			return;
             		}
-HXLINE( 614)		 ::borogove::persistence::SqliteDriver _hx_tmp = this->db;
-HXDLIN( 614)		_hx_tmp->exec(q->toString(),params);
+HXLINE(1011)		 ::borogove::persistence::SqliteDriver _hx_tmp = this->db;
+HXDLIN(1011)		_hx_tmp->exec(q->toString(),params);
             	}
 
 
@@ -1858,167 +2948,174 @@ HX_DEFINE_DYNAMIC_FUNC1(Sqlite_obj,storeCapsSet,(void))
 ::Dynamic Sqlite_obj::getCaps(::String ver){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,::Array< unsigned char >,verData) HXARGC(1)
             		 ::borogove::Caps _hx_run( ::haxe::iterators::ArrayIterator result){
-            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_627_getCaps)
-HXLINE( 628)			while((result->current < result->array->get_length())){
-HXLINE( 629)				 ::Dynamic json =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(result->array->__get(result->current++)->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic)) ))->doParse();
-HXLINE( 630)				return _gthis->hydrateCaps(json,verData);
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1024_getCaps)
+HXLINE(1025)			while((result->current < result->array->get_length())){
+HXLINE(1026)				 ::Dynamic json =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(result->array->__get(result->current++)->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic)) ))->doParse();
+HXLINE(1027)				return _gthis->hydrateCaps(json,verData);
             			}
-HXLINE( 632)			return null();
+HXLINE(1029)			return null();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_618_getCaps)
-HXDLIN( 618)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 619)		::Array< unsigned char > verData;
-HXDLIN( 619)		try {
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1015_getCaps)
+HXDLIN(1015)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1016)		::Array< unsigned char > verData;
+HXDLIN(1016)		try {
             			HX_STACK_CATCHABLE( ::Dynamic, 0);
-HXLINE( 619)			verData = ::haxe::crypto::Base64_obj::decode(ver,null())->b;
+HXLINE(1016)			verData = ::haxe::crypto::Base64_obj::decode(ver,null())->b;
             		} catch( ::Dynamic _hx_e) {
             			if (_hx_e.IsClass<  ::Dynamic >() ){
             				HX_STACK_BEGIN_CATCH
             				 ::Dynamic _g = _hx_e;
-HXLINE( 622)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+HXLINE(1019)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             			}
             			else {
             				HX_STACK_DO_THROW(_hx_e);
             			}
             		}
-HXLINE( 624)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT json(caps) AS caps FROM caps WHERE sha1=? LIMIT 1",5a,98,24,09),::cpp::VirtualArray_obj::__new(1)->init(0,verData)), ::Dynamic(new _hx_Closure_0(_gthis,verData)),null());
+HXLINE(1021)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT json(caps) AS caps FROM caps WHERE sha1=? LIMIT 1",5a,98,24,09),::cpp::VirtualArray_obj::__new(1)->init(0,verData)), ::Dynamic(new _hx_Closure_0(_gthis,verData)),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Sqlite_obj,getCaps,return )
 
-void Sqlite_obj::storeLogin(::String accountId,::String clientId,::String displayName,::String token){
-            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_637_storeLogin)
-HXLINE( 638)		::Array< ::String > params = ::Array_obj< ::String >::__new(3)->init(0,accountId)->init(1,clientId)->init(2,displayName);
-HXLINE( 639)		 ::StringBuf q =  ::StringBuf_obj::__alloc( HX_CTX );
-HXLINE( 640)		{
-HXLINE( 640)			if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 640)				q->flush();
+::Dynamic Sqlite_obj::storeLogin(::String accountId,::String clientId,::String displayName,::String token){
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
+            		bool _hx_run( ::haxe::iterators::ArrayIterator _){
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1056_storeLogin)
+HXLINE(1056)			return true;
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1034_storeLogin)
+HXLINE(1035)		::Array< ::String > params = ::Array_obj< ::String >::__new(3)->init(0,accountId)->init(1,clientId)->init(2,displayName);
+HXLINE(1036)		 ::StringBuf q =  ::StringBuf_obj::__alloc( HX_CTX );
+HXLINE(1037)		{
+HXLINE(1037)			if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1037)				q->flush();
             			}
-HXDLIN( 640)			if (::hx::IsNull( q->b )) {
-HXLINE( 640)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_115,1);
+HXDLIN(1037)			if (::hx::IsNull( q->b )) {
+HXLINE(1037)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_183,1);
             			}
             			else {
-HXLINE( 640)				q->b->push(HX_("INSERT INTO accounts (account_id, client_id, display_name",03,b0,6a,0b));
+HXLINE(1037)				q->b->push(HX_("INSERT INTO accounts (account_id, client_id, display_name",03,b0,6a,0b));
             			}
             		}
-HXLINE( 641)		if (::hx::IsNotNull( token )) {
-HXLINE( 642)			if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 642)				q->flush();
+HXLINE(1038)		if (::hx::IsNotNull( token )) {
+HXLINE(1039)			if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1039)				q->flush();
             			}
-HXDLIN( 642)			if (::hx::IsNull( q->b )) {
-HXLINE( 642)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_116,1);
+HXDLIN(1039)			if (::hx::IsNull( q->b )) {
+HXLINE(1039)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_184,1);
             			}
             			else {
-HXLINE( 642)				q->b->push(HX_(", token, fast_count",a5,56,e4,ae));
+HXLINE(1039)				q->b->push(HX_(", token, fast_count",a5,56,e4,ae));
             			}
             		}
-HXLINE( 644)		{
-HXLINE( 644)			if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 644)				q->flush();
+HXLINE(1041)		{
+HXLINE(1041)			if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1041)				q->flush();
             			}
-HXDLIN( 644)			if (::hx::IsNull( q->b )) {
-HXLINE( 644)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_117,1);
+HXDLIN(1041)			if (::hx::IsNull( q->b )) {
+HXLINE(1041)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_185,1);
             			}
             			else {
-HXLINE( 644)				q->b->push(HX_(") VALUES (?,?,?",c4,1c,e3,67));
+HXLINE(1041)				q->b->push(HX_(") VALUES (?,?,?",c4,1c,e3,67));
             			}
             		}
-HXLINE( 645)		if (::hx::IsNotNull( token )) {
-HXLINE( 646)			{
-HXLINE( 646)				if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 646)					q->flush();
+HXLINE(1042)		if (::hx::IsNotNull( token )) {
+HXLINE(1043)			{
+HXLINE(1043)				if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1043)					q->flush();
             				}
-HXDLIN( 646)				if (::hx::IsNull( q->b )) {
-HXLINE( 646)					q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_118,1);
+HXDLIN(1043)				if (::hx::IsNull( q->b )) {
+HXLINE(1043)					q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_186,1);
             				}
             				else {
-HXLINE( 646)					q->b->push(HX_(",?",93,26,00,00));
+HXLINE(1043)					q->b->push(HX_(",?",93,26,00,00));
             				}
             			}
-HXLINE( 647)			params->push(token);
-HXLINE( 648)			{
-HXLINE( 648)				if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 648)					q->flush();
+HXLINE(1044)			params->push(token);
+HXLINE(1045)			{
+HXLINE(1045)				if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1045)					q->flush();
             				}
-HXDLIN( 648)				if (::hx::IsNull( q->b )) {
-HXLINE( 648)					q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_119,1);
+HXDLIN(1045)				if (::hx::IsNull( q->b )) {
+HXLINE(1045)					q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_187,1);
             				}
             				else {
-HXLINE( 648)					q->b->push(HX_(",0",84,26,00,00));
+HXLINE(1045)					q->b->push(HX_(",0",84,26,00,00));
             				}
             			}
             		}
-HXLINE( 650)		{
-HXLINE( 650)			if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 650)				q->flush();
+HXLINE(1047)		{
+HXLINE(1047)			if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1047)				q->flush();
             			}
-HXDLIN( 650)			if (::hx::IsNull( q->b )) {
-HXLINE( 650)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_120,1);
+HXDLIN(1047)			if (::hx::IsNull( q->b )) {
+HXLINE(1047)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_188,1);
             			}
             			else {
-HXLINE( 650)				q->b->push(HX_(") ON CONFLICT DO UPDATE SET client_id=?",cd,99,0c,96));
+HXLINE(1047)				q->b->push(HX_(") ON CONFLICT DO UPDATE SET client_id=?",cd,99,0c,96));
             			}
             		}
-HXLINE( 651)		params->push(clientId);
-HXLINE( 652)		{
-HXLINE( 652)			if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 652)				q->flush();
+HXLINE(1048)		params->push(clientId);
+HXLINE(1049)		{
+HXLINE(1049)			if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1049)				q->flush();
             			}
-HXDLIN( 652)			if (::hx::IsNull( q->b )) {
-HXLINE( 652)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_121,1);
+HXDLIN(1049)			if (::hx::IsNull( q->b )) {
+HXLINE(1049)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_189,1);
             			}
             			else {
-HXLINE( 652)				q->b->push(HX_(", display_name=?",7e,ad,5b,0f));
+HXLINE(1049)				q->b->push(HX_(", display_name=?",7e,ad,5b,0f));
             			}
             		}
-HXLINE( 653)		params->push(displayName);
-HXLINE( 654)		if (::hx::IsNotNull( token )) {
-HXLINE( 655)			{
-HXLINE( 655)				if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 655)					q->flush();
+HXLINE(1050)		params->push(displayName);
+HXLINE(1051)		if (::hx::IsNotNull( token )) {
+HXLINE(1052)			{
+HXLINE(1052)				if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1052)					q->flush();
             				}
-HXDLIN( 655)				if (::hx::IsNull( q->b )) {
-HXLINE( 655)					q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_122,1);
+HXDLIN(1052)				if (::hx::IsNull( q->b )) {
+HXLINE(1052)					q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_190,1);
             				}
             				else {
-HXLINE( 655)					q->b->push(HX_(", token=?",a7,78,19,80));
+HXLINE(1052)					q->b->push(HX_(", token=?",a7,78,19,80));
             				}
             			}
-HXLINE( 656)			params->push(token);
-HXLINE( 657)			{
-HXLINE( 657)				if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 657)					q->flush();
+HXLINE(1053)			params->push(token);
+HXLINE(1054)			{
+HXLINE(1054)				if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1054)					q->flush();
             				}
-HXDLIN( 657)				if (::hx::IsNull( q->b )) {
-HXLINE( 657)					q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_123,1);
+HXDLIN(1054)				if (::hx::IsNull( q->b )) {
+HXLINE(1054)					q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_191,1);
             				}
             				else {
-HXLINE( 657)					q->b->push(HX_(", fast_count=0",73,a8,4f,82));
+HXLINE(1054)					q->b->push(HX_(", fast_count=0",73,a8,4f,82));
             				}
             			}
             		}
-HXLINE( 659)		 ::borogove::persistence::SqliteDriver _hx_tmp = this->db;
-HXDLIN( 659)		_hx_tmp->exec(q->toString(),params);
+HXLINE(1056)		 ::borogove::persistence::SqliteDriver _hx_tmp = this->db;
+HXDLIN(1056)		return ::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->exec(q->toString(),params), ::Dynamic(new _hx_Closure_0()),null());
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC4(Sqlite_obj,storeLogin,(void))
+HX_DEFINE_DYNAMIC_FUNC4(Sqlite_obj,storeLogin,return )
 
 ::Dynamic Sqlite_obj::getLogin(::String accountId){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
             		 ::Dynamic _hx_run( ::haxe::iterators::ArrayIterator result){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_667_getLogin)
-HXLINE( 668)			while((result->current < result->array->get_length())){
-HXLINE( 668)				 ::Dynamic row = result->array->__get(result->current++);
-HXLINE( 670)				if (::hx::IsNotNull( row->__Field(HX_("token",f9,82,2b,14),::hx::paccDynamic) )) {
-HXLINE( 671)					_gthis->db->exec(HX_("UPDATE accounts SET fast_count=fast_count+1 WHERE account_id=?",a6,3f,55,2d),::cpp::VirtualArray_obj::__new(1)->init(0,accountId));
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1064_getLogin)
+HXLINE(1065)			while((result->current < result->array->get_length())){
+HXLINE(1065)				 ::Dynamic row = result->array->__get(result->current++);
+HXLINE(1067)				if (::hx::IsNotNull( row->__Field(HX_("token",f9,82,2b,14),::hx::paccDynamic) )) {
+HXLINE(1068)					_gthis->db->exec(HX_("UPDATE accounts SET fast_count=fast_count+1 WHERE account_id=?",a6,3f,55,2d),::cpp::VirtualArray_obj::__new(1)->init(0,accountId));
             				}
-HXLINE( 673)				return row;
+HXLINE(1070)				return row;
             			}
-HXLINE( 676)			return  ::Dynamic(::hx::Anon_obj::Create(4)
+HXLINE(1073)			return  ::Dynamic(::hx::Anon_obj::Create(4)
             				->setFixed(0,HX_("fastCount",93,fc,67,a5),0)
             				->setFixed(1,HX_("token",f9,82,2b,14),null())
             				->setFixed(2,HX_("clientId",06,73,8f,15),null())
@@ -2026,178 +3123,150 @@ HXLINE( 676)			return  ::Dynamic(::hx::Anon_obj::Create(4)
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_663_getLogin)
-HXDLIN( 663)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 664)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT client_id AS clientId, display_name AS displayName, token, COALESCE(fast_count, 0) AS fastCount FROM accounts WHERE account_id=? LIMIT 1",d8,8f,02,8f),::cpp::VirtualArray_obj::__new(1)->init(0,accountId)), ::Dynamic(new _hx_Closure_0(_gthis,accountId)),null());
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1060_getLogin)
+HXDLIN(1060)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1061)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT client_id AS clientId, display_name AS displayName, token, COALESCE(fast_count, 0) AS fastCount FROM accounts WHERE account_id=? LIMIT 1",d8,8f,02,8f),::cpp::VirtualArray_obj::__new(1)->init(0,accountId)), ::Dynamic(new _hx_Closure_0(_gthis,accountId)),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Sqlite_obj,getLogin,return )
 
-void Sqlite_obj::removeAccount(::String accountId,bool completely){
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_686_removeAccount)
-HXLINE( 687)		this->db->exec(HX_("DELETE FROM accounts WHERE account_id=?",a1,e8,94,4e),::cpp::VirtualArray_obj::__new(1)->init(0,accountId));
-HXLINE( 689)		if (!(completely)) {
-HXLINE( 689)			return;
+::Dynamic Sqlite_obj::removeAccount(::String accountId,bool completely){
+            		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,bool,completely,::String,accountId) HXARGC(1)
+            		::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1085_removeAccount)
+HXLINE(1086)			if (!(completely)) {
+HXLINE(1086)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            			}
+HXLINE(1088)			return _gthis->db->execMany(::Array_obj< ::Dynamic>::__new(3)->init(0, ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("params",46,fb,7a,ed),::cpp::VirtualArray_obj::__new(1)->init(0,accountId))
+            				->setFixed(1,HX_("sql",0e,a6,57,00),HX_("DELETE FROM messages WHERE account_id=?",bb,0a,07,c2))))->init(1, ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("params",46,fb,7a,ed),::cpp::VirtualArray_obj::__new(1)->init(0,accountId))
+            				->setFixed(1,HX_("sql",0e,a6,57,00),HX_("DELETE FROM chats WHERE account_id=?",2e,3d,02,57))))->init(2, ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("params",46,fb,7a,ed),::cpp::VirtualArray_obj::__new(1)->init(0,accountId))
+            				->setFixed(1,HX_("sql",0e,a6,57,00),HX_("DELETE FROM services WHERE account_id=?",29,fc,5f,4f)))));
+            		}
+            		HX_END_LOCAL_FUNC1(return)
+
+            		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
+            		bool _hx_run( ::haxe::iterators::ArrayIterator _){
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1093_removeAccount)
+HXLINE(1093)			return true;
             		}
-HXLINE( 691)		this->db->exec(HX_("DELETE FROM messages WHERE account_id=?",bb,0a,07,c2),::cpp::VirtualArray_obj::__new(1)->init(0,accountId));
-HXLINE( 692)		this->db->exec(HX_("DELETE FROM chats WHERE account_id=?",2e,3d,02,57),::cpp::VirtualArray_obj::__new(1)->init(0,accountId));
-HXLINE( 693)		this->db->exec(HX_("DELETE FROM services WHERE account_id=?",29,fc,5f,4f),::cpp::VirtualArray_obj::__new(1)->init(0,accountId));
+            		HX_END_LOCAL_FUNC1(return)
+
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1084_removeAccount)
+HXDLIN(1084)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1085)		return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("DELETE FROM accounts WHERE account_id=?",a1,e8,94,4e),::cpp::VirtualArray_obj::__new(1)->init(0,accountId)), ::Dynamic(new _hx_Closure_0(_gthis,completely,accountId)),null()), ::Dynamic(new _hx_Closure_1()),null());
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,removeAccount,(void))
+HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,removeAccount,return )
 
 ::Dynamic Sqlite_obj::listAccounts(){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
             		::Array< ::String > _hx_run( ::haxe::iterators::ArrayIterator result){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_704_listAccounts)
-HXLINE( 704)			if (::hx::IsNull( result )) {
-HXLINE( 704)				return ::Array_obj< ::String >::__new(0);
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1105_listAccounts)
+HXLINE(1105)			if (::hx::IsNull( result )) {
+HXLINE(1105)				return ::Array_obj< ::String >::__new(0);
             			}
             			else {
-HXLINE( 704)				::Array< ::String > _g = ::Array_obj< ::String >::__new(0);
-HXDLIN( 704)				{
+HXLINE(1105)				::Array< ::String > _g = ::Array_obj< ::String >::__new(0);
+HXDLIN(1105)				{
             					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::haxe::iterators::ArrayIterator,result) HXARGC(0)
             					 ::haxe::iterators::ArrayIterator _hx_run(){
-            						HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_704_listAccounts)
-HXLINE( 704)						return result;
+            						HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1105_listAccounts)
+HXLINE(1105)						return result;
             					}
             					HX_END_LOCAL_FUNC0(return)
 
-HXLINE( 704)					 ::Dynamic x =  ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1105)					 ::Dynamic x =  ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("iterator",ee,49,9a,93), ::Dynamic(new _hx_Closure_0(result))))->__Field(HX_("iterator",ee,49,9a,93),::hx::paccDynamic)();
-HXDLIN( 704)					while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 704)						_g->push( ::Dynamic(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("account_id",6d,df,ad,00),::hx::paccDynamic)));
+HXDLIN(1105)					while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(1105)						_g->push( ::Dynamic(x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()->__Field(HX_("account_id",6d,df,ad,00),::hx::paccDynamic)));
             					}
             				}
-HXDLIN( 704)				return _g;
+HXDLIN(1105)				return _g;
             			}
-HXDLIN( 704)			return null();
+HXDLIN(1105)			return null();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_703_listAccounts)
-HXDLIN( 703)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT account_id FROM accounts",4d,82,81,0c),null()), ::Dynamic(new _hx_Closure_1()),null());
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1104_listAccounts)
+HXDLIN(1104)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT account_id FROM accounts",4d,82,81,0c),null()), ::Dynamic(new _hx_Closure_1()),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(Sqlite_obj,listAccounts,return )
 
-void Sqlite_obj::listAccounts__fromC(::cpp::Function< void  (const char**,size_t,void*) > handler,void* handler__context){
-            	HX_STACKFRAME(&_hx_pos_e0e41eef74e41160_337_listAccounts__fromC)
-HXDLIN( 337)		if (::hx::IsNull( handler )) {
-HXDLIN( 337)			this->listAccounts();
-            		}
-            		else {
-            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,::cpp::Function< void  (const char** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
-            			void _hx_run(::Array< ::String > v){
-            				HX_STACKFRAME(&_hx_pos_e0e41eef74e41160_337_listAccounts__fromC)
-HXDLIN( 337)				::cpp::Function< void  (const char**,size_t,void*) > handler1 = handler;
-HXLINE( 308)				::Array< size_t > arr = ::Array_obj< size_t >::__new(v->length);
-HXDLIN( 308)				{
-HXLINE( 308)					int _g_current = 0;
-HXDLIN( 308)					::Array< ::String > _g_array = v;
-HXDLIN( 308)					while((_g_current < _g_array->length)){
-HXLINE( 308)						::String _g_value = _g_array->__get(_g_current);
-HXDLIN( 308)						_g_current = (_g_current + 1);
-HXDLIN( 308)						::String el = _g_value;
-HXDLIN( 308)						{
-HXLINE( 308)							const char* cStrPtr = el.utf8_str();
-HXDLIN( 308)							::cpp::Int64 ptrInt64 = reinterpret_cast<int64_t>(cStrPtr);
-HXDLIN( 308)							{
-HXLINE( 308)								 ::Dynamic store = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt64);
-HXDLIN( 308)								if (::hx::IsNull( store )) {
-HXLINE(2243)									store =  ::Dynamic(::hx::Anon_obj::Create(2)
-            										->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            										->setFixed(1,HX_("value",71,7f,b8,31),el));
-HXLINE( 308)									::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt64,store);
-            								}
-            								else {
-HXLINE( 308)									::hx::FieldRef((store).mPtr,HX_("refCount",7c,2e,66,86))++;
-            								}
-            							}
-HXDLIN( 308)							const char* ptr = cStrPtr;
-HXDLIN( 308)							arr[(_g_current - 1)] = reinterpret_cast<size_t>(ptr);
-            						}
-            					}
+::Dynamic Sqlite_obj::storeStreamManagement(::String accountId,::Array< unsigned char > sm,::String sortId){
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1113_storeStreamManagement)
+HXDLIN(1113)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1114)		this->smStoreNext = sm;
+HXLINE(1115)		this->smStoreIdNext = sortId;
+HXLINE(1116)		if (!(this->smStoreInProgress)) {
+            			HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,::String,accountId,::String,sortId,::Array< unsigned char >,sm) HXARGC(1)
+            			::Dynamic _hx_run( ::haxe::iterators::ArrayIterator _){
+            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1121_storeStreamManagement)
+HXLINE(1122)				_gthis->smStoreInProgress = false;
+HXLINE(1123)				bool _hx_tmp;
+HXDLIN(1123)				if (::hx::IsPointerEq( _gthis->smStoreNext,sm )) {
+HXLINE(1123)					_hx_tmp = (_gthis->smStoreIdNext != sortId);
             				}
-HXDLIN( 308)				void** ptr1 = (void**)arr->getBase();
-HXDLIN( 308)				::cpp::Int64 ptrInt641 = reinterpret_cast<int64_t>(ptr1);
-HXDLIN( 308)				{
-HXLINE( 308)					 ::Dynamic store1 = ::_HaxeCBridge::Internal_obj::gcRetainMap->get(ptrInt641);
-HXDLIN( 308)					if (::hx::IsNull( store1 )) {
-HXLINE(2243)						store1 =  ::Dynamic(::hx::Anon_obj::Create(2)
-            							->setFixed(0,HX_("refCount",7c,2e,66,86),1)
-            							->setFixed(1,HX_("value",71,7f,b8,31),arr));
-HXLINE( 308)						::_HaxeCBridge::Internal_obj::gcRetainMap->set(ptrInt641,store1);
-            					}
-            					else {
-HXLINE( 308)						::hx::FieldRef((store1).mPtr,HX_("refCount",7c,2e,66,86))++;
-            					}
+            				else {
+HXLINE(1123)					_hx_tmp = true;
             				}
-HXLINE( 337)				handler1(( (const char**)(ptr1) ),( (size_t)(v->length) ),handler__context);
-            			}
-            			HX_END_LOCAL_FUNC1((void))
-
-            			HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1,::cpp::Function< void  (const char** HX_COMMA size_t HX_COMMA void*) >,handler,void*,handler__context) HXARGC(1)
-            			void _hx_run( ::Dynamic e){
-            				HX_STACKFRAME(&_hx_pos_e0e41eef74e41160_337_listAccounts__fromC)
-HXDLIN( 337)				handler(null(),( (size_t)(0) ),handler__context);
+HXDLIN(1123)				if (_hx_tmp) {
+HXLINE(1123)					_gthis->storeStreamManagement(accountId,_gthis->smStoreNext,_gthis->smStoreIdNext);
+            				}
+HXLINE(1124)				return null();
             			}
-            			HX_END_LOCAL_FUNC1((void))
-
-HXDLIN( 337)			::thenshim::_Promise::Promise_Impl__obj::then(this->listAccounts(), ::Dynamic(new _hx_Closure_0(handler,handler__context)), ::Dynamic(new _hx_Closure_1(handler,handler__context)));
-            		}
-            	}
-
+            			HX_END_LOCAL_FUNC1(return)
 
-void Sqlite_obj::storeStreamManagement(::String accountId,::Array< unsigned char > sm){
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_711_storeStreamManagement)
-HXDLIN( 711)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 712)		this->smStoreNext = sm;
-HXLINE( 713)		if (!(this->smStoreInProgress)) {
-            			HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,::String,accountId,::Array< unsigned char >,sm) HXARGC(1)
-            			void _hx_run( ::haxe::iterators::ArrayIterator _){
-            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_718_storeStreamManagement)
-HXLINE( 719)				_gthis->smStoreInProgress = false;
-HXLINE( 720)				if (::hx::IsPointerNotEq( _gthis->smStoreNext,sm )) {
-HXLINE( 720)					_gthis->storeStreamManagement(accountId,sm);
-            				}
+            			HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_1) HXARGC(1)
+            			::Dynamic _hx_run( ::Dynamic _){
+            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1125_storeStreamManagement)
+HXLINE(1125)				return ::thenshim::_Promise::Promise_Impl__obj::resolve(true);
             			}
-            			HX_END_LOCAL_FUNC1((void))
+            			HX_END_LOCAL_FUNC1(return)
 
-HXLINE( 714)			this->smStoreInProgress = true;
-HXLINE( 715)			::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("UPDATE accounts SET sm_state=? WHERE account_id=?",39,71,68,1b),::cpp::VirtualArray_obj::__new(2)->init(0,sm)->init(1,accountId)), ::Dynamic(new _hx_Closure_0(_gthis,accountId,sm)),null());
+HXLINE(1117)			this->smStoreInProgress = true;
+HXLINE(1118)			return ::thenshim::_Promise::Promise_Impl__obj::then(::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("UPDATE accounts SET sm_state=?, sort_id=? WHERE account_id=?",2d,28,1d,d9),::cpp::VirtualArray_obj::__new(3)->init(0,sm)->init(1,sortId)->init(2,accountId)), ::Dynamic(new _hx_Closure_0(_gthis,accountId,sortId,sm)),null()), ::Dynamic(new _hx_Closure_1()),null());
             		}
+HXLINE(1129)		return ::thenshim::_Promise::Promise_Impl__obj::resolve(true);
             	}
 
 
-HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,storeStreamManagement,(void))
+HX_DEFINE_DYNAMIC_FUNC3(Sqlite_obj,storeStreamManagement,return )
 
 ::Dynamic Sqlite_obj::getStreamManagement(::String accountId){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
-            		::Dynamic _hx_run( ::haxe::iterators::ArrayIterator result){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_727_getStreamManagement)
-HXLINE( 728)			while((result->current < result->array->get_length())){
-HXLINE( 729)				return  ::Dynamic(result->array->__get(result->current++)->__Field(HX_("sm_state",6c,91,3f,e6),::hx::paccDynamic));
+            		 ::Dynamic _hx_run( ::haxe::iterators::ArrayIterator result){
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1134_getStreamManagement)
+HXLINE(1135)			while((result->current < result->array->get_length())){
+HXLINE(1135)				 ::Dynamic row = result->array->__get(result->current++);
+HXLINE(1136)				return  ::Dynamic(::hx::Anon_obj::Create(2)
+            					->setFixed(0,HX_("sm",9a,64,00,00), ::Dynamic(row->__Field(HX_("sm_state",6c,91,3f,e6),::hx::paccDynamic)))
+            					->setFixed(1,HX_("sortId",d9,7a,37,30), ::Dynamic(row->__Field(HX_("sort_id",5c,b9,64,00),::hx::paccDynamic))));
             			}
-HXLINE( 732)			return null();
+HXLINE(1139)			return  ::Dynamic(::hx::Anon_obj::Create(2)
+            				->setFixed(0,HX_("sm",9a,64,00,00),null())
+            				->setFixed(1,HX_("sortId",d9,7a,37,30),HX_("a ",9f,54,00,00)));
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_727_getStreamManagement)
-HXDLIN( 727)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT sm_state FROM accounts  WHERE account_id=?",94,7f,74,ea),::cpp::VirtualArray_obj::__new(1)->init(0,accountId)), ::Dynamic(new _hx_Closure_0()),null());
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1134_getStreamManagement)
+HXDLIN(1134)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT sm_state, sort_id FROM accounts  WHERE account_id=?",dc,52,f6,8e),::cpp::VirtualArray_obj::__new(1)->init(0,accountId)), ::Dynamic(new _hx_Closure_0()),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Sqlite_obj,getStreamManagement,return )
 
 void Sqlite_obj::storeService(::String accountId,::String serviceId,::String name,::String node, ::borogove::Caps caps){
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_737_storeService)
-HXLINE( 738)		this->storeCaps(caps);
-HXLINE( 740)		 ::borogove::persistence::SqliteDriver _hx_tmp = this->db;
-HXDLIN( 740)		_hx_tmp->exec(HX_("INSERT OR REPLACE INTO services VALUES (?,?,?,?,?)",2c,3a,d9,f8),::cpp::VirtualArray_obj::__new(5)->init(0,accountId)->init(1,serviceId)->init(2,name)->init(3,node)->init(4,caps->verRaw()->hash));
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1144_storeService)
+HXLINE(1145)		this->storeCaps(caps);
+HXLINE(1147)		 ::borogove::persistence::SqliteDriver _hx_tmp = this->db;
+HXDLIN(1147)		_hx_tmp->exec(HX_("INSERT OR REPLACE INTO services VALUES (?,?,?,?,?)",2c,3a,d9,f8),::cpp::VirtualArray_obj::__new(5)->init(0,accountId)->init(1,serviceId)->init(2,name)->init(3,node)->init(4,caps->verRaw()->hash));
             	}
 
 
@@ -2206,43 +3275,43 @@ HX_DEFINE_DYNAMIC_FUNC5(Sqlite_obj,storeService,(void))
 ::Dynamic Sqlite_obj::findServicesWithFeature(::String accountId,::String feature){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::Sqlite,_gthis,::String,feature) HXARGC(1)
             		::Array< ::Dynamic> _hx_run( ::haxe::iterators::ArrayIterator result){
-            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_752_findServicesWithFeature)
-HXLINE( 753)			::Array< ::Dynamic> services = ::Array_obj< ::Dynamic>::__new(0);
-HXLINE( 754)			while((result->current < result->array->get_length())){
-HXLINE( 754)				 ::Dynamic row = result->array->__get(result->current++);
-HXLINE( 755)				 ::Dynamic json =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic)) ))->doParse();
-HXLINE( 756)				::Array< ::String > features;
-HXDLIN( 756)				::Array< ::String > tmp;
-HXDLIN( 756)				if (::hx::IsNotNull( json )) {
-HXLINE( 756)					tmp = ( (::Array< ::String >)(json->__Field(HX_("features",fd,6c,d7,12),::hx::paccDynamic)) );
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1159_findServicesWithFeature)
+HXLINE(1160)			::Array< ::Dynamic> services = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1161)			while((result->current < result->array->get_length())){
+HXLINE(1161)				 ::Dynamic row = result->array->__get(result->current++);
+HXLINE(1162)				 ::Dynamic json =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("caps",21,1c,ba,41),::hx::paccDynamic)) ))->doParse();
+HXLINE(1163)				::Array< ::String > features;
+HXDLIN(1163)				::Array< ::String > tmp;
+HXDLIN(1163)				if (::hx::IsNotNull( json )) {
+HXLINE(1163)					tmp = ( (::Array< ::String >)(json->__Field(HX_("features",fd,6c,d7,12),::hx::paccDynamic)) );
             				}
             				else {
-HXLINE( 756)					tmp = null();
+HXLINE(1163)					tmp = null();
             				}
-HXDLIN( 756)				if (::hx::IsNotNull( tmp )) {
-HXLINE( 756)					features = tmp;
+HXDLIN(1163)				if (::hx::IsNotNull( tmp )) {
+HXLINE(1163)					features = tmp;
             				}
             				else {
-HXLINE( 756)					features = ::Array_obj< ::String >::__new(0);
+HXLINE(1163)					features = ::Array_obj< ::String >::__new(0);
             				}
-HXLINE( 757)				if (features->contains(feature)) {
-HXLINE( 759)					::String row1 = ( (::String)(row->__Field(HX_("service_id",e5,24,3d,7d),::hx::paccDynamic)) );
-HXLINE( 760)					::String row2 = ( (::String)(row->__Field(HX_("name",4b,72,ff,48),::hx::paccDynamic)) );
-HXLINE( 761)					::String row3 = ( (::String)(row->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic)) );
-HXLINE( 758)					services->push( ::Dynamic(::hx::Anon_obj::Create(4)
+HXLINE(1164)				if (features->contains(feature)) {
+HXLINE(1166)					::String row1 = ( (::String)(row->__Field(HX_("service_id",e5,24,3d,7d),::hx::paccDynamic)) );
+HXLINE(1167)					::String row2 = ( (::String)(row->__Field(HX_("name",4b,72,ff,48),::hx::paccDynamic)) );
+HXLINE(1168)					::String row3 = ( (::String)(row->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic)) );
+HXLINE(1165)					services->push( ::Dynamic(::hx::Anon_obj::Create(4)
             						->setFixed(0,HX_("serviceId",70,93,d4,bc),row1)
             						->setFixed(1,HX_("caps",21,1c,ba,41),_gthis->hydrateCaps(json,null()))
             						->setFixed(2,HX_("name",4b,72,ff,48),row2)
             						->setFixed(3,HX_("node",02,0a,0a,49),row3)));
             				}
             			}
-HXLINE( 766)			return services;
+HXLINE(1173)			return services;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_747_findServicesWithFeature)
-HXDLIN( 747)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 749)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT service_id, name, node, json(caps.caps) AS caps FROM services INNER JOIN caps ON services.caps=caps.sha1 WHERE account_id=?",fc,fb,5f,40),::cpp::VirtualArray_obj::__new(1)->init(0,accountId)), ::Dynamic(new _hx_Closure_0(_gthis,feature)),null());
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1154_findServicesWithFeature)
+HXDLIN(1154)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1156)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->db->exec(HX_("SELECT service_id, name, node, json(caps.caps) AS caps FROM services INNER JOIN caps ON services.caps=caps.sha1 WHERE account_id=?",fc,fb,5f,40),::cpp::VirtualArray_obj::__new(1)->init(0,accountId)), ::Dynamic(new _hx_Closure_0(_gthis,feature)),null());
             	}
 
 
@@ -2251,71 +3320,71 @@ HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,findServicesWithFeature,return )
 ::Dynamic Sqlite_obj::hydrateReactions(::String accountId,::Array< ::Dynamic> messages){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0,::Array< ::Dynamic>,messages) HXARGC(1)
             		::Array< ::Dynamic> _hx_run( ::haxe::ds::StringMap result){
-            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_771_hydrateReactions)
-HXLINE( 772)			{
-HXLINE( 772)				::Dynamic map = result;
-HXDLIN( 772)				 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(map);
-HXDLIN( 772)				while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 772)					::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXDLIN( 772)					 ::haxe::ds::StringMap _g_value = ( ( ::haxe::ds::StringMap)(::haxe::IMap_obj::get(map,key)) );
-HXDLIN( 772)					{
-HXLINE( 773)						 ::borogove::ChatMessage result1 = null();
-HXDLIN( 773)						{
-HXLINE( 773)							int _g = 0;
-HXDLIN( 773)							while((_g < messages->length)){
-HXLINE( 773)								 ::borogove::ChatMessage v = messages->__get(_g).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 773)								_g = (_g + 1);
-HXLINE( 774)								bool m;
-HXDLIN( 774)								::String m1;
-HXDLIN( 774)								if (::hx::IsNull( v->serverId )) {
-HXLINE( 774)									m1 = v->localId;
+            			HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1178_hydrateReactions)
+HXLINE(1179)			{
+HXLINE(1179)				::Dynamic map = result;
+HXDLIN(1179)				 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(map);
+HXDLIN(1179)				while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(1179)					::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN(1179)					 ::haxe::ds::StringMap _g_value = ( ( ::haxe::ds::StringMap)(::haxe::IMap_obj::get(map,key)) );
+HXDLIN(1179)					{
+HXLINE(1180)						 ::borogove::ChatMessage result1 = null();
+HXDLIN(1180)						{
+HXLINE(1180)							int _g = 0;
+HXDLIN(1180)							while((_g < messages->length)){
+HXLINE(1180)								 ::borogove::ChatMessage v = messages->__get(_g).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN(1180)								_g = (_g + 1);
+HXLINE(1181)								bool m;
+HXDLIN(1181)								::String m1;
+HXDLIN(1181)								if (::hx::IsNull( v->serverId )) {
+HXLINE(1181)									m1 = v->localId;
             								}
             								else {
-HXLINE( 774)									m1 = ((v->serverId + HX_("\n",0a,00,00,00)) + v->serverIdBy);
+HXLINE(1181)									m1 = ((v->serverId + HX_("\n",0a,00,00,00)) + v->serverIdBy);
             								}
-HXDLIN( 774)								if ((((m1 + HX_("\n",0a,00,00,00)) + v->chatId()) != key)) {
-HXLINE( 775)									::String m2;
-HXDLIN( 775)									if (::hx::IsNull( v->localId )) {
-HXLINE( 775)										m2 = ((v->serverId + HX_("\n",0a,00,00,00)) + v->serverIdBy);
+HXDLIN(1181)								if ((((m1 + HX_("\n",0a,00,00,00)) + v->chatId()) != key)) {
+HXLINE(1182)									::String m2;
+HXDLIN(1182)									if (::hx::IsNull( v->localId )) {
+HXLINE(1182)										m2 = ((v->serverId + HX_("\n",0a,00,00,00)) + v->serverIdBy);
             									}
             									else {
-HXLINE( 775)										m2 = v->localId;
+HXLINE(1182)										m2 = v->localId;
             									}
-HXLINE( 774)									m = (((m2 + HX_("\n",0a,00,00,00)) + v->chatId()) == key);
+HXLINE(1181)									m = (((m2 + HX_("\n",0a,00,00,00)) + v->chatId()) == key);
             								}
             								else {
-HXLINE( 774)									m = true;
+HXLINE(1181)									m = true;
             								}
-HXLINE( 773)								if (m) {
-HXLINE(  71)									result1 = v;
-HXLINE( 773)									goto _hx_goto_147;
+HXLINE(1180)								if (m) {
+HXLINE(  96)									result1 = v;
+HXLINE(1180)									goto _hx_goto_214;
             								}
             							}
-            							_hx_goto_147:;
+            							_hx_goto_214:;
             						}
-HXDLIN( 773)						 ::borogove::ChatMessage m3 = result1;
-HXLINE( 777)						if (::hx::IsNotNull( m3 )) {
-HXLINE( 777)							m3->set_reactions(_g_value);
+HXDLIN(1180)						 ::borogove::ChatMessage m3 = result1;
+HXLINE(1184)						if (::hx::IsNotNull( m3 )) {
+HXLINE(1184)							m3->set_reactions(_g_value);
             						}
             					}
             				}
             			}
-HXLINE( 779)			return messages;
+HXLINE(1186)			return messages;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_771_hydrateReactions)
-HXDLIN( 771)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(messages->length);
-HXDLIN( 771)		{
-HXDLIN( 771)			int _g = 0;
-HXDLIN( 771)			int _g1 = messages->length;
-HXDLIN( 771)			while((_g < _g1)){
-HXDLIN( 771)				_g = (_g + 1);
-HXDLIN( 771)				int i = (_g - 1);
-HXDLIN( 771)				{
-HXDLIN( 771)					 ::borogove::ChatMessage m = ( ( ::borogove::ChatMessage)(_hx_array_unsafe_get(messages,i)) );
-HXDLIN( 771)					::String inValue = m->chatId();
-HXDLIN( 771)					result->__unsafe_set(i, ::Dynamic(::hx::Anon_obj::Create(4)
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1178_hydrateReactions)
+HXDLIN(1178)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(messages->length);
+HXDLIN(1178)		{
+HXDLIN(1178)			int _g = 0;
+HXDLIN(1178)			int _g1 = messages->length;
+HXDLIN(1178)			while((_g < _g1)){
+HXDLIN(1178)				_g = (_g + 1);
+HXDLIN(1178)				int i = (_g - 1);
+HXDLIN(1178)				{
+HXDLIN(1178)					 ::borogove::ChatMessage m = ( ( ::borogove::ChatMessage)(_hx_array_unsafe_get(messages,i)) );
+HXDLIN(1178)					::String inValue = m->chatId();
+HXDLIN(1178)					result->__unsafe_set(i, ::Dynamic(::hx::Anon_obj::Create(4)
             						->setFixed(0,HX_("chatId",d3,04,77,b7),inValue)
             						->setFixed(1,HX_("serverId",7e,01,b2,e2),m->serverId)
             						->setFixed(2,HX_("localId",26,7a,c6,2d),m->localId)
@@ -2323,7 +3392,7 @@ HXDLIN( 771)					result->__unsafe_set(i, ::Dynamic(::hx::Anon_obj::Create(4)
             				}
             			}
             		}
-HXDLIN( 771)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->fetchReactions(accountId,result), ::Dynamic(new _hx_Closure_0(messages)),null());
+HXDLIN(1178)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->fetchReactions(accountId,result), ::Dynamic(new _hx_Closure_0(messages)),null());
             	}
 
 
@@ -2332,170 +3401,170 @@ HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,hydrateReactions,return )
 ::Dynamic Sqlite_obj::fetchReactions(::String accountId,::Array< ::Dynamic> ids){
             		HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_0) HXARGC(1)
             		 ::haxe::ds::StringMap _hx_run( ::haxe::iterators::ArrayIterator rows){
-            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_799_fetchReactions)
-HXLINE( 800)			 ::haxe::ds::StringMap agg =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE( 801)			while((rows->current < rows->array->get_length())){
-HXLINE( 801)				 ::Dynamic row = rows->array->__get(rows->current++);
-HXLINE( 802)				::cpp::VirtualArray reactions = ( (::cpp::VirtualArray)( ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("reactions",aa,cc,95,e7),::hx::paccDynamic)) ))->doParse()) );
-HXLINE( 803)				::String mapId;
-HXDLIN( 803)				bool mapId1;
-HXDLIN( 803)				if (::hx::IsNotNull( row->__Field(HX_("mam_id",01,4d,19,b7),::hx::paccDynamic) )) {
-HXLINE( 803)					mapId1 = ::hx::IsEq( row->__Field(HX_("mam_id",01,4d,19,b7),::hx::paccDynamic),HX_("",00,00,00,00) );
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1206_fetchReactions)
+HXLINE(1207)			 ::haxe::ds::StringMap agg =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(1208)			while((rows->current < rows->array->get_length())){
+HXLINE(1208)				 ::Dynamic row = rows->array->__get(rows->current++);
+HXLINE(1209)				::cpp::VirtualArray reactions = ( (::cpp::VirtualArray)( ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("reactions",aa,cc,95,e7),::hx::paccDynamic)) ))->doParse()) );
+HXLINE(1210)				::String mapId;
+HXDLIN(1210)				bool mapId1;
+HXDLIN(1210)				if (::hx::IsNotNull( row->__Field(HX_("mam_id",01,4d,19,b7),::hx::paccDynamic) )) {
+HXLINE(1210)					mapId1 = ::hx::IsEq( row->__Field(HX_("mam_id",01,4d,19,b7),::hx::paccDynamic),HX_("",00,00,00,00) );
             				}
             				else {
-HXLINE( 803)					mapId1 = true;
+HXLINE(1210)					mapId1 = true;
             				}
-HXDLIN( 803)				if (mapId1) {
-HXLINE( 803)					mapId = ( (::String)(row->__Field(HX_("stanza_id",25,7b,7a,e9),::hx::paccDynamic)) );
+HXDLIN(1210)				if (mapId1) {
+HXLINE(1210)					mapId = ( (::String)(row->__Field(HX_("stanza_id",25,7b,7a,e9),::hx::paccDynamic)) );
             				}
             				else {
-HXLINE( 803)					mapId = ( (::String)(((row->__Field(HX_("mam_id",01,4d,19,b7),::hx::paccDynamic) + HX_("\n",0a,00,00,00)) + row->__Field(HX_("mam_by",fd,46,19,b7),::hx::paccDynamic))) );
+HXLINE(1210)					mapId = ( (::String)(((row->__Field(HX_("mam_id",01,4d,19,b7),::hx::paccDynamic) + HX_("\n",0a,00,00,00)) + row->__Field(HX_("mam_by",fd,46,19,b7),::hx::paccDynamic))) );
             				}
-HXDLIN( 803)				::String mapId2 = ( (::String)(((mapId + HX_("\n",0a,00,00,00)) + row->__Field(HX_("chat_id",22,ea,bd,d0),::hx::paccDynamic))) );
-HXLINE( 804)				if (!(agg->exists(mapId2))) {
-HXLINE( 804)					agg->set(mapId2, ::haxe::ds::StringMap_obj::__alloc( HX_CTX ));
+HXDLIN(1210)				::String mapId2 = ( (::String)(((mapId + HX_("\n",0a,00,00,00)) + row->__Field(HX_("chat_id",22,ea,bd,d0),::hx::paccDynamic))) );
+HXLINE(1211)				if (!(agg->exists(mapId2))) {
+HXLINE(1211)					agg->set(mapId2, ::haxe::ds::StringMap_obj::__alloc( HX_CTX ));
             				}
-HXLINE( 805)				 ::haxe::ds::StringMap map = ( ( ::haxe::ds::StringMap)(agg->get(mapId2)) );
-HXLINE( 806)				if (!(map->exists(( (::String)(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)) )))) {
-HXLINE( 806)					map->set(( (::String)(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)) ),::cpp::VirtualArray_obj::__new(0));
+HXLINE(1212)				 ::haxe::ds::StringMap map = ( ( ::haxe::ds::StringMap)(agg->get(mapId2)) );
+HXLINE(1213)				if (!(map->exists(( (::String)(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)) )))) {
+HXLINE(1213)					map->set(( (::String)(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)) ),::cpp::VirtualArray_obj::__new(0));
             				}
-HXLINE( 807)				if (::hx::IsEq( row->__Field(HX_("kind",54,e1,09,47),::hx::paccDynamic),1 )) {
-HXLINE( 808)					int _g = 0;
-HXDLIN( 808)					while((_g < reactions->get_length())){
-HXLINE( 808)						 ::Dynamic reaction = reactions->__get(_g);
-HXDLIN( 808)						_g = (_g + 1);
-HXDLIN( 808)						( (::cpp::VirtualArray)(map->get( ::Dynamic(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)))) )->push(reaction);
+HXLINE(1214)				if (::hx::IsEq( row->__Field(HX_("kind",54,e1,09,47),::hx::paccDynamic),1 )) {
+HXLINE(1215)					int _g = 0;
+HXDLIN(1215)					while((_g < reactions->get_length())){
+HXLINE(1215)						 ::Dynamic reaction = reactions->__get(_g);
+HXDLIN(1215)						_g = (_g + 1);
+HXDLIN(1215)						( (::cpp::VirtualArray)(map->get( ::Dynamic(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)))) )->push(reaction);
             					}
             				}
             				else {
-HXLINE( 809)					if (::hx::IsEq( row->__Field(HX_("kind",54,e1,09,47),::hx::paccDynamic),0 )) {
-HXLINE( 810)						::String k = ( (::String)(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)) );
-HXDLIN( 810)						::cpp::VirtualArray _this = ( (::cpp::VirtualArray)(map->get( ::Dynamic(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)))) );
-HXDLIN( 810)						::cpp::VirtualArray _g1 = ::cpp::VirtualArray_obj::__new(0);
-HXDLIN( 810)						{
-HXLINE( 810)							int _g2 = 0;
-HXDLIN( 810)							while((_g2 < _this->get_length())){
-HXLINE( 810)								 ::Dynamic v = _this->__get(_g2);
-HXDLIN( 810)								_g2 = (_g2 + 1);
-HXDLIN( 810)								if (::hx::IsNotNull( v->__Field(HX_("uri",6c,2b,59,00),::hx::paccDynamic) )) {
-HXLINE( 810)									_g1->push(v);
+HXLINE(1216)					if (::hx::IsEq( row->__Field(HX_("kind",54,e1,09,47),::hx::paccDynamic),0 )) {
+HXLINE(1217)						::String k = ( (::String)(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)) );
+HXDLIN(1217)						::cpp::VirtualArray _this = ( (::cpp::VirtualArray)(map->get( ::Dynamic(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)))) );
+HXDLIN(1217)						::cpp::VirtualArray _g1 = ::cpp::VirtualArray_obj::__new(0);
+HXDLIN(1217)						{
+HXLINE(1217)							int _g2 = 0;
+HXDLIN(1217)							while((_g2 < _this->get_length())){
+HXLINE(1217)								 ::Dynamic v = _this->__get(_g2);
+HXDLIN(1217)								_g2 = (_g2 + 1);
+HXDLIN(1217)								if (::hx::IsNotNull( v->__Field(HX_("uri",6c,2b,59,00),::hx::paccDynamic) )) {
+HXLINE(1217)									_g1->push(v);
             								}
             							}
             						}
-HXDLIN( 810)						::cpp::VirtualArray v1 = reactions->concat(_g1);
-HXDLIN( 810)						map->set(k,v1);
+HXDLIN(1217)						::cpp::VirtualArray v1 = reactions->concat(_g1);
+HXDLIN(1217)						map->set(k,v1);
             					}
             					else {
-HXLINE( 811)						if (::hx::IsEq( row->__Field(HX_("kind",54,e1,09,47),::hx::paccDynamic),2 )) {
-HXLINE( 812)							map->set(( (::String)(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)) ),reactions);
-            						}
-            					}
-            				}
-            			}
-HXLINE( 815)			 ::haxe::ds::StringMap result =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE( 816)			{
-HXLINE( 816)				::Dynamic map1 = agg;
-HXDLIN( 816)				 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(map1);
-HXDLIN( 816)				while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 816)					::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXDLIN( 816)					 ::haxe::ds::StringMap _g_value = ( ( ::haxe::ds::StringMap)(::haxe::IMap_obj::get(map1,key)) );
-HXDLIN( 816)					{
-HXLINE( 817)						 ::haxe::ds::StringMap map2 =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
-HXLINE( 818)						{
-HXLINE( 818)							 ::Dynamic reactionsBySender = _g_value->iterator();
-HXDLIN( 818)							while(( (bool)(reactionsBySender->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
-HXLINE( 818)								::cpp::VirtualArray reactionsBySender1 = ( (::cpp::VirtualArray)(reactionsBySender->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
-HXLINE( 819)								{
-HXLINE( 819)									int _g3 = 0;
-HXDLIN( 819)									while((_g3 < reactionsBySender1->get_length())){
-HXLINE( 819)										 ::Dynamic reactionD = reactionsBySender1->__get(_g3);
-HXDLIN( 819)										_g3 = (_g3 + 1);
-HXLINE( 820)										 ::borogove::Reaction reaction1;
-HXDLIN( 820)										if (::hx::IsNull( reactionD->__Field(HX_("uri",6c,2b,59,00),::hx::paccDynamic) )) {
-HXLINE( 820)											reaction1 =  ::borogove::Reaction_obj::__alloc( HX_CTX ,( (::String)(reactionD->__Field(HX_("senderId",f0,1e,0e,ec),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("timestamp",d6,d4,ce,a5),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("text",ad,cc,f9,4c),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("envelopeId",0b,03,af,a8),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic)) ));
+HXLINE(1218)						if (::hx::IsEq( row->__Field(HX_("kind",54,e1,09,47),::hx::paccDynamic),2 )) {
+HXLINE(1219)							map->set(( (::String)(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)) ),reactions);
+            						}
+            					}
+            				}
+            			}
+HXLINE(1222)			 ::haxe::ds::StringMap result =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(1223)			{
+HXLINE(1223)				::Dynamic map1 = agg;
+HXDLIN(1223)				 ::Dynamic _g_keys = ::haxe::IMap_obj::keys(map1);
+HXDLIN(1223)				while(( (bool)(_g_keys->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(1223)					::String key = ( (::String)(_g_keys->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXDLIN(1223)					 ::haxe::ds::StringMap _g_value = ( ( ::haxe::ds::StringMap)(::haxe::IMap_obj::get(map1,key)) );
+HXDLIN(1223)					{
+HXLINE(1224)						 ::haxe::ds::StringMap map2 =  ::haxe::ds::StringMap_obj::__alloc( HX_CTX );
+HXLINE(1225)						{
+HXLINE(1225)							 ::Dynamic reactionsBySender = _g_value->iterator();
+HXDLIN(1225)							while(( (bool)(reactionsBySender->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(1225)								::cpp::VirtualArray reactionsBySender1 = ( (::cpp::VirtualArray)(reactionsBySender->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)()) );
+HXLINE(1226)								{
+HXLINE(1226)									int _g3 = 0;
+HXDLIN(1226)									while((_g3 < reactionsBySender1->get_length())){
+HXLINE(1226)										 ::Dynamic reactionD = reactionsBySender1->__get(_g3);
+HXDLIN(1226)										_g3 = (_g3 + 1);
+HXLINE(1227)										 ::borogove::Reaction reaction1;
+HXDLIN(1227)										if (::hx::IsNull( reactionD->__Field(HX_("uri",6c,2b,59,00),::hx::paccDynamic) )) {
+HXLINE(1227)											reaction1 =  ::borogove::Reaction_obj::__alloc( HX_CTX ,( (::String)(reactionD->__Field(HX_("senderId",f0,1e,0e,ec),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("timestamp",d6,d4,ce,a5),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("text",ad,cc,f9,4c),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("envelopeId",0b,03,af,a8),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("key",9f,89,51,00),::hx::paccDynamic)) ));
             										}
             										else {
-HXLINE( 820)											reaction1 =  ::borogove::CustomEmojiReaction_obj::__alloc( HX_CTX ,( (::String)(reactionD->__Field(HX_("senderId",f0,1e,0e,ec),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("timestamp",d6,d4,ce,a5),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("text",ad,cc,f9,4c),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("uri",6c,2b,59,00),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("envelopeId",0b,03,af,a8),::hx::paccDynamic)) ));
+HXLINE(1227)											reaction1 =  ::borogove::CustomEmojiReaction_obj::__alloc( HX_CTX ,( (::String)(reactionD->__Field(HX_("senderId",f0,1e,0e,ec),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("timestamp",d6,d4,ce,a5),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("text",ad,cc,f9,4c),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("uri",6c,2b,59,00),::hx::paccDynamic)) ),( (::String)(reactionD->__Field(HX_("envelopeId",0b,03,af,a8),::hx::paccDynamic)) ));
             										}
-HXLINE( 826)										if (!(map2->exists(reaction1->key))) {
-HXLINE( 826)											map2->set(reaction1->key,::Array_obj< ::Dynamic>::__new(0));
+HXLINE(1233)										if (!(map2->exists(reaction1->key))) {
+HXLINE(1233)											map2->set(reaction1->key,::Array_obj< ::Dynamic>::__new(0));
             										}
-HXLINE( 827)										( (::Array< ::Dynamic>)(map2->get(reaction1->key)) )->push(reaction1);
+HXLINE(1234)										( (::Array< ::Dynamic>)(map2->get(reaction1->key)) )->push(reaction1);
             									}
             								}
             							}
             						}
-HXLINE( 830)						result->set(key,map2);
+HXLINE(1237)						result->set(key,map2);
             					}
             				}
             			}
-HXLINE( 832)			return result;
+HXLINE(1239)			return result;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_783_fetchReactions)
-HXLINE( 784)		 ::StringBuf q =  ::StringBuf_obj::__alloc( HX_CTX );
-HXLINE( 785)		{
-HXLINE( 785)			if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 785)				q->flush();
+            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1190_fetchReactions)
+HXLINE(1191)		 ::StringBuf q =  ::StringBuf_obj::__alloc( HX_CTX );
+HXLINE(1192)		{
+HXLINE(1192)			if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1192)				q->flush();
             			}
-HXDLIN( 785)			if (::hx::IsNull( q->b )) {
-HXLINE( 785)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_159,1);
+HXDLIN(1192)			if (::hx::IsNull( q->b )) {
+HXLINE(1192)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_226,1);
             			}
             			else {
-HXLINE( 785)				q->b->push(HX_("SELECT kind, chat_id, mam_id, mam_by, stanza_id, sender_id, json(reactions) AS reactions FROM reactions WHERE 1=0",d2,04,de,a3));
+HXLINE(1192)				q->b->push(HX_("SELECT kind, chat_id, mam_id, mam_by, stanza_id, sender_id, json(reactions) AS reactions FROM reactions WHERE 1=0",d2,04,de,a3));
             			}
             		}
-HXLINE( 786)		::Array< ::String > params = ::Array_obj< ::String >::__new(0);
-HXLINE( 787)		{
-HXLINE( 787)			int _g = 0;
-HXDLIN( 787)			while((_g < ids->length)){
-HXLINE( 787)				 ::Dynamic item = ids->__get(_g);
-HXDLIN( 787)				_g = (_g + 1);
-HXLINE( 788)				if (::hx::IsNotNull( item->__Field(HX_("serverId",7e,01,b2,e2),::hx::paccDynamic) )) {
-HXLINE( 789)					{
-HXLINE( 789)						if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 789)							q->flush();
+HXLINE(1193)		::Array< ::String > params = ::Array_obj< ::String >::__new(0);
+HXLINE(1194)		{
+HXLINE(1194)			int _g = 0;
+HXDLIN(1194)			while((_g < ids->length)){
+HXLINE(1194)				 ::Dynamic item = ids->__get(_g);
+HXDLIN(1194)				_g = (_g + 1);
+HXLINE(1195)				if (::hx::IsNotNull( item->__Field(HX_("serverId",7e,01,b2,e2),::hx::paccDynamic) )) {
+HXLINE(1196)					{
+HXLINE(1196)						if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1196)							q->flush();
             						}
-HXDLIN( 789)						if (::hx::IsNull( q->b )) {
-HXLINE( 789)							q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_160,1);
+HXDLIN(1196)						if (::hx::IsNull( q->b )) {
+HXLINE(1196)							q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_227,1);
             						}
             						else {
-HXLINE( 789)							q->b->push(HX_(" OR (mam_id=? AND mam_by=?)",0f,bb,c5,e5));
+HXLINE(1196)							q->b->push(HX_(" OR (mam_id=? AND mam_by=?)",0f,bb,c5,e5));
             						}
             					}
-HXLINE( 790)					params->push( ::Dynamic(item->__Field(HX_("serverId",7e,01,b2,e2),::hx::paccDynamic)));
-HXLINE( 791)					params->push( ::Dynamic(item->__Field(HX_("serverIdBy",f5,16,54,74),::hx::paccDynamic)));
+HXLINE(1197)					params->push( ::Dynamic(item->__Field(HX_("serverId",7e,01,b2,e2),::hx::paccDynamic)));
+HXLINE(1198)					params->push( ::Dynamic(item->__Field(HX_("serverIdBy",f5,16,54,74),::hx::paccDynamic)));
             				}
-HXLINE( 793)				if (::hx::IsNotNull( item->__Field(HX_("localId",26,7a,c6,2d),::hx::paccDynamic) )) {
-HXLINE( 794)					{
-HXLINE( 794)						if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 794)							q->flush();
+HXLINE(1200)				if (::hx::IsNotNull( item->__Field(HX_("localId",26,7a,c6,2d),::hx::paccDynamic) )) {
+HXLINE(1201)					{
+HXLINE(1201)						if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1201)							q->flush();
             						}
-HXDLIN( 794)						if (::hx::IsNull( q->b )) {
-HXLINE( 794)							q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_161,1);
+HXDLIN(1201)						if (::hx::IsNull( q->b )) {
+HXLINE(1201)							q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_228,1);
             						}
             						else {
-HXLINE( 794)							q->b->push(HX_(" OR stanza_id=?",6a,1d,f2,5b));
+HXLINE(1201)							q->b->push(HX_(" OR stanza_id=?",6a,1d,f2,5b));
             						}
             					}
-HXLINE( 795)					params->push( ::Dynamic(item->__Field(HX_("localId",26,7a,c6,2d),::hx::paccDynamic)));
+HXLINE(1202)					params->push( ::Dynamic(item->__Field(HX_("localId",26,7a,c6,2d),::hx::paccDynamic)));
             				}
             			}
             		}
-HXLINE( 798)		{
-HXLINE( 798)			if (::hx::IsNotNull( q->charBuf )) {
-HXLINE( 798)				q->flush();
+HXLINE(1205)		{
+HXLINE(1205)			if (::hx::IsNotNull( q->charBuf )) {
+HXLINE(1205)				q->flush();
             			}
-HXDLIN( 798)			if (::hx::IsNull( q->b )) {
-HXLINE( 798)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_162,1);
+HXDLIN(1205)			if (::hx::IsNull( q->b )) {
+HXLINE(1205)				q->b = ::Array_obj< ::String >::fromData( _hx_array_data_99390348_229,1);
             			}
             			else {
-HXLINE( 798)				q->b->push(HX_(" ORDER BY created_at, ROWID",00,65,8d,0e));
+HXLINE(1205)				q->b->push(HX_(" ORDER BY created_at, ROWID",00,65,8d,0e));
             			}
             		}
-HXLINE( 799)		 ::borogove::persistence::SqliteDriver _hx_tmp = this->db;
-HXDLIN( 799)		return ::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->exec(q->toString(),params), ::Dynamic(new _hx_Closure_0()),null());
+HXLINE(1206)		 ::borogove::persistence::SqliteDriver _hx_tmp = this->db;
+HXDLIN(1206)		return ::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp->exec(q->toString(),params), ::Dynamic(new _hx_Closure_0()),null());
             	}
 
 
@@ -2504,306 +3573,307 @@ HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,fetchReactions,return )
 ::Dynamic Sqlite_obj::hydrateReplyTo(::String accountId,::Array< ::Dynamic> messages,::Array< ::Dynamic> replyTos){
             		HX_BEGIN_LOCAL_FUNC_S3(::hx::LocalFunc,_hx_Closure_1,::Array< ::Dynamic>,messages, ::borogove::persistence::Sqlite,_gthis,::String,accountId) HXARGC(1)
             		::Array< ::Dynamic> _hx_run( ::haxe::iterators::ArrayIterator iter){
-            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_867_hydrateReplyTo)
-HXLINE( 868)			if (::hx::IsNotNull( iter )) {
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1274_hydrateReplyTo)
+HXLINE(1275)			if (::hx::IsNotNull( iter )) {
             				HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::haxe::iterators::ArrayIterator,iter) HXARGC(0)
             				 ::haxe::iterators::ArrayIterator _hx_run(){
-            					HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_869_hydrateReplyTo)
-HXLINE( 869)					return iter;
+            					HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1276_hydrateReplyTo)
+HXLINE(1276)					return iter;
             				}
             				HX_END_LOCAL_FUNC0(return)
 
-HXLINE( 869)				::Array< ::Dynamic> parents = ::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(1276)				::Array< ::Dynamic> parents = ::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("iterator",ee,49,9a,93), ::Dynamic(new _hx_Closure_0(iter)))));
-HXLINE( 870)				{
-HXLINE( 870)					int _g = 0;
-HXDLIN( 870)					while((_g < messages->length)){
-HXLINE( 870)						 ::borogove::ChatMessage message = messages->__get(_g).StaticCast<  ::borogove::ChatMessage >();
-HXDLIN( 870)						_g = (_g + 1);
-HXLINE( 871)						if (::hx::IsNotNull( message->replyToMessage )) {
-HXLINE( 872)							 ::Dynamic result = null();
-HXDLIN( 872)							{
-HXLINE( 872)								int _g1 = 0;
-HXDLIN( 872)								while((_g1 < parents->length)){
-HXLINE( 872)									 ::Dynamic v = parents->__get(_g1);
-HXDLIN( 872)									_g1 = (_g1 + 1);
-HXDLIN( 872)									bool found;
-HXDLIN( 872)									bool found1;
-HXDLIN( 872)									::String v1 = ( (::String)(v->__Field(HX_("chat_id",22,ea,bd,d0),::hx::paccDynamic)) );
-HXDLIN( 872)									if ((v1 == message->chatId())) {
-HXLINE( 872)										if (::hx::IsNotNull( message->replyToMessage->serverId )) {
-HXLINE( 872)											found1 = ::hx::IsEq( v->__Field(HX_("mam_id",01,4d,19,b7),::hx::paccDynamic),message->replyToMessage->serverId );
+HXLINE(1277)				{
+HXLINE(1277)					int _g = 0;
+HXDLIN(1277)					while((_g < messages->length)){
+HXLINE(1277)						 ::borogove::ChatMessage message = messages->__get(_g).StaticCast<  ::borogove::ChatMessage >();
+HXDLIN(1277)						_g = (_g + 1);
+HXLINE(1278)						if (::hx::IsNotNull( message->replyToMessage )) {
+HXLINE(1279)							 ::Dynamic result = null();
+HXDLIN(1279)							{
+HXLINE(1279)								int _g1 = 0;
+HXDLIN(1279)								while((_g1 < parents->length)){
+HXLINE(1279)									 ::Dynamic v = parents->__get(_g1);
+HXDLIN(1279)									_g1 = (_g1 + 1);
+HXDLIN(1279)									bool found;
+HXDLIN(1279)									bool found1;
+HXDLIN(1279)									::String v1 = ( (::String)(v->__Field(HX_("chat_id",22,ea,bd,d0),::hx::paccDynamic)) );
+HXDLIN(1279)									if ((v1 == message->chatId())) {
+HXLINE(1279)										if (::hx::IsNotNull( message->replyToMessage->serverId )) {
+HXLINE(1279)											found1 = ::hx::IsEq( v->__Field(HX_("mam_id",01,4d,19,b7),::hx::paccDynamic),message->replyToMessage->serverId );
             										}
             										else {
-HXLINE( 872)											found1 = true;
+HXLINE(1279)											found1 = true;
             										}
             									}
             									else {
-HXLINE( 872)										found1 = false;
+HXLINE(1279)										found1 = false;
             									}
-HXDLIN( 872)									if (found1) {
-HXLINE( 872)										if (::hx::IsNotNull( message->replyToMessage->localId )) {
-HXLINE( 872)											found = ::hx::IsEq( v->__Field(HX_("stanza_id",25,7b,7a,e9),::hx::paccDynamic),message->replyToMessage->localId );
+HXDLIN(1279)									if (found1) {
+HXLINE(1279)										if (::hx::IsNotNull( message->replyToMessage->localId )) {
+HXLINE(1279)											found = ::hx::IsEq( v->__Field(HX_("stanza_id",25,7b,7a,e9),::hx::paccDynamic),message->replyToMessage->localId );
             										}
             										else {
-HXLINE( 872)											found = true;
+HXLINE(1279)											found = true;
             										}
             									}
             									else {
-HXLINE( 872)										found = false;
+HXLINE(1279)										found = false;
             									}
-HXDLIN( 872)									if (found) {
-HXLINE( 872)										result = v;
-HXDLIN( 872)										goto _hx_goto_165;
+HXDLIN(1279)									if (found) {
+HXLINE(1279)										result = v;
+HXDLIN(1279)										goto _hx_goto_232;
             									}
             								}
-            								_hx_goto_165:;
+            								_hx_goto_232:;
             							}
-HXDLIN( 872)							 ::Dynamic found2 = result;
-HXLINE( 873)							if (::hx::IsNotNull( found2 )) {
-HXLINE( 873)								message->set_replyToMessage(_gthis->hydrateMessages(accountId, ::haxe::iterators::ArrayIterator_obj::__alloc( HX_CTX ,::cpp::VirtualArray_obj::__new(1)->init(0,found2)))->__get(0).StaticCast<  ::borogove::ChatMessage >());
+HXDLIN(1279)							 ::Dynamic found2 = result;
+HXLINE(1280)							if (::hx::IsNotNull( found2 )) {
+HXLINE(1280)								message->set_replyToMessage(_gthis->hydrateMessages(accountId, ::haxe::iterators::ArrayIterator_obj::__alloc( HX_CTX ,::cpp::VirtualArray_obj::__new(1)->init(0,found2)))->__get(0).StaticCast<  ::borogove::ChatMessage >());
             							}
             						}
             					}
             				}
             			}
-HXLINE( 877)			return messages;
+HXLINE(1284)			return messages;
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_836_hydrateReplyTo)
-HXDLIN( 836)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 837)		::Dynamic _hx_tmp;
-HXDLIN( 837)		if ((replyTos->length < 1)) {
-HXLINE( 837)			_hx_tmp = ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1243_hydrateReplyTo)
+HXDLIN(1243)		 ::borogove::persistence::Sqlite _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(1244)		::Dynamic _hx_tmp;
+HXDLIN(1244)		if ((replyTos->length < 1)) {
+HXLINE(1244)			_hx_tmp = ::thenshim::_Promise::Promise_Impl__obj::resolve(null());
             		}
             		else {
-HXLINE( 840)			::Array< ::String > mamIds = ::Array_obj< ::String >::__new(0);
-HXLINE( 841)			::Array< ::String > mamIdsS = ::Array_obj< ::String >::__new(0);
-HXLINE( 842)			::Array< ::String > stanzaIds = ::Array_obj< ::String >::__new(0);
-HXLINE( 843)			::Array< ::String > stanzaIdsS = ::Array_obj< ::String >::__new(0);
-HXLINE( 844)			::Array< ::String > params = ::Array_obj< ::String >::__new(1)->init(0,accountId);
-HXLINE( 846)			{
-HXLINE( 846)				int _g = 0;
-HXDLIN( 846)				while((_g < replyTos->length)){
-HXLINE( 846)					 ::Dynamic parent = replyTos->__get(_g);
-HXDLIN( 846)					_g = (_g + 1);
-HXLINE( 847)					if (::hx::IsNotNull( parent->__Field(HX_("serverId",7e,01,b2,e2),::hx::paccDynamic) )) {
-HXLINE( 848)						mamIds->push( ::Dynamic(parent->__Field(HX_("chatId",d3,04,77,b7),::hx::paccDynamic)));
-HXLINE( 849)						mamIds->push( ::Dynamic(parent->__Field(HX_("serverId",7e,01,b2,e2),::hx::paccDynamic)));
-HXLINE( 850)						mamIdsS->push(HX_("(?,?)",7f,3f,cd,31));
+HXLINE(1247)			::Array< ::String > mamIds = ::Array_obj< ::String >::__new(0);
+HXLINE(1248)			::Array< ::String > mamIdsS = ::Array_obj< ::String >::__new(0);
+HXLINE(1249)			::Array< ::String > stanzaIds = ::Array_obj< ::String >::__new(0);
+HXLINE(1250)			::Array< ::String > stanzaIdsS = ::Array_obj< ::String >::__new(0);
+HXLINE(1251)			::Array< ::String > params = ::Array_obj< ::String >::__new(1)->init(0,accountId);
+HXLINE(1253)			{
+HXLINE(1253)				int _g = 0;
+HXDLIN(1253)				while((_g < replyTos->length)){
+HXLINE(1253)					 ::Dynamic parent = replyTos->__get(_g);
+HXDLIN(1253)					_g = (_g + 1);
+HXLINE(1254)					if (::hx::IsNotNull( parent->__Field(HX_("serverId",7e,01,b2,e2),::hx::paccDynamic) )) {
+HXLINE(1255)						mamIds->push( ::Dynamic(parent->__Field(HX_("chatId",d3,04,77,b7),::hx::paccDynamic)));
+HXLINE(1256)						mamIds->push( ::Dynamic(parent->__Field(HX_("serverId",7e,01,b2,e2),::hx::paccDynamic)));
+HXLINE(1257)						mamIdsS->push(HX_("(?,?)",7f,3f,cd,31));
             					}
             					else {
-HXLINE( 852)						stanzaIds->push( ::Dynamic(parent->__Field(HX_("chatId",d3,04,77,b7),::hx::paccDynamic)));
-HXLINE( 853)						stanzaIds->push( ::Dynamic(parent->__Field(HX_("localId",26,7a,c6,2d),::hx::paccDynamic)));
-HXLINE( 854)						stanzaIdsS->push(HX_("(?,?)",7f,3f,cd,31));
+HXLINE(1259)						stanzaIds->push( ::Dynamic(parent->__Field(HX_("chatId",d3,04,77,b7),::hx::paccDynamic)));
+HXLINE(1260)						stanzaIds->push( ::Dynamic(parent->__Field(HX_("localId",26,7a,c6,2d),::hx::paccDynamic)));
+HXLINE(1261)						stanzaIdsS->push(HX_("(?,?)",7f,3f,cd,31));
             					}
             				}
             			}
-HXLINE( 857)			::Array< ::String > q = ::Array_obj< ::String >::__new(0);
-HXLINE( 858)			if ((mamIds->length > 0)) {
-HXLINE( 859)				q->push((((HX_("SELECT chat_id, stanza_id, stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sync_point FROM messages WHERE account_id=?",77,29,5c,6f) + HX_(" AND (chat_id, mam_id) IN (",9c,23,d1,7d)) + mamIdsS->join(HX_(",",2c,00,00,00))) + HX_(")",29,00,00,00)));
-HXLINE( 860)				params = params->concat(mamIds);
+HXLINE(1264)			::Array< ::String > q = ::Array_obj< ::String >::__new(0);
+HXLINE(1265)			if ((mamIds->length > 0)) {
+HXLINE(1266)				q->push((((HX_("SELECT chat_id, stanza_id, stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sort_id, sync_point FROM messages WHERE account_id=?",4d,a5,ce,57) + HX_(" AND (chat_id, mam_id) IN (",9c,23,d1,7d)) + mamIdsS->join(HX_(",",2c,00,00,00))) + HX_(")",29,00,00,00)));
+HXLINE(1267)				params = params->concat(mamIds);
             			}
-HXLINE( 862)			if ((stanzaIds->length > 0)) {
-HXLINE( 863)				q->push((((HX_("SELECT chat_id, stanza_id, stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sync_point FROM messages WHERE account_id=?",77,29,5c,6f) + HX_(" AND (chat_id, stanza_id) IN (",72,6a,27,14)) + stanzaIdsS->join(HX_(",",2c,00,00,00))) + HX_(")",29,00,00,00)));
-HXLINE( 864)				params = params->concat(stanzaIds);
+HXLINE(1269)			if ((stanzaIds->length > 0)) {
+HXLINE(1270)				q->push((((HX_("SELECT chat_id, stanza_id, stanza, direction, type, status, status_text, strftime('%FT%H:%M:%fZ', created_at / 1000.0, 'unixepoch') AS timestamp, sender_id, mam_id, mam_by, sort_id, sync_point FROM messages WHERE account_id=?",4d,a5,ce,57) + HX_(" AND (chat_id, stanza_id) IN (",72,6a,27,14)) + stanzaIdsS->join(HX_(",",2c,00,00,00))) + HX_(")",29,00,00,00)));
+HXLINE(1271)				params = params->concat(stanzaIds);
             			}
-HXLINE( 866)			 ::borogove::persistence::SqliteDriver _hx_tmp1 = this->db;
-HXLINE( 837)			_hx_tmp = _hx_tmp1->exec(q->join(HX_(" UNION ALL ",f0,e4,70,26)),params);
+HXLINE(1273)			 ::borogove::persistence::SqliteDriver _hx_tmp1 = this->db;
+HXLINE(1244)			_hx_tmp = _hx_tmp1->exec(q->join(HX_(" UNION ALL ",f0,e4,70,26)),params);
             		}
-HXDLIN( 837)		return ::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp, ::Dynamic(new _hx_Closure_1(messages,_gthis,accountId)),null());
+HXDLIN(1244)		return ::thenshim::_Promise::Promise_Impl__obj::then(_hx_tmp, ::Dynamic(new _hx_Closure_1(messages,_gthis,accountId)),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC3(Sqlite_obj,hydrateReplyTo,return )
 
 ::Array< ::Dynamic> Sqlite_obj::hydrateMessages(::String accountId, ::Dynamic rows){
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_881_hydrateMessages)
-HXLINE( 883)		 ::borogove::JID accountJid = ::borogove::JID_obj::parse(accountId);
-HXLINE( 884)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
-HXDLIN( 884)		{
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1288_hydrateMessages)
+HXLINE(1290)		 ::borogove::JID accountJid = ::borogove::JID_obj::parse(accountId);
+HXLINE(1291)		::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN(1291)		{
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,rows) HXARGC(0)
             			 ::Dynamic _hx_run(){
-            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_884_hydrateMessages)
-HXLINE( 884)				return rows;
+            				HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1291_hydrateMessages)
+HXLINE(1291)				return rows;
             			}
             			HX_END_LOCAL_FUNC0(return)
 
-HXLINE( 884)			 ::Dynamic x =  ::Dynamic(new _hx_Closure_0(rows))();
-HXDLIN( 884)			while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
+HXLINE(1291)			 ::Dynamic x =  ::Dynamic(new _hx_Closure_0(rows))();
+HXDLIN(1291)			while(( (bool)(x->__Field(HX_("hasNext",6d,a5,46,18),::hx::paccDynamic)()) )){
             				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_3, ::borogove::JID,accountJid, ::Dynamic,row) HXARGC(2)
             				 ::borogove::ChatMessageBuilder _hx_run( ::borogove::ChatMessageBuilder builder, ::borogove::Stanza _){
-            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_884_hydrateMessages)
-HXLINE( 885)					builder->syncPoint = ::hx::IsNotEq( row->__Field(HX_("sync_point",2c,6c,7f,80),::hx::paccDynamic),0 );
-HXLINE( 886)					builder->timestamp = ( (::String)(row->__Field(HX_("timestamp",d6,d4,ce,a5),::hx::paccDynamic)) );
-HXLINE( 887)					builder->type = ( (int)(row->__Field(HX_("type",ba,f2,08,4d),::hx::paccDynamic)) );
-HXLINE( 888)					builder->status = ( (int)(row->__Field(HX_("status",32,e7,fb,05),::hx::paccDynamic)) );
-HXLINE( 889)					builder->statusText = ( (::String)(row->__Field(HX_("status_text",1a,ac,61,da),::hx::paccDynamic)) );
-HXLINE( 890)					builder->senderId = ( (::String)(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)) );
-HXLINE( 891)					::String _hx_tmp;
-HXDLIN( 891)					if (::hx::IsEq( row->__Field(HX_("mam_id",01,4d,19,b7),::hx::paccDynamic),HX_("",00,00,00,00) )) {
-HXLINE( 891)						_hx_tmp = null();
+            					HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1291_hydrateMessages)
+HXLINE(1292)					builder->syncPoint = ::hx::IsNotEq( row->__Field(HX_("sync_point",2c,6c,7f,80),::hx::paccDynamic),0 );
+HXLINE(1293)					builder->timestamp = ( (::String)(row->__Field(HX_("timestamp",d6,d4,ce,a5),::hx::paccDynamic)) );
+HXLINE(1294)					builder->type = ( (int)(row->__Field(HX_("type",ba,f2,08,4d),::hx::paccDynamic)) );
+HXLINE(1295)					builder->status = ( (int)(row->__Field(HX_("status",32,e7,fb,05),::hx::paccDynamic)) );
+HXLINE(1296)					builder->statusText = ( (::String)(row->__Field(HX_("status_text",1a,ac,61,da),::hx::paccDynamic)) );
+HXLINE(1297)					builder->senderId = ( (::String)(row->__Field(HX_("sender_id",65,a9,5d,a0),::hx::paccDynamic)) );
+HXLINE(1298)					::String _hx_tmp;
+HXDLIN(1298)					if (::hx::IsEq( row->__Field(HX_("mam_id",01,4d,19,b7),::hx::paccDynamic),HX_("",00,00,00,00) )) {
+HXLINE(1298)						_hx_tmp = null();
             					}
             					else {
-HXLINE( 891)						_hx_tmp = ( (::String)(row->__Field(HX_("mam_id",01,4d,19,b7),::hx::paccDynamic)) );
+HXLINE(1298)						_hx_tmp = ( (::String)(row->__Field(HX_("mam_id",01,4d,19,b7),::hx::paccDynamic)) );
             					}
-HXDLIN( 891)					builder->serverId = _hx_tmp;
-HXLINE( 892)					::String _hx_tmp1;
-HXDLIN( 892)					if (::hx::IsEq( row->__Field(HX_("mam_by",fd,46,19,b7),::hx::paccDynamic),HX_("",00,00,00,00) )) {
-HXLINE( 892)						_hx_tmp1 = null();
+HXDLIN(1298)					builder->serverId = _hx_tmp;
+HXLINE(1299)					::String _hx_tmp1;
+HXDLIN(1299)					if (::hx::IsEq( row->__Field(HX_("mam_by",fd,46,19,b7),::hx::paccDynamic),HX_("",00,00,00,00) )) {
+HXLINE(1299)						_hx_tmp1 = null();
             					}
             					else {
-HXLINE( 892)						_hx_tmp1 = ( (::String)(row->__Field(HX_("mam_by",fd,46,19,b7),::hx::paccDynamic)) );
+HXLINE(1299)						_hx_tmp1 = ( (::String)(row->__Field(HX_("mam_by",fd,46,19,b7),::hx::paccDynamic)) );
             					}
-HXDLIN( 892)					builder->serverIdBy = _hx_tmp1;
-HXLINE( 893)					if (::hx::IsNotEq( builder->direction,row->__Field(HX_("direction",3f,62,40,10),::hx::paccDynamic) )) {
-HXLINE( 894)						builder->direction = ( (int)(row->__Field(HX_("direction",3f,62,40,10),::hx::paccDynamic)) );
-HXLINE( 895)						::Array< ::Dynamic> replyTo = builder->replyTo;
-HXLINE( 896)						builder->replyTo = builder->recipients;
-HXLINE( 897)						builder->recipients = replyTo;
+HXDLIN(1299)					builder->serverIdBy = _hx_tmp1;
+HXLINE(1300)					builder->sortId = ( (::String)(row->__Field(HX_("sort_id",5c,b9,64,00),::hx::paccDynamic)) );
+HXLINE(1301)					if (::hx::IsNotEq( builder->direction,row->__Field(HX_("direction",3f,62,40,10),::hx::paccDynamic) )) {
+HXLINE(1302)						builder->direction = ( (int)(row->__Field(HX_("direction",3f,62,40,10),::hx::paccDynamic)) );
+HXLINE(1303)						::Array< ::Dynamic> replyTo = builder->replyTo;
+HXLINE(1304)						builder->replyTo = builder->recipients;
+HXLINE(1305)						builder->recipients = replyTo;
             					}
-HXLINE( 899)					bool _hx_tmp2;
-HXDLIN( 899)					if (::hx::IsNotNull( row->__Field(HX_("stanza_id",25,7b,7a,e9),::hx::paccDynamic) )) {
-HXLINE( 899)						_hx_tmp2 = ::hx::IsNotEq( row->__Field(HX_("stanza_id",25,7b,7a,e9),::hx::paccDynamic),HX_("",00,00,00,00) );
+HXLINE(1307)					bool _hx_tmp2;
+HXDLIN(1307)					if (::hx::IsNotNull( row->__Field(HX_("stanza_id",25,7b,7a,e9),::hx::paccDynamic) )) {
+HXLINE(1307)						_hx_tmp2 = ::hx::IsNotEq( row->__Field(HX_("stanza_id",25,7b,7a,e9),::hx::paccDynamic),HX_("",00,00,00,00) );
             					}
             					else {
-HXLINE( 899)						_hx_tmp2 = false;
+HXLINE(1307)						_hx_tmp2 = false;
             					}
-HXDLIN( 899)					if (_hx_tmp2) {
-HXLINE( 899)						builder->localId = ( (::String)(row->__Field(HX_("stanza_id",25,7b,7a,e9),::hx::paccDynamic)) );
+HXDLIN(1307)					if (_hx_tmp2) {
+HXLINE(1307)						builder->localId = ( (::String)(row->__Field(HX_("stanza_id",25,7b,7a,e9),::hx::paccDynamic)) );
             					}
-HXLINE( 900)					if (::hx::IsNotNull( row->__Field(HX_("versions",5b,4e,b8,d6),::hx::paccDynamic) )) {
-HXLINE( 901)						 ::Dynamic versionTimes =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("version_times",1f,50,f9,17),::hx::paccDynamic)) ))->doParse();
-HXLINE( 902)						 ::Dynamic versions =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("versions",5b,4e,b8,d6),::hx::paccDynamic)) ))->doParse();
-HXLINE( 903)						if ((::Reflect_obj::fields(versions)->length > 1)) {
+HXLINE(1308)					if (::hx::IsNotNull( row->__Field(HX_("versions",5b,4e,b8,d6),::hx::paccDynamic) )) {
+HXLINE(1309)						 ::Dynamic versionTimes =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("version_times",1f,50,f9,17),::hx::paccDynamic)) ))->doParse();
+HXLINE(1310)						 ::Dynamic versions =  ::haxe::format::JsonParser_obj::__alloc( HX_CTX ,( (::String)(row->__Field(HX_("versions",5b,4e,b8,d6),::hx::paccDynamic)) ))->doParse();
+HXLINE(1311)						if ((::Reflect_obj::fields(versions)->length > 1)) {
             							HX_BEGIN_LOCAL_FUNC_S0(::hx::LocalFunc,_hx_Closure_2) HXARGC(2)
             							int _hx_run( ::borogove::ChatMessage a, ::borogove::ChatMessage b){
-            								HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_915_hydrateMessages)
-HXLINE( 915)								return ::Reflect_obj::compare(b->timestamp,a->timestamp);
+            								HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1323_hydrateMessages)
+HXLINE(1323)								return ::Reflect_obj::compare(b->timestamp,a->timestamp);
             							}
             							HX_END_LOCAL_FUNC2(return)
 
-HXLINE( 904)							{
-HXLINE( 904)								::Array< ::String > _g_keys = ::Reflect_obj::fields(versions);
-HXDLIN( 904)								int _g_index = 0;
-HXDLIN( 904)								while((_g_index < _g_keys->length)){
-HXLINE( 904)									_g_index = (_g_index + 1);
-HXDLIN( 904)									::String key = _g_keys->__get((_g_index - 1));
-HXDLIN( 904)									::String versionId = key;
-HXDLIN( 904)									{
+HXLINE(1312)							{
+HXLINE(1312)								::Array< ::String > _g_keys = ::Reflect_obj::fields(versions);
+HXDLIN(1312)								int _g_index = 0;
+HXDLIN(1312)								while((_g_index < _g_keys->length)){
+HXLINE(1312)									_g_index = (_g_index + 1);
+HXDLIN(1312)									::String key = _g_keys->__get((_g_index - 1));
+HXDLIN(1312)									::String versionId = key;
+HXDLIN(1312)									{
             										HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_1, ::Dynamic,versionTimes,::String,versionId) HXARGC(2)
             										 ::borogove::ChatMessageBuilder _hx_run( ::borogove::ChatMessageBuilder toPushB, ::borogove::Stanza _){
-            											HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_905_hydrateMessages)
-HXLINE( 906)											bool versionM;
-HXDLIN( 906)											if (::hx::IsNull( toPushB->serverId )) {
-HXLINE( 906)												versionM = (versionId != toPushB->localId);
+            											HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1313_hydrateMessages)
+HXLINE(1314)											bool versionM;
+HXDLIN(1314)											if (::hx::IsNull( toPushB->serverId )) {
+HXLINE(1314)												versionM = (versionId != toPushB->localId);
             											}
             											else {
-HXLINE( 906)												versionM = false;
+HXLINE(1314)												versionM = false;
             											}
-HXDLIN( 906)											if (versionM) {
-HXLINE( 906)												toPushB->serverId = versionId;
+HXDLIN(1314)											if (versionM) {
+HXLINE(1314)												toPushB->serverId = versionId;
             											}
-HXLINE( 907)											toPushB->timestamp = ( (::String)(::Reflect_obj::field(versionTimes,versionId)) );
-HXLINE( 908)											return toPushB;
+HXLINE(1315)											toPushB->timestamp = ( (::String)(::Reflect_obj::field(versionTimes,versionId)) );
+HXLINE(1316)											return toPushB;
             										}
             										HX_END_LOCAL_FUNC2(return)
 
-HXLINE( 905)										 ::borogove::Stanza versionM = ::borogove::Stanza_obj::parse(( (::String)(::Reflect_obj::field(versions,key)) ));
-HXDLIN( 905)										 ::borogove::ChatMessage versionM1 = ::borogove::ChatMessage_obj::fromStanza(versionM,accountJid, ::Dynamic(new _hx_Closure_1(versionTimes,versionId)));
-HXLINE( 910)										 ::borogove::ChatMessage toPush;
-HXDLIN( 910)										bool toPush1;
-HXDLIN( 910)										if (::hx::IsNotNull( versionM1 )) {
-HXLINE( 910)											toPush1 = (versionM1->versions->length < 1);
+HXLINE(1313)										 ::borogove::Stanza versionM = ::borogove::Stanza_obj::parse(( (::String)(::Reflect_obj::field(versions,key)) ));
+HXDLIN(1313)										 ::borogove::ChatMessage versionM1 = ::borogove::ChatMessage_obj::fromStanza(versionM,accountJid, ::Dynamic(new _hx_Closure_1(versionTimes,versionId)));
+HXLINE(1318)										 ::borogove::ChatMessage toPush;
+HXDLIN(1318)										bool toPush1;
+HXDLIN(1318)										if (::hx::IsNotNull( versionM1 )) {
+HXLINE(1318)											toPush1 = (versionM1->versions->length < 1);
             										}
             										else {
-HXLINE( 910)											toPush1 = true;
+HXLINE(1318)											toPush1 = true;
             										}
-HXDLIN( 910)										if (toPush1) {
-HXLINE( 910)											toPush = versionM1;
+HXDLIN(1318)										if (toPush1) {
+HXLINE(1318)											toPush = versionM1;
             										}
             										else {
-HXLINE( 910)											toPush = versionM1->versions->__get(0).StaticCast<  ::borogove::ChatMessage >();
+HXLINE(1318)											toPush = versionM1->versions->__get(0).StaticCast<  ::borogove::ChatMessage >();
             										}
-HXLINE( 911)										if (::hx::IsNotNull( toPush )) {
-HXLINE( 912)											builder->versions->push(toPush);
+HXLINE(1319)										if (::hx::IsNotNull( toPush )) {
+HXLINE(1320)											builder->versions->push(toPush);
             										}
             									}
             								}
             							}
-HXLINE( 915)							builder->versions->sort( ::Dynamic(new _hx_Closure_2()));
+HXLINE(1323)							builder->versions->sort( ::Dynamic(new _hx_Closure_2()));
             						}
             					}
-HXLINE( 918)					return builder;
+HXLINE(1326)					return builder;
             				}
             				HX_END_LOCAL_FUNC2(return)
 
-HXLINE( 884)				 ::Dynamic row = x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
-HXDLIN( 884)				 ::borogove::Stanza _hx_tmp = ::borogove::Stanza_obj::parse(( (::String)(row->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic)) ));
-HXDLIN( 884)				_g->push(::borogove::ChatMessage_obj::fromStanza(_hx_tmp,accountJid, ::Dynamic(new _hx_Closure_3(accountJid,row))));
+HXLINE(1291)				 ::Dynamic row = x->__Field(HX_("next",f3,84,02,49),::hx::paccDynamic)();
+HXDLIN(1291)				 ::borogove::Stanza _hx_tmp = ::borogove::Stanza_obj::parse(( (::String)(row->__Field(HX_("stanza",f5,5d,f7,05),::hx::paccDynamic)) ));
+HXDLIN(1291)				_g->push(::borogove::ChatMessage_obj::fromStanza(_hx_tmp,accountJid, ::Dynamic(new _hx_Closure_3(accountJid,row))));
             			}
             		}
-HXDLIN( 884)		return _g;
+HXDLIN(1291)		return _g;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,hydrateMessages,return )
 
  ::borogove::Caps Sqlite_obj::hydrateCaps( ::Dynamic o,::Array< unsigned char > ver){
-            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_923_hydrateCaps)
-HXLINE( 924)		::String o1 = ( (::String)(o->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic)) );
-HXLINE( 925)		::Array< ::Dynamic> _this;
-HXDLIN( 925)		::Array< ::Dynamic> tmp = ( (::Array< ::Dynamic>)(o->__Field(HX_("identities",1c,c5,6d,d7),::hx::paccDynamic)) );
-HXDLIN( 925)		if (::hx::IsNotNull( tmp )) {
-HXLINE( 925)			_this = tmp;
+            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_1331_hydrateCaps)
+HXLINE(1332)		::String o1 = ( (::String)(o->__Field(HX_("node",02,0a,0a,49),::hx::paccDynamic)) );
+HXLINE(1333)		::Array< ::Dynamic> _this;
+HXDLIN(1333)		::Array< ::Dynamic> tmp = ( (::Array< ::Dynamic>)(o->__Field(HX_("identities",1c,c5,6d,d7),::hx::paccDynamic)) );
+HXDLIN(1333)		if (::hx::IsNotNull( tmp )) {
+HXLINE(1333)			_this = tmp;
             		}
             		else {
-HXLINE( 925)			_this = ::Array_obj< ::Dynamic>::__new(0);
+HXLINE(1333)			_this = ::Array_obj< ::Dynamic>::__new(0);
             		}
-HXDLIN( 925)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_this->length);
-HXDLIN( 925)		{
-HXLINE( 925)			int _g = 0;
-HXDLIN( 925)			int _g1 = _this->length;
-HXDLIN( 925)			while((_g < _g1)){
-HXLINE( 925)				_g = (_g + 1);
-HXDLIN( 925)				int i = (_g - 1);
-HXDLIN( 925)				{
-HXLINE( 925)					 ::Dynamic i1 = _hx_array_unsafe_get(_this,i);
-HXDLIN( 925)					result->__unsafe_set(i, ::borogove::Identity_obj::__alloc( HX_CTX ,( (::String)(i1->__Field(HX_("category",fe,2a,6c,ad),::hx::paccDynamic)) ),( (::String)(i1->__Field(HX_("type",ba,f2,08,4d),::hx::paccDynamic)) ),( (::String)(i1->__Field(HX_("name",4b,72,ff,48),::hx::paccDynamic)) ),null()));
+HXDLIN(1333)		::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(_this->length);
+HXDLIN(1333)		{
+HXLINE(1333)			int _g = 0;
+HXDLIN(1333)			int _g1 = _this->length;
+HXDLIN(1333)			while((_g < _g1)){
+HXLINE(1333)				_g = (_g + 1);
+HXDLIN(1333)				int i = (_g - 1);
+HXDLIN(1333)				{
+HXLINE(1333)					 ::Dynamic i1 = _hx_array_unsafe_get(_this,i);
+HXDLIN(1333)					result->__unsafe_set(i, ::borogove::Identity_obj::__alloc( HX_CTX ,( (::String)(i1->__Field(HX_("category",fe,2a,6c,ad),::hx::paccDynamic)) ),( (::String)(i1->__Field(HX_("type",ba,f2,08,4d),::hx::paccDynamic)) ),( (::String)(i1->__Field(HX_("name",4b,72,ff,48),::hx::paccDynamic)) ),null()));
             				}
             			}
             		}
-HXLINE( 926)		::Array< ::String > _hx_tmp;
-HXDLIN( 926)		::Array< ::String > tmp1 = ( (::Array< ::String >)(o->__Field(HX_("features",fd,6c,d7,12),::hx::paccDynamic)) );
-HXDLIN( 926)		if (::hx::IsNotNull( tmp1 )) {
-HXLINE( 926)			_hx_tmp = tmp1;
+HXLINE(1334)		::Array< ::String > _hx_tmp;
+HXDLIN(1334)		::Array< ::String > tmp1 = ( (::Array< ::String >)(o->__Field(HX_("features",fd,6c,d7,12),::hx::paccDynamic)) );
+HXDLIN(1334)		if (::hx::IsNotNull( tmp1 )) {
+HXLINE(1334)			_hx_tmp = tmp1;
             		}
             		else {
-HXLINE( 926)			_hx_tmp = ::Array_obj< ::String >::__new(0);
+HXLINE(1334)			_hx_tmp = ::Array_obj< ::String >::__new(0);
             		}
-HXLINE( 927)		::Array< ::String > _this1;
-HXDLIN( 927)		::Array< ::String > tmp2 = ( (::Array< ::String >)(o->__Field(HX_("data",2a,56,63,42),::hx::paccDynamic)) );
-HXDLIN( 927)		if (::hx::IsNotNull( tmp2 )) {
-HXLINE( 927)			_this1 = tmp2;
+HXLINE(1335)		::Array< ::String > _this1;
+HXDLIN(1335)		::Array< ::String > tmp2 = ( (::Array< ::String >)(o->__Field(HX_("data",2a,56,63,42),::hx::paccDynamic)) );
+HXDLIN(1335)		if (::hx::IsNotNull( tmp2 )) {
+HXLINE(1335)			_this1 = tmp2;
             		}
             		else {
-HXLINE( 927)			_this1 = ::Array_obj< ::String >::__new(0);
+HXLINE(1335)			_this1 = ::Array_obj< ::String >::__new(0);
             		}
-HXDLIN( 927)		::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new(_this1->length);
-HXDLIN( 927)		{
-HXLINE( 927)			int _g2 = 0;
-HXDLIN( 927)			int _g3 = _this1->length;
-HXDLIN( 927)			while((_g2 < _g3)){
-HXLINE( 927)				_g2 = (_g2 + 1);
-HXDLIN( 927)				int i2 = (_g2 - 1);
-HXDLIN( 927)				{
-HXLINE( 927)					 ::borogove::Stanza inValue = ::borogove::Stanza_obj::parse(( (::String)(_hx_array_unsafe_get(_this1,i2)) ));
-HXDLIN( 927)					result1->__unsafe_set(i2,inValue);
+HXDLIN(1335)		::Array< ::Dynamic> result1 = ::Array_obj< ::Dynamic>::__new(_this1->length);
+HXDLIN(1335)		{
+HXLINE(1335)			int _g2 = 0;
+HXDLIN(1335)			int _g3 = _this1->length;
+HXDLIN(1335)			while((_g2 < _g3)){
+HXLINE(1335)				_g2 = (_g2 + 1);
+HXDLIN(1335)				int i2 = (_g2 - 1);
+HXDLIN(1335)				{
+HXLINE(1335)					 ::borogove::Stanza inValue = ::borogove::Stanza_obj::parse(( (::String)(_hx_array_unsafe_get(_this1,i2)) ));
+HXDLIN(1335)					result1->__unsafe_set(i2,inValue);
             				}
             			}
             		}
-HXLINE( 923)		return  ::borogove::Caps_obj::__alloc( HX_CTX ,o1,result,_hx_tmp,result1,ver);
+HXLINE(1331)		return  ::borogove::Caps_obj::__alloc( HX_CTX ,o1,result,_hx_tmp,result1,ver);
             	}
 
 
@@ -2812,83 +3882,83 @@ HX_DEFINE_DYNAMIC_FUNC2(Sqlite_obj,hydrateCaps,return )
 ::String Sqlite_obj::prepare( ::Dynamic q){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::Dynamic,q) HXARGC(1)
             		::String _hx_run( ::EReg f){
-            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_37_prepare)
-HXLINE(  38)			::cpp::VirtualArray tmp = ( (::cpp::VirtualArray)(q->__Field(HX_("params",46,fb,7a,ed),::hx::paccDynamic)) );
-HXDLIN(  38)			::cpp::VirtualArray p;
-HXDLIN(  38)			if (::hx::IsNotNull( tmp )) {
-HXLINE(  38)				p = tmp;
+            			HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_41_prepare)
+HXLINE(  42)			::cpp::VirtualArray tmp = ( (::cpp::VirtualArray)(q->__Field(HX_("params",46,fb,7a,ed),::hx::paccDynamic)) );
+HXDLIN(  42)			::cpp::VirtualArray p;
+HXDLIN(  42)			if (::hx::IsNotNull( tmp )) {
+HXLINE(  42)				p = tmp;
             			}
             			else {
-HXLINE(  38)				p = ::cpp::VirtualArray_obj::__new(0);
+HXLINE(  42)				p = ::cpp::VirtualArray_obj::__new(0);
             			}
-HXDLIN(  38)			 ::Dynamic p1 = p->shift();
-HXLINE(  39)			 ::ValueType _g = ::Type_obj::_hx_typeof(p1);
-HXDLIN(  39)			switch((int)(_g->_hx_getIndex())){
+HXDLIN(  42)			 ::Dynamic p1 = p->shift();
+HXLINE(  43)			 ::ValueType _g = ::Type_obj::_hx_typeof(p1);
+HXDLIN(  43)			switch((int)(_g->_hx_getIndex())){
             				case (int)0: {
-HXLINE(  57)					return HX_("NULL",87,66,cf,33);
+HXLINE(  61)					return HX_("NULL",87,66,cf,33);
             				}
             				break;
             				case (int)1: {
-HXLINE(  55)					return ::Std_obj::string(p1);
+HXLINE(  59)					return ::Std_obj::string(p1);
             				}
             				break;
             				case (int)2: {
-HXLINE(  53)					return ::Std_obj::string(p1);
+HXLINE(  57)					return ::Std_obj::string(p1);
             				}
             				break;
             				case (int)3: {
-HXLINE(  51)					if (::hx::IsEq( p1,true )) {
-HXLINE(  51)						return HX_("1",31,00,00,00);
+HXLINE(  55)					if (::hx::IsEq( p1,true )) {
+HXLINE(  55)						return HX_("1",31,00,00,00);
             					}
             					else {
-HXLINE(  51)						return HX_("0",30,00,00,00);
+HXLINE(  55)						return HX_("0",30,00,00,00);
             					}
             				}
             				break;
             				case (int)6: {
-HXLINE(  61)					::hx::Class _hx_switch_0 = _g->_hx_getObject(0).StaticCast< ::hx::Class >();
+HXLINE(  65)					::hx::Class _hx_switch_0 = _g->_hx_getObject(0).StaticCast< ::hx::Class >();
             					if (  (_hx_switch_0==::hx::ArrayBase::__mClass) ){
-HXLINE(  60)						return ((HX_("X'",cf,4c,00,00) + ::haxe::io::Bytes_obj::ofData(( (::Array< unsigned char >)(p1) ))->toHex()) + HX_("'",27,00,00,00));
-HXDLIN(  60)						goto _hx_goto_179;
+HXLINE(  64)						return ((HX_("X'",cf,4c,00,00) + ::haxe::io::Bytes_obj::ofData(( (::Array< unsigned char >)(p1) ))->toHex()) + HX_("'",27,00,00,00));
+HXDLIN(  64)						goto _hx_goto_246;
             					}
             					if (  (_hx_switch_0==::hx::ClassOf< ::String >()) ){
-HXLINE(  41)						if (::hx::IsGreaterEq( p1->__Field(HX_("indexOf",c9,48,bf,e0),::hx::paccDynamic)(HX_("\x00""",00,00,00,00)),0 )) {
-HXLINE(  42)							::Array< ::String > hexChars = ::Array_obj< ::String >::__new();
-HXLINE(  43)							{
-HXLINE(  43)								int _g1 = 0;
-HXDLIN(  43)								int _g2 = ( (int)(p1->__Field(HX_("length",e6,94,07,9f),::hx::paccDynamic)) );
-HXDLIN(  43)								while((_g1 < _g2)){
-HXLINE(  43)									_g1 = (_g1 + 1);
-HXLINE(  44)									hexChars->push(::StringTools_obj::hex(( (::String)(p1) ).cca((_g1 - 1)),2));
+HXLINE(  45)						if (::hx::IsGreaterEq( p1->__Field(HX_("indexOf",c9,48,bf,e0),::hx::paccDynamic)(HX_("\x00""",00,00,00,00)),0 )) {
+HXLINE(  46)							::Array< ::String > hexChars = ::Array_obj< ::String >::__new();
+HXLINE(  47)							{
+HXLINE(  47)								int _g1 = 0;
+HXDLIN(  47)								int _g2 = ( (int)(p1->__Field(HX_("length",e6,94,07,9f),::hx::paccDynamic)) );
+HXDLIN(  47)								while((_g1 < _g2)){
+HXLINE(  47)									_g1 = (_g1 + 1);
+HXLINE(  48)									hexChars->push(::StringTools_obj::hex(( (::String)(p1) ).cca((_g1 - 1)),2));
             								}
             							}
-HXLINE(  46)							return ((HX_("x'",af,68,00,00) + hexChars->join(HX_("",00,00,00,00))) + HX_("'",27,00,00,00));
+HXLINE(  50)							return ((HX_("x'",af,68,00,00) + hexChars->join(HX_("",00,00,00,00))) + HX_("'",27,00,00,00));
             						}
             						else {
-HXLINE(  48)							return ((HX_("'",27,00,00,00) + ::Std_obj::string(p1->__Field(HX_("split",da,ea,6e,81),::hx::paccDynamic)(HX_("'",27,00,00,00))->__Field(HX_("join",ea,33,65,46),::hx::paccDynamic)(HX_("''",20,22,00,00)))) + HX_("'",27,00,00,00));
+HXLINE(  52)							return ((HX_("'",27,00,00,00) + ::Std_obj::string(p1->__Field(HX_("split",da,ea,6e,81),::hx::paccDynamic)(HX_("'",27,00,00,00))->__Field(HX_("join",ea,33,65,46),::hx::paccDynamic)(HX_("''",20,22,00,00)))) + HX_("'",27,00,00,00));
             						}
-HXLINE(  41)						goto _hx_goto_179;
+HXLINE(  45)						goto _hx_goto_246;
             					}
             					if (  (_hx_switch_0==::hx::ClassOf< ::haxe::io::Bytes >()) ){
-HXLINE(  63)						return ((HX_("X'",cf,4c,00,00) + ( ( ::haxe::io::Bytes)(p1) )->toHex()) + HX_("'",27,00,00,00));
-HXDLIN(  63)						goto _hx_goto_179;
+HXLINE(  66)						return ((HX_("X'",cf,4c,00,00) + ::Std_obj::string(p1->__Field(HX_("toHex",20,f4,10,14),::hx::paccDynamic)())) + HX_("'",27,00,00,00));
+HXDLIN(  66)						goto _hx_goto_246;
             					}
             					/* default */{
-HXLINE(  65)						HX_STACK_DO_THROW((HX_("UKNONWN: ",54,2e,a9,30) + ::Std_obj::string(::Type_obj::_hx_typeof(p1))));
+HXLINE(  68)						HX_STACK_DO_THROW((HX_("UNKNOWN: ",90,58,8b,8c) + ::Std_obj::string(::Type_obj::_hx_typeof(p1))));
             					}
-            					_hx_goto_179:;
+            					_hx_goto_246:;
             				}
             				break;
             				default:{
-HXLINE(  65)					HX_STACK_DO_THROW((HX_("UKNONWN: ",54,2e,a9,30) + ::Std_obj::string(::Type_obj::_hx_typeof(p1))));
+HXLINE(  68)					HX_STACK_DO_THROW((HX_("UNKNOWN: ",90,58,8b,8c) + ::Std_obj::string(::Type_obj::_hx_typeof(p1))));
             				}
             			}
-HXLINE(  39)			return null();
+HXLINE(  43)			return null();
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_37_prepare)
-HXDLIN(  37)		return  ::EReg_obj::__alloc( HX_CTX ,HX_("\\?",63,50,00,00),HX_("gm",26,5a,00,00))->map(( (::String)(q->__Field(HX_("sql",0e,a6,57,00),::hx::paccDynamic)) ), ::Dynamic(new _hx_Closure_0(q)));
+            	HX_GC_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_41_prepare)
+HXDLIN(  41)		return  ::EReg_obj::__alloc( HX_CTX ,HX_("\\?",63,50,00,00),HX_("gm",26,5a,00,00))->map(( (::String)(q->__Field(HX_("sql",0e,a6,57,00),::hx::paccDynamic)) ), ::Dynamic(new _hx_Closure_0(q)));
             	}
 
 
@@ -2917,10 +3987,12 @@ void Sqlite_obj::__Mark(HX_MARK_PARAMS)
 	HX_MARK_BEGIN_CLASS(Sqlite);
 	HX_MARK_MEMBER_NAME(db,"db");
 	HX_MARK_MEMBER_NAME(media,"media");
+	HX_MARK_MEMBER_NAME(storeMessagesSerialized,"storeMessagesSerialized");
 	HX_MARK_MEMBER_NAME(storeChatBuffer,"storeChatBuffer");
 	HX_MARK_MEMBER_NAME(storeChatTimer,"storeChatTimer");
 	HX_MARK_MEMBER_NAME(smStoreInProgress,"smStoreInProgress");
 	HX_MARK_MEMBER_NAME(smStoreNext,"smStoreNext");
+	HX_MARK_MEMBER_NAME(smStoreIdNext,"smStoreIdNext");
 	HX_MARK_END_CLASS();
 }
 
@@ -2928,10 +4000,12 @@ void Sqlite_obj::__Visit(HX_VISIT_PARAMS)
 {
 	HX_VISIT_MEMBER_NAME(db,"db");
 	HX_VISIT_MEMBER_NAME(media,"media");
+	HX_VISIT_MEMBER_NAME(storeMessagesSerialized,"storeMessagesSerialized");
 	HX_VISIT_MEMBER_NAME(storeChatBuffer,"storeChatBuffer");
 	HX_VISIT_MEMBER_NAME(storeChatTimer,"storeChatTimer");
 	HX_VISIT_MEMBER_NAME(smStoreInProgress,"smStoreInProgress");
 	HX_VISIT_MEMBER_NAME(smStoreNext,"smStoreNext");
+	HX_VISIT_MEMBER_NAME(smStoreIdNext,"smStoreIdNext");
 }
 
 ::hx::Val Sqlite_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
@@ -2947,9 +4021,6 @@ void Sqlite_obj::__Visit(HX_VISIT_PARAMS)
 	case 5:
 		if (HX_FIELD_EQ(inName,"media") ) { return ::hx::Val( media ); }
 		break;
-	case 6:
-		if (HX_FIELD_EQ(inName,"lastId") ) { return ::hx::Val( lastId_dyn() ); }
-		break;
 	case 7:
 		if (HX_FIELD_EQ(inName,"getCaps") ) { return ::hx::Val( getCaps_dyn() ); }
 		break;
@@ -2959,10 +4030,12 @@ void Sqlite_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"getLogin") ) { return ::hx::Val( getLogin_dyn() ); }
 		break;
 	case 9:
+		if (HX_FIELD_EQ(inName,"syncPoint") ) { return ::hx::Val( syncPoint_dyn() ); }
 		if (HX_FIELD_EQ(inName,"storeCaps") ) { return ::hx::Val( storeCaps_dyn() ); }
 		break;
 	case 10:
 		if (HX_FIELD_EQ(inName,"storeChats") ) { return ::hx::Val( storeChats_dyn() ); }
+		if (HX_FIELD_EQ(inName,"getMembers") ) { return ::hx::Val( getMembers_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getMessage") ) { return ::hx::Val( getMessage_dyn() ); }
 		if (HX_FIELD_EQ(inName,"storeMedia") ) { return ::hx::Val( storeMedia_dyn() ); }
 		if (HX_FIELD_EQ(inName,"storeLogin") ) { return ::hx::Val( storeLogin_dyn() ); }
@@ -2974,6 +4047,7 @@ void Sqlite_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"hydrateCaps") ) { return ::hx::Val( hydrateCaps_dyn() ); }
 		break;
 	case 12:
+		if (HX_FIELD_EQ(inName,"storeMembers") ) { return ::hx::Val( storeMembers_dyn() ); }
 		if (HX_FIELD_EQ(inName,"storeCapsSet") ) { return ::hx::Val( storeCapsSet_dyn() ); }
 		if (HX_FIELD_EQ(inName,"listAccounts") ) { return ::hx::Val( listAccounts_dyn() ); }
 		if (HX_FIELD_EQ(inName,"storeService") ) { return ::hx::Val( storeService_dyn() ); }
@@ -2981,11 +4055,14 @@ void Sqlite_obj::__Visit(HX_VISIT_PARAMS)
 	case 13:
 		if (HX_FIELD_EQ(inName,"storeMessages") ) { return ::hx::Val( storeMessages_dyn() ); }
 		if (HX_FIELD_EQ(inName,"updateMessage") ) { return ::hx::Val( updateMessage_dyn() ); }
+		if (HX_FIELD_EQ(inName,"fetchFromStub") ) { return ::hx::Val( fetchFromStub_dyn() ); }
 		if (HX_FIELD_EQ(inName,"storeReaction") ) { return ::hx::Val( storeReaction_dyn() ); }
 		if (HX_FIELD_EQ(inName,"removeAccount") ) { return ::hx::Val( removeAccount_dyn() ); }
+		if (HX_FIELD_EQ(inName,"smStoreIdNext") ) { return ::hx::Val( smStoreIdNext ); }
 		break;
 	case 14:
 		if (HX_FIELD_EQ(inName,"storeChatTimer") ) { return ::hx::Val( storeChatTimer ); }
+		if (HX_FIELD_EQ(inName,"searchMessages") ) { return ::hx::Val( searchMessages_dyn() ); }
 		if (HX_FIELD_EQ(inName,"fetchReactions") ) { return ::hx::Val( fetchReactions_dyn() ); }
 		if (HX_FIELD_EQ(inName,"hydrateReplyTo") ) { return ::hx::Val( hydrateReplyTo_dyn() ); }
 		break;
@@ -2994,6 +4071,7 @@ void Sqlite_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"hydrateMessages") ) { return ::hx::Val( hydrateMessages_dyn() ); }
 		break;
 	case 16:
+		if (HX_FIELD_EQ(inName,"getMemberDetails") ) { return ::hx::Val( getMemberDetails_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getMessagesAfter") ) { return ::hx::Val( getMessagesAfter_dyn() ); }
 		if (HX_FIELD_EQ(inName,"hydrateReactions") ) { return ::hx::Val( hydrateReactions_dyn() ); }
 		break;
@@ -3002,11 +4080,18 @@ void Sqlite_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"getMessagesAround") ) { return ::hx::Val( getMessagesAround_dyn() ); }
 		if (HX_FIELD_EQ(inName,"smStoreInProgress") ) { return ::hx::Val( smStoreInProgress ); }
 		break;
+	case 18:
+		if (HX_FIELD_EQ(inName,"hydratePresenceMap") ) { return ::hx::Val( hydratePresenceMap_dyn() ); }
+		if (HX_FIELD_EQ(inName,"storeMemberUpdates") ) { return ::hx::Val( storeMemberUpdates_dyn() ); }
+		break;
 	case 19:
+		if (HX_FIELD_EQ(inName,"hydrateStoredMember") ) { return ::hx::Val( hydrateStoredMember_dyn() ); }
+		if (HX_FIELD_EQ(inName,"clearMemberPresence") ) { return ::hx::Val( clearMemberPresence_dyn() ); }
 		if (HX_FIELD_EQ(inName,"updateMessageStatus") ) { return ::hx::Val( updateMessageStatus_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getStreamManagement") ) { return ::hx::Val( getStreamManagement_dyn() ); }
 		break;
 	case 20:
+		if (HX_FIELD_EQ(inName,"serializePresenceMap") ) { return ::hx::Val( serializePresenceMap_dyn() ); }
 		if (HX_FIELD_EQ(inName,"getChatUnreadDetails") ) { return ::hx::Val( getChatUnreadDetails_dyn() ); }
 		break;
 	case 21:
@@ -3014,7 +4099,11 @@ void Sqlite_obj::__Visit(HX_VISIT_PARAMS)
 		if (HX_FIELD_EQ(inName,"storeStreamManagement") ) { return ::hx::Val( storeStreamManagement_dyn() ); }
 		break;
 	case 23:
+		if (HX_FIELD_EQ(inName,"storeMessagesSerialized") ) { return ::hx::Val( storeMessagesSerialized ); }
 		if (HX_FIELD_EQ(inName,"findServicesWithFeature") ) { return ::hx::Val( findServicesWithFeature_dyn() ); }
+		break;
+	case 29:
+		if (HX_FIELD_EQ(inName,"chatPresenceAndMembersForName") ) { return ::hx::Val( chatPresenceAndMembersForName_dyn() ); }
 	}
 	return super::__Field(inName,inCallProp);
 }
@@ -3040,6 +4129,9 @@ bool Sqlite_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::Pr
 	case 11:
 		if (HX_FIELD_EQ(inName,"smStoreNext") ) { smStoreNext=inValue.Cast< ::Array< unsigned char > >(); return inValue; }
 		break;
+	case 13:
+		if (HX_FIELD_EQ(inName,"smStoreIdNext") ) { smStoreIdNext=inValue.Cast< ::String >(); return inValue; }
+		break;
 	case 14:
 		if (HX_FIELD_EQ(inName,"storeChatTimer") ) { storeChatTimer=inValue.Cast<  ::haxe::Timer >(); return inValue; }
 		break;
@@ -3048,6 +4140,9 @@ bool Sqlite_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::Pr
 		break;
 	case 17:
 		if (HX_FIELD_EQ(inName,"smStoreInProgress") ) { smStoreInProgress=inValue.Cast< bool >(); return inValue; }
+		break;
+	case 23:
+		if (HX_FIELD_EQ(inName,"storeMessagesSerialized") ) { storeMessagesSerialized=inValue.Cast<  ::borogove::AsyncLock >(); return inValue; }
 	}
 	return super::__SetField(inName,inValue,inCallProp);
 }
@@ -3056,10 +4151,12 @@ void Sqlite_obj::__GetFields(Array< ::String> &outFields)
 {
 	outFields->push(HX_("db",7e,57,00,00));
 	outFields->push(HX_("media",e4,04,bc,05));
+	outFields->push(HX_("storeMessagesSerialized",b1,de,e1,42));
 	outFields->push(HX_("storeChatBuffer",39,5d,98,0f));
 	outFields->push(HX_("storeChatTimer",ac,c9,9a,09));
 	outFields->push(HX_("smStoreInProgress",79,f8,70,5d));
 	outFields->push(HX_("smStoreNext",7a,e1,91,0a));
+	outFields->push(HX_("smStoreIdNext",b5,62,eb,8c));
 	super::__GetFields(outFields);
 };
 
@@ -3067,10 +4164,12 @@ void Sqlite_obj::__GetFields(Array< ::String> &outFields)
 static ::hx::StorageInfo Sqlite_obj_sMemberStorageInfo[] = {
 	{::hx::fsObject /*  ::borogove::persistence::SqliteDriver */ ,(int)offsetof(Sqlite_obj,db),HX_("db",7e,57,00,00)},
 	{::hx::fsObject /* ::Dynamic */ ,(int)offsetof(Sqlite_obj,media),HX_("media",e4,04,bc,05)},
+	{::hx::fsObject /*  ::borogove::AsyncLock */ ,(int)offsetof(Sqlite_obj,storeMessagesSerialized),HX_("storeMessagesSerialized",b1,de,e1,42)},
 	{::hx::fsObject /*  ::haxe::ds::StringMap */ ,(int)offsetof(Sqlite_obj,storeChatBuffer),HX_("storeChatBuffer",39,5d,98,0f)},
 	{::hx::fsObject /*  ::haxe::Timer */ ,(int)offsetof(Sqlite_obj,storeChatTimer),HX_("storeChatTimer",ac,c9,9a,09)},
 	{::hx::fsBool,(int)offsetof(Sqlite_obj,smStoreInProgress),HX_("smStoreInProgress",79,f8,70,5d)},
 	{::hx::fsObject /* ::Array< unsigned char > */ ,(int)offsetof(Sqlite_obj,smStoreNext),HX_("smStoreNext",7a,e1,91,0a)},
+	{::hx::fsString,(int)offsetof(Sqlite_obj,smStoreIdNext),HX_("smStoreIdNext",b5,62,eb,8c)},
 	{ ::hx::fsUnknown, 0, null()}
 };
 static ::hx::StaticInfo *Sqlite_obj_sStaticStorageInfo = 0;
@@ -3079,15 +4178,27 @@ static ::hx::StaticInfo *Sqlite_obj_sStaticStorageInfo = 0;
 static ::String Sqlite_obj_sMemberFields[] = {
 	HX_("db",7e,57,00,00),
 	HX_("media",e4,04,bc,05),
+	HX_("storeMessagesSerialized",b1,de,e1,42),
 	HX_("get",96,80,4e,00),
 	HX_("set",a2,9b,57,00),
-	HX_("lastId",d1,0b,c5,54),
+	HX_("syncPoint",f5,ff,94,98),
 	HX_("storeChatBuffer",39,5d,98,0f),
 	HX_("storeChatTimer",ac,c9,9a,09),
 	HX_("storeChats",fa,4a,32,83),
+	HX_("serializePresenceMap",21,8d,15,b7),
+	HX_("hydratePresenceMap",4e,15,95,4c),
+	HX_("hydrateStoredMember",50,ed,46,d6),
+	HX_("chatPresenceAndMembersForName",9f,40,58,82),
+	HX_("storeMembers",f8,ee,39,b6),
+	HX_("storeMemberUpdates",6f,0a,28,a1),
+	HX_("clearMemberPresence",22,9d,db,a5),
+	HX_("getMembers",e3,b2,d1,69),
+	HX_("getMemberDetails",12,2b,2f,b3),
+	HX_("searchMessages",54,dc,f0,62),
 	HX_("getChats",25,ae,8a,a5),
 	HX_("storeMessages",cd,f1,bd,e9),
 	HX_("updateMessage",be,9a,7f,65),
+	HX_("fetchFromStub",12,5e,b9,b2),
 	HX_("getMessage",d1,bb,72,e9),
 	HX_("getMessages",82,9b,f1,5a),
 	HX_("getMessagesBefore",a1,f1,44,11),
@@ -3109,6 +4220,7 @@ static ::String Sqlite_obj_sMemberFields[] = {
 	HX_("listAccounts",a4,81,e8,f5),
 	HX_("smStoreInProgress",79,f8,70,5d),
 	HX_("smStoreNext",7a,e1,91,0a),
+	HX_("smStoreIdNext",b5,62,eb,8c),
 	HX_("storeStreamManagement",24,1d,b8,8d),
 	HX_("getStreamManagement",d9,03,ec,6c),
 	HX_("storeService",54,de,f6,9d),
@@ -3153,9 +4265,9 @@ void Sqlite_obj::__register()
 void Sqlite_obj::__boot()
 {
 {
-            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_31_boot)
-HXDLIN(  31)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
-            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(28)
+            	HX_STACKFRAME(&_hx_pos_4648627e4fbfb4d7_34_boot)
+HXDLIN(  34)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
+            			->setFixed(0,HX_("fields",79,8e,8e,80), ::Dynamic(::hx::Anon_obj::Create(34)
             				->setFixed(0,HX_("storeChats",fa,4a,32,83), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
             				->setFixed(1,HX_("getChatsUnreadDetails",ee,d4,5a,85), ::Dynamic(::hx::Anon_obj::Create(1)
@@ -3164,53 +4276,65 @@ HXDLIN(  31)		__mClass->__meta__ =  ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
             				->setFixed(3,HX_("hasMedia",2a,4f,14,92), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(4,HX_("listAccounts__fromC",55,2b,d7,97), ::Dynamic(::hx::Anon_obj::Create(1)
-            					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
+            				->setFixed(4,HX_("syncPoint",f5,ff,94,98), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
             				->setFixed(5,HX_("storeCaps",a2,60,d7,9d), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
             				->setFixed(6,HX_("storeService",54,de,f6,9d), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(7,HX_("getChats",25,ae,8a,a5), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(7,HX_("storeMemberUpdates",6f,0a,28,a1), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(8,HX_("storeReaction",aa,00,75,ab), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(8,HX_("getChats",25,ae,8a,a5), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(9,HX_("storeLogin",c8,85,72,b6), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(9,HX_("clearMemberPresence",22,9d,db,a5), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(10,HX_("getLogin",f3,e8,ca,d8), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(10,HX_("storeReaction",aa,00,75,ab), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(11,HX_("getMessage",d1,bb,72,e9), ::Dynamic(::hx::Anon_obj::Create(1)
-            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(12,HX_("storeMessages",cd,f1,bd,e9), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(11,HX_("getMemberDetails",12,2b,2f,b3), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(12,HX_("storeMembers",f8,ee,39,b6), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(13,HX_("storeLogin",c8,85,72,b6), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(14,HX_("getLogin",f3,e8,ca,d8), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(13,HX_("listAccounts",a4,81,e8,f5), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(15,HX_("getMessage",d1,bb,72,e9), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),::cpp::VirtualArray_obj::__new(1)->init(0,HX_("wrapped",45,d5,64,0d)))))
-            				->setFixed(14,HX_("get",96,80,4e,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(16,HX_("storeMessages",cd,f1,bd,e9), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(15,HX_("set",a2,9b,57,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(17,HX_("listAccounts",a4,81,e8,f5), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(16,HX_("removeMedia",00,e2,ef,03), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(18,HX_("get",96,80,4e,00), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(17,HX_("getMessage__fromC",c8,40,46,05), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(19,HX_("set",a2,9b,57,00), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(20,HX_("removeMedia",00,e2,ef,03), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(21,HX_("getMessage__fromC",c8,40,46,05), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.wrapper",8b,ea,27,d4),null())))
-            				->setFixed(18,HX_("updateMessageStatus",90,98,ad,0f), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(22,HX_("updateMessageStatus",90,98,ad,0f), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(23,HX_("getMessagesBefore",a1,f1,44,11), ::Dynamic(::hx::Anon_obj::Create(1)
+            					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
+            				->setFixed(24,HX_("getCaps",d7,cb,3c,14), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(19,HX_("getMessagesBefore",a1,f1,44,11), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(25,HX_("getMessagesAround",6f,95,16,2d), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(20,HX_("getCaps",d7,cb,3c,14), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(26,HX_("storeMedia",43,b1,3a,43), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(21,HX_("getMessagesAround",6f,95,16,2d), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(27,HX_("findServicesWithFeature",99,4e,bd,4a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(22,HX_("storeMedia",43,b1,3a,43), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(28,HX_("getMessagesAfter",3a,43,91,57), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(23,HX_("findServicesWithFeature",99,4e,bd,4a), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(29,HX_("searchMessages",54,dc,f0,62), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(24,HX_("lastId",d1,0b,c5,54), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(30,HX_("updateMessage",be,9a,7f,65), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(25,HX_("getMessagesAfter",3a,43,91,57), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(31,HX_("getMembers",e3,b2,d1,69), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(26,HX_("updateMessage",be,9a,7f,65), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(32,HX_("getStreamManagement",d9,03,ec,6c), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null())))
-            				->setFixed(27,HX_("getStreamManagement",d9,03,ec,6c), ::Dynamic(::hx::Anon_obj::Create(1)
+            				->setFixed(33,HX_("removeAccount",c9,58,14,7a), ::Dynamic(::hx::Anon_obj::Create(1)
             					->setFixed(0,HX_("HaxeCBridge.noemit",dc,2c,99,2f),null()))))));
             	}
 }
diff --git a/Sources/c_borogove/src/borogove/persistence/SqliteDriver.cpp b/Sources/c_borogove/src/borogove/persistence/SqliteDriver.cpp
index a609f9e..5c12090 100644
--- a/Sources/c_borogove/src/borogove/persistence/SqliteDriver.cpp
+++ b/Sources/c_borogove/src/borogove/persistence/SqliteDriver.cpp
@@ -25,9 +25,6 @@
 #ifndef INCLUDED_haxe_Exception
 #include <haxe/Exception.h>
 #endif
-#ifndef INCLUDED_haxe_Log
-#include <haxe/Log.h>
-#endif
 #ifndef INCLUDED_haxe_iterators_ArrayIterator
 #include <haxe/iterators/ArrayIterator.h>
 #endif
@@ -60,16 +57,16 @@
 #endif
 
 HX_DEFINE_STACK_FRAME(_hx_pos_a11c44f890417883_19_new,"borogove.persistence.SqliteDriver","new",0x5c9c4682,"borogove.persistence.SqliteDriver.new","borogove/persistence/SqliteDriver.hx",19,0xf8c083ec)
-HX_DEFINE_STACK_FRAME(_hx_pos_a11c44f890417883_27_new,"borogove.persistence.SqliteDriver","new",0x5c9c4682,"borogove.persistence.SqliteDriver.new","borogove/persistence/SqliteDriver.hx",27,0xf8c083ec)
 HX_DEFINE_STACK_FRAME(_hx_pos_a11c44f890417883_28_new,"borogove.persistence.SqliteDriver","new",0x5c9c4682,"borogove.persistence.SqliteDriver.new","borogove/persistence/SqliteDriver.hx",28,0xf8c083ec)
+HX_DEFINE_STACK_FRAME(_hx_pos_a11c44f890417883_29_new,"borogove.persistence.SqliteDriver","new",0x5c9c4682,"borogove.persistence.SqliteDriver.new","borogove/persistence/SqliteDriver.hx",29,0xf8c083ec)
 HX_DEFINE_STACK_FRAME(_hx_pos_a11c44f890417883_21_new,"borogove.persistence.SqliteDriver","new",0x5c9c4682,"borogove.persistence.SqliteDriver.new","borogove/persistence/SqliteDriver.hx",21,0xf8c083ec)
 HX_DEFINE_STACK_FRAME(_hx_pos_a11c44f890417883_8_new,"borogove.persistence.SqliteDriver","new",0x5c9c4682,"borogove.persistence.SqliteDriver.new","borogove/persistence/SqliteDriver.hx",8,0xf8c083ec)
-HX_LOCAL_STACK_FRAME(_hx_pos_a11c44f890417883_35_execute,"borogove.persistence.SqliteDriver","execute",0xc8683957,"borogove.persistence.SqliteDriver.execute","borogove/persistence/SqliteDriver.hx",35,0xf8c083ec)
-HX_LOCAL_STACK_FRAME(_hx_pos_a11c44f890417883_53_execute,"borogove.persistence.SqliteDriver","execute",0xc8683957,"borogove.persistence.SqliteDriver.execute","borogove/persistence/SqliteDriver.hx",53,0xf8c083ec)
-HX_LOCAL_STACK_FRAME(_hx_pos_a11c44f890417883_33_execute,"borogove.persistence.SqliteDriver","execute",0xc8683957,"borogove.persistence.SqliteDriver.execute","borogove/persistence/SqliteDriver.hx",33,0xf8c083ec)
-HX_LOCAL_STACK_FRAME(_hx_pos_a11c44f890417883_67_execMany,"borogove.persistence.SqliteDriver","execMany",0x784b076e,"borogove.persistence.SqliteDriver.execMany","borogove/persistence/SqliteDriver.hx",67,0xf8c083ec)
-HX_LOCAL_STACK_FRAME(_hx_pos_a11c44f890417883_66_execMany,"borogove.persistence.SqliteDriver","execMany",0x784b076e,"borogove.persistence.SqliteDriver.execMany","borogove/persistence/SqliteDriver.hx",66,0xf8c083ec)
-HX_LOCAL_STACK_FRAME(_hx_pos_a11c44f890417883_74_exec,"borogove.persistence.SqliteDriver","exec",0xa63cdb2f,"borogove.persistence.SqliteDriver.exec","borogove/persistence/SqliteDriver.hx",74,0xf8c083ec)
+HX_LOCAL_STACK_FRAME(_hx_pos_a11c44f890417883_36_execute,"borogove.persistence.SqliteDriver","execute",0xc8683957,"borogove.persistence.SqliteDriver.execute","borogove/persistence/SqliteDriver.hx",36,0xf8c083ec)
+HX_LOCAL_STACK_FRAME(_hx_pos_a11c44f890417883_50_execute,"borogove.persistence.SqliteDriver","execute",0xc8683957,"borogove.persistence.SqliteDriver.execute","borogove/persistence/SqliteDriver.hx",50,0xf8c083ec)
+HX_LOCAL_STACK_FRAME(_hx_pos_a11c44f890417883_34_execute,"borogove.persistence.SqliteDriver","execute",0xc8683957,"borogove.persistence.SqliteDriver.execute","borogove/persistence/SqliteDriver.hx",34,0xf8c083ec)
+HX_LOCAL_STACK_FRAME(_hx_pos_a11c44f890417883_65_execMany,"borogove.persistence.SqliteDriver","execMany",0x784b076e,"borogove.persistence.SqliteDriver.execMany","borogove/persistence/SqliteDriver.hx",65,0xf8c083ec)
+HX_LOCAL_STACK_FRAME(_hx_pos_a11c44f890417883_64_execMany,"borogove.persistence.SqliteDriver","execMany",0x784b076e,"borogove.persistence.SqliteDriver.execMany","borogove/persistence/SqliteDriver.hx",64,0xf8c083ec)
+HX_LOCAL_STACK_FRAME(_hx_pos_a11c44f890417883_72_exec,"borogove.persistence.SqliteDriver","exec",0xa63cdb2f,"borogove.persistence.SqliteDriver.exec","borogove/persistence/SqliteDriver.hx",72,0xf8c083ec)
 namespace borogove{
 namespace persistence{
 
@@ -85,44 +82,45 @@ HXLINE(  19)			_gthis->setReady = resolve;
             		void _hx_run(){
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_1, ::borogove::persistence::SqliteDriver,_gthis) HXARGC(1)
             			::Dynamic _hx_run(::Array< ::String > sql){
-            				HX_GC_STACKFRAME(&_hx_pos_a11c44f890417883_27_new)
-HXLINE(  27)				 ::borogove::persistence::SqliteDriver _gthis1 = _gthis;
-HXDLIN(  27)				::Dynamic _gthis2 = _gthis->writePool;
-HXDLIN(  27)				::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(sql->length);
-HXDLIN(  27)				{
-HXLINE(  27)					int _g = 0;
-HXDLIN(  27)					int _g1 = sql->length;
-HXDLIN(  27)					while((_g < _g1)){
-HXLINE(  27)						_g = (_g + 1);
-HXDLIN(  27)						int i = (_g - 1);
-HXDLIN(  27)						{
-HXLINE(  27)							 ::Dynamic inValue =  ::Dynamic(::hx::Anon_obj::Create(2)
+            				HX_GC_STACKFRAME(&_hx_pos_a11c44f890417883_28_new)
+HXLINE(  28)				 ::borogove::persistence::SqliteDriver _gthis1 = _gthis;
+HXDLIN(  28)				::Dynamic _gthis2 = _gthis->writePool;
+HXDLIN(  28)				::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(sql->length);
+HXDLIN(  28)				{
+HXLINE(  28)					int _g = 0;
+HXDLIN(  28)					int _g1 = sql->length;
+HXDLIN(  28)					while((_g < _g1)){
+HXLINE(  28)						_g = (_g + 1);
+HXDLIN(  28)						int i = (_g - 1);
+HXDLIN(  28)						{
+HXLINE(  28)							 ::Dynamic inValue =  ::Dynamic(::hx::Anon_obj::Create(2)
             								->setFixed(0,HX_("params",46,fb,7a,ed),::cpp::VirtualArray_obj::__new(0))
             								->setFixed(1,HX_("sql",0e,a6,57,00),_hx_array_unsafe_get(sql,i)));
-HXDLIN(  27)							result->__unsafe_set(i,inValue);
+HXDLIN(  28)							result->__unsafe_set(i,inValue);
             						}
             					}
             				}
-HXDLIN(  27)				return _gthis1->execute(_gthis2,result);
+HXDLIN(  28)				return _gthis1->execute(_gthis2,result);
             			}
             			HX_END_LOCAL_FUNC1(return)
 
             			HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_2, ::borogove::persistence::SqliteDriver,_gthis) HXARGC(1)
             			void _hx_run( ::Dynamic _){
-            				HX_GC_STACKFRAME(&_hx_pos_a11c44f890417883_28_new)
-HXLINE(  28)				_gthis->setReady(true);
+            				HX_GC_STACKFRAME(&_hx_pos_a11c44f890417883_29_new)
+HXLINE(  29)				_gthis->setReady(true);
             			}
             			HX_END_LOCAL_FUNC1((void))
 
             			HX_GC_STACKFRAME(&_hx_pos_a11c44f890417883_21_new)
 HXLINE(  22)			::Dynamic db = ::sys::db::Sqlite_obj::open(dbfile);
 HXLINE(  23)			::sys::db::Connection_obj::request(db,HX_("PRAGMA journal_mode=WAL",74,ce,b2,c7));
-HXLINE(  24)			::sys::db::Connection_obj::request(db,HX_("PRAGMA temp_store=2",ef,8d,52,36));
-HXLINE(  25)			if (::borogove::Config_obj::constrainedMemoryMode) {
-HXLINE(  25)				::sys::db::Connection_obj::request(db,HX_("PRAGMA cache_size=0",d5,e5,b6,fc));
+HXLINE(  24)			::sys::db::Connection_obj::request(db,HX_("PRAGMA synchronous=NORMAL",9f,05,c5,b7));
+HXLINE(  25)			::sys::db::Connection_obj::request(db,HX_("PRAGMA temp_store=2",ef,8d,52,36));
+HXLINE(  26)			if (::borogove::Config_obj::constrainedMemoryMode) {
+HXLINE(  26)				::sys::db::Connection_obj::request(db,HX_("PRAGMA cache_size=0",d5,e5,b6,fc));
             			}
-HXLINE(  26)			_gthis->dbs->push(db);
-HXLINE(  27)			::thenshim::_Promise::Promise_Impl__obj::then(migrate( ::Dynamic(new _hx_Closure_1(_gthis))), ::Dynamic(new _hx_Closure_2(_gthis)),null());
+HXLINE(  27)			_gthis->dbs->push(db);
+HXLINE(  28)			::thenshim::_Promise::Promise_Impl__obj::then(migrate( ::Dynamic(new _hx_Closure_1(_gthis))), ::Dynamic(new _hx_Closure_2(_gthis)),null());
             		}
             		HX_END_LOCAL_FUNC0((void))
 
@@ -163,58 +161,51 @@ bool SqliteDriver_obj::_hx_isInstanceOf(int inClassId) {
             		void _hx_run( ::Dynamic resolve, ::Dynamic reject){
             			HX_BEGIN_LOCAL_FUNC_S4(::hx::LocalFunc,_hx_Closure_1, ::borogove::persistence::SqliteDriver,_gthis,::Array< ::Dynamic>,qs, ::Dynamic,resolve, ::Dynamic,reject) HXARGC(0)
             			void _hx_run(){
-            				HX_GC_STACKFRAME(&_hx_pos_a11c44f890417883_35_execute)
-HXLINE(  36)				::Dynamic db = _gthis->dbs->pop(false);
-HXLINE(  37)				try {
+            				HX_GC_STACKFRAME(&_hx_pos_a11c44f890417883_36_execute)
+HXLINE(  37)				::Dynamic db = _gthis->dbs->pop(false);
+HXLINE(  38)				try {
             					HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0,::Array< ::Dynamic>,result) HXARGC(0)
             					::Dynamic _hx_run(){
-            						HX_STACKFRAME(&_hx_pos_a11c44f890417883_53_execute)
-HXLINE(  53)						return result->__get(0);
+            						HX_STACKFRAME(&_hx_pos_a11c44f890417883_50_execute)
+HXLINE(  50)						return result->__get(0);
             					}
             					HX_END_LOCAL_FUNC0(return)
 
             					HX_STACK_CATCHABLE( ::Dynamic, 0);
-HXLINE(  38)					if (::hx::IsNull( db )) {
-HXLINE(  39)						db = ::sys::db::Sqlite_obj::open(_gthis->dbfile);
+HXLINE(  39)					if (::hx::IsNull( db )) {
+HXLINE(  40)						db = ::sys::db::Sqlite_obj::open(_gthis->dbfile);
             					}
-HXLINE(  41)					::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(1)->init(0,null());
-HXLINE(  42)					{
-HXLINE(  42)						int _g = 0;
-HXDLIN(  42)						while((_g < qs->length)){
-HXLINE(  42)							 ::Dynamic q = qs->__get(_g);
-HXDLIN(  42)							_g = (_g + 1);
-HXLINE(  43)							::String prepared = ::borogove::persistence::Sqlite_obj::prepare(q);
-HXLINE(  44)							Float start =  ::__time_stamp();
-HXLINE(  45)							result[0] = ::sys::db::Connection_obj::request(db,prepared);
-HXLINE(  46)							Float runtime = ( ::__time_stamp() - start);
-HXLINE(  47)							if ((runtime > 1)) {
-HXLINE(  48)								::haxe::Log_obj::trace(HX_("XYZZY sql time",47,59,0c,c4), ::Dynamic(::hx::Anon_obj::Create(5)
-            									->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.persistence.SqliteDriver",90,9d,1a,56))
-            									->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(2)->init(0,runtime)->init(1,prepared))
-            									->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("execute",35,0a,0d,cc))
-            									->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/persistence/SqliteDriver.hx",ec,83,c0,f8))
-            									->setFixed(4,HX_("lineNumber",dd,81,22,76),48)));
-            							}
+HXLINE(  42)					::Array< ::Dynamic> result = ::Array_obj< ::Dynamic>::__new(1)->init(0,null());
+HXLINE(  43)					if ((qs->length > 1)) {
+HXLINE(  43)						::sys::db::Connection_obj::request(db,HX_("BEGIN TRANSACTION",27,ad,5f,e2));
+            					}
+HXLINE(  44)					{
+HXLINE(  44)						int _g = 0;
+HXDLIN(  44)						while((_g < qs->length)){
+HXLINE(  44)							 ::Dynamic q = qs->__get(_g);
+HXDLIN(  44)							_g = (_g + 1);
+HXLINE(  45)							::String prepared = ::borogove::persistence::Sqlite_obj::prepare(q);
+HXLINE(  46)							result[0] = ::sys::db::Connection_obj::request(db,prepared);
             						}
             					}
-HXLINE(  53)					::cpp::VirtualArray arr = ::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE(  50)					::cpp::VirtualArray arr = ::Lambda_obj::array( ::Dynamic(::hx::Anon_obj::Create(1)
             						->setFixed(0,HX_("iterator",ee,49,9a,93), ::Dynamic(new _hx_Closure_0(result)))));
-HXLINE(  54)					_gthis->dbs->push(db);
-HXLINE(  55)					resolve( ::haxe::iterators::ArrayIterator_obj::__alloc( HX_CTX ,arr));
+HXLINE(  51)					if ((qs->length > 1)) {
+HXLINE(  51)						::sys::db::Connection_obj::request(db,HX_("COMMIT",f7,1b,b1,79));
+            					}
+HXLINE(  52)					_gthis->dbs->push(db);
+HXLINE(  53)					resolve( ::haxe::iterators::ArrayIterator_obj::__alloc( HX_CTX ,arr));
             				} catch( ::Dynamic _hx_e) {
             					if (_hx_e.IsClass<  ::Dynamic >() ){
             						HX_STACK_BEGIN_CATCH
             						 ::Dynamic _g1 = _hx_e;
-HXLINE(  56)						 ::haxe::Exception _g2 = ::haxe::Exception_obj::caught(_g1);
-HXDLIN(  56)						{
-HXLINE(  57)							::haxe::Log_obj::trace(HX_("XYZZY err",7d,7a,4d,54), ::Dynamic(::hx::Anon_obj::Create(5)
-            								->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.persistence.SqliteDriver",90,9d,1a,56))
-            								->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,_g2))
-            								->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("execute",35,0a,0d,cc))
-            								->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/persistence/SqliteDriver.hx",ec,83,c0,f8))
-            								->setFixed(4,HX_("lineNumber",dd,81,22,76),57)));
-HXLINE(  58)							_gthis->dbs->push(db);
-HXLINE(  59)							reject(_g2);
+HXLINE(  54)						 ::haxe::Exception _g2 = ::haxe::Exception_obj::caught(_g1);
+HXDLIN(  54)						{
+HXLINE(  55)							if ((qs->length > 1)) {
+HXLINE(  55)								::sys::db::Connection_obj::request(db,HX_("ROLLBACK",24,58,ad,78));
+            							}
+HXLINE(  56)							_gthis->dbs->push(db);
+HXLINE(  57)							reject(_g2);
             						}
             					}
             					else {
@@ -224,14 +215,14 @@ HXLINE(  59)							reject(_g2);
             			}
             			HX_END_LOCAL_FUNC0((void))
 
-            			HX_STACKFRAME(&_hx_pos_a11c44f890417883_35_execute)
-HXLINE(  35)			::sys::thread::IThreadPool_obj::run(pool, ::Dynamic(new _hx_Closure_1(_gthis,qs,resolve,reject)));
+            			HX_STACKFRAME(&_hx_pos_a11c44f890417883_36_execute)
+HXLINE(  36)			::sys::thread::IThreadPool_obj::run(pool, ::Dynamic(new _hx_Closure_1(_gthis,qs,resolve,reject)));
             		}
             		HX_END_LOCAL_FUNC2((void))
 
-            	HX_STACKFRAME(&_hx_pos_a11c44f890417883_33_execute)
-HXDLIN(  33)		 ::borogove::persistence::SqliteDriver _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(  34)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_2(_gthis,pool,qs)));
+            	HX_STACKFRAME(&_hx_pos_a11c44f890417883_34_execute)
+HXDLIN(  34)		 ::borogove::persistence::SqliteDriver _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(  35)		return ::thenshim::_Promise::Promise_Impl__obj::_new( ::Dynamic(new _hx_Closure_2(_gthis,pool,qs)));
             	}
 
 
@@ -240,29 +231,29 @@ HX_DEFINE_DYNAMIC_FUNC2(SqliteDriver_obj,execute,return )
 ::Dynamic SqliteDriver_obj::execMany(::Array< ::Dynamic> qs){
             		HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0, ::borogove::persistence::SqliteDriver,_gthis,::Array< ::Dynamic>,qs) HXARGC(1)
             		::Dynamic _hx_run(bool _){
-            			HX_STACKFRAME(&_hx_pos_a11c44f890417883_67_execMany)
-HXLINE(  68)			::Dynamic pool;
-HXDLIN(  68)			if (::StringTools_obj::startsWith(( (::String)(qs->__get(0)->__Field(HX_("sql",0e,a6,57,00),::hx::paccDynamic)) ),HX_("SELECT",fc,c6,b5,1c))) {
-HXLINE(  68)				pool = _gthis->readPool;
+            			HX_STACKFRAME(&_hx_pos_a11c44f890417883_65_execMany)
+HXLINE(  66)			::Dynamic pool;
+HXDLIN(  66)			if (::StringTools_obj::startsWith(( (::String)(qs->__get(0)->__Field(HX_("sql",0e,a6,57,00),::hx::paccDynamic)) ),HX_("SELECT",fc,c6,b5,1c))) {
+HXLINE(  66)				pool = _gthis->readPool;
             			}
             			else {
-HXLINE(  68)				pool = _gthis->writePool;
+HXLINE(  66)				pool = _gthis->writePool;
             			}
-HXLINE(  69)			return _gthis->execute(pool,qs);
+HXLINE(  67)			return _gthis->execute(pool,qs);
             		}
             		HX_END_LOCAL_FUNC1(return)
 
-            	HX_STACKFRAME(&_hx_pos_a11c44f890417883_66_execMany)
-HXDLIN(  66)		 ::borogove::persistence::SqliteDriver _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE(  67)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->ready, ::Dynamic(new _hx_Closure_0(_gthis,qs)),null());
+            	HX_STACKFRAME(&_hx_pos_a11c44f890417883_64_execMany)
+HXDLIN(  64)		 ::borogove::persistence::SqliteDriver _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE(  65)		return ::thenshim::_Promise::Promise_Impl__obj::then(this->ready, ::Dynamic(new _hx_Closure_0(_gthis,qs)),null());
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(SqliteDriver_obj,execMany,return )
 
 ::Dynamic SqliteDriver_obj::exec(::String sql,::cpp::VirtualArray params){
-            	HX_STACKFRAME(&_hx_pos_a11c44f890417883_74_exec)
-HXDLIN(  74)		return this->execMany(::Array_obj< ::Dynamic>::__new(1)->init(0, ::Dynamic(::hx::Anon_obj::Create(2)
+            	HX_STACKFRAME(&_hx_pos_a11c44f890417883_72_exec)
+HXDLIN(  72)		return this->execMany(::Array_obj< ::Dynamic>::__new(1)->init(0, ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("params",46,fb,7a,ed),params)
             			->setFixed(1,HX_("sql",0e,a6,57,00),sql))));
             	}
diff --git a/Sources/c_borogove/src/borogove/queries/BlocklistGet.cpp b/Sources/c_borogove/src/borogove/queries/BlocklistGet.cpp
index 00fab2c..889151f 100644
--- a/Sources/c_borogove/src/borogove/queries/BlocklistGet.cpp
+++ b/Sources/c_borogove/src/borogove/queries/BlocklistGet.cpp
@@ -4,8 +4,8 @@
 #ifndef INCLUDED_Reflect
 #include <Reflect.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
@@ -28,7 +28,7 @@ void BlocklistGet_obj::__construct(){
 HXLINE(  14)		this->queryId = null();
 HXLINE(  13)		this->xmlns = HX_("urn:xmpp:blocking",d1,a1,46,c3);
 HXLINE(  19)		super::__construct();
-HXLINE(  21)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  21)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  22)		this->queryStanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("id",db,5b,00,00),this->queryId)
             			->setFixed(1,HX_("type",ba,f2,08,4d),HX_("get",96,80,4e,00))))->tag(HX_("blocklist",2b,bc,68,62), ::Dynamic(::hx::Anon_obj::Create(1)
diff --git a/Sources/c_borogove/src/borogove/queries/BoB.cpp b/Sources/c_borogove/src/borogove/queries/BoB.cpp
index d073d56..972ef33 100644
--- a/Sources/c_borogove/src/borogove/queries/BoB.cpp
+++ b/Sources/c_borogove/src/borogove/queries/BoB.cpp
@@ -10,12 +10,12 @@
 #ifndef INCLUDED_StringTools
 #include <StringTools.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_Hash
 #include <borogove/Hash.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
-#endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
@@ -60,7 +60,7 @@ HXLINE(  19)			_hx_tmp = true;
 HXDLIN(  19)		if (_hx_tmp) {
 HXLINE(  19)			HX_STACK_DO_THROW(HX_("invalid BoB URI",38,fd,eb,ca));
             		}
-HXLINE(  21)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  21)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  22)		 ::borogove::Stanza _hx_tmp2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("id",db,5b,00,00),this->queryId)
             			->setFixed(1,HX_("to",7b,65,00,00),to)
diff --git a/Sources/c_borogove/src/borogove/queries/CommandExecute.cpp b/Sources/c_borogove/src/borogove/queries/CommandExecute.cpp
index 481dd8c..096d098 100644
--- a/Sources/c_borogove/src/borogove/queries/CommandExecute.cpp
+++ b/Sources/c_borogove/src/borogove/queries/CommandExecute.cpp
@@ -7,6 +7,9 @@
 #ifndef INCLUDED_Reflect
 #include <Reflect.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_Command
 #include <borogove/Command.h>
 #endif
@@ -22,9 +25,6 @@
 #ifndef INCLUDED_borogove_FormSection
 #include <borogove/FormSection.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
-#endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
@@ -81,7 +81,7 @@ HXDLIN(  26)			::Reflect_obj::setField(attr,HX_("action",b6,3b,46,16),value);
 HXLINE(  27)		if (::hx::IsNotNull( sessionid )) {
 HXLINE(  27)			::Reflect_obj::setField(attr,HX_("sessionid",b1,74,4d,bb),sessionid);
             		}
-HXLINE(  29)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  29)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  30)		this->queryStanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("id",db,5b,00,00),this->queryId)
             			->setFixed(1,HX_("to",7b,65,00,00),to)
diff --git a/Sources/c_borogove/src/borogove/queries/DiscoInfoGet.cpp b/Sources/c_borogove/src/borogove/queries/DiscoInfoGet.cpp
index 39e293e..d2eced8 100644
--- a/Sources/c_borogove/src/borogove/queries/DiscoInfoGet.cpp
+++ b/Sources/c_borogove/src/borogove/queries/DiscoInfoGet.cpp
@@ -4,12 +4,12 @@
 #ifndef INCLUDED_Reflect
 #include <Reflect.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_Caps
 #include <borogove/Caps.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
-#endif
 #ifndef INCLUDED_borogove_Identity
 #include <borogove/Identity.h>
 #endif
@@ -39,7 +39,7 @@ HXLINE(  20)		 ::Dynamic attr =  ::Dynamic(::hx::Anon_obj::Create(1)
 HXLINE(  21)		if (::hx::IsNotNull( node )) {
 HXLINE(  21)			::Reflect_obj::setField(attr,HX_("node",02,0a,0a,49),node);
             		}
-HXLINE(  23)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  23)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  24)		this->queryStanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("id",db,5b,00,00),this->queryId)
             			->setFixed(1,HX_("to",7b,65,00,00),to)
diff --git a/Sources/c_borogove/src/borogove/queries/DiscoItemsGet.cpp b/Sources/c_borogove/src/borogove/queries/DiscoItemsGet.cpp
index 4d49ddb..a7763ad 100644
--- a/Sources/c_borogove/src/borogove/queries/DiscoItemsGet.cpp
+++ b/Sources/c_borogove/src/borogove/queries/DiscoItemsGet.cpp
@@ -4,8 +4,8 @@
 #ifndef INCLUDED_Reflect
 #include <Reflect.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_JID
 #include <borogove/JID.h>
@@ -36,7 +36,7 @@ HXLINE(  20)		 ::Dynamic attr =  ::Dynamic(::hx::Anon_obj::Create(1)
 HXLINE(  21)		if (::hx::IsNotNull( node )) {
 HXLINE(  21)			::Reflect_obj::setField(attr,HX_("node",02,0a,0a,49),node);
             		}
-HXLINE(  23)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  23)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  24)		this->queryStanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("id",db,5b,00,00),this->queryId)
             			->setFixed(1,HX_("to",7b,65,00,00),to)
diff --git a/Sources/c_borogove/src/borogove/queries/ExtDiscoGet.cpp b/Sources/c_borogove/src/borogove/queries/ExtDiscoGet.cpp
index e0c4a29..5e5fd60 100644
--- a/Sources/c_borogove/src/borogove/queries/ExtDiscoGet.cpp
+++ b/Sources/c_borogove/src/borogove/queries/ExtDiscoGet.cpp
@@ -1,8 +1,8 @@
 // Generated by Haxe 4.3.3
 #include <hxcpp.h>
 
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
@@ -25,7 +25,7 @@ void ExtDiscoGet_obj::__construct(::String to){
 HXLINE(  15)		this->queryId = null();
 HXLINE(  14)		this->xmlns = HX_("urn:xmpp:extdisco:2",4d,7d,5d,75);
 HXLINE(  20)		super::__construct();
-HXLINE(  22)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  22)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  23)		this->queryStanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("id",db,5b,00,00),this->queryId)
             			->setFixed(1,HX_("to",7b,65,00,00),to)
diff --git a/Sources/c_borogove/src/borogove/queries/HttpUploadSlot.cpp b/Sources/c_borogove/src/borogove/queries/HttpUploadSlot.cpp
index 236f8ba..b5adfcd 100644
--- a/Sources/c_borogove/src/borogove/queries/HttpUploadSlot.cpp
+++ b/Sources/c_borogove/src/borogove/queries/HttpUploadSlot.cpp
@@ -7,12 +7,12 @@
 #ifndef INCLUDED_Std
 #include <Std.h>
 #endif
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
+#endif
 #ifndef INCLUDED_borogove_Hash
 #include <borogove/Hash.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
-#endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
 #endif
@@ -46,7 +46,7 @@ void HttpUploadSlot_obj::__construct(::String to,::String filename,int size,::St
 HXLINE(  18)		this->queryId = null();
 HXLINE(  17)		this->xmlns = HX_("urn:xmpp:http:upload:0",0d,db,46,68);
 HXLINE(  22)		super::__construct();
-HXLINE(  24)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  24)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  25)		 ::borogove::Stanza _hx_tmp =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("id",db,5b,00,00),this->queryId)
             			->setFixed(1,HX_("to",7b,65,00,00),to)
diff --git a/Sources/c_borogove/src/borogove/queries/JabberIqGatewayGet.cpp b/Sources/c_borogove/src/borogove/queries/JabberIqGatewayGet.cpp
index d2e99f9..c1b5ffe 100644
--- a/Sources/c_borogove/src/borogove/queries/JabberIqGatewayGet.cpp
+++ b/Sources/c_borogove/src/borogove/queries/JabberIqGatewayGet.cpp
@@ -1,8 +1,8 @@
 // Generated by Haxe 4.3.3
 #include <hxcpp.h>
 
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
@@ -28,7 +28,7 @@ void JabberIqGatewayGet_obj::__construct(::String to,::String prompt){
 HXLINE(  16)		this->queryId = null();
 HXLINE(  15)		this->xmlns = HX_("jabber:iq:gateway",c8,db,57,c1);
 HXLINE(  21)		super::__construct();
-HXLINE(  22)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  22)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  25)		::String _hx_tmp;
 HXDLIN(  25)		if (::hx::IsNull( prompt )) {
 HXLINE(  25)			_hx_tmp = HX_("get",96,80,4e,00);
diff --git a/Sources/c_borogove/src/borogove/queries/MAMQuery.cpp b/Sources/c_borogove/src/borogove/queries/MAMQuery.cpp
index 2288b52..580c03d 100644
--- a/Sources/c_borogove/src/borogove/queries/MAMQuery.cpp
+++ b/Sources/c_borogove/src/borogove/queries/MAMQuery.cpp
@@ -7,8 +7,8 @@
 #ifndef INCLUDED_Std
 #include <Std.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
@@ -36,7 +36,7 @@ void MAMQuery_obj::__construct( ::Dynamic params,::String jid){
 HXLINE(  33)		this->queryId = null();
 HXLINE(  32)		this->xmlns = HX_("urn:xmpp:mam:2",f5,ef,8c,da);
 HXLINE(  58)		super::__construct();
-HXLINE(  60)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  60)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  61)		this->queryStanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("to",7b,65,00,00),jid)
             			->setFixed(1,HX_("type",ba,f2,08,4d),HX_("set",a2,9b,57,00))))->tag(HX_("query",08,8b,ea,5d), ::Dynamic(::hx::Anon_obj::Create(2)
diff --git a/Sources/c_borogove/src/borogove/queries/PubsubGet.cpp b/Sources/c_borogove/src/borogove/queries/PubsubGet.cpp
index a4bb9cf..25af093 100644
--- a/Sources/c_borogove/src/borogove/queries/PubsubGet.cpp
+++ b/Sources/c_borogove/src/borogove/queries/PubsubGet.cpp
@@ -4,8 +4,8 @@
 #ifndef INCLUDED_Reflect
 #include <Reflect.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
@@ -33,7 +33,7 @@ HXLINE(  20)		if (::hx::IsNotNull( this->ver )) {
 HXLINE(  20)			::Reflect_obj::setField( ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("node",02,0a,0a,49),node)),HX_("ver",63,e2,59,00),this->ver);
             		}
-HXLINE(  22)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  22)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  23)		this->queryStanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("id",db,5b,00,00),this->queryId)
             			->setFixed(1,HX_("to",7b,65,00,00),to)
diff --git a/Sources/c_borogove/src/borogove/queries/Push2Disable.cpp b/Sources/c_borogove/src/borogove/queries/Push2Disable.cpp
index 81e8739..a9e8e8c 100644
--- a/Sources/c_borogove/src/borogove/queries/Push2Disable.cpp
+++ b/Sources/c_borogove/src/borogove/queries/Push2Disable.cpp
@@ -1,8 +1,8 @@
 // Generated by Haxe 4.3.3
 #include <hxcpp.h>
 
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
@@ -24,7 +24,7 @@ void Push2Disable_obj::__construct(::String to){
 HXLINE(  12)		this->queryId = null();
 HXLINE(  11)		this->xmlns = HX_("urn:xmpp:push2:0",32,b1,53,5a);
 HXLINE(  16)		super::__construct();
-HXLINE(  17)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  17)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  18)		this->queryStanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("id",db,5b,00,00),this->queryId)
             			->setFixed(1,HX_("to",7b,65,00,00),to)
diff --git a/Sources/c_borogove/src/borogove/queries/Push2Enable.cpp b/Sources/c_borogove/src/borogove/queries/Push2Enable.cpp
index b103ab3..e9f5413 100644
--- a/Sources/c_borogove/src/borogove/queries/Push2Enable.cpp
+++ b/Sources/c_borogove/src/borogove/queries/Push2Enable.cpp
@@ -4,8 +4,8 @@
 #ifndef INCLUDED_Std
 #include <Std.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
@@ -39,7 +39,7 @@ void Push2Enable_obj::__construct(::String to,::String service,::String client,
 HXLINE(  12)		this->queryId = null();
 HXLINE(  11)		this->xmlns = HX_("urn:xmpp:push2:0",32,b1,53,5a);
 HXLINE(  16)		super::__construct();
-HXLINE(  17)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  17)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  18)		this->queryStanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("id",db,5b,00,00),this->queryId)
             			->setFixed(1,HX_("to",7b,65,00,00),to)
diff --git a/Sources/c_borogove/src/borogove/queries/RosterGet.cpp b/Sources/c_borogove/src/borogove/queries/RosterGet.cpp
index d0d2750..fb86541 100644
--- a/Sources/c_borogove/src/borogove/queries/RosterGet.cpp
+++ b/Sources/c_borogove/src/borogove/queries/RosterGet.cpp
@@ -4,8 +4,8 @@
 #ifndef INCLUDED_Reflect
 #include <Reflect.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_Stanza
 #include <borogove/Stanza.h>
@@ -34,7 +34,7 @@ HXLINE(  20)		 ::Dynamic attr =  ::Dynamic(::hx::Anon_obj::Create(1)
 HXLINE(  21)		if (::hx::IsNotNull( ver )) {
 HXLINE(  21)			::Reflect_obj::setField(attr,HX_("ver",63,e2,59,00),ver);
             		}
-HXLINE(  23)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  23)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  24)		this->queryStanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("type",ba,f2,08,4d),HX_("get",96,80,4e,00))))->tag(HX_("query",08,8b,ea,5d),attr)->up();
             	}
@@ -88,17 +88,32 @@ HXDLIN(  45)					{
 HXLINE(  45)						 ::borogove::Stanza item = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this,i)) );
 HXLINE(  46)						::String inValue = ( (::String)(::Reflect_obj::field(item->attr,HX_("jid",c5,ca,50,00))) );
 HXLINE(  47)						::String inValue1 = ( (::String)(::Reflect_obj::field(item->attr,HX_("name",4b,72,ff,48))) );
-HXLINE(  45)						 ::Dynamic inValue2 =  ::Dynamic(::hx::Anon_obj::Create(3)
+HXLINE(  48)						::String inValue2 = ( (::String)(::Reflect_obj::field(item->attr,HX_("subscription",1d,ff,00,36))) );
+HXLINE(  49)						::Array< ::Dynamic> _this1 = item->allTags(HX_("group",3f,b3,f4,99),null());
+HXDLIN(  49)						::Array< ::String > result1 = ::Array_obj< ::String >::__new(_this1->length);
+HXDLIN(  49)						{
+HXLINE(  49)							int _g2 = 0;
+HXDLIN(  49)							int _g3 = _this1->length;
+HXDLIN(  49)							while((_g2 < _g3)){
+HXLINE(  49)								_g2 = (_g2 + 1);
+HXDLIN(  49)								int i1 = (_g2 - 1);
+HXDLIN(  49)								{
+HXLINE(  49)									::String inValue3 = ( ( ::borogove::Stanza)(_hx_array_unsafe_get(_this1,i1)) )->getText();
+HXDLIN(  49)									result1->__unsafe_set(i1,inValue3);
+            								}
+            							}
+            						}
+HXLINE(  45)						result->__unsafe_set(i, ::Dynamic(::hx::Anon_obj::Create(4)
             							->setFixed(0,HX_("fn",48,59,00,00),inValue1)
             							->setFixed(1,HX_("jid",c5,ca,50,00),inValue)
-            							->setFixed(2,HX_("subscription",1d,ff,00,36),( (::String)(::Reflect_obj::field(item->attr,HX_("subscription",1d,ff,00,36))) )));
-HXDLIN(  45)						result->__unsafe_set(i,inValue2);
+            							->setFixed(2,HX_("groups",54,24,28,1c),result1)
+            							->setFixed(3,HX_("subscription",1d,ff,00,36),inValue2)));
             					}
             				}
             			}
 HXDLIN(  45)			this->result = result;
             		}
-HXLINE(  51)		return this->result;
+HXLINE(  52)		return this->result;
             	}
 
 
diff --git a/Sources/c_borogove/src/borogove/queries/VcardTempGet.cpp b/Sources/c_borogove/src/borogove/queries/VcardTempGet.cpp
index 93dedd3..b04c6ee 100644
--- a/Sources/c_borogove/src/borogove/queries/VcardTempGet.cpp
+++ b/Sources/c_borogove/src/borogove/queries/VcardTempGet.cpp
@@ -4,8 +4,8 @@
 #ifndef INCLUDED_StringTools
 #include <StringTools.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
+#ifndef INCLUDED__UUIDv7_UUIDv7_Fields_
+#include <_UUIDv7/UUIDv7_Fields_.h>
 #endif
 #ifndef INCLUDED_borogove_JID
 #include <borogove/JID.h>
@@ -37,7 +37,7 @@ void VcardTempGet_obj::__construct( ::borogove::JID to){
 HXLINE(  16)		this->queryId = null();
 HXLINE(  15)		this->xmlns = HX_("vcard-temp",bb,ee,0c,98);
 HXLINE(  21)		super::__construct();
-HXLINE(  23)		this->queryId = ::borogove::ID_obj::_hx_short();
+HXLINE(  23)		this->queryId = ::_UUIDv7::UUIDv7_Fields__obj::uuidv7();
 HXLINE(  24)		::String _hx_tmp = to->asString();
 HXDLIN(  24)		this->queryStanza =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(3)
             			->setFixed(0,HX_("id",db,5b,00,00),this->queryId)
diff --git a/Sources/c_borogove/src/borogove/streams/XmppStropheStream.cpp b/Sources/c_borogove/src/borogove/streams/XmppStropheStream.cpp
index be99bfb..1787deb 100644
--- a/Sources/c_borogove/src/borogove/streams/XmppStropheStream.cpp
+++ b/Sources/c_borogove/src/borogove/streams/XmppStropheStream.cpp
@@ -21,9 +21,6 @@
 #ifndef INCLUDED_borogove_GenericStream
 #include <borogove/GenericStream.h>
 #endif
-#ifndef INCLUDED_borogove_ID
-#include <borogove/ID.h>
-#endif
 #ifndef INCLUDED_borogove_IqRequestType
 #include <borogove/IqRequestType.h>
 #endif
@@ -60,25 +57,25 @@
 
 HX_DEFINE_STACK_FRAME(_hx_pos_0c65e41c3007e035_272_new,"borogove.streams.XmppStropheStream","new",0x591fef04,"borogove.streams.XmppStropheStream.new","borogove/streams/XmppStropheStream.hx",272,0x2dd892ee)
 HX_DEFINE_STACK_FRAME(_hx_pos_0c65e41c3007e035_239_new,"borogove.streams.XmppStropheStream","new",0x591fef04,"borogove.streams.XmppStropheStream.new","borogove/streams/XmppStropheStream.hx",239,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_296_newId,"borogove.streams.XmppStropheStream","newId",0xd43cf7ff,"borogove.streams.XmppStropheStream.newId","borogove/streams/XmppStropheStream.hx",296,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_385_onIq,"borogove.streams.XmppStropheStream","onIq",0xa38117c3,"borogove.streams.XmppStropheStream.onIq","borogove/streams/XmppStropheStream.hx",385,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_424_connect,"borogove.streams.XmppStropheStream","connect",0x376a7c8e,"borogove.streams.XmppStropheStream.connect","borogove/streams/XmppStropheStream.hx",424,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_437_disconnect,"borogove.streams.XmppStropheStream","disconnect",0x8fa92238,"borogove.streams.XmppStropheStream.disconnect","borogove/streams/XmppStropheStream.hx",437,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_442_poll,"borogove.streams.XmppStropheStream","poll",0xa42b2f1b,"borogove.streams.XmppStropheStream.poll","borogove/streams/XmppStropheStream.hx",442,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_381_onIq,"borogove.streams.XmppStropheStream","onIq",0xa38117c3,"borogove.streams.XmppStropheStream.onIq","borogove/streams/XmppStropheStream.hx",381,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_422_connect,"borogove.streams.XmppStropheStream","connect",0x376a7c8e,"borogove.streams.XmppStropheStream.connect","borogove/streams/XmppStropheStream.hx",422,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_435_disconnect,"borogove.streams.XmppStropheStream","disconnect",0x8fa92238,"borogove.streams.XmppStropheStream.disconnect","borogove/streams/XmppStropheStream.hx",435,0x2dd892ee)
 HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_440_poll,"borogove.streams.XmppStropheStream","poll",0xa42b2f1b,"borogove.streams.XmppStropheStream.poll","borogove/streams/XmppStropheStream.hx",440,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_525_sendStanza,"borogove.streams.XmppStropheStream","sendStanza",0xcdb24339,"borogove.streams.XmppStropheStream.sendStanza","borogove/streams/XmppStropheStream.hx",525,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_533_finalize,"borogove.streams.XmppStropheStream","finalize",0x8048947a,"borogove.streams.XmppStropheStream.finalize","borogove/streams/XmppStropheStream.hx",533,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_299_strophe_certfail_handler,"borogove.streams.XmppStropheStream","strophe_certfail_handler",0x762926d9,"borogove.streams.XmppStropheStream.strophe_certfail_handler","borogove/streams/XmppStropheStream.hx",299,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_317_strophe_fast_token_handler,"borogove.streams.XmppStropheStream","strophe_fast_token_handler",0x01296ced,"borogove.streams.XmppStropheStream.strophe_fast_token_handler","borogove/streams/XmppStropheStream.hx",317,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_323_strophe_sm_handler,"borogove.streams.XmppStropheStream","strophe_sm_handler",0x892f1fb1,"borogove.streams.XmppStropheStream.strophe_sm_handler","borogove/streams/XmppStropheStream.hx",323,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_329_strophe_sm_ack_handler,"borogove.streams.XmppStropheStream","strophe_sm_ack_handler",0xbb54dafb,"borogove.streams.XmppStropheStream.strophe_sm_ack_handler","borogove/streams/XmppStropheStream.hx",329,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_335_strophe_sm_fail_handler,"borogove.streams.XmppStropheStream","strophe_sm_fail_handler",0x56025be2,"borogove.streams.XmppStropheStream.strophe_sm_fail_handler","borogove/streams/XmppStropheStream.hx",335,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_341_strophe_stanza,"borogove.streams.XmppStropheStream","strophe_stanza",0x9ef00fc1,"borogove.streams.XmppStropheStream.strophe_stanza","borogove/streams/XmppStropheStream.hx",341,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_388_strophe_connect,"borogove.streams.XmppStropheStream","strophe_connect",0x56231c9e,"borogove.streams.XmppStropheStream.strophe_connect","borogove/streams/XmppStropheStream.hx",388,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_449_parseStanza,"borogove.streams.XmppStropheStream","parseStanza",0xf2f56d2c,"borogove.streams.XmppStropheStream.parseStanza","borogove/streams/XmppStropheStream.hx",449,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_458_serializeStanza,"borogove.streams.XmppStropheStream","serializeStanza",0xb8bb5c99,"borogove.streams.XmppStropheStream.serializeStanza","borogove/streams/XmppStropheStream.hx",458,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_471_convertToStanza,"borogove.streams.XmppStropheStream","convertToStanza",0xfb6eef87,"borogove.streams.XmppStropheStream.convertToStanza","borogove/streams/XmppStropheStream.hx",471,0x2dd892ee)
-HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_499_convertFromStanza,"borogove.streams.XmppStropheStream","convertFromStanza",0xc6cb6876,"borogove.streams.XmppStropheStream.convertFromStanza","borogove/streams/XmppStropheStream.hx",499,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_438_poll,"borogove.streams.XmppStropheStream","poll",0xa42b2f1b,"borogove.streams.XmppStropheStream.poll","borogove/streams/XmppStropheStream.hx",438,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_523_sendStanza,"borogove.streams.XmppStropheStream","sendStanza",0xcdb24339,"borogove.streams.XmppStropheStream.sendStanza","borogove/streams/XmppStropheStream.hx",523,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_531_finalize,"borogove.streams.XmppStropheStream","finalize",0x8048947a,"borogove.streams.XmppStropheStream.finalize","borogove/streams/XmppStropheStream.hx",531,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_295_strophe_certfail_handler,"borogove.streams.XmppStropheStream","strophe_certfail_handler",0x762926d9,"borogove.streams.XmppStropheStream.strophe_certfail_handler","borogove/streams/XmppStropheStream.hx",295,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_313_strophe_fast_token_handler,"borogove.streams.XmppStropheStream","strophe_fast_token_handler",0x01296ced,"borogove.streams.XmppStropheStream.strophe_fast_token_handler","borogove/streams/XmppStropheStream.hx",313,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_319_strophe_sm_handler,"borogove.streams.XmppStropheStream","strophe_sm_handler",0x892f1fb1,"borogove.streams.XmppStropheStream.strophe_sm_handler","borogove/streams/XmppStropheStream.hx",319,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_325_strophe_sm_ack_handler,"borogove.streams.XmppStropheStream","strophe_sm_ack_handler",0xbb54dafb,"borogove.streams.XmppStropheStream.strophe_sm_ack_handler","borogove/streams/XmppStropheStream.hx",325,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_331_strophe_sm_fail_handler,"borogove.streams.XmppStropheStream","strophe_sm_fail_handler",0x56025be2,"borogove.streams.XmppStropheStream.strophe_sm_fail_handler","borogove/streams/XmppStropheStream.hx",331,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_337_strophe_stanza,"borogove.streams.XmppStropheStream","strophe_stanza",0x9ef00fc1,"borogove.streams.XmppStropheStream.strophe_stanza","borogove/streams/XmppStropheStream.hx",337,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_384_strophe_connect,"borogove.streams.XmppStropheStream","strophe_connect",0x56231c9e,"borogove.streams.XmppStropheStream.strophe_connect","borogove/streams/XmppStropheStream.hx",384,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_402_strophe_connect,"borogove.streams.XmppStropheStream","strophe_connect",0x56231c9e,"borogove.streams.XmppStropheStream.strophe_connect","borogove/streams/XmppStropheStream.hx",402,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_447_parseStanza,"borogove.streams.XmppStropheStream","parseStanza",0xf2f56d2c,"borogove.streams.XmppStropheStream.parseStanza","borogove/streams/XmppStropheStream.hx",447,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_456_serializeStanza,"borogove.streams.XmppStropheStream","serializeStanza",0xb8bb5c99,"borogove.streams.XmppStropheStream.serializeStanza","borogove/streams/XmppStropheStream.hx",456,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_469_convertToStanza,"borogove.streams.XmppStropheStream","convertToStanza",0xfb6eef87,"borogove.streams.XmppStropheStream.convertToStanza","borogove/streams/XmppStropheStream.hx",469,0x2dd892ee)
+HX_LOCAL_STACK_FRAME(_hx_pos_0c65e41c3007e035_497_convertFromStanza,"borogove.streams.XmppStropheStream","convertFromStanza",0xc6cb6876,"borogove.streams.XmppStropheStream.convertFromStanza","borogove/streams/XmppStropheStream.hx",497,0x2dd892ee)
 
 xmpp_log_t *logger = xmpp_get_default_logger(XMPP_LEVEL_DEBUG);
 xmpp_ctx_t* borogove::streams::XmppStropheStream_obj::ctx = xmpp_ctx_new(0,logger);
@@ -182,229 +179,226 @@ bool XmppStropheStream_obj::_hx_isInstanceOf(int inClassId) {
 	}
 }
 
-::String XmppStropheStream_obj::newId(){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_296_newId)
-HXDLIN( 296)		return ::borogove::ID_obj::_hx_long();
-            	}
-
-
 void XmppStropheStream_obj::onIq( ::borogove::IqRequestType type,::String tag,::String xmlns, ::Dynamic handler){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_385_onIq)
-HXDLIN( 385)		this->iqHandlers->get(type).StaticCast<  ::haxe::ds::StringMap >()->set((((HX_("{",7b,00,00,00) + xmlns) + HX_("}",7d,00,00,00)) + tag),handler);
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_381_onIq)
+HXDLIN( 381)		this->iqHandlers->get(type).StaticCast<  ::haxe::ds::StringMap >()->set((((HX_("{",7b,00,00,00) + xmlns) + HX_("}",7d,00,00,00)) + tag),handler);
             	}
 
 
 void XmppStropheStream_obj::connect(::String jid,::Array< unsigned char > sm){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_424_connect)
-HXLINE( 425)		::haxe::Log_obj::trace(HX_("SM data",70,2f,26,f4), ::Dynamic(::hx::Anon_obj::Create(5)
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_422_connect)
+HXLINE( 423)		::haxe::Log_obj::trace(HX_("SM data",70,2f,26,f4), ::Dynamic(::hx::Anon_obj::Create(5)
             			->setFixed(0,HX_("className",a3,92,3d,dc),HX_("borogove.streams.XmppStropheStream",12,5d,bb,9f))
             			->setFixed(1,HX_("customParams",d7,51,18,ed),::cpp::VirtualArray_obj::__new(1)->init(0,sm))
             			->setFixed(2,HX_("methodName",cc,19,0f,12),HX_("connect",ea,3b,80,15))
             			->setFixed(3,HX_("fileName",e7,5a,43,62),HX_("borogove/streams/XmppStropheStream.hx",ee,92,d8,2d))
-            			->setFixed(4,HX_("lineNumber",dd,81,22,76),425)));
-HXLINE( 426)		::cpp::Pointer< char > tmp = cpp::Pointer_obj::fromPointer(jid.c_str());
-HXDLIN( 426)		xmpp_conn_set_jid(this->conn,tmp);
-HXLINE( 427)		if (::hx::IsNotNull( sm )) {
-HXLINE( 429)			const unsigned char* smPtr = (unsigned char*)sm->getBase();
-HXLINE( 430)			xmpp_conn_restore_sm_state(this->conn,smPtr,( (size_t)(sm->length) ));
+            			->setFixed(4,HX_("lineNumber",dd,81,22,76),423)));
+HXLINE( 424)		::cpp::Pointer< char > tmp = cpp::Pointer_obj::fromPointer(jid.c_str());
+HXDLIN( 424)		xmpp_conn_set_jid(this->conn,tmp);
+HXLINE( 430)		this->trigger(HX_("auth/password-needed",80,f0,74,49), ::Dynamic(::hx::Anon_obj::Create(0)));
+HXLINE( 431)		 ::Dynamic _hx_tmp;
+HXDLIN( 431)		if (this->stanzaThisPoll) {
+HXLINE( 431)			_hx_tmp = 5;
             		}
-HXLINE( 432)		this->trigger(HX_("auth/password-needed",80,f0,74,49), ::Dynamic(::hx::Anon_obj::Create(0)));
-HXLINE( 433)		this->poll(null());
+            		else {
+HXLINE( 431)			_hx_tmp = 100;
+            		}
+HXDLIN( 431)		this->poll(_hx_tmp);
             	}
 
 
 void XmppStropheStream_obj::disconnect(){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_437_disconnect)
-HXDLIN( 437)		xmpp_disconnect(this->conn);
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_435_disconnect)
+HXDLIN( 435)		xmpp_disconnect(this->conn);
             	}
 
 
 void XmppStropheStream_obj::poll( ::Dynamic __o_timeout){
             		HX_BEGIN_LOCAL_FUNC_S1(::hx::LocalFunc,_hx_Closure_0, ::borogove::streams::XmppStropheStream,_gthis) HXARGC(0)
             		void _hx_run(){
-            			HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_442_poll)
-HXLINE( 443)			_gthis->stanzaThisPoll = false;
-HXLINE( 444)			xmpp_run_once(::borogove::streams::XmppStropheStream_obj::ctx,( (::cpp::UInt64)(5) ));
-HXLINE( 445)			 ::Dynamic _hx_tmp;
-HXDLIN( 445)			if (_gthis->stanzaThisPoll) {
-HXLINE( 445)				_hx_tmp = 5;
+            			HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_440_poll)
+HXLINE( 441)			_gthis->stanzaThisPoll = false;
+HXLINE( 442)			xmpp_run_once(::borogove::streams::XmppStropheStream_obj::ctx,( (::cpp::UInt64)(5) ));
+HXLINE( 443)			 ::Dynamic _hx_tmp;
+HXDLIN( 443)			if (_gthis->stanzaThisPoll) {
+HXLINE( 443)				_hx_tmp = 5;
             			}
             			else {
-HXLINE( 445)				_hx_tmp = 100;
+HXLINE( 443)				_hx_tmp = 100;
             			}
-HXDLIN( 445)			_gthis->poll(_hx_tmp);
+HXDLIN( 443)			_gthis->poll(_hx_tmp);
             		}
             		HX_END_LOCAL_FUNC0((void))
 
             		 ::Dynamic timeout = __o_timeout;
             		if (::hx::IsNull(__o_timeout)) timeout = 100;
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_440_poll)
-HXDLIN( 440)		 ::borogove::streams::XmppStropheStream _gthis = ::hx::ObjectPtr<OBJ_>(this);
-HXLINE( 441)		if (::hx::IsNotNull( this->pollTimer )) {
-HXLINE( 441)			this->pollTimer->stop();
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_438_poll)
+HXDLIN( 438)		 ::borogove::streams::XmppStropheStream _gthis = ::hx::ObjectPtr<OBJ_>(this);
+HXLINE( 439)		if (::hx::IsNotNull( this->pollTimer )) {
+HXLINE( 439)			this->pollTimer->stop();
             		}
-HXLINE( 442)		this->pollTimer = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_0(_gthis)),( (int)(timeout) ));
+HXLINE( 440)		this->pollTimer = ::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_0(_gthis)),( (int)(timeout) ));
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(XmppStropheStream_obj,poll,(void))
 
 void XmppStropheStream_obj::sendStanza( ::borogove::Stanza stanza){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_525_sendStanza)
-HXDLIN( 525)		if (this->ready) {
-HXLINE( 526)			 xmpp_conn_t* _hx_tmp = this->conn;
-HXDLIN( 526)			xmpp_send(_hx_tmp,::borogove::streams::XmppStropheStream_obj::convertFromStanza(stanza));
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_523_sendStanza)
+HXDLIN( 523)		if (this->ready) {
+HXLINE( 524)			 xmpp_conn_t* _hx_tmp = this->conn;
+HXDLIN( 524)			xmpp_send(_hx_tmp,::borogove::streams::XmppStropheStream_obj::convertFromStanza(stanza));
             		}
             		else {
-HXLINE( 528)			this->pending->push(stanza);
+HXLINE( 526)			this->pending->push(stanza);
             		}
             	}
 
 
 void XmppStropheStream_obj::finalize(){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_533_finalize)
-HXDLIN( 533)		xmpp_conn_release(this->conn);
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_531_finalize)
+HXDLIN( 531)		xmpp_conn_release(this->conn);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC0(XmppStropheStream_obj,finalize,(void))
 
 int XmppStropheStream_obj::strophe_certfail_handler( const xmpp_tlscert_t* cert,const char* err){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_299_strophe_certfail_handler)
-HXLINE( 300)		void* userdata = xmpp_tlscert_get_userdata(cert);
-HXLINE( 301)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
-HXLINE( 302)		::Array< ::String > dnsNames = ::Array_obj< ::String >::__new(0);
-HXLINE( 303)		::cpp::Pointer< char > dnsName = null();
-HXLINE( 304)		int dnsNameN = 0;
-HXLINE( 305)		while(true){
-HXLINE( 305)			dnsNameN = (dnsNameN + 1);
-HXDLIN( 305)			dnsName = xmpp_tlscert_get_dnsname(cert,( (size_t)((dnsNameN - 1)) ));
-HXDLIN( 305)			if (!(::hx::IsNotNull( dnsName ))) {
-HXLINE( 305)				goto _hx_goto_10;
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_295_strophe_certfail_handler)
+HXLINE( 296)		void* userdata = xmpp_tlscert_get_userdata(cert);
+HXLINE( 297)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
+HXLINE( 298)		::Array< ::String > dnsNames = ::Array_obj< ::String >::__new(0);
+HXLINE( 299)		::cpp::Pointer< char > dnsName = null();
+HXLINE( 300)		int dnsNameN = 0;
+HXLINE( 301)		while(true){
+HXLINE( 301)			dnsNameN = (dnsNameN + 1);
+HXDLIN( 301)			dnsName = xmpp_tlscert_get_dnsname(cert,( (size_t)((dnsNameN - 1)) ));
+HXDLIN( 301)			if (!(::hx::IsNotNull( dnsName ))) {
+HXLINE( 301)				goto _hx_goto_9;
             			}
-HXLINE( 306)			dnsNames->push( ::String(dnsName->ptr));
+HXLINE( 302)			dnsNames->push( ::String(dnsName->ptr));
             		}
-            		_hx_goto_10:;
-HXLINE( 308)		::cpp::Pointer< char > inPtr = xmpp_tlscert_get_pem(cert);
-HXDLIN( 308)		::String pem =  ::String(inPtr->ptr);
-HXLINE( 309)		 ::borogove::EventResult _g = stream->trigger(HX_("tls/check",74,a0,4c,75), ::Dynamic(::hx::Anon_obj::Create(2)
+            		_hx_goto_9:;
+HXLINE( 304)		::cpp::Pointer< char > inPtr = xmpp_tlscert_get_pem(cert);
+HXDLIN( 304)		::String pem =  ::String(inPtr->ptr);
+HXLINE( 305)		 ::borogove::EventResult _g = stream->trigger(HX_("tls/check",74,a0,4c,75), ::Dynamic(::hx::Anon_obj::Create(2)
             			->setFixed(0,HX_("pem",d8,54,55,00),pem)
             			->setFixed(1,HX_("dnsNames",5f,19,aa,5a),dnsNames)));
-HXDLIN( 309)		if ((_g->_hx_getIndex() == 3)) {
-HXLINE( 310)			 ::Dynamic result = _g->_hx_getObject(0);
-HXLINE( 311)			if (( (bool)(result) )) {
-HXLINE( 311)				return 1;
+HXDLIN( 305)		if ((_g->_hx_getIndex() == 3)) {
+HXLINE( 306)			 ::Dynamic result = _g->_hx_getObject(0);
+HXLINE( 307)			if (( (bool)(result) )) {
+HXLINE( 307)				return 1;
             			}
             			else {
-HXLINE( 311)				return 0;
+HXLINE( 307)				return 0;
             			}
             		}
             		else {
-HXLINE( 313)			return 0;
+HXLINE( 309)			return 0;
             		}
-HXLINE( 309)		return 0;
+HXLINE( 305)		return 0;
             	}
 
 
 void XmppStropheStream_obj::strophe_fast_token_handler( xmpp_conn_t* conn,const char* token,void* userdata){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_317_strophe_fast_token_handler)
-HXLINE( 318)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
-HXLINE( 319)		::cpp::Pointer< char > inPtr = cpp::Pointer_obj::fromRaw(token);
-HXDLIN( 319)		::String token1 =  ::String(inPtr->ptr);
-HXLINE( 320)		stream->trigger(HX_("fast-token",48,5f,c2,26), ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_313_strophe_fast_token_handler)
+HXLINE( 314)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
+HXLINE( 315)		::cpp::Pointer< char > inPtr = cpp::Pointer_obj::fromRaw(token);
+HXDLIN( 315)		::String token1 =  ::String(inPtr->ptr);
+HXLINE( 316)		stream->trigger(HX_("fast-token",48,5f,c2,26), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("token",f9,82,2b,14),token1)));
             	}
 
 
 void XmppStropheStream_obj::strophe_sm_handler( xmpp_conn_t* conn,void* userdata,const unsigned char* sm_state,size_t sm_state_len){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_323_strophe_sm_handler)
-HXLINE( 324)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
-HXLINE( 325)		::cpp::Pointer<  ::Dynamic > _this = cpp::Pointer_obj::fromRaw(sm_state)->reinterpret();
-HXDLIN( 325)		::cpp::VirtualArray result = ::cpp::VirtualArray_obj::__new();
-HXDLIN( 325)		::cpp::Pointer<  ::Dynamic > tmp = _this;
-HXDLIN( 325)		result->setUnmanagedData(tmp,( (int)(sm_state_len) ));
-HXDLIN( 325)		::cpp::VirtualArray bytes = result->copy();
-HXLINE( 326)		stream->trigger(HX_("sm/update",1e,16,63,46), ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_319_strophe_sm_handler)
+HXLINE( 320)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
+HXLINE( 321)		::cpp::Pointer<  ::Dynamic > _this = cpp::Pointer_obj::fromRaw(sm_state)->reinterpret();
+HXDLIN( 321)		::cpp::VirtualArray result = ::cpp::VirtualArray_obj::__new();
+HXDLIN( 321)		::cpp::Pointer<  ::Dynamic > tmp = _this;
+HXDLIN( 321)		result->setUnmanagedData(tmp,( (int)(sm_state_len) ));
+HXDLIN( 321)		::cpp::VirtualArray bytes = result->copy();
+HXLINE( 322)		stream->trigger(HX_("sm/update",1e,16,63,46), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("sm",9a,64,00,00),bytes)));
             	}
 
 
 void XmppStropheStream_obj::strophe_sm_ack_handler( xmpp_conn_t* conn,void* userdata,const char* id){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_329_strophe_sm_ack_handler)
-HXLINE( 330)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
-HXLINE( 331)		::cpp::Pointer< char > inPtr = cpp::Pointer_obj::fromRaw(id);
-HXDLIN( 331)		::String sid =  ::String(inPtr->ptr);
-HXLINE( 332)		stream->trigger(HX_("sm/ack",14,b2,12,dd), ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_325_strophe_sm_ack_handler)
+HXLINE( 326)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
+HXLINE( 327)		::cpp::Pointer< char > inPtr = cpp::Pointer_obj::fromRaw(id);
+HXDLIN( 327)		::String sid =  ::String(inPtr->ptr);
+HXLINE( 328)		stream->trigger(HX_("sm/ack",14,b2,12,dd), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("id",db,5b,00,00),sid)));
             	}
 
 
 void XmppStropheStream_obj::strophe_sm_fail_handler( xmpp_conn_t* conn,void* userdata,const char* id){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_335_strophe_sm_fail_handler)
-HXLINE( 336)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
-HXLINE( 337)		::cpp::Pointer< char > inPtr = cpp::Pointer_obj::fromRaw(id);
-HXDLIN( 337)		::String sid =  ::String(inPtr->ptr);
-HXLINE( 338)		stream->trigger(HX_("sm/fail",b3,aa,95,96), ::Dynamic(::hx::Anon_obj::Create(1)
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_331_strophe_sm_fail_handler)
+HXLINE( 332)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
+HXLINE( 333)		::cpp::Pointer< char > inPtr = cpp::Pointer_obj::fromRaw(id);
+HXDLIN( 333)		::String sid =  ::String(inPtr->ptr);
+HXLINE( 334)		stream->trigger(HX_("sm/fail",b3,aa,95,96), ::Dynamic(::hx::Anon_obj::Create(1)
             			->setFixed(0,HX_("id",db,5b,00,00),sid)));
             	}
 
 
 int XmppStropheStream_obj::strophe_stanza( xmpp_conn_t* conn, xmpp_stanza_t* sstanza,void* userdata){
-            	HX_GC_STACKFRAME(&_hx_pos_0c65e41c3007e035_341_strophe_stanza)
-HXLINE( 342)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
-HXLINE( 343)		stream->stanzaThisPoll = true;
-HXLINE( 344)		 ::borogove::Stanza stanza = ::borogove::streams::XmppStropheStream_obj::convertToStanza(sstanza,null());
-HXLINE( 346)		::String xmlns = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("xmlns",dc,31,74,60))) );
-HXLINE( 347)		if ((xmlns == HX_("jabber:client",21,64,c5,e4))) {
-HXLINE( 348)			::String name = stanza->name;
-HXLINE( 349)			if ((name == HX_("iq",e8,5b,00,00))) {
-HXLINE( 350)				::String type = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) );
-HXLINE( 351)				bool _hx_tmp;
-HXDLIN( 351)				if ((type != HX_("result",dd,68,84,08))) {
-HXLINE( 351)					_hx_tmp = (type == HX_("error",c8,cb,29,73));
+            	HX_GC_STACKFRAME(&_hx_pos_0c65e41c3007e035_337_strophe_stanza)
+HXLINE( 338)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
+HXLINE( 339)		stream->stanzaThisPoll = true;
+HXLINE( 340)		 ::borogove::Stanza stanza = ::borogove::streams::XmppStropheStream_obj::convertToStanza(sstanza,null());
+HXLINE( 342)		::String xmlns = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("xmlns",dc,31,74,60))) );
+HXLINE( 343)		if ((xmlns == HX_("jabber:client",21,64,c5,e4))) {
+HXLINE( 344)			::String name = stanza->name;
+HXLINE( 345)			if ((name == HX_("iq",e8,5b,00,00))) {
+HXLINE( 346)				::String type = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("type",ba,f2,08,4d))) );
+HXLINE( 347)				bool _hx_tmp;
+HXDLIN( 347)				if ((type != HX_("result",dd,68,84,08))) {
+HXLINE( 347)					_hx_tmp = (type == HX_("error",c8,cb,29,73));
             				}
             				else {
-HXLINE( 351)					_hx_tmp = true;
+HXLINE( 347)					_hx_tmp = true;
             				}
-HXDLIN( 351)				if (_hx_tmp) {
-HXLINE( 352)					stream->onStanza(stanza);
+HXDLIN( 347)				if (_hx_tmp) {
+HXLINE( 348)					stream->onStanza(stanza);
             				}
             				else {
-HXLINE( 355)					 ::borogove::Stanza child = stanza->getFirstChild();
-HXLINE( 356)					if (::hx::IsNotNull( child )) {
-HXLINE( 357)						 ::borogove::IqRequestType this1;
-HXDLIN( 357)						if ((type == HX_("get",96,80,4e,00))) {
-HXLINE( 357)							this1 = ::borogove::IqRequestType_obj::Get_dyn();
+HXLINE( 351)					 ::borogove::Stanza child = stanza->getFirstChild();
+HXLINE( 352)					if (::hx::IsNotNull( child )) {
+HXLINE( 353)						 ::borogove::IqRequestType this1;
+HXDLIN( 353)						if ((type == HX_("get",96,80,4e,00))) {
+HXLINE( 353)							this1 = ::borogove::IqRequestType_obj::Get_dyn();
             						}
             						else {
-HXLINE( 357)							this1 = ::borogove::IqRequestType_obj::Set_dyn();
+HXLINE( 353)							this1 = ::borogove::IqRequestType_obj::Set_dyn();
             						}
-HXDLIN( 357)						::Dynamic this2 = stream->iqHandlers->get(this1).StaticCast<  ::haxe::ds::StringMap >();
-HXDLIN( 357)						::String key = ((HX_("{",7b,00,00,00) + ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) )) + HX_("}",7d,00,00,00));
-HXDLIN( 357)						 ::Dynamic handler = ( ( ::haxe::ds::StringMap)(this2) )->get((key + child->name));
-HXLINE( 358)						if (::hx::IsNotNull( handler )) {
-HXLINE( 359)							::String reply = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("to",7b,65,00,00))) );
-HXDLIN( 359)							::String reply1 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
-HXDLIN( 359)							 ::borogove::Stanza reply2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(4)
+HXDLIN( 353)						::Dynamic this2 = stream->iqHandlers->get(this1).StaticCast<  ::haxe::ds::StringMap >();
+HXDLIN( 353)						::String key = ((HX_("{",7b,00,00,00) + ( (::String)(::Reflect_obj::field(child->attr,HX_("xmlns",dc,31,74,60))) )) + HX_("}",7d,00,00,00));
+HXDLIN( 353)						 ::Dynamic handler = ( ( ::haxe::ds::StringMap)(this2) )->get((key + child->name));
+HXLINE( 354)						if (::hx::IsNotNull( handler )) {
+HXLINE( 355)							::String reply = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("to",7b,65,00,00))) );
+HXDLIN( 355)							::String reply1 = ( (::String)(::Reflect_obj::field(stanza->attr,HX_("from",6a,a5,c2,43))) );
+HXDLIN( 355)							 ::borogove::Stanza reply2 =  ::borogove::Stanza_obj::__alloc( HX_CTX ,HX_("iq",e8,5b,00,00), ::Dynamic(::hx::Anon_obj::Create(4)
             								->setFixed(0,HX_("id",db,5b,00,00),( (::String)(::Reflect_obj::field(stanza->attr,HX_("id",db,5b,00,00))) ))
             								->setFixed(1,HX_("to",7b,65,00,00),reply1)
             								->setFixed(2,HX_("from",6a,a5,c2,43),reply)
             								->setFixed(3,HX_("type",ba,f2,08,4d),HX_("result",dd,68,84,08))));
-HXLINE( 360)							try {
+HXLINE( 356)							try {
             								HX_STACK_CATCHABLE( ::Dynamic, 0);
-HXLINE( 361)								 ::borogove::IqResult _g = handler(stanza);
-HXDLIN( 361)								switch((int)(_g->_hx_getIndex())){
+HXLINE( 357)								 ::borogove::IqResult _g = handler(stanza);
+HXDLIN( 357)								switch((int)(_g->_hx_getIndex())){
             									case (int)0: {
-HXLINE( 362)										 ::borogove::Stanza el = _g->_hx_getObject(0).StaticCast<  ::borogove::Stanza >();
-HXDLIN( 362)										reply2->addChild(el);
+HXLINE( 358)										 ::borogove::Stanza el = _g->_hx_getObject(0).StaticCast<  ::borogove::Stanza >();
+HXDLIN( 358)										reply2->addChild(el);
             									}
             									break;
             									case (int)1: {
             									}
             									break;
             									case (int)2: {
-HXLINE( 365)										::Reflect_obj::setField(reply2->attr,HX_("result",dd,68,84,08),HX_("error",c8,cb,29,73));
-HXLINE( 366)										reply2->tag(HX_("error",c8,cb,29,73), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 361)										::Reflect_obj::setField(reply2->attr,HX_("result",dd,68,84,08),HX_("error",c8,cb,29,73));
+HXLINE( 362)										reply2->tag(HX_("error",c8,cb,29,73), ::Dynamic(::hx::Anon_obj::Create(1)
             											->setFixed(0,HX_("type",ba,f2,08,4d),HX_("cancel",7a,ed,33,b8))))->tag(HX_("service-unavailable",f8,3c,11,1c), ::Dynamic(::hx::Anon_obj::Create(1)
             											->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:ietf:params:xml:ns:xmpp-stanzas",27,f2,3d,30))));
             									}
@@ -414,8 +408,8 @@ HXLINE( 366)										reply2->tag(HX_("error",c8,cb,29,73), ::Dynamic(::hx::Anon
             								if (_hx_e.IsClass<  ::Dynamic >() ){
             									HX_STACK_BEGIN_CATCH
             									 ::Dynamic _g1 = _hx_e;
-HXLINE( 369)									::Reflect_obj::setField(reply2->attr,HX_("result",dd,68,84,08),HX_("error",c8,cb,29,73));
-HXLINE( 370)									reply2->tag(HX_("error",c8,cb,29,73), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 365)									::Reflect_obj::setField(reply2->attr,HX_("result",dd,68,84,08),HX_("error",c8,cb,29,73));
+HXLINE( 366)									reply2->tag(HX_("error",c8,cb,29,73), ::Dynamic(::hx::Anon_obj::Create(1)
             										->setFixed(0,HX_("type",ba,f2,08,4d),HX_("cancel",7a,ed,33,b8))))->tag(HX_("internal-server-error",ce,6d,55,6c), ::Dynamic(::hx::Anon_obj::Create(1)
             										->setFixed(0,HX_("xmlns",dc,31,74,60),HX_("urn:ietf:params:xml:ns:xmpp-stanzas",27,f2,3d,30))));
             								}
@@ -423,176 +417,184 @@ HXLINE( 370)									reply2->tag(HX_("error",c8,cb,29,73), ::Dynamic(::hx::Anon_
             									HX_STACK_DO_THROW(_hx_e);
             								}
             							}
-HXLINE( 372)							stream->sendStanza(reply2);
+HXLINE( 368)							stream->sendStanza(reply2);
             						}
             					}
             				}
             			}
             			else {
-HXLINE( 377)				stream->onStanza(stanza);
+HXLINE( 373)				stream->onStanza(stanza);
             			}
             		}
-HXLINE( 381)		return 1;
+HXLINE( 377)		return 1;
             	}
 
 
 void XmppStropheStream_obj::strophe_connect( xmpp_conn_t* conn, xmpp_conn_event_t event,int error, xmpp_stream_error_t* stream_error,int resumed,void* userdata){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_388_strophe_connect)
-HXLINE( 389)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
-HXLINE( 390)		if (::hx::IsInstanceEq( event,XMPP_CONN_CONNECT )) {
-HXLINE( 391)			stream->ready = true;
-HXLINE( 392)			while((stream->pending->length > 0)){
-HXLINE( 393)				stream->sendStanza(stream->pending->shift().StaticCast<  ::borogove::Stanza >());
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_384_strophe_connect)
+HXLINE( 385)		 ::borogove::streams::XmppStropheStream stream = static_cast<hx::Object*>(userdata);
+HXLINE( 386)		if (::hx::IsInstanceEq( event,XMPP_CONN_CONNECT )) {
+HXLINE( 387)			stream->ready = true;
+HXLINE( 388)			while((stream->pending->length > 0)){
+HXLINE( 389)				stream->sendStanza(stream->pending->shift().StaticCast<  ::borogove::Stanza >());
             			}
-HXLINE( 395)			stream->trigger(HX_("status/online",10,05,0e,d2), ::Dynamic(::hx::Anon_obj::Create(1)
+HXLINE( 391)			stream->trigger(HX_("status/online",10,05,0e,d2), ::Dynamic(::hx::Anon_obj::Create(1)
             				->setFixed(0,HX_("resumed",17,0e,58,6b),(resumed != 0))));
             		}
-HXLINE( 397)		if (::hx::IsInstanceEq( event,XMPP_CONN_DISCONNECT )) {
-HXLINE( 398)			bool _hx_tmp;
-HXDLIN( 398)			if ((error == 0)) {
-HXLINE( 398)				_hx_tmp = ::hx::IsNull( stream_error );
+HXLINE( 393)		if (::hx::IsInstanceEq( event,XMPP_CONN_DISCONNECT )) {
+HXLINE( 394)			bool _hx_tmp;
+HXDLIN( 394)			if ((error == 0)) {
+HXLINE( 394)				_hx_tmp = ::hx::IsNull( stream_error );
             			}
             			else {
-HXLINE( 398)				_hx_tmp = false;
+HXLINE( 394)				_hx_tmp = false;
             			}
-HXDLIN( 398)			if (_hx_tmp) {
-HXLINE( 400)				stream->trigger(HX_("auth/fail",25,45,e9,d1), ::Dynamic(::hx::Anon_obj::Create(0)));
+HXDLIN( 394)			if (_hx_tmp) {
+HXLINE( 396)				stream->trigger(HX_("auth/fail",25,45,e9,d1), ::Dynamic(::hx::Anon_obj::Create(0)));
             			}
             			else {
-HXLINE( 402)				stream->ready = false;
-HXLINE( 403)				stream->trigger(HX_("status/offline",c6,eb,eb,54), ::Dynamic(::hx::Anon_obj::Create(0)));
-HXLINE( 407)				::cpp::Pointer< char > tmp = null();
-HXLINE( 405)				xmpp_connect_client(conn,tmp,( (unsigned short)(0) ),::cpp::Function< void ( xmpp_conn_t*, xmpp_conn_event_t,int, xmpp_stream_error_t*,int,void*)>(::hx::AnyCast(&::borogove::streams::XmppStropheStream_obj::strophe_connect )),userdata);
+            				HX_BEGIN_LOCAL_FUNC_S2(::hx::LocalFunc,_hx_Closure_0,void*,userdata, xmpp_conn_t*,conn) HXARGC(0)
+            				void _hx_run(){
+            					HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_402_strophe_connect)
+HXLINE( 404)					::cpp::Pointer< char > tmp = null();
+HXLINE( 403)					 xmpp_conn_t* conn1 = conn;
+HXLINE( 402)					xmpp_connect_client(conn1,tmp,( (unsigned short)(0) ),::cpp::Function< void ( xmpp_conn_t*, xmpp_conn_event_t,int, xmpp_stream_error_t*,int,void*)>(::hx::AnyCast(&::borogove::streams::XmppStropheStream_obj::strophe_connect )),userdata);
+            				}
+            				HX_END_LOCAL_FUNC0((void))
+
+HXLINE( 398)				stream->ready = false;
+HXLINE( 399)				stream->trigger(HX_("status/offline",c6,eb,eb,54), ::Dynamic(::hx::Anon_obj::Create(0)));
+HXLINE( 401)				::haxe::Timer_obj::delay( ::Dynamic(new _hx_Closure_0(userdata,conn)),100);
             			}
             		}
-HXLINE( 414)		if (::hx::IsInstanceEq( event,XMPP_CONN_FAIL )) {
-HXLINE( 415)			stream->ready = false;
-HXLINE( 416)			stream->trigger(HX_("status/offline",c6,eb,eb,54), ::Dynamic(::hx::Anon_obj::Create(0)));
+HXLINE( 412)		if (::hx::IsInstanceEq( event,XMPP_CONN_FAIL )) {
+HXLINE( 413)			stream->ready = false;
+HXLINE( 414)			stream->trigger(HX_("status/offline",c6,eb,eb,54), ::Dynamic(::hx::Anon_obj::Create(0)));
             		}
             	}
 
 
  ::borogove::Stanza XmppStropheStream_obj::parseStanza(::String s){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_449_parseStanza)
-HXLINE( 450)		::cpp::Pointer< char > tmp = cpp::Pointer_obj::fromPointer(s.c_str());
-HXDLIN( 450)		 xmpp_stanza_t* sstanza = xmpp_stanza_new_from_string(::borogove::streams::XmppStropheStream_obj::ctx,tmp);
-HXLINE( 451)		if (::hx::IsNull( sstanza )) {
-HXLINE( 451)			HX_STACK_DO_THROW((HX_("Failed to parse stanza: ",6a,ef,ec,9c) + s));
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_447_parseStanza)
+HXLINE( 448)		::cpp::Pointer< char > tmp = cpp::Pointer_obj::fromPointer(s.c_str());
+HXDLIN( 448)		 xmpp_stanza_t* sstanza = xmpp_stanza_new_from_string(::borogove::streams::XmppStropheStream_obj::ctx,tmp);
+HXLINE( 449)		if (::hx::IsNull( sstanza )) {
+HXLINE( 449)			HX_STACK_DO_THROW((HX_("Failed to parse stanza: ",6a,ef,ec,9c) + s));
             		}
-HXLINE( 452)		 ::borogove::Stanza stanza = ::borogove::streams::XmppStropheStream_obj::convertToStanza(sstanza,null());
-HXLINE( 453)		xmpp_stanza_release(sstanza);
-HXLINE( 454)		return stanza;
+HXLINE( 450)		 ::borogove::Stanza stanza = ::borogove::streams::XmppStropheStream_obj::convertToStanza(sstanza,null());
+HXLINE( 451)		xmpp_stanza_release(sstanza);
+HXLINE( 452)		return stanza;
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(XmppStropheStream_obj,parseStanza,return )
 
 ::String XmppStropheStream_obj::serializeStanza( ::borogove::Stanza stanza){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_458_serializeStanza)
-HXLINE( 459)		 xmpp_stanza_t* sstanza = ::borogove::streams::XmppStropheStream_obj::convertFromStanza(stanza);
-HXLINE( 460)		char* buf = null();
-HXLINE( 461)		size_t bufsize = ( (size_t)(-1) );
-HXLINE( 462)		::cpp::Pointer< char* > tmp = ::cpp::Pointer_obj::addressOf(buf);
-HXDLIN( 462)		::cpp::Pointer< size_t > tmp1 = ::cpp::Pointer_obj::addressOf(bufsize);
-HXDLIN( 462)		int err = xmpp_stanza_to_text(sstanza,tmp,tmp1);
-HXLINE( 463)		xmpp_stanza_release(sstanza);
-HXLINE( 464)		bool _hx_tmp = (err != 0);
-HXDLIN( 464)		if (_hx_tmp) {
-HXLINE( 464)			return null();
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_456_serializeStanza)
+HXLINE( 457)		 xmpp_stanza_t* sstanza = ::borogove::streams::XmppStropheStream_obj::convertFromStanza(stanza);
+HXLINE( 458)		char* buf = null();
+HXLINE( 459)		size_t bufsize = ( (size_t)(-1) );
+HXLINE( 460)		::cpp::Pointer< char* > tmp = ::cpp::Pointer_obj::addressOf(buf);
+HXDLIN( 460)		::cpp::Pointer< size_t > tmp1 = ::cpp::Pointer_obj::addressOf(bufsize);
+HXDLIN( 460)		int err = xmpp_stanza_to_text(sstanza,tmp,tmp1);
+HXLINE( 461)		xmpp_stanza_release(sstanza);
+HXLINE( 462)		bool _hx_tmp = (err != 0);
+HXDLIN( 462)		if (_hx_tmp) {
+HXLINE( 462)			return null();
             		}
-HXLINE( 465)		::cpp::Pointer< char > bufPtr = cpp::Pointer_obj::fromRaw(buf);
-HXLINE( 466)		::String s =  ::String(bufPtr->ptr);
-HXLINE( 467)		 xmpp_ctx_t* _hx_tmp1 = ::borogove::streams::XmppStropheStream_obj::ctx;
-HXDLIN( 467)		void* _hx_tmp2 = bufPtr->rawCast();
-HXDLIN( 467)		xmpp_free(_hx_tmp1,_hx_tmp2);
-HXLINE( 468)		return s;
+HXLINE( 463)		::cpp::Pointer< char > bufPtr = cpp::Pointer_obj::fromRaw(buf);
+HXLINE( 464)		::String s =  ::String(bufPtr->ptr);
+HXLINE( 465)		 xmpp_ctx_t* _hx_tmp1 = ::borogove::streams::XmppStropheStream_obj::ctx;
+HXDLIN( 465)		void* _hx_tmp2 = bufPtr->rawCast();
+HXDLIN( 465)		xmpp_free(_hx_tmp1,_hx_tmp2);
+HXLINE( 466)		return s;
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(XmppStropheStream_obj,serializeStanza,return )
 
  ::borogove::Stanza XmppStropheStream_obj::convertToStanza( xmpp_stanza_t* el,void* dummy){
-            	HX_GC_STACKFRAME(&_hx_pos_0c65e41c3007e035_471_convertToStanza)
-HXLINE( 472)		::cpp::Pointer< char > name = xmpp_stanza_get_name(el);
-HXLINE( 473)		int attrlen = xmpp_stanza_get_attribute_count(el);
-HXLINE( 474)		void* attrsraw = ::hx::InternalNew(((attrlen * 2) * sizeof(char*)),false);
-HXLINE( 475)		const char** attrsarray = static_cast<const char**>(attrsraw);
-HXLINE( 476)		::cpp::Pointer< const char* > attrsptr = ::cpp::Pointer_obj::fromRaw(attrsarray);
-HXLINE( 477)		xmpp_stanza_get_attributes(el,attrsarray,(attrlen * 2));
-HXLINE( 478)		 ::Dynamic attrs =  ::Dynamic(::hx::Anon_obj::Create(0));
-HXLINE( 479)		{
-HXLINE( 479)			int _g = 0;
-HXDLIN( 479)			int _g1 = attrlen;
-HXDLIN( 479)			while((_g < _g1)){
-HXLINE( 479)				_g = (_g + 1);
-HXDLIN( 479)				int i = (_g - 1);
-HXLINE( 480)				::cpp::Pointer< char > key = cpp::Pointer_obj::fromRaw(attrsptr->at((i * 2)));
-HXLINE( 481)				::cpp::Pointer< char > value = cpp::Pointer_obj::fromRaw(attrsptr->at(((i * 2) + 1)));
-HXLINE( 482)				{
-HXLINE( 482)					::String key1 =  ::String(key->ptr);
-HXDLIN( 482)					::String value1 =  ::String(value->ptr);
-HXDLIN( 482)					::Reflect_obj::setField(attrs,key1,value1);
+            	HX_GC_STACKFRAME(&_hx_pos_0c65e41c3007e035_469_convertToStanza)
+HXLINE( 470)		::cpp::Pointer< char > name = xmpp_stanza_get_name(el);
+HXLINE( 471)		int attrlen = xmpp_stanza_get_attribute_count(el);
+HXLINE( 472)		void* attrsraw = ::hx::InternalNew(((attrlen * 2) * sizeof(char*)),false);
+HXLINE( 473)		const char** attrsarray = static_cast<const char**>(attrsraw);
+HXLINE( 474)		::cpp::Pointer< const char* > attrsptr = ::cpp::Pointer_obj::fromRaw(attrsarray);
+HXLINE( 475)		xmpp_stanza_get_attributes(el,attrsarray,(attrlen * 2));
+HXLINE( 476)		 ::Dynamic attrs =  ::Dynamic(::hx::Anon_obj::Create(0));
+HXLINE( 477)		{
+HXLINE( 477)			int _g = 0;
+HXDLIN( 477)			int _g1 = attrlen;
+HXDLIN( 477)			while((_g < _g1)){
+HXLINE( 477)				_g = (_g + 1);
+HXDLIN( 477)				int i = (_g - 1);
+HXLINE( 478)				::cpp::Pointer< char > key = cpp::Pointer_obj::fromRaw(attrsptr->at((i * 2)));
+HXLINE( 479)				::cpp::Pointer< char > value = cpp::Pointer_obj::fromRaw(attrsptr->at(((i * 2) + 1)));
+HXLINE( 480)				{
+HXLINE( 480)					::String key1 =  ::String(key->ptr);
+HXDLIN( 480)					::String value1 =  ::String(value->ptr);
+HXDLIN( 480)					::Reflect_obj::setField(attrs,key1,value1);
             				}
             			}
             		}
-HXLINE( 484)		 ::borogove::Stanza stanza =  ::borogove::Stanza_obj::__alloc( HX_CTX , ::String(name->ptr),attrs);
-HXLINE( 486)		 xmpp_stanza_t* child = xmpp_stanza_get_children(el);
-HXLINE( 487)		while(::hx::IsNotNull( child )){
-HXLINE( 488)			if (xmpp_stanza_is_text(child)) {
-HXLINE( 489)				::cpp::Pointer< char > inPtr = cpp::Pointer_obj::fromRaw(xmpp_stanza_get_text_ptr(child));
-HXDLIN( 489)				stanza->text( ::String(inPtr->ptr));
+HXLINE( 482)		 ::borogove::Stanza stanza =  ::borogove::Stanza_obj::__alloc( HX_CTX , ::String(name->ptr),attrs);
+HXLINE( 484)		 xmpp_stanza_t* child = xmpp_stanza_get_children(el);
+HXLINE( 485)		while(::hx::IsNotNull( child )){
+HXLINE( 486)			if (xmpp_stanza_is_text(child)) {
+HXLINE( 487)				::cpp::Pointer< char > inPtr = cpp::Pointer_obj::fromRaw(xmpp_stanza_get_text_ptr(child));
+HXDLIN( 487)				stanza->text( ::String(inPtr->ptr));
             			}
             			else {
-HXLINE( 491)				stanza->addChild(::borogove::streams::XmppStropheStream_obj::convertToStanza(child,null()));
+HXLINE( 489)				stanza->addChild(::borogove::streams::XmppStropheStream_obj::convertToStanza(child,null()));
             			}
-HXLINE( 493)			child = xmpp_stanza_get_next(child);
+HXLINE( 491)			child = xmpp_stanza_get_next(child);
             		}
-HXLINE( 496)		return stanza;
+HXLINE( 494)		return stanza;
             	}
 
 
  xmpp_stanza_t* XmppStropheStream_obj::convertFromStanza( ::borogove::Stanza el){
-            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_499_convertFromStanza)
-HXLINE( 500)		 xmpp_stanza_t* xml = xmpp_stanza_new(::borogove::streams::XmppStropheStream_obj::ctx);
-HXLINE( 501)		::cpp::Pointer< char > tmp = cpp::Pointer_obj::fromPointer(el->name.c_str());
-HXDLIN( 501)		xmpp_stanza_set_name(xml,tmp);
-HXLINE( 502)		{
-HXLINE( 502)			 ::Dynamic access = el->attr;
-HXDLIN( 502)			::Array< ::String > _g_keys = ::Reflect_obj::fields(access);
-HXDLIN( 502)			int _g_index = 0;
-HXDLIN( 502)			while((_g_index < _g_keys->length)){
-HXLINE( 502)				_g_index = (_g_index + 1);
-HXDLIN( 502)				::String key = _g_keys->__get((_g_index - 1));
-HXDLIN( 502)				::String attr_value = ( (::String)(::Reflect_obj::field(access,key)) );
-HXLINE( 505)				if (::hx::IsNotNull( attr_value )) {
-HXLINE( 506)					::cpp::Pointer< char > tmp1 = cpp::Pointer_obj::fromPointer(key.c_str());
-HXDLIN( 506)					::cpp::Pointer< char > tmp2 = cpp::Pointer_obj::fromPointer(attr_value.c_str());
-HXDLIN( 506)					xmpp_stanza_set_attribute(xml,tmp1,tmp2);
+            	HX_STACKFRAME(&_hx_pos_0c65e41c3007e035_497_convertFromStanza)
+HXLINE( 498)		 xmpp_stanza_t* xml = xmpp_stanza_new(::borogove::streams::XmppStropheStream_obj::ctx);
+HXLINE( 499)		::cpp::Pointer< char > tmp = cpp::Pointer_obj::fromPointer(el->name.c_str());
+HXDLIN( 499)		xmpp_stanza_set_name(xml,tmp);
+HXLINE( 500)		{
+HXLINE( 500)			 ::Dynamic access = el->attr;
+HXDLIN( 500)			::Array< ::String > _g_keys = ::Reflect_obj::fields(access);
+HXDLIN( 500)			int _g_index = 0;
+HXDLIN( 500)			while((_g_index < _g_keys->length)){
+HXLINE( 500)				_g_index = (_g_index + 1);
+HXDLIN( 500)				::String key = _g_keys->__get((_g_index - 1));
+HXDLIN( 500)				::String attr_value = ( (::String)(::Reflect_obj::field(access,key)) );
+HXLINE( 503)				if (::hx::IsNotNull( attr_value )) {
+HXLINE( 504)					::cpp::Pointer< char > tmp1 = cpp::Pointer_obj::fromPointer(key.c_str());
+HXDLIN( 504)					::cpp::Pointer< char > tmp2 = cpp::Pointer_obj::fromPointer(attr_value.c_str());
+HXDLIN( 504)					xmpp_stanza_set_attribute(xml,tmp1,tmp2);
             				}
             			}
             		}
-HXLINE( 509)		if ((el->children->length > 0)) {
-HXLINE( 510)			int _g = 0;
-HXDLIN( 510)			::Array< ::Dynamic> _g1 = el->children;
-HXDLIN( 510)			while((_g < _g1->length)){
-HXLINE( 510)				 ::borogove::Node child = _g1->__get(_g).StaticCast<  ::borogove::Node >();
-HXDLIN( 510)				_g = (_g + 1);
-HXLINE( 511)				switch((int)(child->_hx_getIndex())){
+HXLINE( 507)		if ((el->children->length > 0)) {
+HXLINE( 508)			int _g = 0;
+HXDLIN( 508)			::Array< ::Dynamic> _g1 = el->children;
+HXDLIN( 508)			while((_g < _g1->length)){
+HXLINE( 508)				 ::borogove::Node child = _g1->__get(_g).StaticCast<  ::borogove::Node >();
+HXDLIN( 508)				_g = (_g + 1);
+HXLINE( 509)				switch((int)(child->_hx_getIndex())){
             					case (int)0: {
-HXLINE( 513)						xmpp_stanza_add_child_ex(xml,::borogove::streams::XmppStropheStream_obj::convertFromStanza(child->_hx_getObject(0).StaticCast<  ::borogove::Stanza >()),false);
+HXLINE( 511)						xmpp_stanza_add_child_ex(xml,::borogove::streams::XmppStropheStream_obj::convertFromStanza(child->_hx_getObject(0).StaticCast<  ::borogove::Stanza >()),false);
             					}
             					break;
             					case (int)1: {
-HXLINE( 515)						 xmpp_stanza_t* text_node = xmpp_stanza_new(::borogove::streams::XmppStropheStream_obj::ctx);
-HXLINE( 516)						::cpp::Pointer< char > tmp3 = cpp::Pointer_obj::fromPointer(child->_hx_getString(0).c_str());
-HXDLIN( 516)						xmpp_stanza_set_text(text_node,tmp3);
-HXLINE( 517)						xmpp_stanza_add_child_ex(xml,text_node,false);
+HXLINE( 513)						 xmpp_stanza_t* text_node = xmpp_stanza_new(::borogove::streams::XmppStropheStream_obj::ctx);
+HXLINE( 514)						::cpp::Pointer< char > tmp3 = cpp::Pointer_obj::fromPointer(child->_hx_getString(0).c_str());
+HXDLIN( 514)						xmpp_stanza_set_text(text_node,tmp3);
+HXLINE( 515)						xmpp_stanza_add_child_ex(xml,text_node,false);
             					}
             					break;
             				}
             			}
             		}
-HXLINE( 521)		return xml;
+HXLINE( 519)		return xml;
             	}
 
 
@@ -647,7 +649,6 @@ void XmppStropheStream_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 5:
 		if (HX_FIELD_EQ(inName,"ready") ) { return ::hx::Val( ready ); }
-		if (HX_FIELD_EQ(inName,"newId") ) { return ::hx::Val( newId_dyn() ); }
 		break;
 	case 7:
 		if (HX_FIELD_EQ(inName,"pending") ) { return ::hx::Val( pending ); }
@@ -734,7 +735,6 @@ static ::String XmppStropheStream_obj_sMemberFields[] = {
 	HX_("pollTimer",06,ad,79,73),
 	HX_("ready",63,a0,ba,e6),
 	HX_("stanzaThisPoll",d2,ce,2e,fa),
-	HX_("newId",5b,e8,30,99),
 	HX_("onIq",e7,66,b2,49),
 	HX_("connect",ea,3b,80,15),
 	HX_("disconnect",5c,64,44,69),
diff --git a/Sources/c_borogove/src/haxe/Int64Helper.cpp b/Sources/c_borogove/src/haxe/Int64Helper.cpp
new file mode 100644
index 0000000..02df9e1
--- /dev/null
+++ b/Sources/c_borogove/src/haxe/Int64Helper.cpp
@@ -0,0 +1,131 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_38344beec7696400
+#define INCLUDED_38344beec7696400
+#include "cpp/Int64.h"
+#endif
+#ifndef INCLUDED_95f339a1d026d52c
+#define INCLUDED_95f339a1d026d52c
+#include "hxMath.h"
+#endif
+#ifndef INCLUDED_haxe_Int64Helper
+#include <haxe/Int64Helper.h>
+#endif
+
+HX_LOCAL_STACK_FRAME(_hx_pos_6bd57a0064584998_79_fromFloat,"haxe.Int64Helper","fromFloat",0xe14c7677,"haxe.Int64Helper.fromFloat","/usr/local/lib/haxe/std/haxe/Int64Helper.hx",79,0x415f4bef)
+namespace haxe{
+
+void Int64Helper_obj::__construct() { }
+
+Dynamic Int64Helper_obj::__CreateEmpty() { return new Int64Helper_obj; }
+
+void *Int64Helper_obj::_hx_vtable = 0;
+
+Dynamic Int64Helper_obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< Int64Helper_obj > _hx_result = new Int64Helper_obj();
+	_hx_result->__construct();
+	return _hx_result;
+}
+
+bool Int64Helper_obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x03ea75b5;
+}
+
+::cpp::Int64 Int64Helper_obj::fromFloat(Float f){
+            	HX_STACKFRAME(&_hx_pos_6bd57a0064584998_79_fromFloat)
+HXLINE(  80)		bool _hx_tmp;
+HXDLIN(  80)		if (!(::Math_obj::isNaN(f))) {
+HXLINE(  80)			_hx_tmp = !(::Math_obj::isFinite(f));
+            		}
+            		else {
+HXLINE(  80)			_hx_tmp = true;
+            		}
+HXDLIN(  80)		if (_hx_tmp) {
+HXLINE(  81)			HX_STACK_DO_THROW(HX_("Number is NaN or Infinite",2d,21,08,80));
+            		}
+HXLINE(  84)		Float noFractions = (f - ::hx::Mod(f,1));
+HXLINE(  90)		if ((noFractions > ((Float)9007199254740991))) {
+HXLINE(  91)			HX_STACK_DO_THROW(HX_("Conversion overflow",6c,95,02,46));
+            		}
+HXLINE(  93)		if ((noFractions < ((Float)-9007199254740991))) {
+HXLINE(  94)			HX_STACK_DO_THROW(HX_("Conversion underflow",9c,47,f1,ac));
+            		}
+HXLINE(  97)		::cpp::Int64 result = ( (::cpp::Int64)(0) );
+HXLINE(  98)		bool neg = (noFractions < 0);
+HXLINE(  99)		Float rest;
+HXDLIN(  99)		if (neg) {
+HXLINE(  99)			rest = -(noFractions);
+            		}
+            		else {
+HXLINE(  99)			rest = noFractions;
+            		}
+HXLINE( 101)		int i = 0;
+HXLINE( 102)		while((rest >= 1)){
+HXLINE( 103)			Float curr = ::hx::Mod(rest,2);
+HXLINE( 104)			rest = (rest / ( (Float)(2) ));
+HXLINE( 105)			if ((curr >= 1)) {
+HXLINE( 106)				result = _hx_int64_add(result,_hx_int64_shl(( (::cpp::Int64)(1) ),i));
+            			}
+HXLINE( 108)			i = (i + 1);
+            		}
+HXLINE( 111)		if (neg) {
+HXLINE( 112)			result = _hx_int64_neg(result);
+            		}
+HXLINE( 114)		return result;
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Int64Helper_obj,fromFloat,return )
+
+
+Int64Helper_obj::Int64Helper_obj()
+{
+}
+
+bool Int64Helper_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 9:
+		if (HX_FIELD_EQ(inName,"fromFloat") ) { outValue = fromFloat_dyn(); return true; }
+	}
+	return false;
+}
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo *Int64Helper_obj_sMemberStorageInfo = 0;
+static ::hx::StaticInfo *Int64Helper_obj_sStaticStorageInfo = 0;
+#endif
+
+::hx::Class Int64Helper_obj::__mClass;
+
+static ::String Int64Helper_obj_sStaticFields[] = {
+	HX_("fromFloat",d2,af,1f,b7),
+	::String(null())
+};
+
+void Int64Helper_obj::__register()
+{
+	Int64Helper_obj _hx_dummy;
+	Int64Helper_obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("haxe.Int64Helper",d3,56,31,a6);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &Int64Helper_obj::__GetStatic;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(Int64Helper_obj_sStaticFields);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(0 /* sMemberFields */);
+	__mClass->mCanCast = ::hx::TCanCast< Int64Helper_obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = Int64Helper_obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = Int64Helper_obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+} // end namespace haxe
diff --git a/Sources/c_borogove/src/haxe/_Int64/Int64_Impl_.cpp b/Sources/c_borogove/src/haxe/_Int64/Int64_Impl_.cpp
new file mode 100644
index 0000000..21b294c
--- /dev/null
+++ b/Sources/c_borogove/src/haxe/_Int64/Int64_Impl_.cpp
@@ -0,0 +1,90 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_haxe_Int64Helper
+#include <haxe/Int64Helper.h>
+#endif
+#ifndef INCLUDED_haxe__Int64_Int64_Impl_
+#include <haxe/_Int64/Int64_Impl_.h>
+#endif
+
+HX_LOCAL_STACK_FRAME(_hx_pos_5af095dcdb4db407_193_fromFloat,"haxe._Int64.Int64_Impl_","fromFloat",0xa3d45c39,"haxe._Int64.Int64_Impl_.fromFloat","/usr/local/lib/haxe/std/cpp/_std/haxe/Int64.hx",193,0x903f8a98)
+namespace haxe{
+namespace _Int64{
+
+void Int64_Impl__obj::__construct() { }
+
+Dynamic Int64_Impl__obj::__CreateEmpty() { return new Int64_Impl__obj; }
+
+void *Int64_Impl__obj::_hx_vtable = 0;
+
+Dynamic Int64_Impl__obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< Int64_Impl__obj > _hx_result = new Int64_Impl__obj();
+	_hx_result->__construct();
+	return _hx_result;
+}
+
+bool Int64_Impl__obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x66145239;
+}
+
+::cpp::Int64 Int64_Impl__obj::fromFloat(Float f){
+            	HX_STACKFRAME(&_hx_pos_5af095dcdb4db407_193_fromFloat)
+HXDLIN( 193)		return ::haxe::Int64Helper_obj::fromFloat(f);
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(Int64_Impl__obj,fromFloat,return )
+
+
+Int64_Impl__obj::Int64_Impl__obj()
+{
+}
+
+bool Int64_Impl__obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 9:
+		if (HX_FIELD_EQ(inName,"fromFloat") ) { outValue = fromFloat_dyn(); return true; }
+	}
+	return false;
+}
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo *Int64_Impl__obj_sMemberStorageInfo = 0;
+static ::hx::StaticInfo *Int64_Impl__obj_sStaticStorageInfo = 0;
+#endif
+
+::hx::Class Int64_Impl__obj::__mClass;
+
+static ::String Int64_Impl__obj_sStaticFields[] = {
+	HX_("fromFloat",d2,af,1f,b7),
+	::String(null())
+};
+
+void Int64_Impl__obj::__register()
+{
+	Int64_Impl__obj _hx_dummy;
+	Int64_Impl__obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("haxe._Int64.Int64_Impl_",15,d6,6c,a0);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &Int64_Impl__obj::__GetStatic;
+	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(Int64_Impl__obj_sStaticFields);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(0 /* sMemberFields */);
+	__mClass->mCanCast = ::hx::TCanCast< Int64_Impl__obj >;
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = Int64_Impl__obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = Int64_Impl__obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+} // end namespace haxe
+} // end namespace _Int64
diff --git a/Sources/c_borogove/src/haxe/crypto/Sha1.cpp b/Sources/c_borogove/src/haxe/crypto/Sha1.cpp
index 2a99f87..55eda01 100644
--- a/Sources/c_borogove/src/haxe/crypto/Sha1.cpp
+++ b/Sources/c_borogove/src/haxe/crypto/Sha1.cpp
@@ -8,17 +8,17 @@
 #include <haxe/io/Bytes.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_b388adc1457cbfc2_48_new,"haxe.crypto.Sha1","new",0xdb44b09c,"haxe.crypto.Sha1.new","/usr/local/lib/haxe/std/haxe/crypto/Sha1.hx",48,0x02d96297)
-HX_LOCAL_STACK_FRAME(_hx_pos_b388adc1457cbfc2_50_doEncode,"haxe.crypto.Sha1","doEncode",0xfb483e45,"haxe.crypto.Sha1.doEncode","/usr/local/lib/haxe/std/haxe/crypto/Sha1.hx",50,0x02d96297)
-HX_LOCAL_STACK_FRAME(_hx_pos_b388adc1457cbfc2_142_ft,"haxe.crypto.Sha1","ft",0x7aab5492,"haxe.crypto.Sha1.ft","/usr/local/lib/haxe/std/haxe/crypto/Sha1.hx",142,0x02d96297)
-HX_LOCAL_STACK_FRAME(_hx_pos_b388adc1457cbfc2_155_kt,"haxe.crypto.Sha1","kt",0x7aab58ed,"haxe.crypto.Sha1.kt","/usr/local/lib/haxe/std/haxe/crypto/Sha1.hx",155,0x02d96297)
-HX_LOCAL_STACK_FRAME(_hx_pos_b388adc1457cbfc2_35_make,"haxe.crypto.Sha1","make",0x00298e32,"haxe.crypto.Sha1.make","/usr/local/lib/haxe/std/haxe/crypto/Sha1.hx",35,0x02d96297)
-HX_LOCAL_STACK_FRAME(_hx_pos_b388adc1457cbfc2_115_bytes2blks,"haxe.crypto.Sha1","bytes2blks",0x985aae1d,"haxe.crypto.Sha1.bytes2blks","/usr/local/lib/haxe/std/haxe/crypto/Sha1.hx",115,0x02d96297)
+HX_DEFINE_STACK_FRAME(_hx_pos_6cacb1640f84e23c_87_new,"haxe.crypto.Sha1","new",0xdb44b09c,"haxe.crypto.Sha1.new","haxe/crypto/Sha1.hx",87,0x48d96834)
+HX_LOCAL_STACK_FRAME(_hx_pos_6cacb1640f84e23c_89_doEncode,"haxe.crypto.Sha1","doEncode",0xfb483e45,"haxe.crypto.Sha1.doEncode","haxe/crypto/Sha1.hx",89,0x48d96834)
+HX_LOCAL_STACK_FRAME(_hx_pos_6cacb1640f84e23c_181_ft,"haxe.crypto.Sha1","ft",0x7aab5492,"haxe.crypto.Sha1.ft","haxe/crypto/Sha1.hx",181,0x48d96834)
+HX_LOCAL_STACK_FRAME(_hx_pos_6cacb1640f84e23c_194_kt,"haxe.crypto.Sha1","kt",0x7aab58ed,"haxe.crypto.Sha1.kt","haxe/crypto/Sha1.hx",194,0x48d96834)
+HX_LOCAL_STACK_FRAME(_hx_pos_6cacb1640f84e23c_74_make,"haxe.crypto.Sha1","make",0x00298e32,"haxe.crypto.Sha1.make","haxe/crypto/Sha1.hx",74,0x48d96834)
+HX_LOCAL_STACK_FRAME(_hx_pos_6cacb1640f84e23c_154_bytes2blks,"haxe.crypto.Sha1","bytes2blks",0x985aae1d,"haxe.crypto.Sha1.bytes2blks","haxe/crypto/Sha1.hx",154,0x48d96834)
 namespace haxe{
 namespace crypto{
 
 void Sha1_obj::__construct(){
-            	HX_STACKFRAME(&_hx_pos_b388adc1457cbfc2_48_new)
+            	HX_STACKFRAME(&_hx_pos_6cacb1640f84e23c_87_new)
             	}
 
 Dynamic Sha1_obj::__CreateEmpty() { return new Sha1_obj; }
@@ -37,155 +37,155 @@ bool Sha1_obj::_hx_isInstanceOf(int inClassId) {
 }
 
 ::Array< int > Sha1_obj::doEncode(::Array< int > x){
-            	HX_STACKFRAME(&_hx_pos_b388adc1457cbfc2_50_doEncode)
-HXLINE(  51)		::Array< int > w = ::Array_obj< int >::__new();
-HXLINE(  53)		int a = (int)1732584193;
-HXLINE(  54)		int b = -271733879;
-HXLINE(  55)		int c = (int)-1732584194;
-HXLINE(  56)		int d = 271733878;
-HXLINE(  57)		int e = (int)-1009589776;
-HXLINE(  59)		int i = 0;
-HXLINE(  60)		while((i < x->length)){
-HXLINE(  61)			int olda = a;
-HXLINE(  62)			int oldb = b;
-HXLINE(  63)			int oldc = c;
-HXLINE(  64)			int oldd = d;
-HXLINE(  65)			int olde = e;
-HXLINE(  67)			int j = 0;
-HXLINE(  68)			while((j < 80)){
-HXLINE(  69)				if ((j < 16)) {
-HXLINE(  70)					w[j] = x->__get((i + j));
+            	HX_STACKFRAME(&_hx_pos_6cacb1640f84e23c_89_doEncode)
+HXLINE(  90)		::Array< int > w = ::Array_obj< int >::__new();
+HXLINE(  92)		int a = (int)1732584193;
+HXLINE(  93)		int b = -271733879;
+HXLINE(  94)		int c = (int)-1732584194;
+HXLINE(  95)		int d = 271733878;
+HXLINE(  96)		int e = (int)-1009589776;
+HXLINE(  98)		int i = 0;
+HXLINE(  99)		while((i < x->length)){
+HXLINE( 100)			int olda = a;
+HXLINE( 101)			int oldb = b;
+HXLINE( 102)			int oldc = c;
+HXLINE( 103)			int oldd = d;
+HXLINE( 104)			int olde = e;
+HXLINE( 106)			int j = 0;
+HXLINE( 107)			while((j < 80)){
+HXLINE( 108)				if ((j < 16)) {
+HXLINE( 109)					w[j] = x->__get((i + j));
             				}
             				else {
-HXLINE(  72)					int num = (((w->__get((j - 3)) ^ w->__get((j - 8))) ^ w->__get((j - 14))) ^ w->__get((j - 16)));
-HXDLIN(  72)					w[j] = ((num << 1) | ::hx::UShr(num,31));
+HXLINE( 111)					int num = (((w->__get((j - 3)) ^ w->__get((j - 8))) ^ w->__get((j - 14))) ^ w->__get((j - 16)));
+HXDLIN( 111)					w[j] = ((num << 1) | ::hx::UShr(num,31));
             				}
-HXLINE(  73)				int t = ((((a << 5) | ::hx::UShr(a,27)) + this->ft(j,b,c,d)) + e);
-HXDLIN(  73)				int t1 = (t + w->__get(j));
-HXLINE(  74)				e = d;
-HXLINE(  75)				d = c;
-HXLINE(  76)				c = ((b << 30) | ::hx::UShr(b,2));
-HXLINE(  77)				b = a;
-HXLINE(  78)				a = (t1 + this->kt(j));
-HXLINE(  79)				j = (j + 1);
+HXLINE( 112)				int t = ((((a << 5) | ::hx::UShr(a,27)) + this->ft(j,b,c,d)) + e);
+HXDLIN( 112)				int t1 = (t + w->__get(j));
+HXLINE( 113)				e = d;
+HXLINE( 114)				d = c;
+HXLINE( 115)				c = ((b << 30) | ::hx::UShr(b,2));
+HXLINE( 116)				b = a;
+HXLINE( 117)				a = (t1 + this->kt(j));
+HXLINE( 118)				j = (j + 1);
             			}
-HXLINE(  81)			a = (a + olda);
-HXLINE(  82)			b = (b + oldb);
-HXLINE(  83)			c = (c + oldc);
-HXLINE(  84)			d = (d + oldd);
-HXLINE(  85)			e = (e + olde);
-HXLINE(  86)			i = (i + 16);
+HXLINE( 120)			a = (a + olda);
+HXLINE( 121)			b = (b + oldb);
+HXLINE( 122)			c = (c + oldc);
+HXLINE( 123)			d = (d + oldd);
+HXLINE( 124)			e = (e + olde);
+HXLINE( 125)			i = (i + 16);
             		}
-HXLINE(  88)		return ::Array_obj< int >::__new(5)->init(0,a)->init(1,b)->init(2,c)->init(3,d)->init(4,e);
+HXLINE( 127)		return ::Array_obj< int >::__new(5)->init(0,a)->init(1,b)->init(2,c)->init(3,d)->init(4,e);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Sha1_obj,doEncode,return )
 
 int Sha1_obj::ft(int t,int b,int c,int d){
-            	HX_STACKFRAME(&_hx_pos_b388adc1457cbfc2_142_ft)
-HXLINE( 143)		if ((t < 20)) {
-HXLINE( 144)			return ((b & c) | (~(b) & d));
+            	HX_STACKFRAME(&_hx_pos_6cacb1640f84e23c_181_ft)
+HXLINE( 182)		if ((t < 20)) {
+HXLINE( 183)			return ((b & c) | (~(b) & d));
             		}
-HXLINE( 145)		if ((t < 40)) {
-HXLINE( 146)			return ((b ^ c) ^ d);
+HXLINE( 184)		if ((t < 40)) {
+HXLINE( 185)			return ((b ^ c) ^ d);
             		}
-HXLINE( 147)		if ((t < 60)) {
-HXLINE( 148)			return (((b & c) | (b & d)) | (c & d));
+HXLINE( 186)		if ((t < 60)) {
+HXLINE( 187)			return (((b & c) | (b & d)) | (c & d));
             		}
-HXLINE( 149)		return ((b ^ c) ^ d);
+HXLINE( 188)		return ((b ^ c) ^ d);
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC4(Sha1_obj,ft,return )
 
 int Sha1_obj::kt(int t){
-            	HX_STACKFRAME(&_hx_pos_b388adc1457cbfc2_155_kt)
-HXLINE( 156)		if ((t < 20)) {
-HXLINE( 157)			return (int)1518500249;
+            	HX_STACKFRAME(&_hx_pos_6cacb1640f84e23c_194_kt)
+HXLINE( 195)		if ((t < 20)) {
+HXLINE( 196)			return (int)1518500249;
             		}
-HXLINE( 158)		if ((t < 40)) {
-HXLINE( 159)			return (int)1859775393;
+HXLINE( 197)		if ((t < 40)) {
+HXLINE( 198)			return (int)1859775393;
             		}
-HXLINE( 160)		if ((t < 60)) {
-HXLINE( 161)			return (int)-1894007588;
+HXLINE( 199)		if ((t < 60)) {
+HXLINE( 200)			return (int)-1894007588;
             		}
-HXLINE( 162)		return -899497514;
+HXLINE( 201)		return -899497514;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC1(Sha1_obj,kt,return )
 
  ::haxe::io::Bytes Sha1_obj::make( ::haxe::io::Bytes b){
-            	HX_GC_STACKFRAME(&_hx_pos_b388adc1457cbfc2_35_make)
-HXLINE(  36)		 ::haxe::crypto::Sha1 h =  ::haxe::crypto::Sha1_obj::__alloc( HX_CTX );
-HXDLIN(  36)		::Array< int > h1 = h->doEncode(::haxe::crypto::Sha1_obj::bytes2blks(b));
-HXLINE(  37)		 ::haxe::io::Bytes out = ::haxe::io::Bytes_obj::alloc(20);
-HXLINE(  39)		{
-HXLINE(  39)			{
-HXLINE(  40)				out->b[0] = ( (unsigned char)(::hx::UShr(h1->__get(0),24)) );
-HXLINE(  41)				out->b[1] = ( (unsigned char)(((h1->__get(0) >> 16) & 255)) );
-HXLINE(  42)				out->b[2] = ( (unsigned char)(((h1->__get(0) >> 8) & 255)) );
-HXLINE(  43)				out->b[3] = ( (unsigned char)((h1->__get(0) & 255)) );
+            	HX_GC_STACKFRAME(&_hx_pos_6cacb1640f84e23c_74_make)
+HXLINE(  75)		 ::haxe::crypto::Sha1 h =  ::haxe::crypto::Sha1_obj::__alloc( HX_CTX );
+HXDLIN(  75)		::Array< int > h1 = h->doEncode(::haxe::crypto::Sha1_obj::bytes2blks(b));
+HXLINE(  76)		 ::haxe::io::Bytes out = ::haxe::io::Bytes_obj::alloc(20);
+HXLINE(  78)		{
+HXLINE(  78)			{
+HXLINE(  79)				out->b[0] = ( (unsigned char)(::hx::UShr(h1->__get(0),24)) );
+HXLINE(  80)				out->b[1] = ( (unsigned char)(((h1->__get(0) >> 16) & 255)) );
+HXLINE(  81)				out->b[2] = ( (unsigned char)(((h1->__get(0) >> 8) & 255)) );
+HXLINE(  82)				out->b[3] = ( (unsigned char)((h1->__get(0) & 255)) );
             			}
-HXLINE(  39)			{
-HXLINE(  40)				out->b[4] = ( (unsigned char)(::hx::UShr(h1->__get(1),24)) );
-HXLINE(  41)				out->b[5] = ( (unsigned char)(((h1->__get(1) >> 16) & 255)) );
-HXLINE(  42)				out->b[6] = ( (unsigned char)(((h1->__get(1) >> 8) & 255)) );
-HXLINE(  43)				out->b[7] = ( (unsigned char)((h1->__get(1) & 255)) );
+HXLINE(  78)			{
+HXLINE(  79)				out->b[4] = ( (unsigned char)(::hx::UShr(h1->__get(1),24)) );
+HXLINE(  80)				out->b[5] = ( (unsigned char)(((h1->__get(1) >> 16) & 255)) );
+HXLINE(  81)				out->b[6] = ( (unsigned char)(((h1->__get(1) >> 8) & 255)) );
+HXLINE(  82)				out->b[7] = ( (unsigned char)((h1->__get(1) & 255)) );
             			}
-HXLINE(  39)			{
-HXLINE(  40)				out->b[8] = ( (unsigned char)(::hx::UShr(h1->__get(2),24)) );
-HXLINE(  41)				out->b[9] = ( (unsigned char)(((h1->__get(2) >> 16) & 255)) );
-HXLINE(  42)				out->b[10] = ( (unsigned char)(((h1->__get(2) >> 8) & 255)) );
-HXLINE(  43)				out->b[11] = ( (unsigned char)((h1->__get(2) & 255)) );
+HXLINE(  78)			{
+HXLINE(  79)				out->b[8] = ( (unsigned char)(::hx::UShr(h1->__get(2),24)) );
+HXLINE(  80)				out->b[9] = ( (unsigned char)(((h1->__get(2) >> 16) & 255)) );
+HXLINE(  81)				out->b[10] = ( (unsigned char)(((h1->__get(2) >> 8) & 255)) );
+HXLINE(  82)				out->b[11] = ( (unsigned char)((h1->__get(2) & 255)) );
             			}
-HXLINE(  39)			{
-HXLINE(  40)				out->b[12] = ( (unsigned char)(::hx::UShr(h1->__get(3),24)) );
-HXLINE(  41)				out->b[13] = ( (unsigned char)(((h1->__get(3) >> 16) & 255)) );
-HXLINE(  42)				out->b[14] = ( (unsigned char)(((h1->__get(3) >> 8) & 255)) );
-HXLINE(  43)				out->b[15] = ( (unsigned char)((h1->__get(3) & 255)) );
+HXLINE(  78)			{
+HXLINE(  79)				out->b[12] = ( (unsigned char)(::hx::UShr(h1->__get(3),24)) );
+HXLINE(  80)				out->b[13] = ( (unsigned char)(((h1->__get(3) >> 16) & 255)) );
+HXLINE(  81)				out->b[14] = ( (unsigned char)(((h1->__get(3) >> 8) & 255)) );
+HXLINE(  82)				out->b[15] = ( (unsigned char)((h1->__get(3) & 255)) );
             			}
-HXLINE(  39)			{
-HXLINE(  40)				out->b[16] = ( (unsigned char)(::hx::UShr(h1->__get(4),24)) );
-HXLINE(  41)				out->b[17] = ( (unsigned char)(((h1->__get(4) >> 16) & 255)) );
-HXLINE(  42)				out->b[18] = ( (unsigned char)(((h1->__get(4) >> 8) & 255)) );
-HXLINE(  43)				out->b[19] = ( (unsigned char)((h1->__get(4) & 255)) );
+HXLINE(  78)			{
+HXLINE(  79)				out->b[16] = ( (unsigned char)(::hx::UShr(h1->__get(4),24)) );
+HXLINE(  80)				out->b[17] = ( (unsigned char)(((h1->__get(4) >> 16) & 255)) );
+HXLINE(  81)				out->b[18] = ( (unsigned char)(((h1->__get(4) >> 8) & 255)) );
+HXLINE(  82)				out->b[19] = ( (unsigned char)((h1->__get(4) & 255)) );
             			}
             		}
-HXLINE(  45)		return out;
+HXLINE(  84)		return out;
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Sha1_obj,make,return )
 
 ::Array< int > Sha1_obj::bytes2blks( ::haxe::io::Bytes b){
-            	HX_STACKFRAME(&_hx_pos_b388adc1457cbfc2_115_bytes2blks)
-HXLINE( 116)		int nblk = (((b->length + 8) >> 6) + 1);
-HXLINE( 117)		::Array< int > blks = ::Array_obj< int >::__new();
-HXLINE( 119)		{
-HXLINE( 119)			int _g = 0;
-HXDLIN( 119)			int _g1 = (nblk * 16);
-HXDLIN( 119)			while((_g < _g1)){
-HXLINE( 119)				_g = (_g + 1);
-HXLINE( 120)				blks[(_g - 1)] = 0;
+            	HX_STACKFRAME(&_hx_pos_6cacb1640f84e23c_154_bytes2blks)
+HXLINE( 155)		int nblk = (((b->length + 8) >> 6) + 1);
+HXLINE( 156)		::Array< int > blks = ::Array_obj< int >::__new();
+HXLINE( 158)		{
+HXLINE( 158)			int _g = 0;
+HXDLIN( 158)			int _g1 = (nblk * 16);
+HXDLIN( 158)			while((_g < _g1)){
+HXLINE( 158)				_g = (_g + 1);
+HXLINE( 159)				blks[(_g - 1)] = 0;
             			}
             		}
-HXLINE( 121)		{
-HXLINE( 121)			int _g2 = 0;
-HXDLIN( 121)			int _g3 = b->length;
-HXDLIN( 121)			while((_g2 < _g3)){
-HXLINE( 121)				_g2 = (_g2 + 1);
-HXDLIN( 121)				int i = (_g2 - 1);
-HXLINE( 122)				int p = (i >> 2);
-HXLINE( 123)				blks[p] = (blks->__get(p) | (( (int)(b->b->__get(i)) ) << (24 - ((i & 3) << 3))));
+HXLINE( 160)		{
+HXLINE( 160)			int _g2 = 0;
+HXDLIN( 160)			int _g3 = b->length;
+HXDLIN( 160)			while((_g2 < _g3)){
+HXLINE( 160)				_g2 = (_g2 + 1);
+HXDLIN( 160)				int i = (_g2 - 1);
+HXLINE( 161)				int p = (i >> 2);
+HXLINE( 162)				blks[p] = (blks->__get(p) | (( (int)(b->b->__get(i)) ) << (24 - ((i & 3) << 3))));
             			}
             		}
-HXLINE( 125)		int i1 = b->length;
-HXLINE( 126)		int p1 = (i1 >> 2);
-HXLINE( 127)		blks[p1] = (blks->__get(p1) | (128 << (24 - ((i1 & 3) << 3))));
-HXLINE( 128)		blks[((nblk * 16) - 1)] = (b->length * 8);
-HXLINE( 129)		return blks;
+HXLINE( 164)		int i1 = b->length;
+HXLINE( 165)		int p1 = (i1 >> 2);
+HXLINE( 166)		blks[p1] = (blks->__get(p1) | (128 << (24 - ((i1 & 3) << 3))));
+HXLINE( 167)		blks[((nblk * 16) - 1)] = (b->length * 8);
+HXLINE( 168)		return blks;
             	}
 
 
diff --git a/Sources/c_borogove/src/haxe/crypto/Sha256.cpp b/Sources/c_borogove/src/haxe/crypto/Sha256.cpp
index 178f6b5..52b3746 100644
--- a/Sources/c_borogove/src/haxe/crypto/Sha256.cpp
+++ b/Sources/c_borogove/src/haxe/crypto/Sha256.cpp
@@ -8,21 +8,35 @@
 #include <haxe/io/Bytes.h>
 #endif
 
-HX_DEFINE_STACK_FRAME(_hx_pos_0a4e95b4276e5057_48_new,"haxe.crypto.Sha256","new",0x4d8a58be,"haxe.crypto.Sha256.new","/usr/local/lib/haxe/std/haxe/crypto/Sha256.hx",48,0xc2cd6b75)
-HX_LOCAL_STACK_FRAME(_hx_pos_0a4e95b4276e5057_50_doEncode,"haxe.crypto.Sha256","doEncode",0xbba3dae3,"haxe.crypto.Sha256.doEncode","/usr/local/lib/haxe/std/haxe/crypto/Sha256.hx",50,0xc2cd6b75)
-static const int _hx_array_data_af0be1cc_4[] = {
+HX_DEFINE_STACK_FRAME(_hx_pos_5ce68c6c91deeb3d_150_new,"haxe.crypto.Sha256","new",0x4d8a58be,"haxe.crypto.Sha256.new","haxe/crypto/Sha256.hx",150,0x8d0fd252)
+static const int _hx_array_data_af0be1cc_1[] = {
+	(int)1779033703,(int)-1150833019,(int)1013904242,(int)-1521486534,(int)1359893119,(int)-1694144372,(int)528734635,(int)1541459225,
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_5ce68c6c91deeb3d_53_digest,"haxe.crypto.Sha256","digest",0x30d586a6,"haxe.crypto.Sha256.digest","haxe/crypto/Sha256.hx",53,0x8d0fd252)
+HX_LOCAL_STACK_FRAME(_hx_pos_5ce68c6c91deeb3d_166_update,"haxe.crypto.Sha256","update",0x02b60c6b,"haxe.crypto.Sha256.update","haxe/crypto/Sha256.hx",166,0x8d0fd252)
+HX_LOCAL_STACK_FRAME(_hx_pos_5ce68c6c91deeb3d_193_processBlock,"haxe.crypto.Sha256","processBlock",0x23c18c40,"haxe.crypto.Sha256.processBlock","haxe/crypto/Sha256.hx",193,0x8d0fd252)
+static const int _hx_array_data_af0be1cc_12[] = {
+	(int)1116352408,(int)1899447441,(int)-1245643825,(int)-373957723,(int)961987163,(int)1508970993,(int)-1841331548,(int)-1424204075,(int)-670586216,(int)310598401,(int)607225278,(int)1426881987,(int)1925078388,(int)-2132889090,(int)-1680079193,(int)-1046744716,(int)-459576895,(int)-272742522,(int)264347078,(int)604807628,(int)770255983,(int)1249150122,(int)1555081692,(int)1996064986,(int)-1740746414,(int)-1473132947,(int)-1341970488,(int)-1084653625,(int)-958395405,(int)-710438585,(int)113926993,(int)338241895,(int)666307205,(int)773529912,(int)1294757372,(int)1396182291,(int)1695183700,(int)1986661051,(int)-2117940946,(int)-1838011259,(int)-1564481375,(int)-1474664885,(int)-1035236496,(int)-949202525,(int)-778901479,(int)-694614492,(int)-200395387,(int)275423344,(int)430227734,(int)506948616,(int)659060556,(int)883997877,(int)958139571,(int)1322822218,(int)1537002063,(int)1747873779,(int)1955562222,(int)2024104815,(int)-2067236844,(int)-1933114872,(int)-1866530822,(int)-1538233109,(int)-1090935817,(int)-965641998,
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_5ce68c6c91deeb3d_248_doEncode,"haxe.crypto.Sha256","doEncode",0xbba3dae3,"haxe.crypto.Sha256.doEncode","haxe/crypto/Sha256.hx",248,0x8d0fd252)
+static const int _hx_array_data_af0be1cc_16[] = {
 	(int)1116352408,(int)1899447441,(int)-1245643825,(int)-373957723,(int)961987163,(int)1508970993,(int)-1841331548,(int)-1424204075,(int)-670586216,(int)310598401,(int)607225278,(int)1426881987,(int)1925078388,(int)-2132889090,(int)-1680079193,(int)-1046744716,(int)-459576895,(int)-272742522,(int)264347078,(int)604807628,(int)770255983,(int)1249150122,(int)1555081692,(int)1996064986,(int)-1740746414,(int)-1473132947,(int)-1341970488,(int)-1084653625,(int)-958395405,(int)-710438585,(int)113926993,(int)338241895,(int)666307205,(int)773529912,(int)1294757372,(int)1396182291,(int)1695183700,(int)1986661051,(int)-2117940946,(int)-1838011259,(int)-1564481375,(int)-1474664885,(int)-1035236496,(int)-949202525,(int)-778901479,(int)-694614492,(int)-200395387,(int)275423344,(int)430227734,(int)506948616,(int)659060556,(int)883997877,(int)958139571,(int)1322822218,(int)1537002063,(int)1747873779,(int)1955562222,(int)2024104815,(int)-2067236844,(int)-1933114872,(int)-1866530822,(int)-1538233109,(int)-1090935817,(int)-965641998,
 };
-static const int _hx_array_data_af0be1cc_5[] = {
+static const int _hx_array_data_af0be1cc_17[] = {
 	(int)1779033703,(int)-1150833019,(int)1013904242,(int)-1521486534,(int)1359893119,(int)-1694144372,(int)528734635,(int)1541459225,
 };
-HX_LOCAL_STACK_FRAME(_hx_pos_0a4e95b4276e5057_35_make,"haxe.crypto.Sha256","make",0x8ad703d0,"haxe.crypto.Sha256.make","/usr/local/lib/haxe/std/haxe/crypto/Sha256.hx",35,0xc2cd6b75)
-HX_LOCAL_STACK_FRAME(_hx_pos_0a4e95b4276e5057_133_bytes2blks,"haxe.crypto.Sha256","bytes2blks",0xdc4d2e3b,"haxe.crypto.Sha256.bytes2blks","/usr/local/lib/haxe/std/haxe/crypto/Sha256.hx",133,0xc2cd6b75)
+HX_LOCAL_STACK_FRAME(_hx_pos_5ce68c6c91deeb3d_127_make,"haxe.crypto.Sha256","make",0x8ad703d0,"haxe.crypto.Sha256.make","haxe/crypto/Sha256.hx",127,0x8d0fd252)
+HX_LOCAL_STACK_FRAME(_hx_pos_5ce68c6c91deeb3d_335_bytesToInt,"haxe.crypto.Sha256","bytesToInt",0x786a212b,"haxe.crypto.Sha256.bytesToInt","haxe/crypto/Sha256.hx",335,0x8d0fd252)
+HX_LOCAL_STACK_FRAME(_hx_pos_5ce68c6c91deeb3d_343_bytes2blks,"haxe.crypto.Sha256","bytes2blks",0xdc4d2e3b,"haxe.crypto.Sha256.bytes2blks","haxe/crypto/Sha256.hx",343,0x8d0fd252)
 namespace haxe{
 namespace crypto{
 
 void Sha256_obj::__construct(){
-            	HX_STACKFRAME(&_hx_pos_0a4e95b4276e5057_48_new)
+            	HX_STACKFRAME(&_hx_pos_5ce68c6c91deeb3d_150_new)
+HXLINE( 156)		this->HASH = ::Array_obj< int >::fromData( _hx_array_data_af0be1cc_1,8)->copy();
+HXLINE( 160)		this->buffer = ::haxe::io::Bytes_obj::alloc(64);
+HXLINE( 161)		this->bufferPos = 0;
+HXLINE( 162)		this->totalLength = 0;
             	}
 
 Dynamic Sha256_obj::__CreateEmpty() { return new Sha256_obj; }
@@ -40,195 +54,527 @@ bool Sha256_obj::_hx_isInstanceOf(int inClassId) {
 	return inClassId==(int)0x00000001 || inClassId==(int)0x0c0976ea;
 }
 
+ ::haxe::io::Bytes Sha256_obj::digest(){
+            	HX_STACKFRAME(&_hx_pos_5ce68c6c91deeb3d_53_digest)
+HXLINE(  59)		 ::haxe::io::Bytes finalBuffer = ::haxe::io::Bytes_obj::alloc(64);
+HXLINE(  60)		finalBuffer->blit(0,this->buffer,0,this->bufferPos);
+HXLINE(  62)		int pos = this->bufferPos;
+HXLINE(  63)		finalBuffer->b[pos] = ( (unsigned char)(128) );
+HXLINE(  64)		pos = (pos + 1);
+HXLINE(  66)		if ((pos > 56)) {
+HXLINE(  67)			{
+HXLINE(  67)				int _g = pos;
+HXDLIN(  67)				while((_g < 64)){
+HXLINE(  67)					_g = (_g + 1);
+HXLINE(  68)					finalBuffer->b[(_g - 1)] = ( (unsigned char)(0) );
+            				}
+            			}
+HXLINE(  70)			this->processBlock(finalBuffer,0);
+HXLINE(  72)			{
+HXLINE(  72)				int _g1 = 0;
+HXDLIN(  72)				while((_g1 < 64)){
+HXLINE(  72)					_g1 = (_g1 + 1);
+HXLINE(  73)					finalBuffer->b[(_g1 - 1)] = ( (unsigned char)(0) );
+            				}
+            			}
+            		}
+            		else {
+HXLINE(  76)			int _g2 = pos;
+HXDLIN(  76)			while((_g2 < 56)){
+HXLINE(  76)				_g2 = (_g2 + 1);
+HXLINE(  77)				finalBuffer->b[(_g2 - 1)] = ( (unsigned char)(0) );
+            			}
+            		}
+HXLINE(  82)		int bitLengthLow = (this->totalLength * 8);
+HXLINE(  84)		finalBuffer->b[56] = ( (unsigned char)(0) );
+HXLINE(  85)		finalBuffer->b[57] = ( (unsigned char)(0) );
+HXLINE(  86)		finalBuffer->b[58] = ( (unsigned char)(0) );
+HXLINE(  87)		finalBuffer->b[59] = ( (unsigned char)(0) );
+HXLINE(  88)		finalBuffer->b[60] = ( (unsigned char)((::hx::UShr(bitLengthLow,24) & 255)) );
+HXLINE(  89)		finalBuffer->b[61] = ( (unsigned char)((::hx::UShr(bitLengthLow,16) & 255)) );
+HXLINE(  90)		finalBuffer->b[62] = ( (unsigned char)((::hx::UShr(bitLengthLow,8) & 255)) );
+HXLINE(  91)		finalBuffer->b[63] = ( (unsigned char)((bitLengthLow & 255)) );
+HXLINE(  93)		this->processBlock(finalBuffer,0);
+HXLINE(  95)		 ::haxe::io::Bytes out = ::haxe::io::Bytes_obj::alloc(32);
+HXLINE(  96)		int p = 0;
+HXLINE(  97)		{
+HXLINE(  97)			int _g3 = 0;
+HXDLIN(  97)			while((_g3 < 8)){
+HXLINE(  97)				_g3 = (_g3 + 1);
+HXDLIN(  97)				int i = (_g3 - 1);
+HXLINE(  98)				{
+HXLINE(  98)					p = (p + 1);
+HXDLIN(  98)					int v = ::hx::UShr(( (int)(_hx_array_unsafe_get(this->HASH,i)) ),24);
+HXDLIN(  98)					out->b[(p - 1)] = ( (unsigned char)(v) );
+            				}
+HXLINE(  99)				{
+HXLINE(  99)					p = (p + 1);
+HXDLIN(  99)					int v1 = ((( (int)(_hx_array_unsafe_get(this->HASH,i)) ) >> 16) & 255);
+HXDLIN(  99)					out->b[(p - 1)] = ( (unsigned char)(v1) );
+            				}
+HXLINE( 100)				{
+HXLINE( 100)					p = (p + 1);
+HXDLIN( 100)					int v2 = ((( (int)(_hx_array_unsafe_get(this->HASH,i)) ) >> 8) & 255);
+HXDLIN( 100)					out->b[(p - 1)] = ( (unsigned char)(v2) );
+            				}
+HXLINE( 101)				{
+HXLINE( 101)					p = (p + 1);
+HXDLIN( 101)					int v3 = (( (int)(_hx_array_unsafe_get(this->HASH,i)) ) & 255);
+HXDLIN( 101)					out->b[(p - 1)] = ( (unsigned char)(v3) );
+            				}
+            			}
+            		}
+HXLINE( 104)		return out;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Sha256_obj,digest,return )
+
+void Sha256_obj::update( ::haxe::io::Bytes data){
+            	HX_STACKFRAME(&_hx_pos_5ce68c6c91deeb3d_166_update)
+HXLINE( 172)		int pos = 0;
+HXLINE( 173)		int len = data->length;
+HXLINE( 174)		this->totalLength = (this->totalLength + len);
+HXLINE( 176)		while((len > 0)){
+HXLINE( 177)			int toCopy = (64 - this->bufferPos);
+HXLINE( 178)			if ((toCopy > len)) {
+HXLINE( 178)				toCopy = len;
+            			}
+HXLINE( 180)			this->buffer->blit(this->bufferPos,data,pos,toCopy);
+HXLINE( 181)			this->bufferPos = (this->bufferPos + toCopy);
+HXLINE( 182)			pos = (pos + toCopy);
+HXLINE( 183)			len = (len - toCopy);
+HXLINE( 185)			if ((this->bufferPos == 64)) {
+HXLINE( 186)				this->processBlock(this->buffer,0);
+HXLINE( 187)				this->bufferPos = 0;
+            			}
+            		}
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC1(Sha256_obj,update,(void))
+
+void Sha256_obj::processBlock( ::haxe::io::Bytes block,int offset){
+            	HX_STACKFRAME(&_hx_pos_5ce68c6c91deeb3d_193_processBlock)
+HXLINE( 195)		::Array< int > K = ::Array_obj< int >::fromData( _hx_array_data_af0be1cc_12,64)->copy();
+HXLINE( 204)		::Array< int > W = ::Array_obj< int >::__new(64);
+HXLINE( 206)		{
+HXLINE( 207)			W->__unsafe_set(0,::haxe::crypto::Sha256_obj::bytesToInt(block,offset));
+HXDLIN( 207)			W->__unsafe_set(1,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 4)));
+HXDLIN( 207)			W->__unsafe_set(2,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 8)));
+HXDLIN( 207)			W->__unsafe_set(3,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 12)));
+HXDLIN( 207)			W->__unsafe_set(4,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 16)));
+HXDLIN( 207)			W->__unsafe_set(5,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 20)));
+HXDLIN( 207)			W->__unsafe_set(6,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 24)));
+HXDLIN( 207)			W->__unsafe_set(7,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 28)));
+HXDLIN( 207)			W->__unsafe_set(8,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 32)));
+HXDLIN( 207)			W->__unsafe_set(9,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 36)));
+HXDLIN( 207)			W->__unsafe_set(10,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 40)));
+HXDLIN( 207)			W->__unsafe_set(11,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 44)));
+HXDLIN( 207)			W->__unsafe_set(12,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 48)));
+HXDLIN( 207)			W->__unsafe_set(13,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 52)));
+HXDLIN( 207)			W->__unsafe_set(14,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 56)));
+HXDLIN( 207)			W->__unsafe_set(15,::haxe::crypto::Sha256_obj::bytesToInt(block,(offset + 60)));
+            		}
+HXLINE( 210)		{
+HXLINE( 210)			int _g = 16;
+HXDLIN( 210)			while((_g < 64)){
+HXLINE( 210)				_g = (_g + 1);
+HXDLIN( 210)				int j = (_g - 1);
+HXLINE( 211)				{
+HXLINE( 211)					int x = ( (int)(_hx_array_unsafe_get(W,(j - 2))) );
+HXDLIN( 211)					int x1 = (((::hx::UShr(x,17) | (x << 15)) ^ (::hx::UShr(x,19) | (x << 13))) ^ ::hx::UShr(x,10));
+HXDLIN( 211)					int y = ( (int)(_hx_array_unsafe_get(W,(j - 7))) );
+HXDLIN( 211)					int lsw = ((x1 & 65535) + (y & 65535));
+HXDLIN( 211)					int x2 = (((((x1 >> 16) + (y >> 16)) + (lsw >> 16)) << 16) | (lsw & 65535));
+HXDLIN( 211)					int x3 = ( (int)(_hx_array_unsafe_get(W,(j - 15))) );
+HXDLIN( 211)					int y1 = (((::hx::UShr(x3,7) | (x3 << 25)) ^ (::hx::UShr(x3,18) | (x3 << 14))) ^ ::hx::UShr(x3,3));
+HXDLIN( 211)					int lsw1 = ((x2 & 65535) + (y1 & 65535));
+HXDLIN( 211)					int x4 = (((((x2 >> 16) + (y1 >> 16)) + (lsw1 >> 16)) << 16) | (lsw1 & 65535));
+HXDLIN( 211)					int y2 = ( (int)(_hx_array_unsafe_get(W,(j - 16))) );
+HXDLIN( 211)					int lsw2 = ((x4 & 65535) + (y2 & 65535));
+HXDLIN( 211)					W->__unsafe_set(j,(((((x4 >> 16) + (y2 >> 16)) + (lsw2 >> 16)) << 16) | (lsw2 & 65535)));
+            				}
+            			}
+            		}
+HXLINE( 214)		int a = ( (int)(_hx_array_unsafe_get(this->HASH,0)) );
+HXLINE( 215)		int b = ( (int)(_hx_array_unsafe_get(this->HASH,1)) );
+HXLINE( 216)		int c = ( (int)(_hx_array_unsafe_get(this->HASH,2)) );
+HXLINE( 217)		int d = ( (int)(_hx_array_unsafe_get(this->HASH,3)) );
+HXLINE( 218)		int e = ( (int)(_hx_array_unsafe_get(this->HASH,4)) );
+HXLINE( 219)		int f = ( (int)(_hx_array_unsafe_get(this->HASH,5)) );
+HXLINE( 220)		int g = ( (int)(_hx_array_unsafe_get(this->HASH,6)) );
+HXLINE( 221)		int h = ( (int)(_hx_array_unsafe_get(this->HASH,7)) );
+HXLINE( 223)		{
+HXLINE( 223)			int _g1 = 0;
+HXDLIN( 223)			while((_g1 < 64)){
+HXLINE( 223)				_g1 = (_g1 + 1);
+HXDLIN( 223)				int j1 = (_g1 - 1);
+HXLINE( 224)				int y3 = (((::hx::UShr(e,6) | (e << 26)) ^ (::hx::UShr(e,11) | (e << 21))) ^ (::hx::UShr(e,25) | (e << 7)));
+HXDLIN( 224)				int lsw3 = ((h & 65535) + (y3 & 65535));
+HXDLIN( 224)				int x5 = (((((h >> 16) + (y3 >> 16)) + (lsw3 >> 16)) << 16) | (lsw3 & 65535));
+HXDLIN( 224)				int y4 = ((e & f) ^ (~(e) & g));
+HXDLIN( 224)				int lsw4 = ((x5 & 65535) + (y4 & 65535));
+HXDLIN( 224)				int x6 = (((((x5 >> 16) + (y4 >> 16)) + (lsw4 >> 16)) << 16) | (lsw4 & 65535));
+HXDLIN( 224)				int y5 = ( (int)(_hx_array_unsafe_get(K,j1)) );
+HXDLIN( 224)				int lsw5 = ((x6 & 65535) + (y5 & 65535));
+HXDLIN( 224)				int x7 = (((((x6 >> 16) + (y5 >> 16)) + (lsw5 >> 16)) << 16) | (lsw5 & 65535));
+HXDLIN( 224)				int y6 = ( (int)(_hx_array_unsafe_get(W,j1)) );
+HXDLIN( 224)				int lsw6 = ((x7 & 65535) + (y6 & 65535));
+HXDLIN( 224)				int T1 = (((((x7 >> 16) + (y6 >> 16)) + (lsw6 >> 16)) << 16) | (lsw6 & 65535));
+HXLINE( 225)				int x8 = (((::hx::UShr(a,2) | (a << 30)) ^ (::hx::UShr(a,13) | (a << 19))) ^ (::hx::UShr(a,22) | (a << 10)));
+HXDLIN( 225)				int y7 = (((a & b) ^ (a & c)) ^ (b & c));
+HXDLIN( 225)				int lsw7 = ((x8 & 65535) + (y7 & 65535));
+HXDLIN( 225)				int T2 = (((((x8 >> 16) + (y7 >> 16)) + (lsw7 >> 16)) << 16) | (lsw7 & 65535));
+HXLINE( 227)				h = g;
+HXLINE( 228)				g = f;
+HXLINE( 229)				f = e;
+HXLINE( 230)				int lsw8 = ((d & 65535) + (T1 & 65535));
+HXDLIN( 230)				e = (((((d >> 16) + (T1 >> 16)) + (lsw8 >> 16)) << 16) | (lsw8 & 65535));
+HXLINE( 231)				d = c;
+HXLINE( 232)				c = b;
+HXLINE( 233)				b = a;
+HXLINE( 234)				int lsw9 = ((T1 & 65535) + (T2 & 65535));
+HXDLIN( 234)				a = (((((T1 >> 16) + (T2 >> 16)) + (lsw9 >> 16)) << 16) | (lsw9 & 65535));
+            			}
+            		}
+HXLINE( 237)		{
+HXLINE( 237)			::Array< int > this1 = this->HASH;
+HXDLIN( 237)			int y8 = ( (int)(_hx_array_unsafe_get(this->HASH,0)) );
+HXDLIN( 237)			int lsw10 = ((a & 65535) + (y8 & 65535));
+HXDLIN( 237)			this1->__unsafe_set(0,(((((a >> 16) + (y8 >> 16)) + (lsw10 >> 16)) << 16) | (lsw10 & 65535)));
+            		}
+HXLINE( 238)		{
+HXLINE( 238)			::Array< int > this2 = this->HASH;
+HXDLIN( 238)			int y9 = ( (int)(_hx_array_unsafe_get(this->HASH,1)) );
+HXDLIN( 238)			int lsw11 = ((b & 65535) + (y9 & 65535));
+HXDLIN( 238)			this2->__unsafe_set(1,(((((b >> 16) + (y9 >> 16)) + (lsw11 >> 16)) << 16) | (lsw11 & 65535)));
+            		}
+HXLINE( 239)		{
+HXLINE( 239)			::Array< int > this3 = this->HASH;
+HXDLIN( 239)			int y10 = ( (int)(_hx_array_unsafe_get(this->HASH,2)) );
+HXDLIN( 239)			int lsw12 = ((c & 65535) + (y10 & 65535));
+HXDLIN( 239)			this3->__unsafe_set(2,(((((c >> 16) + (y10 >> 16)) + (lsw12 >> 16)) << 16) | (lsw12 & 65535)));
+            		}
+HXLINE( 240)		{
+HXLINE( 240)			::Array< int > this4 = this->HASH;
+HXDLIN( 240)			int y11 = ( (int)(_hx_array_unsafe_get(this->HASH,3)) );
+HXDLIN( 240)			int lsw13 = ((d & 65535) + (y11 & 65535));
+HXDLIN( 240)			this4->__unsafe_set(3,(((((d >> 16) + (y11 >> 16)) + (lsw13 >> 16)) << 16) | (lsw13 & 65535)));
+            		}
+HXLINE( 241)		{
+HXLINE( 241)			::Array< int > this5 = this->HASH;
+HXDLIN( 241)			int y12 = ( (int)(_hx_array_unsafe_get(this->HASH,4)) );
+HXDLIN( 241)			int lsw14 = ((e & 65535) + (y12 & 65535));
+HXDLIN( 241)			this5->__unsafe_set(4,(((((e >> 16) + (y12 >> 16)) + (lsw14 >> 16)) << 16) | (lsw14 & 65535)));
+            		}
+HXLINE( 242)		{
+HXLINE( 242)			::Array< int > this6 = this->HASH;
+HXDLIN( 242)			int y13 = ( (int)(_hx_array_unsafe_get(this->HASH,5)) );
+HXDLIN( 242)			int lsw15 = ((f & 65535) + (y13 & 65535));
+HXDLIN( 242)			this6->__unsafe_set(5,(((((f >> 16) + (y13 >> 16)) + (lsw15 >> 16)) << 16) | (lsw15 & 65535)));
+            		}
+HXLINE( 243)		{
+HXLINE( 243)			::Array< int > this7 = this->HASH;
+HXDLIN( 243)			int y14 = ( (int)(_hx_array_unsafe_get(this->HASH,6)) );
+HXDLIN( 243)			int lsw16 = ((g & 65535) + (y14 & 65535));
+HXDLIN( 243)			this7->__unsafe_set(6,(((((g >> 16) + (y14 >> 16)) + (lsw16 >> 16)) << 16) | (lsw16 & 65535)));
+            		}
+HXLINE( 244)		{
+HXLINE( 244)			::Array< int > this8 = this->HASH;
+HXDLIN( 244)			int y15 = ( (int)(_hx_array_unsafe_get(this->HASH,7)) );
+HXDLIN( 244)			int lsw17 = ((h & 65535) + (y15 & 65535));
+HXDLIN( 244)			this8->__unsafe_set(7,(((((h >> 16) + (y15 >> 16)) + (lsw17 >> 16)) << 16) | (lsw17 & 65535)));
+            		}
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(Sha256_obj,processBlock,(void))
+
 ::Array< int > Sha256_obj::doEncode(::Array< int > m,int l){
-            	HX_STACKFRAME(&_hx_pos_0a4e95b4276e5057_50_doEncode)
-HXLINE(  51)		::Array< int > K = ::Array_obj< int >::fromData( _hx_array_data_af0be1cc_4,64);
-HXLINE(  59)		::Array< int > HASH = ::Array_obj< int >::fromData( _hx_array_data_af0be1cc_5,8);
-HXLINE(  64)		::Array< int > W = ::Array_obj< int >::__new();
-HXLINE(  65)		W[64] = 0;
-HXLINE(  66)		int a;
-HXDLIN(  66)		int b;
-HXDLIN(  66)		int c;
-HXDLIN(  66)		int d;
-HXDLIN(  66)		int e;
-HXDLIN(  66)		int f;
-HXDLIN(  66)		int g;
-HXDLIN(  66)		int h;
-HXLINE(  67)		int T1;
-HXDLIN(  67)		int T2;
-HXLINE(  68)		int index = (l >> 5);
-HXDLIN(  68)		m[index] = (m->__get(index) | (128 << (24 - ::hx::Mod(l,32))));
-HXLINE(  69)		m[((((l + 64) >> 9) << 4) + 15)] = l;
-HXLINE(  70)		int i = 0;
-HXLINE(  71)		while((i < m->length)){
-HXLINE(  72)			a = HASH->__get(0);
-HXLINE(  73)			b = HASH->__get(1);
-HXLINE(  74)			c = HASH->__get(2);
-HXLINE(  75)			d = HASH->__get(3);
-HXLINE(  76)			e = HASH->__get(4);
-HXLINE(  77)			f = HASH->__get(5);
-HXLINE(  78)			g = HASH->__get(6);
-HXLINE(  79)			h = HASH->__get(7);
-HXLINE(  80)			{
-HXLINE(  80)				int _g = 0;
-HXDLIN(  80)				while((_g < 64)){
-HXLINE(  80)					_g = (_g + 1);
-HXDLIN(  80)					int j = (_g - 1);
-HXLINE(  81)					if ((j < 16)) {
-HXLINE(  82)						W[j] = m->__get((j + i));
+            	HX_STACKFRAME(&_hx_pos_5ce68c6c91deeb3d_248_doEncode)
+HXLINE( 249)		::Array< int > K = ::Array_obj< int >::fromData( _hx_array_data_af0be1cc_16,64)->copy();
+HXLINE( 257)		::Array< int > HASH = ::Array_obj< int >::fromData( _hx_array_data_af0be1cc_17,8)->copy();
+HXLINE( 262)		::Array< int > W = ::Array_obj< int >::__new(65);
+HXLINE( 263)		W->__unsafe_set(64,0);
+HXLINE( 264)		int a;
+HXDLIN( 264)		int b;
+HXDLIN( 264)		int c;
+HXDLIN( 264)		int d;
+HXDLIN( 264)		int e;
+HXDLIN( 264)		int f;
+HXDLIN( 264)		int g;
+HXDLIN( 264)		int h;
+HXLINE( 265)		int T1;
+HXDLIN( 265)		int T2;
+HXLINE( 266)		{
+HXLINE( 266)			int _g = (l >> 5);
+HXDLIN( 266)			{
+HXLINE( 266)				int val = (( (int)(_hx_array_unsafe_get(m,_g)) ) | (128 << (24 - ::hx::Mod(l,32))));
+HXDLIN( 266)				m->__unsafe_set(_g,val);
+            			}
+            		}
+HXLINE( 267)		m->__unsafe_set(((((l + 64) >> 9) << 4) + 15),l);
+HXLINE( 268)		int i = 0;
+HXLINE( 269)		while((i < m->length)){
+HXLINE( 270)			a = ( (int)(_hx_array_unsafe_get(HASH,0)) );
+HXLINE( 271)			b = ( (int)(_hx_array_unsafe_get(HASH,1)) );
+HXLINE( 272)			c = ( (int)(_hx_array_unsafe_get(HASH,2)) );
+HXLINE( 273)			d = ( (int)(_hx_array_unsafe_get(HASH,3)) );
+HXLINE( 274)			e = ( (int)(_hx_array_unsafe_get(HASH,4)) );
+HXLINE( 275)			f = ( (int)(_hx_array_unsafe_get(HASH,5)) );
+HXLINE( 276)			g = ( (int)(_hx_array_unsafe_get(HASH,6)) );
+HXLINE( 277)			h = ( (int)(_hx_array_unsafe_get(HASH,7)) );
+HXLINE( 278)			{
+HXLINE( 278)				int _g1 = 0;
+HXDLIN( 278)				while((_g1 < 64)){
+HXLINE( 278)					_g1 = (_g1 + 1);
+HXDLIN( 278)					int j = (_g1 - 1);
+HXLINE( 279)					if ((j < 16)) {
+HXLINE( 280)						int val1 = ( (int)(_hx_array_unsafe_get(m,(j + i))) );
+HXDLIN( 280)						W->__unsafe_set(j,val1);
             					}
             					else {
-HXLINE(  84)						int x = W->__get((j - 2));
-HXDLIN(  84)						int x1 = (((::hx::UShr(x,17) | (x << 15)) ^ (::hx::UShr(x,19) | (x << 13))) ^ ::hx::UShr(x,10));
-HXDLIN(  84)						int y = W->__get((j - 7));
-HXDLIN(  84)						int lsw = ((x1 & 65535) + (y & 65535));
-HXDLIN(  84)						int x2 = (((((x1 >> 16) + (y >> 16)) + (lsw >> 16)) << 16) | (lsw & 65535));
-HXDLIN(  84)						int x3 = W->__get((j - 15));
-HXDLIN(  84)						int y1 = (((::hx::UShr(x3,7) | (x3 << 25)) ^ (::hx::UShr(x3,18) | (x3 << 14))) ^ ::hx::UShr(x3,3));
-HXDLIN(  84)						int lsw1 = ((x2 & 65535) + (y1 & 65535));
-HXDLIN(  84)						int x4 = (((((x2 >> 16) + (y1 >> 16)) + (lsw1 >> 16)) << 16) | (lsw1 & 65535));
-HXDLIN(  84)						int y2 = W->__get((j - 16));
-HXDLIN(  84)						int lsw2 = ((x4 & 65535) + (y2 & 65535));
-HXDLIN(  84)						W[j] = (((((x4 >> 16) + (y2 >> 16)) + (lsw2 >> 16)) << 16) | (lsw2 & 65535));
+HXLINE( 282)						int x = ( (int)(_hx_array_unsafe_get(W,(j - 2))) );
+HXDLIN( 282)						int x1 = (((::hx::UShr(x,17) | (x << 15)) ^ (::hx::UShr(x,19) | (x << 13))) ^ ::hx::UShr(x,10));
+HXDLIN( 282)						int y = ( (int)(_hx_array_unsafe_get(W,(j - 7))) );
+HXDLIN( 282)						int lsw = ((x1 & 65535) + (y & 65535));
+HXDLIN( 282)						int x2 = (((((x1 >> 16) + (y >> 16)) + (lsw >> 16)) << 16) | (lsw & 65535));
+HXDLIN( 282)						int x3 = ( (int)(_hx_array_unsafe_get(W,(j - 15))) );
+HXDLIN( 282)						int y1 = (((::hx::UShr(x3,7) | (x3 << 25)) ^ (::hx::UShr(x3,18) | (x3 << 14))) ^ ::hx::UShr(x3,3));
+HXDLIN( 282)						int lsw1 = ((x2 & 65535) + (y1 & 65535));
+HXDLIN( 282)						int x4 = (((((x2 >> 16) + (y1 >> 16)) + (lsw1 >> 16)) << 16) | (lsw1 & 65535));
+HXDLIN( 282)						int y2 = ( (int)(_hx_array_unsafe_get(W,(j - 16))) );
+HXDLIN( 282)						int lsw2 = ((x4 & 65535) + (y2 & 65535));
+HXDLIN( 282)						W->__unsafe_set(j,(((((x4 >> 16) + (y2 >> 16)) + (lsw2 >> 16)) << 16) | (lsw2 & 65535)));
             					}
-HXLINE(  85)					int y3 = (((::hx::UShr(e,6) | (e << 26)) ^ (::hx::UShr(e,11) | (e << 21))) ^ (::hx::UShr(e,25) | (e << 7)));
-HXDLIN(  85)					int lsw3 = ((h & 65535) + (y3 & 65535));
-HXDLIN(  85)					int x5 = (((((h >> 16) + (y3 >> 16)) + (lsw3 >> 16)) << 16) | (lsw3 & 65535));
-HXDLIN(  85)					int y4 = ((e & f) ^ (~(e) & g));
-HXDLIN(  85)					int lsw4 = ((x5 & 65535) + (y4 & 65535));
-HXDLIN(  85)					int x6 = (((((x5 >> 16) + (y4 >> 16)) + (lsw4 >> 16)) << 16) | (lsw4 & 65535));
-HXDLIN(  85)					int y5 = K->__get(j);
-HXDLIN(  85)					int lsw5 = ((x6 & 65535) + (y5 & 65535));
-HXDLIN(  85)					int x7 = (((((x6 >> 16) + (y5 >> 16)) + (lsw5 >> 16)) << 16) | (lsw5 & 65535));
-HXDLIN(  85)					int y6 = W->__get(j);
-HXDLIN(  85)					int lsw6 = ((x7 & 65535) + (y6 & 65535));
-HXDLIN(  85)					T1 = (((((x7 >> 16) + (y6 >> 16)) + (lsw6 >> 16)) << 16) | (lsw6 & 65535));
-HXLINE(  86)					int x8 = (((::hx::UShr(a,2) | (a << 30)) ^ (::hx::UShr(a,13) | (a << 19))) ^ (::hx::UShr(a,22) | (a << 10)));
-HXDLIN(  86)					int y7 = (((a & b) ^ (a & c)) ^ (b & c));
-HXDLIN(  86)					int lsw7 = ((x8 & 65535) + (y7 & 65535));
-HXDLIN(  86)					T2 = (((((x8 >> 16) + (y7 >> 16)) + (lsw7 >> 16)) << 16) | (lsw7 & 65535));
-HXLINE(  87)					h = g;
-HXLINE(  88)					g = f;
-HXLINE(  89)					f = e;
-HXLINE(  90)					int lsw8 = ((d & 65535) + (T1 & 65535));
-HXDLIN(  90)					e = (((((d >> 16) + (T1 >> 16)) + (lsw8 >> 16)) << 16) | (lsw8 & 65535));
-HXLINE(  91)					d = c;
-HXLINE(  92)					c = b;
-HXLINE(  93)					b = a;
-HXLINE(  94)					int lsw9 = ((T1 & 65535) + (T2 & 65535));
-HXDLIN(  94)					a = (((((T1 >> 16) + (T2 >> 16)) + (lsw9 >> 16)) << 16) | (lsw9 & 65535));
+HXLINE( 283)					int y3 = (((::hx::UShr(e,6) | (e << 26)) ^ (::hx::UShr(e,11) | (e << 21))) ^ (::hx::UShr(e,25) | (e << 7)));
+HXDLIN( 283)					int lsw3 = ((h & 65535) + (y3 & 65535));
+HXDLIN( 283)					int x5 = (((((h >> 16) + (y3 >> 16)) + (lsw3 >> 16)) << 16) | (lsw3 & 65535));
+HXDLIN( 283)					int y4 = ((e & f) ^ (~(e) & g));
+HXDLIN( 283)					int lsw4 = ((x5 & 65535) + (y4 & 65535));
+HXDLIN( 283)					int x6 = (((((x5 >> 16) + (y4 >> 16)) + (lsw4 >> 16)) << 16) | (lsw4 & 65535));
+HXDLIN( 283)					int y5 = ( (int)(_hx_array_unsafe_get(K,j)) );
+HXDLIN( 283)					int lsw5 = ((x6 & 65535) + (y5 & 65535));
+HXDLIN( 283)					int x7 = (((((x6 >> 16) + (y5 >> 16)) + (lsw5 >> 16)) << 16) | (lsw5 & 65535));
+HXDLIN( 283)					int y6 = ( (int)(_hx_array_unsafe_get(W,j)) );
+HXDLIN( 283)					int lsw6 = ((x7 & 65535) + (y6 & 65535));
+HXDLIN( 283)					T1 = (((((x7 >> 16) + (y6 >> 16)) + (lsw6 >> 16)) << 16) | (lsw6 & 65535));
+HXLINE( 284)					int x8 = (((::hx::UShr(a,2) | (a << 30)) ^ (::hx::UShr(a,13) | (a << 19))) ^ (::hx::UShr(a,22) | (a << 10)));
+HXDLIN( 284)					int y7 = (((a & b) ^ (a & c)) ^ (b & c));
+HXDLIN( 284)					int lsw7 = ((x8 & 65535) + (y7 & 65535));
+HXDLIN( 284)					T2 = (((((x8 >> 16) + (y7 >> 16)) + (lsw7 >> 16)) << 16) | (lsw7 & 65535));
+HXLINE( 285)					h = g;
+HXLINE( 286)					g = f;
+HXLINE( 287)					f = e;
+HXLINE( 288)					int lsw8 = ((d & 65535) + (T1 & 65535));
+HXDLIN( 288)					e = (((((d >> 16) + (T1 >> 16)) + (lsw8 >> 16)) << 16) | (lsw8 & 65535));
+HXLINE( 289)					d = c;
+HXLINE( 290)					c = b;
+HXLINE( 291)					b = a;
+HXLINE( 292)					int lsw9 = ((T1 & 65535) + (T2 & 65535));
+HXDLIN( 292)					a = (((((T1 >> 16) + (T2 >> 16)) + (lsw9 >> 16)) << 16) | (lsw9 & 65535));
             				}
             			}
-HXLINE(  96)			int y8 = HASH->__get(0);
-HXDLIN(  96)			int lsw10 = ((a & 65535) + (y8 & 65535));
-HXDLIN(  96)			HASH[0] = (((((a >> 16) + (y8 >> 16)) + (lsw10 >> 16)) << 16) | (lsw10 & 65535));
-HXLINE(  97)			int y9 = HASH->__get(1);
-HXDLIN(  97)			int lsw11 = ((b & 65535) + (y9 & 65535));
-HXDLIN(  97)			HASH[1] = (((((b >> 16) + (y9 >> 16)) + (lsw11 >> 16)) << 16) | (lsw11 & 65535));
-HXLINE(  98)			int y10 = HASH->__get(2);
-HXDLIN(  98)			int lsw12 = ((c & 65535) + (y10 & 65535));
-HXDLIN(  98)			HASH[2] = (((((c >> 16) + (y10 >> 16)) + (lsw12 >> 16)) << 16) | (lsw12 & 65535));
-HXLINE(  99)			int y11 = HASH->__get(3);
-HXDLIN(  99)			int lsw13 = ((d & 65535) + (y11 & 65535));
-HXDLIN(  99)			HASH[3] = (((((d >> 16) + (y11 >> 16)) + (lsw13 >> 16)) << 16) | (lsw13 & 65535));
-HXLINE( 100)			int y12 = HASH->__get(4);
-HXDLIN( 100)			int lsw14 = ((e & 65535) + (y12 & 65535));
-HXDLIN( 100)			HASH[4] = (((((e >> 16) + (y12 >> 16)) + (lsw14 >> 16)) << 16) | (lsw14 & 65535));
-HXLINE( 101)			int y13 = HASH->__get(5);
-HXDLIN( 101)			int lsw15 = ((f & 65535) + (y13 & 65535));
-HXDLIN( 101)			HASH[5] = (((((f >> 16) + (y13 >> 16)) + (lsw15 >> 16)) << 16) | (lsw15 & 65535));
-HXLINE( 102)			int y14 = HASH->__get(6);
-HXDLIN( 102)			int lsw16 = ((g & 65535) + (y14 & 65535));
-HXDLIN( 102)			HASH[6] = (((((g >> 16) + (y14 >> 16)) + (lsw16 >> 16)) << 16) | (lsw16 & 65535));
-HXLINE( 103)			int y15 = HASH->__get(7);
-HXDLIN( 103)			int lsw17 = ((h & 65535) + (y15 & 65535));
-HXDLIN( 103)			HASH[7] = (((((h >> 16) + (y15 >> 16)) + (lsw17 >> 16)) << 16) | (lsw17 & 65535));
-HXLINE( 104)			i = (i + 16);
+HXLINE( 294)			{
+HXLINE( 294)				int y8 = ( (int)(_hx_array_unsafe_get(HASH,0)) );
+HXDLIN( 294)				int lsw10 = ((a & 65535) + (y8 & 65535));
+HXDLIN( 294)				HASH->__unsafe_set(0,(((((a >> 16) + (y8 >> 16)) + (lsw10 >> 16)) << 16) | (lsw10 & 65535)));
+            			}
+HXLINE( 295)			{
+HXLINE( 295)				int y9 = ( (int)(_hx_array_unsafe_get(HASH,1)) );
+HXDLIN( 295)				int lsw11 = ((b & 65535) + (y9 & 65535));
+HXDLIN( 295)				HASH->__unsafe_set(1,(((((b >> 16) + (y9 >> 16)) + (lsw11 >> 16)) << 16) | (lsw11 & 65535)));
+            			}
+HXLINE( 296)			{
+HXLINE( 296)				int y10 = ( (int)(_hx_array_unsafe_get(HASH,2)) );
+HXDLIN( 296)				int lsw12 = ((c & 65535) + (y10 & 65535));
+HXDLIN( 296)				HASH->__unsafe_set(2,(((((c >> 16) + (y10 >> 16)) + (lsw12 >> 16)) << 16) | (lsw12 & 65535)));
+            			}
+HXLINE( 297)			{
+HXLINE( 297)				int y11 = ( (int)(_hx_array_unsafe_get(HASH,3)) );
+HXDLIN( 297)				int lsw13 = ((d & 65535) + (y11 & 65535));
+HXDLIN( 297)				HASH->__unsafe_set(3,(((((d >> 16) + (y11 >> 16)) + (lsw13 >> 16)) << 16) | (lsw13 & 65535)));
+            			}
+HXLINE( 298)			{
+HXLINE( 298)				int y12 = ( (int)(_hx_array_unsafe_get(HASH,4)) );
+HXDLIN( 298)				int lsw14 = ((e & 65535) + (y12 & 65535));
+HXDLIN( 298)				HASH->__unsafe_set(4,(((((e >> 16) + (y12 >> 16)) + (lsw14 >> 16)) << 16) | (lsw14 & 65535)));
+            			}
+HXLINE( 299)			{
+HXLINE( 299)				int y13 = ( (int)(_hx_array_unsafe_get(HASH,5)) );
+HXDLIN( 299)				int lsw15 = ((f & 65535) + (y13 & 65535));
+HXDLIN( 299)				HASH->__unsafe_set(5,(((((f >> 16) + (y13 >> 16)) + (lsw15 >> 16)) << 16) | (lsw15 & 65535)));
+            			}
+HXLINE( 300)			{
+HXLINE( 300)				int y14 = ( (int)(_hx_array_unsafe_get(HASH,6)) );
+HXDLIN( 300)				int lsw16 = ((g & 65535) + (y14 & 65535));
+HXDLIN( 300)				HASH->__unsafe_set(6,(((((g >> 16) + (y14 >> 16)) + (lsw16 >> 16)) << 16) | (lsw16 & 65535)));
+            			}
+HXLINE( 301)			{
+HXLINE( 301)				int y15 = ( (int)(_hx_array_unsafe_get(HASH,7)) );
+HXDLIN( 301)				int lsw17 = ((h & 65535) + (y15 & 65535));
+HXDLIN( 301)				HASH->__unsafe_set(7,(((((h >> 16) + (y15 >> 16)) + (lsw17 >> 16)) << 16) | (lsw17 & 65535)));
+            			}
+HXLINE( 302)			i = (i + 16);
             		}
-HXLINE( 106)		return HASH;
+HXLINE( 304)		return HASH;
             	}
 
 
 HX_DEFINE_DYNAMIC_FUNC2(Sha256_obj,doEncode,return )
 
  ::haxe::io::Bytes Sha256_obj::make( ::haxe::io::Bytes b){
-            	HX_GC_STACKFRAME(&_hx_pos_0a4e95b4276e5057_35_make)
-HXLINE(  36)		 ::haxe::crypto::Sha256 h =  ::haxe::crypto::Sha256_obj::__alloc( HX_CTX );
-HXDLIN(  36)		::Array< int > h1 = ::haxe::crypto::Sha256_obj::bytes2blks(b);
-HXDLIN(  36)		::Array< int > h2 = h->doEncode(h1,(b->length * 8));
-HXLINE(  37)		 ::haxe::io::Bytes out = ::haxe::io::Bytes_obj::alloc(32);
-HXLINE(  38)		int p = 0;
-HXLINE(  39)		{
-HXLINE(  39)			int _g = 0;
-HXDLIN(  39)			while((_g < 8)){
-HXLINE(  39)				_g = (_g + 1);
-HXDLIN(  39)				int i = (_g - 1);
-HXLINE(  40)				{
-HXLINE(  40)					p = (p + 1);
-HXDLIN(  40)					out->b[(p - 1)] = ( (unsigned char)(::hx::UShr(h2->__get(i),24)) );
+            	HX_GC_STACKFRAME(&_hx_pos_5ce68c6c91deeb3d_127_make)
+HXLINE( 137)		 ::haxe::crypto::Sha256 h =  ::haxe::crypto::Sha256_obj::__alloc( HX_CTX );
+HXDLIN( 137)		::Array< int > h1 = ::haxe::crypto::Sha256_obj::bytes2blks(b);
+HXDLIN( 137)		::Array< int > h2 = h->doEncode(h1,(b->length * 8));
+HXLINE( 138)		 ::haxe::io::Bytes out = ::haxe::io::Bytes_obj::alloc(32);
+HXLINE( 139)		int p = 0;
+HXLINE( 140)		{
+HXLINE( 140)			int _g = 0;
+HXDLIN( 140)			while((_g < 8)){
+HXLINE( 140)				_g = (_g + 1);
+HXDLIN( 140)				int i = (_g - 1);
+HXLINE( 141)				{
+HXLINE( 141)					p = (p + 1);
+HXDLIN( 141)					int v = ::hx::UShr(( (int)(_hx_array_unsafe_get(h2,i)) ),24);
+HXDLIN( 141)					out->b[(p - 1)] = ( (unsigned char)(v) );
             				}
-HXLINE(  41)				{
-HXLINE(  41)					p = (p + 1);
-HXDLIN(  41)					out->b[(p - 1)] = ( (unsigned char)(((h2->__get(i) >> 16) & 255)) );
+HXLINE( 142)				{
+HXLINE( 142)					p = (p + 1);
+HXDLIN( 142)					int v1 = ((( (int)(_hx_array_unsafe_get(h2,i)) ) >> 16) & 255);
+HXDLIN( 142)					out->b[(p - 1)] = ( (unsigned char)(v1) );
             				}
-HXLINE(  42)				{
-HXLINE(  42)					p = (p + 1);
-HXDLIN(  42)					out->b[(p - 1)] = ( (unsigned char)(((h2->__get(i) >> 8) & 255)) );
+HXLINE( 143)				{
+HXLINE( 143)					p = (p + 1);
+HXDLIN( 143)					int v2 = ((( (int)(_hx_array_unsafe_get(h2,i)) ) >> 8) & 255);
+HXDLIN( 143)					out->b[(p - 1)] = ( (unsigned char)(v2) );
             				}
-HXLINE(  43)				{
-HXLINE(  43)					p = (p + 1);
-HXDLIN(  43)					out->b[(p - 1)] = ( (unsigned char)((h2->__get(i) & 255)) );
+HXLINE( 144)				{
+HXLINE( 144)					p = (p + 1);
+HXDLIN( 144)					int v3 = (( (int)(_hx_array_unsafe_get(h2,i)) ) & 255);
+HXDLIN( 144)					out->b[(p - 1)] = ( (unsigned char)(v3) );
             				}
             			}
             		}
-HXLINE(  45)		return out;
+HXLINE( 146)		return out;
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Sha256_obj,make,return )
 
+int Sha256_obj::bytesToInt( ::haxe::io::Bytes bs,int off){
+            	HX_STACKFRAME(&_hx_pos_5ce68c6c91deeb3d_335_bytesToInt)
+HXLINE( 336)		int n = (( (int)(bs->b->__get(off)) ) << 24);
+HXLINE( 337)		off = (off + 1);
+HXDLIN( 337)		n = (n | (( (int)(bs->b->__get(off)) ) << 16));
+HXLINE( 338)		off = (off + 1);
+HXDLIN( 338)		n = (n | (( (int)(bs->b->__get(off)) ) << 8));
+HXLINE( 339)		off = (off + 1);
+HXDLIN( 339)		n = (n | ( (int)(bs->b->__get(off)) ));
+HXLINE( 340)		return n;
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC2(Sha256_obj,bytesToInt,return )
+
 ::Array< int > Sha256_obj::bytes2blks( ::haxe::io::Bytes b){
-            	HX_STACKFRAME(&_hx_pos_0a4e95b4276e5057_133_bytes2blks)
-HXLINE( 134)		int nblk = (((b->length + 8) >> 6) + 1);
-HXLINE( 135)		::Array< int > blks = ::Array_obj< int >::__new();
-HXLINE( 137)		{
-HXLINE( 137)			int _g = 0;
-HXDLIN( 137)			int _g1 = (nblk * 16);
-HXDLIN( 137)			while((_g < _g1)){
-HXLINE( 137)				_g = (_g + 1);
-HXLINE( 138)				blks[(_g - 1)] = 0;
+            	HX_STACKFRAME(&_hx_pos_5ce68c6c91deeb3d_343_bytes2blks)
+HXLINE( 344)		int nblk = (((b->length + 8) >> 6) + 1);
+HXLINE( 345)		::Array< int > blks = ::Array_obj< int >::__new((nblk * 16));
+HXLINE( 347)		{
+HXLINE( 347)			int _g = 0;
+HXDLIN( 347)			int _g1 = (nblk * 16);
+HXDLIN( 347)			while((_g < _g1)){
+HXLINE( 347)				_g = (_g + 1);
+HXLINE( 348)				blks->__unsafe_set((_g - 1),0);
             			}
             		}
-HXLINE( 139)		{
-HXLINE( 139)			int _g2 = 0;
-HXDLIN( 139)			int _g3 = b->length;
-HXDLIN( 139)			while((_g2 < _g3)){
-HXLINE( 139)				_g2 = (_g2 + 1);
-HXDLIN( 139)				int i = (_g2 - 1);
-HXLINE( 140)				int p = (i >> 2);
-HXLINE( 141)				blks[p] = (blks->__get(p) | (( (int)(b->b->__get(i)) ) << (24 - ((i & 3) << 3))));
+HXLINE( 349)		{
+HXLINE( 349)			int _g2 = 0;
+HXDLIN( 349)			int _g3 = b->length;
+HXDLIN( 349)			while((_g2 < _g3)){
+HXLINE( 349)				_g2 = (_g2 + 1);
+HXDLIN( 349)				int i = (_g2 - 1);
+HXLINE( 350)				int p = (i >> 2);
+HXLINE( 351)				{
+HXLINE( 351)					int val = ( (int)(_hx_array_unsafe_get(blks,p)) );
+HXDLIN( 351)					blks->__unsafe_set(p,(val | (( (int)(b->b->__get(i)) ) << (24 - ((i & 3) << 3)))));
+            				}
             			}
             		}
-HXLINE( 143)		int i1 = b->length;
-HXLINE( 144)		int p1 = (i1 >> 2);
-HXLINE( 145)		blks[p1] = (blks->__get(p1) | (128 << (24 - ((i1 & 3) << 3))));
-HXLINE( 146)		blks[((nblk * 16) - 1)] = (b->length * 8);
-HXLINE( 147)		return blks;
+HXLINE( 353)		int i1 = b->length;
+HXLINE( 354)		int p1 = (i1 >> 2);
+HXLINE( 355)		{
+HXLINE( 355)			int val1 = (( (int)(_hx_array_unsafe_get(blks,p1)) ) | (128 << (24 - ((i1 & 3) << 3))));
+HXDLIN( 355)			blks->__unsafe_set(p1,val1);
+            		}
+HXLINE( 356)		blks->__unsafe_set(((nblk * 16) - 1),(b->length * 8));
+HXLINE( 357)		return blks;
             	}
 
 
 STATIC_HX_DEFINE_DYNAMIC_FUNC1(Sha256_obj,bytes2blks,return )
 
 
+::hx::ObjectPtr< Sha256_obj > Sha256_obj::__new() {
+	::hx::ObjectPtr< Sha256_obj > __this = new Sha256_obj();
+	__this->__construct();
+	return __this;
+}
+
+::hx::ObjectPtr< Sha256_obj > Sha256_obj::__alloc(::hx::Ctx *_hx_ctx) {
+	Sha256_obj *__this = (Sha256_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(Sha256_obj), true, "haxe.crypto.Sha256"));
+	*(void **)__this = Sha256_obj::_hx_vtable;
+	__this->__construct();
+	return __this;
+}
+
 Sha256_obj::Sha256_obj()
 {
 }
 
+void Sha256_obj::__Mark(HX_MARK_PARAMS)
+{
+	HX_MARK_BEGIN_CLASS(Sha256);
+	HX_MARK_MEMBER_NAME(HASH,"HASH");
+	HX_MARK_MEMBER_NAME(buffer,"buffer");
+	HX_MARK_MEMBER_NAME(bufferPos,"bufferPos");
+	HX_MARK_MEMBER_NAME(totalLength,"totalLength");
+	HX_MARK_END_CLASS();
+}
+
+void Sha256_obj::__Visit(HX_VISIT_PARAMS)
+{
+	HX_VISIT_MEMBER_NAME(HASH,"HASH");
+	HX_VISIT_MEMBER_NAME(buffer,"buffer");
+	HX_VISIT_MEMBER_NAME(bufferPos,"bufferPos");
+	HX_VISIT_MEMBER_NAME(totalLength,"totalLength");
+}
+
 ::hx::Val Sha256_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
 {
 	switch(inName.length) {
+	case 4:
+		if (HX_FIELD_EQ(inName,"HASH") ) { return ::hx::Val( HASH ); }
+		break;
+	case 6:
+		if (HX_FIELD_EQ(inName,"buffer") ) { return ::hx::Val( buffer ); }
+		if (HX_FIELD_EQ(inName,"digest") ) { return ::hx::Val( digest_dyn() ); }
+		if (HX_FIELD_EQ(inName,"update") ) { return ::hx::Val( update_dyn() ); }
+		break;
 	case 8:
 		if (HX_FIELD_EQ(inName,"doEncode") ) { return ::hx::Val( doEncode_dyn() ); }
+		break;
+	case 9:
+		if (HX_FIELD_EQ(inName,"bufferPos") ) { return ::hx::Val( bufferPos ); }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"totalLength") ) { return ::hx::Val( totalLength ); }
+		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"processBlock") ) { return ::hx::Val( processBlock_dyn() ); }
 	}
 	return super::__Field(inName,inCallProp);
 }
@@ -240,17 +586,58 @@ bool Sha256_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::Pr
 		if (HX_FIELD_EQ(inName,"make") ) { outValue = make_dyn(); return true; }
 		break;
 	case 10:
+		if (HX_FIELD_EQ(inName,"bytesToInt") ) { outValue = bytesToInt_dyn(); return true; }
 		if (HX_FIELD_EQ(inName,"bytes2blks") ) { outValue = bytes2blks_dyn(); return true; }
 	}
 	return false;
 }
 
+::hx::Val Sha256_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 4:
+		if (HX_FIELD_EQ(inName,"HASH") ) { HASH=inValue.Cast< ::Array< int > >(); return inValue; }
+		break;
+	case 6:
+		if (HX_FIELD_EQ(inName,"buffer") ) { buffer=inValue.Cast<  ::haxe::io::Bytes >(); return inValue; }
+		break;
+	case 9:
+		if (HX_FIELD_EQ(inName,"bufferPos") ) { bufferPos=inValue.Cast< int >(); return inValue; }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"totalLength") ) { totalLength=inValue.Cast< int >(); return inValue; }
+	}
+	return super::__SetField(inName,inValue,inCallProp);
+}
+
+void Sha256_obj::__GetFields(Array< ::String> &outFields)
+{
+	outFields->push(HX_("HASH",ce,f7,c8,2f));
+	outFields->push(HX_("buffer",00,bd,94,d0));
+	outFields->push(HX_("bufferPos",74,78,7c,b1));
+	outFields->push(HX_("totalLength",ca,87,3d,65));
+	super::__GetFields(outFields);
+};
+
 #ifdef HXCPP_SCRIPTABLE
-static ::hx::StorageInfo *Sha256_obj_sMemberStorageInfo = 0;
+static ::hx::StorageInfo Sha256_obj_sMemberStorageInfo[] = {
+	{::hx::fsObject /* ::Array< int > */ ,(int)offsetof(Sha256_obj,HASH),HX_("HASH",ce,f7,c8,2f)},
+	{::hx::fsObject /*  ::haxe::io::Bytes */ ,(int)offsetof(Sha256_obj,buffer),HX_("buffer",00,bd,94,d0)},
+	{::hx::fsInt,(int)offsetof(Sha256_obj,bufferPos),HX_("bufferPos",74,78,7c,b1)},
+	{::hx::fsInt,(int)offsetof(Sha256_obj,totalLength),HX_("totalLength",ca,87,3d,65)},
+	{ ::hx::fsUnknown, 0, null()}
+};
 static ::hx::StaticInfo *Sha256_obj_sStaticStorageInfo = 0;
 #endif
 
 static ::String Sha256_obj_sMemberFields[] = {
+	HX_("HASH",ce,f7,c8,2f),
+	HX_("buffer",00,bd,94,d0),
+	HX_("bufferPos",74,78,7c,b1),
+	HX_("totalLength",ca,87,3d,65),
+	HX_("digest",44,00,25,b5),
+	HX_("update",09,86,05,87),
+	HX_("processBlock",5e,10,b1,9c),
 	HX_("doEncode",01,78,fb,8d),
 	::String(null()) };
 
@@ -258,6 +645,7 @@ static ::String Sha256_obj_sMemberFields[] = {
 
 static ::String Sha256_obj_sStaticFields[] = {
 	HX_("make",ee,39,56,48),
+	HX_("bytesToInt",c9,c1,b9,45),
 	HX_("bytes2blks",d9,ce,9c,a9),
 	::String(null())
 };
diff --git a/Sources/c_borogove/src/haxe/crypto/random/SecureRandom.cpp b/Sources/c_borogove/src/haxe/crypto/random/SecureRandom.cpp
new file mode 100644
index 0000000..52c8f5e
--- /dev/null
+++ b/Sources/c_borogove/src/haxe/crypto/random/SecureRandom.cpp
@@ -0,0 +1,246 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_Std
+#include <Std.h>
+#endif
+#ifndef INCLUDED_StringTools
+#include <StringTools.h>
+#endif
+#ifndef INCLUDED_Sys
+#include <Sys.h>
+#endif
+#ifndef INCLUDED_haxe_crypto_random_SecureRandom
+#include <haxe/crypto/random/SecureRandom.h>
+#endif
+#ifndef INCLUDED_haxe_io_Bytes
+#include <haxe/io/Bytes.h>
+#endif
+#ifndef INCLUDED_haxe_io_Input
+#include <haxe/io/Input.h>
+#endif
+#ifndef INCLUDED_sys_FileSystem
+#include <sys/FileSystem.h>
+#endif
+#ifndef INCLUDED_sys_io_File
+#include <sys/io/File.h>
+#endif
+#ifndef INCLUDED_sys_io_FileInput
+#include <sys/io/FileInput.h>
+#endif
+#ifndef INCLUDED_sys_io_Process
+#include <sys/io/Process.h>
+#endif
+
+HX_LOCAL_STACK_FRAME(_hx_pos_f39c4520f0e8ea03_26_init,"haxe.crypto.random.SecureRandom","init",0x0e9ad35e,"haxe.crypto.random.SecureRandom.init","haxe/crypto/random/SecureRandom.hx",26,0xd102d71d)
+HX_LOCAL_STACK_FRAME(_hx_pos_f39c4520f0e8ea03_32_int,"haxe.crypto.random.SecureRandom","int",0x3e0e7861,"haxe.crypto.random.SecureRandom.int","haxe/crypto/random/SecureRandom.hx",32,0xd102d71d)
+HX_LOCAL_STACK_FRAME(_hx_pos_f39c4520f0e8ea03_200_sysInt,"haxe.crypto.random.SecureRandom","sysInt",0x64f2c5b0,"haxe.crypto.random.SecureRandom.sysInt","haxe/crypto/random/SecureRandom.hx",200,0xd102d71d)
+HX_LOCAL_STACK_FRAME(_hx_pos_f39c4520f0e8ea03_226_winInt,"haxe.crypto.random.SecureRandom","winInt",0xc4a8de01,"haxe.crypto.random.SecureRandom.winInt","haxe/crypto/random/SecureRandom.hx",226,0xd102d71d)
+HX_LOCAL_STACK_FRAME(_hx_pos_f39c4520f0e8ea03_12_boot,"haxe.crypto.random.SecureRandom","boot",0x09fb1c80,"haxe.crypto.random.SecureRandom.boot","haxe/crypto/random/SecureRandom.hx",12,0xd102d71d)
+namespace haxe{
+namespace crypto{
+namespace random{
+
+void SecureRandom_obj::__construct() { }
+
+Dynamic SecureRandom_obj::__CreateEmpty() { return new SecureRandom_obj; }
+
+void *SecureRandom_obj::_hx_vtable = 0;
+
+Dynamic SecureRandom_obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< SecureRandom_obj > _hx_result = new SecureRandom_obj();
+	_hx_result->__construct();
+	return _hx_result;
+}
+
+bool SecureRandom_obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x315293ac;
+}
+
+bool SecureRandom_obj::initialized;
+
+void SecureRandom_obj::init(){
+            	HX_STACKFRAME(&_hx_pos_f39c4520f0e8ea03_26_init)
+HXDLIN(  26)		::haxe::crypto::random::SecureRandom_obj::initialized = true;
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC0(SecureRandom_obj,init,(void))
+
+int SecureRandom_obj::_hx_int(){
+            	HX_STACKFRAME(&_hx_pos_f39c4520f0e8ea03_32_int)
+HXLINE(  33)		if (!(::haxe::crypto::random::SecureRandom_obj::initialized)) {
+HXLINE(  34)			::haxe::crypto::random::SecureRandom_obj::init();
+            		}
+HXLINE(  52)		return ::haxe::crypto::random::SecureRandom_obj::sysInt();
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC0(SecureRandom_obj,_hx_int,return )
+
+int SecureRandom_obj::sysInt(){
+            	HX_STACKFRAME(&_hx_pos_f39c4520f0e8ea03_200_sysInt)
+HXLINE( 201)		if (::sys::FileSystem_obj::exists(HX_("/dev/urandom",ef,12,d0,ba))) {
+HXLINE( 202)			 ::sys::io::FileInput file = ::sys::io::File_obj::read(HX_("/dev/urandom",ef,12,d0,ba),null());
+HXLINE( 203)			int result = file->readInt32();
+HXLINE( 204)			file->close();
+HXLINE( 205)			return result;
+            		}
+HXLINE( 207)		if ((::Sys_obj::systemName() == HX_("Windows",63,06,c6,b5))) {
+HXLINE( 208)			return ::haxe::crypto::random::SecureRandom_obj::winInt();
+            		}
+HXLINE( 210)		HX_STACK_DO_THROW(HX_("No secure random source available",37,f9,ae,cd));
+HXDLIN( 210)		return 0;
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC0(SecureRandom_obj,sysInt,return )
+
+int SecureRandom_obj::winInt(){
+            	HX_GC_STACKFRAME(&_hx_pos_f39c4520f0e8ea03_226_winInt)
+HXLINE( 227)		try {
+            			HX_STACK_CATCHABLE( ::Dynamic, 0);
+HXLINE( 228)			 ::sys::io::Process proc =  ::sys::io::Process_obj::__alloc( HX_CTX ,HX_("powershell",8b,ea,7a,a6),::Array_obj< ::String >::__new(3)->init(0,HX_("-NoProfile",fb,fc,1e,a0))->init(1,HX_("-Command",9e,a8,9c,5c))->init(2,(HX_("$r=[System.Security.Cryptography.RNGCryptoServiceProvider]::new();",36,a9,0c,08) + HX_("$b=New-Object byte[] 4;$r.GetBytes($b);$r.Dispose();$b-join','",39,73,54,f8))),null());
+HXLINE( 234)			::String output = ::StringTools_obj::trim(proc->_hx_stdout->readAll(null())->toString());
+HXLINE( 235)			 ::Dynamic code = proc->exitCode(null());
+HXLINE( 236)			proc->close();
+HXLINE( 237)			bool _hx_tmp;
+HXDLIN( 237)			if (::hx::IsEq( code,0 )) {
+HXLINE( 237)				_hx_tmp = (output.length > 0);
+            			}
+            			else {
+HXLINE( 237)				_hx_tmp = false;
+            			}
+HXDLIN( 237)			if (_hx_tmp) {
+HXLINE( 238)				::Array< ::String > parts = output.split(HX_(",",2c,00,00,00));
+HXLINE( 239)				if ((parts->length >= 4)) {
+HXLINE( 240)					::Array< ::Dynamic> _g = ::Array_obj< ::Dynamic>::__new(0);
+HXDLIN( 240)					{
+HXLINE( 240)						_g->push(::Std_obj::parseInt(parts->__get(0)));
+HXDLIN( 240)						_g->push(::Std_obj::parseInt(parts->__get(1)));
+HXDLIN( 240)						_g->push(::Std_obj::parseInt(parts->__get(2)));
+HXDLIN( 240)						_g->push(::Std_obj::parseInt(parts->__get(3)));
+            					}
+HXLINE( 241)					if ((_g->indexOf(null(),null()) == -1)) {
+HXLINE( 242)						return ((((( (int)(_g->__get(0)) ) << 24) | (( (int)(_g->__get(1)) ) << 16)) | (( (int)(_g->__get(2)) ) << 8)) | ( (int)(_g->__get(3)) ));
+            					}
+            				}
+            			}
+            		} catch( ::Dynamic _hx_e) {
+            			if (_hx_e.IsClass<  ::Dynamic >() ){
+            				HX_STACK_BEGIN_CATCH
+            				 ::Dynamic _g1 = _hx_e;
+            			}
+            			else {
+            				HX_STACK_DO_THROW(_hx_e);
+            			}
+            		}
+HXLINE( 247)		HX_STACK_DO_THROW(HX_("No secure random source available",37,f9,ae,cd));
+HXDLIN( 247)		return 0;
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC0(SecureRandom_obj,winInt,return )
+
+
+SecureRandom_obj::SecureRandom_obj()
+{
+}
+
+bool SecureRandom_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 3:
+		if (HX_FIELD_EQ(inName,"int") ) { outValue = _hx_int_dyn(); return true; }
+		break;
+	case 4:
+		if (HX_FIELD_EQ(inName,"init") ) { outValue = init_dyn(); return true; }
+		break;
+	case 6:
+		if (HX_FIELD_EQ(inName,"sysInt") ) { outValue = sysInt_dyn(); return true; }
+		if (HX_FIELD_EQ(inName,"winInt") ) { outValue = winInt_dyn(); return true; }
+		break;
+	case 11:
+		if (HX_FIELD_EQ(inName,"initialized") ) { outValue = ( initialized ); return true; }
+	}
+	return false;
+}
+
+bool SecureRandom_obj::__SetStatic(const ::String &inName,Dynamic &ioValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 11:
+		if (HX_FIELD_EQ(inName,"initialized") ) { initialized=ioValue.Cast< bool >(); return true; }
+	}
+	return false;
+}
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo *SecureRandom_obj_sMemberStorageInfo = 0;
+static ::hx::StaticInfo SecureRandom_obj_sStaticStorageInfo[] = {
+	{::hx::fsBool,(void *) &SecureRandom_obj::initialized,HX_("initialized",14,f5,0f,37)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+#endif
+
+static void SecureRandom_obj_sMarkStatics(HX_MARK_PARAMS) {
+	HX_MARK_MEMBER_NAME(SecureRandom_obj::initialized,"initialized");
+};
+
+#ifdef HXCPP_VISIT_ALLOCS
+static void SecureRandom_obj_sVisitStatics(HX_VISIT_PARAMS) {
+	HX_VISIT_MEMBER_NAME(SecureRandom_obj::initialized,"initialized");
+};
+
+#endif
+
+::hx::Class SecureRandom_obj::__mClass;
+
+static ::String SecureRandom_obj_sStaticFields[] = {
+	HX_("initialized",14,f5,0f,37),
+	HX_("init",10,3b,bb,45),
+	HX_("int",ef,0c,50,00),
+	HX_("sysInt",e2,fd,c1,f2),
+	HX_("winInt",33,16,78,52),
+	::String(null())
+};
+
+void SecureRandom_obj::__register()
+{
+	SecureRandom_obj _hx_dummy;
+	SecureRandom_obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("haxe.crypto.random.SecureRandom",e0,aa,77,7f);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &SecureRandom_obj::__GetStatic;
+	__mClass->mSetStaticField = &SecureRandom_obj::__SetStatic;
+	__mClass->mMarkFunc = SecureRandom_obj_sMarkStatics;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(SecureRandom_obj_sStaticFields);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(0 /* sMemberFields */);
+	__mClass->mCanCast = ::hx::TCanCast< SecureRandom_obj >;
+#ifdef HXCPP_VISIT_ALLOCS
+	__mClass->mVisitFunc = SecureRandom_obj_sVisitStatics;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = SecureRandom_obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = SecureRandom_obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+void SecureRandom_obj::__boot()
+{
+{
+            	HX_STACKFRAME(&_hx_pos_f39c4520f0e8ea03_12_boot)
+HXDLIN(  12)		initialized = false;
+            	}
+}
+
+} // end namespace haxe
+} // end namespace crypto
+} // end namespace random
diff --git a/Sources/c_borogove/src/haxe/io/Bytes.cpp b/Sources/c_borogove/src/haxe/io/Bytes.cpp
index d0c6616..d27ed6d 100644
--- a/Sources/c_borogove/src/haxe/io/Bytes.cpp
+++ b/Sources/c_borogove/src/haxe/io/Bytes.cpp
@@ -19,7 +19,6 @@
 
 HX_DEFINE_STACK_FRAME(_hx_pos_dd4549ff8fa56c0b_34_new,"haxe.io.Bytes","new",0x3938d57d,"haxe.io.Bytes.new","/usr/local/lib/haxe/std/haxe/io/Bytes.hx",34,0xd68ef8f0)
 HX_LOCAL_STACK_FRAME(_hx_pos_dd4549ff8fa56c0b_90_blit,"haxe.io.Bytes","blit",0xd098ac78,"haxe.io.Bytes.blit","/usr/local/lib/haxe/std/haxe/io/Bytes.hx",90,0xd68ef8f0)
-HX_LOCAL_STACK_FRAME(_hx_pos_dd4549ff8fa56c0b_144_fill,"haxe.io.Bytes","fill",0xd33b42c6,"haxe.io.Bytes.fill","/usr/local/lib/haxe/std/haxe/io/Bytes.hx",144,0xd68ef8f0)
 HX_LOCAL_STACK_FRAME(_hx_pos_dd4549ff8fa56c0b_155_sub,"haxe.io.Bytes","sub",0x393cae9d,"haxe.io.Bytes.sub","/usr/local/lib/haxe/std/haxe/io/Bytes.hx",155,0xd68ef8f0)
 HX_LOCAL_STACK_FRAME(_hx_pos_dd4549ff8fa56c0b_415_getString,"haxe.io.Bytes","getString",0xa16beae4,"haxe.io.Bytes.getString","/usr/local/lib/haxe/std/haxe/io/Bytes.hx",415,0xd68ef8f0)
 HX_LOCAL_STACK_FRAME(_hx_pos_dd4549ff8fa56c0b_516_toString,"haxe.io.Bytes","toString",0x0291226f,"haxe.io.Bytes.toString","/usr/local/lib/haxe/std/haxe/io/Bytes.hx",516,0xd68ef8f0)
@@ -91,14 +90,6 @@ HXLINE( 111)		this->b->blit(pos,src->b,srcpos,len);
 
 HX_DEFINE_DYNAMIC_FUNC4(Bytes_obj,blit,(void))
 
-void Bytes_obj::fill(int pos,int len,int value){
-            	HX_STACKFRAME(&_hx_pos_dd4549ff8fa56c0b_144_fill)
-HXDLIN( 144)		 ::__hxcpp_memory_memset(this->b,pos,len,value);
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC3(Bytes_obj,fill,(void))
-
  ::haxe::io::Bytes Bytes_obj::sub(int pos,int len){
             	HX_GC_STACKFRAME(&_hx_pos_dd4549ff8fa56c0b_155_sub)
 HXLINE( 157)		bool _hx_tmp;
@@ -329,7 +320,6 @@ void Bytes_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 4:
 		if (HX_FIELD_EQ(inName,"blit") ) { return ::hx::Val( blit_dyn() ); }
-		if (HX_FIELD_EQ(inName,"fill") ) { return ::hx::Val( fill_dyn() ); }
 		break;
 	case 5:
 		if (HX_FIELD_EQ(inName,"toHex") ) { return ::hx::Val( toHex_dyn() ); }
@@ -394,7 +384,6 @@ static ::String Bytes_obj_sMemberFields[] = {
 	HX_("length",e6,94,07,9f),
 	HX_("b",62,00,00,00),
 	HX_("blit",35,38,19,41),
-	HX_("fill",83,ce,bb,43),
 	HX_("sub",80,a9,57,00),
 	HX_("getString",07,b2,86,8d),
 	HX_("toString",ac,d0,6e,38),
diff --git a/Sources/c_borogove/src/haxe/xml/Printer.cpp b/Sources/c_borogove/src/haxe/xml/Printer.cpp
index 6e89882..4d3df76 100644
--- a/Sources/c_borogove/src/haxe/xml/Printer.cpp
+++ b/Sources/c_borogove/src/haxe/xml/Printer.cpp
@@ -215,11 +215,10 @@ HXLINE(  78)							_hx_tmp = false;
 HXDLIN(  78)						if (_hx_tmp) {
 HXLINE(  78)							HX_STACK_DO_THROW((HX_("Bad node type, expected Element or Document but found ",a0,d6,ba,79) + ::_Xml::XmlType_Impl__obj::toString(value->nodeType)));
             						}
+HXDLIN(  78)						::Array< ::Dynamic> _this11 = value->children;
 HXDLIN(  78)						int _g_current = 0;
-HXDLIN(  78)						::Array< ::Dynamic> _g_array = value->children;
-HXDLIN(  78)						while((_g_current < _g_array->length)){
+HXDLIN(  78)						while((_g_current < _this11->length)){
 HXLINE(  78)							_g_current = (_g_current + 1);
-HXDLIN(  78)							 ::Xml child = _g_array->__get((_g_current - 1)).StaticCast<  ::Xml >();
 HXLINE(  79)							::String _hx_tmp1;
 HXDLIN(  79)							if (this->pretty) {
 HXLINE(  79)								_hx_tmp1 = (tabs + HX_("\t",09,00,00,00));
@@ -227,22 +226,22 @@ HXLINE(  79)								_hx_tmp1 = (tabs + HX_("\t",09,00,00,00));
             							else {
 HXLINE(  79)								_hx_tmp1 = tabs;
             							}
-HXDLIN(  79)							this->writeNode(child,_hx_tmp1);
+HXDLIN(  79)							this->writeNode(_this11->__get((_g_current - 1)).StaticCast<  ::Xml >(),_hx_tmp1);
             						}
             					}
 HXLINE(  81)					{
 HXLINE(  81)						::String input4 = (tabs + HX_("</",73,34,00,00));
 HXDLIN(  81)						{
-HXLINE(  81)							 ::StringBuf _this11 = this->output;
-HXDLIN(  81)							if (::hx::IsNotNull( _this11->charBuf )) {
-HXLINE(  81)								_this11->flush();
+HXLINE(  81)							 ::StringBuf _this12 = this->output;
+HXDLIN(  81)							if (::hx::IsNotNull( _this12->charBuf )) {
+HXLINE(  81)								_this12->flush();
             							}
-HXDLIN(  81)							if (::hx::IsNull( _this11->b )) {
-HXLINE(  81)								_this11->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input4));
+HXDLIN(  81)							if (::hx::IsNull( _this12->b )) {
+HXLINE(  81)								_this12->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input4));
             							}
             							else {
-HXLINE(  81)								::Array< ::String > _this12 = _this11->b;
-HXDLIN(  81)								_this12->push(::Std_obj::string(input4));
+HXLINE(  81)								::Array< ::String > _this13 = _this12->b;
+HXDLIN(  81)								_this13->push(::Std_obj::string(input4));
             							}
             						}
             					}
@@ -252,67 +251,67 @@ HXLINE(  82)							HX_STACK_DO_THROW((HX_("Bad node type, expected Element but f
             						}
 HXDLIN(  82)						::String input5 = value->nodeName;
 HXDLIN(  82)						{
-HXLINE(  82)							 ::StringBuf _this13 = this->output;
-HXDLIN(  82)							if (::hx::IsNotNull( _this13->charBuf )) {
-HXLINE(  82)								_this13->flush();
+HXLINE(  82)							 ::StringBuf _this14 = this->output;
+HXDLIN(  82)							if (::hx::IsNotNull( _this14->charBuf )) {
+HXLINE(  82)								_this14->flush();
             							}
-HXDLIN(  82)							if (::hx::IsNull( _this13->b )) {
-HXLINE(  82)								_this13->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input5));
+HXDLIN(  82)							if (::hx::IsNull( _this14->b )) {
+HXLINE(  82)								_this14->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input5));
             							}
             							else {
-HXLINE(  82)								::Array< ::String > _this14 = _this13->b;
-HXDLIN(  82)								_this14->push(::Std_obj::string(input5));
+HXLINE(  82)								::Array< ::String > _this15 = _this14->b;
+HXDLIN(  82)								_this15->push(::Std_obj::string(input5));
             							}
             						}
             					}
 HXLINE(  83)					{
-HXLINE(  83)						 ::StringBuf _this15 = this->output;
-HXDLIN(  83)						if (::hx::IsNotNull( _this15->charBuf )) {
-HXLINE(  83)							_this15->flush();
+HXLINE(  83)						 ::StringBuf _this16 = this->output;
+HXDLIN(  83)						if (::hx::IsNotNull( _this16->charBuf )) {
+HXLINE(  83)							_this16->flush();
             						}
-HXDLIN(  83)						if (::hx::IsNull( _this15->b )) {
-HXLINE(  83)							_this15->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_8,1);
+HXDLIN(  83)						if (::hx::IsNull( _this16->b )) {
+HXLINE(  83)							_this16->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_8,1);
             						}
             						else {
-HXLINE(  83)							_this15->b->push(HX_(">",3e,00,00,00));
+HXLINE(  83)							_this16->b->push(HX_(">",3e,00,00,00));
             						}
             					}
 HXLINE(  84)					if (this->pretty) {
-HXLINE(  84)						 ::StringBuf _this16 = this->output;
-HXDLIN(  84)						if (::hx::IsNotNull( _this16->charBuf )) {
-HXLINE(  84)							_this16->flush();
+HXLINE(  84)						 ::StringBuf _this17 = this->output;
+HXDLIN(  84)						if (::hx::IsNotNull( _this17->charBuf )) {
+HXLINE(  84)							_this17->flush();
             						}
-HXDLIN(  84)						if (::hx::IsNull( _this16->b )) {
-HXLINE(  84)							_this16->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_9,1);
+HXDLIN(  84)						if (::hx::IsNull( _this17->b )) {
+HXLINE(  84)							_this17->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_9,1);
             						}
             						else {
-HXLINE(  84)							_this16->b->push(HX_("\n",0a,00,00,00));
+HXLINE(  84)							_this17->b->push(HX_("\n",0a,00,00,00));
             						}
             					}
             				}
             				else {
 HXLINE(  86)					{
-HXLINE(  86)						 ::StringBuf _this17 = this->output;
-HXDLIN(  86)						if (::hx::IsNotNull( _this17->charBuf )) {
-HXLINE(  86)							_this17->flush();
+HXLINE(  86)						 ::StringBuf _this18 = this->output;
+HXDLIN(  86)						if (::hx::IsNotNull( _this18->charBuf )) {
+HXLINE(  86)							_this18->flush();
             						}
-HXDLIN(  86)						if (::hx::IsNull( _this17->b )) {
-HXLINE(  86)							_this17->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_10,1);
+HXDLIN(  86)						if (::hx::IsNull( _this18->b )) {
+HXLINE(  86)							_this18->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_10,1);
             						}
             						else {
-HXLINE(  86)							_this17->b->push(HX_("/>",2f,29,00,00));
+HXLINE(  86)							_this18->b->push(HX_("/>",2f,29,00,00));
             						}
             					}
 HXLINE(  87)					if (this->pretty) {
-HXLINE(  87)						 ::StringBuf _this18 = this->output;
-HXDLIN(  87)						if (::hx::IsNotNull( _this18->charBuf )) {
-HXLINE(  87)							_this18->flush();
+HXLINE(  87)						 ::StringBuf _this19 = this->output;
+HXDLIN(  87)						if (::hx::IsNotNull( _this19->charBuf )) {
+HXLINE(  87)							_this19->flush();
             						}
-HXDLIN(  87)						if (::hx::IsNull( _this18->b )) {
-HXLINE(  87)							_this18->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_11,1);
+HXDLIN(  87)						if (::hx::IsNull( _this19->b )) {
+HXLINE(  87)							_this19->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_11,1);
             						}
             						else {
-HXLINE(  87)							_this18->b->push(HX_("\n",0a,00,00,00));
+HXLINE(  87)							_this19->b->push(HX_("\n",0a,00,00,00));
             						}
             					}
             				}
@@ -334,29 +333,29 @@ HXLINE(  91)				if ((nodeValue.length != 0)) {
 HXLINE(  92)					{
 HXLINE(  92)						::String input6 = (tabs + ::StringTools_obj::htmlEscape(nodeValue,null()));
 HXDLIN(  92)						{
-HXLINE(  92)							 ::StringBuf _this19 = this->output;
-HXDLIN(  92)							if (::hx::IsNotNull( _this19->charBuf )) {
-HXLINE(  92)								_this19->flush();
+HXLINE(  92)							 ::StringBuf _this20 = this->output;
+HXDLIN(  92)							if (::hx::IsNotNull( _this20->charBuf )) {
+HXLINE(  92)								_this20->flush();
             							}
-HXDLIN(  92)							if (::hx::IsNull( _this19->b )) {
-HXLINE(  92)								_this19->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input6));
+HXDLIN(  92)							if (::hx::IsNull( _this20->b )) {
+HXLINE(  92)								_this20->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input6));
             							}
             							else {
-HXLINE(  92)								::Array< ::String > _this20 = _this19->b;
-HXDLIN(  92)								_this20->push(::Std_obj::string(input6));
+HXLINE(  92)								::Array< ::String > _this21 = _this20->b;
+HXDLIN(  92)								_this21->push(::Std_obj::string(input6));
             							}
             						}
             					}
 HXLINE(  93)					if (this->pretty) {
-HXLINE(  93)						 ::StringBuf _this21 = this->output;
-HXDLIN(  93)						if (::hx::IsNotNull( _this21->charBuf )) {
-HXLINE(  93)							_this21->flush();
+HXLINE(  93)						 ::StringBuf _this22 = this->output;
+HXDLIN(  93)						if (::hx::IsNotNull( _this22->charBuf )) {
+HXLINE(  93)							_this22->flush();
             						}
-HXDLIN(  93)						if (::hx::IsNull( _this21->b )) {
-HXLINE(  93)							_this21->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_12,1);
+HXDLIN(  93)						if (::hx::IsNull( _this22->b )) {
+HXLINE(  93)							_this22->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_12,1);
             						}
             						else {
-HXLINE(  93)							_this21->b->push(HX_("\n",0a,00,00,00));
+HXLINE(  93)							_this22->b->push(HX_("\n",0a,00,00,00));
             						}
             					}
             				}
@@ -366,16 +365,16 @@ HXLINE(  93)							_this21->b->push(HX_("\n",0a,00,00,00));
 HXLINE(  52)				{
 HXLINE(  52)					::String input7 = (tabs + HX_("<![CDATA[",a4,fc,95,b4));
 HXDLIN(  52)					{
-HXLINE(  52)						 ::StringBuf _this22 = this->output;
-HXDLIN(  52)						if (::hx::IsNotNull( _this22->charBuf )) {
-HXLINE(  52)							_this22->flush();
+HXLINE(  52)						 ::StringBuf _this23 = this->output;
+HXDLIN(  52)						if (::hx::IsNotNull( _this23->charBuf )) {
+HXLINE(  52)							_this23->flush();
             						}
-HXDLIN(  52)						if (::hx::IsNull( _this22->b )) {
-HXLINE(  52)							_this22->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input7));
+HXDLIN(  52)						if (::hx::IsNull( _this23->b )) {
+HXLINE(  52)							_this23->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input7));
             						}
             						else {
-HXLINE(  52)							::Array< ::String > _this23 = _this22->b;
-HXDLIN(  52)							_this23->push(::Std_obj::string(input7));
+HXLINE(  52)							::Array< ::String > _this24 = _this23->b;
+HXDLIN(  52)							_this24->push(::Std_obj::string(input7));
             						}
             					}
             				}
@@ -392,41 +391,41 @@ HXLINE(  53)						HX_STACK_DO_THROW((HX_("Bad node type, unexpected ",be,79,d5,1
             					}
 HXDLIN(  53)					::String input8 = value->nodeValue;
 HXDLIN(  53)					{
-HXLINE(  53)						 ::StringBuf _this24 = this->output;
-HXDLIN(  53)						if (::hx::IsNotNull( _this24->charBuf )) {
-HXLINE(  53)							_this24->flush();
+HXLINE(  53)						 ::StringBuf _this25 = this->output;
+HXDLIN(  53)						if (::hx::IsNotNull( _this25->charBuf )) {
+HXLINE(  53)							_this25->flush();
             						}
-HXDLIN(  53)						if (::hx::IsNull( _this24->b )) {
-HXLINE(  53)							_this24->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input8));
+HXDLIN(  53)						if (::hx::IsNull( _this25->b )) {
+HXLINE(  53)							_this25->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input8));
             						}
             						else {
-HXLINE(  53)							::Array< ::String > _this25 = _this24->b;
-HXDLIN(  53)							_this25->push(::Std_obj::string(input8));
+HXLINE(  53)							::Array< ::String > _this26 = _this25->b;
+HXDLIN(  53)							_this26->push(::Std_obj::string(input8));
             						}
             					}
             				}
 HXLINE(  54)				{
-HXLINE(  54)					 ::StringBuf _this26 = this->output;
-HXDLIN(  54)					if (::hx::IsNotNull( _this26->charBuf )) {
-HXLINE(  54)						_this26->flush();
+HXLINE(  54)					 ::StringBuf _this27 = this->output;
+HXDLIN(  54)					if (::hx::IsNotNull( _this27->charBuf )) {
+HXLINE(  54)						_this27->flush();
             					}
-HXDLIN(  54)					if (::hx::IsNull( _this26->b )) {
-HXLINE(  54)						_this26->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_13,1);
+HXDLIN(  54)					if (::hx::IsNull( _this27->b )) {
+HXLINE(  54)						_this27->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_13,1);
             					}
             					else {
-HXLINE(  54)						_this26->b->push(HX_("]]>",de,e2,46,00));
+HXLINE(  54)						_this27->b->push(HX_("]]>",de,e2,46,00));
             					}
             				}
 HXLINE(  55)				if (this->pretty) {
-HXLINE(  55)					 ::StringBuf _this27 = this->output;
-HXDLIN(  55)					if (::hx::IsNotNull( _this27->charBuf )) {
-HXLINE(  55)						_this27->flush();
+HXLINE(  55)					 ::StringBuf _this28 = this->output;
+HXDLIN(  55)					if (::hx::IsNotNull( _this28->charBuf )) {
+HXLINE(  55)						_this28->flush();
             					}
-HXDLIN(  55)					if (::hx::IsNull( _this27->b )) {
-HXLINE(  55)						_this27->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_14,1);
+HXDLIN(  55)					if (::hx::IsNull( _this28->b )) {
+HXLINE(  55)						_this28->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_14,1);
             					}
             					else {
-HXLINE(  55)						_this27->b->push(HX_("\n",0a,00,00,00));
+HXLINE(  55)						_this28->b->push(HX_("\n",0a,00,00,00));
             					}
             				}
             			}
@@ -446,44 +445,44 @@ HXDLIN(  57)				::String commentContent = value->nodeValue;
 HXLINE(  58)				commentContent =  ::EReg_obj::__alloc( HX_CTX ,HX_("[\n\r\t]+",59,8e,1a,2d),HX_("g",67,00,00,00))->replace(commentContent,HX_("",00,00,00,00));
 HXLINE(  59)				commentContent = ((HX_("<!--",05,ff,c1,27) + commentContent) + HX_("-->",de,4c,22,00));
 HXLINE(  60)				{
-HXLINE(  60)					 ::StringBuf _this28 = this->output;
-HXDLIN(  60)					if (::hx::IsNotNull( _this28->charBuf )) {
-HXLINE(  60)						_this28->flush();
+HXLINE(  60)					 ::StringBuf _this29 = this->output;
+HXDLIN(  60)					if (::hx::IsNotNull( _this29->charBuf )) {
+HXLINE(  60)						_this29->flush();
             					}
-HXDLIN(  60)					if (::hx::IsNull( _this28->b )) {
-HXLINE(  60)						_this28->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(tabs));
+HXDLIN(  60)					if (::hx::IsNull( _this29->b )) {
+HXLINE(  60)						_this29->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(tabs));
             					}
             					else {
-HXLINE(  60)						::Array< ::String > _this29 = _this28->b;
-HXDLIN(  60)						_this29->push(::Std_obj::string(tabs));
+HXLINE(  60)						::Array< ::String > _this30 = _this29->b;
+HXDLIN(  60)						_this30->push(::Std_obj::string(tabs));
             					}
             				}
 HXLINE(  61)				{
 HXLINE(  61)					::String input9 = ::StringTools_obj::trim(commentContent);
 HXDLIN(  61)					{
-HXLINE(  61)						 ::StringBuf _this30 = this->output;
-HXDLIN(  61)						if (::hx::IsNotNull( _this30->charBuf )) {
-HXLINE(  61)							_this30->flush();
+HXLINE(  61)						 ::StringBuf _this31 = this->output;
+HXDLIN(  61)						if (::hx::IsNotNull( _this31->charBuf )) {
+HXLINE(  61)							_this31->flush();
             						}
-HXDLIN(  61)						if (::hx::IsNull( _this30->b )) {
-HXLINE(  61)							_this30->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input9));
+HXDLIN(  61)						if (::hx::IsNull( _this31->b )) {
+HXLINE(  61)							_this31->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input9));
             						}
             						else {
-HXLINE(  61)							::Array< ::String > _this31 = _this30->b;
-HXDLIN(  61)							_this31->push(::Std_obj::string(input9));
+HXLINE(  61)							::Array< ::String > _this32 = _this31->b;
+HXDLIN(  61)							_this32->push(::Std_obj::string(input9));
             						}
             					}
             				}
 HXLINE(  62)				if (this->pretty) {
-HXLINE(  62)					 ::StringBuf _this32 = this->output;
-HXDLIN(  62)					if (::hx::IsNotNull( _this32->charBuf )) {
-HXLINE(  62)						_this32->flush();
+HXLINE(  62)					 ::StringBuf _this33 = this->output;
+HXDLIN(  62)					if (::hx::IsNotNull( _this33->charBuf )) {
+HXLINE(  62)						_this33->flush();
             					}
-HXDLIN(  62)					if (::hx::IsNull( _this32->b )) {
-HXLINE(  62)						_this32->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_15,1);
+HXDLIN(  62)					if (::hx::IsNull( _this33->b )) {
+HXLINE(  62)						_this33->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_15,1);
             					}
             					else {
-HXLINE(  62)						_this32->b->push(HX_("\n",0a,00,00,00));
+HXLINE(  62)						_this33->b->push(HX_("\n",0a,00,00,00));
             					}
             				}
             			}
@@ -502,29 +501,29 @@ HXLINE(  99)						HX_STACK_DO_THROW((HX_("Bad node type, unexpected ",be,79,d5,1
             					}
 HXDLIN(  99)					::String input11 = ((HX_("<!DOCTYPE ",33,6c,bb,ab) + value->nodeValue) + HX_(">",3e,00,00,00));
 HXDLIN(  99)					{
-HXLINE(  99)						 ::StringBuf _this33 = this->output;
-HXDLIN(  99)						if (::hx::IsNotNull( _this33->charBuf )) {
-HXLINE(  99)							_this33->flush();
+HXLINE(  99)						 ::StringBuf _this34 = this->output;
+HXDLIN(  99)						if (::hx::IsNotNull( _this34->charBuf )) {
+HXLINE(  99)							_this34->flush();
             						}
-HXDLIN(  99)						if (::hx::IsNull( _this33->b )) {
-HXLINE(  99)							_this33->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input11));
+HXDLIN(  99)						if (::hx::IsNull( _this34->b )) {
+HXLINE(  99)							_this34->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input11));
             						}
             						else {
-HXLINE(  99)							::Array< ::String > _this34 = _this33->b;
-HXDLIN(  99)							_this34->push(::Std_obj::string(input11));
+HXLINE(  99)							::Array< ::String > _this35 = _this34->b;
+HXDLIN(  99)							_this35->push(::Std_obj::string(input11));
             						}
             					}
             				}
 HXLINE( 100)				if (this->pretty) {
-HXLINE( 100)					 ::StringBuf _this35 = this->output;
-HXDLIN( 100)					if (::hx::IsNotNull( _this35->charBuf )) {
-HXLINE( 100)						_this35->flush();
+HXLINE( 100)					 ::StringBuf _this36 = this->output;
+HXDLIN( 100)					if (::hx::IsNotNull( _this36->charBuf )) {
+HXLINE( 100)						_this36->flush();
             					}
-HXDLIN( 100)					if (::hx::IsNull( _this35->b )) {
-HXLINE( 100)						_this35->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_16,1);
+HXDLIN( 100)					if (::hx::IsNull( _this36->b )) {
+HXLINE( 100)						_this36->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_16,1);
             					}
             					else {
-HXLINE( 100)						_this35->b->push(HX_("\n",0a,00,00,00));
+HXLINE( 100)						_this36->b->push(HX_("\n",0a,00,00,00));
             					}
             				}
             			}
@@ -543,29 +542,29 @@ HXLINE(  96)						HX_STACK_DO_THROW((HX_("Bad node type, unexpected ",be,79,d5,1
             					}
 HXDLIN(  96)					::String input13 = ((HX_("<?",83,34,00,00) + value->nodeValue) + HX_("?>",1f,37,00,00));
 HXDLIN(  96)					{
-HXLINE(  96)						 ::StringBuf _this36 = this->output;
-HXDLIN(  96)						if (::hx::IsNotNull( _this36->charBuf )) {
-HXLINE(  96)							_this36->flush();
+HXLINE(  96)						 ::StringBuf _this37 = this->output;
+HXDLIN(  96)						if (::hx::IsNotNull( _this37->charBuf )) {
+HXLINE(  96)							_this37->flush();
             						}
-HXDLIN(  96)						if (::hx::IsNull( _this36->b )) {
-HXLINE(  96)							_this36->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input13));
+HXDLIN(  96)						if (::hx::IsNull( _this37->b )) {
+HXLINE(  96)							_this37->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(input13));
             						}
             						else {
-HXLINE(  96)							::Array< ::String > _this37 = _this36->b;
-HXDLIN(  96)							_this37->push(::Std_obj::string(input13));
+HXLINE(  96)							::Array< ::String > _this38 = _this37->b;
+HXDLIN(  96)							_this38->push(::Std_obj::string(input13));
             						}
             					}
             				}
 HXLINE(  97)				if (this->pretty) {
-HXLINE(  97)					 ::StringBuf _this38 = this->output;
-HXDLIN(  97)					if (::hx::IsNotNull( _this38->charBuf )) {
-HXLINE(  97)						_this38->flush();
+HXLINE(  97)					 ::StringBuf _this39 = this->output;
+HXDLIN(  97)					if (::hx::IsNotNull( _this39->charBuf )) {
+HXLINE(  97)						_this39->flush();
             					}
-HXDLIN(  97)					if (::hx::IsNull( _this38->b )) {
-HXLINE(  97)						_this38->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_17,1);
+HXDLIN(  97)					if (::hx::IsNull( _this39->b )) {
+HXLINE(  97)						_this39->b = ::Array_obj< ::String >::fromData( _hx_array_data_d3e3a3db_17,1);
             					}
             					else {
-HXLINE(  97)						_this38->b->push(HX_("\n",0a,00,00,00));
+HXLINE(  97)						_this39->b->push(HX_("\n",0a,00,00,00));
             					}
             				}
             			}
@@ -581,12 +580,11 @@ HXLINE(  64)					_hx_tmp5 = false;
 HXDLIN(  64)				if (_hx_tmp5) {
 HXLINE(  64)					HX_STACK_DO_THROW((HX_("Bad node type, expected Element or Document but found ",a0,d6,ba,79) + ::_Xml::XmlType_Impl__obj::toString(value->nodeType)));
             				}
+HXDLIN(  64)				::Array< ::Dynamic> _this40 = value->children;
 HXDLIN(  64)				int _g_current1 = 0;
-HXDLIN(  64)				::Array< ::Dynamic> _g_array1 = value->children;
-HXDLIN(  64)				while((_g_current1 < _g_array1->length)){
+HXDLIN(  64)				while((_g_current1 < _this40->length)){
 HXLINE(  64)					_g_current1 = (_g_current1 + 1);
-HXDLIN(  64)					 ::Xml child1 = _g_array1->__get((_g_current1 - 1)).StaticCast<  ::Xml >();
-HXLINE(  65)					this->writeNode(child1,tabs);
+HXLINE(  65)					this->writeNode(_this40->__get((_g_current1 - 1)).StaticCast<  ::Xml >(),tabs);
             				}
             			}
             			break;
@@ -609,11 +607,11 @@ HXLINE( 115)				_hx_tmp = false;
 HXDLIN( 115)			if (_hx_tmp) {
 HXLINE( 115)				HX_STACK_DO_THROW((HX_("Bad node type, expected Element or Document but found ",a0,d6,ba,79) + ::_Xml::XmlType_Impl__obj::toString(value->nodeType)));
             			}
+HXDLIN( 115)			::Array< ::Dynamic> _this = value->children;
 HXDLIN( 115)			int _g_current = 0;
-HXDLIN( 115)			::Array< ::Dynamic> _g_array = value->children;
-HXDLIN( 115)			while((_g_current < _g_array->length)){
+HXDLIN( 115)			while((_g_current < _this->length)){
 HXLINE( 115)				_g_current = (_g_current + 1);
-HXDLIN( 115)				 ::Xml child = _g_array->__get((_g_current - 1)).StaticCast<  ::Xml >();
+HXDLIN( 115)				 ::Xml child = _this->__get((_g_current - 1)).StaticCast<  ::Xml >();
 HXLINE( 116)				switch((int)(child->nodeType)){
             					case (int)0: case (int)1: {
 HXLINE( 118)						return true;
diff --git a/Sources/c_borogove/src/hx/NoFiles.cpp b/Sources/c_borogove/src/hx/NoFiles.cpp
new file mode 100644
index 0000000..794d486
--- /dev/null
+++ b/Sources/c_borogove/src/hx/NoFiles.cpp
@@ -0,0 +1,14 @@
+#include <hxcpp.h>
+
+namespace hx {
+const char *__hxcpp_all_files[] = {
+ 0 };
+
+const char *__hxcpp_all_files_fullpath[] = {
+ 0 };
+
+const char *__hxcpp_all_classes[] = {
+ 0 };
+} // namespace hx
+void __files__boot() { __hxcpp_set_debugger_info(hx::__hxcpp_all_classes, hx::__hxcpp_all_files_fullpath); }
+
diff --git a/Sources/c_borogove/src/sha/Hash.cpp b/Sources/c_borogove/src/sha/Hash.cpp
deleted file mode 100644
index 94b5ece..0000000
--- a/Sources/c_borogove/src/sha/Hash.cpp
+++ /dev/null
@@ -1,222 +0,0 @@
-// Generated by Haxe 4.3.3
-#include <hxcpp.h>
-
-#ifndef INCLUDED_Std
-#include <Std.h>
-#endif
-#ifndef INCLUDED_haxe_io_Bytes
-#include <haxe/io/Bytes.h>
-#endif
-#ifndef INCLUDED_sha_Hash
-#include <sha/Hash.h>
-#endif
-
-HX_DEFINE_STACK_FRAME(_hx_pos_a9cd7e4aca9fcb58_10_new,"sha.Hash","new",0x7a36a662,"sha.Hash.new","sha/Hash.hx",10,0x66842d6d)
-HX_LOCAL_STACK_FRAME(_hx_pos_a9cd7e4aca9fcb58_28_update,"sha.Hash","update",0x5b5edd47,"sha.Hash.update","sha/Hash.hx",28,0x66842d6d)
-HX_LOCAL_STACK_FRAME(_hx_pos_a9cd7e4aca9fcb58_52_digest,"sha.Hash","digest",0x897e5782,"sha.Hash.digest","sha/Hash.hx",52,0x66842d6d)
-namespace sha{
-
-void Hash_obj::__construct(int blockSize,int finalSize){
-            	HX_STACKFRAME(&_hx_pos_a9cd7e4aca9fcb58_10_new)
-HXLINE(  11)		this->finalSize = finalSize;
-HXLINE(  12)		this->block = ::haxe::io::Bytes_obj::alloc(blockSize);
-HXLINE(  13)		this->length = 0;
-            	}
-
-bool Hash_obj::_hx_isInstanceOf(int inClassId) {
-	return inClassId==(int)0x00000001 || inClassId==(int)0x49a7eb1a;
-}
-
- ::sha::Hash Hash_obj::update( ::haxe::io::Bytes data){
-            	HX_STACKFRAME(&_hx_pos_a9cd7e4aca9fcb58_28_update)
-HXLINE(  29)		int accum = this->length;
-HXLINE(  31)		int offset = 0;
-HXLINE(  32)		while((offset < data->length)){
-HXLINE(  33)			int assigned = ::hx::Mod(accum,this->block->length);
-HXLINE(  34)			int a = (data->length - offset);
-HXDLIN(  34)			int b = (this->block->length - assigned);
-HXDLIN(  34)			int remainder;
-HXDLIN(  34)			if ((a < b)) {
-HXLINE(  34)				remainder = a;
-            			}
-            			else {
-HXLINE(  34)				remainder = b;
-            			}
-HXLINE(  36)			{
-HXLINE(  36)				int _g = 0;
-HXDLIN(  36)				int _g1 = remainder;
-HXDLIN(  36)				while((_g < _g1)){
-HXLINE(  36)					_g = (_g + 1);
-HXDLIN(  36)					int i = (_g - 1);
-HXLINE(  37)					this->block->b[(assigned + i)] = data->b->__get((offset + i));
-            				}
-            			}
-HXLINE(  40)			accum = (accum + remainder);
-HXLINE(  41)			offset = (offset + remainder);
-HXLINE(  43)			if ((::hx::Mod(accum,this->block->length) == 0)) {
-HXLINE(  44)				this->_update(this->block);
-            			}
-            		}
-HXLINE(  48)		this->length = (this->length + data->length);
-HXLINE(  49)		return ::hx::ObjectPtr<OBJ_>(this);
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC1(Hash_obj,update,return )
-
- ::haxe::io::Bytes Hash_obj::digest(){
-            	HX_STACKFRAME(&_hx_pos_a9cd7e4aca9fcb58_52_digest)
-HXLINE(  53)		int rem = ::hx::Mod(this->length,this->block->length);
-HXLINE(  55)		this->block->b[rem] = ( (unsigned char)(128) );
-HXLINE(  57)		this->block->fill((rem + 1),(this->block->length - (rem + 1)),0);
-HXLINE(  59)		if ((rem >= this->finalSize)) {
-HXLINE(  60)			this->_update(this->block);
-HXLINE(  61)			this->block->fill(0,this->block->length,0);
-            		}
-HXLINE(  64)		int bits = (this->length * 8);
-HXLINE(  66)		if ((bits <= -1)) {
-HXLINE(  67)			 ::haxe::io::Bytes b = this->block;
-HXDLIN(  67)			int pos = (this->block->length - 4);
-HXDLIN(  67)			b->b[pos] = ( (unsigned char)((bits >> 24)) );
-HXDLIN(  67)			b->b[(pos + 1)] = ( (unsigned char)(((bits >> 16) & 255)) );
-HXDLIN(  67)			b->b[(pos + 2)] = ( (unsigned char)(((bits >> 8) & 255)) );
-HXDLIN(  67)			b->b[(pos + 3)] = ( (unsigned char)((bits & 255)) );
-            		}
-            		else {
-HXLINE(  69)			int lowBits = ::hx::UShr((bits & -1),0);
-HXLINE(  70)			int highBits = ::Std_obj::_hx_int((( (Float)((bits - lowBits)) ) / ((Float)4294967296)));
-HXLINE(  72)			{
-HXLINE(  72)				 ::haxe::io::Bytes b1 = this->block;
-HXDLIN(  72)				int pos1 = (this->block->length - 8);
-HXDLIN(  72)				b1->b[pos1] = ( (unsigned char)((highBits >> 24)) );
-HXDLIN(  72)				b1->b[(pos1 + 1)] = ( (unsigned char)(((highBits >> 16) & 255)) );
-HXDLIN(  72)				b1->b[(pos1 + 2)] = ( (unsigned char)(((highBits >> 8) & 255)) );
-HXDLIN(  72)				b1->b[(pos1 + 3)] = ( (unsigned char)((highBits & 255)) );
-            			}
-HXLINE(  73)			{
-HXLINE(  73)				 ::haxe::io::Bytes b2 = this->block;
-HXDLIN(  73)				int pos2 = (this->block->length - 4);
-HXDLIN(  73)				b2->b[pos2] = ( (unsigned char)((lowBits >> 24)) );
-HXDLIN(  73)				b2->b[(pos2 + 1)] = ( (unsigned char)(((lowBits >> 16) & 255)) );
-HXDLIN(  73)				b2->b[(pos2 + 2)] = ( (unsigned char)(((lowBits >> 8) & 255)) );
-HXDLIN(  73)				b2->b[(pos2 + 3)] = ( (unsigned char)((lowBits & 255)) );
-            			}
-            		}
-HXLINE(  76)		this->_update(this->block);
-HXLINE(  78)		return this->_hash();
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC0(Hash_obj,digest,return )
-
-HX_DEFINE_DYNAMIC_FUNC1(Hash_obj,_update,(void))
-
-HX_DEFINE_DYNAMIC_FUNC0(Hash_obj,_hash,return )
-
-
-Hash_obj::Hash_obj()
-{
-}
-
-void Hash_obj::__Mark(HX_MARK_PARAMS)
-{
-	HX_MARK_BEGIN_CLASS(Hash);
-	HX_MARK_MEMBER_NAME(finalSize,"finalSize");
-	HX_MARK_MEMBER_NAME(length,"length");
-	HX_MARK_MEMBER_NAME(block,"block");
-	HX_MARK_END_CLASS();
-}
-
-void Hash_obj::__Visit(HX_VISIT_PARAMS)
-{
-	HX_VISIT_MEMBER_NAME(finalSize,"finalSize");
-	HX_VISIT_MEMBER_NAME(length,"length");
-	HX_VISIT_MEMBER_NAME(block,"block");
-}
-
-::hx::Val Hash_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
-{
-	switch(inName.length) {
-	case 5:
-		if (HX_FIELD_EQ(inName,"block") ) { return ::hx::Val( block ); }
-		if (HX_FIELD_EQ(inName,"_hash") ) { return ::hx::Val( _hash_dyn() ); }
-		break;
-	case 6:
-		if (HX_FIELD_EQ(inName,"length") ) { return ::hx::Val( length ); }
-		if (HX_FIELD_EQ(inName,"update") ) { return ::hx::Val( update_dyn() ); }
-		if (HX_FIELD_EQ(inName,"digest") ) { return ::hx::Val( digest_dyn() ); }
-		break;
-	case 7:
-		if (HX_FIELD_EQ(inName,"_update") ) { return ::hx::Val( _update_dyn() ); }
-		break;
-	case 9:
-		if (HX_FIELD_EQ(inName,"finalSize") ) { return ::hx::Val( finalSize ); }
-	}
-	return super::__Field(inName,inCallProp);
-}
-
-::hx::Val Hash_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
-{
-	switch(inName.length) {
-	case 5:
-		if (HX_FIELD_EQ(inName,"block") ) { block=inValue.Cast<  ::haxe::io::Bytes >(); return inValue; }
-		break;
-	case 6:
-		if (HX_FIELD_EQ(inName,"length") ) { length=inValue.Cast< int >(); return inValue; }
-		break;
-	case 9:
-		if (HX_FIELD_EQ(inName,"finalSize") ) { finalSize=inValue.Cast< int >(); return inValue; }
-	}
-	return super::__SetField(inName,inValue,inCallProp);
-}
-
-void Hash_obj::__GetFields(Array< ::String> &outFields)
-{
-	outFields->push(HX_("finalSize",57,1f,2b,8f));
-	outFields->push(HX_("length",e6,94,07,9f));
-	outFields->push(HX_("block",4d,75,fc,b4));
-	super::__GetFields(outFields);
-};
-
-#ifdef HXCPP_SCRIPTABLE
-static ::hx::StorageInfo Hash_obj_sMemberStorageInfo[] = {
-	{::hx::fsInt,(int)offsetof(Hash_obj,finalSize),HX_("finalSize",57,1f,2b,8f)},
-	{::hx::fsInt,(int)offsetof(Hash_obj,length),HX_("length",e6,94,07,9f)},
-	{::hx::fsObject /*  ::haxe::io::Bytes */ ,(int)offsetof(Hash_obj,block),HX_("block",4d,75,fc,b4)},
-	{ ::hx::fsUnknown, 0, null()}
-};
-static ::hx::StaticInfo *Hash_obj_sStaticStorageInfo = 0;
-#endif
-
-static ::String Hash_obj_sMemberFields[] = {
-	HX_("finalSize",57,1f,2b,8f),
-	HX_("length",e6,94,07,9f),
-	HX_("block",4d,75,fc,b4),
-	HX_("update",09,86,05,87),
-	HX_("digest",44,00,25,b5),
-	HX_("_update",a8,97,7c,f5),
-	HX_("_hash",ad,4b,19,f8),
-	::String(null()) };
-
-::hx::Class Hash_obj::__mClass;
-
-void Hash_obj::__register()
-{
-	::hx::Static(__mClass) = new ::hx::Class_obj();
-	__mClass->mName = HX_("sha.Hash",70,8d,4f,0b);
-	__mClass->mSuper = &super::__SGetClass();
-	__mClass->mGetStaticField = &::hx::Class_obj::GetNoStaticField;
-	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
-	__mClass->mStatics = ::hx::Class_obj::dupFunctions(0 /* sStaticFields */);
-	__mClass->mMembers = ::hx::Class_obj::dupFunctions(Hash_obj_sMemberFields);
-	__mClass->mCanCast = ::hx::TCanCast< Hash_obj >;
-#ifdef HXCPP_SCRIPTABLE
-	__mClass->mMemberStorageInfo = Hash_obj_sMemberStorageInfo;
-#endif
-#ifdef HXCPP_SCRIPTABLE
-	__mClass->mStaticStorageInfo = Hash_obj_sStaticStorageInfo;
-#endif
-	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
-}
-
-} // end namespace sha
diff --git a/Sources/c_borogove/src/sha/SHA256.cpp b/Sources/c_borogove/src/sha/SHA256.cpp
deleted file mode 100644
index da7ca3c..0000000
--- a/Sources/c_borogove/src/sha/SHA256.cpp
+++ /dev/null
@@ -1,406 +0,0 @@
-// Generated by Haxe 4.3.3
-#include <hxcpp.h>
-
-#ifndef INCLUDED_haxe_io_Bytes
-#include <haxe/io/Bytes.h>
-#endif
-#ifndef INCLUDED_sha_Hash
-#include <sha/Hash.h>
-#endif
-#ifndef INCLUDED_sha_SHA256
-#include <sha/SHA256.h>
-#endif
-#ifndef INCLUDED_sha__SHA256_SHA256_Fields_
-#include <sha/_SHA256/SHA256_Fields_.h>
-#endif
-
-HX_DEFINE_STACK_FRAME(_hx_pos_6226bdf42cc6cc66_24_new,"sha.SHA256","new",0x93e2e3fb,"sha.SHA256.new","sha/SHA256.hx",24,0xdc816bb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_6226bdf42cc6cc66_40_sigma0,"sha.SHA256","sigma0",0x79d84b30,"sha.SHA256.sigma0","sha/SHA256.hx",40,0xdc816bb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_6226bdf42cc6cc66_44_sigma1,"sha.SHA256","sigma1",0x79d84b31,"sha.SHA256.sigma1","sha/SHA256.hx",44,0xdc816bb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_6226bdf42cc6cc66_48_gamma0,"sha.SHA256","gamma0",0x16529a6e,"sha.SHA256.gamma0","sha/SHA256.hx",48,0xdc816bb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_6226bdf42cc6cc66_52_gamma1,"sha.SHA256","gamma1",0x16529a6f,"sha.SHA256.gamma1","sha/SHA256.hx",52,0xdc816bb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_6226bdf42cc6cc66_56_ch,"sha.SHA256","ch",0x1c36ef6a,"sha.SHA256.ch","sha/SHA256.hx",56,0xdc816bb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_6226bdf42cc6cc66_60_maj,"sha.SHA256","maj",0x93e21e31,"sha.SHA256.maj","sha/SHA256.hx",60,0xdc816bb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_6226bdf42cc6cc66_63__update,"sha.SHA256","_update",0xd8ad14c3,"sha.SHA256._update","sha/SHA256.hx",63,0xdc816bb4)
-HX_LOCAL_STACK_FRAME(_hx_pos_6226bdf42cc6cc66_107__hash,"sha.SHA256","_hash",0xdc48bc08,"sha.SHA256._hash","sha/SHA256.hx",107,0xdc816bb4)
-namespace sha{
-
-void SHA256_obj::__construct(){
-            	HX_STACKFRAME(&_hx_pos_6226bdf42cc6cc66_24_new)
-HXLINE(  33)		this->_w = ::Array_obj< int >::__new(0);
-HXLINE(  32)		this->_h = (int)1541459225;
-HXLINE(  31)		this->_g = 528734635;
-HXLINE(  30)		this->_f = (int)-1694144372;
-HXLINE(  29)		this->_e = (int)1359893119;
-HXLINE(  28)		this->_d = (int)-1521486534;
-HXLINE(  27)		this->_c = (int)1013904242;
-HXLINE(  26)		this->_b = (int)-1150833019;
-HXLINE(  25)		this->_a = (int)1779033703;
-HXLINE(  36)		super::__construct(64,56);
-            	}
-
-Dynamic SHA256_obj::__CreateEmpty() { return new SHA256_obj; }
-
-void *SHA256_obj::_hx_vtable = 0;
-
-Dynamic SHA256_obj::__Create(::hx::DynamicArray inArgs)
-{
-	::hx::ObjectPtr< SHA256_obj > _hx_result = new SHA256_obj();
-	_hx_result->__construct();
-	return _hx_result;
-}
-
-bool SHA256_obj::_hx_isInstanceOf(int inClassId) {
-	if (inClassId<=(int)0x0251ab23) {
-		return inClassId==(int)0x00000001 || inClassId==(int)0x0251ab23;
-	} else {
-		return inClassId==(int)0x49a7eb1a;
-	}
-}
-
-int SHA256_obj::sigma0(int x){
-            	HX_STACKFRAME(&_hx_pos_6226bdf42cc6cc66_40_sigma0)
-HXDLIN(  40)		return (((::hx::UShr(x,2) | (x << 30)) ^ (::hx::UShr(x,13) | (x << 19))) ^ (::hx::UShr(x,22) | (x << 10)));
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC1(SHA256_obj,sigma0,return )
-
-int SHA256_obj::sigma1(int x){
-            	HX_STACKFRAME(&_hx_pos_6226bdf42cc6cc66_44_sigma1)
-HXDLIN(  44)		return (((::hx::UShr(x,6) | (x << 26)) ^ (::hx::UShr(x,11) | (x << 21))) ^ (::hx::UShr(x,25) | (x << 7)));
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC1(SHA256_obj,sigma1,return )
-
-int SHA256_obj::gamma0(int x){
-            	HX_STACKFRAME(&_hx_pos_6226bdf42cc6cc66_48_gamma0)
-HXDLIN(  48)		return (((::hx::UShr(x,7) | (x << 25)) ^ (::hx::UShr(x,18) | (x << 14))) ^ ::hx::UShr(x,3));
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC1(SHA256_obj,gamma0,return )
-
-int SHA256_obj::gamma1(int x){
-            	HX_STACKFRAME(&_hx_pos_6226bdf42cc6cc66_52_gamma1)
-HXDLIN(  52)		return (((::hx::UShr(x,17) | (x << 15)) ^ (::hx::UShr(x,19) | (x << 13))) ^ ::hx::UShr(x,10));
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC1(SHA256_obj,gamma1,return )
-
-int SHA256_obj::ch(int x,int y,int z){
-            	HX_STACKFRAME(&_hx_pos_6226bdf42cc6cc66_56_ch)
-HXDLIN(  56)		return (z ^ (x & (y ^ z)));
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC3(SHA256_obj,ch,return )
-
-int SHA256_obj::maj(int x,int y,int z){
-            	HX_STACKFRAME(&_hx_pos_6226bdf42cc6cc66_60_maj)
-HXDLIN(  60)		return ((x & y) | (z & (x | y)));
-            	}
-
-
-HX_DEFINE_DYNAMIC_FUNC3(SHA256_obj,maj,return )
-
-void SHA256_obj::_update( ::haxe::io::Bytes data){
-            	HX_STACKFRAME(&_hx_pos_6226bdf42cc6cc66_63__update)
-HXLINE(  64)		::Array< int > W = this->_w;
-HXLINE(  66)		int a = (this->_a | 0);
-HXLINE(  67)		int b = (this->_b | 0);
-HXLINE(  68)		int c = (this->_c | 0);
-HXLINE(  69)		int d = (this->_d | 0);
-HXLINE(  70)		int e = (this->_e | 0);
-HXLINE(  71)		int f = (this->_f | 0);
-HXLINE(  72)		int g = (this->_g | 0);
-HXLINE(  73)		int h = (this->_h | 0);
-HXLINE(  75)		{
-HXLINE(  75)			int _g = 0;
-HXDLIN(  75)			while((_g < 16)){
-HXLINE(  75)				_g = (_g + 1);
-HXDLIN(  75)				int i = (_g - 1);
-HXLINE(  76)				W[i] = ((((( (int)(data->b->__get((i * 4))) ) << 24) | (( (int)(data->b->__get(((i * 4) + 1))) ) << 16)) | (( (int)(data->b->__get(((i * 4) + 2))) ) << 8)) | ( (int)(data->b->__get(((i * 4) + 3))) ));
-            			}
-            		}
-HXLINE(  79)		{
-HXLINE(  79)			int _g1 = 16;
-HXDLIN(  79)			while((_g1 < 64)){
-HXLINE(  79)				_g1 = (_g1 + 1);
-HXDLIN(  79)				int i1 = (_g1 - 1);
-HXLINE(  80)				int _hx_tmp = this->gamma1(W->__get((i1 - 2)));
-HXDLIN(  80)				int _hx_tmp1 = (_hx_tmp + W->__get((i1 - 7)));
-HXDLIN(  80)				int _hx_tmp2 = (_hx_tmp1 + this->gamma0(W->__get((i1 - 15))));
-HXDLIN(  80)				W[i1] = ((_hx_tmp2 + W->__get((i1 - 16))) | 0);
-            			}
-            		}
-HXLINE(  83)		{
-HXLINE(  83)			int _g2 = 0;
-HXDLIN(  83)			while((_g2 < 64)){
-HXLINE(  83)				_g2 = (_g2 + 1);
-HXDLIN(  83)				int j = (_g2 - 1);
-HXLINE(  84)				int T1 = (h + this->sigma1(e));
-HXDLIN(  84)				int T11 = (T1 + this->ch(e,f,g));
-HXDLIN(  84)				int T12 = (((T11 + ::sha::_SHA256::SHA256_Fields__obj::K->__get(j)) + W->__get(j)) | 0);
-HXLINE(  85)				int T2 = this->sigma0(a);
-HXDLIN(  85)				int T21 = ((T2 + this->maj(a,b,c)) | 0);
-HXLINE(  87)				h = g;
-HXLINE(  88)				g = f;
-HXLINE(  89)				f = e;
-HXLINE(  90)				e = ((d + T12) | 0);
-HXLINE(  91)				d = c;
-HXLINE(  92)				c = b;
-HXLINE(  93)				b = a;
-HXLINE(  94)				a = ((T12 + T21) | 0);
-            			}
-            		}
-HXLINE(  97)		this->_a = ((a + this->_a) | 0);
-HXLINE(  98)		this->_b = ((b + this->_b) | 0);
-HXLINE(  99)		this->_c = ((c + this->_c) | 0);
-HXLINE( 100)		this->_d = ((d + this->_d) | 0);
-HXLINE( 101)		this->_e = ((e + this->_e) | 0);
-HXLINE( 102)		this->_f = ((f + this->_f) | 0);
-HXLINE( 103)		this->_g = ((g + this->_g) | 0);
-HXLINE( 104)		this->_h = ((h + this->_h) | 0);
-            	}
-
-
- ::haxe::io::Bytes SHA256_obj::_hash(){
-            	HX_STACKFRAME(&_hx_pos_6226bdf42cc6cc66_107__hash)
-HXLINE( 108)		 ::haxe::io::Bytes b = ::haxe::io::Bytes_obj::alloc(32);
-HXLINE( 110)		{
-HXLINE( 110)			int i = this->_a;
-HXDLIN( 110)			b->b[0] = ( (unsigned char)((i >> 24)) );
-HXDLIN( 110)			b->b[1] = ( (unsigned char)(((i >> 16) & 255)) );
-HXDLIN( 110)			b->b[2] = ( (unsigned char)(((i >> 8) & 255)) );
-HXDLIN( 110)			b->b[3] = ( (unsigned char)((i & 255)) );
-            		}
-HXLINE( 111)		{
-HXLINE( 111)			int i1 = this->_b;
-HXDLIN( 111)			b->b[4] = ( (unsigned char)((i1 >> 24)) );
-HXDLIN( 111)			b->b[5] = ( (unsigned char)(((i1 >> 16) & 255)) );
-HXDLIN( 111)			b->b[6] = ( (unsigned char)(((i1 >> 8) & 255)) );
-HXDLIN( 111)			b->b[7] = ( (unsigned char)((i1 & 255)) );
-            		}
-HXLINE( 112)		{
-HXLINE( 112)			int i2 = this->_c;
-HXDLIN( 112)			b->b[8] = ( (unsigned char)((i2 >> 24)) );
-HXDLIN( 112)			b->b[9] = ( (unsigned char)(((i2 >> 16) & 255)) );
-HXDLIN( 112)			b->b[10] = ( (unsigned char)(((i2 >> 8) & 255)) );
-HXDLIN( 112)			b->b[11] = ( (unsigned char)((i2 & 255)) );
-            		}
-HXLINE( 113)		{
-HXLINE( 113)			int i3 = this->_d;
-HXDLIN( 113)			b->b[12] = ( (unsigned char)((i3 >> 24)) );
-HXDLIN( 113)			b->b[13] = ( (unsigned char)(((i3 >> 16) & 255)) );
-HXDLIN( 113)			b->b[14] = ( (unsigned char)(((i3 >> 8) & 255)) );
-HXDLIN( 113)			b->b[15] = ( (unsigned char)((i3 & 255)) );
-            		}
-HXLINE( 114)		{
-HXLINE( 114)			int i4 = this->_e;
-HXDLIN( 114)			b->b[16] = ( (unsigned char)((i4 >> 24)) );
-HXDLIN( 114)			b->b[17] = ( (unsigned char)(((i4 >> 16) & 255)) );
-HXDLIN( 114)			b->b[18] = ( (unsigned char)(((i4 >> 8) & 255)) );
-HXDLIN( 114)			b->b[19] = ( (unsigned char)((i4 & 255)) );
-            		}
-HXLINE( 115)		{
-HXLINE( 115)			int i5 = this->_f;
-HXDLIN( 115)			b->b[20] = ( (unsigned char)((i5 >> 24)) );
-HXDLIN( 115)			b->b[21] = ( (unsigned char)(((i5 >> 16) & 255)) );
-HXDLIN( 115)			b->b[22] = ( (unsigned char)(((i5 >> 8) & 255)) );
-HXDLIN( 115)			b->b[23] = ( (unsigned char)((i5 & 255)) );
-            		}
-HXLINE( 116)		{
-HXLINE( 116)			int i6 = this->_g;
-HXDLIN( 116)			b->b[24] = ( (unsigned char)((i6 >> 24)) );
-HXDLIN( 116)			b->b[25] = ( (unsigned char)(((i6 >> 16) & 255)) );
-HXDLIN( 116)			b->b[26] = ( (unsigned char)(((i6 >> 8) & 255)) );
-HXDLIN( 116)			b->b[27] = ( (unsigned char)((i6 & 255)) );
-            		}
-HXLINE( 117)		{
-HXLINE( 117)			int i7 = this->_h;
-HXDLIN( 117)			b->b[28] = ( (unsigned char)((i7 >> 24)) );
-HXDLIN( 117)			b->b[29] = ( (unsigned char)(((i7 >> 16) & 255)) );
-HXDLIN( 117)			b->b[30] = ( (unsigned char)(((i7 >> 8) & 255)) );
-HXDLIN( 117)			b->b[31] = ( (unsigned char)((i7 & 255)) );
-            		}
-HXLINE( 119)		return b;
-            	}
-
-
-
-::hx::ObjectPtr< SHA256_obj > SHA256_obj::__new() {
-	::hx::ObjectPtr< SHA256_obj > __this = new SHA256_obj();
-	__this->__construct();
-	return __this;
-}
-
-::hx::ObjectPtr< SHA256_obj > SHA256_obj::__alloc(::hx::Ctx *_hx_ctx) {
-	SHA256_obj *__this = (SHA256_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(SHA256_obj), true, "sha.SHA256"));
-	*(void **)__this = SHA256_obj::_hx_vtable;
-	__this->__construct();
-	return __this;
-}
-
-SHA256_obj::SHA256_obj()
-{
-}
-
-void SHA256_obj::__Mark(HX_MARK_PARAMS)
-{
-	HX_MARK_BEGIN_CLASS(SHA256);
-	HX_MARK_MEMBER_NAME(_a,"_a");
-	HX_MARK_MEMBER_NAME(_b,"_b");
-	HX_MARK_MEMBER_NAME(_c,"_c");
-	HX_MARK_MEMBER_NAME(_d,"_d");
-	HX_MARK_MEMBER_NAME(_e,"_e");
-	HX_MARK_MEMBER_NAME(_f,"_f");
-	HX_MARK_MEMBER_NAME(_g,"_g");
-	HX_MARK_MEMBER_NAME(_h,"_h");
-	HX_MARK_MEMBER_NAME(_w,"_w");
-	 ::sha::Hash_obj::__Mark(HX_MARK_ARG);
-	HX_MARK_END_CLASS();
-}
-
-void SHA256_obj::__Visit(HX_VISIT_PARAMS)
-{
-	HX_VISIT_MEMBER_NAME(_a,"_a");
-	HX_VISIT_MEMBER_NAME(_b,"_b");
-	HX_VISIT_MEMBER_NAME(_c,"_c");
-	HX_VISIT_MEMBER_NAME(_d,"_d");
-	HX_VISIT_MEMBER_NAME(_e,"_e");
-	HX_VISIT_MEMBER_NAME(_f,"_f");
-	HX_VISIT_MEMBER_NAME(_g,"_g");
-	HX_VISIT_MEMBER_NAME(_h,"_h");
-	HX_VISIT_MEMBER_NAME(_w,"_w");
-	 ::sha::Hash_obj::__Visit(HX_VISIT_ARG);
-}
-
-::hx::Val SHA256_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
-{
-	switch(inName.length) {
-	case 2:
-		if (HX_FIELD_EQ(inName,"_a") ) { return ::hx::Val( _a ); }
-		if (HX_FIELD_EQ(inName,"_b") ) { return ::hx::Val( _b ); }
-		if (HX_FIELD_EQ(inName,"_c") ) { return ::hx::Val( _c ); }
-		if (HX_FIELD_EQ(inName,"_d") ) { return ::hx::Val( _d ); }
-		if (HX_FIELD_EQ(inName,"_e") ) { return ::hx::Val( _e ); }
-		if (HX_FIELD_EQ(inName,"_f") ) { return ::hx::Val( _f ); }
-		if (HX_FIELD_EQ(inName,"_g") ) { return ::hx::Val( _g ); }
-		if (HX_FIELD_EQ(inName,"_h") ) { return ::hx::Val( _h ); }
-		if (HX_FIELD_EQ(inName,"_w") ) { return ::hx::Val( _w ); }
-		if (HX_FIELD_EQ(inName,"ch") ) { return ::hx::Val( ch_dyn() ); }
-		break;
-	case 3:
-		if (HX_FIELD_EQ(inName,"maj") ) { return ::hx::Val( maj_dyn() ); }
-		break;
-	case 5:
-		if (HX_FIELD_EQ(inName,"_hash") ) { return ::hx::Val( _hash_dyn() ); }
-		break;
-	case 6:
-		if (HX_FIELD_EQ(inName,"sigma0") ) { return ::hx::Val( sigma0_dyn() ); }
-		if (HX_FIELD_EQ(inName,"sigma1") ) { return ::hx::Val( sigma1_dyn() ); }
-		if (HX_FIELD_EQ(inName,"gamma0") ) { return ::hx::Val( gamma0_dyn() ); }
-		if (HX_FIELD_EQ(inName,"gamma1") ) { return ::hx::Val( gamma1_dyn() ); }
-		break;
-	case 7:
-		if (HX_FIELD_EQ(inName,"_update") ) { return ::hx::Val( _update_dyn() ); }
-	}
-	return super::__Field(inName,inCallProp);
-}
-
-::hx::Val SHA256_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
-{
-	switch(inName.length) {
-	case 2:
-		if (HX_FIELD_EQ(inName,"_a") ) { _a=inValue.Cast< int >(); return inValue; }
-		if (HX_FIELD_EQ(inName,"_b") ) { _b=inValue.Cast< int >(); return inValue; }
-		if (HX_FIELD_EQ(inName,"_c") ) { _c=inValue.Cast< int >(); return inValue; }
-		if (HX_FIELD_EQ(inName,"_d") ) { _d=inValue.Cast< int >(); return inValue; }
-		if (HX_FIELD_EQ(inName,"_e") ) { _e=inValue.Cast< int >(); return inValue; }
-		if (HX_FIELD_EQ(inName,"_f") ) { _f=inValue.Cast< int >(); return inValue; }
-		if (HX_FIELD_EQ(inName,"_g") ) { _g=inValue.Cast< int >(); return inValue; }
-		if (HX_FIELD_EQ(inName,"_h") ) { _h=inValue.Cast< int >(); return inValue; }
-		if (HX_FIELD_EQ(inName,"_w") ) { _w=inValue.Cast< ::Array< int > >(); return inValue; }
-	}
-	return super::__SetField(inName,inValue,inCallProp);
-}
-
-void SHA256_obj::__GetFields(Array< ::String> &outFields)
-{
-	outFields->push(HX_("_a",22,53,00,00));
-	outFields->push(HX_("_b",23,53,00,00));
-	outFields->push(HX_("_c",24,53,00,00));
-	outFields->push(HX_("_d",25,53,00,00));
-	outFields->push(HX_("_e",26,53,00,00));
-	outFields->push(HX_("_f",27,53,00,00));
-	outFields->push(HX_("_g",28,53,00,00));
-	outFields->push(HX_("_h",29,53,00,00));
-	outFields->push(HX_("_w",38,53,00,00));
-	super::__GetFields(outFields);
-};
-
-#ifdef HXCPP_SCRIPTABLE
-static ::hx::StorageInfo SHA256_obj_sMemberStorageInfo[] = {
-	{::hx::fsInt,(int)offsetof(SHA256_obj,_a),HX_("_a",22,53,00,00)},
-	{::hx::fsInt,(int)offsetof(SHA256_obj,_b),HX_("_b",23,53,00,00)},
-	{::hx::fsInt,(int)offsetof(SHA256_obj,_c),HX_("_c",24,53,00,00)},
-	{::hx::fsInt,(int)offsetof(SHA256_obj,_d),HX_("_d",25,53,00,00)},
-	{::hx::fsInt,(int)offsetof(SHA256_obj,_e),HX_("_e",26,53,00,00)},
-	{::hx::fsInt,(int)offsetof(SHA256_obj,_f),HX_("_f",27,53,00,00)},
-	{::hx::fsInt,(int)offsetof(SHA256_obj,_g),HX_("_g",28,53,00,00)},
-	{::hx::fsInt,(int)offsetof(SHA256_obj,_h),HX_("_h",29,53,00,00)},
-	{::hx::fsObject /* ::Array< int > */ ,(int)offsetof(SHA256_obj,_w),HX_("_w",38,53,00,00)},
-	{ ::hx::fsUnknown, 0, null()}
-};
-static ::hx::StaticInfo *SHA256_obj_sStaticStorageInfo = 0;
-#endif
-
-static ::String SHA256_obj_sMemberFields[] = {
-	HX_("_a",22,53,00,00),
-	HX_("_b",23,53,00,00),
-	HX_("_c",24,53,00,00),
-	HX_("_d",25,53,00,00),
-	HX_("_e",26,53,00,00),
-	HX_("_f",27,53,00,00),
-	HX_("_g",28,53,00,00),
-	HX_("_h",29,53,00,00),
-	HX_("_w",38,53,00,00),
-	HX_("sigma0",eb,6b,85,b4),
-	HX_("sigma1",ec,6b,85,b4),
-	HX_("gamma0",29,bb,ff,50),
-	HX_("gamma1",2a,bb,ff,50),
-	HX_("ch",a5,56,00,00),
-	HX_("maj",96,0a,53,00),
-	HX_("_update",a8,97,7c,f5),
-	HX_("_hash",ad,4b,19,f8),
-	::String(null()) };
-
-::hx::Class SHA256_obj::__mClass;
-
-void SHA256_obj::__register()
-{
-	SHA256_obj _hx_dummy;
-	SHA256_obj::_hx_vtable = *(void **)&_hx_dummy;
-	::hx::Static(__mClass) = new ::hx::Class_obj();
-	__mClass->mName = HX_("sha.SHA256",89,ca,14,08);
-	__mClass->mSuper = &super::__SGetClass();
-	__mClass->mConstructEmpty = &__CreateEmpty;
-	__mClass->mConstructArgs = &__Create;
-	__mClass->mGetStaticField = &::hx::Class_obj::GetNoStaticField;
-	__mClass->mSetStaticField = &::hx::Class_obj::SetNoStaticField;
-	__mClass->mStatics = ::hx::Class_obj::dupFunctions(0 /* sStaticFields */);
-	__mClass->mMembers = ::hx::Class_obj::dupFunctions(SHA256_obj_sMemberFields);
-	__mClass->mCanCast = ::hx::TCanCast< SHA256_obj >;
-#ifdef HXCPP_SCRIPTABLE
-	__mClass->mMemberStorageInfo = SHA256_obj_sMemberStorageInfo;
-#endif
-#ifdef HXCPP_SCRIPTABLE
-	__mClass->mStaticStorageInfo = SHA256_obj_sStaticStorageInfo;
-#endif
-	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
-}
-
-} // end namespace sha
diff --git a/Sources/c_borogove/src/sha/_SHA256/SHA256_Fields_.cpp b/Sources/c_borogove/src/sha/_SHA256/SHA256_Fields_.cpp
deleted file mode 100644
index edd16c6..0000000
--- a/Sources/c_borogove/src/sha/_SHA256/SHA256_Fields_.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-// Generated by Haxe 4.3.3
-#include <hxcpp.h>
-
-#ifndef INCLUDED_sha__SHA256_SHA256_Fields_
-#include <sha/_SHA256/SHA256_Fields_.h>
-#endif
-
-HX_LOCAL_STACK_FRAME(_hx_pos_28eeb24f2f42c3b1_5_boot,"sha._SHA256.SHA256_Fields_","boot",0x84d19c68,"sha._SHA256.SHA256_Fields_.boot","sha/SHA256.hx",5,0xdc816bb4)
-static const int _hx_array_data_510133f8_1[] = {
-	(int)1116352408,(int)1899447441,(int)-1245643825,(int)-373957723,(int)961987163,(int)1508970993,(int)-1841331548,(int)-1424204075,(int)-670586216,(int)310598401,(int)607225278,(int)1426881987,(int)1925078388,(int)-2132889090,(int)-1680079193,(int)-1046744716,(int)-459576895,(int)-272742522,(int)264347078,(int)604807628,(int)770255983,(int)1249150122,(int)1555081692,(int)1996064986,(int)-1740746414,(int)-1473132947,(int)-1341970488,(int)-1084653625,(int)-958395405,(int)-710438585,(int)113926993,(int)338241895,(int)666307205,(int)773529912,(int)1294757372,(int)1396182291,(int)1695183700,(int)1986661051,(int)-2117940946,(int)-1838011259,(int)-1564481375,(int)-1474664885,(int)-1035236496,(int)-949202525,(int)-778901479,(int)-694614492,(int)-200395387,(int)275423344,(int)430227734,(int)506948616,(int)659060556,(int)883997877,(int)958139571,(int)1322822218,(int)1537002063,(int)1747873779,(int)1955562222,(int)2024104815,(int)-2067236844,(int)-1933114872,(int)-1866530822,(int)-1538233109,(int)-1090935817,(int)-965641998,
-};
-namespace sha{
-namespace _SHA256{
-
-void SHA256_Fields__obj::__construct() { }
-
-Dynamic SHA256_Fields__obj::__CreateEmpty() { return new SHA256_Fields__obj; }
-
-void *SHA256_Fields__obj::_hx_vtable = 0;
-
-Dynamic SHA256_Fields__obj::__Create(::hx::DynamicArray inArgs)
-{
-	::hx::ObjectPtr< SHA256_Fields__obj > _hx_result = new SHA256_Fields__obj();
-	_hx_result->__construct();
-	return _hx_result;
-}
-
-bool SHA256_Fields__obj::_hx_isInstanceOf(int inClassId) {
-	return inClassId==(int)0x00000001 || inClassId==(int)0x07d39014;
-}
-
-::Array< int > SHA256_Fields__obj::K;
-
-
-SHA256_Fields__obj::SHA256_Fields__obj()
-{
-}
-
-bool SHA256_Fields__obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
-{
-	switch(inName.length) {
-	case 1:
-		if (HX_FIELD_EQ(inName,"K") ) { outValue = ( K ); return true; }
-	}
-	return false;
-}
-
-bool SHA256_Fields__obj::__SetStatic(const ::String &inName,Dynamic &ioValue,::hx::PropertyAccess inCallProp)
-{
-	switch(inName.length) {
-	case 1:
-		if (HX_FIELD_EQ(inName,"K") ) { K=ioValue.Cast< ::Array< int > >(); return true; }
-	}
-	return false;
-}
-
-#ifdef HXCPP_SCRIPTABLE
-static ::hx::StorageInfo *SHA256_Fields__obj_sMemberStorageInfo = 0;
-static ::hx::StaticInfo SHA256_Fields__obj_sStaticStorageInfo[] = {
-	{::hx::fsObject /* ::Array< int > */ ,(void *) &SHA256_Fields__obj::K,HX_("K",4b,00,00,00)},
-	{ ::hx::fsUnknown, 0, null()}
-};
-#endif
-
-static void SHA256_Fields__obj_sMarkStatics(HX_MARK_PARAMS) {
-	HX_MARK_MEMBER_NAME(SHA256_Fields__obj::K,"K");
-};
-
-#ifdef HXCPP_VISIT_ALLOCS
-static void SHA256_Fields__obj_sVisitStatics(HX_VISIT_PARAMS) {
-	HX_VISIT_MEMBER_NAME(SHA256_Fields__obj::K,"K");
-};
-
-#endif
-
-::hx::Class SHA256_Fields__obj::__mClass;
-
-static ::String SHA256_Fields__obj_sStaticFields[] = {
-	HX_("K",4b,00,00,00),
-	::String(null())
-};
-
-void SHA256_Fields__obj::__register()
-{
-	SHA256_Fields__obj _hx_dummy;
-	SHA256_Fields__obj::_hx_vtable = *(void **)&_hx_dummy;
-	::hx::Static(__mClass) = new ::hx::Class_obj();
-	__mClass->mName = HX_("sha._SHA256.SHA256_Fields_",f8,33,01,51);
-	__mClass->mSuper = &super::__SGetClass();
-	__mClass->mConstructEmpty = &__CreateEmpty;
-	__mClass->mConstructArgs = &__Create;
-	__mClass->mGetStaticField = &SHA256_Fields__obj::__GetStatic;
-	__mClass->mSetStaticField = &SHA256_Fields__obj::__SetStatic;
-	__mClass->mMarkFunc = SHA256_Fields__obj_sMarkStatics;
-	__mClass->mStatics = ::hx::Class_obj::dupFunctions(SHA256_Fields__obj_sStaticFields);
-	__mClass->mMembers = ::hx::Class_obj::dupFunctions(0 /* sMemberFields */);
-	__mClass->mCanCast = ::hx::TCanCast< SHA256_Fields__obj >;
-#ifdef HXCPP_VISIT_ALLOCS
-	__mClass->mVisitFunc = SHA256_Fields__obj_sVisitStatics;
-#endif
-#ifdef HXCPP_SCRIPTABLE
-	__mClass->mMemberStorageInfo = SHA256_Fields__obj_sMemberStorageInfo;
-#endif
-#ifdef HXCPP_SCRIPTABLE
-	__mClass->mStaticStorageInfo = SHA256_Fields__obj_sStaticStorageInfo;
-#endif
-	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
-}
-
-void SHA256_Fields__obj::__boot()
-{
-{
-            	HX_STACKFRAME(&_hx_pos_28eeb24f2f42c3b1_5_boot)
-HXDLIN(   5)		K = ::Array_obj< int >::fromData( _hx_array_data_510133f8_1,64);
-            	}
-}
-
-} // end namespace sha
-} // end namespace _SHA256
diff --git a/Sources/c_borogove/src/sys/io/Process.cpp b/Sources/c_borogove/src/sys/io/Process.cpp
index 17359e1..c9eb3db 100644
--- a/Sources/c_borogove/src/sys/io/Process.cpp
+++ b/Sources/c_borogove/src/sys/io/Process.cpp
@@ -19,6 +19,7 @@
 
 HX_DEFINE_STACK_FRAME(_hx_pos_7b7d5a95d2caa5c3_94_new,"sys.io.Process","new",0x849b4c7a,"sys.io.Process.new","/usr/local/lib/haxe/std/cpp/_std/sys/io/Process.hx",94,0x8244a714)
 HX_LOCAL_STACK_FRAME(_hx_pos_7b7d5a95d2caa5c3_108_exitCode,"sys.io.Process","exitCode",0x41e72111,"sys.io.Process.exitCode","/usr/local/lib/haxe/std/cpp/_std/sys/io/Process.hx",108,0x8244a714)
+HX_LOCAL_STACK_FRAME(_hx_pos_7b7d5a95d2caa5c3_112_close,"sys.io.Process","close",0x0a954e52,"sys.io.Process.close","/usr/local/lib/haxe/std/cpp/_std/sys/io/Process.hx",112,0x8244a714)
 namespace sys{
 namespace io{
 
@@ -74,6 +75,14 @@ HXDLIN( 108)		return _hx_std_process_exit(this->p,block);
 
 HX_DEFINE_DYNAMIC_FUNC1(Process_obj,exitCode,return )
 
+void Process_obj::close(){
+            	HX_STACKFRAME(&_hx_pos_7b7d5a95d2caa5c3_112_close)
+HXDLIN( 112)		_hx_std_process_close(this->p);
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(Process_obj,close,(void))
+
 
 ::hx::ObjectPtr< Process_obj > Process_obj::__new(::String cmd,::Array< ::String > args, ::Dynamic detached) {
 	::hx::ObjectPtr< Process_obj > __this = new Process_obj();
@@ -118,6 +127,7 @@ void Process_obj::__Visit(HX_VISIT_PARAMS)
 		break;
 	case 5:
 		if (HX_FIELD_EQ(inName,"stdin") ) { return ::hx::Val( _hx_stdin ); }
+		if (HX_FIELD_EQ(inName,"close") ) { return ::hx::Val( close_dyn() ); }
 		break;
 	case 6:
 		if (HX_FIELD_EQ(inName,"stdout") ) { return ::hx::Val( _hx_stdout ); }
@@ -171,6 +181,7 @@ static ::String Process_obj_sMemberFields[] = {
 	HX_("stderr",a2,26,ec,07),
 	HX_("stdin",48,b3,0d,84),
 	HX_("exitCode",6b,bb,88,01),
+	HX_("close",b8,17,63,48),
 	::String(null()) };
 
 ::hx::Class Process_obj::__mClass;
diff --git a/Sources/c_borogove/src/uuidv7/V7Generator.cpp b/Sources/c_borogove/src/uuidv7/V7Generator.cpp
new file mode 100644
index 0000000..8248b56
--- /dev/null
+++ b/Sources/c_borogove/src/uuidv7/V7Generator.cpp
@@ -0,0 +1,407 @@
+// Generated by Haxe 4.3.3
+#include <hxcpp.h>
+
+#ifndef INCLUDED_38344beec7696400
+#define INCLUDED_38344beec7696400
+#include "cpp/Int64.h"
+#endif
+#ifndef INCLUDED_Date
+#include <Date.h>
+#endif
+#ifndef INCLUDED_Std
+#include <Std.h>
+#endif
+#ifndef INCLUDED_StringBuf
+#include <StringBuf.h>
+#endif
+#ifndef INCLUDED_haxe__Int64_Int64_Impl_
+#include <haxe/_Int64/Int64_Impl_.h>
+#endif
+#ifndef INCLUDED_haxe_crypto_random_SecureRandom
+#include <haxe/crypto/random/SecureRandom.h>
+#endif
+#ifndef INCLUDED_uuidv7_V7Generator
+#include <uuidv7/V7Generator.h>
+#endif
+
+HX_DEFINE_STACK_FRAME(_hx_pos_20f805840e4eada9_6_new,"uuidv7.V7Generator","new",0x479a8472,"uuidv7.V7Generator.new","uuidv7/V7Generator.hx",6,0x62caeeff)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f805840e4eada9_14_generate,"uuidv7.V7Generator","generate",0xe3fba9e3,"uuidv7.V7Generator.generate","uuidv7/V7Generator.hx",14,0x62caeeff)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f805840e4eada9_21_generateOrResetCore,"uuidv7.V7Generator","generateOrResetCore",0xb3514c08,"uuidv7.V7Generator.generateOrResetCore","uuidv7/V7Generator.hx",21,0x62caeeff)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f805840e4eada9_30_generateOrAbortCore,"uuidv7.V7Generator","generateOrAbortCore",0x91ffd269,"uuidv7.V7Generator.generateOrAbortCore","uuidv7/V7Generator.hx",30,0x62caeeff)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f805840e4eada9_61_resetCounter,"uuidv7.V7Generator","resetCounter",0x10b72e9b,"uuidv7.V7Generator.resetCounter","uuidv7/V7Generator.hx",61,0x62caeeff)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f805840e4eada9_68_int64ToFloat,"uuidv7.V7Generator","int64ToFloat",0xb3eb2562,"uuidv7.V7Generator.int64ToFloat","uuidv7/V7Generator.hx",68,0x62caeeff)
+HX_LOCAL_STACK_FRAME(_hx_pos_20f805840e4eada9_77_formatUuid,"uuidv7.V7Generator","formatUuid",0x58580f40,"uuidv7.V7Generator.formatUuid","uuidv7/V7Generator.hx",77,0x62caeeff)
+static const ::String _hx_array_data_7fc72380_8[] = {
+	HX_("-",2d,00,00,00),
+};
+HX_LOCAL_STACK_FRAME(_hx_pos_20f805840e4eada9_7_boot,"uuidv7.V7Generator","boot",0x57b25fe0,"uuidv7.V7Generator.boot","uuidv7/V7Generator.hx",7,0x62caeeff)
+namespace uuidv7{
+
+void V7Generator_obj::__construct(){
+            	HX_STACKFRAME(&_hx_pos_20f805840e4eada9_6_new)
+HXLINE(   9)		this->counter = ( (::cpp::Int64)(0) );
+HXLINE(   8)		this->timestampBiased = ( (::cpp::Int64)(0) );
+            	}
+
+Dynamic V7Generator_obj::__CreateEmpty() { return new V7Generator_obj; }
+
+void *V7Generator_obj::_hx_vtable = 0;
+
+Dynamic V7Generator_obj::__Create(::hx::DynamicArray inArgs)
+{
+	::hx::ObjectPtr< V7Generator_obj > _hx_result = new V7Generator_obj();
+	_hx_result->__construct();
+	return _hx_result;
+}
+
+bool V7Generator_obj::_hx_isInstanceOf(int inClassId) {
+	return inClassId==(int)0x00000001 || inClassId==(int)0x60dea512;
+}
+
+::String V7Generator_obj::generate(){
+            	HX_STACKFRAME(&_hx_pos_20f805840e4eada9_14_generate)
+HXDLIN(  14)		return this->generateOrResetCore(::Date_obj::now()->getTime(),( (Float)(10000) ));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(V7Generator_obj,generate,return )
+
+::String V7Generator_obj::generateOrResetCore(Float unixTsMs,Float rollbackAllowance){
+            	HX_STACKFRAME(&_hx_pos_20f805840e4eada9_21_generateOrResetCore)
+HXLINE(  22)		::String value = this->generateOrAbortCore(unixTsMs,rollbackAllowance);
+HXLINE(  23)		if (::hx::IsNull( value )) {
+HXLINE(  24)			this->timestampBiased = ( (::cpp::Int64)(0) );
+HXLINE(  25)			value = this->generateOrAbortCore(unixTsMs,rollbackAllowance);
+            		}
+HXLINE(  27)		return value;
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(V7Generator_obj,generateOrResetCore,return )
+
+::String V7Generator_obj::generateOrAbortCore(Float unixTsMs,Float rollbackAllowance){
+            	HX_STACKFRAME(&_hx_pos_20f805840e4eada9_30_generateOrAbortCore)
+HXLINE(  31)		::cpp::Int64 MAX_COUNTER = _hx_int64_make(1023,-1);
+HXLINE(  33)		bool _hx_tmp;
+HXDLIN(  33)		if (!((unixTsMs < 0))) {
+HXLINE(  33)			_hx_tmp = (unixTsMs > ((Float)281474976710655.0));
+            		}
+            		else {
+HXLINE(  33)			_hx_tmp = true;
+            		}
+HXDLIN(  33)		if (_hx_tmp) {
+HXLINE(  34)			HX_STACK_DO_THROW(HX_("RangeError: `unixTsMs` must be a 48-bit unsigned integer",6e,6e,5b,93));
+            		}
+            		else {
+HXLINE(  35)			bool _hx_tmp1;
+HXDLIN(  35)			if (!((rollbackAllowance < 0))) {
+HXLINE(  35)				_hx_tmp1 = (rollbackAllowance > ((Float)281474976710655.0));
+            			}
+            			else {
+HXLINE(  35)				_hx_tmp1 = true;
+            			}
+HXDLIN(  35)			if (_hx_tmp1) {
+HXLINE(  36)				HX_STACK_DO_THROW(HX_("RangeError: `rollbackAllowance` out of reasonable range",6d,3c,04,59));
+            			}
+            		}
+HXLINE(  39)		::cpp::Int64 tsInt = _hx_int64_add(::haxe::_Int64::Int64_Impl__obj::fromFloat(unixTsMs),( (::cpp::Int64)(1) ));
+HXLINE(  40)		if ((_hx_int64_compare(tsInt,this->timestampBiased) > 0)) {
+HXLINE(  41)			this->timestampBiased = tsInt;
+HXLINE(  42)			this->resetCounter();
+            		}
+            		else {
+HXLINE(  43)			::cpp::Int64 a = _hx_int64_add(tsInt,::haxe::_Int64::Int64_Impl__obj::fromFloat(rollbackAllowance));
+HXDLIN(  43)			if ((_hx_int64_compare(a,this->timestampBiased) >= 0)) {
+HXLINE(  44)				this->counter = _hx_int64_add(this->counter,( (::cpp::Int64)(1) ));
+HXLINE(  45)				if ((_hx_int64_compare(this->counter,MAX_COUNTER) > 0)) {
+HXLINE(  46)					this->timestampBiased = _hx_int64_add(this->timestampBiased,( (::cpp::Int64)(1) ));
+HXLINE(  47)					this->resetCounter();
+            				}
+            			}
+            			else {
+HXLINE(  50)				return null();
+            			}
+            		}
+HXLINE(  53)		Float unixTsMsVal = ::uuidv7::V7Generator_obj::int64ToFloat(_hx_int64_sub(this->timestampBiased,( (::cpp::Int64)(1) )));
+HXLINE(  54)		int randA = _hx_int64_low(_hx_int64_shr(this->counter,30));
+HXLINE(  55)		int randBHi = (_hx_int64_low(this->counter) & (int)1073741823);
+HXLINE(  58)		return ::uuidv7::V7Generator_obj::formatUuid(unixTsMsVal,randA,randBHi,::haxe::crypto::random::SecureRandom_obj::_hx_int());
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC2(V7Generator_obj,generateOrAbortCore,return )
+
+void V7Generator_obj::resetCounter(){
+            	HX_STACKFRAME(&_hx_pos_20f805840e4eada9_61_resetCounter)
+HXLINE(  62)		int r1 = ::haxe::crypto::random::SecureRandom_obj::_hx_int();
+HXLINE(  63)		int r2 = ::haxe::crypto::random::SecureRandom_obj::_hx_int();
+HXLINE(  64)		::cpp::Int64 r1_64 = _hx_int64_make(0,r1);
+HXLINE(  65)		::cpp::Int64 a = _hx_int64_shl(r1_64,10);
+HXDLIN(  65)		this->counter = _hx_int64_or(a,_hx_int64_make(0,(r2 & 1023)));
+            	}
+
+
+HX_DEFINE_DYNAMIC_FUNC0(V7Generator_obj,resetCounter,(void))
+
+::String V7Generator_obj::DIGITS;
+
+Float V7Generator_obj::int64ToFloat(::cpp::Int64 i){
+            	HX_STACKFRAME(&_hx_pos_20f805840e4eada9_68_int64ToFloat)
+HXLINE(  69)		int h = _hx_int64_high(i);
+HXLINE(  70)		int l = _hx_int64_low(i);
+HXLINE(  71)		Float f = (( (Float)(h) ) * ((Float)4294967296.0));
+HXLINE(  72)		if ((l < 0)) {
+HXLINE(  72)			f = (f + (((Float)4294967296.0) + l));
+            		}
+            		else {
+HXLINE(  73)			f = (f + l);
+            		}
+HXLINE(  74)		return f;
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC1(V7Generator_obj,int64ToFloat,return )
+
+::String V7Generator_obj::formatUuid(Float unixTsMs,int randA,int randBHi,int randBLo){
+            	HX_GC_STACKFRAME(&_hx_pos_20f805840e4eada9_77_formatUuid)
+HXLINE(  78)		::cpp::Int64 tsInt = ::haxe::_Int64::Int64_Impl__obj::fromFloat(unixTsMs);
+HXLINE(  81)		int b0 = (_hx_int64_low(_hx_int64_ushr(tsInt,40)) & 255);
+HXLINE(  82)		int b1 = (_hx_int64_low(_hx_int64_ushr(tsInt,32)) & 255);
+HXLINE(  83)		int b2 = (_hx_int64_low(_hx_int64_ushr(tsInt,24)) & 255);
+HXLINE(  84)		int b3 = (_hx_int64_low(_hx_int64_ushr(tsInt,16)) & 255);
+HXLINE(  85)		int b4 = (_hx_int64_low(_hx_int64_ushr(tsInt,8)) & 255);
+HXLINE(  86)		int b5 = (_hx_int64_low(tsInt) & 255);
+HXLINE( 104)		::Array< int > bytes = ::Array_obj< int >::__new(16)->init(0,b0)->init(1,b1)->init(2,b2)->init(3,b3)->init(4,b4)->init(5,b5)->init(6,(112 | ::hx::UShr(randA,8)))->init(7,(randA & 255))->init(8,(128 | ::hx::UShr(randBHi,24)))->init(9,(::hx::UShr(randBHi,16) & 255))->init(10,(::hx::UShr(randBHi,8) & 255))->init(11,(randBHi & 255))->init(12,(::hx::UShr(randBLo,24) & 255))->init(13,(::hx::UShr(randBLo,16) & 255))->init(14,(::hx::UShr(randBLo,8) & 255))->init(15,(randBLo & 255));
+HXLINE( 105)		 ::StringBuf text =  ::StringBuf_obj::__alloc( HX_CTX );
+HXLINE( 106)		{
+HXLINE( 106)			int _g = 0;
+HXDLIN( 106)			while((_g < 16)){
+HXLINE( 106)				_g = (_g + 1);
+HXDLIN( 106)				int i = (_g - 1);
+HXLINE( 107)				int b = bytes->__get(i);
+HXLINE( 108)				{
+HXLINE( 108)					::String x = ::uuidv7::V7Generator_obj::DIGITS.charAt(::hx::UShr(b,4));
+HXDLIN( 108)					if (::hx::IsNotNull( text->charBuf )) {
+HXLINE( 108)						text->flush();
+            					}
+HXDLIN( 108)					if (::hx::IsNull( text->b )) {
+HXLINE( 108)						text->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(x));
+            					}
+            					else {
+HXLINE( 108)						::Array< ::String > text1 = text->b;
+HXDLIN( 108)						text1->push(::Std_obj::string(x));
+            					}
+            				}
+HXLINE( 109)				{
+HXLINE( 109)					::String x1 = ::uuidv7::V7Generator_obj::DIGITS.charAt((b & 15));
+HXDLIN( 109)					if (::hx::IsNotNull( text->charBuf )) {
+HXLINE( 109)						text->flush();
+            					}
+HXDLIN( 109)					if (::hx::IsNull( text->b )) {
+HXLINE( 109)						text->b = ::Array_obj< ::String >::__new(1)->init(0,::Std_obj::string(x1));
+            					}
+            					else {
+HXLINE( 109)						::Array< ::String > text2 = text->b;
+HXDLIN( 109)						text2->push(::Std_obj::string(x1));
+            					}
+            				}
+HXLINE( 110)				bool _hx_tmp;
+HXDLIN( 110)				bool _hx_tmp1;
+HXDLIN( 110)				bool _hx_tmp2;
+HXDLIN( 110)				if ((i != 3)) {
+HXLINE( 110)					_hx_tmp2 = (i == 5);
+            				}
+            				else {
+HXLINE( 110)					_hx_tmp2 = true;
+            				}
+HXDLIN( 110)				if (!(_hx_tmp2)) {
+HXLINE( 110)					_hx_tmp1 = (i == 7);
+            				}
+            				else {
+HXLINE( 110)					_hx_tmp1 = true;
+            				}
+HXDLIN( 110)				if (!(_hx_tmp1)) {
+HXLINE( 110)					_hx_tmp = (i == 9);
+            				}
+            				else {
+HXLINE( 110)					_hx_tmp = true;
+            				}
+HXDLIN( 110)				if (_hx_tmp) {
+HXLINE( 111)					if (::hx::IsNotNull( text->charBuf )) {
+HXLINE( 111)						text->flush();
+            					}
+HXDLIN( 111)					if (::hx::IsNull( text->b )) {
+HXLINE( 111)						text->b = ::Array_obj< ::String >::fromData( _hx_array_data_7fc72380_8,1);
+            					}
+            					else {
+HXLINE( 111)						text->b->push(HX_("-",2d,00,00,00));
+            					}
+            				}
+            			}
+            		}
+HXLINE( 114)		return text->toString();
+            	}
+
+
+STATIC_HX_DEFINE_DYNAMIC_FUNC4(V7Generator_obj,formatUuid,return )
+
+
+::hx::ObjectPtr< V7Generator_obj > V7Generator_obj::__new() {
+	::hx::ObjectPtr< V7Generator_obj > __this = new V7Generator_obj();
+	__this->__construct();
+	return __this;
+}
+
+::hx::ObjectPtr< V7Generator_obj > V7Generator_obj::__alloc(::hx::Ctx *_hx_ctx) {
+	V7Generator_obj *__this = (V7Generator_obj*)(::hx::Ctx::alloc(_hx_ctx, sizeof(V7Generator_obj), false, "uuidv7.V7Generator"));
+	*(void **)__this = V7Generator_obj::_hx_vtable;
+	__this->__construct();
+	return __this;
+}
+
+V7Generator_obj::V7Generator_obj()
+{
+}
+
+::hx::Val V7Generator_obj::__Field(const ::String &inName,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 7:
+		if (HX_FIELD_EQ(inName,"counter") ) { return ::hx::Val( counter ); }
+		break;
+	case 8:
+		if (HX_FIELD_EQ(inName,"generate") ) { return ::hx::Val( generate_dyn() ); }
+		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"resetCounter") ) { return ::hx::Val( resetCounter_dyn() ); }
+		break;
+	case 15:
+		if (HX_FIELD_EQ(inName,"timestampBiased") ) { return ::hx::Val( timestampBiased ); }
+		break;
+	case 19:
+		if (HX_FIELD_EQ(inName,"generateOrResetCore") ) { return ::hx::Val( generateOrResetCore_dyn() ); }
+		if (HX_FIELD_EQ(inName,"generateOrAbortCore") ) { return ::hx::Val( generateOrAbortCore_dyn() ); }
+	}
+	return super::__Field(inName,inCallProp);
+}
+
+bool V7Generator_obj::__GetStatic(const ::String &inName, Dynamic &outValue, ::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 6:
+		if (HX_FIELD_EQ(inName,"DIGITS") ) { outValue = ( DIGITS ); return true; }
+		break;
+	case 10:
+		if (HX_FIELD_EQ(inName,"formatUuid") ) { outValue = formatUuid_dyn(); return true; }
+		break;
+	case 12:
+		if (HX_FIELD_EQ(inName,"int64ToFloat") ) { outValue = int64ToFloat_dyn(); return true; }
+	}
+	return false;
+}
+
+::hx::Val V7Generator_obj::__SetField(const ::String &inName,const ::hx::Val &inValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 7:
+		if (HX_FIELD_EQ(inName,"counter") ) { counter=inValue.Cast< ::cpp::Int64 >(); return inValue; }
+		break;
+	case 15:
+		if (HX_FIELD_EQ(inName,"timestampBiased") ) { timestampBiased=inValue.Cast< ::cpp::Int64 >(); return inValue; }
+	}
+	return super::__SetField(inName,inValue,inCallProp);
+}
+
+bool V7Generator_obj::__SetStatic(const ::String &inName,Dynamic &ioValue,::hx::PropertyAccess inCallProp)
+{
+	switch(inName.length) {
+	case 6:
+		if (HX_FIELD_EQ(inName,"DIGITS") ) { DIGITS=ioValue.Cast< ::String >(); return true; }
+	}
+	return false;
+}
+
+void V7Generator_obj::__GetFields(Array< ::String> &outFields)
+{
+	outFields->push(HX_("timestampBiased",8e,20,ad,96));
+	outFields->push(HX_("counter",fc,ae,59,1d));
+	super::__GetFields(outFields);
+};
+
+#ifdef HXCPP_SCRIPTABLE
+static ::hx::StorageInfo V7Generator_obj_sMemberStorageInfo[] = {
+	{::hx::fsUnknown /* ::cpp::Int64 */ ,(int)offsetof(V7Generator_obj,timestampBiased),HX_("timestampBiased",8e,20,ad,96)},
+	{::hx::fsUnknown /* ::cpp::Int64 */ ,(int)offsetof(V7Generator_obj,counter),HX_("counter",fc,ae,59,1d)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+static ::hx::StaticInfo V7Generator_obj_sStaticStorageInfo[] = {
+	{::hx::fsString,(void *) &V7Generator_obj::DIGITS,HX_("DIGITS",26,b6,aa,67)},
+	{ ::hx::fsUnknown, 0, null()}
+};
+#endif
+
+static ::String V7Generator_obj_sMemberFields[] = {
+	HX_("timestampBiased",8e,20,ad,96),
+	HX_("counter",fc,ae,59,1d),
+	HX_("generate",35,5f,a2,d9),
+	HX_("generateOrResetCore",f6,d3,3d,5b),
+	HX_("generateOrAbortCore",57,5a,ec,39),
+	HX_("resetCounter",ed,f4,37,8f),
+	::String(null()) };
+
+static void V7Generator_obj_sMarkStatics(HX_MARK_PARAMS) {
+	HX_MARK_MEMBER_NAME(V7Generator_obj::DIGITS,"DIGITS");
+};
+
+#ifdef HXCPP_VISIT_ALLOCS
+static void V7Generator_obj_sVisitStatics(HX_VISIT_PARAMS) {
+	HX_VISIT_MEMBER_NAME(V7Generator_obj::DIGITS,"DIGITS");
+};
+
+#endif
+
+::hx::Class V7Generator_obj::__mClass;
+
+static ::String V7Generator_obj_sStaticFields[] = {
+	HX_("DIGITS",26,b6,aa,67),
+	HX_("int64ToFloat",b4,eb,6b,32),
+	HX_("formatUuid",12,3d,14,0d),
+	::String(null())
+};
+
+void V7Generator_obj::__register()
+{
+	V7Generator_obj _hx_dummy;
+	V7Generator_obj::_hx_vtable = *(void **)&_hx_dummy;
+	::hx::Static(__mClass) = new ::hx::Class_obj();
+	__mClass->mName = HX_("uuidv7.V7Generator",80,23,c7,7f);
+	__mClass->mSuper = &super::__SGetClass();
+	__mClass->mConstructEmpty = &__CreateEmpty;
+	__mClass->mConstructArgs = &__Create;
+	__mClass->mGetStaticField = &V7Generator_obj::__GetStatic;
+	__mClass->mSetStaticField = &V7Generator_obj::__SetStatic;
+	__mClass->mMarkFunc = V7Generator_obj_sMarkStatics;
+	__mClass->mStatics = ::hx::Class_obj::dupFunctions(V7Generator_obj_sStaticFields);
+	__mClass->mMembers = ::hx::Class_obj::dupFunctions(V7Generator_obj_sMemberFields);
+	__mClass->mCanCast = ::hx::TCanCast< V7Generator_obj >;
+#ifdef HXCPP_VISIT_ALLOCS
+	__mClass->mVisitFunc = V7Generator_obj_sVisitStatics;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mMemberStorageInfo = V7Generator_obj_sMemberStorageInfo;
+#endif
+#ifdef HXCPP_SCRIPTABLE
+	__mClass->mStaticStorageInfo = V7Generator_obj_sStaticStorageInfo;
+#endif
+	::hx::_hx_RegisterClass(__mClass->mName, __mClass);
+}
+
+void V7Generator_obj::__boot()
+{
+{
+            	HX_STACKFRAME(&_hx_pos_20f805840e4eada9_7_boot)
+HXDLIN(   7)		DIGITS = HX_("0123456789abcdef",68,7e,d5,ef);
+            	}
+}
+
+} // end namespace uuidv7
diff --git a/Sources/strophe/libstrophe b/Sources/strophe/libstrophe
index 3c2cf2e..c5d3575 160000
--- a/Sources/strophe/libstrophe
+++ b/Sources/strophe/libstrophe
@@ -1 +1 @@
-Subproject commit 3c2cf2ecbf2239dc306b53ce0dc4c14bca6e72f5
+Subproject commit c5d3575ef0b131b84ce7cf454f413608f24bb8fa