/* individual-aggregator.c generated by valac 0.13.1.106-1068, the Vala compiler
 * generated from individual-aggregator.vala, do not modify */

/*
 * Copyright (C) 2010 Collabora Ltd.
 *
 * This library is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Authors:
 *       Travis Reitter <travis.reitter@collabora.co.uk>
 */

#include <glib.h>
#include <glib-object.h>
#include <gee.h>
#include <stdlib.h>
#include <string.h>
#include <gconf/gconf-client.h>
#include <gconf/gconf.h>
#include <gio/gio.h>
#include <glib/gi18n-lib.h>


#define FOLKS_TYPE_INDIVIDUAL_AGGREGATOR (folks_individual_aggregator_get_type ())
#define FOLKS_INDIVIDUAL_AGGREGATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_INDIVIDUAL_AGGREGATOR, FolksIndividualAggregator))
#define FOLKS_INDIVIDUAL_AGGREGATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FOLKS_TYPE_INDIVIDUAL_AGGREGATOR, FolksIndividualAggregatorClass))
#define FOLKS_IS_INDIVIDUAL_AGGREGATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_INDIVIDUAL_AGGREGATOR))
#define FOLKS_IS_INDIVIDUAL_AGGREGATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FOLKS_TYPE_INDIVIDUAL_AGGREGATOR))
#define FOLKS_INDIVIDUAL_AGGREGATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FOLKS_TYPE_INDIVIDUAL_AGGREGATOR, FolksIndividualAggregatorClass))

typedef struct _FolksIndividualAggregator FolksIndividualAggregator;
typedef struct _FolksIndividualAggregatorClass FolksIndividualAggregatorClass;
typedef struct _FolksIndividualAggregatorPrivate FolksIndividualAggregatorPrivate;

#define FOLKS_TYPE_BACKEND_STORE (folks_backend_store_get_type ())
#define FOLKS_BACKEND_STORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_BACKEND_STORE, FolksBackendStore))
#define FOLKS_BACKEND_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FOLKS_TYPE_BACKEND_STORE, FolksBackendStoreClass))
#define FOLKS_IS_BACKEND_STORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_BACKEND_STORE))
#define FOLKS_IS_BACKEND_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FOLKS_TYPE_BACKEND_STORE))
#define FOLKS_BACKEND_STORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FOLKS_TYPE_BACKEND_STORE, FolksBackendStoreClass))

typedef struct _FolksBackendStore FolksBackendStore;
typedef struct _FolksBackendStoreClass FolksBackendStoreClass;

#define FOLKS_TYPE_PERSONA_STORE (folks_persona_store_get_type ())
#define FOLKS_PERSONA_STORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_PERSONA_STORE, FolksPersonaStore))
#define FOLKS_PERSONA_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FOLKS_TYPE_PERSONA_STORE, FolksPersonaStoreClass))
#define FOLKS_IS_PERSONA_STORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_PERSONA_STORE))
#define FOLKS_IS_PERSONA_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FOLKS_TYPE_PERSONA_STORE))
#define FOLKS_PERSONA_STORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FOLKS_TYPE_PERSONA_STORE, FolksPersonaStoreClass))

typedef struct _FolksPersonaStore FolksPersonaStore;
typedef struct _FolksPersonaStoreClass FolksPersonaStoreClass;

#define FOLKS_TYPE_BACKEND (folks_backend_get_type ())
#define FOLKS_BACKEND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_BACKEND, FolksBackend))
#define FOLKS_BACKEND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FOLKS_TYPE_BACKEND, FolksBackendClass))
#define FOLKS_IS_BACKEND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_BACKEND))
#define FOLKS_IS_BACKEND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FOLKS_TYPE_BACKEND))
#define FOLKS_BACKEND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FOLKS_TYPE_BACKEND, FolksBackendClass))

typedef struct _FolksBackend FolksBackend;
typedef struct _FolksBackendClass FolksBackendClass;

#define FOLKS_TYPE_INDIVIDUAL (folks_individual_get_type ())
#define FOLKS_INDIVIDUAL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_INDIVIDUAL, FolksIndividual))
#define FOLKS_INDIVIDUAL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FOLKS_TYPE_INDIVIDUAL, FolksIndividualClass))
#define FOLKS_IS_INDIVIDUAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_INDIVIDUAL))
#define FOLKS_IS_INDIVIDUAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FOLKS_TYPE_INDIVIDUAL))
#define FOLKS_INDIVIDUAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FOLKS_TYPE_INDIVIDUAL, FolksIndividualClass))

typedef struct _FolksIndividual FolksIndividual;
typedef struct _FolksIndividualClass FolksIndividualClass;

#define FOLKS_TYPE_DEBUG (folks_debug_get_type ())
#define FOLKS_DEBUG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_DEBUG, FolksDebug))
#define FOLKS_DEBUG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FOLKS_TYPE_DEBUG, FolksDebugClass))
#define FOLKS_IS_DEBUG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_DEBUG))
#define FOLKS_IS_DEBUG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FOLKS_TYPE_DEBUG))
#define FOLKS_DEBUG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FOLKS_TYPE_DEBUG, FolksDebugClass))

typedef struct _FolksDebug FolksDebug;
typedef struct _FolksDebugClass FolksDebugClass;
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
#define _g_hash_table_unref0(var) ((var == NULL) ? NULL : (var = (g_hash_table_unref (var), NULL)))
#define _g_free0(var) (var = (g_free (var), NULL))
#define _gconf_value_free0(var) ((var == NULL) ? NULL : (var = (gconf_value_free (var), NULL)))
#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))

#define FOLKS_TYPE_TRUST_LEVEL (folks_trust_level_get_type ())

#define FOLKS_TYPE_PERSONA (folks_persona_get_type ())
#define FOLKS_PERSONA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_PERSONA, FolksPersona))
#define FOLKS_PERSONA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FOLKS_TYPE_PERSONA, FolksPersonaClass))
#define FOLKS_IS_PERSONA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_PERSONA))
#define FOLKS_IS_PERSONA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FOLKS_TYPE_PERSONA))
#define FOLKS_PERSONA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FOLKS_TYPE_PERSONA, FolksPersonaClass))

typedef struct _FolksPersona FolksPersona;
typedef struct _FolksPersonaClass FolksPersonaClass;
typedef struct _FolksIndividualAggregatorPrepareData FolksIndividualAggregatorPrepareData;

#define FOLKS_TYPE_MATCH_RESULT (folks_match_result_get_type ())

#define FOLKS_TYPE_POTENTIAL_MATCH (folks_potential_match_get_type ())
#define FOLKS_POTENTIAL_MATCH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_POTENTIAL_MATCH, FolksPotentialMatch))
#define FOLKS_POTENTIAL_MATCH_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FOLKS_TYPE_POTENTIAL_MATCH, FolksPotentialMatchClass))
#define FOLKS_IS_POTENTIAL_MATCH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_POTENTIAL_MATCH))
#define FOLKS_IS_POTENTIAL_MATCH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FOLKS_TYPE_POTENTIAL_MATCH))
#define FOLKS_POTENTIAL_MATCH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FOLKS_TYPE_POTENTIAL_MATCH, FolksPotentialMatchClass))

typedef struct _FolksPotentialMatch FolksPotentialMatch;
typedef struct _FolksPotentialMatchClass FolksPotentialMatchClass;
typedef struct _FolksIndividualAggregatorAddBackendData FolksIndividualAggregatorAddBackendData;
typedef struct _Block1Data Block1Data;

#define FOLKS_TYPE_PERSONA_STORE_TRUST (folks_persona_store_trust_get_type ())

#define FOLKS_GROUP_DETAILS_TYPE_CHANGE_REASON (folks_group_details_change_reason_get_type ())
typedef struct _Block2Data Block2Data;
typedef struct _Block3Data Block3Data;
typedef struct _FolksIndividualAggregatorAddPersonaFromDetailsData FolksIndividualAggregatorAddPersonaFromDetailsData;
typedef struct _Block4Data Block4Data;
typedef struct _FolksIndividualAggregatorRemoveIndividualData FolksIndividualAggregatorRemoveIndividualData;
typedef struct _FolksIndividualAggregatorRemovePersonaData FolksIndividualAggregatorRemovePersonaData;

#define FOLKS_TYPE_ABSTRACT_FIELD_DETAILS (folks_abstract_field_details_get_type ())
#define FOLKS_ABSTRACT_FIELD_DETAILS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_ABSTRACT_FIELD_DETAILS, FolksAbstractFieldDetails))
#define FOLKS_ABSTRACT_FIELD_DETAILS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FOLKS_TYPE_ABSTRACT_FIELD_DETAILS, FolksAbstractFieldDetailsClass))
#define FOLKS_IS_ABSTRACT_FIELD_DETAILS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_ABSTRACT_FIELD_DETAILS))
#define FOLKS_IS_ABSTRACT_FIELD_DETAILS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FOLKS_TYPE_ABSTRACT_FIELD_DETAILS))
#define FOLKS_ABSTRACT_FIELD_DETAILS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FOLKS_TYPE_ABSTRACT_FIELD_DETAILS, FolksAbstractFieldDetailsClass))

typedef struct _FolksAbstractFieldDetails FolksAbstractFieldDetails;
typedef struct _FolksAbstractFieldDetailsClass FolksAbstractFieldDetailsClass;

#define FOLKS_TYPE_IM_FIELD_DETAILS (folks_im_field_details_get_type ())
#define FOLKS_IM_FIELD_DETAILS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_IM_FIELD_DETAILS, FolksImFieldDetails))
#define FOLKS_IM_FIELD_DETAILS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FOLKS_TYPE_IM_FIELD_DETAILS, FolksImFieldDetailsClass))
#define FOLKS_IS_IM_FIELD_DETAILS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_IM_FIELD_DETAILS))
#define FOLKS_IS_IM_FIELD_DETAILS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FOLKS_TYPE_IM_FIELD_DETAILS))
#define FOLKS_IM_FIELD_DETAILS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FOLKS_TYPE_IM_FIELD_DETAILS, FolksImFieldDetailsClass))

typedef struct _FolksImFieldDetails FolksImFieldDetails;
typedef struct _FolksImFieldDetailsClass FolksImFieldDetailsClass;

#define FOLKS_TYPE_WEB_SERVICE_FIELD_DETAILS (folks_web_service_field_details_get_type ())
#define FOLKS_WEB_SERVICE_FIELD_DETAILS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_WEB_SERVICE_FIELD_DETAILS, FolksWebServiceFieldDetails))
#define FOLKS_WEB_SERVICE_FIELD_DETAILS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FOLKS_TYPE_WEB_SERVICE_FIELD_DETAILS, FolksWebServiceFieldDetailsClass))
#define FOLKS_IS_WEB_SERVICE_FIELD_DETAILS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_WEB_SERVICE_FIELD_DETAILS))
#define FOLKS_IS_WEB_SERVICE_FIELD_DETAILS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FOLKS_TYPE_WEB_SERVICE_FIELD_DETAILS))
#define FOLKS_WEB_SERVICE_FIELD_DETAILS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FOLKS_TYPE_WEB_SERVICE_FIELD_DETAILS, FolksWebServiceFieldDetailsClass))

typedef struct _FolksWebServiceFieldDetails FolksWebServiceFieldDetails;
typedef struct _FolksWebServiceFieldDetailsClass FolksWebServiceFieldDetailsClass;

#define FOLKS_TYPE_IM_DETAILS (folks_im_details_get_type ())
#define FOLKS_IM_DETAILS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_IM_DETAILS, FolksImDetails))
#define FOLKS_IS_IM_DETAILS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_IM_DETAILS))
#define FOLKS_IM_DETAILS_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), FOLKS_TYPE_IM_DETAILS, FolksImDetailsIface))

typedef struct _FolksImDetails FolksImDetails;
typedef struct _FolksImDetailsIface FolksImDetailsIface;

#define FOLKS_TYPE_WEB_SERVICE_DETAILS (folks_web_service_details_get_type ())
#define FOLKS_WEB_SERVICE_DETAILS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_WEB_SERVICE_DETAILS, FolksWebServiceDetails))
#define FOLKS_IS_WEB_SERVICE_DETAILS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_WEB_SERVICE_DETAILS))
#define FOLKS_WEB_SERVICE_DETAILS_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), FOLKS_TYPE_WEB_SERVICE_DETAILS, FolksWebServiceDetailsIface))

typedef struct _FolksWebServiceDetails FolksWebServiceDetails;
typedef struct _FolksWebServiceDetailsIface FolksWebServiceDetailsIface;

#define FOLKS_TYPE_LOCAL_ID_DETAILS (folks_local_id_details_get_type ())
#define FOLKS_LOCAL_ID_DETAILS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOLKS_TYPE_LOCAL_ID_DETAILS, FolksLocalIdDetails))
#define FOLKS_IS_LOCAL_ID_DETAILS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOLKS_TYPE_LOCAL_ID_DETAILS))
#define FOLKS_LOCAL_ID_DETAILS_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), FOLKS_TYPE_LOCAL_ID_DETAILS, FolksLocalIdDetailsIface))

typedef struct _FolksLocalIdDetails FolksLocalIdDetails;
typedef struct _FolksLocalIdDetailsIface FolksLocalIdDetailsIface;

#define FOLKS_TYPE_PERSONA_DETAIL (folks_persona_detail_get_type ())
typedef struct _FolksIndividualAggregatorLinkPersonasData FolksIndividualAggregatorLinkPersonasData;
typedef struct _FolksIndividualAggregatorUnlinkIndividualData FolksIndividualAggregatorUnlinkIndividualData;

/**
 * Errors from {@link IndividualAggregator}s.
 */
typedef enum  {
	FOLKS_INDIVIDUAL_AGGREGATOR_ERROR_ADD_FAILED,
	FOLKS_INDIVIDUAL_AGGREGATOR_ERROR_NO_WRITEABLE_STORE,
	FOLKS_INDIVIDUAL_AGGREGATOR_ERROR_STORE_OFFLINE
} FolksIndividualAggregatorError;
#define FOLKS_INDIVIDUAL_AGGREGATOR_ERROR folks_individual_aggregator_error_quark ()
struct _FolksIndividualAggregator {
	GObject parent_instance;
	FolksIndividualAggregatorPrivate * priv;
};

struct _FolksIndividualAggregatorClass {
	GObjectClass parent_class;
};

struct _FolksIndividualAggregatorPrivate {
	FolksBackendStore* _backend_store;
	GeeHashMap* _stores;
	FolksPersonaStore* _writeable_store;
	GeeHashSet* _backends;
	GHashTable* _link_map;
	gboolean _linking_enabled;
	gboolean _is_prepared;
	GStaticRecMutex __lock__is_prepared;
	gboolean _prepare_pending;
	FolksDebug* _debug;
	gchar* _configured_writeable_store_type_id;
	gchar* _configured_writeable_store_id;
	GeeMap* _individuals;
	GeeMap* _individuals_ro;
	FolksIndividual* _user;
};

typedef enum  {
	FOLKS_TRUST_LEVEL_NONE,
	FOLKS_TRUST_LEVEL_PERSONAS
} FolksTrustLevel;

struct _FolksIndividualAggregatorPrepareData {
	int _state_;
	GObject* _source_object_;
	GAsyncResult* _res_;
	GSimpleAsyncResult* _async_result;
	FolksIndividualAggregator* self;
	gboolean _tmp0_;
	gboolean _tmp1_;
	gboolean _tmp2_;
	gboolean _tmp3_;
	gboolean _tmp4_;
	FolksBackendStore* _tmp5_;
	gboolean _tmp6_;
	GError * _inner_error_;
};

typedef enum  {
	FOLKS_MATCH_RESULT_VERY_LOW,
	FOLKS_MATCH_RESULT_LOW,
	FOLKS_MATCH_RESULT_MEDIUM,
	FOLKS_MATCH_RESULT_HIGH,
	FOLKS_MATCH_RESULT_VERY_HIGH,
	FOLKS_MATCH_RESULT_MIN = FOLKS_MATCH_RESULT_VERY_LOW,
	FOLKS_MATCH_RESULT_MAX = FOLKS_MATCH_RESULT_VERY_HIGH
} FolksMatchResult;

struct _FolksIndividualAggregatorAddBackendData {
	int _state_;
	GObject* _source_object_;
	GAsyncResult* _res_;
	GSimpleAsyncResult* _async_result;
	FolksIndividualAggregator* self;
	FolksBackend* backend;
	GeeHashSet* _tmp0_;
	FolksBackend* _tmp1_;
	gboolean _tmp2_;
	GeeHashSet* _tmp3_;
	FolksBackend* _tmp4_;
	FolksBackend* _tmp5_;
	FolksBackend* _tmp6_;
	FolksBackend* _tmp7_;
	GeeMap* _tmp8_;
	GeeMap* _tmp9_;
	GeeCollection* _tmp10_;
	GeeCollection* _tmp11_;
	GeeCollection* _tmp12_;
	GeeIterator* _tmp13_;
	GeeIterator* _tmp14_;
	GeeIterator* _persona_store_it;
	GeeIterator* _tmp15_;
	gboolean _tmp16_;
	GeeIterator* _tmp17_;
	gpointer _tmp18_;
	FolksPersonaStore* persona_store;
	FolksBackend* _tmp19_;
	FolksPersonaStore* _tmp20_;
};

struct _Block1Data {
	int _ref_count_;
	FolksIndividualAggregator * self;
	gchar* store_id;
	FolksPersonaStore* store;
};

typedef enum  {
	FOLKS_PERSONA_STORE_TRUST_NONE,
	FOLKS_PERSONA_STORE_TRUST_PARTIAL,
	FOLKS_PERSONA_STORE_TRUST_FULL
} FolksPersonaStoreTrust;

typedef enum  {
	FOLKS_GROUP_DETAILS_CHANGE_REASON_NONE = 0,
	FOLKS_GROUP_DETAILS_CHANGE_REASON_OFFLINE = 1,
	FOLKS_GROUP_DETAILS_CHANGE_REASON_KICKED = 2,
	FOLKS_GROUP_DETAILS_CHANGE_REASON_BUSY = 3,
	FOLKS_GROUP_DETAILS_CHANGE_REASON_INVITED = 4,
	FOLKS_GROUP_DETAILS_CHANGE_REASON_BANNED = 5,
	FOLKS_GROUP_DETAILS_CHANGE_REASON_ERROR = 6,
	FOLKS_GROUP_DETAILS_CHANGE_REASON_INVALID_MEMBER = 7,
	FOLKS_GROUP_DETAILS_CHANGE_REASON_NO_ANSWER = 8,
	FOLKS_GROUP_DETAILS_CHANGE_REASON_RENAMED = 9,
	FOLKS_GROUP_DETAILS_CHANGE_REASON_PERMISSION_DENIED = 10,
	FOLKS_GROUP_DETAILS_CHANGE_REASON_SEPARATED = 11
} FolksGroupDetailsChangeReason;

struct _Block2Data {
	int _ref_count_;
	FolksIndividualAggregator * self;
	GeeHashSet* candidate_inds;
	FolksIndividual* final_individual;
};

struct _Block3Data {
	int _ref_count_;
	Block2Data * _data2_;
	const gchar* prop_name;
};

typedef void (*FolksPersonaLinkablePropertyCallback) (const gchar* link, void* user_data);
typedef enum  {
	FOLKS_PERSONA_STORE_ERROR_INVALID_ARGUMENT,
	FOLKS_PERSONA_STORE_ERROR_CREATE_FAILED,
	FOLKS_PERSONA_STORE_ERROR_UNSUPPORTED_ON_USER,
	FOLKS_PERSONA_STORE_ERROR_STORE_OFFLINE,
	FOLKS_PERSONA_STORE_ERROR_READ_ONLY,
	FOLKS_PERSONA_STORE_ERROR_PERMISSION_DENIED,
	FOLKS_PERSONA_STORE_ERROR_REMOVE_FAILED
} FolksPersonaStoreError;
#define FOLKS_PERSONA_STORE_ERROR folks_persona_store_error_quark ()
struct _FolksIndividualAggregatorAddPersonaFromDetailsData {
	int _state_;
	GObject* _source_object_;
	GAsyncResult* _res_;
	GSimpleAsyncResult* _async_result;
	FolksIndividualAggregator* self;
	FolksIndividual* parent;
	FolksPersonaStore* persona_store;
	GHashTable* details;
	FolksPersona* result;
	FolksPersona* persona;
	GHashTable* _tmp0_;
	GHashTable* _tmp1_;
	GHashTable* details_copy;
	FolksPersonaStore* _tmp2_;
	GHashTable* _tmp3_;
	FolksPersona* _tmp4_;
	FolksPersona* _tmp5_;
	FolksPersona* _tmp6_;
	GError* e;
	GError* _tmp7_;
	GError* _tmp8_;
	const gchar* _tmp9_;
	GError* _tmp10_;
	FolksPersonaStore* _tmp11_;
	const gchar* _tmp12_;
	const gchar* _tmp13_;
	FolksPersonaStore* _tmp14_;
	const gchar* _tmp15_;
	const gchar* _tmp16_;
	gchar* _tmp17_;
	gchar* full_id;
	const gchar* _tmp18_;
	const gchar* _tmp19_;
	GError* _tmp20_;
	const gchar* _tmp21_;
	GError* _tmp22_;
	gboolean _tmp23_;
	FolksIndividual* _tmp24_;
	FolksPersona* _tmp25_;
	gboolean _tmp26_;
	FolksIndividual* _tmp27_;
	GeeSet* _tmp28_;
	GeeSet* _tmp29_;
	FolksPersona* _tmp30_;
	GError * _inner_error_;
};

struct _Block4Data {
	int _ref_count_;
	FolksIndividualAggregator * self;
	GHashTable* retval;
};

struct _FolksIndividualAggregatorRemoveIndividualData {
	int _state_;
	GObject* _source_object_;
	GAsyncResult* _res_;
	GSimpleAsyncResult* _async_result;
	FolksIndividualAggregator* self;
	FolksIndividual* individual;
	GeeHashSet* _tmp0_;
	GeeHashSet* personas;
	FolksIndividual* _tmp1_;
	GeeSet* _tmp2_;
	GeeSet* _tmp3_;
	GeeIterator* _tmp4_;
	GeeIterator* _p_it;
	GeeIterator* _tmp5_;
	gboolean _tmp6_;
	GeeIterator* _tmp7_;
	gpointer _tmp8_;
	FolksPersona* p;
	GeeHashSet* _tmp9_;
	FolksPersona* _tmp10_;
	GeeHashSet* _tmp11_;
	GeeIterator* _tmp12_;
	GeeIterator* _persona_it;
	GeeIterator* _tmp13_;
	gboolean _tmp14_;
	GeeIterator* _tmp15_;
	gpointer _tmp16_;
	FolksPersona* persona;
	FolksPersona* _tmp17_;
	FolksPersonaStore* _tmp18_;
	FolksPersonaStore* _tmp19_;
	FolksPersona* _tmp20_;
	GError * _inner_error_;
};

struct _FolksIndividualAggregatorRemovePersonaData {
	int _state_;
	GObject* _source_object_;
	GAsyncResult* _res_;
	GSimpleAsyncResult* _async_result;
	FolksIndividualAggregator* self;
	FolksPersona* persona;
	FolksPersona* _tmp0_;
	FolksPersonaStore* _tmp1_;
	FolksPersonaStore* _tmp2_;
	FolksPersona* _tmp3_;
	GError * _inner_error_;
};

struct _FolksImDetailsIface {
	GTypeInterface parent_iface;
	GeeMultiMap* (*get_im_addresses) (FolksImDetails* self);
	void (*set_im_addresses) (FolksImDetails* self, GeeMultiMap* value);
};

struct _FolksWebServiceDetailsIface {
	GTypeInterface parent_iface;
	GeeMultiMap* (*get_web_service_addresses) (FolksWebServiceDetails* self);
	void (*set_web_service_addresses) (FolksWebServiceDetails* self, GeeMultiMap* value);
};

struct _FolksLocalIdDetailsIface {
	GTypeInterface parent_iface;
	GeeSet* (*get_local_ids) (FolksLocalIdDetails* self);
	void (*set_local_ids) (FolksLocalIdDetails* self, GeeSet* value);
};

typedef enum  {
	FOLKS_PERSONA_DETAIL_ALIAS,
	FOLKS_PERSONA_DETAIL_AVATAR,
	FOLKS_PERSONA_DETAIL_BIRTHDAY,
	FOLKS_PERSONA_DETAIL_EMAIL_ADDRESSES,
	FOLKS_PERSONA_DETAIL_FULL_NAME,
	FOLKS_PERSONA_DETAIL_GENDER,
	FOLKS_PERSONA_DETAIL_IM_ADDRESSES,
	FOLKS_PERSONA_DETAIL_IS_FAVOURITE,
	FOLKS_PERSONA_DETAIL_LOCAL_IDS,
	FOLKS_PERSONA_DETAIL_NICKNAME,
	FOLKS_PERSONA_DETAIL_NOTES,
	FOLKS_PERSONA_DETAIL_PHONE_NUMBERS,
	FOLKS_PERSONA_DETAIL_POSTAL_ADDRESSES,
	FOLKS_PERSONA_DETAIL_ROLES,
	FOLKS_PERSONA_DETAIL_STRUCTURED_NAME,
	FOLKS_PERSONA_DETAIL_URLS,
	FOLKS_PERSONA_DETAIL_WEB_SERVICE_ADDRESSES
} FolksPersonaDetail;

struct _FolksIndividualAggregatorLinkPersonasData {
	int _state_;
	GObject* _source_object_;
	GAsyncResult* _res_;
	GSimpleAsyncResult* _async_result;
	FolksIndividualAggregator* self;
	GeeSet* personas;
	FolksPersonaStore* _tmp0_;
	const gchar* _tmp1_;
	GError* _tmp2_;
	GeeSet* _tmp3_;
	gint _tmp4_;
	gint _tmp5_;
	gboolean _tmp6_;
	FolksPersonaStore* _tmp7_;
	const gchar* _tmp8_;
	const gchar* _tmp9_;
	const gchar* _tmp10_;
	GeeHashMultiMap* _tmp11_;
	GeeHashMultiMap* protocols_addrs_set;
	GeeHashMultiMap* _tmp12_;
	GeeHashMultiMap* web_service_addrs_set;
	GeeHashSet* _tmp13_;
	GeeHashSet* local_ids;
	GeeSet* _tmp14_;
	GeeIterator* _tmp15_;
	GeeIterator* _persona_it;
	GeeIterator* _tmp16_;
	gboolean _tmp17_;
	GeeIterator* _tmp18_;
	gpointer _tmp19_;
	FolksPersona* persona;
	FolksPersona* _tmp20_;
	FolksPersona* _tmp21_;
	FolksImDetails* _tmp22_;
	FolksImDetails* im_details;
	FolksImDetails* _tmp23_;
	GeeMultiMap* _tmp24_;
	GeeMultiMap* _tmp25_;
	GeeSet* _tmp26_;
	GeeSet* _tmp27_;
	GeeIterator* _tmp28_;
	GeeIterator* _tmp29_;
	GeeIterator* _protocol_it;
	GeeIterator* _tmp30_;
	gboolean _tmp31_;
	GeeIterator* _tmp32_;
	gpointer _tmp33_;
	gchar* protocol;
	FolksImDetails* _tmp34_;
	GeeMultiMap* _tmp35_;
	GeeMultiMap* _tmp36_;
	const gchar* _tmp37_;
	GeeCollection* _tmp38_;
	GeeCollection* im_addresses;
	GeeCollection* _tmp39_;
	GeeIterator* _tmp40_;
	GeeIterator* _im_address_it;
	GeeIterator* _tmp41_;
	gboolean _tmp42_;
	GeeIterator* _tmp43_;
	gpointer _tmp44_;
	FolksImFieldDetails* im_address;
	GeeHashMultiMap* _tmp45_;
	const gchar* _tmp46_;
	FolksImFieldDetails* _tmp47_;
	FolksPersona* _tmp48_;
	FolksPersona* _tmp49_;
	FolksWebServiceDetails* _tmp50_;
	FolksWebServiceDetails* ws_details;
	FolksWebServiceDetails* _tmp51_;
	GeeMultiMap* _tmp52_;
	GeeMultiMap* _tmp53_;
	GeeSet* _tmp54_;
	GeeSet* _tmp55_;
	GeeIterator* _tmp56_;
	GeeIterator* _tmp57_;
	GeeIterator* _web_service_it;
	GeeIterator* _tmp58_;
	gboolean _tmp59_;
	GeeIterator* _tmp60_;
	gpointer _tmp61_;
	gchar* web_service;
	FolksWebServiceDetails* _tmp62_;
	GeeMultiMap* _tmp63_;
	GeeMultiMap* _tmp64_;
	const gchar* _tmp65_;
	GeeCollection* _tmp66_;
	GeeCollection* ws_addresses;
	GeeCollection* _tmp67_;
	GeeIterator* _tmp68_;
	GeeIterator* _ws_fd_it;
	GeeIterator* _tmp69_;
	gboolean _tmp70_;
	GeeIterator* _tmp71_;
	gpointer _tmp72_;
	FolksWebServiceFieldDetails* ws_fd;
	GeeHashMultiMap* _tmp73_;
	const gchar* _tmp74_;
	FolksWebServiceFieldDetails* _tmp75_;
	FolksPersona* _tmp76_;
	FolksPersona* _tmp77_;
	GeeSet* _tmp78_;
	GeeSet* _tmp79_;
	GeeIterator* _tmp80_;
	GeeIterator* _id_it;
	GeeIterator* _tmp81_;
	gboolean _tmp82_;
	GeeIterator* _tmp83_;
	gpointer _tmp84_;
	gchar* id;
	GeeHashSet* _tmp85_;
	const gchar* _tmp86_;
	GHashFunc _tmp87_;
	GEqualFunc _tmp88_;
	GHashTable* _tmp89_;
	GHashTable* details;
	GeeHashMultiMap* _tmp90_;
	gint _tmp91_;
	gint _tmp92_;
	GValue _tmp93_;
	GValue _tmp94_;
	GValue im_addresses_value;
	GeeHashMultiMap* _tmp95_;
	GHashTable* _tmp96_;
	const gchar* _tmp97_;
	gchar* _tmp98_;
	GValue _tmp99_;
	GValue _tmp100_;
	GValue* _tmp101_;
	GeeHashMultiMap* _tmp102_;
	gint _tmp103_;
	gint _tmp104_;
	GValue _tmp105_;
	GValue _tmp106_;
	GValue web_service_addresses_value;
	GeeHashMultiMap* _tmp107_;
	GHashTable* _tmp108_;
	const gchar* _tmp109_;
	gchar* _tmp110_;
	GValue _tmp111_;
	GValue _tmp112_;
	GValue* _tmp113_;
	GeeHashSet* _tmp114_;
	gint _tmp115_;
	gint _tmp116_;
	GValue _tmp117_;
	GValue _tmp118_;
	GValue local_ids_value;
	GeeHashSet* _tmp119_;
	GHashTable* _tmp120_;
	const gchar* _tmp121_;
	gchar* _tmp122_;
	GValue _tmp123_;
	GValue _tmp124_;
	GValue* _tmp125_;
	FolksPersonaStore* _tmp126_;
	GHashTable* _tmp127_;
	FolksPersona* _tmp128_;
	FolksPersona* _tmp129_;
	GError * _inner_error_;
};

struct _FolksIndividualAggregatorUnlinkIndividualData {
	int _state_;
	GObject* _source_object_;
	GAsyncResult* _res_;
	GSimpleAsyncResult* _async_result;
	FolksIndividualAggregator* self;
	FolksIndividual* individual;
	gboolean _tmp0_;
	FolksIndividual* _tmp1_;
	const gchar* _tmp2_;
	const gchar* _tmp3_;
	FolksIndividual* _tmp4_;
	const gchar* _tmp5_;
	const gchar* _tmp6_;
	GeeHashSet* _tmp7_;
	GeeHashSet* personas;
	FolksIndividual* _tmp8_;
	GeeSet* _tmp9_;
	GeeSet* _tmp10_;
	GeeIterator* _tmp11_;
	GeeIterator* _p_it;
	GeeIterator* _tmp12_;
	gboolean _tmp13_;
	GeeIterator* _tmp14_;
	gpointer _tmp15_;
	FolksPersona* p;
	GeeHashSet* _tmp16_;
	FolksPersona* _tmp17_;
	GeeHashSet* _tmp18_;
	GeeIterator* _tmp19_;
	GeeIterator* _persona_it;
	GeeIterator* _tmp20_;
	gboolean _tmp21_;
	GeeIterator* _tmp22_;
	gpointer _tmp23_;
	FolksPersona* persona;
	FolksPersona* _tmp24_;
	FolksPersonaStore* _tmp25_;
	FolksPersonaStore* _tmp26_;
	FolksPersonaStore* _tmp27_;
	const gchar* _tmp28_;
	FolksPersona* _tmp29_;
	gboolean _tmp30_;
	gboolean _tmp31_;
	FolksPersona* _tmp32_;
	const gchar* _tmp33_;
	const gchar* _tmp34_;
	const gchar* _tmp35_;
	FolksPersona* _tmp36_;
	const gchar* _tmp37_;
	const gchar* _tmp38_;
	FolksPersonaStore* _tmp39_;
	FolksPersona* _tmp40_;
	GError * _inner_error_;
};


static gpointer folks_individual_aggregator_parent_class = NULL;

GQuark folks_individual_aggregator_error_quark (void);
GType folks_individual_aggregator_get_type (void) G_GNUC_CONST;
GType folks_backend_store_get_type (void) G_GNUC_CONST;
GType folks_persona_store_get_type (void) G_GNUC_CONST;
GType folks_backend_get_type (void) G_GNUC_CONST;
GType folks_individual_get_type (void) G_GNUC_CONST;
GType folks_debug_get_type (void) G_GNUC_CONST;
#define FOLKS_INDIVIDUAL_AGGREGATOR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), FOLKS_TYPE_INDIVIDUAL_AGGREGATOR, FolksIndividualAggregatorPrivate))
enum  {
	FOLKS_INDIVIDUAL_AGGREGATOR_DUMMY_PROPERTY,
	FOLKS_INDIVIDUAL_AGGREGATOR_IS_PREPARED,
	FOLKS_INDIVIDUAL_AGGREGATOR_PRIMARY_STORE,
	FOLKS_INDIVIDUAL_AGGREGATOR_INDIVIDUALS,
	FOLKS_INDIVIDUAL_AGGREGATOR_USER
};
static void _folks_individual_aggregator_backend_available_cb (FolksIndividualAggregator* self, FolksBackendStore* backend_store, FolksBackend* backend);
static void __folks_individual_aggregator_backend_available_cb_folks_backend_store_backend_available (FolksBackendStore* _sender, FolksBackend* backend, gpointer self);
static void _folks_individual_aggregator_debug_print_status (FolksIndividualAggregator* self, FolksDebug* debug);
static void __folks_individual_aggregator_debug_print_status_folks_debug_print_status (FolksDebug* _sender, gpointer self);
#define FOLKS_INDIVIDUAL_AGGREGATOR__FOLKS_CONFIG_KEY "/system/folks/backends/primary_store"
FolksIndividualAggregator* folks_individual_aggregator_new (void);
FolksIndividualAggregator* folks_individual_aggregator_construct (GType object_type);
static void _g_free0_ (gpointer var);
static void _g_object_unref0_ (gpointer var);
FolksDebug* folks_debug_dup (void);
static void _folks_individual_aggregator_set_writeable_store (FolksIndividualAggregator* self, const gchar* store_config_ids);
FolksBackendStore* folks_backend_store_dup (void);
#define FOLKS_DEBUG_STATUS_LOG_DOMAIN "folks-status"
void folks_debug_print_heading (FolksDebug* self, const gchar* domain, GLogLevelFlags level, const gchar* format, ...);
void folks_debug_print_key_value_pairs (FolksDebug* self, const gchar* domain, GLogLevelFlags level, ...);
void folks_debug_print_line (FolksDebug* self, const gchar* domain, GLogLevelFlags level, const gchar* format, ...);
GeeMap* folks_individual_aggregator_get_individuals (FolksIndividualAggregator* self);
void folks_debug_indent (FolksDebug* self);
GType folks_trust_level_get_type (void) G_GNUC_CONST;
FolksTrustLevel folks_individual_get_trust_level (FolksIndividual* self);
gboolean folks_individual_get_is_user (FolksIndividual* self);
const gchar* folks_individual_get_id (FolksIndividual* self);
GType folks_persona_get_type (void) G_GNUC_CONST;
GeeSet* folks_individual_get_personas (FolksIndividual* self);
gboolean folks_persona_get_is_user (FolksPersona* self);
const gchar* folks_persona_get_uid (FolksPersona* self);
const gchar* folks_persona_get_iid (FolksPersona* self);
const gchar* folks_persona_get_display_id (FolksPersona* self);
void folks_debug_unindent (FolksDebug* self);
static void folks_individual_aggregator_prepare_data_free (gpointer _data);
void folks_individual_aggregator_prepare (FolksIndividualAggregator* self, GAsyncReadyCallback _callback_, gpointer _user_data_);
void folks_individual_aggregator_prepare_finish (FolksIndividualAggregator* self, GAsyncResult* _res_, GError** error);
static gboolean folks_individual_aggregator_prepare_co (FolksIndividualAggregatorPrepareData* _data_);
void folks_backend_store_load_backends (FolksBackendStore* self, GAsyncReadyCallback _callback_, gpointer _user_data_);
void folks_backend_store_load_backends_finish (FolksBackendStore* self, GAsyncResult* _res_, GError** error);
static void folks_individual_aggregator_prepare_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_);
GType folks_match_result_get_type (void) G_GNUC_CONST;
GeeMap* folks_individual_aggregator_get_potential_matches (FolksIndividualAggregator* self, FolksIndividual* matchee, FolksMatchResult min_threshold);
FolksPotentialMatch* folks_potential_match_new (void);
FolksPotentialMatch* folks_potential_match_construct (GType object_type);
GType folks_potential_match_get_type (void) G_GNUC_CONST;
FolksMatchResult folks_potential_match_potential_match (FolksPotentialMatch* self, FolksIndividual* a, FolksIndividual* b);
GeeMap* folks_individual_aggregator_get_all_potential_matches (FolksIndividualAggregator* self, FolksMatchResult min_threshold);
static void _folks_individual_aggregator_add_backend_data_free (gpointer _data);
static void _folks_individual_aggregator_add_backend (FolksIndividualAggregator* self, FolksBackend* backend, GAsyncReadyCallback _callback_, gpointer _user_data_);
static void _folks_individual_aggregator_add_backend_finish (FolksIndividualAggregator* self, GAsyncResult* _res_);
static gboolean _folks_individual_aggregator_add_backend_co (FolksIndividualAggregatorAddBackendData* _data_);
static void _folks_individual_aggregator_backend_persona_store_added_cb (FolksIndividualAggregator* self, FolksBackend* backend, FolksPersonaStore* store);
static void __folks_individual_aggregator_backend_persona_store_added_cb_folks_backend_persona_store_added (FolksBackend* _sender, FolksPersonaStore* store, gpointer self);
static void _folks_individual_aggregator_backend_persona_store_removed_cb (FolksIndividualAggregator* self, FolksBackend* backend, FolksPersonaStore* store);
static void __folks_individual_aggregator_backend_persona_store_removed_cb_folks_backend_persona_store_removed (FolksBackend* _sender, FolksPersonaStore* store, gpointer self);
GeeMap* folks_backend_get_persona_stores (FolksBackend* self);
static Block1Data* block1_data_ref (Block1Data* _data1_);
static void block1_data_unref (Block1Data* _data1_);
static gchar* _folks_individual_aggregator_get_store_full_id (FolksIndividualAggregator* self, const gchar* type_id, const gchar* id);
const gchar* folks_persona_store_get_type_id (FolksPersonaStore* self);
const gchar* folks_persona_store_get_id (FolksPersonaStore* self);
void folks_persona_store_set_is_writeable (FolksPersonaStore* self, gboolean value);
GType folks_persona_store_trust_get_type (void) G_GNUC_CONST;
void folks_persona_store_set_trust_level (FolksPersonaStore* self, FolksPersonaStoreTrust value);
GType folks_group_details_change_reason_get_type (void) G_GNUC_CONST;
static void _folks_individual_aggregator_personas_changed_cb (FolksIndividualAggregator* self, FolksPersonaStore* store, GeeSet* added, GeeSet* removed, const gchar* message, FolksPersona* actor, FolksGroupDetailsChangeReason reason);
static void __folks_individual_aggregator_personas_changed_cb_folks_persona_store_personas_changed (FolksPersonaStore* _sender, GeeSet* added, GeeSet* removed, const gchar* message, FolksPersona* actor, FolksGroupDetailsChangeReason reason, gpointer self);
static void _folks_individual_aggregator_is_writeable_changed_cb (FolksIndividualAggregator* self, GObject* object, GParamSpec* pspec);
static void __folks_individual_aggregator_is_writeable_changed_cb_g_object_notify (GObject* _sender, GParamSpec* pspec, gpointer self);
static void _folks_individual_aggregator_trust_level_changed_cb (FolksIndividualAggregator* self, GObject* object, GParamSpec* pspec);
static void __folks_individual_aggregator_trust_level_changed_cb_g_object_notify (GObject* _sender, GParamSpec* pspec, gpointer self);
void folks_persona_store_prepare (FolksPersonaStore* self, GAsyncReadyCallback _callback_, gpointer _user_data_);
void folks_persona_store_prepare_finish (FolksPersonaStore* self, GAsyncResult* _res_, GError** error);
static void _lambda5_ (GObject* obj, GAsyncResult* _result_, Block1Data* _data1_);
static void __lambda5__gasync_ready_callback (GObject* source_object, GAsyncResult* res, gpointer self);
static void _folks_individual_aggregator_emit_individuals_changed (FolksIndividualAggregator* self, GeeSet* added, GeeSet* removed, const gchar* message, FolksPersona* actor, FolksGroupDetailsChangeReason reason);
static void _folks_individual_aggregator_connect_to_individual (FolksIndividualAggregator* self, FolksIndividual* individual);
static void _folks_individual_aggregator_individual_removed_cb (FolksIndividualAggregator* self, FolksIndividual* i, FolksIndividual* replacement);
static void __folks_individual_aggregator_individual_removed_cb_folks_individual_removed (FolksIndividual* _sender, FolksIndividual* replacement_individual, gpointer self);
static void _folks_individual_aggregator_disconnect_from_individual (FolksIndividualAggregator* self, FolksIndividual* individual);
static void _folks_individual_aggregator_add_personas (FolksIndividualAggregator* self, GeeSet* added, GeeHashSet** added_individuals, GeeHashMap** replaced_individuals, FolksIndividual** user);
static Block2Data* block2_data_ref (Block2Data* _data2_);
static void block2_data_unref (Block2Data* _data2_);
FolksPersonaStore* folks_persona_get_store (FolksPersona* self);
FolksPersonaStoreTrust folks_persona_store_get_trust_level (FolksPersonaStore* self);
gchar** folks_persona_get_linkable_properties (FolksPersona* self, int* result_length1);
static Block3Data* block3_data_ref (Block3Data* _data3_);
static void block3_data_unref (Block3Data* _data3_);
void folks_persona_linkable_property_to_links (FolksPersona* self, const gchar* prop_name, FolksPersonaLinkablePropertyCallback callback, void* callback_target);
static void _lambda3_ (const gchar* l, Block3Data* _data3_);
static void __lambda3__folks_persona_linkable_property_callback (const gchar* link, gpointer self);
FolksIndividual* folks_individual_new (GeeSet* personas);
FolksIndividual* folks_individual_construct (GType object_type, GeeSet* personas);
static void _lambda4_ (const gchar* l, Block2Data* _data2_);
static void __lambda4__folks_persona_linkable_property_callback (const gchar* link, gpointer self);
static void _folks_individual_aggregator_remove_persona_from_link_map (FolksIndividualAggregator* self, FolksPersona* persona);
static void _lambda2_ (const gchar* linking_value, FolksIndividualAggregator* self);
static void __lambda2__folks_persona_linkable_property_callback (const gchar* link, gpointer self);
FolksIndividual* folks_individual_aggregator_get_user (FolksIndividualAggregator* self);
void folks_individual_set_personas (FolksIndividual* self, GeeSet* value);
static void folks_individual_aggregator_set_user (FolksIndividualAggregator* self, FolksIndividual* value);
void folks_individual_replace (FolksIndividual* self, FolksIndividual* replacement_individual);
gboolean folks_persona_store_get_is_writeable (FolksPersonaStore* self);
static void folks_individual_aggregator_add_persona_from_details_data_free (gpointer _data);
void folks_individual_aggregator_add_persona_from_details (FolksIndividualAggregator* self, FolksIndividual* parent, FolksPersonaStore* persona_store, GHashTable* details, GAsyncReadyCallback _callback_, gpointer _user_data_);
FolksPersona* folks_individual_aggregator_add_persona_from_details_finish (FolksIndividualAggregator* self, GAsyncResult* _res_, GError** error);
static gboolean folks_individual_aggregator_add_persona_from_details_co (FolksIndividualAggregatorAddPersonaFromDetailsData* _data_);
static GHashTable* _folks_individual_aggregator_asv_copy (FolksIndividualAggregator* self, GHashTable* asv);
void folks_persona_store_add_persona_from_details (FolksPersonaStore* self, GHashTable* details, GAsyncReadyCallback _callback_, gpointer _user_data_);
GQuark folks_persona_store_error_quark (void);
FolksPersona* folks_persona_store_add_persona_from_details_finish (FolksPersonaStore* self, GAsyncResult* _res_, GError** error);
static void folks_individual_aggregator_add_persona_from_details_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_);
static Block4Data* block4_data_ref (Block4Data* _data4_);
static void block4_data_unref (Block4Data* _data4_);
static void _vala_GValue_free (GValue* self);
static void __vala_GValue_free0_ (gpointer var);
static void _lambda6_ (const gchar* k, GValue* v, Block4Data* _data4_);
static GValue* _g_value_dup (GValue* self);
static void __lambda6__gh_func (gconstpointer key, gconstpointer value, gpointer self);
static void folks_individual_aggregator_remove_individual_data_free (gpointer _data);
void folks_individual_aggregator_remove_individual (FolksIndividualAggregator* self, FolksIndividual* individual, GAsyncReadyCallback _callback_, gpointer _user_data_);
void folks_individual_aggregator_remove_individual_finish (FolksIndividualAggregator* self, GAsyncResult* _res_, GError** error);
static gboolean folks_individual_aggregator_remove_individual_co (FolksIndividualAggregatorRemoveIndividualData* _data_);
void folks_persona_store_remove_persona (FolksPersonaStore* self, FolksPersona* persona, GAsyncReadyCallback _callback_, gpointer _user_data_);
void folks_persona_store_remove_persona_finish (FolksPersonaStore* self, GAsyncResult* _res_, GError** error);
static void folks_individual_aggregator_remove_individual_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_);
static void folks_individual_aggregator_remove_persona_data_free (gpointer _data);
void folks_individual_aggregator_remove_persona (FolksIndividualAggregator* self, FolksPersona* persona, GAsyncReadyCallback _callback_, gpointer _user_data_);
void folks_individual_aggregator_remove_persona_finish (FolksIndividualAggregator* self, GAsyncResult* _res_, GError** error);
static gboolean folks_individual_aggregator_remove_persona_co (FolksIndividualAggregatorRemovePersonaData* _data_);
static void folks_individual_aggregator_remove_persona_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_);
static void folks_individual_aggregator_link_personas_data_free (gpointer _data);
void folks_individual_aggregator_link_personas (FolksIndividualAggregator* self, GeeSet* personas, GAsyncReadyCallback _callback_, gpointer _user_data_);
void folks_individual_aggregator_link_personas_finish (FolksIndividualAggregator* self, GAsyncResult* _res_, GError** error);
static gboolean folks_individual_aggregator_link_personas_co (FolksIndividualAggregatorLinkPersonasData* _data_);
GType folks_abstract_field_details_get_type (void) G_GNUC_CONST;
guint folks_abstract_field_details_hash (FolksAbstractFieldDetails* self);
gboolean folks_abstract_field_details_equal (FolksAbstractFieldDetails* self, FolksAbstractFieldDetails* that);
GType folks_im_field_details_get_type (void) G_GNUC_CONST;
GType folks_web_service_field_details_get_type (void) G_GNUC_CONST;
GType folks_im_details_get_type (void) G_GNUC_CONST;
GeeMultiMap* folks_im_details_get_im_addresses (FolksImDetails* self);
GType folks_web_service_details_get_type (void) G_GNUC_CONST;
GeeMultiMap* folks_web_service_details_get_web_service_addresses (FolksWebServiceDetails* self);
GType folks_local_id_details_get_type (void) G_GNUC_CONST;
GeeSet* folks_local_id_details_get_local_ids (FolksLocalIdDetails* self);
GType folks_persona_detail_get_type (void) G_GNUC_CONST;
const gchar* folks_persona_store_detail_key (FolksPersonaDetail detail);
static void folks_individual_aggregator_link_personas_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_);
static void folks_individual_aggregator_unlink_individual_data_free (gpointer _data);
void folks_individual_aggregator_unlink_individual (FolksIndividualAggregator* self, FolksIndividual* individual, GAsyncReadyCallback _callback_, gpointer _user_data_);
void folks_individual_aggregator_unlink_individual_finish (FolksIndividualAggregator* self, GAsyncResult* _res_, GError** error);
static gboolean folks_individual_aggregator_unlink_individual_co (FolksIndividualAggregatorUnlinkIndividualData* _data_);
static void folks_individual_aggregator_unlink_individual_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_);
gboolean folks_individual_aggregator_get_is_prepared (FolksIndividualAggregator* self);
FolksPersonaStore* folks_individual_aggregator_get_primary_store (FolksIndividualAggregator* self);
static void folks_individual_aggregator_set_individuals (FolksIndividualAggregator* self, GeeMap* value);
static void g_cclosure_user_marshal_VOID__OBJECT_OBJECT_STRING_OBJECT_ENUM (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
static void folks_individual_aggregator_finalize (GObject* obj);
static void _vala_folks_individual_aggregator_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec);
static void _vala_folks_individual_aggregator_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec);
static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func);
static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func);
static gint _vala_array_length (gpointer array);


GQuark folks_individual_aggregator_error_quark (void) {
	return g_quark_from_static_string ("folks_individual_aggregator_error-quark");
}


static void __folks_individual_aggregator_backend_available_cb_folks_backend_store_backend_available (FolksBackendStore* _sender, FolksBackend* backend, gpointer self) {
	_folks_individual_aggregator_backend_available_cb (self, _sender, backend);
}


static void __folks_individual_aggregator_debug_print_status_folks_debug_print_status (FolksDebug* _sender, gpointer self) {
	_folks_individual_aggregator_debug_print_status (self, _sender);
}


/**
   * Create a new IndividualAggregator.
   *
   * Clients should connect to the
   * {@link IndividualAggregator.individuals_changed} signal, then call
   * {@link IndividualAggregator.prepare} to load the backends and start
   * aggregating individuals.
   *
   * An example of how to set up an IndividualAggregator:
   * {{{
   *   IndividualAggregator agg = new IndividualAggregator ();
   *   agg.individuals_changed.connect (individuals_changed_cb);
   *   agg.prepare ();
   * }}}
   */
static void _g_free0_ (gpointer var) {
	var = (g_free (var), NULL);
}


static void _g_object_unref0_ (gpointer var) {
	(var == NULL) ? NULL : (var = (g_object_unref (var), NULL));
}


static gchar* string_strip (const gchar* self) {
	gchar* result = NULL;
	gchar* _tmp0_ = NULL;
	gchar* _result_;
	const gchar* _tmp1_;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = g_strdup (self);
	_result_ = _tmp0_;
	_tmp1_ = _result_;
	g_strstrip (_tmp1_);
	result = _result_;
	return result;
}


FolksIndividualAggregator* folks_individual_aggregator_construct (GType object_type) {
	FolksIndividualAggregator * self = NULL;
	GeeHashMap* _tmp0_;
	GeeHashMap* _tmp1_;
	GeeMap* _tmp2_;
	GeeMap* _tmp3_;
	GeeMap* _tmp4_;
	GHashFunc _tmp5_;
	GEqualFunc _tmp6_;
	GHashTable* _tmp7_;
	GeeHashSet* _tmp8_;
	FolksDebug* _tmp9_ = NULL;
	FolksDebug* _tmp10_;
	const gchar* _tmp11_ = NULL;
	gchar* _tmp12_;
	gchar* store_config_ids;
	const gchar* _tmp13_;
	const gchar* _tmp23_ = NULL;
	gchar* _tmp24_;
	gchar* disable_linking;
	const gchar* _tmp25_;
	gboolean _tmp30_ = FALSE;
	gboolean _tmp31_ = FALSE;
	const gchar* _tmp32_;
	gboolean _tmp34_;
	gboolean _tmp36_;
	FolksBackendStore* _tmp37_ = NULL;
	FolksBackendStore* _tmp38_;
	GError * _inner_error_ = NULL;
	self = (FolksIndividualAggregator*) g_object_new (object_type, NULL);
	_tmp0_ = gee_hash_map_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, FOLKS_TYPE_PERSONA_STORE, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL, NULL);
	_g_object_unref0 (self->priv->_stores);
	self->priv->_stores = _tmp0_;
	_tmp1_ = gee_hash_map_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL, NULL);
	_g_object_unref0 (self->priv->_individuals);
	self->priv->_individuals = (GeeMap*) _tmp1_;
	_tmp2_ = self->priv->_individuals;
	_tmp3_ = gee_map_get_read_only_view (_tmp2_);
	_tmp4_ = _tmp3_;
	_g_object_unref0 (self->priv->_individuals_ro);
	self->priv->_individuals_ro = _tmp4_;
	_tmp5_ = g_str_hash;
	_tmp6_ = g_str_equal;
	_tmp7_ = g_hash_table_new_full (_tmp5_, _tmp6_, _g_free0_, _g_object_unref0_);
	_g_hash_table_unref0 (self->priv->_link_map);
	self->priv->_link_map = _tmp7_;
	_tmp8_ = gee_hash_set_new (FOLKS_TYPE_BACKEND, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL);
	_g_object_unref0 (self->priv->_backends);
	self->priv->_backends = _tmp8_;
	_tmp9_ = folks_debug_dup ();
	_g_object_unref0 (self->priv->_debug);
	self->priv->_debug = _tmp9_;
	_tmp10_ = self->priv->_debug;
	g_signal_connect_object (_tmp10_, "print-status", (GCallback) __folks_individual_aggregator_debug_print_status_folks_debug_print_status, self, 0);
	_tmp11_ = g_getenv ("FOLKS_WRITEABLE_STORE");
	_tmp12_ = g_strdup (_tmp11_);
	store_config_ids = _tmp12_;
	_tmp13_ = store_config_ids;
	if (_tmp13_ != NULL) {
		const gchar* _tmp14_;
		_tmp14_ = store_config_ids;
		_folks_individual_aggregator_set_writeable_store (self, _tmp14_);
	} else {
		gchar* _tmp15_;
		gchar* _tmp16_;
		_tmp15_ = g_strdup ("key-file");
		_g_free0 (self->priv->_configured_writeable_store_type_id);
		self->priv->_configured_writeable_store_type_id = _tmp15_;
		_tmp16_ = g_strdup ("");
		_g_free0 (self->priv->_configured_writeable_store_id);
		self->priv->_configured_writeable_store_id = _tmp16_;
		{
			GConfClient* _tmp17_ = NULL;
			GConfClient* client;
			GConfClient* _tmp18_;
			GConfValue* _tmp19_ = NULL;
			GConfValue* val;
			GConfValue* _tmp20_;
			_tmp17_ = gconf_client_get_default ();
			client = _tmp17_;
			_tmp18_ = client;
			_tmp19_ = gconf_client_get (_tmp18_, FOLKS_INDIVIDUAL_AGGREGATOR__FOLKS_CONFIG_KEY, &_inner_error_);
			val = _tmp19_;
			if (_inner_error_ != NULL) {
				goto __catch9_g_error;
			}
			_tmp20_ = val;
			if (_tmp20_ != NULL) {
				GConfValue* _tmp21_;
				const gchar* _tmp22_ = NULL;
				_tmp21_ = val;
				_tmp22_ = gconf_value_get_string (_tmp21_);
				_folks_individual_aggregator_set_writeable_store (self, _tmp22_);
			}
			_gconf_value_free0 (val);
		}
		goto __finally9;
		__catch9_g_error:
		{
			GError* e = NULL;
			e = _inner_error_;
			_inner_error_ = NULL;
			_g_error_free0 (e);
		}
		__finally9:
		if (_inner_error_ != NULL) {
			_g_free0 (store_config_ids);
			g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
			g_clear_error (&_inner_error_);
			return NULL;
		}
	}
	_tmp23_ = g_getenv ("FOLKS_DISABLE_LINKING");
	_tmp24_ = g_strdup (_tmp23_);
	disable_linking = _tmp24_;
	_tmp25_ = disable_linking;
	if (_tmp25_ != NULL) {
		const gchar* _tmp26_;
		gchar* _tmp27_ = NULL;
		gchar* _tmp28_;
		gchar* _tmp29_ = NULL;
		_tmp26_ = disable_linking;
		_tmp27_ = string_strip (_tmp26_);
		_tmp28_ = _tmp27_;
		_tmp29_ = g_utf8_strdown (_tmp28_, (gssize) (-1));
		_g_free0 (disable_linking);
		disable_linking = _tmp29_;
		_g_free0 (_tmp28_);
	}
	_tmp32_ = disable_linking;
	if (_tmp32_ == NULL) {
		_tmp31_ = TRUE;
	} else {
		const gchar* _tmp33_;
		_tmp33_ = disable_linking;
		_tmp31_ = g_strcmp0 (_tmp33_, "no") == 0;
	}
	_tmp34_ = _tmp31_;
	if (_tmp34_) {
		_tmp30_ = TRUE;
	} else {
		const gchar* _tmp35_;
		_tmp35_ = disable_linking;
		_tmp30_ = g_strcmp0 (_tmp35_, "0") == 0;
	}
	_tmp36_ = _tmp30_;
	self->priv->_linking_enabled = _tmp36_;
	_tmp37_ = folks_backend_store_dup ();
	_g_object_unref0 (self->priv->_backend_store);
	self->priv->_backend_store = _tmp37_;
	_tmp38_ = self->priv->_backend_store;
	g_signal_connect_object (_tmp38_, "backend-available", (GCallback) __folks_individual_aggregator_backend_available_cb_folks_backend_store_backend_available, self, 0);
	_g_free0 (disable_linking);
	_g_free0 (store_config_ids);
	return self;
}


FolksIndividualAggregator* folks_individual_aggregator_new (void) {
	return folks_individual_aggregator_construct (FOLKS_TYPE_INDIVIDUAL_AGGREGATOR);
}


static void _folks_individual_aggregator_set_writeable_store (FolksIndividualAggregator* self, const gchar* store_config_ids) {
	const gchar* _tmp0_;
	const gchar* _tmp1_ = NULL;
	g_return_if_fail (self != NULL);
	g_return_if_fail (store_config_ids != NULL);
	_tmp0_ = store_config_ids;
	_tmp1_ = strstr (_tmp0_, ":");
	if (_tmp1_ != NULL) {
		const gchar* _tmp2_;
		gchar** _tmp3_;
		gchar** _tmp4_ = NULL;
		gchar** ids;
		gint ids_length1;
		gint _ids_size_;
		gchar** _tmp5_;
		gint _tmp5__length1;
		const gchar* _tmp6_;
		gchar* _tmp7_;
		gchar** _tmp8_;
		gint _tmp8__length1;
		const gchar* _tmp9_;
		gchar* _tmp10_;
		_tmp2_ = store_config_ids;
		_tmp4_ = _tmp3_ = g_strsplit (_tmp2_, ":", 2);
		ids = _tmp4_;
		ids_length1 = _vala_array_length (_tmp3_);
		_ids_size_ = ids_length1;
		_tmp5_ = ids;
		_tmp5__length1 = ids_length1;
		_tmp6_ = _tmp5_[0];
		_tmp7_ = g_strdup (_tmp6_);
		_g_free0 (self->priv->_configured_writeable_store_type_id);
		self->priv->_configured_writeable_store_type_id = _tmp7_;
		_tmp8_ = ids;
		_tmp8__length1 = ids_length1;
		_tmp9_ = _tmp8_[1];
		_tmp10_ = g_strdup (_tmp9_);
		_g_free0 (self->priv->_configured_writeable_store_id);
		self->priv->_configured_writeable_store_id = _tmp10_;
		ids = (_vala_array_free (ids, ids_length1, (GDestroyNotify) g_free), NULL);
	} else {
		const gchar* _tmp11_;
		gchar* _tmp12_;
		gchar* _tmp13_;
		_tmp11_ = store_config_ids;
		_tmp12_ = g_strdup (_tmp11_);
		_g_free0 (self->priv->_configured_writeable_store_type_id);
		self->priv->_configured_writeable_store_type_id = _tmp12_;
		_tmp13_ = g_strdup ("");
		_g_free0 (self->priv->_configured_writeable_store_id);
		self->priv->_configured_writeable_store_id = _tmp13_;
	}
}


static gpointer _g_object_ref0 (gpointer self) {
	return self ? g_object_ref (self) : NULL;
}


static void _folks_individual_aggregator_debug_print_status (FolksIndividualAggregator* self, FolksDebug* debug) {
	static const char domain[] = FOLKS_DEBUG_STATUS_LOG_DOMAIN;
	static const GLogLevelFlags level = G_LOG_LEVEL_INFO;
	FolksDebug* _tmp0_;
	const gchar* _tmp1_ = NULL;
	gboolean _tmp2_;
	const gchar* _tmp3_ = NULL;
	gboolean _tmp4_;
	FolksDebug* _tmp5_;
	guint _tmp6_;
	gchar* _tmp7_ = NULL;
	gchar* _tmp8_;
	FolksPersonaStore* _tmp9_;
	gchar* _tmp10_ = NULL;
	gchar* _tmp11_;
	const gchar* _tmp12_;
	const gchar* _tmp13_;
	FolksDebug* _tmp14_;
	GeeMap* _tmp15_;
	GeeMap* _tmp16_;
	gint _tmp17_;
	gint _tmp18_;
	FolksDebug* _tmp19_;
	FolksDebug* _tmp89_;
	FolksDebug* _tmp90_;
	GHashTable* _tmp91_;
	guint _tmp92_ = 0U;
	FolksDebug* _tmp93_;
	GHashTable* _tmp94_;
	GHashTableIter iter = {0};
	gchar* link_key = NULL;
	FolksIndividual* individual = NULL;
	FolksDebug* _tmp103_;
	FolksDebug* _tmp104_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (debug != NULL);
	_tmp0_ = debug;
	folks_debug_print_heading (_tmp0_, domain, level, "IndividualAggregator (%p)", self);
	_tmp2_ = self->priv->_linking_enabled;
	if (_tmp2_) {
		_tmp1_ = "yes";
	} else {
		_tmp1_ = "no";
	}
	_tmp4_ = self->priv->_is_prepared;
	if (_tmp4_) {
		_tmp3_ = "yes";
	} else {
		_tmp3_ = "no";
	}
	_tmp5_ = debug;
	_tmp6_ = ((GObject*) self)->ref_count;
	_tmp7_ = g_strdup_printf ("%u", _tmp6_);
	_tmp8_ = _tmp7_;
	_tmp9_ = self->priv->_writeable_store;
	_tmp10_ = g_strdup_printf ("%p", _tmp9_);
	_tmp11_ = _tmp10_;
	_tmp12_ = _tmp1_;
	_tmp13_ = _tmp3_;
	folks_debug_print_key_value_pairs (_tmp5_, domain, level, "Ref. count", _tmp8_, "Writeable store", _tmp11_, "Linking enabled?", _tmp12_, "Prepared?", _tmp13_, NULL);
	_g_free0 (_tmp11_);
	_g_free0 (_tmp8_);
	_tmp14_ = debug;
	_tmp15_ = folks_individual_aggregator_get_individuals (self);
	_tmp16_ = _tmp15_;
	_tmp17_ = gee_map_get_size (_tmp16_);
	_tmp18_ = _tmp17_;
	folks_debug_print_line (_tmp14_, domain, level, "%u Individuals:", (guint) _tmp18_);
	_tmp19_ = debug;
	folks_debug_indent (_tmp19_);
	{
		GeeMap* _tmp20_;
		GeeMap* _tmp21_;
		GeeCollection* _tmp22_;
		GeeCollection* _tmp23_;
		GeeCollection* _tmp24_;
		GeeIterator* _tmp25_ = NULL;
		GeeIterator* _tmp26_;
		GeeIterator* _individual_it;
		_tmp20_ = folks_individual_aggregator_get_individuals (self);
		_tmp21_ = _tmp20_;
		_tmp22_ = gee_map_get_values (_tmp21_);
		_tmp23_ = _tmp22_;
		_tmp24_ = _tmp23_;
		_tmp25_ = gee_iterable_iterator ((GeeIterable*) _tmp24_);
		_tmp26_ = _tmp25_;
		_g_object_unref0 (_tmp24_);
		_individual_it = _tmp26_;
		while (TRUE) {
			GeeIterator* _tmp27_;
			gboolean _tmp28_ = FALSE;
			GeeIterator* _tmp29_;
			gpointer _tmp30_ = NULL;
			FolksIndividual* individual;
			gchar* trust_level;
			FolksIndividual* _tmp31_;
			FolksTrustLevel _tmp32_;
			FolksTrustLevel _tmp33_;
			FolksDebug* _tmp36_;
			FolksIndividual* _tmp37_;
			const gchar* _tmp38_ = NULL;
			FolksIndividual* _tmp39_;
			gboolean _tmp40_;
			gboolean _tmp41_;
			FolksDebug* _tmp42_;
			FolksIndividual* _tmp43_;
			guint _tmp44_;
			gchar* _tmp45_ = NULL;
			gchar* _tmp46_;
			FolksIndividual* _tmp47_;
			const gchar* _tmp48_;
			const gchar* _tmp49_;
			const gchar* _tmp50_;
			const gchar* _tmp51_;
			FolksDebug* _tmp52_;
			FolksIndividual* _tmp53_;
			GeeSet* _tmp54_;
			GeeSet* _tmp55_;
			gint _tmp56_;
			gint _tmp57_;
			FolksDebug* _tmp58_;
			FolksDebug* _tmp88_;
			_tmp27_ = _individual_it;
			_tmp28_ = gee_iterator_next (_tmp27_);
			if (!_tmp28_) {
				break;
			}
			_tmp29_ = _individual_it;
			_tmp30_ = gee_iterator_get (_tmp29_);
			individual = (FolksIndividual*) _tmp30_;
			trust_level = NULL;
			_tmp31_ = individual;
			_tmp32_ = folks_individual_get_trust_level (_tmp31_);
			_tmp33_ = _tmp32_;
			switch (_tmp33_) {
				case FOLKS_TRUST_LEVEL_NONE:
				{
					gchar* _tmp34_;
					_tmp34_ = g_strdup ("none");
					_g_free0 (trust_level);
					trust_level = _tmp34_;
					break;
				}
				case FOLKS_TRUST_LEVEL_PERSONAS:
				{
					gchar* _tmp35_;
					_tmp35_ = g_strdup ("personas");
					_g_free0 (trust_level);
					trust_level = _tmp35_;
					break;
				}
				default:
				{
					g_assert_not_reached ();
				}
			}
			_tmp36_ = debug;
			_tmp37_ = individual;
			folks_debug_print_heading (_tmp36_, domain, level, "Individual (%p)", _tmp37_);
			_tmp39_ = individual;
			_tmp40_ = folks_individual_get_is_user (_tmp39_);
			_tmp41_ = _tmp40_;
			if (_tmp41_) {
				_tmp38_ = "yes";
			} else {
				_tmp38_ = "no";
			}
			_tmp42_ = debug;
			_tmp43_ = individual;
			_tmp44_ = ((GObject*) _tmp43_)->ref_count;
			_tmp45_ = g_strdup_printf ("%u", _tmp44_);
			_tmp46_ = _tmp45_;
			_tmp47_ = individual;
			_tmp48_ = folks_individual_get_id (_tmp47_);
			_tmp49_ = _tmp48_;
			_tmp50_ = _tmp38_;
			_tmp51_ = trust_level;
			folks_debug_print_key_value_pairs (_tmp42_, domain, level, "Ref. count", _tmp46_, "ID", _tmp49_, "User?", _tmp50_, "Trust level", _tmp51_, NULL);
			_g_free0 (_tmp46_);
			_tmp52_ = debug;
			_tmp53_ = individual;
			_tmp54_ = folks_individual_get_personas (_tmp53_);
			_tmp55_ = _tmp54_;
			_tmp56_ = gee_collection_get_size ((GeeCollection*) _tmp55_);
			_tmp57_ = _tmp56_;
			folks_debug_print_line (_tmp52_, domain, level, "%u Personas:", (guint) _tmp57_);
			_tmp58_ = debug;
			folks_debug_indent (_tmp58_);
			{
				FolksIndividual* _tmp59_;
				GeeSet* _tmp60_;
				GeeSet* _tmp61_;
				GeeIterator* _tmp62_ = NULL;
				GeeIterator* _persona_it;
				_tmp59_ = individual;
				_tmp60_ = folks_individual_get_personas (_tmp59_);
				_tmp61_ = _tmp60_;
				_tmp62_ = gee_iterable_iterator ((GeeIterable*) _tmp61_);
				_persona_it = _tmp62_;
				while (TRUE) {
					GeeIterator* _tmp63_;
					gboolean _tmp64_ = FALSE;
					GeeIterator* _tmp65_;
					gpointer _tmp66_ = NULL;
					FolksPersona* persona;
					FolksDebug* _tmp67_;
					FolksPersona* _tmp68_;
					const gchar* _tmp69_ = NULL;
					FolksPersona* _tmp70_;
					gboolean _tmp71_;
					gboolean _tmp72_;
					FolksDebug* _tmp73_;
					FolksPersona* _tmp74_;
					guint _tmp75_;
					gchar* _tmp76_ = NULL;
					gchar* _tmp77_;
					FolksPersona* _tmp78_;
					const gchar* _tmp79_;
					const gchar* _tmp80_;
					FolksPersona* _tmp81_;
					const gchar* _tmp82_;
					const gchar* _tmp83_;
					FolksPersona* _tmp84_;
					const gchar* _tmp85_;
					const gchar* _tmp86_;
					const gchar* _tmp87_;
					_tmp63_ = _persona_it;
					_tmp64_ = gee_iterator_next (_tmp63_);
					if (!_tmp64_) {
						break;
					}
					_tmp65_ = _persona_it;
					_tmp66_ = gee_iterator_get (_tmp65_);
					persona = (FolksPersona*) _tmp66_;
					_tmp67_ = debug;
					_tmp68_ = persona;
					folks_debug_print_heading (_tmp67_, domain, level, "Persona (%p)", _tmp68_);
					_tmp70_ = persona;
					_tmp71_ = folks_persona_get_is_user (_tmp70_);
					_tmp72_ = _tmp71_;
					if (_tmp72_) {
						_tmp69_ = "yes";
					} else {
						_tmp69_ = "no";
					}
					_tmp73_ = debug;
					_tmp74_ = persona;
					_tmp75_ = ((GObject*) _tmp74_)->ref_count;
					_tmp76_ = g_strdup_printf ("%u", _tmp75_);
					_tmp77_ = _tmp76_;
					_tmp78_ = persona;
					_tmp79_ = folks_persona_get_uid (_tmp78_);
					_tmp80_ = _tmp79_;
					_tmp81_ = persona;
					_tmp82_ = folks_persona_get_iid (_tmp81_);
					_tmp83_ = _tmp82_;
					_tmp84_ = persona;
					_tmp85_ = folks_persona_get_display_id (_tmp84_);
					_tmp86_ = _tmp85_;
					_tmp87_ = _tmp69_;
					folks_debug_print_key_value_pairs (_tmp73_, domain, level, "Ref. count", _tmp77_, "UID", _tmp80_, "IID", _tmp83_, "Display ID", _tmp86_, "User?", _tmp87_, NULL);
					_g_free0 (_tmp77_);
					_g_object_unref0 (persona);
				}
				_g_object_unref0 (_persona_it);
			}
			_tmp88_ = debug;
			folks_debug_unindent (_tmp88_);
			_g_free0 (trust_level);
			_g_object_unref0 (individual);
		}
		_g_object_unref0 (_individual_it);
	}
	_tmp89_ = debug;
	folks_debug_unindent (_tmp89_);
	_tmp90_ = debug;
	_tmp91_ = self->priv->_link_map;
	_tmp92_ = g_hash_table_size (_tmp91_);
	folks_debug_print_line (_tmp90_, domain, level, "%u entries in the link map:", _tmp92_);
	_tmp93_ = debug;
	folks_debug_indent (_tmp93_);
	_tmp94_ = self->priv->_link_map;
	g_hash_table_iter_init (&iter, _tmp94_);
	while (TRUE) {
		gconstpointer _tmp95_ = NULL;
		gconstpointer _tmp96_ = NULL;
		gboolean _tmp97_ = FALSE;
		gchar* _tmp98_;
		FolksIndividual* _tmp99_;
		FolksDebug* _tmp100_;
		const gchar* _tmp101_;
		FolksIndividual* _tmp102_;
		_tmp97_ = g_hash_table_iter_next (&iter, &_tmp95_, &_tmp96_);
		_g_free0 (link_key);
		_tmp98_ = g_strdup (_tmp95_);
		link_key = _tmp98_;
		_g_object_unref0 (individual);
		_tmp99_ = _g_object_ref0 (_tmp96_);
		individual = _tmp99_;
		if (!(_tmp97_ == TRUE)) {
			break;
		}
		_tmp100_ = debug;
		_tmp101_ = link_key;
		_tmp102_ = individual;
		folks_debug_print_line (_tmp100_, domain, level, "%s → %p", _tmp101_, _tmp102_);
	}
	_tmp103_ = debug;
	folks_debug_unindent (_tmp103_);
	_tmp104_ = debug;
	folks_debug_print_line (_tmp104_, domain, level, "");
	_g_object_unref0 (individual);
	_g_free0 (link_key);
}


static void folks_individual_aggregator_prepare_data_free (gpointer _data) {
	FolksIndividualAggregatorPrepareData* _data_;
	_data_ = _data;
	_g_object_unref0 (_data_->self);
	g_slice_free (FolksIndividualAggregatorPrepareData, _data_);
}


void folks_individual_aggregator_prepare (FolksIndividualAggregator* self, GAsyncReadyCallback _callback_, gpointer _user_data_) {
	FolksIndividualAggregatorPrepareData* _data_;
	FolksIndividualAggregator* _tmp0_;
	_data_ = g_slice_new0 (FolksIndividualAggregatorPrepareData);
	_data_->_async_result = g_simple_async_result_new (G_OBJECT (self), _callback_, _user_data_, folks_individual_aggregator_prepare);
	g_simple_async_result_set_op_res_gpointer (_data_->_async_result, _data_, folks_individual_aggregator_prepare_data_free);
	_tmp0_ = _g_object_ref0 (self);
	_data_->self = _tmp0_;
	folks_individual_aggregator_prepare_co (_data_);
}


void folks_individual_aggregator_prepare_finish (FolksIndividualAggregator* self, GAsyncResult* _res_, GError** error) {
	FolksIndividualAggregatorPrepareData* _data_;
	if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (_res_), error)) {
		return;
	}
	_data_ = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (_res_));
}


/**
   * Prepare the IndividualAggregator for use.
   *
   * This loads all the available backends and prepares them for use by the
   * IndividualAggregator. This should be called //after// connecting to the
   * {@link IndividualAggregator.individuals_changed} signal, or a race
   * condition could occur, with the signal being emitted before your code has
   * connected to them, and {@link Individual}s getting "lost" as a result.
   *
   * This function is guaranteed to be idempotent (since version 0.3.0).
   *
   * @since 0.1.11
   */
static void folks_individual_aggregator_prepare_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_) {
	FolksIndividualAggregatorPrepareData* _data_;
	_data_ = _user_data_;
	_data_->_source_object_ = source_object;
	_data_->_res_ = _res_;
	folks_individual_aggregator_prepare_co (_data_);
}


static gboolean folks_individual_aggregator_prepare_co (FolksIndividualAggregatorPrepareData* _data_) {
	switch (_data_->_state_) {
		case 0:
		goto _state_0;
		case 1:
		goto _state_1;
		default:
		g_assert_not_reached ();
	}
	_state_0:
	{
		_data_->_tmp0_ = _data_->self->priv->_is_prepared;
		g_static_rec_mutex_lock (&_data_->self->priv->__lock__is_prepared);
		{
			_data_->_tmp2_ = _data_->self->priv->_is_prepared;
			if (!_data_->_tmp2_) {
				_data_->_tmp3_ = _data_->self->priv->_prepare_pending;
				_data_->_tmp1_ = !_data_->_tmp3_;
			} else {
				_data_->_tmp1_ = FALSE;
			}
			_data_->_tmp4_ = _data_->_tmp1_;
			if (_data_->_tmp4_) {
				_data_->self->priv->_prepare_pending = TRUE;
				_data_->_tmp5_ = _data_->self->priv->_backend_store;
				_data_->_state_ = 1;
				folks_backend_store_load_backends (_data_->_tmp5_, folks_individual_aggregator_prepare_ready, _data_);
				return FALSE;
				_state_1:
				folks_backend_store_load_backends_finish (_data_->_tmp5_, _data_->_res_, &_data_->_inner_error_);
				if (_data_->_inner_error_ != NULL) {
					goto __finally10;
				}
				_data_->self->priv->_is_prepared = TRUE;
				_data_->self->priv->_prepare_pending = FALSE;
				g_object_notify ((GObject*) _data_->self, "is-prepared");
			}
		}
		__finally10:
		{
			_data_->_tmp6_ = _data_->self->priv->_is_prepared;
			g_static_rec_mutex_unlock (&_data_->self->priv->__lock__is_prepared);
		}
		if (_data_->_inner_error_ != NULL) {
			g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
			g_error_free (_data_->_inner_error_);
			if (_data_->_state_ == 0) {
				g_simple_async_result_complete_in_idle (_data_->_async_result);
			} else {
				g_simple_async_result_complete (_data_->_async_result);
			}
			g_object_unref (_data_->_async_result);
			return FALSE;
		}
	}
	if (_data_->_state_ == 0) {
		g_simple_async_result_complete_in_idle (_data_->_async_result);
	} else {
		g_simple_async_result_complete (_data_->_async_result);
	}
	g_object_unref (_data_->_async_result);
	return FALSE;
}


/**
   * Get all matches for a given {@link Individual}.
   *
   * @param matchee the individual to find matches for
   * @param min_threshold the threshold for accepting a match
   * @return a map from matched individuals to the degree with which they match
   * `matchee` (which is guaranteed to at least equal `min_threshold`);
   * if no matches could be found, an empty map is returned
   *
   * @since 0.5.1
   */
GeeMap* folks_individual_aggregator_get_potential_matches (FolksIndividualAggregator* self, FolksIndividual* matchee, FolksMatchResult min_threshold) {
	GeeMap* result = NULL;
	GeeHashMap* _tmp0_;
	GeeHashMap* matches;
	FolksPotentialMatch* _tmp1_;
	FolksPotentialMatch* matchObj;
	g_return_val_if_fail (self != NULL, NULL);
	g_return_val_if_fail (matchee != NULL, NULL);
	_tmp0_ = gee_hash_map_new (FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, FOLKS_TYPE_MATCH_RESULT, NULL, NULL, NULL, NULL, NULL);
	matches = _tmp0_;
	_tmp1_ = folks_potential_match_new ();
	matchObj = _tmp1_;
	{
		GeeMap* _tmp2_;
		GeeCollection* _tmp3_;
		GeeCollection* _tmp4_;
		GeeCollection* _tmp5_;
		GeeIterator* _tmp6_ = NULL;
		GeeIterator* _tmp7_;
		GeeIterator* _i_it;
		_tmp2_ = self->priv->_individuals;
		_tmp3_ = gee_map_get_values (_tmp2_);
		_tmp4_ = _tmp3_;
		_tmp5_ = _tmp4_;
		_tmp6_ = gee_iterable_iterator ((GeeIterable*) _tmp5_);
		_tmp7_ = _tmp6_;
		_g_object_unref0 (_tmp5_);
		_i_it = _tmp7_;
		while (TRUE) {
			GeeIterator* _tmp8_;
			gboolean _tmp9_ = FALSE;
			GeeIterator* _tmp10_;
			gpointer _tmp11_ = NULL;
			FolksIndividual* i;
			FolksIndividual* _tmp12_;
			const gchar* _tmp13_;
			const gchar* _tmp14_;
			FolksIndividual* _tmp15_;
			const gchar* _tmp16_;
			const gchar* _tmp17_;
			FolksPotentialMatch* _tmp18_;
			FolksIndividual* _tmp19_;
			FolksIndividual* _tmp20_;
			FolksMatchResult _tmp21_ = 0;
			FolksMatchResult _result_;
			FolksMatchResult _tmp22_;
			FolksMatchResult _tmp23_;
			_tmp8_ = _i_it;
			_tmp9_ = gee_iterator_next (_tmp8_);
			if (!_tmp9_) {
				break;
			}
			_tmp10_ = _i_it;
			_tmp11_ = gee_iterator_get (_tmp10_);
			i = (FolksIndividual*) _tmp11_;
			_tmp12_ = i;
			_tmp13_ = folks_individual_get_id (_tmp12_);
			_tmp14_ = _tmp13_;
			_tmp15_ = matchee;
			_tmp16_ = folks_individual_get_id (_tmp15_);
			_tmp17_ = _tmp16_;
			if (g_strcmp0 (_tmp14_, _tmp17_) == 0) {
				_g_object_unref0 (i);
				continue;
			}
			_tmp18_ = matchObj;
			_tmp19_ = i;
			_tmp20_ = matchee;
			_tmp21_ = folks_potential_match_potential_match (_tmp18_, _tmp19_, _tmp20_);
			_result_ = _tmp21_;
			_tmp22_ = _result_;
			_tmp23_ = min_threshold;
			if (_tmp22_ >= _tmp23_) {
				GeeHashMap* _tmp24_;
				FolksIndividual* _tmp25_;
				FolksMatchResult _tmp26_;
				_tmp24_ = matches;
				_tmp25_ = i;
				_tmp26_ = _result_;
				gee_abstract_map_set ((GeeAbstractMap*) _tmp24_, _tmp25_, GINT_TO_POINTER (_tmp26_));
			}
			_g_object_unref0 (i);
		}
		_g_object_unref0 (_i_it);
	}
	result = (GeeMap*) matches;
	_g_object_unref0 (matchObj);
	return result;
}


/**
   * Get all combinations between all {@link Individual}s.
   *
   * @param min_threshold the threshold for accepting a match
   * @return a map from each individual in the aggregator to a map of the
   * other individuals in the aggregator which can be matched with that
   * individual, mapped to the degree with which they match the original
   * individual (which is guaranteed to at least equal `min_threshold`)
   *
   * @since 0.5.1
   */
GeeMap* folks_individual_aggregator_get_all_potential_matches (FolksIndividualAggregator* self, FolksMatchResult min_threshold) {
	GeeMap* result = NULL;
	GeeHashMap* _tmp0_;
	GeeHashMap* matches;
	GeeMap* _tmp1_;
	GeeCollection* _tmp2_;
	GeeCollection* _tmp3_;
	GeeCollection* _tmp4_;
	gint _tmp5_ = 0;
	gpointer* _tmp6_ = NULL;
	FolksIndividual** _tmp7_;
	gint _tmp7__length1;
	FolksIndividual** individuals;
	gint individuals_length1;
	gint _individuals_size_;
	FolksPotentialMatch* _tmp8_;
	FolksPotentialMatch* matchObj;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = gee_hash_map_new (FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, GEE_TYPE_HASH_MAP, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL, NULL);
	matches = _tmp0_;
	_tmp1_ = self->priv->_individuals;
	_tmp2_ = gee_map_get_values (_tmp1_);
	_tmp3_ = _tmp2_;
	_tmp4_ = _tmp3_;
	_tmp6_ = gee_collection_to_array (_tmp4_, &_tmp5_);
	_tmp7_ = _tmp6_;
	_tmp7__length1 = _tmp5_;
	_g_object_unref0 (_tmp4_);
	individuals = _tmp7_;
	individuals_length1 = _tmp7__length1;
	_individuals_size_ = individuals_length1;
	_tmp8_ = folks_potential_match_new ();
	matchObj = _tmp8_;
	{
		gint i;
		i = 0;
		{
			gboolean _tmp9_;
			_tmp9_ = TRUE;
			while (TRUE) {
				gboolean _tmp10_;
				gint _tmp12_;
				FolksIndividual** _tmp13_;
				gint _tmp13__length1;
				FolksIndividual** _tmp14_;
				gint _tmp14__length1;
				gint _tmp15_;
				FolksIndividual* _tmp16_;
				FolksIndividual* _tmp17_;
				FolksIndividual* a;
				GeeHashMap* _tmp18_;
				FolksIndividual* _tmp19_;
				gpointer _tmp20_ = NULL;
				GeeHashMap* matches_a;
				GeeHashMap* _tmp21_;
				_tmp10_ = _tmp9_;
				if (!_tmp10_) {
					gint _tmp11_;
					_tmp11_ = i;
					i = _tmp11_ + 1;
				}
				_tmp9_ = FALSE;
				_tmp12_ = i;
				_tmp13_ = individuals;
				_tmp13__length1 = individuals_length1;
				if (!(_tmp12_ < _tmp13__length1)) {
					break;
				}
				_tmp14_ = individuals;
				_tmp14__length1 = individuals_length1;
				_tmp15_ = i;
				_tmp16_ = _tmp14_[_tmp15_];
				_tmp17_ = _g_object_ref0 (_tmp16_);
				a = _tmp17_;
				_tmp18_ = matches;
				_tmp19_ = a;
				_tmp20_ = gee_abstract_map_get ((GeeAbstractMap*) _tmp18_, _tmp19_);
				matches_a = (GeeHashMap*) _tmp20_;
				_tmp21_ = matches_a;
				if (_tmp21_ == NULL) {
					GeeHashMap* _tmp22_;
					GeeHashMap* _tmp23_;
					FolksIndividual* _tmp24_;
					GeeHashMap* _tmp25_;
					_tmp22_ = gee_hash_map_new (FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, FOLKS_TYPE_MATCH_RESULT, NULL, NULL, NULL, NULL, NULL);
					_g_object_unref0 (matches_a);
					matches_a = _tmp22_;
					_tmp23_ = matches;
					_tmp24_ = a;
					_tmp25_ = matches_a;
					gee_abstract_map_set ((GeeAbstractMap*) _tmp23_, _tmp24_, _tmp25_);
				}
				{
					gint _tmp26_;
					gint f;
					_tmp26_ = i;
					f = _tmp26_ + 1;
					{
						gboolean _tmp27_;
						_tmp27_ = TRUE;
						while (TRUE) {
							gboolean _tmp28_;
							gint _tmp30_;
							FolksIndividual** _tmp31_;
							gint _tmp31__length1;
							FolksIndividual** _tmp32_;
							gint _tmp32__length1;
							gint _tmp33_;
							FolksIndividual* _tmp34_;
							FolksIndividual* _tmp35_;
							FolksIndividual* b;
							GeeHashMap* _tmp36_;
							FolksIndividual* _tmp37_;
							gpointer _tmp38_ = NULL;
							GeeHashMap* matches_b;
							GeeHashMap* _tmp39_;
							FolksPotentialMatch* _tmp44_;
							FolksIndividual* _tmp45_;
							FolksIndividual* _tmp46_;
							FolksMatchResult _tmp47_ = 0;
							FolksMatchResult _result_;
							FolksMatchResult _tmp48_;
							FolksMatchResult _tmp49_;
							_tmp28_ = _tmp27_;
							if (!_tmp28_) {
								gint _tmp29_;
								_tmp29_ = f;
								f = _tmp29_ + 1;
							}
							_tmp27_ = FALSE;
							_tmp30_ = f;
							_tmp31_ = individuals;
							_tmp31__length1 = individuals_length1;
							if (!(_tmp30_ < _tmp31__length1)) {
								break;
							}
							_tmp32_ = individuals;
							_tmp32__length1 = individuals_length1;
							_tmp33_ = f;
							_tmp34_ = _tmp32_[_tmp33_];
							_tmp35_ = _g_object_ref0 (_tmp34_);
							b = _tmp35_;
							_tmp36_ = matches;
							_tmp37_ = b;
							_tmp38_ = gee_abstract_map_get ((GeeAbstractMap*) _tmp36_, _tmp37_);
							matches_b = (GeeHashMap*) _tmp38_;
							_tmp39_ = matches_b;
							if (_tmp39_ == NULL) {
								GeeHashMap* _tmp40_;
								GeeHashMap* _tmp41_;
								FolksIndividual* _tmp42_;
								GeeHashMap* _tmp43_;
								_tmp40_ = gee_hash_map_new (FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, FOLKS_TYPE_MATCH_RESULT, NULL, NULL, NULL, NULL, NULL);
								_g_object_unref0 (matches_b);
								matches_b = _tmp40_;
								_tmp41_ = matches;
								_tmp42_ = b;
								_tmp43_ = matches_b;
								gee_abstract_map_set ((GeeAbstractMap*) _tmp41_, _tmp42_, _tmp43_);
							}
							_tmp44_ = matchObj;
							_tmp45_ = a;
							_tmp46_ = b;
							_tmp47_ = folks_potential_match_potential_match (_tmp44_, _tmp45_, _tmp46_);
							_result_ = _tmp47_;
							_tmp48_ = _result_;
							_tmp49_ = min_threshold;
							if (_tmp48_ >= _tmp49_) {
								GeeHashMap* _tmp50_;
								FolksIndividual* _tmp51_;
								FolksMatchResult _tmp52_;
								GeeHashMap* _tmp53_;
								FolksIndividual* _tmp54_;
								FolksMatchResult _tmp55_;
								_tmp50_ = matches_a;
								_tmp51_ = b;
								_tmp52_ = _result_;
								gee_abstract_map_set ((GeeAbstractMap*) _tmp50_, _tmp51_, GINT_TO_POINTER (_tmp52_));
								_tmp53_ = matches_b;
								_tmp54_ = a;
								_tmp55_ = _result_;
								gee_abstract_map_set ((GeeAbstractMap*) _tmp53_, _tmp54_, GINT_TO_POINTER (_tmp55_));
							}
							_g_object_unref0 (matches_b);
							_g_object_unref0 (b);
						}
					}
				}
				_g_object_unref0 (matches_a);
				_g_object_unref0 (a);
			}
		}
	}
	result = (GeeMap*) matches;
	_g_object_unref0 (matchObj);
	individuals = (_vala_array_free (individuals, individuals_length1, (GDestroyNotify) g_object_unref), NULL);
	return result;
}


static void _folks_individual_aggregator_add_backend_data_free (gpointer _data) {
	FolksIndividualAggregatorAddBackendData* _data_;
	_data_ = _data;
	_g_object_unref0 (_data_->backend);
	_g_object_unref0 (_data_->self);
	g_slice_free (FolksIndividualAggregatorAddBackendData, _data_);
}


static void _folks_individual_aggregator_add_backend (FolksIndividualAggregator* self, FolksBackend* backend, GAsyncReadyCallback _callback_, gpointer _user_data_) {
	FolksIndividualAggregatorAddBackendData* _data_;
	FolksIndividualAggregator* _tmp0_;
	FolksBackend* _tmp1_;
	FolksBackend* _tmp2_;
	_data_ = g_slice_new0 (FolksIndividualAggregatorAddBackendData);
	_data_->_async_result = g_simple_async_result_new (G_OBJECT (self), _callback_, _user_data_, _folks_individual_aggregator_add_backend);
	g_simple_async_result_set_op_res_gpointer (_data_->_async_result, _data_, _folks_individual_aggregator_add_backend_data_free);
	_tmp0_ = _g_object_ref0 (self);
	_data_->self = _tmp0_;
	_tmp1_ = backend;
	_tmp2_ = _g_object_ref0 (_tmp1_);
	_data_->backend = _tmp2_;
	_folks_individual_aggregator_add_backend_co (_data_);
}


static void _folks_individual_aggregator_add_backend_finish (FolksIndividualAggregator* self, GAsyncResult* _res_) {
	FolksIndividualAggregatorAddBackendData* _data_;
	_data_ = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (_res_));
}


static void __folks_individual_aggregator_backend_persona_store_added_cb_folks_backend_persona_store_added (FolksBackend* _sender, FolksPersonaStore* store, gpointer self) {
	_folks_individual_aggregator_backend_persona_store_added_cb (self, _sender, store);
}


static void __folks_individual_aggregator_backend_persona_store_removed_cb_folks_backend_persona_store_removed (FolksBackend* _sender, FolksPersonaStore* store, gpointer self) {
	_folks_individual_aggregator_backend_persona_store_removed_cb (self, _sender, store);
}


static gboolean _folks_individual_aggregator_add_backend_co (FolksIndividualAggregatorAddBackendData* _data_) {
	switch (_data_->_state_) {
		case 0:
		goto _state_0;
		default:
		g_assert_not_reached ();
	}
	_state_0:
	_data_->_tmp0_ = _data_->self->priv->_backends;
	_data_->_tmp1_ = _data_->backend;
	_data_->_tmp2_ = FALSE;
	_data_->_tmp2_ = gee_abstract_collection_contains ((GeeAbstractCollection*) _data_->_tmp0_, _data_->_tmp1_);
	if (!_data_->_tmp2_) {
		_data_->_tmp3_ = _data_->self->priv->_backends;
		_data_->_tmp4_ = _data_->backend;
		gee_abstract_collection_add ((GeeAbstractCollection*) _data_->_tmp3_, _data_->_tmp4_);
		_data_->_tmp5_ = _data_->backend;
		g_signal_connect_object (_data_->_tmp5_, "persona-store-added", (GCallback) __folks_individual_aggregator_backend_persona_store_added_cb_folks_backend_persona_store_added, _data_->self, 0);
		_data_->_tmp6_ = _data_->backend;
		g_signal_connect_object (_data_->_tmp6_, "persona-store-removed", (GCallback) __folks_individual_aggregator_backend_persona_store_removed_cb_folks_backend_persona_store_removed, _data_->self, 0);
		{
			_data_->_tmp7_ = _data_->backend;
			_data_->_tmp8_ = folks_backend_get_persona_stores (_data_->_tmp7_);
			_data_->_tmp9_ = _data_->_tmp8_;
			_data_->_tmp10_ = gee_map_get_values (_data_->_tmp9_);
			_data_->_tmp11_ = _data_->_tmp10_;
			_data_->_tmp12_ = _data_->_tmp11_;
			_data_->_tmp13_ = NULL;
			_data_->_tmp13_ = gee_iterable_iterator ((GeeIterable*) _data_->_tmp12_);
			_data_->_tmp14_ = _data_->_tmp13_;
			_g_object_unref0 (_data_->_tmp12_);
			_data_->_persona_store_it = _data_->_tmp14_;
			while (TRUE) {
				_data_->_tmp15_ = _data_->_persona_store_it;
				_data_->_tmp16_ = FALSE;
				_data_->_tmp16_ = gee_iterator_next (_data_->_tmp15_);
				if (!_data_->_tmp16_) {
					break;
				}
				_data_->_tmp17_ = _data_->_persona_store_it;
				_data_->_tmp18_ = NULL;
				_data_->_tmp18_ = gee_iterator_get (_data_->_tmp17_);
				_data_->persona_store = (FolksPersonaStore*) _data_->_tmp18_;
				_data_->_tmp19_ = _data_->backend;
				_data_->_tmp20_ = _data_->persona_store;
				_folks_individual_aggregator_backend_persona_store_added_cb (_data_->self, _data_->_tmp19_, _data_->_tmp20_);
				_g_object_unref0 (_data_->persona_store);
			}
			_g_object_unref0 (_data_->_persona_store_it);
		}
	}
	if (_data_->_state_ == 0) {
		g_simple_async_result_complete_in_idle (_data_->_async_result);
	} else {
		g_simple_async_result_complete (_data_->_async_result);
	}
	g_object_unref (_data_->_async_result);
	return FALSE;
}


static void _folks_individual_aggregator_backend_available_cb (FolksIndividualAggregator* self, FolksBackendStore* backend_store, FolksBackend* backend) {
	FolksBackend* _tmp0_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (backend_store != NULL);
	g_return_if_fail (backend != NULL);
	_tmp0_ = backend;
	_folks_individual_aggregator_add_backend (self, _tmp0_, NULL, NULL);
}


static Block1Data* block1_data_ref (Block1Data* _data1_) {
	g_atomic_int_inc (&_data1_->_ref_count_);
	return _data1_;
}


static void block1_data_unref (Block1Data* _data1_) {
	if (g_atomic_int_dec_and_test (&_data1_->_ref_count_)) {
		_g_object_unref0 (_data1_->self);
		_g_free0 (_data1_->store_id);
		_g_object_unref0 (_data1_->store);
		g_slice_free (Block1Data, _data1_);
	}
}


static void __folks_individual_aggregator_personas_changed_cb_folks_persona_store_personas_changed (FolksPersonaStore* _sender, GeeSet* added, GeeSet* removed, const gchar* message, FolksPersona* actor, FolksGroupDetailsChangeReason reason, gpointer self) {
	_folks_individual_aggregator_personas_changed_cb (self, _sender, added, removed, message, actor, reason);
}


static void __folks_individual_aggregator_is_writeable_changed_cb_g_object_notify (GObject* _sender, GParamSpec* pspec, gpointer self) {
	_folks_individual_aggregator_is_writeable_changed_cb (self, _sender, pspec);
}


static void __folks_individual_aggregator_trust_level_changed_cb_g_object_notify (GObject* _sender, GParamSpec* pspec, gpointer self) {
	_folks_individual_aggregator_trust_level_changed_cb (self, _sender, pspec);
}


static void _lambda5_ (GObject* obj, GAsyncResult* _result_, Block1Data* _data1_) {
	FolksIndividualAggregator * self;
	GError * _inner_error_ = NULL;
	self = _data1_->self;
	g_return_if_fail (_result_ != NULL);
	{
		FolksPersonaStore* _tmp0_;
		GAsyncResult* _tmp1_;
		_tmp0_ = _data1_->store;
		_tmp1_ = _result_;
		folks_persona_store_prepare_finish (_tmp0_, _tmp1_, &_inner_error_);
		if (_inner_error_ != NULL) {
			goto __catch11_g_error;
		}
	}
	goto __finally11;
	__catch11_g_error:
	{
		GError* e = NULL;
		const gchar* _tmp2_ = NULL;
		const gchar* _tmp3_;
		GError* _tmp4_;
		const gchar* _tmp5_;
		e = _inner_error_;
		_inner_error_ = NULL;
		_tmp2_ = _ ("Error preparing persona store '%s': %s");
		_tmp3_ = _data1_->store_id;
		_tmp4_ = e;
		_tmp5_ = _tmp4_->message;
		g_warning (_tmp2_, _tmp3_, _tmp5_);
		_g_error_free0 (e);
	}
	__finally11:
	if (_inner_error_ != NULL) {
		g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
		g_clear_error (&_inner_error_);
		return;
	}
}


static void __lambda5__gasync_ready_callback (GObject* source_object, GAsyncResult* res, gpointer self) {
	_lambda5_ (source_object, res, self);
	block1_data_unref (self);
}


static void _folks_individual_aggregator_backend_persona_store_added_cb (FolksIndividualAggregator* self, FolksBackend* backend, FolksPersonaStore* store) {
	Block1Data* _data1_;
	FolksPersonaStore* _tmp0_;
	FolksPersonaStore* _tmp1_;
	FolksPersonaStore* _tmp2_;
	const gchar* _tmp3_;
	const gchar* _tmp4_;
	FolksPersonaStore* _tmp5_;
	const gchar* _tmp6_;
	const gchar* _tmp7_;
	gchar* _tmp8_ = NULL;
	FolksPersonaStore* _tmp9_;
	const gchar* _tmp10_;
	const gchar* _tmp11_;
	const gchar* _tmp12_;
	GeeHashMap* _tmp28_;
	const gchar* _tmp29_;
	FolksPersonaStore* _tmp30_;
	FolksPersonaStore* _tmp31_;
	FolksPersonaStore* _tmp32_;
	FolksPersonaStore* _tmp33_;
	FolksPersonaStore* _tmp34_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (backend != NULL);
	g_return_if_fail (store != NULL);
	_data1_ = g_slice_new0 (Block1Data);
	_data1_->_ref_count_ = 1;
	_data1_->self = g_object_ref (self);
	_tmp0_ = store;
	_tmp1_ = _g_object_ref0 (_tmp0_);
	_data1_->store = _tmp1_;
	_tmp2_ = _data1_->store;
	_tmp3_ = folks_persona_store_get_type_id (_tmp2_);
	_tmp4_ = _tmp3_;
	_tmp5_ = _data1_->store;
	_tmp6_ = folks_persona_store_get_id (_tmp5_);
	_tmp7_ = _tmp6_;
	_tmp8_ = _folks_individual_aggregator_get_store_full_id (self, _tmp4_, _tmp7_);
	_data1_->store_id = _tmp8_;
	_tmp9_ = _data1_->store;
	_tmp10_ = folks_persona_store_get_type_id (_tmp9_);
	_tmp11_ = _tmp10_;
	_tmp12_ = self->priv->_configured_writeable_store_type_id;
	if (g_strcmp0 (_tmp11_, _tmp12_) == 0) {
		gboolean _tmp13_ = FALSE;
		gboolean _tmp14_ = FALSE;
		FolksPersonaStore* _tmp15_;
		const gchar* _tmp16_;
		const gchar* _tmp17_;
		gboolean _tmp19_;
		gboolean _tmp24_;
		_tmp15_ = _data1_->store;
		_tmp16_ = folks_persona_store_get_type_id (_tmp15_);
		_tmp17_ = _tmp16_;
		if (g_strcmp0 (_tmp17_, "eds") != 0) {
			const gchar* _tmp18_;
			_tmp18_ = self->priv->_configured_writeable_store_id;
			_tmp14_ = g_strcmp0 (_tmp18_, "") == 0;
		} else {
			_tmp14_ = FALSE;
		}
		_tmp19_ = _tmp14_;
		if (_tmp19_) {
			_tmp13_ = TRUE;
		} else {
			const gchar* _tmp20_;
			FolksPersonaStore* _tmp21_;
			const gchar* _tmp22_;
			const gchar* _tmp23_;
			_tmp20_ = self->priv->_configured_writeable_store_id;
			_tmp21_ = _data1_->store;
			_tmp22_ = folks_persona_store_get_id (_tmp21_);
			_tmp23_ = _tmp22_;
			_tmp13_ = g_strcmp0 (_tmp20_, _tmp23_) == 0;
		}
		_tmp24_ = _tmp13_;
		if (_tmp24_) {
			FolksPersonaStore* _tmp25_;
			FolksPersonaStore* _tmp26_;
			FolksPersonaStore* _tmp27_;
			_tmp25_ = _data1_->store;
			folks_persona_store_set_is_writeable (_tmp25_, TRUE);
			_tmp26_ = _data1_->store;
			folks_persona_store_set_trust_level (_tmp26_, FOLKS_PERSONA_STORE_TRUST_FULL);
			_tmp27_ = _data1_->store;
			self->priv->_writeable_store = _tmp27_;
		}
	}
	_tmp28_ = self->priv->_stores;
	_tmp29_ = _data1_->store_id;
	_tmp30_ = _data1_->store;
	gee_abstract_map_set ((GeeAbstractMap*) _tmp28_, _tmp29_, _tmp30_);
	_tmp31_ = _data1_->store;
	g_signal_connect_object (_tmp31_, "personas-changed", (GCallback) __folks_individual_aggregator_personas_changed_cb_folks_persona_store_personas_changed, self, 0);
	_tmp32_ = _data1_->store;
	g_signal_connect_object ((GObject*) _tmp32_, "notify::is-writeable", (GCallback) __folks_individual_aggregator_is_writeable_changed_cb_g_object_notify, self, 0);
	_tmp33_ = _data1_->store;
	g_signal_connect_object ((GObject*) _tmp33_, "notify::trust-level", (GCallback) __folks_individual_aggregator_trust_level_changed_cb_g_object_notify, self, 0);
	_tmp34_ = _data1_->store;
	folks_persona_store_prepare (_tmp34_, __lambda5__gasync_ready_callback, block1_data_ref (_data1_));
	block1_data_unref (_data1_);
	_data1_ = NULL;
}


static void _folks_individual_aggregator_backend_persona_store_removed_cb (FolksIndividualAggregator* self, FolksBackend* backend, FolksPersonaStore* store) {
	FolksPersonaStore* _tmp0_;
	guint _tmp1_ = 0U;
	FolksPersonaStore* _tmp2_;
	guint _tmp3_ = 0U;
	GQuark _tmp4_ = 0U;
	FolksPersonaStore* _tmp5_;
	guint _tmp6_ = 0U;
	GQuark _tmp7_ = 0U;
	FolksPersonaStore* _tmp8_;
	FolksPersonaStore* _tmp9_;
	GeeHashMap* _tmp10_;
	FolksPersonaStore* _tmp11_;
	const gchar* _tmp12_;
	const gchar* _tmp13_;
	FolksPersonaStore* _tmp14_;
	const gchar* _tmp15_;
	const gchar* _tmp16_;
	gchar* _tmp17_ = NULL;
	gchar* _tmp18_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (backend != NULL);
	g_return_if_fail (store != NULL);
	_tmp0_ = store;
	g_signal_parse_name ("personas-changed", FOLKS_TYPE_PERSONA_STORE, &_tmp1_, NULL, FALSE);
	g_signal_handlers_disconnect_matched (_tmp0_, G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, _tmp1_, 0, NULL, (GCallback) __folks_individual_aggregator_personas_changed_cb_folks_persona_store_personas_changed, self);
	_tmp2_ = store;
	g_signal_parse_name ("notify::trust-level", G_TYPE_OBJECT, &_tmp3_, &_tmp4_, TRUE);
	g_signal_handlers_disconnect_matched ((GObject*) _tmp2_, G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DETAIL | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, _tmp3_, _tmp4_, NULL, (GCallback) __folks_individual_aggregator_trust_level_changed_cb_g_object_notify, self);
	_tmp5_ = store;
	g_signal_parse_name ("notify::is-writeable", G_TYPE_OBJECT, &_tmp6_, &_tmp7_, TRUE);
	g_signal_handlers_disconnect_matched ((GObject*) _tmp5_, G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DETAIL | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, _tmp6_, _tmp7_, NULL, (GCallback) __folks_individual_aggregator_is_writeable_changed_cb_g_object_notify, self);
	_tmp8_ = self->priv->_writeable_store;
	_tmp9_ = store;
	if (_tmp8_ == _tmp9_) {
		self->priv->_writeable_store = NULL;
	}
	_tmp10_ = self->priv->_stores;
	_tmp11_ = store;
	_tmp12_ = folks_persona_store_get_type_id (_tmp11_);
	_tmp13_ = _tmp12_;
	_tmp14_ = store;
	_tmp15_ = folks_persona_store_get_id (_tmp14_);
	_tmp16_ = _tmp15_;
	_tmp17_ = _folks_individual_aggregator_get_store_full_id (self, _tmp13_, _tmp16_);
	_tmp18_ = _tmp17_;
	gee_abstract_map_unset ((GeeAbstractMap*) _tmp10_, _tmp18_, NULL);
	_g_free0 (_tmp18_);
}


static gchar* _folks_individual_aggregator_get_store_full_id (FolksIndividualAggregator* self, const gchar* type_id, const gchar* id) {
	gchar* result = NULL;
	const gchar* _tmp0_;
	gchar* _tmp1_;
	gchar* _tmp2_;
	const gchar* _tmp3_;
	gchar* _tmp4_;
	gchar* _tmp5_;
	g_return_val_if_fail (self != NULL, NULL);
	g_return_val_if_fail (type_id != NULL, NULL);
	g_return_val_if_fail (id != NULL, NULL);
	_tmp0_ = type_id;
	_tmp1_ = g_strconcat (_tmp0_, ":", NULL);
	_tmp2_ = _tmp1_;
	_tmp3_ = id;
	_tmp4_ = g_strconcat (_tmp2_, _tmp3_, NULL);
	_tmp5_ = _tmp4_;
	_g_free0 (_tmp2_);
	result = _tmp5_;
	return result;
}


static void _folks_individual_aggregator_emit_individuals_changed (FolksIndividualAggregator* self, GeeSet* added, GeeSet* removed, const gchar* message, FolksPersona* actor, FolksGroupDetailsChangeReason reason) {
	GeeSet* _tmp0_;
	GeeSet* _tmp1_;
	GeeSet* _added;
	GeeSet* _tmp2_;
	GeeSet* _tmp3_;
	GeeSet* _removed;
	gboolean _tmp4_ = FALSE;
	gboolean _tmp5_ = FALSE;
	GeeSet* _tmp6_;
	gboolean _tmp10_;
	gboolean _tmp17_;
	GeeSet* _tmp22_;
	GeeSet* _tmp23_;
	GeeSet* _tmp24_;
	GeeSet* _tmp25_;
	GeeSet* _tmp26_;
	GeeSet* _tmp27_;
	GeeSet* _tmp28_;
	GeeSet* _tmp29_;
	const gchar* _tmp30_;
	FolksPersona* _tmp31_;
	FolksGroupDetailsChangeReason _tmp32_;
	g_return_if_fail (self != NULL);
	_tmp0_ = added;
	_tmp1_ = _g_object_ref0 (_tmp0_);
	_added = _tmp1_;
	_tmp2_ = removed;
	_tmp3_ = _g_object_ref0 (_tmp2_);
	_removed = _tmp3_;
	_tmp6_ = added;
	if (_tmp6_ == NULL) {
		_tmp5_ = TRUE;
	} else {
		GeeSet* _tmp7_;
		gint _tmp8_;
		gint _tmp9_;
		_tmp7_ = added;
		_tmp8_ = gee_collection_get_size ((GeeCollection*) _tmp7_);
		_tmp9_ = _tmp8_;
		_tmp5_ = _tmp9_ == 0;
	}
	_tmp10_ = _tmp5_;
	if (_tmp10_) {
		gboolean _tmp11_ = FALSE;
		GeeSet* _tmp12_;
		gboolean _tmp16_;
		_tmp12_ = removed;
		if (_tmp12_ == NULL) {
			_tmp11_ = TRUE;
		} else {
			GeeSet* _tmp13_;
			gint _tmp14_;
			gint _tmp15_;
			_tmp13_ = removed;
			_tmp14_ = gee_collection_get_size ((GeeCollection*) _tmp13_);
			_tmp15_ = _tmp14_;
			_tmp11_ = _tmp15_ == 0;
		}
		_tmp16_ = _tmp11_;
		_tmp4_ = _tmp16_;
	} else {
		_tmp4_ = FALSE;
	}
	_tmp17_ = _tmp4_;
	if (_tmp17_) {
		_g_object_unref0 (_removed);
		_g_object_unref0 (_added);
		return;
	} else {
		GeeSet* _tmp18_;
		_tmp18_ = added;
		if (_tmp18_ == NULL) {
			GeeHashSet* _tmp19_;
			_tmp19_ = gee_hash_set_new (FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL);
			_g_object_unref0 (_added);
			_added = (GeeSet*) _tmp19_;
		} else {
			GeeSet* _tmp20_;
			_tmp20_ = removed;
			if (_tmp20_ == NULL) {
				GeeHashSet* _tmp21_;
				_tmp21_ = gee_hash_set_new (FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL);
				_g_object_unref0 (_removed);
				_removed = (GeeSet*) _tmp21_;
			}
		}
	}
	_tmp22_ = _added;
	_tmp23_ = gee_set_get_read_only_view (_tmp22_);
	_tmp24_ = _tmp23_;
	_tmp25_ = _tmp24_;
	_tmp26_ = _removed;
	_tmp27_ = gee_set_get_read_only_view (_tmp26_);
	_tmp28_ = _tmp27_;
	_tmp29_ = _tmp28_;
	_tmp30_ = message;
	_tmp31_ = actor;
	_tmp32_ = reason;
	g_signal_emit_by_name (self, "individuals-changed", _tmp25_, _tmp29_, _tmp30_, _tmp31_, _tmp32_);
	_g_object_unref0 (_tmp29_);
	_g_object_unref0 (_tmp25_);
	_g_object_unref0 (_removed);
	_g_object_unref0 (_added);
}


static void __folks_individual_aggregator_individual_removed_cb_folks_individual_removed (FolksIndividual* _sender, FolksIndividual* replacement_individual, gpointer self) {
	_folks_individual_aggregator_individual_removed_cb (self, _sender, replacement_individual);
}


static void _folks_individual_aggregator_connect_to_individual (FolksIndividualAggregator* self, FolksIndividual* individual) {
	FolksIndividual* _tmp0_;
	GeeMap* _tmp1_;
	FolksIndividual* _tmp2_;
	const gchar* _tmp3_;
	const gchar* _tmp4_;
	FolksIndividual* _tmp5_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (individual != NULL);
	_tmp0_ = individual;
	g_signal_connect_object (_tmp0_, "removed", (GCallback) __folks_individual_aggregator_individual_removed_cb_folks_individual_removed, self, 0);
	_tmp1_ = self->priv->_individuals;
	_tmp2_ = individual;
	_tmp3_ = folks_individual_get_id (_tmp2_);
	_tmp4_ = _tmp3_;
	_tmp5_ = individual;
	gee_map_set (_tmp1_, _tmp4_, _tmp5_);
}


static void _folks_individual_aggregator_disconnect_from_individual (FolksIndividualAggregator* self, FolksIndividual* individual) {
	GeeMap* _tmp0_;
	FolksIndividual* _tmp1_;
	const gchar* _tmp2_;
	const gchar* _tmp3_;
	FolksIndividual* _tmp4_;
	guint _tmp5_ = 0U;
	g_return_if_fail (self != NULL);
	g_return_if_fail (individual != NULL);
	_tmp0_ = self->priv->_individuals;
	_tmp1_ = individual;
	_tmp2_ = folks_individual_get_id (_tmp1_);
	_tmp3_ = _tmp2_;
	gee_map_unset (_tmp0_, _tmp3_, NULL);
	_tmp4_ = individual;
	g_signal_parse_name ("removed", FOLKS_TYPE_INDIVIDUAL, &_tmp5_, NULL, FALSE);
	g_signal_handlers_disconnect_matched (_tmp4_, G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, _tmp5_, 0, NULL, (GCallback) __folks_individual_aggregator_individual_removed_cb_folks_individual_removed, self);
}


static Block2Data* block2_data_ref (Block2Data* _data2_) {
	g_atomic_int_inc (&_data2_->_ref_count_);
	return _data2_;
}


static void block2_data_unref (Block2Data* _data2_) {
	if (g_atomic_int_dec_and_test (&_data2_->_ref_count_)) {
		_g_object_unref0 (_data2_->self);
		_g_object_unref0 (_data2_->final_individual);
		_g_object_unref0 (_data2_->candidate_inds);
		g_slice_free (Block2Data, _data2_);
	}
}


static Block3Data* block3_data_ref (Block3Data* _data3_) {
	g_atomic_int_inc (&_data3_->_ref_count_);
	return _data3_;
}


static void block3_data_unref (Block3Data* _data3_) {
	if (g_atomic_int_dec_and_test (&_data3_->_ref_count_)) {
		block2_data_unref (_data3_->_data2_);
		_data3_->_data2_ = NULL;
		g_slice_free (Block3Data, _data3_);
	}
}


static void _lambda3_ (const gchar* l, Block3Data* _data3_) {
	Block2Data* _data2_;
	FolksIndividualAggregator * self;
	const gchar* _tmp0_;
	const gchar* prop_linking_value;
	GHashTable* _tmp1_;
	const gchar* _tmp2_;
	gconstpointer _tmp3_ = NULL;
	FolksIndividual* _tmp4_;
	FolksIndividual* candidate_ind;
	gboolean _tmp5_ = FALSE;
	gboolean _tmp6_ = FALSE;
	FolksIndividual* _tmp7_;
	gboolean _tmp11_;
	gboolean _tmp15_;
	_data2_ = _data3_->_data2_;
	self = _data2_->self;
	g_return_if_fail (l != NULL);
	_tmp0_ = l;
	prop_linking_value = _tmp0_;
	_tmp1_ = self->priv->_link_map;
	_tmp2_ = prop_linking_value;
	_tmp3_ = g_hash_table_lookup (_tmp1_, _tmp2_);
	_tmp4_ = _g_object_ref0 ((FolksIndividual*) _tmp3_);
	candidate_ind = _tmp4_;
	_tmp7_ = candidate_ind;
	if (_tmp7_ != NULL) {
		FolksIndividual* _tmp8_;
		FolksTrustLevel _tmp9_;
		FolksTrustLevel _tmp10_;
		_tmp8_ = candidate_ind;
		_tmp9_ = folks_individual_get_trust_level (_tmp8_);
		_tmp10_ = _tmp9_;
		_tmp6_ = _tmp10_ != FOLKS_TRUST_LEVEL_NONE;
	} else {
		_tmp6_ = FALSE;
	}
	_tmp11_ = _tmp6_;
	if (_tmp11_) {
		GeeHashSet* _tmp12_;
		FolksIndividual* _tmp13_;
		gboolean _tmp14_ = FALSE;
		_tmp12_ = _data2_->candidate_inds;
		_tmp13_ = candidate_ind;
		_tmp14_ = gee_abstract_collection_contains ((GeeAbstractCollection*) _tmp12_, _tmp13_);
		_tmp5_ = !_tmp14_;
	} else {
		_tmp5_ = FALSE;
	}
	_tmp15_ = _tmp5_;
	if (_tmp15_) {
		FolksIndividual* _tmp16_;
		const gchar* _tmp17_;
		const gchar* _tmp18_;
		const gchar* _tmp19_;
		const gchar* _tmp20_;
		GeeHashSet* _tmp21_;
		FolksIndividual* _tmp22_;
		_tmp16_ = candidate_ind;
		_tmp17_ = folks_individual_get_id (_tmp16_);
		_tmp18_ = _tmp17_;
		_tmp19_ = _data3_->prop_name;
		_tmp20_ = prop_linking_value;
		g_debug ("    Found candidate individual '%s' by " "linkable property '%s' = '%s'.", _tmp18_, _tmp19_, _tmp20_);
		_tmp21_ = _data2_->candidate_inds;
		_tmp22_ = candidate_ind;
		gee_abstract_collection_add ((GeeAbstractCollection*) _tmp21_, _tmp22_);
	}
	_g_object_unref0 (candidate_ind);
}


static void __lambda3__folks_persona_linkable_property_callback (const gchar* link, gpointer self) {
	_lambda3_ (link, self);
}


static void _lambda4_ (const gchar* l, Block2Data* _data2_) {
	FolksIndividualAggregator * self;
	const gchar* _tmp0_;
	const gchar* prop_linking_value;
	const gchar* _tmp1_;
	GHashTable* _tmp2_;
	const gchar* _tmp3_;
	gchar* _tmp4_;
	FolksIndividual* _tmp5_;
	FolksIndividual* _tmp6_;
	self = _data2_->self;
	g_return_if_fail (l != NULL);
	_tmp0_ = l;
	prop_linking_value = _tmp0_;
	_tmp1_ = prop_linking_value;
	g_debug ("individual-aggregator.vala:751:             %s", _tmp1_);
	_tmp2_ = self->priv->_link_map;
	_tmp3_ = prop_linking_value;
	_tmp4_ = g_strdup (_tmp3_);
	_tmp5_ = _data2_->final_individual;
	_tmp6_ = _g_object_ref0 (_tmp5_);
	g_hash_table_replace (_tmp2_, _tmp4_, _tmp6_);
}


static void __lambda4__folks_persona_linkable_property_callback (const gchar* link, gpointer self) {
	_lambda4_ (link, self);
}


static void _folks_individual_aggregator_add_personas (FolksIndividualAggregator* self, GeeSet* added, GeeHashSet** added_individuals, GeeHashMap** replaced_individuals, FolksIndividual** user) {
	GeeHashSet* _tmp0_;
	GeeHashSet* almost_added_individuals;
	g_return_if_fail (self != NULL);
	g_return_if_fail (added != NULL);
	g_return_if_fail (added_individuals != NULL);
	g_return_if_fail (replaced_individuals != NULL);
	g_return_if_fail (user != NULL);
	_tmp0_ = gee_hash_set_new (FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL);
	almost_added_individuals = _tmp0_;
	{
		GeeSet* _tmp1_;
		GeeIterator* _tmp2_ = NULL;
		GeeIterator* _persona_it;
		_tmp1_ = added;
		_tmp2_ = gee_iterable_iterator ((GeeIterable*) _tmp1_);
		_persona_it = _tmp2_;
		while (TRUE) {
			Block2Data* _data2_;
			GeeIterator* _tmp3_;
			gboolean _tmp4_ = FALSE;
			GeeIterator* _tmp5_;
			gpointer _tmp6_ = NULL;
			FolksPersona* persona;
			FolksPersona* _tmp7_;
			FolksPersonaStore* _tmp8_;
			FolksPersonaStore* _tmp9_;
			FolksPersonaStoreTrust _tmp10_;
			FolksPersonaStoreTrust _tmp11_;
			FolksPersonaStoreTrust trust_level;
			GeeHashSet* _tmp12_;
			GeeHashSet* _tmp13_;
			GeeHashSet* final_personas;
			FolksPersona* _tmp14_;
			const gchar* _tmp15_;
			const gchar* _tmp16_;
			FolksPersona* _tmp17_;
			const gchar* _tmp18_;
			const gchar* _tmp19_;
			gboolean _tmp20_ = FALSE;
			FolksPersona* _tmp21_;
			gboolean _tmp22_;
			gboolean _tmp23_;
			gboolean _tmp25_;
			FolksPersonaStoreTrust _tmp31_;
			FolksPersona* _tmp57_;
			FolksPersonaStore* _tmp58_;
			FolksPersonaStore* _tmp59_;
			FolksPersonaStoreTrust _tmp60_;
			FolksPersonaStoreTrust _tmp61_;
			GeeHashSet* _tmp75_;
			FolksPersona* _tmp76_;
			gboolean _tmp77_ = FALSE;
			GeeHashSet* _tmp78_;
			gint _tmp79_;
			gint _tmp80_;
			gboolean _tmp82_;
			GeeHashSet* _tmp96_;
			FolksIndividual* _tmp97_;
			FolksIndividual* _tmp98_;
			const gchar* _tmp99_;
			const gchar* _tmp100_;
			FolksIndividual* _tmp158_;
			gboolean _tmp159_;
			gboolean _tmp160_;
			GeeHashSet* _tmp163_;
			FolksIndividual* _tmp164_;
			_data2_ = g_slice_new0 (Block2Data);
			_data2_->_ref_count_ = 1;
			_data2_->self = g_object_ref (self);
			_tmp3_ = _persona_it;
			_tmp4_ = gee_iterator_next (_tmp3_);
			if (!_tmp4_) {
				block2_data_unref (_data2_);
				_data2_ = NULL;
				break;
			}
			_tmp5_ = _persona_it;
			_tmp6_ = gee_iterator_get (_tmp5_);
			persona = (FolksPersona*) _tmp6_;
			_tmp7_ = persona;
			_tmp8_ = folks_persona_get_store (_tmp7_);
			_tmp9_ = _tmp8_;
			_tmp10_ = folks_persona_store_get_trust_level (_tmp9_);
			_tmp11_ = _tmp10_;
			trust_level = _tmp11_;
			_tmp12_ = gee_hash_set_new (FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL);
			_data2_->candidate_inds = _tmp12_;
			_tmp13_ = gee_hash_set_new (FOLKS_TYPE_PERSONA, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL);
			final_personas = _tmp13_;
			_data2_->final_individual = NULL;
			_tmp14_ = persona;
			_tmp15_ = folks_persona_get_uid (_tmp14_);
			_tmp16_ = _tmp15_;
			_tmp17_ = persona;
			_tmp18_ = folks_persona_get_iid (_tmp17_);
			_tmp19_ = _tmp18_;
			g_debug ("individual-aggregator.vala:616: Aggregating persona '%s' on '%s'.", _tmp16_, _tmp19_);
			_tmp21_ = persona;
			_tmp22_ = folks_persona_get_is_user (_tmp21_);
			_tmp23_ = _tmp22_;
			if (_tmp23_ == TRUE) {
				FolksIndividual* _tmp24_;
				_tmp24_ = *user;
				_tmp20_ = _tmp24_ != NULL;
			} else {
				_tmp20_ = FALSE;
			}
			_tmp25_ = _tmp20_;
			if (_tmp25_) {
				FolksIndividual* _tmp26_;
				const gchar* _tmp27_;
				const gchar* _tmp28_;
				GeeHashSet* _tmp29_;
				FolksIndividual* _tmp30_;
				_tmp26_ = *user;
				_tmp27_ = folks_individual_get_id (_tmp26_);
				_tmp28_ = _tmp27_;
				g_debug ("individual-aggregator.vala:622:     Found candidate individual '%s' as" \
" user.", _tmp28_);
				_tmp29_ = _data2_->candidate_inds;
				_tmp30_ = *user;
				gee_abstract_collection_add ((GeeAbstractCollection*) _tmp29_, _tmp30_);
			}
			_tmp31_ = trust_level;
			if (_tmp31_ != FOLKS_PERSONA_STORE_TRUST_NONE) {
				GHashTable* _tmp32_;
				FolksPersona* _tmp33_;
				const gchar* _tmp34_;
				const gchar* _tmp35_;
				gconstpointer _tmp36_ = NULL;
				FolksIndividual* _tmp37_;
				FolksIndividual* candidate_ind;
				gboolean _tmp38_ = FALSE;
				gboolean _tmp39_ = FALSE;
				FolksIndividual* _tmp40_;
				gboolean _tmp44_;
				gboolean _tmp48_;
				_tmp32_ = self->priv->_link_map;
				_tmp33_ = persona;
				_tmp34_ = folks_persona_get_iid (_tmp33_);
				_tmp35_ = _tmp34_;
				_tmp36_ = g_hash_table_lookup (_tmp32_, _tmp35_);
				_tmp37_ = _g_object_ref0 ((FolksIndividual*) _tmp36_);
				candidate_ind = _tmp37_;
				_tmp40_ = candidate_ind;
				if (_tmp40_ != NULL) {
					FolksIndividual* _tmp41_;
					FolksTrustLevel _tmp42_;
					FolksTrustLevel _tmp43_;
					_tmp41_ = candidate_ind;
					_tmp42_ = folks_individual_get_trust_level (_tmp41_);
					_tmp43_ = _tmp42_;
					_tmp39_ = _tmp43_ != FOLKS_TRUST_LEVEL_NONE;
				} else {
					_tmp39_ = FALSE;
				}
				_tmp44_ = _tmp39_;
				if (_tmp44_) {
					GeeHashSet* _tmp45_;
					FolksIndividual* _tmp46_;
					gboolean _tmp47_ = FALSE;
					_tmp45_ = _data2_->candidate_inds;
					_tmp46_ = candidate_ind;
					_tmp47_ = gee_abstract_collection_contains ((GeeAbstractCollection*) _tmp45_, _tmp46_);
					_tmp38_ = !_tmp47_;
				} else {
					_tmp38_ = FALSE;
				}
				_tmp48_ = _tmp38_;
				if (_tmp48_) {
					FolksIndividual* _tmp49_;
					const gchar* _tmp50_;
					const gchar* _tmp51_;
					FolksPersona* _tmp52_;
					const gchar* _tmp53_;
					const gchar* _tmp54_;
					GeeHashSet* _tmp55_;
					FolksIndividual* _tmp56_;
					_tmp49_ = candidate_ind;
					_tmp50_ = folks_individual_get_id (_tmp49_);
					_tmp51_ = _tmp50_;
					_tmp52_ = persona;
					_tmp53_ = folks_persona_get_iid (_tmp52_);
					_tmp54_ = _tmp53_;
					g_debug ("individual-aggregator.vala:635:     Found candidate individual '%s' by" \
" IID '%s'.", _tmp51_, _tmp54_);
					_tmp55_ = _data2_->candidate_inds;
					_tmp56_ = candidate_ind;
					gee_abstract_collection_add ((GeeAbstractCollection*) _tmp55_, _tmp56_);
				}
				_g_object_unref0 (candidate_ind);
			}
			_tmp57_ = persona;
			_tmp58_ = folks_persona_get_store (_tmp57_);
			_tmp59_ = _tmp58_;
			_tmp60_ = folks_persona_store_get_trust_level (_tmp59_);
			_tmp61_ = _tmp60_;
			if (_tmp61_ == FOLKS_PERSONA_STORE_TRUST_FULL) {
				FolksPersona* _tmp62_;
				gchar** _tmp63_;
				gint _tmp63__length1;
				gchar** _tmp64_;
				gint _tmp64__length1;
				_tmp62_ = persona;
				_tmp63_ = folks_persona_get_linkable_properties (_tmp62_, &_tmp63__length1);
				_tmp64_ = _tmp63_;
				_tmp64__length1 = _tmp63__length1;
				{
					gchar** foo_collection = NULL;
					gint foo_collection_length1 = 0;
					gint _foo_collection_size_ = 0;
					gint foo_it = 0;
					foo_collection = _tmp64_;
					foo_collection_length1 = _tmp64__length1;
					for (foo_it = 0; foo_it < _tmp64__length1; foo_it = foo_it + 1) {
						const gchar* foo = NULL;
						foo = foo_collection[foo_it];
						{
							Block3Data* _data3_;
							const gchar* _tmp65_;
							FolksPersona* _tmp66_;
							GObjectClass* _tmp67_ = NULL;
							GObjectClass* pclass;
							GObjectClass* _tmp68_;
							const gchar* _tmp69_;
							GParamSpec* _tmp70_ = NULL;
							FolksPersona* _tmp73_;
							const gchar* _tmp74_;
							_data3_ = g_slice_new0 (Block3Data);
							_data3_->_ref_count_ = 1;
							_data3_->_data2_ = block2_data_ref (_data2_);
							_tmp65_ = foo;
							_data3_->prop_name = _tmp65_;
							_tmp66_ = persona;
							_tmp67_ = G_OBJECT_GET_CLASS ((GObject*) _tmp66_);
							pclass = _tmp67_;
							_tmp68_ = pclass;
							_tmp69_ = _data3_->prop_name;
							_tmp70_ = g_object_class_find_property (_tmp68_, _tmp69_);
							if (_tmp70_ == NULL) {
								const gchar* _tmp71_ = NULL;
								const gchar* _tmp72_;
								_tmp71_ = _ ("Unknown property '%s' in linkable property list.");
								_tmp72_ = _data3_->prop_name;
								g_warning (_tmp71_, _tmp72_);
								block3_data_unref (_data3_);
								_data3_ = NULL;
								continue;
							}
							_tmp73_ = persona;
							_tmp74_ = _data3_->prop_name;
							folks_persona_linkable_property_to_links (_tmp73_, _tmp74_, __lambda3__folks_persona_linkable_property_callback, _data3_);
							block3_data_unref (_data3_);
							_data3_ = NULL;
						}
					}
				}
			}
			_tmp75_ = final_personas;
			_tmp76_ = persona;
			gee_abstract_collection_add ((GeeAbstractCollection*) _tmp75_, _tmp76_);
			_tmp78_ = _data2_->candidate_inds;
			_tmp79_ = gee_collection_get_size ((GeeCollection*) _tmp78_);
			_tmp80_ = _tmp79_;
			if (_tmp80_ > 0) {
				gboolean _tmp81_;
				_tmp81_ = self->priv->_linking_enabled;
				_tmp77_ = _tmp81_ == TRUE;
			} else {
				_tmp77_ = FALSE;
			}
			_tmp82_ = _tmp77_;
			if (_tmp82_) {
				{
					GeeHashSet* _tmp83_;
					GeeIterator* _tmp84_ = NULL;
					GeeIterator* _individual_it;
					_tmp83_ = _data2_->candidate_inds;
					_tmp84_ = gee_abstract_collection_iterator ((GeeAbstractCollection*) _tmp83_);
					_individual_it = _tmp84_;
					while (TRUE) {
						GeeIterator* _tmp85_;
						gboolean _tmp86_ = FALSE;
						GeeIterator* _tmp87_;
						gpointer _tmp88_ = NULL;
						FolksIndividual* individual;
						GeeHashSet* _tmp89_;
						FolksIndividual* _tmp90_;
						GeeSet* _tmp91_;
						GeeSet* _tmp92_;
						_tmp85_ = _individual_it;
						_tmp86_ = gee_iterator_next (_tmp85_);
						if (!_tmp86_) {
							break;
						}
						_tmp87_ = _individual_it;
						_tmp88_ = gee_iterator_get (_tmp87_);
						individual = (FolksIndividual*) _tmp88_;
						_tmp89_ = final_personas;
						_tmp90_ = individual;
						_tmp91_ = folks_individual_get_personas (_tmp90_);
						_tmp92_ = _tmp91_;
						gee_abstract_collection_add_all ((GeeAbstractCollection*) _tmp89_, (GeeCollection*) _tmp92_);
						_g_object_unref0 (individual);
					}
					_g_object_unref0 (_individual_it);
				}
			} else {
				GeeHashSet* _tmp93_;
				gint _tmp94_;
				gint _tmp95_;
				_tmp93_ = _data2_->candidate_inds;
				_tmp94_ = gee_collection_get_size ((GeeCollection*) _tmp93_);
				_tmp95_ = _tmp94_;
				if (_tmp95_ > 0) {
					g_debug ("individual-aggregator.vala:699:     Linking disabled.");
				} else {
					g_debug ("individual-aggregator.vala:703:     Did not find any candidate individ" \
"uals.");
				}
			}
			_tmp96_ = final_personas;
			_tmp97_ = folks_individual_new ((GeeSet*) _tmp96_);
			_g_object_unref0 (_data2_->final_individual);
			_data2_->final_individual = _tmp97_;
			_tmp98_ = _data2_->final_individual;
			_tmp99_ = folks_individual_get_id (_tmp98_);
			_tmp100_ = _tmp99_;
			g_debug ("individual-aggregator.vala:708:     Created new individual '%s' with p" \
"ersonas:", _tmp100_);
			{
				GeeHashSet* _tmp101_;
				GeeIterator* _tmp102_ = NULL;
				GeeIterator* _p_it;
				_tmp101_ = final_personas;
				_tmp102_ = gee_abstract_collection_iterator ((GeeAbstractCollection*) _tmp101_);
				_p_it = _tmp102_;
				while (TRUE) {
					GeeIterator* _tmp103_;
					gboolean _tmp104_ = FALSE;
					GeeIterator* _tmp105_;
					gpointer _tmp106_ = NULL;
					FolksPersona* p;
					FolksPersona* _tmp107_;
					FolksPersona* _tmp108_;
					FolksPersona* final_persona;
					const gchar* _tmp109_ = NULL;
					FolksPersona* _tmp110_;
					gboolean _tmp111_;
					gboolean _tmp112_;
					FolksPersona* _tmp113_;
					const gchar* _tmp114_;
					const gchar* _tmp115_;
					const gchar* _tmp116_;
					FolksPersona* _tmp117_;
					const gchar* _tmp118_;
					const gchar* _tmp119_;
					GHashTable* _tmp120_;
					FolksPersona* _tmp121_;
					const gchar* _tmp122_;
					const gchar* _tmp123_;
					gchar* _tmp124_;
					FolksIndividual* _tmp125_;
					FolksIndividual* _tmp126_;
					FolksPersona* _tmp127_;
					FolksPersonaStore* _tmp128_;
					FolksPersonaStore* _tmp129_;
					FolksPersonaStoreTrust _tmp130_;
					FolksPersonaStoreTrust _tmp131_;
					_tmp103_ = _p_it;
					_tmp104_ = gee_iterator_next (_tmp103_);
					if (!_tmp104_) {
						break;
					}
					_tmp105_ = _p_it;
					_tmp106_ = gee_iterator_get (_tmp105_);
					p = (FolksPersona*) _tmp106_;
					_tmp107_ = p;
					_tmp108_ = _g_object_ref0 (FOLKS_PERSONA (_tmp107_));
					final_persona = _tmp108_;
					_tmp110_ = final_persona;
					_tmp111_ = folks_persona_get_is_user (_tmp110_);
					_tmp112_ = _tmp111_;
					if (_tmp112_) {
						_tmp109_ = "yes";
					} else {
						_tmp109_ = "no";
					}
					_tmp113_ = final_persona;
					_tmp114_ = folks_persona_get_uid (_tmp113_);
					_tmp115_ = _tmp114_;
					_tmp116_ = _tmp109_;
					_tmp117_ = final_persona;
					_tmp118_ = folks_persona_get_iid (_tmp117_);
					_tmp119_ = _tmp118_;
					g_debug ("individual-aggregator.vala:714:         %s (is user: %s, IID: %s)", _tmp115_, _tmp116_, _tmp119_);
					_tmp120_ = self->priv->_link_map;
					_tmp121_ = final_persona;
					_tmp122_ = folks_persona_get_iid (_tmp121_);
					_tmp123_ = _tmp122_;
					_tmp124_ = g_strdup (_tmp123_);
					_tmp125_ = _data2_->final_individual;
					_tmp126_ = _g_object_ref0 (_tmp125_);
					g_hash_table_replace (_tmp120_, _tmp124_, _tmp126_);
					_tmp127_ = final_persona;
					_tmp128_ = folks_persona_get_store (_tmp127_);
					_tmp129_ = _tmp128_;
					_tmp130_ = folks_persona_store_get_trust_level (_tmp129_);
					_tmp131_ = _tmp130_;
					if (_tmp131_ == FOLKS_PERSONA_STORE_TRUST_FULL) {
						FolksPersona* _tmp132_;
						gchar** _tmp133_;
						gint _tmp133__length1;
						gchar** _tmp134_;
						gint _tmp134__length1;
						g_debug ("individual-aggregator.vala:727:         Inserting links:");
						_tmp132_ = final_persona;
						_tmp133_ = folks_persona_get_linkable_properties (_tmp132_, &_tmp133__length1);
						_tmp134_ = _tmp133_;
						_tmp134__length1 = _tmp133__length1;
						{
							gchar** prop_name_collection = NULL;
							gint prop_name_collection_length1 = 0;
							gint _prop_name_collection_size_ = 0;
							gint prop_name_it = 0;
							prop_name_collection = _tmp134_;
							prop_name_collection_length1 = _tmp134__length1;
							for (prop_name_it = 0; prop_name_it < _tmp134__length1; prop_name_it = prop_name_it + 1) {
								const gchar* prop_name = NULL;
								prop_name = prop_name_collection[prop_name_it];
								{
									FolksPersona* _tmp135_;
									GObjectClass* _tmp136_ = NULL;
									GObjectClass* pclass;
									GObjectClass* _tmp137_;
									const gchar* _tmp138_;
									GParamSpec* _tmp139_ = NULL;
									FolksPersona* _tmp142_;
									const gchar* _tmp143_;
									_tmp135_ = final_persona;
									_tmp136_ = G_OBJECT_GET_CLASS ((GObject*) _tmp135_);
									pclass = _tmp136_;
									_tmp137_ = pclass;
									_tmp138_ = prop_name;
									_tmp139_ = g_object_class_find_property (_tmp137_, _tmp138_);
									if (_tmp139_ == NULL) {
										const gchar* _tmp140_ = NULL;
										const gchar* _tmp141_;
										_tmp140_ = _ ("Unknown property '%s' in linkable property list.");
										_tmp141_ = prop_name;
										g_warning (_tmp140_, _tmp141_);
										continue;
									}
									_tmp142_ = final_persona;
									_tmp143_ = prop_name;
									folks_persona_linkable_property_to_links (_tmp142_, _tmp143_, __lambda4__folks_persona_linkable_property_callback, _data2_);
								}
							}
						}
					}
					_g_object_unref0 (final_persona);
					_g_object_unref0 (p);
				}
				_g_object_unref0 (_p_it);
			}
			{
				GeeHashSet* _tmp144_;
				GeeIterator* _tmp145_ = NULL;
				GeeIterator* _i_it;
				_tmp144_ = _data2_->candidate_inds;
				_tmp145_ = gee_abstract_collection_iterator ((GeeAbstractCollection*) _tmp144_);
				_i_it = _tmp145_;
				while (TRUE) {
					GeeIterator* _tmp146_;
					gboolean _tmp147_ = FALSE;
					GeeIterator* _tmp148_;
					gpointer _tmp149_ = NULL;
					FolksIndividual* i;
					GeeHashSet* _tmp150_;
					FolksIndividual* _tmp151_;
					gboolean _tmp152_ = FALSE;
					_tmp146_ = _i_it;
					_tmp147_ = gee_iterator_next (_tmp146_);
					if (!_tmp147_) {
						break;
					}
					_tmp148_ = _i_it;
					_tmp149_ = gee_iterator_get (_tmp148_);
					i = (FolksIndividual*) _tmp149_;
					_tmp150_ = almost_added_individuals;
					_tmp151_ = i;
					_tmp152_ = gee_abstract_collection_contains ((GeeAbstractCollection*) _tmp150_, _tmp151_);
					if (_tmp152_ == TRUE) {
						GeeHashSet* _tmp153_;
						FolksIndividual* _tmp154_;
						_tmp153_ = almost_added_individuals;
						_tmp154_ = i;
						gee_abstract_collection_remove ((GeeAbstractCollection*) _tmp153_, _tmp154_);
					} else {
						GeeHashMap* _tmp155_;
						FolksIndividual* _tmp156_;
						FolksIndividual* _tmp157_;
						_tmp155_ = *replaced_individuals;
						_tmp156_ = i;
						_tmp157_ = _data2_->final_individual;
						gee_abstract_map_set ((GeeAbstractMap*) _tmp155_, _tmp156_, _tmp157_);
					}
					_g_object_unref0 (i);
				}
				_g_object_unref0 (_i_it);
			}
			_tmp158_ = _data2_->final_individual;
			_tmp159_ = folks_individual_get_is_user (_tmp158_);
			_tmp160_ = _tmp159_;
			if (_tmp160_ == TRUE) {
				FolksIndividual* _tmp161_;
				FolksIndividual* _tmp162_;
				_tmp161_ = _data2_->final_individual;
				_tmp162_ = _g_object_ref0 (_tmp161_);
				_g_object_unref0 (*user);
				*user = _tmp162_;
			}
			_tmp163_ = almost_added_individuals;
			_tmp164_ = _data2_->final_individual;
			gee_abstract_collection_add ((GeeAbstractCollection*) _tmp163_, _tmp164_);
			_g_object_unref0 (final_personas);
			_g_object_unref0 (persona);
			block2_data_unref (_data2_);
			_data2_ = NULL;
		}
		_g_object_unref0 (_persona_it);
	}
	{
		GeeHashSet* _tmp165_;
		GeeIterator* _tmp166_ = NULL;
		GeeIterator* _i_it;
		_tmp165_ = almost_added_individuals;
		_tmp166_ = gee_abstract_collection_iterator ((GeeAbstractCollection*) _tmp165_);
		_i_it = _tmp166_;
		while (TRUE) {
			GeeIterator* _tmp167_;
			gboolean _tmp168_ = FALSE;
			GeeIterator* _tmp169_;
			gpointer _tmp170_ = NULL;
			FolksIndividual* i;
			GeeHashSet* _tmp171_;
			FolksIndividual* _tmp172_;
			FolksIndividual* _tmp173_;
			_tmp167_ = _i_it;
			_tmp168_ = gee_iterator_next (_tmp167_);
			if (!_tmp168_) {
				break;
			}
			_tmp169_ = _i_it;
			_tmp170_ = gee_iterator_get (_tmp169_);
			i = (FolksIndividual*) _tmp170_;
			_tmp171_ = *added_individuals;
			_tmp172_ = i;
			gee_abstract_collection_add ((GeeAbstractCollection*) _tmp171_, _tmp172_);
			_tmp173_ = i;
			_folks_individual_aggregator_connect_to_individual (self, _tmp173_);
			_g_object_unref0 (i);
		}
		_g_object_unref0 (_i_it);
	}
	_g_object_unref0 (almost_added_individuals);
}


static void _lambda2_ (const gchar* linking_value, FolksIndividualAggregator* self) {
	const gchar* _tmp0_;
	GHashTable* _tmp1_;
	const gchar* _tmp2_;
	g_return_if_fail (linking_value != NULL);
	_tmp0_ = linking_value;
	g_debug ("individual-aggregator.vala:815:         %s", _tmp0_);
	_tmp1_ = self->priv->_link_map;
	_tmp2_ = linking_value;
	g_hash_table_remove (_tmp1_, _tmp2_);
}


static void __lambda2__folks_persona_linkable_property_callback (const gchar* link, gpointer self) {
	_lambda2_ (link, self);
}


static void _folks_individual_aggregator_remove_persona_from_link_map (FolksIndividualAggregator* self, FolksPersona* persona) {
	GHashTable* _tmp0_;
	FolksPersona* _tmp1_;
	const gchar* _tmp2_;
	const gchar* _tmp3_;
	FolksPersona* _tmp4_;
	FolksPersonaStore* _tmp5_;
	FolksPersonaStore* _tmp6_;
	FolksPersonaStoreTrust _tmp7_;
	FolksPersonaStoreTrust _tmp8_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (persona != NULL);
	_tmp0_ = self->priv->_link_map;
	_tmp1_ = persona;
	_tmp2_ = folks_persona_get_iid (_tmp1_);
	_tmp3_ = _tmp2_;
	g_hash_table_remove (_tmp0_, _tmp3_);
	_tmp4_ = persona;
	_tmp5_ = folks_persona_get_store (_tmp4_);
	_tmp6_ = _tmp5_;
	_tmp7_ = folks_persona_store_get_trust_level (_tmp6_);
	_tmp8_ = _tmp7_;
	if (_tmp8_ == FOLKS_PERSONA_STORE_TRUST_FULL) {
		FolksPersona* _tmp9_;
		const gchar* _tmp10_;
		const gchar* _tmp11_;
		FolksPersona* _tmp12_;
		gchar** _tmp13_;
		gint _tmp13__length1;
		gchar** _tmp14_;
		gint _tmp14__length1;
		_tmp9_ = persona;
		_tmp10_ = folks_persona_get_uid (_tmp9_);
		_tmp11_ = _tmp10_;
		g_debug ("individual-aggregator.vala:795:     Removing links to %s:", _tmp11_);
		_tmp12_ = persona;
		_tmp13_ = folks_persona_get_linkable_properties (_tmp12_, &_tmp13__length1);
		_tmp14_ = _tmp13_;
		_tmp14__length1 = _tmp13__length1;
		{
			gchar** prop_name_collection = NULL;
			gint prop_name_collection_length1 = 0;
			gint _prop_name_collection_size_ = 0;
			gint prop_name_it = 0;
			prop_name_collection = _tmp14_;
			prop_name_collection_length1 = _tmp14__length1;
			for (prop_name_it = 0; prop_name_it < _tmp14__length1; prop_name_it = prop_name_it + 1) {
				const gchar* prop_name = NULL;
				prop_name = prop_name_collection[prop_name_it];
				{
					FolksPersona* _tmp15_;
					GObjectClass* _tmp16_ = NULL;
					GObjectClass* pclass;
					GObjectClass* _tmp17_;
					const gchar* _tmp18_;
					GParamSpec* _tmp19_ = NULL;
					FolksPersona* _tmp22_;
					const gchar* _tmp23_;
					_tmp15_ = persona;
					_tmp16_ = G_OBJECT_GET_CLASS ((GObject*) _tmp15_);
					pclass = _tmp16_;
					_tmp17_ = pclass;
					_tmp18_ = prop_name;
					_tmp19_ = g_object_class_find_property (_tmp17_, _tmp18_);
					if (_tmp19_ == NULL) {
						const gchar* _tmp20_ = NULL;
						const gchar* _tmp21_;
						_tmp20_ = _ ("Unknown property '%s' in linkable property list.");
						_tmp21_ = prop_name;
						g_warning (_tmp20_, _tmp21_);
						continue;
					}
					_tmp22_ = persona;
					_tmp23_ = prop_name;
					folks_persona_linkable_property_to_links (_tmp22_, _tmp23_, __lambda2__folks_persona_linkable_property_callback, self);
				}
			}
		}
	}
}


static void _folks_individual_aggregator_personas_changed_cb (FolksIndividualAggregator* self, FolksPersonaStore* store, GeeSet* added, GeeSet* removed, const gchar* message, FolksPersona* actor, FolksGroupDetailsChangeReason reason) {
	GeeHashSet* _tmp0_;
	GeeHashSet* added_individuals;
	GeeHashSet* _tmp1_;
	GeeHashSet* removed_individuals;
	GeeHashMap* _tmp2_;
	GeeHashMap* replaced_individuals;
	GeeHashSet* _tmp3_;
	GeeHashSet* relinked_personas;
	GHashFunc _tmp4_;
	GEqualFunc _tmp5_;
	GeeHashSet* _tmp6_;
	GeeHashSet* removed_personas;
	FolksIndividual* _tmp7_;
	FolksIndividual* _tmp8_;
	FolksIndividual* user;
	GeeSet* _tmp92_;
	gint _tmp93_;
	gint _tmp94_;
	GeeHashSet* _tmp113_;
	GeeHashMap* _tmp114_;
	FolksIndividual* _tmp123_;
	gboolean _tmp124_ = FALSE;
	GeeHashSet* _tmp125_;
	gint _tmp126_;
	gint _tmp127_;
	gboolean _tmp131_;
	GeeHashMap* _tmp134_;
	GeeMapIterator* _tmp135_ = NULL;
	GeeMapIterator* iter;
	g_return_if_fail (self != NULL);
	g_return_if_fail (store != NULL);
	g_return_if_fail (added != NULL);
	g_return_if_fail (removed != NULL);
	_tmp0_ = gee_hash_set_new (FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL);
	added_individuals = _tmp0_;
	_tmp1_ = gee_hash_set_new (FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL);
	removed_individuals = _tmp1_;
	_tmp2_ = gee_hash_map_new (FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL, NULL);
	replaced_individuals = _tmp2_;
	_tmp3_ = gee_hash_set_new (FOLKS_TYPE_PERSONA, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL);
	relinked_personas = _tmp3_;
	_tmp4_ = g_direct_hash;
	_tmp5_ = g_direct_equal;
	_tmp6_ = gee_hash_set_new (FOLKS_TYPE_PERSONA, (GBoxedCopyFunc) g_object_ref, g_object_unref, _tmp4_, _tmp5_);
	removed_personas = _tmp6_;
	_tmp7_ = self->priv->_user;
	_tmp8_ = _g_object_ref0 (_tmp7_);
	user = _tmp8_;
	g_debug ("individual-aggregator.vala:840: Removing Personas:");
	{
		GeeSet* _tmp9_;
		GeeIterator* _tmp10_ = NULL;
		GeeIterator* _persona_it;
		_tmp9_ = removed;
		_tmp10_ = gee_iterable_iterator ((GeeIterable*) _tmp9_);
		_persona_it = _tmp10_;
		while (TRUE) {
			GeeIterator* _tmp11_;
			gboolean _tmp12_ = FALSE;
			GeeIterator* _tmp13_;
			gpointer _tmp14_ = NULL;
			FolksPersona* persona;
			const gchar* _tmp15_ = NULL;
			FolksPersona* _tmp16_;
			gboolean _tmp17_;
			gboolean _tmp18_;
			FolksPersona* _tmp19_;
			const gchar* _tmp20_;
			const gchar* _tmp21_;
			const gchar* _tmp22_;
			FolksPersona* _tmp23_;
			const gchar* _tmp24_;
			const gchar* _tmp25_;
			GeeHashSet* _tmp26_;
			FolksPersona* _tmp27_;
			GHashTable* _tmp28_;
			FolksPersona* _tmp29_;
			const gchar* _tmp30_;
			const gchar* _tmp31_;
			gconstpointer _tmp32_ = NULL;
			FolksIndividual* _tmp33_;
			FolksIndividual* ind;
			FolksIndividual* _tmp34_;
			FolksPersona* _tmp37_;
			_tmp11_ = _persona_it;
			_tmp12_ = gee_iterator_next (_tmp11_);
			if (!_tmp12_) {
				break;
			}
			_tmp13_ = _persona_it;
			_tmp14_ = gee_iterator_get (_tmp13_);
			persona = (FolksPersona*) _tmp14_;
			_tmp16_ = persona;
			_tmp17_ = folks_persona_get_is_user (_tmp16_);
			_tmp18_ = _tmp17_;
			if (_tmp18_) {
				_tmp15_ = "yes";
			} else {
				_tmp15_ = "no";
			}
			_tmp19_ = persona;
			_tmp20_ = folks_persona_get_uid (_tmp19_);
			_tmp21_ = _tmp20_;
			_tmp22_ = _tmp15_;
			_tmp23_ = persona;
			_tmp24_ = folks_persona_get_iid (_tmp23_);
			_tmp25_ = _tmp24_;
			g_debug ("individual-aggregator.vala:844:     %s (is user: %s, IID: %s)", _tmp21_, _tmp22_, _tmp25_);
			_tmp26_ = removed_personas;
			_tmp27_ = persona;
			gee_abstract_collection_add ((GeeAbstractCollection*) _tmp26_, _tmp27_);
			_tmp28_ = self->priv->_link_map;
			_tmp29_ = persona;
			_tmp30_ = folks_persona_get_iid (_tmp29_);
			_tmp31_ = _tmp30_;
			_tmp32_ = g_hash_table_lookup (_tmp28_, _tmp31_);
			_tmp33_ = _g_object_ref0 ((FolksIndividual*) _tmp32_);
			ind = _tmp33_;
			_tmp34_ = ind;
			if (_tmp34_ != NULL) {
				GeeHashSet* _tmp35_;
				FolksIndividual* _tmp36_;
				_tmp35_ = removed_individuals;
				_tmp36_ = ind;
				gee_abstract_collection_add ((GeeAbstractCollection*) _tmp35_, _tmp36_);
			}
			_tmp37_ = persona;
			_folks_individual_aggregator_remove_persona_from_link_map (self, _tmp37_);
			_g_object_unref0 (ind);
			_g_object_unref0 (persona);
		}
		_g_object_unref0 (_persona_it);
	}
	g_debug ("individual-aggregator.vala:869: Removing Individuals due to removed li" \
"nks:");
	{
		GeeHashSet* _tmp38_;
		GeeIterator* _tmp39_ = NULL;
		GeeIterator* _individual_it;
		_tmp38_ = removed_individuals;
		_tmp39_ = gee_abstract_collection_iterator ((GeeAbstractCollection*) _tmp38_);
		_individual_it = _tmp39_;
		while (TRUE) {
			GeeIterator* _tmp40_;
			gboolean _tmp41_ = FALSE;
			GeeIterator* _tmp42_;
			gpointer _tmp43_ = NULL;
			FolksIndividual* individual;
			GeeMap* _tmp44_;
			FolksIndividual* _tmp45_;
			const gchar* _tmp46_;
			const gchar* _tmp47_;
			gboolean _tmp48_ = FALSE;
			FolksIndividual* _tmp49_;
			const gchar* _tmp50_;
			const gchar* _tmp51_;
			FolksIndividual* _tmp71_;
			FolksIndividual* _tmp72_;
			FolksIndividual* _tmp73_;
			FolksIndividual* _tmp74_;
			_tmp40_ = _individual_it;
			_tmp41_ = gee_iterator_next (_tmp40_);
			if (!_tmp41_) {
				break;
			}
			_tmp42_ = _individual_it;
			_tmp43_ = gee_iterator_get (_tmp42_);
			individual = (FolksIndividual*) _tmp43_;
			_tmp44_ = self->priv->_individuals;
			_tmp45_ = individual;
			_tmp46_ = folks_individual_get_id (_tmp45_);
			_tmp47_ = _tmp46_;
			_tmp48_ = gee_map_has_key (_tmp44_, _tmp47_);
			if (_tmp48_ == FALSE) {
				_g_object_unref0 (individual);
				continue;
			}
			_tmp49_ = individual;
			_tmp50_ = folks_individual_get_id (_tmp49_);
			_tmp51_ = _tmp50_;
			g_debug ("individual-aggregator.vala:876:     %s", _tmp51_);
			{
				FolksIndividual* _tmp52_;
				GeeSet* _tmp53_;
				GeeSet* _tmp54_;
				GeeIterator* _tmp55_ = NULL;
				GeeIterator* _persona_it;
				_tmp52_ = individual;
				_tmp53_ = folks_individual_get_personas (_tmp52_);
				_tmp54_ = _tmp53_;
				_tmp55_ = gee_iterable_iterator ((GeeIterable*) _tmp54_);
				_persona_it = _tmp55_;
				while (TRUE) {
					GeeIterator* _tmp56_;
					gboolean _tmp57_ = FALSE;
					GeeIterator* _tmp58_;
					gpointer _tmp59_ = NULL;
					FolksPersona* persona;
					gboolean _tmp60_ = FALSE;
					GeeHashSet* _tmp61_;
					FolksPersona* _tmp62_;
					gboolean _tmp63_ = FALSE;
					gboolean _tmp67_;
					GeeHashSet* _tmp68_;
					FolksPersona* _tmp69_;
					FolksPersona* _tmp70_;
					_tmp56_ = _persona_it;
					_tmp57_ = gee_iterator_next (_tmp56_);
					if (!_tmp57_) {
						break;
					}
					_tmp58_ = _persona_it;
					_tmp59_ = gee_iterator_get (_tmp58_);
					persona = (FolksPersona*) _tmp59_;
					_tmp61_ = removed_personas;
					_tmp62_ = persona;
					_tmp63_ = gee_abstract_collection_contains ((GeeAbstractCollection*) _tmp61_, _tmp62_);
					if (_tmp63_ == TRUE) {
						_tmp60_ = TRUE;
					} else {
						GeeHashSet* _tmp64_;
						FolksPersona* _tmp65_;
						gboolean _tmp66_ = FALSE;
						_tmp64_ = relinked_personas;
						_tmp65_ = persona;
						_tmp66_ = gee_abstract_collection_contains ((GeeAbstractCollection*) _tmp64_, _tmp65_);
						_tmp60_ = _tmp66_ == TRUE;
					}
					_tmp67_ = _tmp60_;
					if (_tmp67_) {
						_g_object_unref0 (persona);
						continue;
					}
					_tmp68_ = relinked_personas;
					_tmp69_ = persona;
					gee_abstract_collection_add ((GeeAbstractCollection*) _tmp68_, _tmp69_);
					_tmp70_ = persona;
					_folks_individual_aggregator_remove_persona_from_link_map (self, _tmp70_);
					_g_object_unref0 (persona);
				}
				_g_object_unref0 (_persona_it);
			}
			_tmp71_ = user;
			_tmp72_ = individual;
			if (_tmp71_ == _tmp72_) {
				_g_object_unref0 (user);
				user = NULL;
			}
			_tmp73_ = individual;
			_folks_individual_aggregator_disconnect_from_individual (self, _tmp73_);
			_tmp74_ = individual;
			folks_individual_set_personas (_tmp74_, NULL);
			_g_object_unref0 (individual);
		}
		_g_object_unref0 (_individual_it);
	}
	g_debug ("individual-aggregator.vala:899: Adding Personas:");
	{
		GeeSet* _tmp75_;
		GeeIterator* _tmp76_ = NULL;
		GeeIterator* _persona_it;
		_tmp75_ = added;
		_tmp76_ = gee_iterable_iterator ((GeeIterable*) _tmp75_);
		_persona_it = _tmp76_;
		while (TRUE) {
			GeeIterator* _tmp77_;
			gboolean _tmp78_ = FALSE;
			GeeIterator* _tmp79_;
			gpointer _tmp80_ = NULL;
			FolksPersona* persona;
			const gchar* _tmp81_ = NULL;
			FolksPersona* _tmp82_;
			gboolean _tmp83_;
			gboolean _tmp84_;
			FolksPersona* _tmp85_;
			const gchar* _tmp86_;
			const gchar* _tmp87_;
			const gchar* _tmp88_;
			FolksPersona* _tmp89_;
			const gchar* _tmp90_;
			const gchar* _tmp91_;
			_tmp77_ = _persona_it;
			_tmp78_ = gee_iterator_next (_tmp77_);
			if (!_tmp78_) {
				break;
			}
			_tmp79_ = _persona_it;
			_tmp80_ = gee_iterator_get (_tmp79_);
			persona = (FolksPersona*) _tmp80_;
			_tmp82_ = persona;
			_tmp83_ = folks_persona_get_is_user (_tmp82_);
			_tmp84_ = _tmp83_;
			if (_tmp84_) {
				_tmp81_ = "yes";
			} else {
				_tmp81_ = "no";
			}
			_tmp85_ = persona;
			_tmp86_ = folks_persona_get_uid (_tmp85_);
			_tmp87_ = _tmp86_;
			_tmp88_ = _tmp81_;
			_tmp89_ = persona;
			_tmp90_ = folks_persona_get_iid (_tmp89_);
			_tmp91_ = _tmp90_;
			g_debug ("individual-aggregator.vala:902:     %s (is user: %s, IID: %s)", _tmp87_, _tmp88_, _tmp91_);
			_g_object_unref0 (persona);
		}
		_g_object_unref0 (_persona_it);
	}
	_tmp92_ = added;
	_tmp93_ = gee_collection_get_size ((GeeCollection*) _tmp92_);
	_tmp94_ = _tmp93_;
	if (_tmp94_ > 0) {
		GeeSet* _tmp95_;
		_tmp95_ = added;
		_folks_individual_aggregator_add_personas (self, _tmp95_, &added_individuals, &replaced_individuals, &user);
	}
	g_debug ("individual-aggregator.vala:912: Relinking Personas:");
	{
		GeeHashSet* _tmp96_;
		GeeIterator* _tmp97_ = NULL;
		GeeIterator* _persona_it;
		_tmp96_ = relinked_personas;
		_tmp97_ = gee_abstract_collection_iterator ((GeeAbstractCollection*) _tmp96_);
		_persona_it = _tmp97_;
		while (TRUE) {
			GeeIterator* _tmp98_;
			gboolean _tmp99_ = FALSE;
			GeeIterator* _tmp100_;
			gpointer _tmp101_ = NULL;
			FolksPersona* persona;
			const gchar* _tmp102_ = NULL;
			FolksPersona* _tmp103_;
			gboolean _tmp104_;
			gboolean _tmp105_;
			FolksPersona* _tmp106_;
			const gchar* _tmp107_;
			const gchar* _tmp108_;
			const gchar* _tmp109_;
			FolksPersona* _tmp110_;
			const gchar* _tmp111_;
			const gchar* _tmp112_;
			_tmp98_ = _persona_it;
			_tmp99_ = gee_iterator_next (_tmp98_);
			if (!_tmp99_) {
				break;
			}
			_tmp100_ = _persona_it;
			_tmp101_ = gee_iterator_get (_tmp100_);
			persona = (FolksPersona*) _tmp101_;
			_tmp103_ = persona;
			_tmp104_ = folks_persona_get_is_user (_tmp103_);
			_tmp105_ = _tmp104_;
			if (_tmp105_) {
				_tmp102_ = "yes";
			} else {
				_tmp102_ = "no";
			}
			_tmp106_ = persona;
			_tmp107_ = folks_persona_get_uid (_tmp106_);
			_tmp108_ = _tmp107_;
			_tmp109_ = _tmp102_;
			_tmp110_ = persona;
			_tmp111_ = folks_persona_get_iid (_tmp110_);
			_tmp112_ = _tmp111_;
			g_debug ("individual-aggregator.vala:915:     %s (is user: %s, IID: %s)", _tmp108_, _tmp109_, _tmp112_);
			_g_object_unref0 (persona);
		}
		_g_object_unref0 (_persona_it);
	}
	_tmp113_ = relinked_personas;
	_folks_individual_aggregator_add_personas (self, (GeeSet*) _tmp113_, &added_individuals, &replaced_individuals, &user);
	_tmp114_ = replaced_individuals;
	if (_tmp114_ != NULL) {
		GeeHashMap* _tmp115_;
		GeeMapIterator* _tmp116_ = NULL;
		GeeMapIterator* iter;
		_tmp115_ = replaced_individuals;
		_tmp116_ = gee_abstract_map_map_iterator ((GeeAbstractMap*) _tmp115_);
		iter = _tmp116_;
		while (TRUE) {
			GeeMapIterator* _tmp117_;
			gboolean _tmp118_ = FALSE;
			GeeHashSet* _tmp119_;
			GeeMapIterator* _tmp120_;
			gpointer _tmp121_ = NULL;
			FolksIndividual* _tmp122_;
			_tmp117_ = iter;
			_tmp118_ = gee_map_iterator_next (_tmp117_);
			if (!(_tmp118_ == TRUE)) {
				break;
			}
			_tmp119_ = removed_individuals;
			_tmp120_ = iter;
			_tmp121_ = gee_map_iterator_get_key (_tmp120_);
			_tmp122_ = (FolksIndividual*) _tmp121_;
			gee_abstract_collection_add ((GeeAbstractCollection*) _tmp119_, _tmp122_);
			_g_object_unref0 (_tmp122_);
		}
		_g_object_unref0 (iter);
	}
	_tmp123_ = user;
	folks_individual_aggregator_set_user (self, _tmp123_);
	_tmp125_ = added_individuals;
	_tmp126_ = gee_collection_get_size ((GeeCollection*) _tmp125_);
	_tmp127_ = _tmp126_;
	if (_tmp127_ > 0) {
		_tmp124_ = TRUE;
	} else {
		GeeHashSet* _tmp128_;
		gint _tmp129_;
		gint _tmp130_;
		_tmp128_ = removed_individuals;
		_tmp129_ = gee_collection_get_size ((GeeCollection*) _tmp128_);
		_tmp130_ = _tmp129_;
		_tmp124_ = _tmp130_ > 0;
	}
	_tmp131_ = _tmp124_;
	if (_tmp131_) {
		GeeHashSet* _tmp132_;
		GeeHashSet* _tmp133_;
		_tmp132_ = added_individuals;
		_tmp133_ = removed_individuals;
		_folks_individual_aggregator_emit_individuals_changed (self, (GeeSet*) _tmp132_, (GeeSet*) _tmp133_, NULL, NULL, FOLKS_GROUP_DETAILS_CHANGE_REASON_NONE);
	}
	g_debug ("individual-aggregator.vala:947: Replacing Individuals due to linking:");
	_tmp134_ = replaced_individuals;
	_tmp135_ = gee_abstract_map_map_iterator ((GeeAbstractMap*) _tmp134_);
	iter = _tmp135_;
	while (TRUE) {
		GeeMapIterator* _tmp136_;
		gboolean _tmp137_ = FALSE;
		GeeMapIterator* _tmp138_;
		gpointer _tmp139_ = NULL;
		FolksIndividual* _tmp140_;
		GeeMapIterator* _tmp141_;
		gpointer _tmp142_ = NULL;
		FolksIndividual* _tmp143_;
		_tmp136_ = iter;
		_tmp137_ = gee_map_iterator_next (_tmp136_);
		if (!(_tmp137_ == TRUE)) {
			break;
		}
		_tmp138_ = iter;
		_tmp139_ = gee_map_iterator_get_key (_tmp138_);
		_tmp140_ = (FolksIndividual*) _tmp139_;
		_tmp141_ = iter;
		_tmp142_ = gee_map_iterator_get_value (_tmp141_);
		_tmp143_ = (FolksIndividual*) _tmp142_;
		folks_individual_replace (_tmp140_, _tmp143_);
		_g_object_unref0 (_tmp143_);
		_g_object_unref0 (_tmp140_);
	}
	_g_object_unref0 (iter);
	_g_object_unref0 (user);
	_g_object_unref0 (removed_personas);
	_g_object_unref0 (relinked_personas);
	_g_object_unref0 (replaced_individuals);
	_g_object_unref0 (removed_individuals);
	_g_object_unref0 (added_individuals);
}


static void _folks_individual_aggregator_is_writeable_changed_cb (FolksIndividualAggregator* self, GObject* object, GParamSpec* pspec) {
	GObject* _tmp0_;
	FolksPersonaStore* _tmp1_;
	FolksPersonaStore* store;
	gboolean _tmp2_ = FALSE;
	gboolean _tmp3_ = FALSE;
	FolksPersonaStore* _tmp4_;
	gboolean _tmp5_;
	gboolean _tmp6_;
	gboolean _tmp9_;
	gboolean _tmp17_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (object != NULL);
	g_return_if_fail (pspec != NULL);
	_tmp0_ = object;
	_tmp1_ = _g_object_ref0 (FOLKS_PERSONA_STORE (_tmp0_));
	store = _tmp1_;
	_tmp4_ = store;
	_tmp5_ = folks_persona_store_get_is_writeable (_tmp4_);
	_tmp6_ = _tmp5_;
	if (_tmp6_ == TRUE) {
		FolksPersonaStore* _tmp7_;
		FolksPersonaStore* _tmp8_;
		_tmp7_ = store;
		_tmp8_ = self->priv->_writeable_store;
		_tmp3_ = _tmp7_ == _tmp8_;
	} else {
		_tmp3_ = FALSE;
	}
	_tmp9_ = _tmp3_;
	if (_tmp9_) {
		_tmp2_ = TRUE;
	} else {
		gboolean _tmp10_ = FALSE;
		FolksPersonaStore* _tmp11_;
		gboolean _tmp12_;
		gboolean _tmp13_;
		gboolean _tmp16_;
		_tmp11_ = store;
		_tmp12_ = folks_persona_store_get_is_writeable (_tmp11_);
		_tmp13_ = _tmp12_;
		if (_tmp13_ == FALSE) {
			FolksPersonaStore* _tmp14_;
			FolksPersonaStore* _tmp15_;
			_tmp14_ = store;
			_tmp15_ = self->priv->_writeable_store;
			_tmp10_ = _tmp14_ != _tmp15_;
		} else {
			_tmp10_ = FALSE;
		}
		_tmp16_ = _tmp10_;
		_tmp2_ = _tmp16_;
	}
	_tmp17_ = _tmp2_;
	g_assert (_tmp17_);
	_g_object_unref0 (store);
}


static void _folks_individual_aggregator_trust_level_changed_cb (FolksIndividualAggregator* self, GObject* object, GParamSpec* pspec) {
	GObject* _tmp0_;
	FolksPersonaStore* _tmp1_;
	FolksPersonaStore* store;
	gboolean _tmp2_ = FALSE;
	FolksPersonaStore* _tmp3_;
	gboolean _tmp10_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (object != NULL);
	g_return_if_fail (pspec != NULL);
	_tmp0_ = object;
	_tmp1_ = _g_object_ref0 (FOLKS_PERSONA_STORE (_tmp0_));
	store = _tmp1_;
	_tmp3_ = self->priv->_writeable_store;
	if (_tmp3_ != NULL) {
		FolksPersonaStore* _tmp4_;
		const gchar* _tmp5_;
		const gchar* _tmp6_;
		FolksPersonaStore* _tmp7_;
		const gchar* _tmp8_;
		const gchar* _tmp9_;
		_tmp4_ = store;
		_tmp5_ = folks_persona_store_get_type_id (_tmp4_);
		_tmp6_ = _tmp5_;
		_tmp7_ = self->priv->_writeable_store;
		_tmp8_ = folks_persona_store_get_type_id (_tmp7_);
		_tmp9_ = _tmp8_;
		_tmp2_ = g_strcmp0 (_tmp6_, _tmp9_) == 0;
	} else {
		_tmp2_ = FALSE;
	}
	_tmp10_ = _tmp2_;
	if (_tmp10_) {
		FolksPersonaStore* _tmp11_;
		FolksPersonaStoreTrust _tmp12_;
		FolksPersonaStoreTrust _tmp13_;
		_tmp11_ = store;
		_tmp12_ = folks_persona_store_get_trust_level (_tmp11_);
		_tmp13_ = _tmp12_;
		g_assert (_tmp13_ == FOLKS_PERSONA_STORE_TRUST_FULL);
	} else {
		FolksPersonaStore* _tmp14_;
		FolksPersonaStoreTrust _tmp15_;
		FolksPersonaStoreTrust _tmp16_;
		_tmp14_ = store;
		_tmp15_ = folks_persona_store_get_trust_level (_tmp14_);
		_tmp16_ = _tmp15_;
		g_assert (_tmp16_ != FOLKS_PERSONA_STORE_TRUST_FULL);
	}
	_g_object_unref0 (store);
}


static void _folks_individual_aggregator_individual_removed_cb (FolksIndividualAggregator* self, FolksIndividual* i, FolksIndividual* replacement) {
	FolksIndividual* _tmp0_;
	FolksIndividual* _tmp1_;
	GeeMap* _tmp2_;
	FolksIndividual* _tmp3_;
	const gchar* _tmp4_;
	const gchar* _tmp5_;
	gpointer _tmp6_ = NULL;
	FolksIndividual* _tmp7_;
	FolksIndividual* _tmp8_;
	gboolean _tmp9_;
	GeeHashSet* _tmp10_;
	GeeHashSet* individuals;
	GeeHashSet* _tmp11_;
	FolksIndividual* _tmp12_;
	FolksIndividual* _tmp13_;
	FolksIndividual* _tmp23_;
	GeeSet* _tmp24_;
	GeeSet* _tmp25_;
	gint _tmp26_;
	gint _tmp27_;
	FolksIndividual* _tmp29_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (i != NULL);
	_tmp0_ = self->priv->_user;
	_tmp1_ = i;
	if (_tmp0_ == _tmp1_) {
		folks_individual_aggregator_set_user (self, NULL);
	}
	_tmp2_ = self->priv->_individuals;
	_tmp3_ = i;
	_tmp4_ = folks_individual_get_id (_tmp3_);
	_tmp5_ = _tmp4_;
	_tmp6_ = gee_map_get (_tmp2_, _tmp5_);
	_tmp7_ = (FolksIndividual*) _tmp6_;
	_tmp8_ = i;
	_tmp9_ = _tmp7_ != _tmp8_;
	_g_object_unref0 (_tmp7_);
	if (_tmp9_) {
		return;
	}
	_tmp10_ = gee_hash_set_new (FOLKS_TYPE_INDIVIDUAL, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL);
	individuals = _tmp10_;
	_tmp11_ = individuals;
	_tmp12_ = i;
	gee_abstract_collection_add ((GeeAbstractCollection*) _tmp11_, _tmp12_);
	_tmp13_ = replacement;
	if (_tmp13_ != NULL) {
		FolksIndividual* _tmp14_;
		const gchar* _tmp15_;
		const gchar* _tmp16_;
		FolksIndividual* _tmp17_;
		const gchar* _tmp18_;
		const gchar* _tmp19_;
		_tmp14_ = i;
		_tmp15_ = folks_individual_get_id (_tmp14_);
		_tmp16_ = _tmp15_;
		_tmp17_ = replacement;
		_tmp18_ = folks_individual_get_id (_tmp17_);
		_tmp19_ = _tmp18_;
		g_debug ("individual-aggregator.vala:989: Individual '%s' removed (replaced by '" \
"%s')", _tmp16_, _tmp19_);
	} else {
		FolksIndividual* _tmp20_;
		const gchar* _tmp21_;
		const gchar* _tmp22_;
		_tmp20_ = i;
		_tmp21_ = folks_individual_get_id (_tmp20_);
		_tmp22_ = _tmp21_;
		g_debug ("individual-aggregator.vala:994: Individual '%s' removed (not replaced)", _tmp22_);
	}
	_tmp23_ = i;
	_tmp24_ = folks_individual_get_personas (_tmp23_);
	_tmp25_ = _tmp24_;
	_tmp26_ = gee_collection_get_size ((GeeCollection*) _tmp25_);
	_tmp27_ = _tmp26_;
	if (_tmp27_ > 0) {
		GeeHashSet* _tmp28_;
		_tmp28_ = individuals;
		_folks_individual_aggregator_emit_individuals_changed (self, NULL, (GeeSet*) _tmp28_, NULL, NULL, FOLKS_GROUP_DETAILS_CHANGE_REASON_NONE);
	}
	_tmp29_ = i;
	_folks_individual_aggregator_disconnect_from_individual (self, _tmp29_);
	_g_object_unref0 (individuals);
}


static void folks_individual_aggregator_add_persona_from_details_data_free (gpointer _data) {
	FolksIndividualAggregatorAddPersonaFromDetailsData* _data_;
	_data_ = _data;
	_g_object_unref0 (_data_->parent);
	_g_object_unref0 (_data_->persona_store);
	_g_hash_table_unref0 (_data_->details);
	_g_object_unref0 (_data_->result);
	_g_object_unref0 (_data_->self);
	g_slice_free (FolksIndividualAggregatorAddPersonaFromDetailsData, _data_);
}


static gpointer _g_hash_table_ref0 (gpointer self) {
	return self ? g_hash_table_ref (self) : NULL;
}


void folks_individual_aggregator_add_persona_from_details (FolksIndividualAggregator* self, FolksIndividual* parent, FolksPersonaStore* persona_store, GHashTable* details, GAsyncReadyCallback _callback_, gpointer _user_data_) {
	FolksIndividualAggregatorAddPersonaFromDetailsData* _data_;
	FolksIndividualAggregator* _tmp0_;
	FolksIndividual* _tmp1_;
	FolksIndividual* _tmp2_;
	FolksPersonaStore* _tmp3_;
	FolksPersonaStore* _tmp4_;
	GHashTable* _tmp5_;
	GHashTable* _tmp6_;
	_data_ = g_slice_new0 (FolksIndividualAggregatorAddPersonaFromDetailsData);
	_data_->_async_result = g_simple_async_result_new (G_OBJECT (self), _callback_, _user_data_, folks_individual_aggregator_add_persona_from_details);
	g_simple_async_result_set_op_res_gpointer (_data_->_async_result, _data_, folks_individual_aggregator_add_persona_from_details_data_free);
	_tmp0_ = _g_object_ref0 (self);
	_data_->self = _tmp0_;
	_tmp1_ = parent;
	_tmp2_ = _g_object_ref0 (_tmp1_);
	_data_->parent = _tmp2_;
	_tmp3_ = persona_store;
	_tmp4_ = _g_object_ref0 (_tmp3_);
	_data_->persona_store = _tmp4_;
	_tmp5_ = details;
	_tmp6_ = _g_hash_table_ref0 (_tmp5_);
	_data_->details = _tmp6_;
	folks_individual_aggregator_add_persona_from_details_co (_data_);
}


FolksPersona* folks_individual_aggregator_add_persona_from_details_finish (FolksIndividualAggregator* self, GAsyncResult* _res_, GError** error) {
	FolksPersona* result;
	FolksIndividualAggregatorAddPersonaFromDetailsData* _data_;
	if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (_res_), error)) {
		return NULL;
	}
	_data_ = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (_res_));
	result = _data_->result;
	_data_->result = NULL;
	return result;
}


/**
   * Add a new persona in the given {@link PersonaStore} based on the `details`
   * provided.
   *
   * If the target store is offline, this function will throw
   * {@link IndividualAggregatorError.STORE_OFFLINE}. It's the responsibility of
   * the caller to cache details and re-try this function if it wishes to make
   * offline adds work.
   *
   * The details hash is a backend-specific mapping of key, value strings.
   * Common keys include:
   *
   *  * contact - service-specific contact ID
   *  * message - a user-readable message to pass to the persona being added
   *
   * If a {@link Persona} with the given details already exists in the store, no
   * error will be thrown and this function will return `null`.
   *
   * @param parent an optional {@link Individual} to add the new {@link Persona}
   * to. This persona will be appended to its ordered list of personas.
   * @param persona_store the {@link PersonaStore} to add the persona to
   * @param details a key-value map of details to use in creating the new
   * {@link Persona}
   * @return the new {@link Persona} or `null` if the corresponding
   * {@link Persona} already existed. If non-`null`, the new {@link Persona}
   * will also be added to a new or existing {@link Individual} as necessary.
   *
   * @since 0.3.5
   */
static void folks_individual_aggregator_add_persona_from_details_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_) {
	FolksIndividualAggregatorAddPersonaFromDetailsData* _data_;
	_data_ = _user_data_;
	_data_->_source_object_ = source_object;
	_data_->_res_ = _res_;
	folks_individual_aggregator_add_persona_from_details_co (_data_);
}


static gboolean folks_individual_aggregator_add_persona_from_details_co (FolksIndividualAggregatorAddPersonaFromDetailsData* _data_) {
	switch (_data_->_state_) {
		case 0:
		goto _state_0;
		case 1:
		goto _state_1;
		default:
		g_assert_not_reached ();
	}
	_state_0:
	_data_->persona = NULL;
	{
		_data_->_tmp0_ = _data_->details;
		_data_->_tmp1_ = NULL;
		_data_->_tmp1_ = _folks_individual_aggregator_asv_copy (_data_->self, _data_->_tmp0_);
		_data_->details_copy = _data_->_tmp1_;
		_data_->_tmp2_ = _data_->persona_store;
		_data_->_tmp3_ = _data_->details_copy;
		_data_->_state_ = 1;
		folks_persona_store_add_persona_from_details (_data_->_tmp2_, _data_->_tmp3_, folks_individual_aggregator_add_persona_from_details_ready, _data_);
		return FALSE;
		_state_1:
		_data_->_tmp4_ = NULL;
		_data_->_tmp4_ = folks_persona_store_add_persona_from_details_finish (_data_->_tmp2_, _data_->_res_, &_data_->_inner_error_);
		_data_->_tmp5_ = _data_->_tmp4_;
		if (_data_->_inner_error_ != NULL) {
			_g_hash_table_unref0 (_data_->details_copy);
			if (_data_->_inner_error_->domain == FOLKS_PERSONA_STORE_ERROR) {
				goto __catch12_folks_persona_store_error;
			}
			_g_hash_table_unref0 (_data_->details_copy);
			_g_object_unref0 (_data_->persona);
			g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _data_->_inner_error_->message, g_quark_to_string (_data_->_inner_error_->domain), _data_->_inner_error_->code);
			g_clear_error (&_data_->_inner_error_);
			return FALSE;
		}
		_data_->_tmp6_ = _data_->_tmp5_;
		_g_object_unref0 (_data_->persona);
		_data_->persona = _data_->_tmp6_;
		_g_hash_table_unref0 (_data_->details_copy);
	}
	goto __finally12;
	__catch12_folks_persona_store_error:
	{
		_data_->e = _data_->_inner_error_;
		_data_->_inner_error_ = NULL;
		_data_->_tmp7_ = _data_->e;
		if (g_error_matches (_data_->_tmp7_, FOLKS_PERSONA_STORE_ERROR, FOLKS_PERSONA_STORE_ERROR_STORE_OFFLINE)) {
			_data_->_tmp8_ = _data_->e;
			_data_->_tmp9_ = _data_->_tmp8_->message;
			_data_->_tmp10_ = g_error_new_literal (FOLKS_INDIVIDUAL_AGGREGATOR_ERROR, FOLKS_INDIVIDUAL_AGGREGATOR_ERROR_STORE_OFFLINE, _data_->_tmp9_);
			_data_->_inner_error_ = _data_->_tmp10_;
			_g_error_free0 (_data_->e);
			goto __finally12;
		} else {
			_data_->_tmp11_ = _data_->persona_store;
			_data_->_tmp12_ = folks_persona_store_get_type_id (_data_->_tmp11_);
			_data_->_tmp13_ = _data_->_tmp12_;
			_data_->_tmp14_ = _data_->persona_store;
			_data_->_tmp15_ = folks_persona_store_get_id (_data_->_tmp14_);
			_data_->_tmp16_ = _data_->_tmp15_;
			_data_->_tmp17_ = NULL;
			_data_->_tmp17_ = _folks_individual_aggregator_get_store_full_id (_data_->self, _data_->_tmp13_, _data_->_tmp16_);
			_data_->full_id = _data_->_tmp17_;
			_data_->_tmp18_ = NULL;
			_data_->_tmp18_ = _ ("Failed to add contact for persona store ID '%s': %s");
			_data_->_tmp19_ = _data_->full_id;
			_data_->_tmp20_ = _data_->e;
			_data_->_tmp21_ = _data_->_tmp20_->message;
			_data_->_tmp22_ = g_error_new (FOLKS_INDIVIDUAL_AGGREGATOR_ERROR, FOLKS_INDIVIDUAL_AGGREGATOR_ERROR_ADD_FAILED, _data_->_tmp18_, _data_->_tmp19_, _data_->_tmp21_);
			_data_->_inner_error_ = _data_->_tmp22_;
			_g_free0 (_data_->full_id);
			_g_error_free0 (_data_->e);
			goto __finally12;
		}
		_g_error_free0 (_data_->e);
	}
	__finally12:
	if (_data_->_inner_error_ != NULL) {
		if (_data_->_inner_error_->domain == FOLKS_INDIVIDUAL_AGGREGATOR_ERROR) {
			g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
			g_error_free (_data_->_inner_error_);
			_g_object_unref0 (_data_->persona);
			if (_data_->_state_ == 0) {
				g_simple_async_result_complete_in_idle (_data_->_async_result);
			} else {
				g_simple_async_result_complete (_data_->_async_result);
			}
			g_object_unref (_data_->_async_result);
			return FALSE;
		} else {
			_g_object_unref0 (_data_->persona);
			g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _data_->_inner_error_->message, g_quark_to_string (_data_->_inner_error_->domain), _data_->_inner_error_->code);
			g_clear_error (&_data_->_inner_error_);
			return FALSE;
		}
	}
	_data_->_tmp24_ = _data_->parent;
	if (_data_->_tmp24_ != NULL) {
		_data_->_tmp25_ = _data_->persona;
		_data_->_tmp23_ = _data_->_tmp25_ != NULL;
	} else {
		_data_->_tmp23_ = FALSE;
	}
	_data_->_tmp26_ = _data_->_tmp23_;
	if (_data_->_tmp26_) {
		_data_->_tmp27_ = _data_->parent;
		_data_->_tmp28_ = folks_individual_get_personas (_data_->_tmp27_);
		_data_->_tmp29_ = _data_->_tmp28_;
		_data_->_tmp30_ = _data_->persona;
		gee_collection_add ((GeeCollection*) _data_->_tmp29_, _data_->_tmp30_);
	}
	_data_->result = _data_->persona;
	if (_data_->_state_ == 0) {
		g_simple_async_result_complete_in_idle (_data_->_async_result);
	} else {
		g_simple_async_result_complete (_data_->_async_result);
	}
	g_object_unref (_data_->_async_result);
	return FALSE;
	_g_object_unref0 (_data_->persona);
	if (_data_->_state_ == 0) {
		g_simple_async_result_complete_in_idle (_data_->_async_result);
	} else {
		g_simple_async_result_complete (_data_->_async_result);
	}
	g_object_unref (_data_->_async_result);
	return FALSE;
}


static Block4Data* block4_data_ref (Block4Data* _data4_) {
	g_atomic_int_inc (&_data4_->_ref_count_);
	return _data4_;
}


static void block4_data_unref (Block4Data* _data4_) {
	if (g_atomic_int_dec_and_test (&_data4_->_ref_count_)) {
		_g_object_unref0 (_data4_->self);
		_g_hash_table_unref0 (_data4_->retval);
		g_slice_free (Block4Data, _data4_);
	}
}


static void _vala_GValue_free (GValue* self) {
	g_value_unset (self);
	g_free (self);
}


static void __vala_GValue_free0_ (gpointer var) {
	(var == NULL) ? NULL : (var = (_vala_GValue_free (var), NULL));
}


static GValue* _g_value_dup (GValue* self) {
	return g_boxed_copy (G_TYPE_VALUE, self);
}


static gpointer __g_value_dup0 (gpointer self) {
	return self ? _g_value_dup (self) : NULL;
}


static void _lambda6_ (const gchar* k, GValue* v, Block4Data* _data4_) {
	FolksIndividualAggregator * self;
	GHashTable* _tmp0_;
	const gchar* _tmp1_;
	gchar* _tmp2_;
	GValue* _tmp3_;
	GValue* _tmp4_;
	self = _data4_->self;
	g_return_if_fail (k != NULL);
	_tmp0_ = _data4_->retval;
	_tmp1_ = k;
	_tmp2_ = g_strdup ((const gchar*) _tmp1_);
	_tmp3_ = v;
	_tmp4_ = __g_value_dup0 (_tmp3_);
	g_hash_table_insert (_tmp0_, _tmp2_, _tmp4_);
}


static void __lambda6__gh_func (gconstpointer key, gconstpointer value, gpointer self) {
	_lambda6_ (key, value, self);
}


static GHashTable* _folks_individual_aggregator_asv_copy (FolksIndividualAggregator* self, GHashTable* asv) {
	GHashTable* result = NULL;
	Block4Data* _data4_;
	GHashFunc _tmp0_;
	GEqualFunc _tmp1_;
	GHashTable* _tmp2_;
	GHashTable* _tmp3_;
	GHashTable* _tmp4_;
	GHashTable* _tmp5_;
	g_return_val_if_fail (self != NULL, NULL);
	g_return_val_if_fail (asv != NULL, NULL);
	_data4_ = g_slice_new0 (Block4Data);
	_data4_->_ref_count_ = 1;
	_data4_->self = g_object_ref (self);
	_tmp0_ = g_str_hash;
	_tmp1_ = g_str_equal;
	_tmp2_ = g_hash_table_new_full (_tmp0_, _tmp1_, _g_free0_, __vala_GValue_free0_);
	_data4_->retval = _tmp2_;
	_tmp3_ = asv;
	g_hash_table_foreach (_tmp3_, __lambda6__gh_func, _data4_);
	_tmp4_ = _data4_->retval;
	_tmp5_ = _g_hash_table_ref0 (_tmp4_);
	result = _tmp5_;
	block4_data_unref (_data4_);
	_data4_ = NULL;
	return result;
}


static void folks_individual_aggregator_remove_individual_data_free (gpointer _data) {
	FolksIndividualAggregatorRemoveIndividualData* _data_;
	_data_ = _data;
	_g_object_unref0 (_data_->individual);
	_g_object_unref0 (_data_->self);
	g_slice_free (FolksIndividualAggregatorRemoveIndividualData, _data_);
}


void folks_individual_aggregator_remove_individual (FolksIndividualAggregator* self, FolksIndividual* individual, GAsyncReadyCallback _callback_, gpointer _user_data_) {
	FolksIndividualAggregatorRemoveIndividualData* _data_;
	FolksIndividualAggregator* _tmp0_;
	FolksIndividual* _tmp1_;
	FolksIndividual* _tmp2_;
	_data_ = g_slice_new0 (FolksIndividualAggregatorRemoveIndividualData);
	_data_->_async_result = g_simple_async_result_new (G_OBJECT (self), _callback_, _user_data_, folks_individual_aggregator_remove_individual);
	g_simple_async_result_set_op_res_gpointer (_data_->_async_result, _data_, folks_individual_aggregator_remove_individual_data_free);
	_tmp0_ = _g_object_ref0 (self);
	_data_->self = _tmp0_;
	_tmp1_ = individual;
	_tmp2_ = _g_object_ref0 (_tmp1_);
	_data_->individual = _tmp2_;
	folks_individual_aggregator_remove_individual_co (_data_);
}


void folks_individual_aggregator_remove_individual_finish (FolksIndividualAggregator* self, GAsyncResult* _res_, GError** error) {
	FolksIndividualAggregatorRemoveIndividualData* _data_;
	if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (_res_), error)) {
		return;
	}
	_data_ = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (_res_));
}


/**
   * Completely remove the individual and all of its personas from their
   * backing stores.
   *
   * @param individual the {@link Individual} to remove
   * @since 0.1.11
   */
static void folks_individual_aggregator_remove_individual_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_) {
	FolksIndividualAggregatorRemoveIndividualData* _data_;
	_data_ = _user_data_;
	_data_->_source_object_ = source_object;
	_data_->_res_ = _res_;
	folks_individual_aggregator_remove_individual_co (_data_);
}


static gboolean folks_individual_aggregator_remove_individual_co (FolksIndividualAggregatorRemoveIndividualData* _data_) {
	switch (_data_->_state_) {
		case 0:
		goto _state_0;
		case 1:
		goto _state_1;
		default:
		g_assert_not_reached ();
	}
	_state_0:
	_data_->_tmp0_ = gee_hash_set_new (FOLKS_TYPE_PERSONA, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL);
	_data_->personas = _data_->_tmp0_;
	{
		_data_->_tmp1_ = _data_->individual;
		_data_->_tmp2_ = folks_individual_get_personas (_data_->_tmp1_);
		_data_->_tmp3_ = _data_->_tmp2_;
		_data_->_tmp4_ = NULL;
		_data_->_tmp4_ = gee_iterable_iterator ((GeeIterable*) _data_->_tmp3_);
		_data_->_p_it = _data_->_tmp4_;
		while (TRUE) {
			_data_->_tmp5_ = _data_->_p_it;
			_data_->_tmp6_ = FALSE;
			_data_->_tmp6_ = gee_iterator_next (_data_->_tmp5_);
			if (!_data_->_tmp6_) {
				break;
			}
			_data_->_tmp7_ = _data_->_p_it;
			_data_->_tmp8_ = NULL;
			_data_->_tmp8_ = gee_iterator_get (_data_->_tmp7_);
			_data_->p = (FolksPersona*) _data_->_tmp8_;
			_data_->_tmp9_ = _data_->personas;
			_data_->_tmp10_ = _data_->p;
			gee_abstract_collection_add ((GeeAbstractCollection*) _data_->_tmp9_, _data_->_tmp10_);
			_g_object_unref0 (_data_->p);
		}
		_g_object_unref0 (_data_->_p_it);
	}
	{
		_data_->_tmp11_ = _data_->personas;
		_data_->_tmp12_ = NULL;
		_data_->_tmp12_ = gee_abstract_collection_iterator ((GeeAbstractCollection*) _data_->_tmp11_);
		_data_->_persona_it = _data_->_tmp12_;
		while (TRUE) {
			_data_->_tmp13_ = _data_->_persona_it;
			_data_->_tmp14_ = FALSE;
			_data_->_tmp14_ = gee_iterator_next (_data_->_tmp13_);
			if (!_data_->_tmp14_) {
				break;
			}
			_data_->_tmp15_ = _data_->_persona_it;
			_data_->_tmp16_ = NULL;
			_data_->_tmp16_ = gee_iterator_get (_data_->_tmp15_);
			_data_->persona = (FolksPersona*) _data_->_tmp16_;
			_data_->_tmp17_ = _data_->persona;
			_data_->_tmp18_ = folks_persona_get_store (_data_->_tmp17_);
			_data_->_tmp19_ = _data_->_tmp18_;
			_data_->_tmp20_ = _data_->persona;
			_data_->_state_ = 1;
			folks_persona_store_remove_persona (_data_->_tmp19_, _data_->_tmp20_, folks_individual_aggregator_remove_individual_ready, _data_);
			return FALSE;
			_state_1:
			folks_persona_store_remove_persona_finish (_data_->_tmp19_, _data_->_res_, &_data_->_inner_error_);
			if (_data_->_inner_error_ != NULL) {
				g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
				g_error_free (_data_->_inner_error_);
				_g_object_unref0 (_data_->persona);
				_g_object_unref0 (_data_->_persona_it);
				_g_object_unref0 (_data_->personas);
				if (_data_->_state_ == 0) {
					g_simple_async_result_complete_in_idle (_data_->_async_result);
				} else {
					g_simple_async_result_complete (_data_->_async_result);
				}
				g_object_unref (_data_->_async_result);
				return FALSE;
			}
			_g_object_unref0 (_data_->persona);
		}
		_g_object_unref0 (_data_->_persona_it);
	}
	_g_object_unref0 (_data_->personas);
	if (_data_->_state_ == 0) {
		g_simple_async_result_complete_in_idle (_data_->_async_result);
	} else {
		g_simple_async_result_complete (_data_->_async_result);
	}
	g_object_unref (_data_->_async_result);
	return FALSE;
}


static void folks_individual_aggregator_remove_persona_data_free (gpointer _data) {
	FolksIndividualAggregatorRemovePersonaData* _data_;
	_data_ = _data;
	_g_object_unref0 (_data_->persona);
	_g_object_unref0 (_data_->self);
	g_slice_free (FolksIndividualAggregatorRemovePersonaData, _data_);
}


void folks_individual_aggregator_remove_persona (FolksIndividualAggregator* self, FolksPersona* persona, GAsyncReadyCallback _callback_, gpointer _user_data_) {
	FolksIndividualAggregatorRemovePersonaData* _data_;
	FolksIndividualAggregator* _tmp0_;
	FolksPersona* _tmp1_;
	FolksPersona* _tmp2_;
	_data_ = g_slice_new0 (FolksIndividualAggregatorRemovePersonaData);
	_data_->_async_result = g_simple_async_result_new (G_OBJECT (self), _callback_, _user_data_, folks_individual_aggregator_remove_persona);
	g_simple_async_result_set_op_res_gpointer (_data_->_async_result, _data_, folks_individual_aggregator_remove_persona_data_free);
	_tmp0_ = _g_object_ref0 (self);
	_data_->self = _tmp0_;
	_tmp1_ = persona;
	_tmp2_ = _g_object_ref0 (_tmp1_);
	_data_->persona = _tmp2_;
	folks_individual_aggregator_remove_persona_co (_data_);
}


void folks_individual_aggregator_remove_persona_finish (FolksIndividualAggregator* self, GAsyncResult* _res_, GError** error) {
	FolksIndividualAggregatorRemovePersonaData* _data_;
	if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (_res_), error)) {
		return;
	}
	_data_ = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (_res_));
}


/**
   * Completely remove the persona from its backing store.
   *
   * This will leave other personas in the same individual alone.
   *
   * @param persona the {@link Persona} to remove
   * @since 0.1.11
   */
static void folks_individual_aggregator_remove_persona_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_) {
	FolksIndividualAggregatorRemovePersonaData* _data_;
	_data_ = _user_data_;
	_data_->_source_object_ = source_object;
	_data_->_res_ = _res_;
	folks_individual_aggregator_remove_persona_co (_data_);
}


static gboolean folks_individual_aggregator_remove_persona_co (FolksIndividualAggregatorRemovePersonaData* _data_) {
	switch (_data_->_state_) {
		case 0:
		goto _state_0;
		case 1:
		goto _state_1;
		default:
		g_assert_not_reached ();
	}
	_state_0:
	_data_->_tmp0_ = _data_->persona;
	_data_->_tmp1_ = folks_persona_get_store (_data_->_tmp0_);
	_data_->_tmp2_ = _data_->_tmp1_;
	_data_->_tmp3_ = _data_->persona;
	_data_->_state_ = 1;
	folks_persona_store_remove_persona (_data_->_tmp2_, _data_->_tmp3_, folks_individual_aggregator_remove_persona_ready, _data_);
	return FALSE;
	_state_1:
	folks_persona_store_remove_persona_finish (_data_->_tmp2_, _data_->_res_, &_data_->_inner_error_);
	if (_data_->_inner_error_ != NULL) {
		g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
		g_error_free (_data_->_inner_error_);
		if (_data_->_state_ == 0) {
			g_simple_async_result_complete_in_idle (_data_->_async_result);
		} else {
			g_simple_async_result_complete (_data_->_async_result);
		}
		g_object_unref (_data_->_async_result);
		return FALSE;
	}
	if (_data_->_state_ == 0) {
		g_simple_async_result_complete_in_idle (_data_->_async_result);
	} else {
		g_simple_async_result_complete (_data_->_async_result);
	}
	g_object_unref (_data_->_async_result);
	return FALSE;
}


static void folks_individual_aggregator_link_personas_data_free (gpointer _data) {
	FolksIndividualAggregatorLinkPersonasData* _data_;
	_data_ = _data;
	_g_object_unref0 (_data_->personas);
	_g_object_unref0 (_data_->self);
	g_slice_free (FolksIndividualAggregatorLinkPersonasData, _data_);
}


void folks_individual_aggregator_link_personas (FolksIndividualAggregator* self, GeeSet* personas, GAsyncReadyCallback _callback_, gpointer _user_data_) {
	FolksIndividualAggregatorLinkPersonasData* _data_;
	FolksIndividualAggregator* _tmp0_;
	GeeSet* _tmp1_;
	GeeSet* _tmp2_;
	_data_ = g_slice_new0 (FolksIndividualAggregatorLinkPersonasData);
	_data_->_async_result = g_simple_async_result_new (G_OBJECT (self), _callback_, _user_data_, folks_individual_aggregator_link_personas);
	g_simple_async_result_set_op_res_gpointer (_data_->_async_result, _data_, folks_individual_aggregator_link_personas_data_free);
	_tmp0_ = _g_object_ref0 (self);
	_data_->self = _tmp0_;
	_tmp1_ = personas;
	_tmp2_ = _g_object_ref0 (_tmp1_);
	_data_->personas = _tmp2_;
	folks_individual_aggregator_link_personas_co (_data_);
}


void folks_individual_aggregator_link_personas_finish (FolksIndividualAggregator* self, GAsyncResult* _res_, GError** error) {
	FolksIndividualAggregatorLinkPersonasData* _data_;
	if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (_res_), error)) {
		return;
	}
	_data_ = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (_res_));
}


/**
   * Link the given {@link Persona}s together.
   *
   * Create links between the given {@link Persona}s so that they form a single
   * {@link Individual}. The new {@link Individual} will be returned via the
   * {@link IndividualAggregator.individuals_changed} signal.
   *
   * Removal of the {@link Individual}s which the {@link Persona}s were in
   * before is signalled by {@link IndividualAggregator.individuals_changed} and
   * {@link Individual.removed}.
   *
   * @param personas the {@link Persona}s to be linked
   * @since 0.5.1
   */
static void folks_individual_aggregator_link_personas_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_) {
	FolksIndividualAggregatorLinkPersonasData* _data_;
	_data_ = _user_data_;
	_data_->_source_object_ = source_object;
	_data_->_res_ = _res_;
	folks_individual_aggregator_link_personas_co (_data_);
}


static gboolean folks_individual_aggregator_link_personas_co (FolksIndividualAggregatorLinkPersonasData* _data_) {
	switch (_data_->_state_) {
		case 0:
		goto _state_0;
		case 1:
		goto _state_1;
		default:
		g_assert_not_reached ();
	}
	_state_0:
	_data_->_tmp0_ = _data_->self->priv->_writeable_store;
	if (_data_->_tmp0_ == NULL) {
		_data_->_tmp1_ = NULL;
		_data_->_tmp1_ = _ ("Can't link personas with no writeable store.");
		_data_->_tmp2_ = g_error_new_literal (FOLKS_INDIVIDUAL_AGGREGATOR_ERROR, FOLKS_INDIVIDUAL_AGGREGATOR_ERROR_NO_WRITEABLE_STORE, _data_->_tmp1_);
		_data_->_inner_error_ = _data_->_tmp2_;
		if (_data_->_inner_error_->domain == FOLKS_INDIVIDUAL_AGGREGATOR_ERROR) {
			g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
			g_error_free (_data_->_inner_error_);
			if (_data_->_state_ == 0) {
				g_simple_async_result_complete_in_idle (_data_->_async_result);
			} else {
				g_simple_async_result_complete (_data_->_async_result);
			}
			g_object_unref (_data_->_async_result);
			return FALSE;
		} else {
			g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _data_->_inner_error_->message, g_quark_to_string (_data_->_inner_error_->domain), _data_->_inner_error_->code);
			g_clear_error (&_data_->_inner_error_);
			return FALSE;
		}
	}
	_data_->_tmp3_ = _data_->personas;
	_data_->_tmp4_ = gee_collection_get_size ((GeeCollection*) _data_->_tmp3_);
	_data_->_tmp5_ = _data_->_tmp4_;
	if (_data_->_tmp5_ <= 1) {
		if (_data_->_state_ == 0) {
			g_simple_async_result_complete_in_idle (_data_->_async_result);
		} else {
			g_simple_async_result_complete (_data_->_async_result);
		}
		g_object_unref (_data_->_async_result);
		return FALSE;
	}
	_data_->_tmp6_ = _data_->self->priv->_linking_enabled;
	if (_data_->_tmp6_ == FALSE) {
		g_debug ("individual-aggregator.vala:1150: Can't link Personas: linking disabled" \
".");
		if (_data_->_state_ == 0) {
			g_simple_async_result_complete_in_idle (_data_->_async_result);
		} else {
			g_simple_async_result_complete (_data_->_async_result);
		}
		g_object_unref (_data_->_async_result);
		return FALSE;
	}
	_data_->_tmp7_ = _data_->self->priv->_writeable_store;
	_data_->_tmp8_ = folks_persona_store_get_type_id (_data_->_tmp7_);
	_data_->_tmp9_ = _data_->_tmp8_;
	_data_->_tmp10_ = _data_->self->priv->_configured_writeable_store_type_id;
	g_assert (g_strcmp0 (_data_->_tmp9_, _data_->_tmp10_) == 0);
	_data_->_tmp11_ = gee_hash_multi_map_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, FOLKS_TYPE_IM_FIELD_DETAILS, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL, (GHashFunc) folks_abstract_field_details_hash, (GEqualFunc) folks_abstract_field_details_equal);
	_data_->protocols_addrs_set = _data_->_tmp11_;
	_data_->_tmp12_ = gee_hash_multi_map_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, FOLKS_TYPE_WEB_SERVICE_FIELD_DETAILS, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL, (GHashFunc) folks_abstract_field_details_hash, (GEqualFunc) folks_abstract_field_details_equal);
	_data_->web_service_addrs_set = _data_->_tmp12_;
	_data_->_tmp13_ = gee_hash_set_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, NULL, NULL);
	_data_->local_ids = _data_->_tmp13_;
	{
		_data_->_tmp14_ = _data_->personas;
		_data_->_tmp15_ = NULL;
		_data_->_tmp15_ = gee_iterable_iterator ((GeeIterable*) _data_->_tmp14_);
		_data_->_persona_it = _data_->_tmp15_;
		while (TRUE) {
			_data_->_tmp16_ = _data_->_persona_it;
			_data_->_tmp17_ = FALSE;
			_data_->_tmp17_ = gee_iterator_next (_data_->_tmp16_);
			if (!_data_->_tmp17_) {
				break;
			}
			_data_->_tmp18_ = _data_->_persona_it;
			_data_->_tmp19_ = NULL;
			_data_->_tmp19_ = gee_iterator_get (_data_->_tmp18_);
			_data_->persona = (FolksPersona*) _data_->_tmp19_;
			_data_->_tmp20_ = _data_->persona;
			if (FOLKS_IS_IM_DETAILS (_data_->_tmp20_)) {
				_data_->_tmp21_ = _data_->persona;
				_data_->_tmp22_ = _g_object_ref0 (FOLKS_IM_DETAILS (_data_->_tmp21_));
				_data_->im_details = _data_->_tmp22_;
				{
					_data_->_tmp23_ = _data_->im_details;
					_data_->_tmp24_ = folks_im_details_get_im_addresses (_data_->_tmp23_);
					_data_->_tmp25_ = _data_->_tmp24_;
					_data_->_tmp26_ = NULL;
					_data_->_tmp26_ = gee_multi_map_get_keys (_data_->_tmp25_);
					_data_->_tmp27_ = _data_->_tmp26_;
					_data_->_tmp28_ = NULL;
					_data_->_tmp28_ = gee_iterable_iterator ((GeeIterable*) _data_->_tmp27_);
					_data_->_tmp29_ = _data_->_tmp28_;
					_g_object_unref0 (_data_->_tmp27_);
					_data_->_protocol_it = _data_->_tmp29_;
					while (TRUE) {
						_data_->_tmp30_ = _data_->_protocol_it;
						_data_->_tmp31_ = FALSE;
						_data_->_tmp31_ = gee_iterator_next (_data_->_tmp30_);
						if (!_data_->_tmp31_) {
							break;
						}
						_data_->_tmp32_ = _data_->_protocol_it;
						_data_->_tmp33_ = NULL;
						_data_->_tmp33_ = gee_iterator_get (_data_->_tmp32_);
						_data_->protocol = (gchar*) _data_->_tmp33_;
						_data_->_tmp34_ = _data_->im_details;
						_data_->_tmp35_ = folks_im_details_get_im_addresses (_data_->_tmp34_);
						_data_->_tmp36_ = _data_->_tmp35_;
						_data_->_tmp37_ = _data_->protocol;
						_data_->_tmp38_ = NULL;
						_data_->_tmp38_ = gee_multi_map_get (_data_->_tmp36_, _data_->_tmp37_);
						_data_->im_addresses = _data_->_tmp38_;
						{
							_data_->_tmp39_ = _data_->im_addresses;
							_data_->_tmp40_ = NULL;
							_data_->_tmp40_ = gee_iterable_iterator ((GeeIterable*) _data_->_tmp39_);
							_data_->_im_address_it = _data_->_tmp40_;
							while (TRUE) {
								_data_->_tmp41_ = _data_->_im_address_it;
								_data_->_tmp42_ = FALSE;
								_data_->_tmp42_ = gee_iterator_next (_data_->_tmp41_);
								if (!_data_->_tmp42_) {
									break;
								}
								_data_->_tmp43_ = _data_->_im_address_it;
								_data_->_tmp44_ = NULL;
								_data_->_tmp44_ = gee_iterator_get (_data_->_tmp43_);
								_data_->im_address = (FolksImFieldDetails*) _data_->_tmp44_;
								_data_->_tmp45_ = _data_->protocols_addrs_set;
								_data_->_tmp46_ = _data_->protocol;
								_data_->_tmp47_ = _data_->im_address;
								gee_multi_map_set ((GeeMultiMap*) _data_->_tmp45_, _data_->_tmp46_, _data_->_tmp47_);
								_g_object_unref0 (_data_->im_address);
							}
							_g_object_unref0 (_data_->_im_address_it);
						}
						_g_object_unref0 (_data_->im_addresses);
						_g_free0 (_data_->protocol);
					}
					_g_object_unref0 (_data_->_protocol_it);
				}
				_g_object_unref0 (_data_->im_details);
			}
			_data_->_tmp48_ = _data_->persona;
			if (FOLKS_IS_WEB_SERVICE_DETAILS (_data_->_tmp48_)) {
				_data_->_tmp49_ = _data_->persona;
				_data_->_tmp50_ = _g_object_ref0 (FOLKS_WEB_SERVICE_DETAILS (_data_->_tmp49_));
				_data_->ws_details = _data_->_tmp50_;
				{
					_data_->_tmp51_ = _data_->ws_details;
					_data_->_tmp52_ = folks_web_service_details_get_web_service_addresses (_data_->_tmp51_);
					_data_->_tmp53_ = _data_->_tmp52_;
					_data_->_tmp54_ = NULL;
					_data_->_tmp54_ = gee_multi_map_get_keys (_data_->_tmp53_);
					_data_->_tmp55_ = _data_->_tmp54_;
					_data_->_tmp56_ = NULL;
					_data_->_tmp56_ = gee_iterable_iterator ((GeeIterable*) _data_->_tmp55_);
					_data_->_tmp57_ = _data_->_tmp56_;
					_g_object_unref0 (_data_->_tmp55_);
					_data_->_web_service_it = _data_->_tmp57_;
					while (TRUE) {
						_data_->_tmp58_ = _data_->_web_service_it;
						_data_->_tmp59_ = FALSE;
						_data_->_tmp59_ = gee_iterator_next (_data_->_tmp58_);
						if (!_data_->_tmp59_) {
							break;
						}
						_data_->_tmp60_ = _data_->_web_service_it;
						_data_->_tmp61_ = NULL;
						_data_->_tmp61_ = gee_iterator_get (_data_->_tmp60_);
						_data_->web_service = (gchar*) _data_->_tmp61_;
						_data_->_tmp62_ = _data_->ws_details;
						_data_->_tmp63_ = folks_web_service_details_get_web_service_addresses (_data_->_tmp62_);
						_data_->_tmp64_ = _data_->_tmp63_;
						_data_->_tmp65_ = _data_->web_service;
						_data_->_tmp66_ = NULL;
						_data_->_tmp66_ = gee_multi_map_get (_data_->_tmp64_, _data_->_tmp65_);
						_data_->ws_addresses = _data_->_tmp66_;
						{
							_data_->_tmp67_ = _data_->ws_addresses;
							_data_->_tmp68_ = NULL;
							_data_->_tmp68_ = gee_iterable_iterator ((GeeIterable*) _data_->_tmp67_);
							_data_->_ws_fd_it = _data_->_tmp68_;
							while (TRUE) {
								_data_->_tmp69_ = _data_->_ws_fd_it;
								_data_->_tmp70_ = FALSE;
								_data_->_tmp70_ = gee_iterator_next (_data_->_tmp69_);
								if (!_data_->_tmp70_) {
									break;
								}
								_data_->_tmp71_ = _data_->_ws_fd_it;
								_data_->_tmp72_ = NULL;
								_data_->_tmp72_ = gee_iterator_get (_data_->_tmp71_);
								_data_->ws_fd = (FolksWebServiceFieldDetails*) _data_->_tmp72_;
								_data_->_tmp73_ = _data_->web_service_addrs_set;
								_data_->_tmp74_ = _data_->web_service;
								_data_->_tmp75_ = _data_->ws_fd;
								gee_multi_map_set ((GeeMultiMap*) _data_->_tmp73_, _data_->_tmp74_, _data_->_tmp75_);
								_g_object_unref0 (_data_->ws_fd);
							}
							_g_object_unref0 (_data_->_ws_fd_it);
						}
						_g_object_unref0 (_data_->ws_addresses);
						_g_free0 (_data_->web_service);
					}
					_g_object_unref0 (_data_->_web_service_it);
				}
				_g_object_unref0 (_data_->ws_details);
			}
			_data_->_tmp76_ = _data_->persona;
			if (FOLKS_IS_LOCAL_ID_DETAILS (_data_->_tmp76_)) {
				{
					_data_->_tmp77_ = _data_->persona;
					_data_->_tmp78_ = folks_local_id_details_get_local_ids (FOLKS_LOCAL_ID_DETAILS (_data_->_tmp77_));
					_data_->_tmp79_ = _data_->_tmp78_;
					_data_->_tmp80_ = NULL;
					_data_->_tmp80_ = gee_iterable_iterator ((GeeIterable*) _data_->_tmp79_);
					_data_->_id_it = _data_->_tmp80_;
					while (TRUE) {
						_data_->_tmp81_ = _data_->_id_it;
						_data_->_tmp82_ = FALSE;
						_data_->_tmp82_ = gee_iterator_next (_data_->_tmp81_);
						if (!_data_->_tmp82_) {
							break;
						}
						_data_->_tmp83_ = _data_->_id_it;
						_data_->_tmp84_ = NULL;
						_data_->_tmp84_ = gee_iterator_get (_data_->_tmp83_);
						_data_->id = (gchar*) _data_->_tmp84_;
						_data_->_tmp85_ = _data_->local_ids;
						_data_->_tmp86_ = _data_->id;
						gee_abstract_collection_add ((GeeAbstractCollection*) _data_->_tmp85_, _data_->_tmp86_);
						_g_free0 (_data_->id);
					}
					_g_object_unref0 (_data_->_id_it);
				}
			}
			_g_object_unref0 (_data_->persona);
		}
		_g_object_unref0 (_data_->_persona_it);
	}
	_data_->_tmp87_ = g_str_hash;
	_data_->_tmp88_ = g_str_equal;
	_data_->_tmp89_ = g_hash_table_new_full (_data_->_tmp87_, _data_->_tmp88_, _g_free0_, __vala_GValue_free0_);
	_data_->details = _data_->_tmp89_;
	_data_->_tmp90_ = _data_->protocols_addrs_set;
	_data_->_tmp91_ = gee_multi_map_get_size ((GeeMultiMap*) _data_->_tmp90_);
	_data_->_tmp92_ = _data_->_tmp91_;
	if (_data_->_tmp92_ > 0) {
		memset (&_data_->_tmp93_, 0, sizeof (GValue));
		g_value_init (&_data_->_tmp93_, GEE_TYPE_MULTI_MAP);
		_data_->_tmp94_ = _data_->_tmp93_;
		_data_->im_addresses_value = _data_->_tmp94_;
		_data_->_tmp95_ = _data_->protocols_addrs_set;
		g_value_set_object (&_data_->im_addresses_value, (GObject*) _data_->_tmp95_);
		_data_->_tmp96_ = _data_->details;
		_data_->_tmp97_ = NULL;
		_data_->_tmp97_ = folks_persona_store_detail_key (FOLKS_PERSONA_DETAIL_IM_ADDRESSES);
		_data_->_tmp98_ = g_strdup (_data_->_tmp97_);
		_data_->_tmp99_ = _data_->im_addresses_value;
		_data_->_tmp100_ = _data_->_tmp99_;
		_data_->_tmp101_ = __g_value_dup0 (&_data_->_tmp100_);
		g_hash_table_insert (_data_->_tmp96_, _data_->_tmp98_, _data_->_tmp101_);
		G_IS_VALUE (&_data_->im_addresses_value) ? (g_value_unset (&_data_->im_addresses_value), NULL) : NULL;
	}
	_data_->_tmp102_ = _data_->web_service_addrs_set;
	_data_->_tmp103_ = gee_multi_map_get_size ((GeeMultiMap*) _data_->_tmp102_);
	_data_->_tmp104_ = _data_->_tmp103_;
	if (_data_->_tmp104_ > 0) {
		memset (&_data_->_tmp105_, 0, sizeof (GValue));
		g_value_init (&_data_->_tmp105_, GEE_TYPE_MULTI_MAP);
		_data_->_tmp106_ = _data_->_tmp105_;
		_data_->web_service_addresses_value = _data_->_tmp106_;
		_data_->_tmp107_ = _data_->web_service_addrs_set;
		g_value_set_object (&_data_->web_service_addresses_value, (GObject*) _data_->_tmp107_);
		_data_->_tmp108_ = _data_->details;
		_data_->_tmp109_ = NULL;
		_data_->_tmp109_ = folks_persona_store_detail_key (FOLKS_PERSONA_DETAIL_WEB_SERVICE_ADDRESSES);
		_data_->_tmp110_ = g_strdup (_data_->_tmp109_);
		_data_->_tmp111_ = _data_->web_service_addresses_value;
		_data_->_tmp112_ = _data_->_tmp111_;
		_data_->_tmp113_ = __g_value_dup0 (&_data_->_tmp112_);
		g_hash_table_insert (_data_->_tmp108_, _data_->_tmp110_, _data_->_tmp113_);
		G_IS_VALUE (&_data_->web_service_addresses_value) ? (g_value_unset (&_data_->web_service_addresses_value), NULL) : NULL;
	}
	_data_->_tmp114_ = _data_->local_ids;
	_data_->_tmp115_ = gee_collection_get_size ((GeeCollection*) _data_->_tmp114_);
	_data_->_tmp116_ = _data_->_tmp115_;
	if (_data_->_tmp116_ > 0) {
		memset (&_data_->_tmp117_, 0, sizeof (GValue));
		g_value_init (&_data_->_tmp117_, GEE_TYPE_SET);
		_data_->_tmp118_ = _data_->_tmp117_;
		_data_->local_ids_value = _data_->_tmp118_;
		_data_->_tmp119_ = _data_->local_ids;
		g_value_set_object (&_data_->local_ids_value, (GObject*) _data_->_tmp119_);
		_data_->_tmp120_ = _data_->details;
		_data_->_tmp121_ = NULL;
		_data_->_tmp121_ = folks_persona_store_detail_key (FOLKS_PERSONA_DETAIL_LOCAL_IDS);
		_data_->_tmp122_ = g_strdup (_data_->_tmp121_);
		_data_->_tmp123_ = _data_->local_ids_value;
		_data_->_tmp124_ = _data_->_tmp123_;
		_data_->_tmp125_ = __g_value_dup0 (&_data_->_tmp124_);
		g_hash_table_insert (_data_->_tmp120_, _data_->_tmp122_, _data_->_tmp125_);
		G_IS_VALUE (&_data_->local_ids_value) ? (g_value_unset (&_data_->local_ids_value), NULL) : NULL;
	}
	_data_->_tmp126_ = _data_->self->priv->_writeable_store;
	_data_->_tmp127_ = _data_->details;
	_data_->_state_ = 1;
	folks_individual_aggregator_add_persona_from_details (_data_->self, NULL, _data_->_tmp126_, _data_->_tmp127_, folks_individual_aggregator_link_personas_ready, _data_);
	return FALSE;
	_state_1:
	_data_->_tmp128_ = NULL;
	_data_->_tmp128_ = folks_individual_aggregator_add_persona_from_details_finish (_data_->self, _data_->_res_, &_data_->_inner_error_);
	_data_->_tmp129_ = _data_->_tmp128_;
	_g_object_unref0 (_data_->_tmp129_);
	if (_data_->_inner_error_ != NULL) {
		if (_data_->_inner_error_->domain == FOLKS_INDIVIDUAL_AGGREGATOR_ERROR) {
			g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
			g_error_free (_data_->_inner_error_);
			_g_hash_table_unref0 (_data_->details);
			_g_object_unref0 (_data_->local_ids);
			_g_object_unref0 (_data_->web_service_addrs_set);
			_g_object_unref0 (_data_->protocols_addrs_set);
			if (_data_->_state_ == 0) {
				g_simple_async_result_complete_in_idle (_data_->_async_result);
			} else {
				g_simple_async_result_complete (_data_->_async_result);
			}
			g_object_unref (_data_->_async_result);
			return FALSE;
		} else {
			_g_hash_table_unref0 (_data_->details);
			_g_object_unref0 (_data_->local_ids);
			_g_object_unref0 (_data_->web_service_addrs_set);
			_g_object_unref0 (_data_->protocols_addrs_set);
			g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _data_->_inner_error_->message, g_quark_to_string (_data_->_inner_error_->domain), _data_->_inner_error_->code);
			g_clear_error (&_data_->_inner_error_);
			return FALSE;
		}
	}
	_g_hash_table_unref0 (_data_->details);
	_g_object_unref0 (_data_->local_ids);
	_g_object_unref0 (_data_->web_service_addrs_set);
	_g_object_unref0 (_data_->protocols_addrs_set);
	if (_data_->_state_ == 0) {
		g_simple_async_result_complete_in_idle (_data_->_async_result);
	} else {
		g_simple_async_result_complete (_data_->_async_result);
	}
	g_object_unref (_data_->_async_result);
	return FALSE;
}


static void folks_individual_aggregator_unlink_individual_data_free (gpointer _data) {
	FolksIndividualAggregatorUnlinkIndividualData* _data_;
	_data_ = _data;
	_g_object_unref0 (_data_->individual);
	_g_object_unref0 (_data_->self);
	g_slice_free (FolksIndividualAggregatorUnlinkIndividualData, _data_);
}


void folks_individual_aggregator_unlink_individual (FolksIndividualAggregator* self, FolksIndividual* individual, GAsyncReadyCallback _callback_, gpointer _user_data_) {
	FolksIndividualAggregatorUnlinkIndividualData* _data_;
	FolksIndividualAggregator* _tmp0_;
	FolksIndividual* _tmp1_;
	FolksIndividual* _tmp2_;
	_data_ = g_slice_new0 (FolksIndividualAggregatorUnlinkIndividualData);
	_data_->_async_result = g_simple_async_result_new (G_OBJECT (self), _callback_, _user_data_, folks_individual_aggregator_unlink_individual);
	g_simple_async_result_set_op_res_gpointer (_data_->_async_result, _data_, folks_individual_aggregator_unlink_individual_data_free);
	_tmp0_ = _g_object_ref0 (self);
	_data_->self = _tmp0_;
	_tmp1_ = individual;
	_tmp2_ = _g_object_ref0 (_tmp1_);
	_data_->individual = _tmp2_;
	folks_individual_aggregator_unlink_individual_co (_data_);
}


void folks_individual_aggregator_unlink_individual_finish (FolksIndividualAggregator* self, GAsyncResult* _res_, GError** error) {
	FolksIndividualAggregatorUnlinkIndividualData* _data_;
	if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (_res_), error)) {
		return;
	}
	_data_ = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (_res_));
}


/**
   * Unlinks the given {@link Individual} into its constituent {@link Persona}s.
   *
   * This completely unlinks the given {@link Individual}, destroying all of
   * its writeable {@link Persona}s.
   *
   * The {@link Individual}'s removal is signalled by
   * {@link IndividualAggregator.individuals_changed} and
   * {@link Individual.removed}.
   *
   * The {@link Persona}s comprising the {@link Individual} will be re-linked
   * into one or more new {@link Individual}s, depending on how much linking
   * data remains (typically only implicit links remain). The addition of these
   * new {@link Individual}s will be signalled by
   * {@link IndividualAggregator.individuals_changed}.
   *
   * @param individual the {@link Individual} to unlink
   * @since 0.1.13
   */
static void folks_individual_aggregator_unlink_individual_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_) {
	FolksIndividualAggregatorUnlinkIndividualData* _data_;
	_data_ = _user_data_;
	_data_->_source_object_ = source_object;
	_data_->_res_ = _res_;
	folks_individual_aggregator_unlink_individual_co (_data_);
}


static gboolean folks_individual_aggregator_unlink_individual_co (FolksIndividualAggregatorUnlinkIndividualData* _data_) {
	switch (_data_->_state_) {
		case 0:
		goto _state_0;
		case 1:
		goto _state_1;
		default:
		g_assert_not_reached ();
	}
	_state_0:
	_data_->_tmp0_ = _data_->self->priv->_linking_enabled;
	if (_data_->_tmp0_ == FALSE) {
		_data_->_tmp1_ = _data_->individual;
		_data_->_tmp2_ = folks_individual_get_id (_data_->_tmp1_);
		_data_->_tmp3_ = _data_->_tmp2_;
		g_debug ("individual-aggregator.vala:1271: Can't unlink Individual '%s': linking" \
" disabled.", _data_->_tmp3_);
		if (_data_->_state_ == 0) {
			g_simple_async_result_complete_in_idle (_data_->_async_result);
		} else {
			g_simple_async_result_complete (_data_->_async_result);
		}
		g_object_unref (_data_->_async_result);
		return FALSE;
	}
	_data_->_tmp4_ = _data_->individual;
	_data_->_tmp5_ = folks_individual_get_id (_data_->_tmp4_);
	_data_->_tmp6_ = _data_->_tmp5_;
	g_debug ("individual-aggregator.vala:1276: Unlinking Individual '%s', deleting P" \
"ersonas:", _data_->_tmp6_);
	_data_->_tmp7_ = gee_hash_set_new (FOLKS_TYPE_PERSONA, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL, NULL);
	_data_->personas = _data_->_tmp7_;
	{
		_data_->_tmp8_ = _data_->individual;
		_data_->_tmp9_ = folks_individual_get_personas (_data_->_tmp8_);
		_data_->_tmp10_ = _data_->_tmp9_;
		_data_->_tmp11_ = NULL;
		_data_->_tmp11_ = gee_iterable_iterator ((GeeIterable*) _data_->_tmp10_);
		_data_->_p_it = _data_->_tmp11_;
		while (TRUE) {
			_data_->_tmp12_ = _data_->_p_it;
			_data_->_tmp13_ = FALSE;
			_data_->_tmp13_ = gee_iterator_next (_data_->_tmp12_);
			if (!_data_->_tmp13_) {
				break;
			}
			_data_->_tmp14_ = _data_->_p_it;
			_data_->_tmp15_ = NULL;
			_data_->_tmp15_ = gee_iterator_get (_data_->_tmp14_);
			_data_->p = (FolksPersona*) _data_->_tmp15_;
			_data_->_tmp16_ = _data_->personas;
			_data_->_tmp17_ = _data_->p;
			gee_abstract_collection_add ((GeeAbstractCollection*) _data_->_tmp16_, _data_->_tmp17_);
			_g_object_unref0 (_data_->p);
		}
		_g_object_unref0 (_data_->_p_it);
	}
	{
		_data_->_tmp18_ = _data_->personas;
		_data_->_tmp19_ = NULL;
		_data_->_tmp19_ = gee_abstract_collection_iterator ((GeeAbstractCollection*) _data_->_tmp18_);
		_data_->_persona_it = _data_->_tmp19_;
		while (TRUE) {
			_data_->_tmp20_ = _data_->_persona_it;
			_data_->_tmp21_ = FALSE;
			_data_->_tmp21_ = gee_iterator_next (_data_->_tmp20_);
			if (!_data_->_tmp21_) {
				break;
			}
			_data_->_tmp22_ = _data_->_persona_it;
			_data_->_tmp23_ = NULL;
			_data_->_tmp23_ = gee_iterator_get (_data_->_tmp22_);
			_data_->persona = (FolksPersona*) _data_->_tmp23_;
			_data_->_tmp24_ = _data_->persona;
			_data_->_tmp25_ = folks_persona_get_store (_data_->_tmp24_);
			_data_->_tmp26_ = _data_->_tmp25_;
			_data_->_tmp27_ = _data_->self->priv->_writeable_store;
			if (_data_->_tmp26_ == _data_->_tmp27_) {
				_data_->_tmp29_ = _data_->persona;
				_data_->_tmp30_ = folks_persona_get_is_user (_data_->_tmp29_);
				_data_->_tmp31_ = _data_->_tmp30_;
				if (_data_->_tmp31_) {
					_data_->_tmp28_ = "yes";
				} else {
					_data_->_tmp28_ = "no";
				}
				_data_->_tmp32_ = _data_->persona;
				_data_->_tmp33_ = folks_persona_get_uid (_data_->_tmp32_);
				_data_->_tmp34_ = _data_->_tmp33_;
				_data_->_tmp35_ = _data_->_tmp28_;
				_data_->_tmp36_ = _data_->persona;
				_data_->_tmp37_ = folks_persona_get_iid (_data_->_tmp36_);
				_data_->_tmp38_ = _data_->_tmp37_;
				g_debug ("individual-aggregator.vala:1294:     %s (is user: %s, IID: %s)", _data_->_tmp34_, _data_->_tmp35_, _data_->_tmp38_);
				_data_->_tmp39_ = _data_->self->priv->_writeable_store;
				_data_->_tmp40_ = _data_->persona;
				_data_->_state_ = 1;
				folks_persona_store_remove_persona (_data_->_tmp39_, _data_->_tmp40_, folks_individual_aggregator_unlink_individual_ready, _data_);
				return FALSE;
				_state_1:
				folks_persona_store_remove_persona_finish (_data_->_tmp39_, _data_->_res_, &_data_->_inner_error_);
				if (_data_->_inner_error_ != NULL) {
					g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
					g_error_free (_data_->_inner_error_);
					_g_object_unref0 (_data_->persona);
					_g_object_unref0 (_data_->_persona_it);
					_g_object_unref0 (_data_->personas);
					if (_data_->_state_ == 0) {
						g_simple_async_result_complete_in_idle (_data_->_async_result);
					} else {
						g_simple_async_result_complete (_data_->_async_result);
					}
					g_object_unref (_data_->_async_result);
					return FALSE;
				}
			}
			_g_object_unref0 (_data_->persona);
		}
		_g_object_unref0 (_data_->_persona_it);
	}
	_g_object_unref0 (_data_->personas);
	if (_data_->_state_ == 0) {
		g_simple_async_result_complete_in_idle (_data_->_async_result);
	} else {
		g_simple_async_result_complete (_data_->_async_result);
	}
	g_object_unref (_data_->_async_result);
	return FALSE;
}


gboolean folks_individual_aggregator_get_is_prepared (FolksIndividualAggregator* self) {
	gboolean result;
	gboolean _tmp0_;
	g_return_val_if_fail (self != NULL, FALSE);
	_tmp0_ = self->priv->_is_prepared;
	result = _tmp0_;
	return result;
}


FolksPersonaStore* folks_individual_aggregator_get_primary_store (FolksIndividualAggregator* self) {
	FolksPersonaStore* result;
	FolksPersonaStore* _tmp0_;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = self->priv->_writeable_store;
	result = _tmp0_;
	return result;
}


GeeMap* folks_individual_aggregator_get_individuals (FolksIndividualAggregator* self) {
	GeeMap* result;
	GeeMap* _tmp0_;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = self->priv->_individuals_ro;
	result = _tmp0_;
	return result;
}


static void folks_individual_aggregator_set_individuals (FolksIndividualAggregator* self, GeeMap* value) {
	GeeMap* _tmp0_;
	GeeMap* _tmp1_;
	GeeMap* _tmp2_;
	GeeMap* _tmp3_;
	GeeMap* _tmp4_;
	g_return_if_fail (self != NULL);
	_tmp0_ = value;
	_tmp1_ = _g_object_ref0 (_tmp0_);
	_g_object_unref0 (self->priv->_individuals);
	self->priv->_individuals = _tmp1_;
	_tmp2_ = self->priv->_individuals;
	_tmp3_ = gee_map_get_read_only_view (_tmp2_);
	_tmp4_ = _tmp3_;
	_g_object_unref0 (self->priv->_individuals_ro);
	self->priv->_individuals_ro = _tmp4_;
	g_object_notify ((GObject *) self, "individuals");
}


FolksIndividual* folks_individual_aggregator_get_user (FolksIndividualAggregator* self) {
	FolksIndividual* result;
	FolksIndividual* _tmp0_;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = self->priv->_user;
	result = _tmp0_;
	return result;
}


static void folks_individual_aggregator_set_user (FolksIndividualAggregator* self, FolksIndividual* value) {
	FolksIndividual* _tmp0_;
	FolksIndividual* _tmp1_;
	g_return_if_fail (self != NULL);
	_tmp0_ = value;
	_tmp1_ = _g_object_ref0 (_tmp0_);
	_g_object_unref0 (self->priv->_user);
	self->priv->_user = _tmp1_;
	g_object_notify ((GObject *) self, "user");
}


static void g_cclosure_user_marshal_VOID__OBJECT_OBJECT_STRING_OBJECT_ENUM (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
	typedef void (*GMarshalFunc_VOID__OBJECT_OBJECT_STRING_OBJECT_ENUM) (gpointer data1, gpointer arg_1, gpointer arg_2, const char* arg_3, gpointer arg_4, gint arg_5, gpointer data2);
	register GMarshalFunc_VOID__OBJECT_OBJECT_STRING_OBJECT_ENUM callback;
	register GCClosure * cc;
	register gpointer data1;
	register gpointer data2;
	cc = (GCClosure *) closure;
	g_return_if_fail (n_param_values == 6);
	if (G_CCLOSURE_SWAP_DATA (closure)) {
		data1 = closure->data;
		data2 = param_values->data[0].v_pointer;
	} else {
		data1 = param_values->data[0].v_pointer;
		data2 = closure->data;
	}
	callback = (GMarshalFunc_VOID__OBJECT_OBJECT_STRING_OBJECT_ENUM) (marshal_data ? marshal_data : cc->callback);
	callback (data1, g_value_get_object (param_values + 1), g_value_get_object (param_values + 2), g_value_get_string (param_values + 3), g_value_get_object (param_values + 4), g_value_get_enum (param_values + 5), data2);
}


static void folks_individual_aggregator_class_init (FolksIndividualAggregatorClass * klass) {
	folks_individual_aggregator_parent_class = g_type_class_peek_parent (klass);
	g_type_class_add_private (klass, sizeof (FolksIndividualAggregatorPrivate));
	G_OBJECT_CLASS (klass)->get_property = _vala_folks_individual_aggregator_get_property;
	G_OBJECT_CLASS (klass)->set_property = _vala_folks_individual_aggregator_set_property;
	G_OBJECT_CLASS (klass)->finalize = folks_individual_aggregator_finalize;
	/**
	   * Whether {@link IndividualAggregator.prepare} has successfully completed for
	   * this aggregator.
	   *
	   * @since 0.3.0
	   */
	g_object_class_install_property (G_OBJECT_CLASS (klass), FOLKS_INDIVIDUAL_AGGREGATOR_IS_PREPARED, g_param_spec_boolean ("is-prepared", "is-prepared", "is-prepared", FALSE, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE));
	/**
	   * Our configured primary (writeable) store.
	   *
	   * Which one to use is decided (in order or precedence)
	   * by:
	   *
	   * - the FOLKS_WRITEABLE_STORE env var (mostly for debugging)
	   * - the GConf key set in _FOLKS_CONFIG_KEY (system set store)
	   * - going with the `key-file` or `eds` store as the fall-back option
	   *
	   * @since 0.5.0
	   */
	g_object_class_install_property (G_OBJECT_CLASS (klass), FOLKS_INDIVIDUAL_AGGREGATOR_PRIMARY_STORE, g_param_spec_object ("primary-store", "primary-store", "primary-store", FOLKS_TYPE_PERSONA_STORE, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE));
	/**
	   * A map from {@link Individual.id}s to their {@link Individual}s.
	   *
	   * This is the canonical set of {@link Individual}s provided by this
	   * IndividualAggregator.
	   *
	   * {@link Individual}s may be added or removed using
	   * {@link IndividualAggregator.add_persona_from_details} and
	   * {@link IndividualAggregator.remove_individual}, respectively.
	   *
	   * @since 0.5.1
	   */
	g_object_class_install_property (G_OBJECT_CLASS (klass), FOLKS_INDIVIDUAL_AGGREGATOR_INDIVIDUALS, g_param_spec_object ("individuals", "individuals", "individuals", GEE_TYPE_MAP, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE));
	/**
	   * The {@link Individual} representing the user.
	   *
	   * If it exists, this holds the {@link Individual} who is the user: the
	   * {@link Individual} containing the {@link Persona}s who are the owners of
	   * the accounts for their respective backends.
	   *
	   * @since 0.3.0
	   */
	g_object_class_install_property (G_OBJECT_CLASS (klass), FOLKS_INDIVIDUAL_AGGREGATOR_USER, g_param_spec_object ("user", "user", "user", FOLKS_TYPE_INDIVIDUAL, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE));
	/**
	   * Emitted when one or more {@link Individual}s are added to or removed from
	   * the aggregator.
	   *
	   * This will not be emitted until after {@link IndividualAggregator.prepare}
	   * has been called.
	   *
	   * @param added a list of {@link Individual}s which have been added
	   * @param removed a list of {@link Individual}s which have been removed
	   * @param message a string message from the backend, if any
	   * @param actor the {@link Persona} who made the change, if known
	   * @param reason the reason for the change
	   *
	   * @since 0.5.1
	   */
	g_signal_new ("individuals_changed", FOLKS_TYPE_INDIVIDUAL_AGGREGATOR, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__OBJECT_OBJECT_STRING_OBJECT_ENUM, G_TYPE_NONE, 5, GEE_TYPE_SET, GEE_TYPE_SET, G_TYPE_STRING, FOLKS_TYPE_PERSONA, FOLKS_GROUP_DETAILS_TYPE_CHANGE_REASON);
}


static void folks_individual_aggregator_instance_init (FolksIndividualAggregator * self) {
	self->priv = FOLKS_INDIVIDUAL_AGGREGATOR_GET_PRIVATE (self);
	self->priv->_linking_enabled = TRUE;
	g_static_rec_mutex_init (&self->priv->__lock__is_prepared);
	self->priv->_is_prepared = FALSE;
	self->priv->_prepare_pending = FALSE;
}


static void folks_individual_aggregator_finalize (GObject* obj) {
	FolksIndividualAggregator * self;
	FolksBackendStore* _tmp0_;
	guint _tmp1_ = 0U;
	FolksDebug* _tmp2_;
	guint _tmp3_ = 0U;
	self = FOLKS_INDIVIDUAL_AGGREGATOR (obj);
	_tmp0_ = self->priv->_backend_store;
	g_signal_parse_name ("backend-available", FOLKS_TYPE_BACKEND_STORE, &_tmp1_, NULL, FALSE);
	g_signal_handlers_disconnect_matched (_tmp0_, G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, _tmp1_, 0, NULL, (GCallback) __folks_individual_aggregator_backend_available_cb_folks_backend_store_backend_available, self);
	_g_object_unref0 (self->priv->_backend_store);
	self->priv->_backend_store = NULL;
	_tmp2_ = self->priv->_debug;
	g_signal_parse_name ("print-status", FOLKS_TYPE_DEBUG, &_tmp3_, NULL, FALSE);
	g_signal_handlers_disconnect_matched (_tmp2_, G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, _tmp3_, 0, NULL, (GCallback) __folks_individual_aggregator_debug_print_status_folks_debug_print_status, self);
	_g_object_unref0 (self->priv->_backend_store);
	_g_object_unref0 (self->priv->_stores);
	_g_object_unref0 (self->priv->_backends);
	_g_hash_table_unref0 (self->priv->_link_map);
	g_static_rec_mutex_free (&self->priv->__lock__is_prepared);
	_g_object_unref0 (self->priv->_debug);
	_g_free0 (self->priv->_configured_writeable_store_type_id);
	_g_free0 (self->priv->_configured_writeable_store_id);
	_g_object_unref0 (self->priv->_individuals);
	_g_object_unref0 (self->priv->_individuals_ro);
	_g_object_unref0 (self->priv->_user);
	G_OBJECT_CLASS (folks_individual_aggregator_parent_class)->finalize (obj);
}


/**
 * Stores {@link Individual}s which have been created through
 * aggregation of all the {@link Persona}s provided by the various
 * {@link Backend}s.
 *
 * This is the main interface for client applications.
 */
GType folks_individual_aggregator_get_type (void) {
	static volatile gsize folks_individual_aggregator_type_id__volatile = 0;
	if (g_once_init_enter (&folks_individual_aggregator_type_id__volatile)) {
		static const GTypeInfo g_define_type_info = { sizeof (FolksIndividualAggregatorClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) folks_individual_aggregator_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (FolksIndividualAggregator), 0, (GInstanceInitFunc) folks_individual_aggregator_instance_init, NULL };
		GType folks_individual_aggregator_type_id;
		folks_individual_aggregator_type_id = g_type_register_static (G_TYPE_OBJECT, "FolksIndividualAggregator", &g_define_type_info, 0);
		g_once_init_leave (&folks_individual_aggregator_type_id__volatile, folks_individual_aggregator_type_id);
	}
	return folks_individual_aggregator_type_id__volatile;
}


static void _vala_folks_individual_aggregator_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) {
	FolksIndividualAggregator * self;
	self = FOLKS_INDIVIDUAL_AGGREGATOR (object);
	switch (property_id) {
		case FOLKS_INDIVIDUAL_AGGREGATOR_IS_PREPARED:
		g_value_set_boolean (value, folks_individual_aggregator_get_is_prepared (self));
		break;
		case FOLKS_INDIVIDUAL_AGGREGATOR_PRIMARY_STORE:
		g_value_set_object (value, folks_individual_aggregator_get_primary_store (self));
		break;
		case FOLKS_INDIVIDUAL_AGGREGATOR_INDIVIDUALS:
		g_value_set_object (value, folks_individual_aggregator_get_individuals (self));
		break;
		case FOLKS_INDIVIDUAL_AGGREGATOR_USER:
		g_value_set_object (value, folks_individual_aggregator_get_user (self));
		break;
		default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
		break;
	}
}


static void _vala_folks_individual_aggregator_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) {
	FolksIndividualAggregator * self;
	self = FOLKS_INDIVIDUAL_AGGREGATOR (object);
	switch (property_id) {
		case FOLKS_INDIVIDUAL_AGGREGATOR_INDIVIDUALS:
		folks_individual_aggregator_set_individuals (self, g_value_get_object (value));
		break;
		case FOLKS_INDIVIDUAL_AGGREGATOR_USER:
		folks_individual_aggregator_set_user (self, g_value_get_object (value));
		break;
		default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
		break;
	}
}


static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func) {
	if ((array != NULL) && (destroy_func != NULL)) {
		int i;
		for (i = 0; i < array_length; i = i + 1) {
			if (((gpointer*) array)[i] != NULL) {
				destroy_func (((gpointer*) array)[i]);
			}
		}
	}
}


static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func) {
	_vala_array_destroy (array, array_length, destroy_func);
	g_free (array);
}


static gint _vala_array_length (gpointer array) {
	int length;
	length = 0;
	if (array) {
		while (((gpointer*) array)[length]) {
			length++;
		}
	}
	return length;
}



