============================== Sample 1 ============================== ASM: ;************************************************************************************************************************************************************ ;* FUNCTION * ;************************************************************************************************************************************************************ ;undefined _vala_docky_clippy_preferences_set_property() PUSH R14 MOV R14,RDX PUSH R13 PUSH R12 MOV R12,RCX PUSH RBP MOV RBP,RDI PUSH RBX MOV EBX,ESI CALL .plt:docky_clippy_preferences_get_type ;undefined docky_clippy_preferences_g... MOV RDI,RBP MOV RSI,RAX CALL .plt:::g_type_check_instance_cast ;undefined g_type_check_instance_cast() MOV R13,RAX CMP EBX,0x1 JZ LAB_00103990 CMP EBX,0x2 JZ LAB_001039b0 MOV RAX,qword ptr [RBP] MOV RDI,qword ptr [RAX] CALL .plt:::g_type_name ;undefined g_type_name() MOV RBP,RAX MOV RAX,qword ptr [R12] MOV RDI,qword ptr [RAX] CALL .plt:::g_type_name ;undefined g_type_name() PUSH RBP LEA R9,[.rodata:s_property_00104438] ;= "property" XOR EDI,EDI PUSH RAX MOV R8D,0x115 XOR EAX,EAX LEA RCX,[.rodata:s_ClippyPreferences.c_00104441] ;= "ClippyPreferences.c" PUSH qword ptr [R12 + 0x8] LEA RDX,[.rodata:s_%s:%d:_invalid_%s_id_%u_for_"%s"_001043a8] ;= "%s:%d: invalid %s id %u for \"%s\... MOV ESI,0x10 PUSH RBX CALL .plt:::g_log ;undefined g_log() ADD RSP,0x20 POP RBX POP RBP POP R12 POP R13 POP R14 RET ?? 0Fh ?? 1Fh ?? 00h LAB_00103990: MOV RDI,R14 CALL .plt:::g_value_get_uint ;undefined g_value_get_uint() POP RBX MOV RDI,R13 POP RBP MOV ESI,EAX POP R12 POP R13 POP R14 JMP .plt:docky_clippy_preferences_set_MaxEntries ;undefined docky_clippy_preferences_s... ?? 66h f ?? 0Fh ?? 1Fh ?? 44h D ?? 00h ?? 00h LAB_001039b0: MOV RDI,R14 CALL .plt:::g_value_get_boolean ;undefined g_value_get_boolean() POP RBX MOV RDI,R13 POP RBP MOV ESI,EAX POP R12 POP R13 POP R14 JMP .plt:LAB_00102160 ?? 66h f Actual src: static void _vala_docky_clippy_preferences_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { DockyClippyPreferences * self; self = G_TYPE_CHECK_INSTANCE_CAST (object, DOCKY_TYPE_CLIPPY_PREFERENCES, DockyClippyPreferences); switch (property_id) { case DOCKY_CLIPPY_PREFERENCES_MAX_ENTRIES_PROPERTY: docky_clippy_preferences_set_MaxEntries (self, g_value_get_uint (value)); break; case DOCKY_CLIPPY_PREFERENCES_TRACK_MOUSE_SELECTIONS_PROPERTY: docky_clippy_preferences_set_TrackMouseSelections (self, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } Predicted src: static void _property_set_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { switch (property_id) { case PROP_PROPERTY: g_value_set_boolean (value, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } ============================== Sample 2 ============================== ASM: ;************************************************************************************************************************************************************ ;* FUNCTION * ;************************************************************************************************************************************************************ ;undefined call_audio_dbus_call_audio_skeleton_finalize() PUSH RBP MOV RBP,RDI PUSH RBX SUB RSP,0x8 CALL call_audio_dbus_call_audio_skeleton_get_type ;undefined call_audio_dbus_call_audio... MOV RDI,RBP MOV RSI,RAX CALL .plt:::g_type_check_instance_cast ;undefined g_type_check_instance_cast() LEA RSI,[_changed_property_free] MOV RBX,RAX MOV RAX,qword ptr [RAX + 0x20] MOV RDI,qword ptr [RAX + 0x8] CALL .plt:::g_list_free_full ;undefined g_list_free_full() MOV RAX,qword ptr [RBX + 0x20] MOV RDI,qword ptr [RAX + 0x10] TEST RDI,RDI JZ LAB_00105016 CALL .plt:::g_source_destroy ;undefined g_source_destroy() MOV RAX,qword ptr [RBX + 0x20] LAB_00105016: MOV RDI,qword ptr [RAX + 0x18] CALL .plt:::g_main_context_unref ;undefined g_main_context_unref() MOV RDI,qword ptr [RBX + 0x20] ADD RDI,0x20 CALL .plt:::g_mutex_clear ;undefined g_mutex_clear() MOV RDI,qword ptr [.bss:call_audio_dbus_call_audio_skeleton_parent_class] ;=?? MOV ESI,0x50 CALL .plt:::g_type_check_class_cast ;undefined g_type_check_class_cast() MOV RDI,RBP MOV RAX,qword ptr [RAX + 0x30] ADD RSP,0x8 POP RBX POP RBP JMP RAX ?? 0Fh Actual src: static void call_audio_dbus_call_audio_skeleton_finalize (GObject *object) { CallAudioDbusCallAudioSkeleton *skeleton = CALL_AUDIO_DBUS_CALL_AUDIO_SKELETON (object); g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free); if (skeleton->priv->changed_properties_idle_source!= NULL) g_source_destroy (skeleton->priv->changed_properties_idle_source); g_main_context_unref (skeleton->priv->context); g_mutex_clear (&skeleton->priv->lock); G_OBJECT_CLASS (call_audio_dbus_call_audio_skeleton_parent_class)->finalize (object); } Predicted src: static void _dbus_skeleton_skeleton_skeleton_skeleton_skeleton_skeleton_skeleton_skeleton_finalize (GObject *skeleton G_GNUC_UNUSED) { if (skeleton->priv->priv->priv->changed_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties (skeleton->priv->properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_propertiesproperties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_propertiesproperties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_propertiesproperties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_propertiesproperties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_propertiesproperties_propertiesproperties_properties_properties_propertiesproperties_properties_properties_properties_properties_propertiespropertiespropertiesproperties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_properties_propertiesproperties_propertiesproperties_properties_properties_properties_propertiesproperties_propertiespropertiespropertiespropertiespropertiesproperties_properties_properties_properties_propertiesproperties_properties_properties_propertiespropertiespropertiesproperties_propertiespropertiespropertiespropertiespropertiesproperties_propertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiesproperties_propertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertiespropertie ============================== Sample 3 ============================== ASM: ;************************************************************************************************************************************************************ ;* Gui::Dragable::isValidDragPosition(QPoint const&) const * ;************************************************************************************************************************************************************ ;undefined isValidDragPosition(QPoint * param_1) ;param_1 QPoint * RDI MOV EAX,0x1 RET ?? 66h f Actual src: bool Dragable::isValidDragPosition(const QPoint& p) const { Q_UNUSED(p) return true; } Predicted src: bool Object::has(const QString &name) const { return true; } ============================== Sample 4 ============================== ASM: ;************************************************************************************************************************************************************ ;* FUNCTION * ;************************************************************************************************************************************************************ ;undefined mX11ClipboardDestroy() TEST RDI,RDI JZ LAB_00143770 PUSH RBP MOV RBP,RDI MOV RDI,qword ptr [RDI + 0x8] CALL mFree ;undefined mFree() MOV qword ptr [RBP + 0x8],0x0 MOV RDI,qword ptr [RBP + 0x18] CALL mFree ;undefined mFree() MOV qword ptr [RBP + 0x18],0x0 MOV RDI,RBP MOV dword ptr [RBP],0x0 POP RBP JMP mFree ;undefined mFree() ?? 0Fh ?? 1Fh ?? 44h D ?? 00h ?? 00h LAB_00143770: RET ?? 66h f Actual src: void mX11ClipboardDestroy(mX11Clipboard *p) { if(p) { mX11ClipboardFreeDat(p); mFree(p); } } Predicted src: void FreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFreeFre ============================== Sample 5 ============================== ASM: ;************************************************************************************************************************************************************ ;* FUNCTION * ;************************************************************************************************************************************************************ ;undefined allocate_row() PUSH RBX MOV RAX,qword ptr [RDI] MOV RBX,RDI LEA RDI,[RAX + 0x10] CALL .plt:shash_count ;undefined shash_count() MOV R8,RAX MOV RAX,qword ptr [RBX] LEA RDX,[R8 + R8*0x2] MOV RAX,qword ptr [RAX + 0x38] SHL RAX,0x4 LEA RDI,[RAX + RDX*0x8 + 0x48] CALL .plt:xmalloc ;undefined xmalloc() LEA RDX,[RAX + 0x20] MOV qword ptr [RAX + 0x10],RBX MOV qword ptr [RAX + 0x20],RDX MOV qword ptr [RAX + 0x28],RDX LEA RDX,[RAX + 0x30] MOV qword ptr [RAX + 0x18],0x0 MOV qword ptr [RAX + 0x30],RDX MOV qword ptr [RAX + 0x38],RDX MOV qword ptr [RAX + 0x40],0x0 POP RBX RET ?? 66h f Actual src: static struct ovsdb_row * allocate_row(const struct ovsdb_table *table) { size_t n_fields = shash_count(&table->schema->columns); size_t n_indexes = table->schema->n_indexes; size_t row_size = (offsetof(struct ovsdb_row, fields) + sizeof(struct ovsdb_datum) * n_fields + sizeof(struct hmap_node) * n_indexes); struct ovsdb_row *row = xmalloc(row_size); row->table = CONST_CAST(struct ovsdb_table *, table); row->txn_row = NULL; ovs_list_init(&row->src_refs); ovs_list_init(&row->dst_refs); row->n_refs = 0; return row; } Predicted src: static void row_row_row(void *data) { structrow_row *row = (structrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowrowro