compiler/libec (#1115): Fixed inheriting from templated container order-dependent bug
[sdk] / compiler / bootstrap / ecere / bootstrap / instance.c
index 217b02f..e00ee5b 100644 (file)
@@ -3754,6 +3754,13 @@ return link->data;
 return (((void *)0));
 }
 
+struct __ecereNameSpace__ecere__com__Class *  __ecereNameSpace__ecere__com__System_FindClass(struct __ecereNameSpace__ecere__com__Instance *  module, const char *  name, unsigned int registerTemplatesInternalDecl);
+
+struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_FindClass(struct __ecereNameSpace__ecere__com__Instance * module, const char * name)
+{
+return __ecereNameSpace__ecere__com__System_FindClass(module, name, 0);
+}
+
 static struct __ecereNameSpace__ecere__com__Instance *  __ecereNameSpace__ecere__com__Module_Load(struct __ecereNameSpace__ecere__com__Instance *  fromModule, const char *  name, int importAccess, unsigned int ensureCOM);
 
 struct __ecereNameSpace__ecere__com__Instance * __ecereNameSpace__ecere__com__eModule_Load(struct __ecereNameSpace__ecere__com__Instance * fromModule, const char * name, int importAccess)
@@ -4146,679 +4153,653 @@ __ecereNameSpace__ecere__com__FreeTemplatesDerivatives(_class);
 }
 }
 
-static void __ecereNameSpace__ecere__com__ComputeClassParameters(struct __ecereNameSpace__ecere__com__Class * templatedClass, const char * templateParams, struct __ecereNameSpace__ecere__com__Instance * findModule)
+static void __ecereNameSpace__ecere__com__FreeTemplate(struct __ecereNameSpace__ecere__com__Class * template)
 {
-char ch;
-const char * nextParamStart = templateParams ? (templateParams + 1) : (((void *)0));
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
-struct __ecereNameSpace__ecere__com__Class * lastClass = (((void *)0)), * sClass;
-int curParamID = 0;
-int numParams = 0;
-struct __ecereNameSpace__ecere__com__Class * _class = templatedClass->templateClass ? templatedClass->templateClass : templatedClass;
+struct __ecereNameSpace__ecere__sys__OldLink * deriv;
 
-for(sClass = _class; sClass; sClass = sClass->base)
+if(template->nameSpace)
 {
-if(sClass->templateClass)
-sClass = sClass->templateClass;
-numParams += sClass->templateParams.count;
+struct __ecereNameSpace__ecere__com__BTNamedLink * link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*template->nameSpace).classes, template->name);
+
+if(link)
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*template->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)link);
 }
-if(templatedClass->templateArgs)
-__ecereNameSpace__ecere__com__FreeTemplateArgs(templatedClass);
-(__ecereNameSpace__ecere__com__eSystem_Delete(templatedClass->templateArgs), templatedClass->templateArgs = 0);
-templatedClass->templateArgs = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__ClassTemplateArgument) * (numParams));
-templatedClass->numParams = numParams;
-if(_class != templatedClass)
+__ecereNameSpace__ecere__com__FreeTemplatesDerivatives(template);
+__ecereNameSpace__ecere__com__FreeTemplateArgs(template);
+while((deriv = template->derivatives.first))
 {
+((struct __ecereNameSpace__ecere__com__Class *)deriv->data)->base = (((void *)0));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&template->derivatives, deriv);
+}
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->fullName), template->fullName = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->name), template->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete(template->templateArgs), template->templateArgs = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->dataTypeString), template->dataTypeString = 0);
+if(template->module)
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)template->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, template);
+else
+__ecereNameSpace__ecere__com___free(template);
 }
-if(templatedClass->base && templatedClass->base->templateArgs && _class == templatedClass)
-{
-struct __ecereNameSpace__ecere__com__Class * sClass;
 
-memcpy(templatedClass->templateArgs, templatedClass->base->templateArgs, sizeof(struct __ecereNameSpace__ecere__com__ClassTemplateArgument) * (numParams - templatedClass->templateParams.count));
-for(sClass = templatedClass->base; sClass; sClass = sClass->base)
+static void __ecereNameSpace__ecere__com__FreeTemplates(struct __ecereNameSpace__ecere__com__Class * _class)
 {
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
-struct __ecereNameSpace__ecere__com__Class * prevClass;
-int id = 0;
+struct __ecereNameSpace__ecere__sys__OldLink * deriv, * template;
 
-for(prevClass = sClass->base; prevClass; prevClass = prevClass->base)
+for(deriv = _class->derivatives.first; deriv; deriv = deriv->next)
 {
-if(prevClass->templateClass)
-prevClass = prevClass->templateClass;
-id += prevClass->templateParams.count;
+__ecereNameSpace__ecere__com__FreeTemplates(deriv->data);
 }
-if(sClass->templateClass)
-sClass = sClass->templateClass;
-for(param = sClass->templateParams.first; param; param = param->next)
-__ecereNameSpace__ecere__com__CopyTemplateArg(param, &templatedClass->templateArgs[id++]);
+__ecereNameSpace__ecere__com__FreeTemplateArgs(_class);
+(__ecereNameSpace__ecere__com__eSystem_Delete(_class->templateArgs), _class->templateArgs = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->dataTypeString), _class->dataTypeString = 0);
+while((template = _class->templatized.first))
+{
+__ecereNameSpace__ecere__com__FreeTemplates(template->data);
+__ecereNameSpace__ecere__com__FreeTemplate(template->data);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templatized, template);
 }
 }
-while(nextParamStart)
-{
-const char * paramStart = nextParamStart;
-const char * paramEnd;
-int level = 0;
 
-while(*paramStart == ' ')
-paramStart++;
-paramEnd = paramStart;
-while((ch = *paramEnd, ch && (level > 0 || (ch != '>' && ch != ','))))
+void __ecereNameSpace__ecere__com__eClass_Unregister(struct __ecereNameSpace__ecere__com__Class * _class)
 {
-if(ch == '<')
-level++;
-if(ch == '>')
-level--;
-paramEnd++;
-}
-nextParamStart = (ch == ',') ? (paramEnd + 1) : (((void *)0));
-while(*paramEnd == ' ')
-paramEnd--;
-if(paramEnd > paramStart)
+struct __ecereNameSpace__ecere__com__BTNamedLink * namedLink;
+struct __ecereNameSpace__ecere__com__DataMember * member;
+struct __ecereNameSpace__ecere__com__Method * method;
+struct __ecereNameSpace__ecere__sys__OldLink * deriv, * template;
+struct __ecereNameSpace__ecere__com__ClassProperty * classProp;
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+
+if(_class->templateClass)
 {
-const char * ptr, * equal = (((void *)0));
+struct __ecereNameSpace__ecere__sys__OldLink * templateLink;
 
-for(ptr = paramStart; ptr <= paramEnd; ptr++)
+for(templateLink = _class->templateClass->templatized.first; templateLink; templateLink = templateLink->next)
 {
-if(*ptr == '=')
+if(templateLink->data == _class)
 {
-equal = ptr;
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templateClass->templatized, templateLink);
 break;
 }
 }
-if(equal)
-{
-const char * end = equal - 1;
-char ident[1024];
-
-while(*end == ' ')
-end--;
-strncpy(ident, paramStart, end + 1 - paramStart);
-ident[end + 1 - paramStart] = 0;
-for(sClass = _class; sClass; sClass = sClass->base)
-{
-if(sClass->templateClass)
-sClass = sClass->templateClass;
-for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
-{
-if(!strcmp(curParam->name, ident))
-break;
+__ecereNameSpace__ecere__com__FreeTemplate(_class);
+return ;
 }
-if(curParam)
-{
-struct __ecereNameSpace__ecere__com__Class * nextClass;
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * prevParam;
-
-curParamID = 0;
-for(prevParam = curParam->prev; prevParam; prevParam = prevParam->prev)
-curParamID++;
-for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
+(__ecereNameSpace__ecere__com__eSystem_Delete(_class->_vTbl), _class->_vTbl = 0);
+__ecereNameSpace__ecere__com__FreeTemplates(_class);
+while((template = _class->templatized.first))
 {
-if(nextClass->templateClass)
-nextClass = nextClass->templateClass;
-curParamID += nextClass->templateParams.count;
+__ecereNameSpace__ecere__com__FreeTemplate(template->data);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templatized, template);
 }
-break;
+while((member = _class->membersAndProperties.first))
+{
+if(!member->isProperty && (member->type == 1 || member->type == 2))
+__ecereNameSpace__ecere__com__DataMember_Free(member);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->name), member->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->dataTypeString), member->dataTypeString = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->membersAndProperties, member);
 }
+while((member = _class->conversions.first))
+{
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->name), member->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->dataTypeString), member->dataTypeString = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->conversions, member);
 }
-lastClass = sClass;
+while((namedLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->prop)))
+{
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->prop, (struct __ecereNameSpace__ecere__sys__BTNode *)namedLink);
 }
-else
+while((namedLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->members)))
 {
-if(curParam)
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->members, (struct __ecereNameSpace__ecere__sys__BTNode *)namedLink);
+}
+while((classProp = (struct __ecereNameSpace__ecere__com__ClassProperty *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->classProperties)))
 {
-curParam = curParam->next;
-curParamID++;
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)classProp->name), classProp->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)classProp->dataTypeString), classProp->dataTypeString = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->classProperties, (struct __ecereNameSpace__ecere__sys__BTNode *)classProp);
 }
-if(!curParam)
+while((method = (struct __ecereNameSpace__ecere__com__Method *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->methods)))
 {
-for(sClass = lastClass ? lastClass->base : _class; sClass; sClass = sClass->base)
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->name), method->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->dataTypeString), method->dataTypeString = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->methods, (struct __ecereNameSpace__ecere__sys__BTNode *)method);
+}
+if(_class->type == 4)
 {
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+struct __ecereNameSpace__ecere__com__EnumClassData * data = (struct __ecereNameSpace__ecere__com__EnumClassData *)_class->data;
 
-curParamID = 0;
-if(sClass->templateClass)
-sClass = sClass->templateClass;
-for(param = sClass->templateParams.first; param; param = param->next, curParamID++)
-{
-curParam = param;
-break;
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&data->values, (void *)__ecereNameSpace__ecere__com__FreeEnumValue);
 }
-if(curParam)
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&_class->delayedCPValues, (((void *)0)));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&_class->selfWatchers, (((void *)0)));
+if(_class->base)
 {
-struct __ecereNameSpace__ecere__com__Class * nextClass;
+struct __ecereNameSpace__ecere__com__Class * base = _class->base;
 
-for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
+for(deriv = base->derivatives.first; deriv; deriv = deriv->next)
 {
-if(nextClass->templateClass)
-nextClass = nextClass->templateClass;
-curParamID += nextClass->templateParams.count;
-}
-lastClass = sClass;
+if(deriv->data == _class)
 break;
 }
+if(deriv)
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&base->derivatives, deriv);
 }
-}
-}
-if(curParam)
-{
-struct __ecereNameSpace__ecere__com__ClassTemplateArgument argument =
+while((deriv = _class->derivatives.first))
 {
-
-.__anon1 = {
-
-.__anon1 = {
-.dataTypeString = 0
-}
+((struct __ecereNameSpace__ecere__com__Class *)deriv->data)->base = (((void *)0));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->derivatives, deriv);
 }
-};
-char value[1024];
-
-if(equal)
+if(_class->nameSpace)
 {
-equal++;
-while(*equal == ' ')
-equal++;
-memcpy(value, equal, paramEnd - equal);
-value[paramEnd - equal] = 0;
+struct __ecereNameSpace__ecere__com__BTNamedLink * link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*_class->nameSpace).classes, _class->name);
+
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)link);
 }
-else
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->name), _class->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->fullName), _class->fullName = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->dataTypeString), _class->dataTypeString = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete(_class->data), _class->data = 0);
+while((param = _class->templateParams.first))
 {
-memcpy(value, paramStart, paramEnd - paramStart);
-value[paramEnd - paramStart] = 0;
-}
-__ecereNameSpace__ecere__sys__TrimRSpaces(value, value);
-switch(curParam->type)
+switch(param->type)
 {
 case 0:
-argument.__anon1.__anon1.dataTypeString = __ecereNameSpace__ecere__sys__CopyString(value);
-argument.__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(findModule, value);
-if(!argument.__anon1.__anon1.dataTypeClass)
-argument.__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, value);
-if(!argument.__anon1.__anon1.dataTypeClass)
-argument.__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)_class->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, value);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->defaultArg.__anon1.__anon1.dataTypeString), param->defaultArg.__anon1.__anon1.dataTypeString = 0);
+break;
+case 1:
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->defaultArg.__anon1.__anon2.memberString), param->defaultArg.__anon1.__anon2.memberString = 0);
 break;
 case 2:
-{
-struct __ecereNameSpace__ecere__com__Class * expClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, curParam->__anon1.dataTypeString);
-
-if(!expClass)
-expClass = __ecereNameSpace__ecere__com__eSystem_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)_class->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, curParam->__anon1.dataTypeString);
-if(expClass)
-{
-((unsigned int (*)(void *, void *, const char *))(void *)expClass->_vTbl[__ecereVMethodID_class_OnGetDataFromString])(expClass, &argument.__anon1.expression, value);
-}
-else if(value[0] == '\"')
-{
-char * endQuote = value + strlen(value) - 1;
-
-if(*endQuote != '\"')
-endQuote++;
-*endQuote = '\0';
-argument.__anon1.expression.__anon1.p = __ecereNameSpace__ecere__sys__CopyString(value + 1);
+break;
 }
-else if(value[0] == '\'')
-{
-int nb;
-unsigned int ch = __ecereNameSpace__ecere__sys__UTF8GetChar(value + 1, &nb);
-
-argument.__anon1.expression.__anon1.ui = ch;
+if(param->type != 1)
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->__anon1.dataTypeString), param->__anon1.dataTypeString = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->name), param->name = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templateParams, param);
 }
-else if(!strcmp(curParam->__anon1.dataTypeString, "uint"))
-{
-argument.__anon1.expression.__anon1.ui = (unsigned int)strtoul(value, (((void *)0)), 0);
+__ecereNameSpace__ecere__com___free(_class);
 }
-else if(!strcmp(curParam->__anon1.dataTypeString, "char"))
+
+void __ecereNameSpace__ecere__com__eInstance_Delete(struct __ecereNameSpace__ecere__com__Instance * instance)
 {
-argument.__anon1.expression.__anon1.c = (char)strtol(value, (((void *)0)), 0);
-}
-else if(!strcmp(curParam->__anon1.dataTypeString, "byte"))
+if(instance)
 {
-argument.__anon1.expression.__anon1.uc = (unsigned char)strtoul(value, (((void *)0)), 0);
-}
-else if(!strcmp(curParam->__anon1.dataTypeString, "short"))
+struct __ecereNameSpace__ecere__com__Class * _class, * base;
+unsigned int ownVtbl;
+
+ownVtbl = ((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_vTbl != ((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_class->_vTbl;
+for(_class = ((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_class; _class; _class = base)
 {
-argument.__anon1.expression.__anon1.s = (short)strtol(value, (((void *)0)), 0);
-}
-else if(!strcmp(curParam->__anon1.dataTypeString, "uint16"))
+if(_class->templateClass)
+_class = _class->templateClass;
+if(_class->destructionWatchOffset)
 {
-argument.__anon1.expression.__anon1.us = (unsigned short)strtoul(value, (((void *)0)), 0);
-}
-else if(!strcmp(curParam->__anon1.dataTypeString, "int64"))
+struct __ecereNameSpace__ecere__sys__OldList * watchers = (struct __ecereNameSpace__ecere__sys__OldList *)((unsigned char *)instance + _class->destructionWatchOffset);
+struct __ecereNameSpace__ecere__com__Watcher * watcher, * next;
+
+for(watcher = (*watchers).first; watcher; watcher = next)
 {
-argument.__anon1.expression.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(value, (((void *)0)), 0);
+next = watcher->next;
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*watchers), watcher);
+watcher->callback(watcher->object, instance);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete((&*watchers), watcher);
 }
-else if(!strcmp(curParam->__anon1.dataTypeString, "uint64"))
-{
-argument.__anon1.expression.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(value, (((void *)0)), 0);
 }
-else if(!strcmp(curParam->__anon1.dataTypeString, "float"))
-{
-argument.__anon1.expression.__anon1.f = (float)strtod(value, (((void *)0)));
+base = _class->base;
+if(base && (base->type == 1000 || base->isInstanceClass))
+base = (((void *)0));
+if(_class->Destructor)
+_class->Destructor(instance);
 }
-else if(!strcmp(curParam->__anon1.dataTypeString, "double"))
+for(_class = ((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_class; _class; _class = base)
 {
-argument.__anon1.expression.__anon1.d = strtod(value, (((void *)0)));
-}
-else
+if(_class->templateClass)
+_class = _class->templateClass;
+base = _class->base;
+(_class->templateClass ? _class->templateClass : _class)->count--;
+if(_class->type == 0 && !_class->count && !_class->module)
 {
-argument.__anon1.expression.__anon1.i = (int)strtol(value, (((void *)0)), 0);
-}
-break;
+__ecereNameSpace__ecere__com__eClass_Unregister(_class);
 }
-case 1:
-argument.__anon1.__anon2.memberString = __ecereNameSpace__ecere__sys__CopyString(value);
-break;
 }
-__ecereNameSpace__ecere__com__FreeTemplateArg(templatedClass, curParam, curParamID);
-templatedClass->templateArgs[curParamID] = argument;
+if(ownVtbl)
+{
+(__ecereNameSpace__ecere__com__eSystem_Delete(((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_vTbl), ((struct __ecereNameSpace__ecere__com__Instance * )(char * )instance)->_vTbl = 0);
 }
+__ecereNameSpace__ecere__com___free(instance);
 }
 }
-if(templatedClass == _class)
+
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * __ecereNameSpace__ecere__com__eClass_AddTemplateParameter(struct __ecereNameSpace__ecere__com__Class * _class, const char * name, int type, const void * info, struct __ecereNameSpace__ecere__com__ClassTemplateArgument * defaultArg)
+{
+if(_class && name)
 {
-struct __ecereNameSpace__ecere__com__Class * sClass = _class;
-int curParamID = 0;
-struct __ecereNameSpace__ecere__com__Class * nextClass;
 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
 
-for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
+for(param = _class->templateParams.first; param; param = param->next)
 {
-if(nextClass->templateClass)
-nextClass = nextClass->templateClass;
-curParamID += nextClass->templateParams.count;
+if(!strcmp(param->name, name))
+return param;
 }
-for(param = sClass->templateParams.first; param; param = param->next)
-{
-if(!templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeString)
+param = __extension__ ({
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * __ecereInstance1 = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__ClassTemplateParameter));
+
+__ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(name), __ecereInstance1->type = type, __ecereInstance1->__anon1.dataTypeString = (type == 1) ? info : __ecereNameSpace__ecere__sys__CopyString(info), __ecereInstance1;
+});
 {
-templatedClass->templateArgs[curParamID] = param->defaultArg;
-__ecereNameSpace__ecere__com__CopyTemplateArg(param, &templatedClass->templateArgs[curParamID]);
-if(param->type == 0 && param->defaultArg.__anon1.__anon1.dataTypeString)
+struct __ecereNameSpace__ecere__com__Class * c = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, name);
+
+if(c && c->internalDecl)
 {
-templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(findModule, param->defaultArg.__anon1.__anon1.dataTypeString);
-if(!templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass)
-templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(templatedClass->module, param->defaultArg.__anon1.__anon1.dataTypeString);
-if(!templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass)
-templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)templatedClass->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, param->defaultArg.__anon1.__anon1.dataTypeString);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)c->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, c);
+__ecereNameSpace__ecere__com__eClass_Unregister(c);
 }
 }
-curParamID++;
+if(defaultArg != (((void *)0)))
+{
+param->defaultArg = *defaultArg;
+__ecereNameSpace__ecere__com__CopyTemplateArg(param, &param->defaultArg);
+}
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&_class->templateParams, param);
+return param;
 }
+return (((void *)0));
 }
-if(templatedClass->base && templatedClass->base->templateArgs && numParams - _class->templateParams.count)
-{
-int c = numParams - _class->templateParams.count - 1;
-
-for(sClass = _class->base; sClass; sClass = sClass->base)
-{
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
-
-if(sClass->templateClass)
-sClass = sClass->templateClass;
-for(param = sClass->templateParams.last; param; param = param->prev)
-{
-struct __ecereNameSpace__ecere__com__ClassTemplateArgument * arg = &templatedClass->templateArgs[c];
-struct __ecereNameSpace__ecere__com__ClassTemplateArgument * baseArg = &templatedClass->base->templateArgs[c];
 
-if(!(*arg).__anon1.__anon1.dataTypeString)
-{
-*arg = templatedClass->base->templateArgs[c];
-__ecereNameSpace__ecere__com__CopyTemplateArg(param, arg);
-if(param->type == 0)
+void __ecereNameSpace__ecere__com__eInstance_DecRef(struct __ecereNameSpace__ecere__com__Instance * instance)
 {
-if((*arg).__anon1.__anon1.dataTypeClass && strchr((*arg).__anon1.__anon1.dataTypeString, '<') && (*arg).__anon1.__anon1.dataTypeClass->templateArgs)
+if(instance)
 {
-struct __ecereNameSpace__ecere__com__Class * expClass = (*arg).__anon1.__anon1.dataTypeClass;
-struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
-int paramCount = 0;
-int lastParam = -1;
-char templateString[1024];
-
-sprintf(templateString, "%s<", expClass->templateClass->fullName);
-for(cClass = expClass; cClass; cClass = cClass->base)
+((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_refCount--;
+if(((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_refCount <= 0)
 {
-int p = 0;
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+__ecereNameSpace__ecere__com__eInstance_Delete(instance);
+}
+}
+}
 
-for(param = cClass->templateParams.first; param; param = param->next)
+static struct __ecereNameSpace__ecere__com__Instance * __ecereNameSpace__ecere__com__Module_Load(struct __ecereNameSpace__ecere__com__Instance * fromModule, const char * name, int importAccess, unsigned int ensureCOM)
 {
-int id = p;
-struct __ecereNameSpace__ecere__com__Class * sClass;
-struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
+unsigned int (ecere_stdcall * Load)(struct __ecereNameSpace__ecere__com__Instance * module) = (((void *)0));
+unsigned int (ecere_stdcall * Unload)(struct __ecereNameSpace__ecere__com__Instance * module) = (((void *)0));
+struct __ecereNameSpace__ecere__com__Instance * module;
 
-for(sClass = expClass->base; sClass; sClass = sClass->base)
-id += sClass->templateParams.count;
-arg = expClass->templateArgs[id];
+for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules.first; module; module = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->next)
 {
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
-int p = numParams - _class->templateParams.count;
-
-for(cParam = _class->templateParams.first; cParam; cParam = cParam->next, p++)
+if(!strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, name))
+break;
+}
+if(ensureCOM && (!strcmp(name, "ecereCOM") || !strcmp(name, "ecere")))
 {
-if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString))
+for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules.first; module; module = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->next)
 {
-arg = templatedClass->templateArgs[p];
+if(!strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, "ecere") || !strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, "ecereCOM"))
 break;
 }
 }
-}
+if(!module)
 {
-char argument[256];
+void * library = (((void *)0));
 
-argument[0] = '\0';
-switch(param->type)
-{
-case 2:
+if(ensureCOM && !strcmp(name, "ecereCOM"))
 {
-break;
+Load = (void *)(__ecereDll_Load_ecere);
+Unload = (void *)(__ecereDll_Unload_ecere);
 }
-case 1:
+else
 {
-strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
-break;
+const char * libLocation = (((void *)0));
+
+library = Instance_Module_Load(libLocation, name, (void *)(&Load), (void *)(&Unload));
 }
-case 0:
+if(Load)
 {
-if(arg.__anon1.__anon1.dataTypeString)
-strcat(argument, arg.__anon1.__anon1.dataTypeString);
-break;
-}
-}
-if(argument[0])
+module = (struct __ecereNameSpace__ecere__com__Instance *)__ecereNameSpace__ecere__com__eInstance_New(__ecereNameSpace__ecere__com__eSystem_FindClass(fromModule, "Module"));
+((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application;
+((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->library = library;
 {
-if(paramCount)
-strcat(templateString, ", ");
-if(lastParam != p - 1)
+char moduleName[274];
+char ext[17];
+
+__ecereNameSpace__ecere__sys__GetLastDirectory(name, moduleName);
+__ecereNameSpace__ecere__sys__GetExtension(moduleName, ext);
+__ecereNameSpace__ecere__sys__StripExtension(moduleName);
+if((!(strcasecmp)(ext, "dylib") || !(strcasecmp)(ext, "so")) && strstr(moduleName, "lib") == moduleName)
 {
-strcat(templateString, param->name);
-strcat(templateString, " = ");
+int len = (int)strlen(moduleName) - 3;
+
+memmove(moduleName, moduleName + 3, len);
+moduleName[len] = 0;
 }
-strcat(templateString, argument);
-paramCount++;
-lastParam = p;
+((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name = __ecereNameSpace__ecere__sys__CopyString(moduleName);
 }
+((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->Unload = Unload;
+((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->origImportType = 0;
+if(!Load(module))
+{
+__ecereNameSpace__ecere__com__eInstance_Delete((struct __ecereNameSpace__ecere__com__Instance *)module);
+module = (((void *)0));
 }
-p++;
 }
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules, module);
 }
+if(ensureCOM && !strcmp(name, "ecere") && module)
 {
-int len = (int)strlen(templateString);
+name = !strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, "ecereCOM") ? "ecere" : "ecereCOM";
+if((!Load && !strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, "ecereCOM")) || (Load && (!__thisModule || !((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name || !strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, "ecereCOM")) && Load != (void *)__ecereDll_Load_ecere))
+{
+struct __ecereNameSpace__ecere__com__Instance * module;
 
-if(templateString[len - 1] == '>')
-templateString[len++] = ' ';
-templateString[len++] = '>';
-templateString[len++] = '\0';
-}
-__ecereNameSpace__ecere__com__FreeTemplateArg(templatedClass, param, c);
-(*arg).__anon1.__anon1.dataTypeString = __ecereNameSpace__ecere__sys__CopyString(templateString);
-(*arg).__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(findModule, templateString);
-if(!(*arg).__anon1.__anon1.dataTypeClass)
-(*arg).__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(templatedClass->module, templateString);
-if(!(*arg).__anon1.__anon1.dataTypeClass)
-(*arg).__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)templatedClass->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, templateString);
-}
-else
+for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules.first; module; module = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->next)
 {
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
-int p = numParams - _class->templateParams.count;
-
-for(cParam = _class->templateParams.first; cParam; cParam = cParam->next, p++)
+if(!strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, name))
+break;
+}
+if(!module)
 {
-if(cParam->type == 0 && (*baseArg).__anon1.__anon1.dataTypeString && !strcmp(cParam->name, (*baseArg).__anon1.__anon1.dataTypeString))
+Load = (void *)(__ecereDll_Load_ecere);
+Unload = (void *)(__ecereDll_Unload_ecere);
+module = (struct __ecereNameSpace__ecere__com__Instance *)__ecereNameSpace__ecere__com__eInstance_New(__ecereNameSpace__ecere__com__eSystem_FindClass(fromModule, "Module"));
+((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application;
+((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->library = (((void *)0));
+((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name = __ecereNameSpace__ecere__sys__CopyString(name);
+((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->Unload = Unload;
+if(!Load(module))
 {
-__ecereNameSpace__ecere__com__FreeTemplateArg(templatedClass, param, c);
-(*arg).__anon1.__anon1.dataTypeString = templatedClass->templateArgs[p].__anon1.__anon1.dataTypeString;
-(*arg).__anon1.__anon1.dataTypeClass = templatedClass->templateArgs[p].__anon1.__anon1.dataTypeClass;
-__ecereNameSpace__ecere__com__CopyTemplateArg(cParam, arg);
-break;
+__ecereNameSpace__ecere__com__eInstance_Delete((struct __ecereNameSpace__ecere__com__Instance *)module);
+module = (((void *)0));
 }
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules, module);
 }
+if(module)
+{
+if(fromModule)
+{
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, __extension__ ({
+struct __ecereNameSpace__ecere__com__SubModule * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__com__SubModule);
+
+__ecereInstance1->module = module, __ecereInstance1->importMode = importAccess, __ecereInstance1;
+}));
 }
+module->_refCount++;
 }
 }
-c--;
 }
+if(module)
+{
+if(fromModule)
+{
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, __extension__ ({
+struct __ecereNameSpace__ecere__com__SubModule * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__com__SubModule);
+
+__ecereInstance1->module = module, __ecereInstance1->importMode = importAccess, __ecereInstance1;
+}));
 }
+module->_refCount++;
+}
+return module;
 }
-{
-struct __ecereNameSpace__ecere__com__Class * sClass;
 
-for(sClass = _class; sClass; sClass = sClass->base)
+struct __ecereNameSpace__ecere__com__Instance * __ecereNameSpace__ecere__com__eModule_LoadStatic(struct __ecereNameSpace__ecere__com__Instance * fromModule, const char * name, int importAccess, unsigned int (* Load)(struct __ecereNameSpace__ecere__com__Instance * module), unsigned int (* Unload)(struct __ecereNameSpace__ecere__com__Instance * module))
 {
-int curParamID = 0;
-struct __ecereNameSpace__ecere__com__Class * nextClass;
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+struct __ecereNameSpace__ecere__com__Instance * module;
 
-if(sClass->templateClass)
-sClass = sClass->templateClass;
-for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
+for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules.first; module; module = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->next)
 {
-if(nextClass->templateClass)
-nextClass = nextClass->templateClass;
-curParamID += nextClass->templateParams.count;
+if(!strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, name))
+break;
 }
-for(param = sClass->templateParams.first; param; param = param->next)
+if(!module)
 {
-if(!templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeString)
+if(Load)
 {
-templatedClass->templateArgs[curParamID] = param->defaultArg;
-__ecereNameSpace__ecere__com__CopyTemplateArg(param, &templatedClass->templateArgs[curParamID]);
-if(param->type == 0 && param->defaultArg.__anon1.__anon1.dataTypeString)
+module = (struct __ecereNameSpace__ecere__com__Instance *)__ecereNameSpace__ecere__com__eInstance_New(__ecereNameSpace__ecere__com__eSystem_FindClass(fromModule, "Module"));
+((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application;
+((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name = __ecereNameSpace__ecere__sys__CopyString(name);
+((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->origImportType = 1;
+((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->Unload = (void *)Unload;
+if(!Load(module))
 {
-templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(findModule, param->defaultArg.__anon1.__anon1.dataTypeString);
-if(!templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass)
-templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(templatedClass->module, param->defaultArg.__anon1.__anon1.dataTypeString);
-if(!templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass)
-templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)templatedClass->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, param->defaultArg.__anon1.__anon1.dataTypeString);
+__ecereNameSpace__ecere__com__eInstance_Delete((struct __ecereNameSpace__ecere__com__Instance *)module);
+module = (((void *)0));
 }
 }
-curParamID++;
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules, module);
 }
+if(module)
+{
+if(fromModule)
+{
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, __extension__ ({
+struct __ecereNameSpace__ecere__com__SubModule * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__com__SubModule);
+
+__ecereInstance1->module = module, __ecereInstance1->importMode = importAccess, __ecereInstance1;
+}));
 }
+module->_refCount++;
+}
+return module;
 }
-{
-int c = numParams - 1;
 
-for(sClass = _class; sClass; sClass = sClass->base)
+void __ecereNameSpace__ecere__com__eModule_Unload(struct __ecereNameSpace__ecere__com__Instance * fromModule, struct __ecereNameSpace__ecere__com__Instance * module)
 {
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+struct __ecereNameSpace__ecere__sys__OldLink * m;
 
-if(sClass->templateClass)
-sClass = sClass->templateClass;
-for(param = sClass->templateParams.last; param; param = param->prev)
+for(m = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; m; m = m->next)
 {
-if(param->type == 0)
+if(m->data == module)
+break;
+}
+if(m)
 {
-struct __ecereNameSpace__ecere__com__ClassTemplateArgument * arg = &templatedClass->templateArgs[c];
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
-struct __ecereNameSpace__ecere__com__Class * dClass;
-int p = numParams - 1;
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, m);
+(__ecereNameSpace__ecere__com__eInstance_DecRef(module), module = 0);
+}
+}
 
-for(dClass = _class; dClass; dClass = dClass->base)
-{
-if(dClass->templateClass)
-dClass = dClass->templateClass;
-for(cParam = dClass->templateParams.last; cParam; cParam = cParam->prev, p--)
+static void __ecereNameSpace__ecere__com__Module_Destructor(struct __ecereNameSpace__ecere__com__Instance * module)
 {
-if(cParam->type == 0 && (*arg).__anon1.__anon1.dataTypeString && !strcmp(cParam->name, (*arg).__anon1.__anon1.dataTypeString))
+struct __ecereNameSpace__ecere__com__Class * _class;
+struct __ecereNameSpace__ecere__com__DefinedExpression * def;
+struct __ecereNameSpace__ecere__com__GlobalFunction * function;
+struct __ecereNameSpace__ecere__com__Instance * m;
+struct __ecereNameSpace__ecere__com__SubModule * handle;
+
+for(m = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules.first; m; m = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)m + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->next)
 {
-if(templatedClass->templateArgs[p].__anon1.__anon1.dataTypeString && c != p)
+struct __ecereNameSpace__ecere__com__SubModule * next;
+
+for(handle = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)m + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; handle; handle = next)
 {
-__ecereNameSpace__ecere__com__FreeTemplateArg(templatedClass, param, c);
-(*arg).__anon1.__anon1.dataTypeString = templatedClass->templateArgs[p].__anon1.__anon1.dataTypeString;
-(*arg).__anon1.__anon1.dataTypeClass = templatedClass->templateArgs[p].__anon1.__anon1.dataTypeClass;
-__ecereNameSpace__ecere__com__CopyTemplateArg(cParam, arg);
-}
-}
-}
+next = handle->next;
+if(handle->module == module)
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)m + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, handle);
 }
 }
-c--;
+if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->Unload)
+{
+if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->origImportType == 1)
+{
+unsigned int (* Unload)(struct __ecereNameSpace__ecere__com__Instance * module) = (void *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->Unload;
+
+Unload(module);
 }
+else
+{
+unsigned int (ecere_stdcall * Unload)(struct __ecereNameSpace__ecere__com__Instance * module) = (void *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->Unload;
+
+Unload(module);
 }
 }
 {
-struct __ecereNameSpace__ecere__com__Class * tClass;
-int c = numParams - 1;
+struct __ecereNameSpace__ecere__com__Instance * ourWorld = __ecereClass___ecereNameSpace__ecere__com__Class->module;
+void * ourHandle = (((void *)0));
 
-for(tClass = _class; tClass; tClass = tClass->base)
+while((handle = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.last))
 {
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+struct __ecereNameSpace__ecere__com__Instance * depModule = handle->module;
 
-if(tClass->templateClass)
-tClass = tClass->templateClass;
-for(param = tClass->templateParams.last; param; param = param->prev)
+if(depModule == ourWorld)
 {
-struct __ecereNameSpace__ecere__com__ClassTemplateArgument * arg = &templatedClass->templateArgs[c];
-
-if(param->type == 1 && (*arg).__anon1.__anon2.memberString)
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, handle);
+ourHandle = handle;
+}
+else
 {
-struct __ecereNameSpace__ecere__com__Class * memberClass = templatedClass;
-const char * memberString = (*arg).__anon1.__anon2.memberString;
-const char * colon = strstr(memberString, "::");
-const char * memberName = memberString;
-
-if(colon)
-memberName = colon + 2;
-if(!colon)
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, handle);
+(__ecereNameSpace__ecere__com__eInstance_DecRef(depModule), depModule = 0);
+}
+}
+if(ourHandle)
 {
-memberString = param->defaultArg.__anon1.__anon2.memberString;
-colon = memberString ? strstr(memberString, "::") : (((void *)0));
+(__ecereNameSpace__ecere__com__eSystem_Delete(ourHandle), ourHandle = 0);
+(__ecereNameSpace__ecere__com__eInstance_DecRef(ourWorld), ourWorld = 0);
 }
-if(colon)
+}
+for(; (_class = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes.first); )
 {
-char className[1024];
-struct __ecereNameSpace__ecere__com__Class * sClass;
+if(_class->nameSpace)
+{
+struct __ecereNameSpace__ecere__com__BTNamedLink * classLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*_class->nameSpace).classes, _class->name);
 
-memcpy(className, memberString, colon - memberString);
-className[colon - memberString] = '\0';
-for(sClass = _class; sClass; sClass = sClass->base)
+if(classLink)
 {
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
-struct __ecereNameSpace__ecere__com__Class * nextClass;
-int id = 0;
+struct __ecereNameSpace__ecere__sys__OldLink * t;
 
-if(sClass->templateClass)
-sClass = sClass->templateClass;
-for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
+for(t = _class->templatized.first; t; t = t->next)
 {
-if(nextClass->templateClass)
-nextClass = nextClass->templateClass;
-id += nextClass->templateParams.count;
+struct __ecereNameSpace__ecere__com__Class * template = t->data;
+struct __ecereNameSpace__ecere__com__BTNamedLink * link;
+
+link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*template->nameSpace).classes, template->name);
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*template->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)link);
+template->nameSpace = (((void *)0));
 }
-for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next)
-{
-if(cParam->type == 0 && !strcmp(cParam->name, className) && templatedClass->templateArgs[id].__anon1.__anon1.dataTypeString)
-{
-strcpy(className, templatedClass->templateArgs[id].__anon1.__anon1.dataTypeString);
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)classLink);
 }
-id++;
+_class->nameSpace = (((void *)0));
 }
+_class->module = (((void *)0));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, _class);
+if(_class->count <= 0 || _class->type != 0 || _class->isInstanceClass)
+__ecereNameSpace__ecere__com__eClass_Unregister(_class);
+else
+{
 }
-memberClass = __ecereNameSpace__ecere__com__eSystem_FindClass(findModule, className);
-if(!memberClass)
-memberClass = __ecereNameSpace__ecere__com__eSystem_FindClass(templatedClass->module, className);
-if(!memberClass)
-memberClass = __ecereNameSpace__ecere__com__eSystem_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)templatedClass->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, className);
 }
-if(memberClass)
+for(; (def = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->defines.first); )
 {
-switch(param->__anon1.memberType)
+if(def->nameSpace)
 {
-case 0:
-(*arg).__anon1.__anon2.__anon1.member = __ecereNameSpace__ecere__com__eClass_FindDataMember(memberClass, memberName, memberClass->module, (((void *)0)), (((void *)0)));
-break;
-case 1:
-(*arg).__anon1.__anon2.__anon1.method = __ecereNameSpace__ecere__com__eClass_FindMethod(memberClass, memberName, memberClass->module);
-break;
-case 2:
-(*arg).__anon1.__anon2.__anon1.prop = __ecereNameSpace__ecere__com__eClass_FindProperty(memberClass, memberName, memberClass->module);
+struct __ecereNameSpace__ecere__com__BTNamedLink * defLink;
+
+for(defLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&(*def->nameSpace).defines); defLink; defLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)defLink)))
+if(defLink->data == def)
+{
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*def->nameSpace).defines, (struct __ecereNameSpace__ecere__sys__BTNode *)defLink);
 break;
 }
 }
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)def->name), def->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)def->value), def->value = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->defines, def);
 }
-c--;
-}
-}
-}
-}
-
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * __ecereNameSpace__ecere__com__eClass_AddTemplateParameter(struct __ecereNameSpace__ecere__com__Class * _class, const char * name, int type, const void * info, struct __ecereNameSpace__ecere__com__ClassTemplateArgument * defaultArg)
+for(; (function = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->functions.first); )
 {
-if(_class && name)
+if(function->nameSpace)
 {
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+struct __ecereNameSpace__ecere__com__BTNamedLink * functionLink;
 
-for(param = _class->templateParams.first; param; param = param->next)
+for(functionLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&(*function->nameSpace).functions); functionLink; functionLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)functionLink)))
+if(functionLink->data == function)
 {
-if(!strcmp(param->name, name))
-return param;
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*function->nameSpace).functions, (struct __ecereNameSpace__ecere__sys__BTNode *)functionLink);
+break;
 }
-param = __extension__ ({
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * __ecereInstance1 = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__ClassTemplateParameter));
-
-__ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(name), __ecereInstance1->type = type, __ecereInstance1->__anon1.dataTypeString = (type == 1) ? info : __ecereNameSpace__ecere__sys__CopyString(info), __ecereInstance1;
-});
-if(defaultArg != (((void *)0)))
-{
-param->defaultArg = *defaultArg;
-__ecereNameSpace__ecere__com__CopyTemplateArg(param, &param->defaultArg);
 }
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&_class->templateParams, param);
-return param;
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)function->name), function->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)function->dataTypeString), function->dataTypeString = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->functions, function);
 }
-return (((void *)0));
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name), ((struct __ecereNameSpace__ecere__com__Module * )(((char * )module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name = 0);
+__ecereNameSpace__ecere__com__NameSpace_Free(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->privateNameSpace);
+__ecereNameSpace__ecere__com__NameSpace_Free(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace);
+if(module != ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application)
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules, module);
+else
+__ecereNameSpace__ecere__com__NameSpace_Free(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->systemNameSpace);
+Instance_Module_Free(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->library);
 }
 
-static void __ecereNameSpace__ecere__com__FreeTemplate(struct __ecereNameSpace__ecere__com__Class * template)
+static void __ecereNameSpace__ecere__com__FixDerivativesBase(struct __ecereNameSpace__ecere__com__Class *  base, struct __ecereNameSpace__ecere__com__Class *  mod);
+
+struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_RegisterClass(int type, const char * name, const char * baseName, int size, int sizeClass, unsigned int (* Constructor)(void *), void (* Destructor)(void *), struct __ecereNameSpace__ecere__com__Instance * module, int declMode, int inheritanceAccess)
 {
-struct __ecereNameSpace__ecere__sys__OldLink * deriv;
+int start = 0, c;
+struct __ecereNameSpace__ecere__com__NameSpace * nameSpace = (((void *)0));
+unsigned int force64Bits = (((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->isGUIApp & 2) ? 1 : 0;
+unsigned int force32Bits = (((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->isGUIApp & 4) ? 1 : 0;
+unsigned int inCompiler = (((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->isGUIApp & 8) ? 1 : 0;
+unsigned int crossBits = force32Bits || force64Bits;
+unsigned int fixed = 0;
 
-if(template->nameSpace)
+if(inCompiler && crossBits)
 {
-struct __ecereNameSpace__ecere__com__BTNamedLink * link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*template->nameSpace).classes, template->name);
+struct __ecereNameSpace__ecere__com__Class * c = __ecereNameSpace__ecere__com__eSystem_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, name);
 
-if(link)
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*template->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)link);
+if(c && c->fixed)
+fixed = 1;
+else if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name && !strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, "ecereCOM"))
+fixed = 1;
 }
-__ecereNameSpace__ecere__com__FreeTemplatesDerivatives(template);
-__ecereNameSpace__ecere__com__FreeTemplateArgs(template);
-while((deriv = template->derivatives.first))
 {
-((struct __ecereNameSpace__ecere__com__Class *)deriv->data)->base = (((void *)0));
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&template->derivatives, deriv);
+nameSpace = (declMode == 1) ? &((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace : &((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->privateNameSpace;
+if(declMode == 4)
+nameSpace = &((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->systemNameSpace;
+{
+for(c = 0; name[c]; c++)
+{
+if(name[c] == '.' || (name[c] == ':' && name[c + 1] == ':'))
+{
+struct __ecereNameSpace__ecere__com__NameSpace * newSpace;
+char * spaceName = __ecereNameSpace__ecere__com___malloc(c - start + 1);
+
+strncpy(spaceName, name + start, c - start);
+spaceName[c - start] = '\0';
+newSpace = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*nameSpace).nameSpaces, spaceName);
+if(!newSpace)
+{
+newSpace = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__NameSpace) * (1));
+(*newSpace).classes.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
+(*newSpace).defines.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
+(*newSpace).functions.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
+(*newSpace).nameSpaces.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
+(*newSpace).name = spaceName;
+(*newSpace).parent = nameSpace;
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&(*nameSpace).nameSpaces, (struct __ecereNameSpace__ecere__sys__BTNode *)newSpace);
 }
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->fullName), template->fullName = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->name), template->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete(template->templateArgs), template->templateArgs = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)template->dataTypeString), template->dataTypeString = 0);
-if(template->module)
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)template->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, template);
 else
-__ecereNameSpace__ecere__com___free(template);
+(__ecereNameSpace__ecere__com__eSystem_Delete(spaceName), spaceName = 0);
+nameSpace = newSpace;
+if(name[c] == ':')
+c++;
+start = c + 1;
 }
-
-static void __ecereNameSpace__ecere__com__FixDerivativesBase(struct __ecereNameSpace__ecere__com__Class * base, struct __ecereNameSpace__ecere__com__Class * mod)
-{
-struct __ecereNameSpace__ecere__sys__OldLink * derivative;
-
-__ecereNameSpace__ecere__com__ComputeClassParameters(base, strchr(base->name, '<'), (((void *)0)));
-for(derivative = base->derivatives.first; derivative; derivative = derivative->next)
+}
+}
+}
+if(c - start)
 {
-struct __ecereNameSpace__ecere__com__Class * _class = derivative->data;
-int type = _class->type;
-int oldType = type;
-int size = _class->structSize - _class->offset;
-int oldSizeClass = _class->sizeClass;
-int sizeClass = _class->sizeClass - _class->offsetClass;
-struct __ecereNameSpace__ecere__com__Class * enumBase = (((void *)0));
+int offsetClass;
+int totalSizeClass;
+struct __ecereNameSpace__ecere__com__BTNamedLink * classLink = (((void *)0));
+struct __ecereNameSpace__ecere__com__Class * _class = (((void *)0));
 const char * dataTypeString = (((void *)0));
-struct __ecereNameSpace__ecere__com__Class * baseClass;
-unsigned int offsetBefore = _class->offset;
-int offsetClass, totalSizeClass;
+struct __ecereNameSpace__ecere__com__Class * enumBase = (((void *)0));
+struct __ecereNameSpace__ecere__com__Class * base = (baseName && baseName[0]) ? __ecereNameSpace__ecere__com__System_FindClass(module, baseName, 1) : (((void *)0));
+struct __ecereNameSpace__ecere__com__Class * prevBase = (((void *)0));
 
-for(baseClass = base; baseClass->base; baseClass = baseClass->base)
-;
 if(base && !base->internalDecl && (base->type == 5 || base->type == 1 || base->type == 0))
 {
 if(base->type == 1 && type == 0)
@@ -4826,1595 +4807,1645 @@ type = 5;
 else
 type = base->type;
 }
-if(base && (_class->type == 0 || _class->type == 5 || _class->type == 1) && (base->type == 3 || base->type == 2 || base->type == 4))
+if(base && (type == 0 || type == 5 || type == 1) && (base->type == 3 || base->type == 2 || base->type == 4))
 {
 type = base->type;
 }
+if(!base || base->type == 1000 || base->isInstanceClass)
+{
 if(type == 4)
 {
-if(base->type != 4)
+if(base || !baseName || !baseName[0] || !strcmp(baseName, "unsigned int") || !strcmp(baseName, "uint") || !strcmp(baseName, "unsigned int64") || !strcmp(baseName, "uint64") || !strcmp(baseName, "int64") || !strcmp(baseName, "unsigned short") || !strcmp(baseName, "short") || !strcmp(baseName, "unsigned char") || !strcmp(baseName, "byte") || !strcmp(baseName, "char") || !strcmp(baseName, "uint32") || !strcmp(baseName, "uint16"))
+{
+base = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "enum");
+dataTypeString = (baseName && baseName[0]) ? baseName : "int";
+}
+else
 {
+base = __ecereNameSpace__ecere__com__eSystem_RegisterClass((int)0, baseName, (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), module, declMode, 1);
+base->internalDecl = 1;
 enumBase = base;
-base = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, "enum");
+base = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "enum");
 }
 }
-dataTypeString = enumBase ? enumBase->dataTypeString : base->dataTypeString;
-offsetClass = base ? (base->templateClass ? base->templateClass->sizeClass : base->sizeClass) : (type == 5 ? 0 : 0);
-totalSizeClass = offsetClass + sizeClass;
-if(type == 0 || type == 5)
+else if(type == 1 && (!baseName || !baseName[0]))
 {
-_class->offset = (base && (base->templateClass ? (type == 0 ? base->templateClass->structSize : base->templateClass->memberOffset) : (type == 0 ? base->structSize : base->memberOffset)) && base->type != 1000) ? (base->templateClass ? base->templateClass->structSize : base->structSize) : ((type == 5) ? 0 : sizeof(struct __ecereNameSpace__ecere__com__Instance));
-if(_class->structAlignment && (_class->offset % _class->structAlignment))
-_class->offset += _class->structAlignment - _class->offset % _class->structAlignment;
+base = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "struct");
+dataTypeString = name + start;
 }
 else
-_class->offset = 0;
-if(type == 1)
 {
-_class->memberOffset = (base && (base->templateClass ? base->templateClass->structSize : base->structSize) && base->type != 1000) ? (base->templateClass ? base->templateClass->structSize : base->structSize) : 0;
-_class->typeSize = _class->structSize = _class->memberOffset + size;
-}
-else if(type == 2 || type == 4 || type == 3)
+if(type == 0)
+dataTypeString = "struct __ecereNameSpace__ecere__com__Instance";
+else if(type == 5)
+dataTypeString = "void *";
+else if(type == 2)
+dataTypeString = (baseName && baseName[0]) ? baseName : "unsigned int";
+else if(type == 3)
+dataTypeString = (baseName && baseName[0]) ? baseName : "int";
+else if(type == 1)
+dataTypeString = name + start;
+if(base || (!baseName || !baseName[0]) || type == 2 || type == 3)
 {
-struct __ecereNameSpace__ecere__com__Class * dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, dataTypeString);
-
-if(dataTypeClass)
-_class->typeSize = dataTypeClass->typeSize;
-_class->structSize = 0;
-}
-else if(type == 0 || type == 5)
+if(base || !baseName || !baseName[0] || !strcmp(baseName, "unsigned int") || !strcmp(baseName, "uint") || !strcmp(baseName, "unsigned int64") || !strcmp(baseName, "uint64") || !strcmp(baseName, "int64") || !strcmp(baseName, "unsigned short") || !strcmp(baseName, "short") || !strcmp(baseName, "unsigned char") || !strcmp(baseName, "byte") || !strcmp(baseName, "char") || !strcmp(baseName, "uint32") || !strcmp(baseName, "uint16"))
 {
-_class->structSize = _class->offset + size;
-_class->typeSize = sizeof(void *);
+if(type == 0 && strcmp(name, "ecere::com::Instance") && strcmp(name, "enum") && strcmp(name, "struct"))
+base = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "ecere::com::Instance");
+else
+base = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "class");
+}
 }
-if(_class->type != 1000)
-_class->type = type;
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->dataTypeString), _class->dataTypeString = 0);
-_class->dataTypeString = __ecereNameSpace__ecere__sys__CopyString(dataTypeString);
-if(totalSizeClass != oldSizeClass)
-{
-_class->data = __ecereNameSpace__ecere__com__eSystem_Renew(_class->data, sizeof(unsigned char) * (totalSizeClass));
-memmove((unsigned char *)_class->data + mod->offsetClass, (unsigned char *)_class->data, totalSizeClass - mod->sizeClass);
-if(base->type != 1000 && base->type != 4)
-memcpy((unsigned char *)_class->data, (unsigned char *)base->data, totalSizeClass - _class->sizeClass);
 else
-memset((unsigned char *)_class->data, 0, totalSizeClass - _class->sizeClass);
+{
 }
-_class->offsetClass = offsetClass;
-_class->sizeClass = totalSizeClass;
+}
+}
+else
 {
-struct __ecereNameSpace__ecere__com__Method * method, * next;
-struct __ecereNameSpace__ecere__com__Class * b;
-unsigned int needUpdate = (mod != (base->templateClass ? base->templateClass : base) || _class->vTblSize != mod->vTblSize);
-int updateStart = -1, updateEnd = -1;
-
-if(mod->base && mod->base->base && mod->base->vTblSize > baseClass->vTblSize && needUpdate)
+if(type == 4)
 {
-_class->vTblSize += mod->base->vTblSize - baseClass->vTblSize;
-_class->_vTbl = __ecereNameSpace__ecere__com__eSystem_Renew(_class->_vTbl, sizeof(void *) * (_class->vTblSize));
-memmove(_class->_vTbl + mod->base->vTblSize, _class->_vTbl + baseClass->vTblSize, (_class->vTblSize - mod->vTblSize) * sizeof(void *));
-memcpy(_class->_vTbl + baseClass->vTblSize, mod->_vTbl + baseClass->vTblSize, (mod->base->vTblSize - baseClass->vTblSize) * sizeof(void *));
-updateStart = baseClass->vTblSize;
-updateEnd = updateStart + mod->base->vTblSize - baseClass->vTblSize;
-for(method = (struct __ecereNameSpace__ecere__com__Method *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->methods); method; method = next)
+if(base->type != 4)
 {
-next = (struct __ecereNameSpace__ecere__com__Method *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)method));
-if(method->type == 1)
-method->vid += mod->base->vTblSize - baseClass->vTblSize;
+enumBase = base;
+base = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "enum");
 }
 }
-for(b = mod->base; b && b != (((void *)0)); b = b->base)
+dataTypeString = enumBase ? enumBase->dataTypeString : base->dataTypeString;
+}
+offsetClass = base ? base->sizeClass : (type == 5 ? 0 : 0);
+totalSizeClass = offsetClass + sizeClass;
+_class = __ecereNameSpace__ecere__com__System_FindClass(module, name, 1);
+if(!_class)
 {
-struct __ecereNameSpace__ecere__com__Method * vMethod;
+const char * colons = __ecereNameSpace__ecere__sys__RSearchString(name, "::", strlen(name), 1, 0);
 
-for(vMethod = (struct __ecereNameSpace__ecere__com__Method *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&b->methods); vMethod; vMethod = (struct __ecereNameSpace__ecere__com__Method *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)vMethod)))
+if(colons && colons)
 {
-if(vMethod->type == 1)
+_class = __ecereNameSpace__ecere__com__System_FindClass(module, colons + 2, 1);
+if(_class)
 {
-method = (struct __ecereNameSpace__ecere__com__Method *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&_class->methods, vMethod->name);
-if(method)
-{
-if(method->function)
-_class->_vTbl[vMethod->vid] = method->function;
-if(!method->symbol)
+if(_class->internalDecl)
 {
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->name), method->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->dataTypeString), method->dataTypeString = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->methods, (struct __ecereNameSpace__ecere__sys__BTNode *)method);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->fullName), _class->fullName = 0);
+_class->fullName = __ecereNameSpace__ecere__sys__CopyString(name);
 }
 else
-{
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->dataTypeString), method->dataTypeString = 0);
-method->type = vMethod->type;
-method->dataTypeString = __ecereNameSpace__ecere__sys__CopyString(vMethod->dataTypeString);
-method->_class = vMethod->_class;
-}
+_class = (((void *)0));
 }
-else if((vMethod->vid >= updateStart && vMethod->vid < updateEnd) || _class->_vTbl[vMethod->vid] == b->_vTbl[vMethod->vid])
-_class->_vTbl[vMethod->vid] = _class->base->_vTbl[vMethod->vid];
 }
 }
+if(_class)
+{
+if(!_class->internalDecl)
+{
+if(declMode != 4)
+printf("error: Redefinition of class %s\n", name);
+else
+{
+_class->comRedefinition = 1;
+return _class;
 }
+return (((void *)0));
 }
-if(type == 0 || type == 5 || type == 1)
+__ecereNameSpace__ecere__com__FreeTemplatesDerivatives(_class);
+classLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*_class->nameSpace).classes, name + start);
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)classLink);
 {
-struct __ecereNameSpace__ecere__com__Property * prop;
-struct __ecereNameSpace__ecere__com__DataMember * member;
-struct __ecereNameSpace__ecere__com__Class * c;
+struct __ecereNameSpace__ecere__sys__OldLink * t;
 
-for(c = mod->base; c; c = c->base)
+for(t = _class->templatized.first; t; t = t->next)
 {
-struct __ecereNameSpace__ecere__com__Property * _property;
+struct __ecereNameSpace__ecere__com__Class * template = t->data;
 
-for(_property = c->membersAndProperties.first; _property; _property = _property->next)
+classLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*_class->nameSpace).classes, template->name);
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)classLink);
+}
+}
 {
-if(_property->isProperty)
+struct __ecereNameSpace__ecere__com__NameSpace * ns = _class->nameSpace;
+
+while(ns != nameSpace && (*ns).parent && !__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&(*ns).classes) && !__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&(*ns).functions) && !__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&(*ns).defines) && !__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&(*ns).nameSpaces))
 {
-struct __ecereNameSpace__ecere__com__BTNamedLink * link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&_class->prop, _property->name);
+struct __ecereNameSpace__ecere__com__NameSpace * parent = (*ns).parent;
 
-if(link)
+__ecereNameSpace__ecere__com__NameSpace_Free(ns);
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*parent).nameSpaces, (struct __ecereNameSpace__ecere__sys__BTNode *)ns);
+ns = parent;
+}
+}
+}
+else
 {
-prop = link->data;
-if(!prop->Set && !prop->Get && prop->memberAccess == 4)
+classLink = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->privateNameSpace, name, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
+if(!classLink)
+classLink = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, name, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
+if(!classLink)
+classLink = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->privateNameSpace, name + start, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
+if(!classLink)
+classLink = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, name + start, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
+if(classLink)
+_class = classLink->data;
+if(_class && _class->internalDecl)
 {
-struct __ecereNameSpace__ecere__com__SelfWatcher * watcher;
+__ecereNameSpace__ecere__com__FreeTemplatesDerivatives(_class);
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)classLink);
+{
+struct __ecereNameSpace__ecere__sys__OldLink * t;
 
-for(watcher = _class->selfWatchers.first; watcher; watcher = watcher->next)
+for(t = _class->templatized.first; t; t = t->next)
 {
-if(watcher->_property == prop)
-watcher->_property = _property;
-}
-_property->selfWatchable = 1;
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->prop, (struct __ecereNameSpace__ecere__sys__BTNode *)link);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)prop->name), prop->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)prop->dataTypeString), prop->dataTypeString = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->membersAndProperties, prop);
+struct __ecereNameSpace__ecere__com__Class * template = t->data;
+
+classLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*_class->nameSpace).classes, template->name);
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)classLink);
 }
 }
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->fullName), _class->fullName = 0);
+_class->fullName = __ecereNameSpace__ecere__sys__CopyString(name);
 }
+else
+{
+_class = __ecereNameSpace__ecere__com___calloc(1, sizeof(struct __ecereNameSpace__ecere__com__Class));
+_class->methods.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
+_class->members.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
+_class->prop.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
+_class->classProperties.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
+_class->name = __ecereNameSpace__ecere__sys__CopyString(name + start);
+_class->fullName = __ecereNameSpace__ecere__sys__CopyString(name);
 }
 }
+if(nameSpace)
 {
-struct __ecereNameSpace__ecere__com__DataMember * next;
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&(*nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)__extension__ ({
+struct __ecereNameSpace__ecere__com__BTNamedLink * __ecereInstance1 = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__BTNamedLink));
 
-for(member = _class->membersAndProperties.first; member; member = next)
+__ecereInstance1->name = (char *)_class->name, __ecereInstance1->data = _class, __ecereInstance1;
+}));
 {
-int offsetDiff = _class->offset - offsetBefore;
+struct __ecereNameSpace__ecere__sys__OldLink * t;
 
-next = member->next;
-if(!member->isProperty)
-{
-if(oldType == 2 && type != 2)
+for(t = _class->templatized.first; t; t = t->next)
 {
-struct __ecereNameSpace__ecere__com__DataMember * prev = member->prev;
+struct __ecereNameSpace__ecere__com__Class * template = t->data;
 
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&_class->membersAndProperties, member);
-member = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eSystem_Renew0(member, sizeof(unsigned char) * (sizeof(struct __ecereNameSpace__ecere__com__DataMember)));
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(&_class->membersAndProperties, prev, member);
-}
-if(offsetDiff > 0)
-{
-member->offset += offsetDiff;
-member->memberOffset += offsetDiff;
-}
-}
-member->id += mod->base->memberID;
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&(*nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)__extension__ ({
+struct __ecereNameSpace__ecere__com__BTNamedLink * __ecereInstance1 = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__BTNamedLink));
+
+__ecereInstance1->name = (char *)template->name, __ecereInstance1->data = template, __ecereInstance1;
+}));
 }
-_class->memberID += mod->base->memberID;
-_class->startMemberID += mod->base->memberID;
 }
 }
-__ecereNameSpace__ecere__com__FixDerivativesBase(_class, mod);
+if(_class)
 {
-struct __ecereNameSpace__ecere__com__Class * c;
-
-for(c = mod->base; c; c = c->base)
+if(!base && baseName && strcmp(baseName, name))
 {
-struct __ecereNameSpace__ecere__com__ClassProperty * _property;
+if(strchr(baseName, '<'))
+{
+char templateClassName[1024];
+struct __ecereNameSpace__ecere__com__Class * templateBase;
 
-for(_property = (struct __ecereNameSpace__ecere__com__ClassProperty *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&c->classProperties); _property; _property = (struct __ecereNameSpace__ecere__com__ClassProperty *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)_property)))
+strcpy(templateClassName, baseName);
+*strchr(templateClassName, '<') = '\0';
+templateBase = __ecereNameSpace__ecere__com__System_FindClass(module, templateClassName, 1);
+if(!templateBase)
 {
-__ecereNameSpace__ecere__com__SetDelayedCPValues(_class, _property);
+templateBase = __ecereNameSpace__ecere__com__eSystem_RegisterClass((int)0, templateClassName, (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), module, declMode, 1);
+templateBase->internalDecl = 1;
 }
+base = __ecereNameSpace__ecere__com__System_FindClass(module, baseName, 1);
 }
+else
+{
+base = __ecereNameSpace__ecere__com__eSystem_RegisterClass((int)0, baseName, (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), module, declMode, 1);
+base->internalDecl = 1;
 }
 }
+else
+_class->internalDecl = 0;
+if(totalSizeClass)
 {
-struct __ecereNameSpace__ecere__sys__OldLink * templateLink;
-
-for(templateLink = base->templatized.first; templateLink; templateLink = templateLink->next)
-{
-struct __ecereNameSpace__ecere__com__Class * template = templateLink->data;
-
-template->base = base->base;
-template->_vTbl = base->_vTbl;
-template->data = base->data;
-template->offset = base->offset;
-template->offsetClass = base->offsetClass;
-template->sizeClass = base->sizeClass;
-template->structSize = base->structSize;
-template->vTblSize = base->vTblSize;
-__ecereNameSpace__ecere__com__FixDerivativesBase(template, mod);
-}
+_class->data = __ecereNameSpace__ecere__com__eSystem_Renew(_class->data, sizeof(unsigned char) * (totalSizeClass));
+if(base && base->type != 1000 && base->type != 4)
+memcpy(_class->data, base->data, offsetClass);
+else
+memset(_class->data, 0, offsetClass);
+memset((unsigned char *)_class->data + offsetClass, 0, sizeClass);
 }
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->dataTypeString), _class->dataTypeString = 0);
+_class->dataTypeString = __ecereNameSpace__ecere__sys__CopyString(dataTypeString);
+_class->defaultAlignment = base ? base->defaultAlignment : 0;
+if(_class->module)
+{
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)_class->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, _class);
 }
+if(_class->base)
+{
+struct __ecereNameSpace__ecere__com__Class * base = _class->base;
+struct __ecereNameSpace__ecere__sys__OldLink * deriv = __ecereMethod___ecereNameSpace__ecere__sys__OldList_FindLink(&base->derivatives, _class);
 
-struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_FindClass(struct __ecereNameSpace__ecere__com__Instance * module, const char * name)
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&base->derivatives, deriv);
+}
+if(module)
 {
-if(name && module)
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, _class);
+}
+_class->nameSpace = nameSpace;
 {
-struct __ecereNameSpace__ecere__com__BTNamedLink * link;
+struct __ecereNameSpace__ecere__sys__OldLink * t;
 
-if(!strncmp(name, "const ", 6))
-name += 6;
-link = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->systemNameSpace, name, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
-if(link)
-return link->data;
-link = __ecereNameSpace__ecere__com__SearchModule(module, name, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes, 1);
-if(link)
-return link->data;
+for(t = _class->templatized.first; t; t = t->next)
 {
-char noTemplateName[1024];
-char * templateParams = strchr(name, '<');
+struct __ecereNameSpace__ecere__com__Class * template = t->data;
 
-if(templateParams)
-{
-strncpy(noTemplateName, name, templateParams - name);
-noTemplateName[templateParams - name] = '\0';
+template->nameSpace = nameSpace;
 }
-else
-strcpy(noTemplateName, name);
-link = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->systemNameSpace, noTemplateName, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
-if(!link)
-link = __ecereNameSpace__ecere__com__SearchModule(module, noTemplateName, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes, 1);
-if(link)
+}
+_class->module = module;
+prevBase = _class->base;
+_class->base = base;
+if(base)
 {
-struct __ecereNameSpace__ecere__com__Class * _class = link->data;
-struct __ecereNameSpace__ecere__com__Class * templatedClass = (((void *)0));
-char className[1024];
+int numParams = 0;
+struct __ecereNameSpace__ecere__com__Class * sClass;
 
-strcpy(className, _class->fullName);
-strcat(className, templateParams);
-link = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->systemNameSpace, className, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
-if(link)
-return link->data;
-link = __ecereNameSpace__ecere__com__SearchModule(module, className, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes, 1);
-if(link)
-return link->data;
-if(_class && templateParams)
+for(sClass = base; sClass; sClass = sClass->base)
 {
-struct __ecereNameSpace__ecere__sys__OldList __simpleStruct1 =
+if(sClass->templateClass)
+sClass = sClass->templateClass;
+numParams += sClass->templateParams.count;
+}
+if(numParams)
 {
-0, 0, 0, 0, 0
-};
-struct __ecereNameSpace__ecere__sys__OldList __simpleStruct0 =
+if(_class->templateArgs)
 {
-0, 0, 0, 0, 0
-};
-
-templatedClass = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__Class));
-*templatedClass = *_class;
-templatedClass->templateClass = _class;
-templatedClass->fullName = __ecereNameSpace__ecere__sys__CopyString(className);
-templatedClass->dataTypeString = __ecereNameSpace__ecere__sys__CopyString(_class->dataTypeString);
-templatedClass->name = __ecereNameSpace__ecere__sys__CopyString(templatedClass->fullName + strlen(_class->fullName) - strlen(_class->name));
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&(*templatedClass->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)__extension__ ({
-struct __ecereNameSpace__ecere__com__BTNamedLink * __ecereInstance1 = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__BTNamedLink));
-
-__ecereInstance1->name = (char *)templatedClass->name, __ecereInstance1->data = templatedClass, __ecereInstance1;
-}));
-templatedClass->templateArgs = (((void *)0));
-templatedClass->numParams = 0;
-templatedClass->derivatives = __simpleStruct0;
-templatedClass->templatized = __simpleStruct1;
-templatedClass->module = module;
-templatedClass->count = 0;
-templatedClass->prev = (((void *)0));
-templatedClass->next = (((void *)0));
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, templatedClass);
-__ecereNameSpace__ecere__com__ComputeClassParameters(templatedClass, templateParams, module);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&_class->templatized, __extension__ ({
-struct __ecereNameSpace__ecere__sys__OldLink * __ecereInstance1 = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__sys__OldLink));
+__ecereNameSpace__ecere__com__FreeTemplateArgs(_class);
+}
+(__ecereNameSpace__ecere__com__eSystem_Delete(_class->templateArgs), _class->templateArgs = 0);
+_class->templateArgs = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__ClassTemplateArgument) * (numParams));
+_class->numParams = numParams;
+for(sClass = _class; sClass; sClass = sClass->base)
+{
+struct __ecereNameSpace__ecere__com__Class * prevClass;
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+int id = 0;
 
-__ecereInstance1->data = templatedClass, __ecereInstance1;
-}));
+if(sClass->templateClass)
+sClass = sClass->templateClass;
+for(prevClass = sClass->base; prevClass; prevClass = prevClass->base)
+{
+if(prevClass->templateClass)
+prevClass = prevClass->templateClass;
+id += prevClass->templateParams.count;
 }
-return templatedClass;
+if(base->templateArgs)
+{
+for(param = sClass->templateParams.first; param; param = param->next)
+{
+_class->templateArgs[id] = base->templateArgs[id];
+__ecereNameSpace__ecere__com__CopyTemplateArg(param, &_class->templateArgs[id]);
+id++;
 }
 }
 }
-return (((void *)0));
 }
-
-static void __ecereNameSpace__ecere__com__FreeTemplates(struct __ecereNameSpace__ecere__com__Class * _class)
+}
+_class->memberID = _class->startMemberID = (base && (type == 0 || type == 5 || type == 1)) ? base->memberID : 0;
+if(type == 0 || type == 5)
+_class->offset = (base && base->structSize && base->type != 1000) ? (base->type == 0 ? base->structSize : base->memberOffset) : ((type == 5) ? 0 : ((force64Bits && inCompiler && fixed) ? 24 : (force32Bits && inCompiler && fixed) ? 12 : sizeof(struct __ecereNameSpace__ecere__com__Instance)));
+else
+_class->offset = 0;
+if(crossBits)
 {
-struct __ecereNameSpace__ecere__sys__OldLink * deriv, * template;
-
-for(deriv = _class->derivatives.first; deriv; deriv = deriv->next)
+if(!strcmp(name, "GNOSISSystem") || !strcmp(name, "LineStyle") || !strcmp(name, "FillStyle") || !strcmp(name, "FontObject") || !strcmp(name, "FontObject") || !strcmp(name, "ecere::sys::Thread"))
 {
-__ecereNameSpace__ecere__com__FreeTemplates(deriv->data);
+_class->offset = force32Bits ? 24 : 12;
 }
-__ecereNameSpace__ecere__com__FreeTemplateArgs(_class);
-(__ecereNameSpace__ecere__com__eSystem_Delete(_class->templateArgs), _class->templateArgs = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->dataTypeString), _class->dataTypeString = 0);
-while((template = _class->templatized.first))
+else if(strstr(name, "ecere::sys::EARHeader") || strstr(name, "AnchorValue") || !strcmp(name, "ecere::com::CustomAVLTree") || !strcmp(name, "ecere::com::Array") || !strcmp(name, "ecere::gui::Window") || !strcmp(name, "ecere::sys::Mutex"))
+;
+else
 {
-__ecereNameSpace__ecere__com__FreeTemplates(template->data);
-__ecereNameSpace__ecere__com__FreeTemplate(template->data);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templatized, template);
+if(!strcmp(name, "ecere::sys::FileListing"))
+{
+size = 3 * (force32Bits ? 4 : 8);
+_class->structAlignment = force32Bits ? 4 : 8;
+_class->pointerAlignment = 1;
+}
+else if(!strcmp(name, "ecere::com::Class"))
+size = 0;
+else if(!strcmp(name, "ecere::com::ClassProperty"))
+size = 0;
+else if(!strcmp(name, "ecere::com::NameSpace"))
+size = 0;
+else if(!strcmp(name, "ecere::sys::BufferedFile"))
+size = 0;
+else if(!strcmp(name, "ecere::sys::BTNode"))
+size = 0;
+else if(!strcmp(name, "ecere::sys::StringBTNode"))
+size = 0;
+else if(!strcmp(name, "ecere::sys::OldList"))
+size = 0;
+else if(!strcmp(name, "ecere::sys::Item"))
+size = 0;
+else if(!strcmp(name, "ecere::sys::NamedLink"))
+size = 0;
+else if(!strcmp(name, "ecere::sys::NamedLink64"))
+size = 0;
+else if(!strcmp(name, "ecere::sys::OldLink"))
+size = 0;
+else if(!strcmp(name, "ecere::sys::NamedItem"))
+size = 0;
+else if(!strcmp(name, "ecere::sys::NamedItem64"))
+size = 0;
+else if(!strcmp(name, "ecere::sys::BinaryTree"))
+size = 0;
+else if(module != ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application && inCompiler)
+{
+if(fixed || type == 1)
+size = 0;
 }
 }
-
-struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_RegisterClass(int type, const char * name, const char * baseName, int size, int sizeClass, unsigned int (* Constructor)(void *), void (* Destructor)(void *), struct __ecereNameSpace__ecere__com__Instance * module, int declMode, int inheritanceAccess)
+}
+if(type == 1)
 {
-int start = 0, c;
-struct __ecereNameSpace__ecere__com__NameSpace * nameSpace = (((void *)0));
-unsigned int force64Bits = (((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->isGUIApp & 2) ? 1 : 0;
-unsigned int force32Bits = (((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->isGUIApp & 4) ? 1 : 0;
-unsigned int inCompiler = (((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->isGUIApp & 8) ? 1 : 0;
-unsigned int crossBits = force32Bits || force64Bits;
-unsigned int fixed = 0;
-
-if(inCompiler && crossBits)
+_class->memberOffset = (base && base->structSize && base->type != 1000) ? base->structSize : 0;
+_class->typeSize = _class->structSize = _class->memberOffset + size;
+}
+else if(type == 2 || type == 4 || type == 3)
 {
-struct __ecereNameSpace__ecere__com__Class * c = __ecereNameSpace__ecere__com__eSystem_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, name);
+struct __ecereNameSpace__ecere__com__Class * dataTypeClass = __ecereNameSpace__ecere__com__System_FindClass(_class->module, dataTypeString, 1);
 
-if(c && c->fixed)
-fixed = 1;
-else if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name && !strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, "ecereCOM"))
-fixed = 1;
+if(dataTypeClass)
+_class->typeSize = dataTypeClass->typeSize;
+_class->structSize = 0;
 }
+else if(type == 0 || type == 5)
 {
-nameSpace = (declMode == 1) ? &((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace : &((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->privateNameSpace;
-if(declMode == 4)
-nameSpace = &((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->systemNameSpace;
+_class->structSize = _class->offset + size;
+_class->typeSize = sizeof(void *);
+}
+_class->offsetClass = offsetClass;
+_class->sizeClass = totalSizeClass;
+_class->Constructor = Constructor;
+_class->Destructor = Destructor;
+if(_class->type != 1000)
+_class->type = type;
+if(!size)
+_class->computeSize = 1;
+else
+_class->computeSize = 0;
+_class->inheritanceAccess = inheritanceAccess;
+if(type == 4)
 {
-for(c = 0; name[c]; c++)
+if(enumBase)
+_class->base = base = enumBase;
 {
-if(name[c] == '.' || (name[c] == ':' && name[c + 1] == ':'))
+struct __ecereNameSpace__ecere__com__EnumClassData * data = (struct __ecereNameSpace__ecere__com__EnumClassData *)_class->data;
+
+if(base && base->type != 4)
+data->largest = -1;
+else
+data->largest = ((struct __ecereNameSpace__ecere__com__EnumClassData *)base->data)->largest;
+}
+}
+if(base)
 {
-struct __ecereNameSpace__ecere__com__NameSpace * newSpace;
-char * spaceName = __ecereNameSpace__ecere__com___malloc(c - start + 1);
+int i;
+unsigned int oldSize = _class->vTblSize;
 
-strncpy(spaceName, name + start, c - start);
-spaceName[c - start] = '\0';
-newSpace = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*nameSpace).nameSpaces, spaceName);
-if(!newSpace)
+if(base->vTblSize && _class->vTblSize < base->vTblSize)
 {
-newSpace = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__NameSpace) * (1));
-(*newSpace).classes.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
-(*newSpace).defines.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
-(*newSpace).functions.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
-(*newSpace).nameSpaces.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
-(*newSpace).name = spaceName;
-(*newSpace).parent = nameSpace;
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&(*nameSpace).nameSpaces, (struct __ecereNameSpace__ecere__sys__BTNode *)newSpace);
+_class->vTblSize = base->vTblSize;
+_class->_vTbl = __ecereNameSpace__ecere__com___realloc(_class->_vTbl, sizeof(int (*)()) * _class->vTblSize);
 }
+if(!prevBase)
+{
+if(_class->type == 0 && strcmp(_class->name, "ecere::com::Instance") && strcmp(_class->name, "enum") && strcmp(_class->name, "struct"))
+prevBase = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "ecere::com::Instance");
 else
-(__ecereNameSpace__ecere__com__eSystem_Delete(spaceName), spaceName = 0);
-nameSpace = newSpace;
-if(name[c] == ':')
-c++;
-start = c + 1;
-}
+prevBase = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "class");
 }
+for(i = 0; i < base->vTblSize; i++)
+{
+if(i >= oldSize || _class->_vTbl[i] == prevBase->_vTbl[i])
+_class->_vTbl[i] = base->_vTbl[i];
 }
 }
-if(c - start)
+if(_class->base)
 {
-int offsetClass;
-int totalSizeClass;
-struct __ecereNameSpace__ecere__com__BTNamedLink * classLink = (((void *)0));
-struct __ecereNameSpace__ecere__com__Class * _class = (((void *)0));
-const char * dataTypeString = (((void *)0));
-struct __ecereNameSpace__ecere__com__Class * enumBase = (((void *)0));
-struct __ecereNameSpace__ecere__com__Class * base = (baseName && baseName[0]) ? __ecereNameSpace__ecere__com__eSystem_FindClass(module, baseName) : (((void *)0));
-struct __ecereNameSpace__ecere__com__Class * prevBase = (((void *)0));
+struct __ecereNameSpace__ecere__sys__OldLink * link = (link = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__sys__OldLink)), link->data = _class, link);
 
-if(base && !base->internalDecl && (base->type == 5 || base->type == 1 || base->type == 0))
-{
-if(base->type == 1 && type == 0)
-type = 5;
-else
-type = base->type;
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&_class->base->derivatives, link);
 }
-if(base && (type == 0 || type == 5 || type == 1) && (base->type == 3 || base->type == 2 || base->type == 4))
-{
-type = base->type;
+__ecereNameSpace__ecere__com__FixDerivativesBase(_class, _class);
+return _class;
 }
-if(!base || base->type == 1000 || base->isInstanceClass)
+}
+return (((void *)0));
+}
+
+void __ecereNameSpace__ecere__com__eProperty_Watchable(struct __ecereNameSpace__ecere__com__Property * _property)
 {
-if(type == 4)
+if(!_property->isWatchable)
 {
-if(base || !baseName || !baseName[0] || !strcmp(baseName, "unsigned int") || !strcmp(baseName, "uint") || !strcmp(baseName, "unsigned int64") || !strcmp(baseName, "uint64") || !strcmp(baseName, "int64") || !strcmp(baseName, "unsigned short") || !strcmp(baseName, "short") || !strcmp(baseName, "unsigned char") || !strcmp(baseName, "byte") || !strcmp(baseName, "char") || !strcmp(baseName, "uint32") || !strcmp(baseName, "uint16"))
+struct __ecereNameSpace__ecere__com__Class * _class = _property->_class;
+
+if(!_class->computeSize)
 {
-base = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "enum");
-dataTypeString = (baseName && baseName[0]) ? baseName : "int";
+_property->watcherOffset = _class->structSize;
+_class->structSize += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
+__ecereNameSpace__ecere__com__FixDerivativesBase(_class, _class);
 }
-else
-{
-base = __ecereNameSpace__ecere__com__eSystem_RegisterClass((int)0, baseName, (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), module, declMode, 1);
-base->internalDecl = 1;
-enumBase = base;
-base = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "enum");
+_property->isWatchable = 1;
 }
 }
-else if(type == 1 && (!baseName || !baseName[0]))
+
+void __ecereNameSpace__ecere__com__eClass_DestructionWatchable(struct __ecereNameSpace__ecere__com__Class * _class)
 {
-base = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "struct");
-dataTypeString = name + start;
+if(!_class->destructionWatchOffset)
+{
+_class->destructionWatchOffset = _class->structSize;
+_class->structSize += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
+__ecereNameSpace__ecere__com__FixDerivativesBase(_class, _class);
 }
-else
+}
+
+void __ecereNameSpace__ecere__com__eClass_DoneAddingTemplateParameters(struct __ecereNameSpace__ecere__com__Class * base)
 {
-if(type == 0)
-dataTypeString = "struct __ecereNameSpace__ecere__com__Instance";
-else if(type == 5)
-dataTypeString = "void *";
-else if(type == 2)
-dataTypeString = (baseName && baseName[0]) ? baseName : "unsigned int";
-else if(type == 3)
-dataTypeString = (baseName && baseName[0]) ? baseName : "int";
-else if(type == 1)
-dataTypeString = name + start;
-if(base || (!baseName || !baseName[0]) || type == 2 || type == 3)
+if(base)
 {
-if(base || !baseName || !baseName[0] || !strcmp(baseName, "unsigned int") || !strcmp(baseName, "uint") || !strcmp(baseName, "unsigned int64") || !strcmp(baseName, "uint64") || !strcmp(baseName, "int64") || !strcmp(baseName, "unsigned short") || !strcmp(baseName, "short") || !strcmp(baseName, "unsigned char") || !strcmp(baseName, "byte") || !strcmp(baseName, "char") || !strcmp(baseName, "uint32") || !strcmp(baseName, "uint16"))
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+
 {
-if(type == 0 && strcmp(name, "ecere::com::Instance") && strcmp(name, "enum") && strcmp(name, "struct"))
-base = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "ecere::com::Instance");
-else
-base = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "class");
-}
+void * first = base->templateParams.first;
+int count = base->templateParams.count;
+
+__ecereNameSpace__ecere__com__FreeTemplateArgs(base);
+(__ecereNameSpace__ecere__com__eSystem_Delete(base->templateArgs), base->templateArgs = 0);
+base->templateParams.first = (((void *)0));
+base->templateParams.count = 0;
+__ecereNameSpace__ecere__com__FreeTemplatesDerivatives(base);
+base->templateParams.first = first;
+base->templateParams.count = count;
 }
-else
+for(param = base->templateParams.first; param; param = param->next)
+{
+if(param->type == 1 && param->defaultArg.__anon1.__anon2.memberString)
+{
+struct __ecereNameSpace__ecere__com__Class * memberClass = base;
+const char * colon = strstr(param->defaultArg.__anon1.__anon2.memberString, "::");
+const char * memberName;
+
+if(colon)
+{
+char className[1024];
+struct __ecereNameSpace__ecere__com__Class * sClass;
+
+memcpy(className, param->defaultArg.__anon1.__anon2.memberString, colon - param->defaultArg.__anon1.__anon2.memberString);
+className[colon - param->defaultArg.__anon1.__anon2.memberString] = '\0';
+memberName = colon + 2;
+for(sClass = base; sClass; sClass = sClass->base)
+{
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
+struct __ecereNameSpace__ecere__com__Class * nextClass;
+int id = 0;
+
+for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
+id += nextClass->templateParams.count;
+if(sClass == base || base->templateArgs)
+{
+for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next)
 {
+if(cParam->type == 0 && !strcmp(cParam->name, className))
+strcpy(className, (sClass == base) ? cParam->defaultArg.__anon1.__anon1.dataTypeString : base->templateArgs[id].__anon1.__anon1.dataTypeString);
+id++;
+}
 }
 }
+memberClass = __ecereNameSpace__ecere__com__eSystem_FindClass(base->module, className);
+if(!memberClass)
+memberClass = __ecereNameSpace__ecere__com__eSystem_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)base->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, className);
 }
 else
+memberName = param->defaultArg.__anon1.__anon2.memberString;
+if(memberClass)
 {
-if(type == 4)
-{
-if(base->type != 4)
+switch(param->__anon1.memberType)
 {
-enumBase = base;
-base = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "enum");
+case 0:
+param->defaultArg.__anon1.__anon2.__anon1.member = __ecereNameSpace__ecere__com__eClass_FindDataMember(memberClass, memberName, memberClass->module, (((void *)0)), (((void *)0)));
+break;
+case 1:
+param->defaultArg.__anon1.__anon2.__anon1.method = __ecereNameSpace__ecere__com__eClass_FindMethod(memberClass, memberName, memberClass->module);
+break;
+case 2:
+param->defaultArg.__anon1.__anon2.__anon1.prop = __ecereNameSpace__ecere__com__eClass_FindProperty(memberClass, memberName, memberClass->module);
+break;
 }
 }
-dataTypeString = enumBase ? enumBase->dataTypeString : base->dataTypeString;
 }
-offsetClass = base ? base->sizeClass : (type == 5 ? 0 : 0);
-totalSizeClass = offsetClass + sizeClass;
-_class = __ecereNameSpace__ecere__com__eSystem_FindClass(module, name);
-if(!_class)
+}
+__ecereNameSpace__ecere__com__FixDerivativesBase(base, base);
+}
+}
+
+static void __ecereNameSpace__ecere__com__ComputeClassParameters(struct __ecereNameSpace__ecere__com__Class * templatedClass, const char * templateParams, struct __ecereNameSpace__ecere__com__Instance * findModule, unsigned int registerInternalDecl)
 {
-const char * colons = __ecereNameSpace__ecere__sys__RSearchString(name, "::", strlen(name), 1, 0);
+char ch;
+const char * nextParamStart = templateParams ? (templateParams + 1) : (((void *)0));
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
+struct __ecereNameSpace__ecere__com__Class * lastClass = (((void *)0)), * sClass;
+int curParamID = 0;
+int numParams = 0;
+struct __ecereNameSpace__ecere__com__Class * _class = templatedClass->templateClass ? templatedClass->templateClass : templatedClass;
 
-if(colons && colons)
+for(sClass = _class; sClass; sClass = sClass->base)
 {
-_class = __ecereNameSpace__ecere__com__eSystem_FindClass(module, colons + 2);
-if(_class)
+if(sClass->templateClass)
+sClass = sClass->templateClass;
+numParams += sClass->templateParams.count;
+}
+if(templatedClass->templateArgs)
+__ecereNameSpace__ecere__com__FreeTemplateArgs(templatedClass);
+(__ecereNameSpace__ecere__com__eSystem_Delete(templatedClass->templateArgs), templatedClass->templateArgs = 0);
+templatedClass->templateArgs = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__ClassTemplateArgument) * (numParams));
+templatedClass->numParams = numParams;
+if(_class != templatedClass)
 {
-if(_class->internalDecl)
+}
+if(templatedClass->base && templatedClass->base->templateArgs && _class == templatedClass)
 {
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->fullName), _class->fullName = 0);
-_class->fullName = __ecereNameSpace__ecere__sys__CopyString(name);
+struct __ecereNameSpace__ecere__com__Class * sClass;
+
+memcpy(templatedClass->templateArgs, templatedClass->base->templateArgs, sizeof(struct __ecereNameSpace__ecere__com__ClassTemplateArgument) * (numParams - templatedClass->templateParams.count));
+for(sClass = templatedClass->base; sClass; sClass = sClass->base)
+{
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+struct __ecereNameSpace__ecere__com__Class * prevClass;
+int id = 0;
+
+for(prevClass = sClass->base; prevClass; prevClass = prevClass->base)
+{
+if(prevClass->templateClass)
+prevClass = prevClass->templateClass;
+id += prevClass->templateParams.count;
 }
-else
-_class = (((void *)0));
+if(sClass->templateClass)
+sClass = sClass->templateClass;
+for(param = sClass->templateParams.first; param; param = param->next)
+__ecereNameSpace__ecere__com__CopyTemplateArg(param, &templatedClass->templateArgs[id++]);
 }
 }
+while(nextParamStart)
+{
+const char * paramStart = nextParamStart;
+const char * paramEnd;
+int level = 0;
+
+while(*paramStart == ' ')
+paramStart++;
+paramEnd = paramStart;
+while((ch = *paramEnd, ch && (level > 0 || (ch != '>' && ch != ','))))
+{
+if(ch == '<')
+level++;
+if(ch == '>')
+level--;
+paramEnd++;
 }
-if(_class)
+nextParamStart = (ch == ',') ? (paramEnd + 1) : (((void *)0));
+while(*paramEnd == ' ')
+paramEnd--;
+if(paramEnd > paramStart)
 {
-if(!_class->internalDecl)
+const char * ptr, * equal = (((void *)0));
+
+for(ptr = paramStart; ptr <= paramEnd; ptr++)
 {
-if(declMode != 4)
-printf("error: Redefinition of class %s\n", name);
-else
+if(*ptr == '=')
 {
-_class->comRedefinition = 1;
-return _class;
+equal = ptr;
+break;
 }
-return (((void *)0));
 }
-__ecereNameSpace__ecere__com__FreeTemplatesDerivatives(_class);
-classLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*_class->nameSpace).classes, name + start);
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)classLink);
+if(equal)
 {
-struct __ecereNameSpace__ecere__sys__OldLink * t;
+const char * end = equal - 1;
+char ident[1024];
 
-for(t = _class->templatized.first; t; t = t->next)
+while(*end == ' ')
+end--;
+strncpy(ident, paramStart, end + 1 - paramStart);
+ident[end + 1 - paramStart] = 0;
+for(sClass = _class; sClass; sClass = sClass->base)
 {
-struct __ecereNameSpace__ecere__com__Class * template = t->data;
-
-classLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*_class->nameSpace).classes, template->name);
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)classLink);
-}
+if(sClass->templateClass)
+sClass = sClass->templateClass;
+for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
+{
+if(!strcmp(curParam->name, ident))
+break;
 }
+if(curParam)
 {
-struct __ecereNameSpace__ecere__com__NameSpace * ns = _class->nameSpace;
+struct __ecereNameSpace__ecere__com__Class * nextClass;
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * prevParam;
 
-while(ns != nameSpace && (*ns).parent && !__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&(*ns).classes) && !__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&(*ns).functions) && !__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&(*ns).defines) && !__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&(*ns).nameSpaces))
+curParamID = 0;
+for(prevParam = curParam->prev; prevParam; prevParam = prevParam->prev)
+curParamID++;
+for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
 {
-struct __ecereNameSpace__ecere__com__NameSpace * parent = (*ns).parent;
-
-__ecereNameSpace__ecere__com__NameSpace_Free(ns);
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*parent).nameSpaces, (struct __ecereNameSpace__ecere__sys__BTNode *)ns);
-ns = parent;
+if(nextClass->templateClass)
+nextClass = nextClass->templateClass;
+curParamID += nextClass->templateParams.count;
+}
+break;
 }
 }
+lastClass = sClass;
 }
 else
 {
-classLink = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->privateNameSpace, name, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
-if(!classLink)
-classLink = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, name, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
-if(!classLink)
-classLink = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->privateNameSpace, name + start, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
-if(!classLink)
-classLink = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, name + start, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
-if(classLink)
-_class = classLink->data;
-if(_class && _class->internalDecl)
+if(curParam)
 {
-__ecereNameSpace__ecere__com__FreeTemplatesDerivatives(_class);
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)classLink);
+curParam = curParam->next;
+curParamID++;
+}
+if(!curParam)
 {
-struct __ecereNameSpace__ecere__sys__OldLink * t;
-
-for(t = _class->templatized.first; t; t = t->next)
+for(sClass = lastClass ? lastClass->base : _class; sClass; sClass = sClass->base)
 {
-struct __ecereNameSpace__ecere__com__Class * template = t->data;
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
 
-classLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*_class->nameSpace).classes, template->name);
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)classLink);
-}
-}
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->fullName), _class->fullName = 0);
-_class->fullName = __ecereNameSpace__ecere__sys__CopyString(name);
-}
-else
+curParamID = 0;
+if(sClass->templateClass)
+sClass = sClass->templateClass;
+for(param = sClass->templateParams.first; param; param = param->next, curParamID++)
 {
-_class = __ecereNameSpace__ecere__com___calloc(1, sizeof(struct __ecereNameSpace__ecere__com__Class));
-_class->methods.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
-_class->members.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
-_class->prop.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
-_class->classProperties.CompareKey = (void *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_CompareString;
-_class->name = __ecereNameSpace__ecere__sys__CopyString(name + start);
-_class->fullName = __ecereNameSpace__ecere__sys__CopyString(name);
-}
+curParam = param;
+break;
 }
-if(nameSpace)
+if(curParam)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&(*nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)__extension__ ({
-struct __ecereNameSpace__ecere__com__BTNamedLink * __ecereInstance1 = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__BTNamedLink));
+struct __ecereNameSpace__ecere__com__Class * nextClass;
 
-__ecereInstance1->name = (char *)_class->name, __ecereInstance1->data = _class, __ecereInstance1;
-}));
+for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
 {
-struct __ecereNameSpace__ecere__sys__OldLink * t;
-
-for(t = _class->templatized.first; t; t = t->next)
+if(nextClass->templateClass)
+nextClass = nextClass->templateClass;
+curParamID += nextClass->templateParams.count;
+}
+lastClass = sClass;
+break;
+}
+}
+}
+}
+if(curParam)
+{
+struct __ecereNameSpace__ecere__com__ClassTemplateArgument argument =
 {
-struct __ecereNameSpace__ecere__com__Class * template = t->data;
 
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&(*nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)__extension__ ({
-struct __ecereNameSpace__ecere__com__BTNamedLink * __ecereInstance1 = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__BTNamedLink));
+.__anon1 = {
 
-__ecereInstance1->name = (char *)template->name, __ecereInstance1->data = template, __ecereInstance1;
-}));
+.__anon1 = {
+.dataTypeString = 0
 }
 }
+};
+char value[1024];
+
+if(equal)
+{
+equal++;
+while(*equal == ' ')
+equal++;
+memcpy(value, equal, paramEnd - equal);
+value[paramEnd - equal] = 0;
 }
-if(_class)
+else
 {
-if(!base && baseName && strcmp(baseName, name))
+memcpy(value, paramStart, paramEnd - paramStart);
+value[paramEnd - paramStart] = 0;
+}
+__ecereNameSpace__ecere__sys__TrimRSpaces(value, value);
+switch(curParam->type)
 {
-if(strchr(baseName, '<'))
+case 0:
+argument.__anon1.__anon1.dataTypeString = __ecereNameSpace__ecere__sys__CopyString(value);
+argument.__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__System_FindClass(findModule, value, 1);
+if(!argument.__anon1.__anon1.dataTypeClass)
+argument.__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__System_FindClass(_class->module, value, 1);
+if(!argument.__anon1.__anon1.dataTypeClass)
+argument.__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__System_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)_class->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, value, 1);
+if(registerInternalDecl && !argument.__anon1.__anon1.dataTypeClass)
 {
-char templateClassName[1024];
-struct __ecereNameSpace__ecere__com__Class * templateBase;
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
 
-strcpy(templateClassName, baseName);
-*strchr(templateClassName, '<') = '\0';
-templateBase = __ecereNameSpace__ecere__com__eSystem_FindClass(module, templateClassName);
-if(!templateBase)
+for(param = templatedClass->templateParams.first; param; param = param->next)
+if(!strcmp(param->name, value))
+break;
+if(!param)
 {
-templateBase = __ecereNameSpace__ecere__com__eSystem_RegisterClass((int)0, templateClassName, (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), module, declMode, 1);
-templateBase->internalDecl = 1;
+argument.__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass((int)0, value, (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), _class->module, 1, 1);
+argument.__anon1.__anon1.dataTypeClass->internalDecl = 1;
 }
-base = __ecereNameSpace__ecere__com__eSystem_FindClass(module, baseName);
 }
-else
+break;
+case 2:
 {
-base = __ecereNameSpace__ecere__com__eSystem_RegisterClass((int)0, baseName, (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), module, declMode, 1);
-base->internalDecl = 1;
+struct __ecereNameSpace__ecere__com__Class * expClass = __ecereNameSpace__ecere__com__System_FindClass(_class->module, curParam->__anon1.dataTypeString, 1);
+
+if(!expClass)
+expClass = __ecereNameSpace__ecere__com__System_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)_class->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, curParam->__anon1.dataTypeString, 1);
+if(expClass)
+{
+((unsigned int (*)(void *, void *, const char *))(void *)expClass->_vTbl[__ecereVMethodID_class_OnGetDataFromString])(expClass, &argument.__anon1.expression, value);
 }
+else if(value[0] == '\"')
+{
+char * endQuote = value + strlen(value) - 1;
+
+if(*endQuote != '\"')
+endQuote++;
+*endQuote = '\0';
+argument.__anon1.expression.__anon1.p = __ecereNameSpace__ecere__sys__CopyString(value + 1);
 }
-else
-_class->internalDecl = 0;
-if(totalSizeClass)
+else if(value[0] == '\'')
 {
-_class->data = __ecereNameSpace__ecere__com__eSystem_Renew(_class->data, sizeof(unsigned char) * (totalSizeClass));
-if(base && base->type != 1000 && base->type != 4)
-memcpy(_class->data, base->data, offsetClass);
-else
-memset(_class->data, 0, offsetClass);
-memset((unsigned char *)_class->data + offsetClass, 0, sizeClass);
+int nb;
+unsigned int ch = __ecereNameSpace__ecere__sys__UTF8GetChar(value + 1, &nb);
+
+argument.__anon1.expression.__anon1.ui = ch;
 }
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->dataTypeString), _class->dataTypeString = 0);
-_class->dataTypeString = __ecereNameSpace__ecere__sys__CopyString(dataTypeString);
-_class->defaultAlignment = base ? base->defaultAlignment : 0;
-if(_class->module)
+else if(!strcmp(curParam->__anon1.dataTypeString, "uint"))
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)_class->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, _class);
+argument.__anon1.expression.__anon1.ui = (unsigned int)strtoul(value, (((void *)0)), 0);
 }
-if(_class->base)
+else if(!strcmp(curParam->__anon1.dataTypeString, "char"))
 {
-struct __ecereNameSpace__ecere__com__Class * base = _class->base;
-struct __ecereNameSpace__ecere__sys__OldLink * deriv = __ecereMethod___ecereNameSpace__ecere__sys__OldList_FindLink(&base->derivatives, _class);
-
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&base->derivatives, deriv);
+argument.__anon1.expression.__anon1.c = (char)strtol(value, (((void *)0)), 0);
 }
-if(module)
+else if(!strcmp(curParam->__anon1.dataTypeString, "byte"))
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, _class);
+argument.__anon1.expression.__anon1.uc = (unsigned char)strtoul(value, (((void *)0)), 0);
 }
-_class->nameSpace = nameSpace;
+else if(!strcmp(curParam->__anon1.dataTypeString, "short"))
 {
-struct __ecereNameSpace__ecere__sys__OldLink * t;
-
-for(t = _class->templatized.first; t; t = t->next)
+argument.__anon1.expression.__anon1.s = (short)strtol(value, (((void *)0)), 0);
+}
+else if(!strcmp(curParam->__anon1.dataTypeString, "uint16"))
 {
-struct __ecereNameSpace__ecere__com__Class * template = t->data;
-
-template->nameSpace = nameSpace;
+argument.__anon1.expression.__anon1.us = (unsigned short)strtoul(value, (((void *)0)), 0);
 }
+else if(!strcmp(curParam->__anon1.dataTypeString, "int64"))
+{
+argument.__anon1.expression.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(value, (((void *)0)), 0);
 }
-_class->module = module;
-prevBase = _class->base;
-_class->base = base;
-if(base)
+else if(!strcmp(curParam->__anon1.dataTypeString, "uint64"))
 {
-int numParams = 0;
-struct __ecereNameSpace__ecere__com__Class * sClass;
-
-for(sClass = base; sClass; sClass = sClass->base)
+argument.__anon1.expression.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(value, (((void *)0)), 0);
+}
+else if(!strcmp(curParam->__anon1.dataTypeString, "float"))
 {
-if(sClass->templateClass)
-sClass = sClass->templateClass;
-numParams += sClass->templateParams.count;
+argument.__anon1.expression.__anon1.f = (float)strtod(value, (((void *)0)));
 }
-if(numParams)
+else if(!strcmp(curParam->__anon1.dataTypeString, "double"))
 {
-if(_class->templateArgs)
+argument.__anon1.expression.__anon1.d = strtod(value, (((void *)0)));
+}
+else
 {
-__ecereNameSpace__ecere__com__FreeTemplateArgs(_class);
+argument.__anon1.expression.__anon1.i = (int)strtol(value, (((void *)0)), 0);
 }
-(__ecereNameSpace__ecere__com__eSystem_Delete(_class->templateArgs), _class->templateArgs = 0);
-_class->templateArgs = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__ClassTemplateArgument) * (numParams));
-_class->numParams = numParams;
-for(sClass = _class; sClass; sClass = sClass->base)
+break;
+}
+case 1:
+argument.__anon1.__anon2.memberString = __ecereNameSpace__ecere__sys__CopyString(value);
+break;
+}
+__ecereNameSpace__ecere__com__FreeTemplateArg(templatedClass, curParam, curParamID);
+templatedClass->templateArgs[curParamID] = argument;
+}
+}
+}
+if(templatedClass == _class)
 {
-struct __ecereNameSpace__ecere__com__Class * prevClass;
+struct __ecereNameSpace__ecere__com__Class * sClass = _class;
+int curParamID = 0;
+struct __ecereNameSpace__ecere__com__Class * nextClass;
 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
-int id = 0;
 
-if(sClass->templateClass)
-sClass = sClass->templateClass;
-for(prevClass = sClass->base; prevClass; prevClass = prevClass->base)
+for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
 {
-if(prevClass->templateClass)
-prevClass = prevClass->templateClass;
-id += prevClass->templateParams.count;
+if(nextClass->templateClass)
+nextClass = nextClass->templateClass;
+curParamID += nextClass->templateParams.count;
 }
-if(base->templateArgs)
-{
 for(param = sClass->templateParams.first; param; param = param->next)
 {
-_class->templateArgs[id] = base->templateArgs[id];
-__ecereNameSpace__ecere__com__CopyTemplateArg(param, &_class->templateArgs[id]);
-id++;
-}
+if(!templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeString)
+{
+templatedClass->templateArgs[curParamID] = param->defaultArg;
+__ecereNameSpace__ecere__com__CopyTemplateArg(param, &templatedClass->templateArgs[curParamID]);
+if(param->type == 0 && param->defaultArg.__anon1.__anon1.dataTypeString)
+{
+templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__System_FindClass(findModule, param->defaultArg.__anon1.__anon1.dataTypeString, 1);
+if(!templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass)
+templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__System_FindClass(templatedClass->module, param->defaultArg.__anon1.__anon1.dataTypeString, 1);
+if(!templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass)
+templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__System_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)templatedClass->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, param->defaultArg.__anon1.__anon1.dataTypeString, 1);
 }
 }
+curParamID++;
 }
 }
-_class->memberID = _class->startMemberID = (base && (type == 0 || type == 5 || type == 1)) ? base->memberID : 0;
-if(type == 0 || type == 5)
-_class->offset = (base && base->structSize && base->type != 1000) ? (base->type == 0 ? base->structSize : base->memberOffset) : ((type == 5) ? 0 : ((force64Bits && inCompiler && fixed) ? 24 : (force32Bits && inCompiler && fixed) ? 12 : sizeof(struct __ecereNameSpace__ecere__com__Instance)));
-else
-_class->offset = 0;
-if(crossBits)
+if(templatedClass->base && templatedClass->base->templateArgs && numParams - _class->templateParams.count)
 {
-if(!strcmp(name, "GNOSISSystem") || !strcmp(name, "LineStyle") || !strcmp(name, "FillStyle") || !strcmp(name, "FontObject") || !strcmp(name, "FontObject") || !strcmp(name, "ecere::sys::Thread"))
+int c = numParams - _class->templateParams.count - 1;
+
+for(sClass = _class->base; sClass; sClass = sClass->base)
 {
-_class->offset = force32Bits ? 24 : 12;
-}
-else if(strstr(name, "ecere::sys::EARHeader") || strstr(name, "AnchorValue") || !strcmp(name, "ecere::com::CustomAVLTree") || !strcmp(name, "ecere::com::Array") || !strcmp(name, "ecere::gui::Window") || !strcmp(name, "ecere::sys::Mutex"))
-;
-else
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+
+if(sClass->templateClass)
+sClass = sClass->templateClass;
+for(param = sClass->templateParams.last; param; param = param->prev)
 {
-if(!strcmp(name, "ecere::sys::FileListing"))
+struct __ecereNameSpace__ecere__com__ClassTemplateArgument * arg = &templatedClass->templateArgs[c];
+struct __ecereNameSpace__ecere__com__ClassTemplateArgument * baseArg = &templatedClass->base->templateArgs[c];
+
+if(!(*arg).__anon1.__anon1.dataTypeString)
 {
-size = 3 * (force32Bits ? 4 : 8);
-_class->structAlignment = force32Bits ? 4 : 8;
-_class->pointerAlignment = 1;
-}
-else if(!strcmp(name, "ecere::com::Class"))
-size = 0;
-else if(!strcmp(name, "ecere::com::ClassProperty"))
-size = 0;
-else if(!strcmp(name, "ecere::com::NameSpace"))
-size = 0;
-else if(!strcmp(name, "ecere::sys::BufferedFile"))
-size = 0;
-else if(!strcmp(name, "ecere::sys::BTNode"))
-size = 0;
-else if(!strcmp(name, "ecere::sys::StringBTNode"))
-size = 0;
-else if(!strcmp(name, "ecere::sys::OldList"))
-size = 0;
-else if(!strcmp(name, "ecere::sys::Item"))
-size = 0;
-else if(!strcmp(name, "ecere::sys::NamedLink"))
-size = 0;
-else if(!strcmp(name, "ecere::sys::NamedLink64"))
-size = 0;
-else if(!strcmp(name, "ecere::sys::OldLink"))
-size = 0;
-else if(!strcmp(name, "ecere::sys::NamedItem"))
-size = 0;
-else if(!strcmp(name, "ecere::sys::NamedItem64"))
-size = 0;
-else if(!strcmp(name, "ecere::sys::BinaryTree"))
-size = 0;
-else if(module != ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application && inCompiler)
-{
-if(fixed || type == 1)
-size = 0;
-}
-}
-}
-if(type == 1)
+*arg = templatedClass->base->templateArgs[c];
+__ecereNameSpace__ecere__com__CopyTemplateArg(param, arg);
+if(param->type == 0)
 {
-_class->memberOffset = (base && base->structSize && base->type != 1000) ? base->structSize : 0;
-_class->typeSize = _class->structSize = _class->memberOffset + size;
-}
-else if(type == 2 || type == 4 || type == 3)
+if((*arg).__anon1.__anon1.dataTypeClass && strchr((*arg).__anon1.__anon1.dataTypeString, '<') && (*arg).__anon1.__anon1.dataTypeClass->templateArgs)
 {
-struct __ecereNameSpace__ecere__com__Class * dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, dataTypeString);
+struct __ecereNameSpace__ecere__com__Class * expClass = (*arg).__anon1.__anon1.dataTypeClass;
+struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
+int paramCount = 0;
+int lastParam = -1;
+char templateString[1024];
 
-if(dataTypeClass)
-_class->typeSize = dataTypeClass->typeSize;
-_class->structSize = 0;
-}
-else if(type == 0 || type == 5)
+sprintf(templateString, "%s<", expClass->templateClass->fullName);
+for(cClass = expClass; cClass; cClass = cClass->base)
 {
-_class->structSize = _class->offset + size;
-_class->typeSize = sizeof(void *);
-}
-_class->offsetClass = offsetClass;
-_class->sizeClass = totalSizeClass;
-_class->Constructor = Constructor;
-_class->Destructor = Destructor;
-if(_class->type != 1000)
-_class->type = type;
-if(!size)
-_class->computeSize = 1;
-else
-_class->computeSize = 0;
-_class->inheritanceAccess = inheritanceAccess;
-if(type == 4)
+int p = 0;
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+
+for(param = cClass->templateParams.first; param; param = param->next)
 {
-if(enumBase)
-_class->base = base = enumBase;
+int id = p;
+struct __ecereNameSpace__ecere__com__Class * sClass;
+struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
+
+for(sClass = expClass->base; sClass; sClass = sClass->base)
+id += sClass->templateParams.count;
+arg = expClass->templateArgs[id];
 {
-struct __ecereNameSpace__ecere__com__EnumClassData * data = (struct __ecereNameSpace__ecere__com__EnumClassData *)_class->data;
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
+int p = numParams - _class->templateParams.count;
 
-if(base && base->type != 4)
-data->largest = -1;
-else
-data->largest = ((struct __ecereNameSpace__ecere__com__EnumClassData *)base->data)->largest;
+for(cParam = _class->templateParams.first; cParam; cParam = cParam->next, p++)
+{
+if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString))
+{
+arg = templatedClass->templateArgs[p];
+break;
+}
 }
 }
-if(base)
 {
-int i;
-unsigned int oldSize = _class->vTblSize;
+char argument[256];
 
-if(base->vTblSize && _class->vTblSize < base->vTblSize)
+argument[0] = '\0';
+switch(param->type)
 {
-_class->vTblSize = base->vTblSize;
-_class->_vTbl = __ecereNameSpace__ecere__com___realloc(_class->_vTbl, sizeof(int (*)()) * _class->vTblSize);
+case 2:
+{
+break;
 }
-if(!prevBase)
+case 1:
 {
-if(_class->type == 0 && strcmp(_class->name, "ecere::com::Instance") && strcmp(_class->name, "enum") && strcmp(_class->name, "struct"))
-prevBase = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "ecere::com::Instance");
-else
-prevBase = __ecereNameSpace__ecere__com__eSystem_FindClass(module, "class");
+strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
+break;
 }
-for(i = 0; i < base->vTblSize; i++)
+case 0:
 {
-if(i >= oldSize || _class->_vTbl[i] == prevBase->_vTbl[i])
-_class->_vTbl[i] = base->_vTbl[i];
+if(arg.__anon1.__anon1.dataTypeString)
+strcat(argument, arg.__anon1.__anon1.dataTypeString);
+break;
 }
 }
-if(_class->base)
+if(argument[0])
 {
-struct __ecereNameSpace__ecere__sys__OldLink * link = (link = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__sys__OldLink)), link->data = _class, link);
-
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&_class->base->derivatives, link);
+if(paramCount)
+strcat(templateString, ", ");
+if(lastParam != p - 1)
+{
+strcat(templateString, param->name);
+strcat(templateString, " = ");
 }
-__ecereNameSpace__ecere__com__FixDerivativesBase(_class, _class);
-return _class;
+strcat(templateString, argument);
+paramCount++;
+lastParam = p;
 }
 }
-return (((void *)0));
+p++;
+}
 }
-
-void __ecereNameSpace__ecere__com__eProperty_Watchable(struct __ecereNameSpace__ecere__com__Property * _property)
-{
-if(!_property->isWatchable)
 {
-struct __ecereNameSpace__ecere__com__Class * _class = _property->_class;
+int len = (int)strlen(templateString);
 
-if(!_class->computeSize)
-{
-_property->watcherOffset = _class->structSize;
-_class->structSize += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
-__ecereNameSpace__ecere__com__FixDerivativesBase(_class, _class);
-}
-_property->isWatchable = 1;
+if(templateString[len - 1] == '>')
+templateString[len++] = ' ';
+templateString[len++] = '>';
+templateString[len++] = '\0';
 }
+__ecereNameSpace__ecere__com__FreeTemplateArg(templatedClass, param, c);
+(*arg).__anon1.__anon1.dataTypeString = __ecereNameSpace__ecere__sys__CopyString(templateString);
+(*arg).__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__System_FindClass(findModule, templateString, 1);
+if(!(*arg).__anon1.__anon1.dataTypeClass)
+(*arg).__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__System_FindClass(templatedClass->module, templateString, 1);
+if(!(*arg).__anon1.__anon1.dataTypeClass)
+(*arg).__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__System_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)templatedClass->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, templateString, 1);
 }
+else
+{
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
+int p = numParams - _class->templateParams.count;
 
-void __ecereNameSpace__ecere__com__eClass_DestructionWatchable(struct __ecereNameSpace__ecere__com__Class * _class)
+for(cParam = _class->templateParams.first; cParam; cParam = cParam->next, p++)
 {
-if(!_class->destructionWatchOffset)
+if(cParam->type == 0 && (*baseArg).__anon1.__anon1.dataTypeString && !strcmp(cParam->name, (*baseArg).__anon1.__anon1.dataTypeString))
 {
-_class->destructionWatchOffset = _class->structSize;
-_class->structSize += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
-__ecereNameSpace__ecere__com__FixDerivativesBase(_class, _class);
+__ecereNameSpace__ecere__com__FreeTemplateArg(templatedClass, param, c);
+(*arg).__anon1.__anon1.dataTypeString = templatedClass->templateArgs[p].__anon1.__anon1.dataTypeString;
+(*arg).__anon1.__anon1.dataTypeClass = templatedClass->templateArgs[p].__anon1.__anon1.dataTypeClass;
+__ecereNameSpace__ecere__com__CopyTemplateArg(cParam, arg);
+break;
+}
+}
+}
+}
+}
+c--;
 }
 }
-
-void __ecereNameSpace__ecere__com__eClass_DoneAddingTemplateParameters(struct __ecereNameSpace__ecere__com__Class * base)
-{
-if(base)
-{
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
-
-{
-void * first = base->templateParams.first;
-int count = base->templateParams.count;
-
-__ecereNameSpace__ecere__com__FreeTemplateArgs(base);
-(__ecereNameSpace__ecere__com__eSystem_Delete(base->templateArgs), base->templateArgs = 0);
-base->templateParams.first = (((void *)0));
-base->templateParams.count = 0;
-__ecereNameSpace__ecere__com__FreeTemplatesDerivatives(base);
-base->templateParams.first = first;
-base->templateParams.count = count;
 }
-for(param = base->templateParams.first; param; param = param->next)
-{
-if(param->type == 1 && param->defaultArg.__anon1.__anon2.memberString)
-{
-struct __ecereNameSpace__ecere__com__Class * memberClass = base;
-const char * colon = strstr(param->defaultArg.__anon1.__anon2.memberString, "::");
-const char * memberName;
-
-if(colon)
 {
-char className[1024];
 struct __ecereNameSpace__ecere__com__Class * sClass;
 
-memcpy(className, param->defaultArg.__anon1.__anon2.memberString, colon - param->defaultArg.__anon1.__anon2.memberString);
-className[colon - param->defaultArg.__anon1.__anon2.memberString] = '\0';
-memberName = colon + 2;
-for(sClass = base; sClass; sClass = sClass->base)
+for(sClass = _class; sClass; sClass = sClass->base)
 {
-struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
+int curParamID = 0;
 struct __ecereNameSpace__ecere__com__Class * nextClass;
-int id = 0;
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
 
+if(sClass->templateClass)
+sClass = sClass->templateClass;
 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
-id += nextClass->templateParams.count;
-if(sClass == base || base->templateArgs)
 {
-for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next)
-{
-if(cParam->type == 0 && !strcmp(cParam->name, className))
-strcpy(className, (sClass == base) ? cParam->defaultArg.__anon1.__anon1.dataTypeString : base->templateArgs[id].__anon1.__anon1.dataTypeString);
-id++;
-}
-}
-}
-memberClass = __ecereNameSpace__ecere__com__eSystem_FindClass(base->module, className);
-if(!memberClass)
-memberClass = __ecereNameSpace__ecere__com__eSystem_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)base->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, className);
+if(nextClass->templateClass)
+nextClass = nextClass->templateClass;
+curParamID += nextClass->templateParams.count;
 }
-else
-memberName = param->defaultArg.__anon1.__anon2.memberString;
-if(memberClass)
+for(param = sClass->templateParams.first; param; param = param->next)
 {
-switch(param->__anon1.memberType)
+if(!templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeString)
 {
-case 0:
-param->defaultArg.__anon1.__anon2.__anon1.member = __ecereNameSpace__ecere__com__eClass_FindDataMember(memberClass, memberName, memberClass->module, (((void *)0)), (((void *)0)));
-break;
-case 1:
-param->defaultArg.__anon1.__anon2.__anon1.method = __ecereNameSpace__ecere__com__eClass_FindMethod(memberClass, memberName, memberClass->module);
-break;
-case 2:
-param->defaultArg.__anon1.__anon2.__anon1.prop = __ecereNameSpace__ecere__com__eClass_FindProperty(memberClass, memberName, memberClass->module);
-break;
+templatedClass->templateArgs[curParamID] = param->defaultArg;
+__ecereNameSpace__ecere__com__CopyTemplateArg(param, &templatedClass->templateArgs[curParamID]);
+if(param->type == 0 && param->defaultArg.__anon1.__anon1.dataTypeString)
+{
+templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__System_FindClass(findModule, param->defaultArg.__anon1.__anon1.dataTypeString, 1);
+if(!templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass)
+templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__System_FindClass(templatedClass->module, param->defaultArg.__anon1.__anon1.dataTypeString, 1);
+if(!templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass)
+templatedClass->templateArgs[curParamID].__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__System_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)templatedClass->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, param->defaultArg.__anon1.__anon1.dataTypeString, 1);
 }
 }
+curParamID++;
 }
 }
-__ecereNameSpace__ecere__com__FixDerivativesBase(base, base);
-}
 }
+{
+int c = numParams - 1;
 
-void __ecereNameSpace__ecere__com__eClass_Unregister(struct __ecereNameSpace__ecere__com__Class * _class)
+for(sClass = _class; sClass; sClass = sClass->base)
 {
-struct __ecereNameSpace__ecere__com__BTNamedLink * namedLink;
-struct __ecereNameSpace__ecere__com__DataMember * member;
-struct __ecereNameSpace__ecere__com__Method * method;
-struct __ecereNameSpace__ecere__sys__OldLink * deriv, * template;
-struct __ecereNameSpace__ecere__com__ClassProperty * classProp;
 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
 
-if(_class->templateClass)
+if(sClass->templateClass)
+sClass = sClass->templateClass;
+for(param = sClass->templateParams.last; param; param = param->prev)
 {
-struct __ecereNameSpace__ecere__sys__OldLink * templateLink;
+if(param->type == 0)
+{
+struct __ecereNameSpace__ecere__com__ClassTemplateArgument * arg = &templatedClass->templateArgs[c];
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
+struct __ecereNameSpace__ecere__com__Class * dClass;
+int p = numParams - 1;
 
-for(templateLink = _class->templateClass->templatized.first; templateLink; templateLink = templateLink->next)
+for(dClass = _class; dClass; dClass = dClass->base)
 {
-if(templateLink->data == _class)
+if(dClass->templateClass)
+dClass = dClass->templateClass;
+for(cParam = dClass->templateParams.last; cParam; cParam = cParam->prev, p--)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templateClass->templatized, templateLink);
-break;
+if(cParam->type == 0 && (*arg).__anon1.__anon1.dataTypeString && !strcmp(cParam->name, (*arg).__anon1.__anon1.dataTypeString))
+{
+if(templatedClass->templateArgs[p].__anon1.__anon1.dataTypeString && c != p)
+{
+__ecereNameSpace__ecere__com__FreeTemplateArg(templatedClass, param, c);
+(*arg).__anon1.__anon1.dataTypeString = templatedClass->templateArgs[p].__anon1.__anon1.dataTypeString;
+(*arg).__anon1.__anon1.dataTypeClass = templatedClass->templateArgs[p].__anon1.__anon1.dataTypeClass;
+__ecereNameSpace__ecere__com__CopyTemplateArg(cParam, arg);
 }
 }
-__ecereNameSpace__ecere__com__FreeTemplate(_class);
-return ;
 }
-(__ecereNameSpace__ecere__com__eSystem_Delete(_class->_vTbl), _class->_vTbl = 0);
-__ecereNameSpace__ecere__com__FreeTemplates(_class);
-while((template = _class->templatized.first))
-{
-__ecereNameSpace__ecere__com__FreeTemplate(template->data);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templatized, template);
 }
-while((member = _class->membersAndProperties.first))
-{
-if(!member->isProperty && (member->type == 1 || member->type == 2))
-__ecereNameSpace__ecere__com__DataMember_Free(member);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->name), member->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->dataTypeString), member->dataTypeString = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->membersAndProperties, member);
 }
-while((member = _class->conversions.first))
-{
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->name), member->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)member->dataTypeString), member->dataTypeString = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->conversions, member);
+c--;
 }
-while((namedLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->prop)))
-{
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->prop, (struct __ecereNameSpace__ecere__sys__BTNode *)namedLink);
 }
-while((namedLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->members)))
-{
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->members, (struct __ecereNameSpace__ecere__sys__BTNode *)namedLink);
 }
-while((classProp = (struct __ecereNameSpace__ecere__com__ClassProperty *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->classProperties)))
 {
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)classProp->name), classProp->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)classProp->dataTypeString), classProp->dataTypeString = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->classProperties, (struct __ecereNameSpace__ecere__sys__BTNode *)classProp);
-}
-while((method = (struct __ecereNameSpace__ecere__com__Method *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->methods)))
+struct __ecereNameSpace__ecere__com__Class * tClass;
+int c = numParams - 1;
+
+for(tClass = _class; tClass; tClass = tClass->base)
 {
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->name), method->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->dataTypeString), method->dataTypeString = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->methods, (struct __ecereNameSpace__ecere__sys__BTNode *)method);
-}
-if(_class->type == 4)
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
+
+if(tClass->templateClass)
+tClass = tClass->templateClass;
+for(param = tClass->templateParams.last; param; param = param->prev)
 {
-struct __ecereNameSpace__ecere__com__EnumClassData * data = (struct __ecereNameSpace__ecere__com__EnumClassData *)_class->data;
+struct __ecereNameSpace__ecere__com__ClassTemplateArgument * arg = &templatedClass->templateArgs[c];
 
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&data->values, (void *)__ecereNameSpace__ecere__com__FreeEnumValue);
-}
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&_class->delayedCPValues, (((void *)0)));
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&_class->selfWatchers, (((void *)0)));
-if(_class->base)
+if(param->type == 1 && (*arg).__anon1.__anon2.memberString)
 {
-struct __ecereNameSpace__ecere__com__Class * base = _class->base;
+struct __ecereNameSpace__ecere__com__Class * memberClass = templatedClass;
+const char * memberString = (*arg).__anon1.__anon2.memberString;
+const char * colon = strstr(memberString, "::");
+const char * memberName = memberString;
 
-for(deriv = base->derivatives.first; deriv; deriv = deriv->next)
+if(colon)
+memberName = colon + 2;
+if(!colon)
 {
-if(deriv->data == _class)
-break;
-}
-if(deriv)
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&base->derivatives, deriv);
+memberString = param->defaultArg.__anon1.__anon2.memberString;
+colon = memberString ? strstr(memberString, "::") : (((void *)0));
 }
-while((deriv = _class->derivatives.first))
+if(colon)
 {
-((struct __ecereNameSpace__ecere__com__Class *)deriv->data)->base = (((void *)0));
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->derivatives, deriv);
-}
-if(_class->nameSpace)
+char className[1024];
+struct __ecereNameSpace__ecere__com__Class * sClass;
+
+memcpy(className, memberString, colon - memberString);
+className[colon - memberString] = '\0';
+for(sClass = _class; sClass; sClass = sClass->base)
 {
-struct __ecereNameSpace__ecere__com__BTNamedLink * link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*_class->nameSpace).classes, _class->name);
+struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
+struct __ecereNameSpace__ecere__com__Class * nextClass;
+int id = 0;
 
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)link);
+if(sClass->templateClass)
+sClass = sClass->templateClass;
+for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
+{
+if(nextClass->templateClass)
+nextClass = nextClass->templateClass;
+id += nextClass->templateParams.count;
 }
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->name), _class->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->fullName), _class->fullName = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->dataTypeString), _class->dataTypeString = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete(_class->data), _class->data = 0);
-while((param = _class->templateParams.first))
+for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next)
 {
-switch(param->type)
+if(cParam->type == 0 && !strcmp(cParam->name, className) && templatedClass->templateArgs[id].__anon1.__anon1.dataTypeString)
+{
+strcpy(className, templatedClass->templateArgs[id].__anon1.__anon1.dataTypeString);
+}
+id++;
+}
+}
+memberClass = __ecereNameSpace__ecere__com__System_FindClass(findModule, className, 1);
+if(!memberClass)
+memberClass = __ecereNameSpace__ecere__com__System_FindClass(templatedClass->module, className, 1);
+if(!memberClass)
+memberClass = __ecereNameSpace__ecere__com__System_FindClass(((struct __ecereNameSpace__ecere__com__Module *)(((char *)templatedClass->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application, className, 1);
+}
+if(memberClass)
+{
+switch(param->__anon1.memberType)
 {
 case 0:
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->defaultArg.__anon1.__anon1.dataTypeString), param->defaultArg.__anon1.__anon1.dataTypeString = 0);
+(*arg).__anon1.__anon2.__anon1.member = __ecereNameSpace__ecere__com__eClass_FindDataMember(memberClass, memberName, memberClass->module, (((void *)0)), (((void *)0)));
 break;
 case 1:
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->defaultArg.__anon1.__anon2.memberString), param->defaultArg.__anon1.__anon2.memberString = 0);
+(*arg).__anon1.__anon2.__anon1.method = __ecereNameSpace__ecere__com__eClass_FindMethod(memberClass, memberName, memberClass->module);
 break;
 case 2:
+(*arg).__anon1.__anon2.__anon1.prop = __ecereNameSpace__ecere__com__eClass_FindProperty(memberClass, memberName, memberClass->module);
 break;
 }
-if(param->type != 1)
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->__anon1.dataTypeString), param->__anon1.dataTypeString = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)param->name), param->name = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templateParams, param);
-}
-__ecereNameSpace__ecere__com___free(_class);
-}
-
-void __ecereNameSpace__ecere__com__eInstance_Delete(struct __ecereNameSpace__ecere__com__Instance * instance)
-{
-if(instance)
-{
-struct __ecereNameSpace__ecere__com__Class * _class, * base;
-unsigned int ownVtbl;
-
-ownVtbl = ((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_vTbl != ((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_class->_vTbl;
-for(_class = ((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_class; _class; _class = base)
-{
-if(_class->templateClass)
-_class = _class->templateClass;
-if(_class->destructionWatchOffset)
-{
-struct __ecereNameSpace__ecere__sys__OldList * watchers = (struct __ecereNameSpace__ecere__sys__OldList *)((unsigned char *)instance + _class->destructionWatchOffset);
-struct __ecereNameSpace__ecere__com__Watcher * watcher, * next;
-
-for(watcher = (*watchers).first; watcher; watcher = next)
-{
-next = watcher->next;
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*watchers), watcher);
-watcher->callback(watcher->object, instance);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete((&*watchers), watcher);
-}
-}
-base = _class->base;
-if(base && (base->type == 1000 || base->isInstanceClass))
-base = (((void *)0));
-if(_class->Destructor)
-_class->Destructor(instance);
 }
-for(_class = ((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_class; _class; _class = base)
-{
-if(_class->templateClass)
-_class = _class->templateClass;
-base = _class->base;
-(_class->templateClass ? _class->templateClass : _class)->count--;
-if(_class->type == 0 && !_class->count && !_class->module)
-{
-__ecereNameSpace__ecere__com__eClass_Unregister(_class);
 }
+c--;
 }
-if(ownVtbl)
-{
-(__ecereNameSpace__ecere__com__eSystem_Delete(((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_vTbl), ((struct __ecereNameSpace__ecere__com__Instance * )(char * )instance)->_vTbl = 0);
 }
-__ecereNameSpace__ecere__com___free(instance);
 }
 }
 
-void __ecereNameSpace__ecere__com__eInstance_DecRef(struct __ecereNameSpace__ecere__com__Instance * instance)
-{
-if(instance)
-{
-((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_refCount--;
-if(((struct __ecereNameSpace__ecere__com__Instance *)(char *)instance)->_refCount <= 0)
+static void __ecereNameSpace__ecere__com__LoadCOM(struct __ecereNameSpace__ecere__com__Instance * module)
 {
-__ecereNameSpace__ecere__com__eInstance_Delete(instance);
-}
-}
-}
+unsigned int force64Bits = (((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->isGUIApp & 2) ? 1 : 0;
+unsigned int force32Bits = (((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->isGUIApp & 4) ? 1 : 0;
+unsigned int inCompiler = (((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->isGUIApp & 8) ? 1 : 0;
+int pointerSize = force64Bits ? 8 : force32Bits ? 4 : sizeof(void *);
+struct __ecereNameSpace__ecere__com__Class * applicationClass;
+struct __ecereNameSpace__ecere__com__Class * enumClass, * structClass, * boolClass;
+struct __ecereNameSpace__ecere__com__Class * moduleClass;
+struct __ecereNameSpace__ecere__com__Class * baseClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "class", (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), module, 4, 1);
 
-static struct __ecereNameSpace__ecere__com__Instance * __ecereNameSpace__ecere__com__Module_Load(struct __ecereNameSpace__ecere__com__Instance * fromModule, const char * name, int importAccess, unsigned int ensureCOM)
+baseClass->type = 1000;
+baseClass->memberOffset = 0;
+baseClass->offset = 0;
+baseClass->structSize = 0;
+baseClass->typeSize = 0;
 {
-unsigned int (ecere_stdcall * Load)(struct __ecereNameSpace__ecere__com__Instance * module) = (((void *)0));
-unsigned int (ecere_stdcall * Unload)(struct __ecereNameSpace__ecere__com__Instance * module) = (((void *)0));
-struct __ecereNameSpace__ecere__com__Instance * module;
+struct __ecereNameSpace__ecere__com__Class * instanceClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "ecere::com::Instance", (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), module, 4, 1);
 
-for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules.first; module; module = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->next)
-{
-if(!strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, name))
-break;
+instanceClass->type = 0;
+instanceClass->isInstanceClass = 1;
+instanceClass->fixed = 1;
+instanceClass->memberOffset = 0;
+instanceClass->offset = 0;
+instanceClass->memberID = -3;
+instanceClass->startMemberID = -3;
+__ecereNameSpace__ecere__com__eClass_AddDataMember(instanceClass, "_vTbl", "void **", pointerSize, pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(instanceClass, "_class", "ecere::com::Class", pointerSize, pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(instanceClass, "_refCount", "int", sizeof(int), sizeof(int), 1);
 }
-if(ensureCOM && (!strcmp(name, "ecereCOM") || !strcmp(name, "ecere")))
-{
-for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules.first; module; module = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->next)
+__ecereNameSpace__ecere__com__InitializeDataTypes1(module);
+enumClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "enum", (((void *)0)), 0, force64Bits ? 40 : sizeof(struct __ecereNameSpace__ecere__com__EnumClassData), (((void *)0)), (((void *)0)), module, 4, 1);
+__ecereNameSpace__ecere__com__eClass_AddClassProperty(enumClass, "enumSize", "int", (((void *)0)), __ecereNameSpace__ecere__com__GetEnumSize)->constant = 1;
+enumClass->type = 1000;
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)enumClass->dataTypeString), enumClass->dataTypeString = 0);
+enumClass->dataTypeString = __ecereNameSpace__ecere__sys__CopyString("int");
+structClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "struct", (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), module, 4, 1);
+structClass->type = 1000;
+structClass->memberOffset = 0;
+structClass->offset = 0;
+structClass->structSize = 0;
+structClass->typeSize = 0;
+__ecereNameSpace__ecere__com__InitializeDataTypes(module);
+boolClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(4, "bool", "uint", 0, 0, (((void *)0)), (((void *)0)), module, 4, 1);
+__ecereNameSpace__ecere__com__eEnum_AddFixedValue(boolClass, "true", 0x1);
+__ecereNameSpace__ecere__com__eEnum_AddFixedValue(boolClass, "false", 0x0);
+moduleClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "ecere::com::Module", (((void *)0)), force64Bits ? 8 + 32 + 32 + 32 + 32 + 8 + 8 + 8 + 8 + 8 + 4 + 4 + (32 + 8 + 8 + 4 * 32) + (32 + 8 + 8 + 4 * 32) : sizeof(struct __ecereNameSpace__ecere__com__Module), 0, (void *)__ecereNameSpace__ecere__com__Module_Constructor, (void *)__ecereNameSpace__ecere__com__Module_Destructor, module, 4, 1);
+__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(moduleClass, "OnLoad", "bool()", (((void *)0)), 1);
+__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(moduleClass, "OnUnload", "void()", (((void *)0)), 1);
+__ecereNameSpace__ecere__com__eClass_AddMethod(moduleClass, "Load", "Module(const char * name, AccessMode importAccess)", __ecereNameSpace__ecere__com__eModule_Load, 1);
+__ecereNameSpace__ecere__com__eClass_AddMethod(moduleClass, "Unload", "void(Module module)", __ecereNameSpace__ecere__com__eModule_Unload, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "application", "Application", pointerSize, pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "classes", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(struct __ecereNameSpace__ecere__sys__OldList), pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "defines", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(struct __ecereNameSpace__ecere__sys__OldList), pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "functions", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(struct __ecereNameSpace__ecere__sys__OldList), pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "modules", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(struct __ecereNameSpace__ecere__sys__OldList), pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "prev", "Module", pointerSize, pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "next", "Module", pointerSize, pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "name", "const char *", pointerSize, pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "library", "void *", pointerSize, pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "Unload", "void *", pointerSize, pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "importType", "ImportType", sizeof(int), 4, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "origImportType", "ImportType", sizeof(int), 4, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "privateNameSpace", "NameSpace", force64Bits ? (32 + 8 + 8 + 4 * 32) : force32Bits ? (16 + 4 + 4 + 4 * 16) : sizeof(struct __ecereNameSpace__ecere__com__NameSpace), pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "publicNameSpace", "NameSpace", force64Bits ? (32 + 8 + 8 + 4 * 32) : force32Bits ? (16 + 4 + 4 + 4 * 16) : sizeof(struct __ecereNameSpace__ecere__com__NameSpace), pointerSize, 1);
+moduleClass->fixed = 1;
+moduleClass->count++;
+if(inCompiler && force32Bits)
+moduleClass->structSize = 12 + 4 + 20 + 20 + 20 + 20 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + (16 + 4 + 4 + 4 * 16) + (16 + 4 + 4 + 4 * 16);
+applicationClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "ecere::com::Application", "Module", force64Bits ? (8 + 8 + 4 + 4 + 32 + 8 + 176) : sizeof(struct __ecereNameSpace__ecere__com__Application), 0, (((void *)0)), (void *)__ecereNameSpace__ecere__com__Application_Destructor, module, 4, 1);
+if(inCompiler && force32Bits)
 {
-if(!strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, "ecere") || !strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, "ecereCOM"))
-break;
+applicationClass->offset = 12 + 4 + 20 + 20 + 20 + 20 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + (16 + 4 + 4 + 4 * 16) + (16 + 4 + 4 + 4 * 16);
+applicationClass->structSize = applicationClass->offset + (4 + 4 + 4 + 4 + 20 + 4 + 88);
 }
+__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(applicationClass, "Main", "void()", (((void *)0)), 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "argc", "int", sizeof(int), 4, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "argv", "const char **", pointerSize, pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "exitCode", "int", sizeof(int), 4, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "isGUIApp", "bool", sizeof(unsigned int), 4, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "allModules", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(struct __ecereNameSpace__ecere__sys__OldList), pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "parsedCommand", "char *", pointerSize, pointerSize, 1);
+__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "systemNameSpace", "NameSpace", force64Bits ? (32 + 8 + 8 + 4 * 32) : force32Bits ? (16 + 4 + 4 + 4 * 16) : sizeof(struct __ecereNameSpace__ecere__com__NameSpace), pointerSize, 1);
+applicationClass->fixed = 1;
+applicationClass->count++;
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("sin", "double sin(Angle number)", sin, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("sinh", "double sinh(Angle number)", sinh, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("cosh", "double cosh(Angle number)", cosh, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("tanh", "double tanh(Angle number)", tanh, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("sqrt", "double sqrt(double number)", sqrt, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("cos", "double cos(Angle number)", cos, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("tan", "double tan(Angle number)", tan, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("atan2", "Angle atan2(double y, double x)", atan2, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("asin", "Angle asin(double number)", asin, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("acos", "Angle acos(double number)", acos, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("atan", "Angle atan(double number)", atan, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("asinh", "Angle asinh(double number)", asinh, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("acosh", "Angle acosh(double number)", acosh, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("atanh", "Angle atanh(double number)", atanh, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("pow", "double pow(double number, double number2)", pow, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("fmod", "double fmod(double x, double y)", fmod, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("fabs", "double fabs(double number)", fabs, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("log", "double log(double number)", log, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("log10", "double log10(double number)", log10, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("ceil", "double ceil(double number)", ceil, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("floor", "double floor(double number)", floor, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("exp", "double exp(double number)", exp, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("qsort", "void qsort(void *, uintsize, uintsize, int (*)(void *, void *))", qsort, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strtod", "double strtod(const char*, char**)", strtod, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strtol", "int strtol(const char*, char**, int base)", strtol, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strtoul", "unsigned long strtoul(const char * nptr, char ** endptr, int base)", strtoul, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strtoll", "int64 strtoll(const char * nptr, char ** endptr, int base)", strtoll, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strtoull", "uint64 strtoull(const char * nptr, char ** endptr, int base)", strtoull, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("system", "int system(const char*)", system, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("atoi", "int atoi(const char*)", atoi, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("atof", "double atof(const char*)", atof, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("memset", "void * memset(void * area, int value, uintsize count)", memset, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("getenv", "char * getenv(const char * name)", getenv, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("rename", "int rename(const char *oldpath, const char *newpath)", rename, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strlen", "uintsize strlen(const char *)", strlen, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strcat", "char * strcat(char *, const char *)", strcat, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strncat", "char * strncat(char *, const char *, uintsize n)", strncat, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strchr", "char * strchr(const char *, int)", strchr, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strstr", "char * strstr(const char *, const char *)", strstr, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strspn", "uintsize strspn(const char *, const char *)", strspn, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strcspn", "uintsize strcspn(const char *, const char *)", strcspn, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strpbrk", "char * strpbrk(const char *, const char *)", strpbrk, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterDefine("fstrcmp", "(__runtimePlatform == win32) ? strcmpi : strcmp", module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterDefine("strcmpi", "strcasecmp", module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterDefine("strnicmp", "strncasecmp", module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strcasecmp", "int strcasecmp(const char *, const char *)", strcasecmp, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strncasecmp", "int strncasecmp(const char *, const char *, uintsize n)", strncasecmp, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strcmp", "int strcmp(const char *, const char *)", strcmp, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strncmp", "int strncmp(const char *, const char *, uintsize n)", strncmp, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strlwr", "char * strlwr(char *)", strlwr, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strupr", "char * strupr(char *)", strupr, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strcpy", "char * strcpy(char *, const char *)", strcpy, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strncpy", "char * strncpy(char *, const char *, uintsize n)", strncpy, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("memcpy", "void * memcpy(void *, const void *, uintsize size)", memcpy, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("memmove", "void * memmove(void *, const void *, uintsize size)", memmove, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("memcmp", "int memcmp(const void *, const void *, uintsize size)", memcmp, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("sprintf", "int sprintf(char *, const char *, ...)", sprintf, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("snprintf", "int snprintf(char *, uintsize, const char *, ...)", snprintf, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("printf", "int printf(const char *, ...)", printf, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("vsprintf", "int vsprintf(char*, const char*, __builtin_va_list)", vsprintf, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("vsnprintf", "int vsnprintf(char*, uintsize, const char*, __builtin_va_list)", vsnprintf, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("puts", "int puts(const char *)", puts, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("fputs", "int fputs(const char *, void * stream)", fputs, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("tolower", "int tolower(int)", tolower, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("toupper", "int toupper(int)", toupper, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isdigit", "bool isdigit(int)", isdigit, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isxdigit", "bool isxdigit(int)", isxdigit, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isalnum", "int isalnum(int c)", isalnum, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isspace", "int isspace(int c)", isspace, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isalpha", "int isalpha(int c)", isalpha, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("islower", "int islower(int c)", islower, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isupper", "int isupper(int c)", isupper, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isprint", "int isprint(int c)", isprint, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isblank", "int isblank(int c)", isblank, module, 4);
 }
-if(!module)
-{
-void * library = (((void *)0));
 
-if(ensureCOM && !strcmp(name, "ecereCOM"))
-{
-Load = (void *)(__ecereDll_Load_ecere);
-Unload = (void *)(__ecereDll_Unload_ecere);
-}
-else
+static void __ecereNameSpace__ecere__com__FixDerivativesBase(struct __ecereNameSpace__ecere__com__Class * base, struct __ecereNameSpace__ecere__com__Class * mod)
 {
-const char * libLocation = (((void *)0));
+struct __ecereNameSpace__ecere__sys__OldLink * derivative;
 
-library = Instance_Module_Load(libLocation, name, (void *)(&Load), (void *)(&Unload));
-}
-if(Load)
-{
-module = (struct __ecereNameSpace__ecere__com__Instance *)__ecereNameSpace__ecere__com__eInstance_New(__ecereNameSpace__ecere__com__eSystem_FindClass(fromModule, "Module"));
-((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application;
-((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->library = library;
+__ecereNameSpace__ecere__com__ComputeClassParameters(base, strchr(base->name, '<'), (((void *)0)), 1);
+for(derivative = base->derivatives.first; derivative; derivative = derivative->next)
 {
-char moduleName[274];
-char ext[17];
+struct __ecereNameSpace__ecere__com__Class * _class = derivative->data;
+int type = _class->type;
+int oldType = type;
+int size = _class->structSize - _class->offset;
+int oldSizeClass = _class->sizeClass;
+int sizeClass = _class->sizeClass - _class->offsetClass;
+struct __ecereNameSpace__ecere__com__Class * enumBase = (((void *)0));
+const char * dataTypeString = (((void *)0));
+struct __ecereNameSpace__ecere__com__Class * baseClass;
+unsigned int offsetBefore = _class->offset;
+int offsetClass, totalSizeClass;
 
-__ecereNameSpace__ecere__sys__GetLastDirectory(name, moduleName);
-__ecereNameSpace__ecere__sys__GetExtension(moduleName, ext);
-__ecereNameSpace__ecere__sys__StripExtension(moduleName);
-if((!(strcasecmp)(ext, "dylib") || !(strcasecmp)(ext, "so")) && strstr(moduleName, "lib") == moduleName)
+for(baseClass = base; baseClass->base; baseClass = baseClass->base)
+;
+if(base && !base->internalDecl && (base->type == 5 || base->type == 1 || base->type == 0))
 {
-int len = (int)strlen(moduleName) - 3;
-
-memmove(moduleName, moduleName + 3, len);
-moduleName[len] = 0;
-}
-((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name = __ecereNameSpace__ecere__sys__CopyString(moduleName);
+if(base->type == 1 && type == 0)
+type = 5;
+else
+type = base->type;
 }
-((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->Unload = Unload;
-((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->origImportType = 0;
-if(!Load(module))
+if(base && (_class->type == 0 || _class->type == 5 || _class->type == 1) && (base->type == 3 || base->type == 2 || base->type == 4))
 {
-__ecereNameSpace__ecere__com__eInstance_Delete((struct __ecereNameSpace__ecere__com__Instance *)module);
-module = (((void *)0));
-}
-}
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules, module);
+type = base->type;
 }
-if(ensureCOM && !strcmp(name, "ecere") && module)
-{
-name = !strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, "ecereCOM") ? "ecere" : "ecereCOM";
-if((!Load && !strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, "ecereCOM")) || (Load && (!__thisModule || !((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name || !strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, "ecereCOM")) && Load != (void *)__ecereDll_Load_ecere))
+if(type == 4)
 {
-struct __ecereNameSpace__ecere__com__Instance * module;
-
-for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules.first; module; module = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->next)
+if(base->type != 4)
 {
-if(!strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, name))
-break;
+enumBase = base;
+base = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, "enum");
 }
-if(!module)
-{
-Load = (void *)(__ecereDll_Load_ecere);
-Unload = (void *)(__ecereDll_Unload_ecere);
-module = (struct __ecereNameSpace__ecere__com__Instance *)__ecereNameSpace__ecere__com__eInstance_New(__ecereNameSpace__ecere__com__eSystem_FindClass(fromModule, "Module"));
-((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application;
-((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->library = (((void *)0));
-((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name = __ecereNameSpace__ecere__sys__CopyString(name);
-((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->Unload = Unload;
-if(!Load(module))
-{
-__ecereNameSpace__ecere__com__eInstance_Delete((struct __ecereNameSpace__ecere__com__Instance *)module);
-module = (((void *)0));
 }
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules, module);
+dataTypeString = enumBase ? enumBase->dataTypeString : base->dataTypeString;
+offsetClass = base ? (base->templateClass ? base->templateClass->sizeClass : base->sizeClass) : (type == 5 ? 0 : 0);
+totalSizeClass = offsetClass + sizeClass;
+if(type == 0 || type == 5)
+{
+_class->offset = (base && (base->templateClass ? (type == 0 ? base->templateClass->structSize : base->templateClass->memberOffset) : (type == 0 ? base->structSize : base->memberOffset)) && base->type != 1000) ? (base->templateClass ? base->templateClass->structSize : base->structSize) : ((type == 5) ? 0 : sizeof(struct __ecereNameSpace__ecere__com__Instance));
+if(_class->structAlignment && (_class->offset % _class->structAlignment))
+_class->offset += _class->structAlignment - _class->offset % _class->structAlignment;
 }
-if(module)
+else
+_class->offset = 0;
+if(type == 1)
 {
-if(fromModule)
+_class->memberOffset = (base && (base->templateClass ? base->templateClass->structSize : base->structSize) && base->type != 1000) ? (base->templateClass ? base->templateClass->structSize : base->structSize) : 0;
+_class->typeSize = _class->structSize = _class->memberOffset + size;
+}
+else if(type == 2 || type == 4 || type == 3)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, __extension__ ({
-struct __ecereNameSpace__ecere__com__SubModule * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__com__SubModule);
+struct __ecereNameSpace__ecere__com__Class * dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, dataTypeString);
 
-__ecereInstance1->module = module, __ecereInstance1->importMode = importAccess, __ecereInstance1;
-}));
-}
-module->_refCount++;
-}
-}
+if(dataTypeClass)
+_class->typeSize = dataTypeClass->typeSize;
+_class->structSize = 0;
 }
-if(module)
-{
-if(fromModule)
+else if(type == 0 || type == 5)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, __extension__ ({
-struct __ecereNameSpace__ecere__com__SubModule * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__com__SubModule);
-
-__ecereInstance1->module = module, __ecereInstance1->importMode = importAccess, __ecereInstance1;
-}));
+_class->structSize = _class->offset + size;
+_class->typeSize = sizeof(void *);
 }
-module->_refCount++;
-}
-return module;
+if(_class->type != 1000)
+_class->type = type;
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)_class->dataTypeString), _class->dataTypeString = 0);
+_class->dataTypeString = __ecereNameSpace__ecere__sys__CopyString(dataTypeString);
+if(totalSizeClass != oldSizeClass)
+{
+_class->data = __ecereNameSpace__ecere__com__eSystem_Renew(_class->data, sizeof(unsigned char) * (totalSizeClass));
+memmove((unsigned char *)_class->data + mod->offsetClass, (unsigned char *)_class->data, totalSizeClass - mod->sizeClass);
+if(base->type != 1000 && base->type != 4)
+memcpy((unsigned char *)_class->data, (unsigned char *)base->data, totalSizeClass - _class->sizeClass);
+else
+memset((unsigned char *)_class->data, 0, totalSizeClass - _class->sizeClass);
 }
-
-struct __ecereNameSpace__ecere__com__Instance * __ecereNameSpace__ecere__com__eModule_LoadStatic(struct __ecereNameSpace__ecere__com__Instance * fromModule, const char * name, int importAccess, unsigned int (* Load)(struct __ecereNameSpace__ecere__com__Instance * module), unsigned int (* Unload)(struct __ecereNameSpace__ecere__com__Instance * module))
+_class->offsetClass = offsetClass;
+_class->sizeClass = totalSizeClass;
 {
-struct __ecereNameSpace__ecere__com__Instance * module;
+struct __ecereNameSpace__ecere__com__Method * method, * next;
+struct __ecereNameSpace__ecere__com__Class * b;
+unsigned int needUpdate = (mod != (base->templateClass ? base->templateClass : base) || _class->vTblSize != mod->vTblSize);
+int updateStart = -1, updateEnd = -1;
 
-for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules.first; module; module = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->next)
+if(mod->base && mod->base->base && mod->base->vTblSize > baseClass->vTblSize && needUpdate)
 {
-if(!strcmp(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name, name))
-break;
+_class->vTblSize += mod->base->vTblSize - baseClass->vTblSize;
+_class->_vTbl = __ecereNameSpace__ecere__com__eSystem_Renew(_class->_vTbl, sizeof(void *) * (_class->vTblSize));
+memmove(_class->_vTbl + mod->base->vTblSize, _class->_vTbl + baseClass->vTblSize, (_class->vTblSize - mod->vTblSize) * sizeof(void *));
+memcpy(_class->_vTbl + baseClass->vTblSize, mod->_vTbl + baseClass->vTblSize, (mod->base->vTblSize - baseClass->vTblSize) * sizeof(void *));
+updateStart = baseClass->vTblSize;
+updateEnd = updateStart + mod->base->vTblSize - baseClass->vTblSize;
+for(method = (struct __ecereNameSpace__ecere__com__Method *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&_class->methods); method; method = next)
+{
+next = (struct __ecereNameSpace__ecere__com__Method *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)method));
+if(method->type == 1)
+method->vid += mod->base->vTblSize - baseClass->vTblSize;
 }
-if(!module)
+}
+for(b = mod->base; b && b != (((void *)0)); b = b->base)
 {
-if(Load)
+struct __ecereNameSpace__ecere__com__Method * vMethod;
+
+for(vMethod = (struct __ecereNameSpace__ecere__com__Method *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&b->methods); vMethod; vMethod = (struct __ecereNameSpace__ecere__com__Method *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)vMethod)))
 {
-module = (struct __ecereNameSpace__ecere__com__Instance *)__ecereNameSpace__ecere__com__eInstance_New(__ecereNameSpace__ecere__com__eSystem_FindClass(fromModule, "Module"));
-((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application;
-((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name = __ecereNameSpace__ecere__sys__CopyString(name);
-((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->origImportType = 1;
-((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->Unload = (void *)Unload;
-if(!Load(module))
+if(vMethod->type == 1)
 {
-__ecereNameSpace__ecere__com__eInstance_Delete((struct __ecereNameSpace__ecere__com__Instance *)module);
-module = (((void *)0));
+method = (struct __ecereNameSpace__ecere__com__Method *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&_class->methods, vMethod->name);
+if(method)
+{
+if(method->function)
+_class->_vTbl[vMethod->vid] = method->function;
+if(!method->symbol)
+{
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->name), method->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->dataTypeString), method->dataTypeString = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->methods, (struct __ecereNameSpace__ecere__sys__BTNode *)method);
 }
+else
+{
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)method->dataTypeString), method->dataTypeString = 0);
+method->type = vMethod->type;
+method->dataTypeString = __ecereNameSpace__ecere__sys__CopyString(vMethod->dataTypeString);
+method->_class = vMethod->_class;
 }
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules, module);
 }
-if(module)
-{
-if(fromModule)
-{
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, __extension__ ({
-struct __ecereNameSpace__ecere__com__SubModule * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__com__SubModule);
-
-__ecereInstance1->module = module, __ecereInstance1->importMode = importAccess, __ecereInstance1;
-}));
+else if((vMethod->vid >= updateStart && vMethod->vid < updateEnd) || _class->_vTbl[vMethod->vid] == b->_vTbl[vMethod->vid])
+_class->_vTbl[vMethod->vid] = _class->base->_vTbl[vMethod->vid];
 }
-module->_refCount++;
 }
-return module;
 }
+}
+if(type == 0 || type == 5 || type == 1)
+{
+struct __ecereNameSpace__ecere__com__Property * prop;
+struct __ecereNameSpace__ecere__com__DataMember * member;
+struct __ecereNameSpace__ecere__com__Class * c;
 
-void __ecereNameSpace__ecere__com__eModule_Unload(struct __ecereNameSpace__ecere__com__Instance * fromModule, struct __ecereNameSpace__ecere__com__Instance * module)
+for(c = mod->base; c; c = c->base)
 {
-struct __ecereNameSpace__ecere__sys__OldLink * m;
+struct __ecereNameSpace__ecere__com__Property * _property;
 
-for(m = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; m; m = m->next)
+for(_property = c->membersAndProperties.first; _property; _property = _property->next)
 {
-if(m->data == module)
-break;
-}
-if(m)
+if(_property->isProperty)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)fromModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, m);
-(__ecereNameSpace__ecere__com__eInstance_DecRef(module), module = 0);
-}
-}
+struct __ecereNameSpace__ecere__com__BTNamedLink * link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&_class->prop, _property->name);
 
-static void __ecereNameSpace__ecere__com__Module_Destructor(struct __ecereNameSpace__ecere__com__Instance * module)
+if(link)
 {
-struct __ecereNameSpace__ecere__com__Class * _class;
-struct __ecereNameSpace__ecere__com__DefinedExpression * def;
-struct __ecereNameSpace__ecere__com__GlobalFunction * function;
-struct __ecereNameSpace__ecere__com__Instance * m;
-struct __ecereNameSpace__ecere__com__SubModule * handle;
-
-for(m = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules.first; m; m = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)m + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->next)
+prop = link->data;
+if(!prop->Set && !prop->Get && prop->memberAccess == 4)
 {
-struct __ecereNameSpace__ecere__com__SubModule * next;
+struct __ecereNameSpace__ecere__com__SelfWatcher * watcher;
 
-for(handle = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)m + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; handle; handle = next)
+for(watcher = _class->selfWatchers.first; watcher; watcher = watcher->next)
 {
-next = handle->next;
-if(handle->module == module)
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)m + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, handle);
+if(watcher->_property == prop)
+watcher->_property = _property;
+}
+_property->selfWatchable = 1;
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&_class->prop, (struct __ecereNameSpace__ecere__sys__BTNode *)link);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)prop->name), prop->name = 0);
+(__ecereNameSpace__ecere__com__eSystem_Delete((void *)prop->dataTypeString), prop->dataTypeString = 0);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->membersAndProperties, prop);
 }
 }
-if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->Unload)
-{
-if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->origImportType == 1)
-{
-unsigned int (* Unload)(struct __ecereNameSpace__ecere__com__Instance * module) = (void *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->Unload;
-
-Unload(module);
 }
-else
-{
-unsigned int (ecere_stdcall * Unload)(struct __ecereNameSpace__ecere__com__Instance * module) = (void *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->Unload;
-
-Unload(module);
 }
 }
 {
-struct __ecereNameSpace__ecere__com__Instance * ourWorld = __ecereClass___ecereNameSpace__ecere__com__Class->module;
-void * ourHandle = (((void *)0));
+struct __ecereNameSpace__ecere__com__DataMember * next;
 
-while((handle = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.last))
+for(member = _class->membersAndProperties.first; member; member = next)
 {
-struct __ecereNameSpace__ecere__com__Instance * depModule = handle->module;
+int offsetDiff = _class->offset - offsetBefore;
 
-if(depModule == ourWorld)
+next = member->next;
+if(!member->isProperty)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, handle);
-ourHandle = handle;
+if(oldType == 2 && type != 2)
+{
+struct __ecereNameSpace__ecere__com__DataMember * prev = member->prev;
+
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&_class->membersAndProperties, member);
+member = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eSystem_Renew0(member, sizeof(unsigned char) * (sizeof(struct __ecereNameSpace__ecere__com__DataMember)));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(&_class->membersAndProperties, prev, member);
 }
-else
+if(offsetDiff > 0)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules, handle);
-(__ecereNameSpace__ecere__com__eInstance_DecRef(depModule), depModule = 0);
+member->offset += offsetDiff;
+member->memberOffset += offsetDiff;
 }
 }
-if(ourHandle)
-{
-(__ecereNameSpace__ecere__com__eSystem_Delete(ourHandle), ourHandle = 0);
-(__ecereNameSpace__ecere__com__eInstance_DecRef(ourWorld), ourWorld = 0);
+member->id += mod->base->memberID;
 }
+_class->memberID += mod->base->memberID;
+_class->startMemberID += mod->base->memberID;
 }
-for(; (_class = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes.first); )
-{
-if(_class->nameSpace)
+}
+__ecereNameSpace__ecere__com__FixDerivativesBase(_class, mod);
 {
-struct __ecereNameSpace__ecere__com__BTNamedLink * classLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*_class->nameSpace).classes, _class->name);
+struct __ecereNameSpace__ecere__com__Class * c;
 
-if(classLink)
+for(c = mod->base; c; c = c->base)
 {
-struct __ecereNameSpace__ecere__sys__OldLink * t;
+struct __ecereNameSpace__ecere__com__ClassProperty * _property;
 
-for(t = _class->templatized.first; t; t = t->next)
+for(_property = (struct __ecereNameSpace__ecere__com__ClassProperty *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&c->classProperties); _property; _property = (struct __ecereNameSpace__ecere__com__ClassProperty *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)_property)))
 {
-struct __ecereNameSpace__ecere__com__Class * template = t->data;
-struct __ecereNameSpace__ecere__com__BTNamedLink * link;
-
-link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*template->nameSpace).classes, template->name);
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*template->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)link);
-template->nameSpace = (((void *)0));
+__ecereNameSpace__ecere__com__SetDelayedCPValues(_class, _property);
 }
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*_class->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)classLink);
 }
-_class->nameSpace = (((void *)0));
-}
-_class->module = (((void *)0));
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, _class);
-if(_class->count <= 0 || _class->type != 0 || _class->isInstanceClass)
-__ecereNameSpace__ecere__com__eClass_Unregister(_class);
-else
-{
 }
 }
-for(; (def = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->defines.first); )
-{
-if(def->nameSpace)
 {
-struct __ecereNameSpace__ecere__com__BTNamedLink * defLink;
+struct __ecereNameSpace__ecere__sys__OldLink * templateLink;
 
-for(defLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&(*def->nameSpace).defines); defLink; defLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)defLink)))
-if(defLink->data == def)
+for(templateLink = base->templatized.first; templateLink; templateLink = templateLink->next)
 {
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*def->nameSpace).defines, (struct __ecereNameSpace__ecere__sys__BTNode *)defLink);
-break;
+struct __ecereNameSpace__ecere__com__Class * template = templateLink->data;
+
+template->base = base->base;
+template->_vTbl = base->_vTbl;
+template->data = base->data;
+template->offset = base->offset;
+template->offsetClass = base->offsetClass;
+template->sizeClass = base->sizeClass;
+template->structSize = base->structSize;
+template->vTblSize = base->vTblSize;
+__ecereNameSpace__ecere__com__FixDerivativesBase(template, mod);
 }
 }
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)def->name), def->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)def->value), def->value = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->defines, def);
 }
-for(; (function = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->functions.first); )
+
+struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__System_FindClass(struct __ecereNameSpace__ecere__com__Instance * module, const char * name, unsigned int registerTemplatesInternalDecl)
 {
-if(function->nameSpace)
+if(name && module)
 {
-struct __ecereNameSpace__ecere__com__BTNamedLink * functionLink;
+struct __ecereNameSpace__ecere__com__BTNamedLink * link;
 
-for(functionLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&(*function->nameSpace).functions); functionLink; functionLink = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)functionLink)))
-if(functionLink->data == function)
+if(!strncmp(name, "const ", 6))
+name += 6;
+link = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->systemNameSpace, name, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
+if(link)
+return link->data;
+link = __ecereNameSpace__ecere__com__SearchModule(module, name, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes, 1);
+if(link)
+return link->data;
 {
-__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*function->nameSpace).functions, (struct __ecereNameSpace__ecere__sys__BTNode *)functionLink);
-break;
-}
-}
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)function->name), function->name = 0);
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)function->dataTypeString), function->dataTypeString = 0);
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->functions, function);
+char noTemplateName[1024];
+char * templateParams = strchr(name, '<');
+
+if(templateParams)
+{
+strncpy(noTemplateName, name, templateParams - name);
+noTemplateName[templateParams - name] = '\0';
 }
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name), ((struct __ecereNameSpace__ecere__com__Module * )(((char * )module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name = 0);
-__ecereNameSpace__ecere__com__NameSpace_Free(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->privateNameSpace);
-__ecereNameSpace__ecere__com__NameSpace_Free(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace);
-if(module != ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application)
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules, module);
 else
-__ecereNameSpace__ecere__com__NameSpace_Free(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->systemNameSpace);
-Instance_Module_Free(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->library);
-}
-
-static void __ecereNameSpace__ecere__com__LoadCOM(struct __ecereNameSpace__ecere__com__Instance * module)
+strcpy(noTemplateName, name);
+link = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->systemNameSpace, noTemplateName, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
+if(!link)
+link = __ecereNameSpace__ecere__com__SearchModule(module, noTemplateName, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes, 1);
+if(link)
 {
-unsigned int force64Bits = (((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->isGUIApp & 2) ? 1 : 0;
-unsigned int force32Bits = (((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->isGUIApp & 4) ? 1 : 0;
-unsigned int inCompiler = (((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->isGUIApp & 8) ? 1 : 0;
-int pointerSize = force64Bits ? 8 : force32Bits ? 4 : sizeof(void *);
-struct __ecereNameSpace__ecere__com__Class * applicationClass;
-struct __ecereNameSpace__ecere__com__Class * enumClass, * structClass, * boolClass;
-struct __ecereNameSpace__ecere__com__Class * moduleClass;
-struct __ecereNameSpace__ecere__com__Class * baseClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "class", (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), module, 4, 1);
+struct __ecereNameSpace__ecere__com__Class * _class = link->data;
+struct __ecereNameSpace__ecere__com__Class * templatedClass = (((void *)0));
+char className[1024];
 
-baseClass->type = 1000;
-baseClass->memberOffset = 0;
-baseClass->offset = 0;
-baseClass->structSize = 0;
-baseClass->typeSize = 0;
+strcpy(className, _class->fullName);
+strcat(className, templateParams);
+link = __ecereNameSpace__ecere__com__SearchNameSpace(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->systemNameSpace, className, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes);
+if(link)
+return link->data;
+link = __ecereNameSpace__ecere__com__SearchModule(module, className, &(*((struct __ecereNameSpace__ecere__com__NameSpace *)0)).classes, 1);
+if(link)
+return link->data;
+if(_class && templateParams)
 {
-struct __ecereNameSpace__ecere__com__Class * instanceClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "ecere::com::Instance", (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), module, 4, 1);
+struct __ecereNameSpace__ecere__sys__OldList __simpleStruct1 =
+{
+0, 0, 0, 0, 0
+};
+struct __ecereNameSpace__ecere__sys__OldList __simpleStruct0 =
+{
+0, 0, 0, 0, 0
+};
 
-instanceClass->type = 0;
-instanceClass->isInstanceClass = 1;
-instanceClass->fixed = 1;
-instanceClass->memberOffset = 0;
-instanceClass->offset = 0;
-instanceClass->memberID = -3;
-instanceClass->startMemberID = -3;
-__ecereNameSpace__ecere__com__eClass_AddDataMember(instanceClass, "_vTbl", "void **", pointerSize, pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(instanceClass, "_class", "ecere::com::Class", pointerSize, pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(instanceClass, "_refCount", "int", sizeof(int), sizeof(int), 1);
+templatedClass = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__Class));
+*templatedClass = *_class;
+templatedClass->templateClass = _class;
+templatedClass->fullName = __ecereNameSpace__ecere__sys__CopyString(className);
+templatedClass->dataTypeString = __ecereNameSpace__ecere__sys__CopyString(_class->dataTypeString);
+templatedClass->name = __ecereNameSpace__ecere__sys__CopyString(templatedClass->fullName + strlen(_class->fullName) - strlen(_class->name));
+__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&(*templatedClass->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)__extension__ ({
+struct __ecereNameSpace__ecere__com__BTNamedLink * __ecereInstance1 = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__com__BTNamedLink));
+
+__ecereInstance1->name = (char *)templatedClass->name, __ecereInstance1->data = templatedClass, __ecereInstance1;
+}));
+templatedClass->templateArgs = (((void *)0));
+templatedClass->numParams = 0;
+templatedClass->derivatives = __simpleStruct0;
+templatedClass->templatized = __simpleStruct1;
+templatedClass->module = module;
+templatedClass->count = 0;
+templatedClass->prev = (((void *)0));
+templatedClass->next = (((void *)0));
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes, templatedClass);
+__ecereNameSpace__ecere__com__ComputeClassParameters(templatedClass, templateParams, module, registerTemplatesInternalDecl);
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&_class->templatized, __extension__ ({
+struct __ecereNameSpace__ecere__sys__OldLink * __ecereInstance1 = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__sys__OldLink));
+
+__ecereInstance1->data = templatedClass, __ecereInstance1;
+}));
 }
-__ecereNameSpace__ecere__com__InitializeDataTypes1(module);
-enumClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "enum", (((void *)0)), 0, force64Bits ? 40 : sizeof(struct __ecereNameSpace__ecere__com__EnumClassData), (((void *)0)), (((void *)0)), module, 4, 1);
-__ecereNameSpace__ecere__com__eClass_AddClassProperty(enumClass, "enumSize", "int", (((void *)0)), __ecereNameSpace__ecere__com__GetEnumSize)->constant = 1;
-enumClass->type = 1000;
-(__ecereNameSpace__ecere__com__eSystem_Delete((void *)enumClass->dataTypeString), enumClass->dataTypeString = 0);
-enumClass->dataTypeString = __ecereNameSpace__ecere__sys__CopyString("int");
-structClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "struct", (((void *)0)), 0, 0, (((void *)0)), (((void *)0)), module, 4, 1);
-structClass->type = 1000;
-structClass->memberOffset = 0;
-structClass->offset = 0;
-structClass->structSize = 0;
-structClass->typeSize = 0;
-__ecereNameSpace__ecere__com__InitializeDataTypes(module);
-boolClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(4, "bool", "uint", 0, 0, (((void *)0)), (((void *)0)), module, 4, 1);
-__ecereNameSpace__ecere__com__eEnum_AddFixedValue(boolClass, "true", 0x1);
-__ecereNameSpace__ecere__com__eEnum_AddFixedValue(boolClass, "false", 0x0);
-moduleClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "ecere::com::Module", (((void *)0)), force64Bits ? 8 + 32 + 32 + 32 + 32 + 8 + 8 + 8 + 8 + 8 + 4 + 4 + (32 + 8 + 8 + 4 * 32) + (32 + 8 + 8 + 4 * 32) : sizeof(struct __ecereNameSpace__ecere__com__Module), 0, (void *)__ecereNameSpace__ecere__com__Module_Constructor, (void *)__ecereNameSpace__ecere__com__Module_Destructor, module, 4, 1);
-__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(moduleClass, "OnLoad", "bool()", (((void *)0)), 1);
-__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(moduleClass, "OnUnload", "void()", (((void *)0)), 1);
-__ecereNameSpace__ecere__com__eClass_AddMethod(moduleClass, "Load", "Module(const char * name, AccessMode importAccess)", __ecereNameSpace__ecere__com__eModule_Load, 1);
-__ecereNameSpace__ecere__com__eClass_AddMethod(moduleClass, "Unload", "void(Module module)", __ecereNameSpace__ecere__com__eModule_Unload, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "application", "Application", pointerSize, pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "classes", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(struct __ecereNameSpace__ecere__sys__OldList), pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "defines", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(struct __ecereNameSpace__ecere__sys__OldList), pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "functions", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(struct __ecereNameSpace__ecere__sys__OldList), pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "modules", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(struct __ecereNameSpace__ecere__sys__OldList), pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "prev", "Module", pointerSize, pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "next", "Module", pointerSize, pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "name", "const char *", pointerSize, pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "library", "void *", pointerSize, pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "Unload", "void *", pointerSize, pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "importType", "ImportType", sizeof(int), 4, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "origImportType", "ImportType", sizeof(int), 4, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "privateNameSpace", "NameSpace", force64Bits ? (32 + 8 + 8 + 4 * 32) : force32Bits ? (16 + 4 + 4 + 4 * 16) : sizeof(struct __ecereNameSpace__ecere__com__NameSpace), pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(moduleClass, "publicNameSpace", "NameSpace", force64Bits ? (32 + 8 + 8 + 4 * 32) : force32Bits ? (16 + 4 + 4 + 4 * 16) : sizeof(struct __ecereNameSpace__ecere__com__NameSpace), pointerSize, 1);
-moduleClass->fixed = 1;
-moduleClass->count++;
-if(inCompiler && force32Bits)
-moduleClass->structSize = 12 + 4 + 20 + 20 + 20 + 20 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + (16 + 4 + 4 + 4 * 16) + (16 + 4 + 4 + 4 * 16);
-applicationClass = __ecereNameSpace__ecere__com__eSystem_RegisterClass(0, "ecere::com::Application", "Module", force64Bits ? (8 + 8 + 4 + 4 + 32 + 8 + 176) : sizeof(struct __ecereNameSpace__ecere__com__Application), 0, (((void *)0)), (void *)__ecereNameSpace__ecere__com__Application_Destructor, module, 4, 1);
-if(inCompiler && force32Bits)
-{
-applicationClass->offset = 12 + 4 + 20 + 20 + 20 + 20 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + (16 + 4 + 4 + 4 * 16) + (16 + 4 + 4 + 4 * 16);
-applicationClass->structSize = applicationClass->offset + (4 + 4 + 4 + 4 + 20 + 4 + 88);
+return templatedClass;
 }
-__ecereNameSpace__ecere__com__eClass_AddVirtualMethod(applicationClass, "Main", "void()", (((void *)0)), 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "argc", "int", sizeof(int), 4, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "argv", "const char **", pointerSize, pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "exitCode", "int", sizeof(int), 4, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "isGUIApp", "bool", sizeof(unsigned int), 4, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "allModules", "OldList", force64Bits ? 32 : force32Bits ? 20 : sizeof(struct __ecereNameSpace__ecere__sys__OldList), pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "parsedCommand", "char *", pointerSize, pointerSize, 1);
-__ecereNameSpace__ecere__com__eClass_AddDataMember(applicationClass, "systemNameSpace", "NameSpace", force64Bits ? (32 + 8 + 8 + 4 * 32) : force32Bits ? (16 + 4 + 4 + 4 * 16) : sizeof(struct __ecereNameSpace__ecere__com__NameSpace), pointerSize, 1);
-applicationClass->fixed = 1;
-applicationClass->count++;
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("sin", "double sin(Angle number)", sin, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("sinh", "double sinh(Angle number)", sinh, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("cosh", "double cosh(Angle number)", cosh, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("tanh", "double tanh(Angle number)", tanh, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("sqrt", "double sqrt(double number)", sqrt, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("cos", "double cos(Angle number)", cos, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("tan", "double tan(Angle number)", tan, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("atan2", "Angle atan2(double y, double x)", atan2, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("asin", "Angle asin(double number)", asin, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("acos", "Angle acos(double number)", acos, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("atan", "Angle atan(double number)", atan, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("asinh", "Angle asinh(double number)", asinh, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("acosh", "Angle acosh(double number)", acosh, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("atanh", "Angle atanh(double number)", atanh, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("pow", "double pow(double number, double number2)", pow, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("fmod", "double fmod(double x, double y)", fmod, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("fabs", "double fabs(double number)", fabs, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("log", "double log(double number)", log, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("log10", "double log10(double number)", log10, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("ceil", "double ceil(double number)", ceil, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("floor", "double floor(double number)", floor, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("exp", "double exp(double number)", exp, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("qsort", "void qsort(void *, uintsize, uintsize, int (*)(void *, void *))", qsort, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strtod", "double strtod(const char*, char**)", strtod, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strtol", "int strtol(const char*, char**, int base)", strtol, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strtoul", "unsigned long strtoul(const char * nptr, char ** endptr, int base)", strtoul, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strtoll", "int64 strtoll(const char * nptr, char ** endptr, int base)", strtoll, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strtoull", "uint64 strtoull(const char * nptr, char ** endptr, int base)", strtoull, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("system", "int system(const char*)", system, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("atoi", "int atoi(const char*)", atoi, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("atof", "double atof(const char*)", atof, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("memset", "void * memset(void * area, int value, uintsize count)", memset, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("getenv", "char * getenv(const char * name)", getenv, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("rename", "int rename(const char *oldpath, const char *newpath)", rename, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strlen", "uintsize strlen(const char *)", strlen, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strcat", "char * strcat(char *, const char *)", strcat, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strncat", "char * strncat(char *, const char *, uintsize n)", strncat, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strchr", "char * strchr(const char *, int)", strchr, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strstr", "char * strstr(const char *, const char *)", strstr, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strspn", "uintsize strspn(const char *, const char *)", strspn, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strcspn", "uintsize strcspn(const char *, const char *)", strcspn, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strpbrk", "char * strpbrk(const char *, const char *)", strpbrk, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterDefine("fstrcmp", "(__runtimePlatform == win32) ? strcmpi : strcmp", module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterDefine("strcmpi", "strcasecmp", module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterDefine("strnicmp", "strncasecmp", module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strcasecmp", "int strcasecmp(const char *, const char *)", strcasecmp, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strncasecmp", "int strncasecmp(const char *, const char *, uintsize n)", strncasecmp, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strcmp", "int strcmp(const char *, const char *)", strcmp, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strncmp", "int strncmp(const char *, const char *, uintsize n)", strncmp, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strlwr", "char * strlwr(char *)", strlwr, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strupr", "char * strupr(char *)", strupr, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strcpy", "char * strcpy(char *, const char *)", strcpy, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("strncpy", "char * strncpy(char *, const char *, uintsize n)", strncpy, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("memcpy", "void * memcpy(void *, const void *, uintsize size)", memcpy, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("memmove", "void * memmove(void *, const void *, uintsize size)", memmove, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("memcmp", "int memcmp(const void *, const void *, uintsize size)", memcmp, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("sprintf", "int sprintf(char *, const char *, ...)", sprintf, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("snprintf", "int snprintf(char *, uintsize, const char *, ...)", snprintf, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("printf", "int printf(const char *, ...)", printf, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("vsprintf", "int vsprintf(char*, const char*, __builtin_va_list)", vsprintf, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("vsnprintf", "int vsnprintf(char*, uintsize, const char*, __builtin_va_list)", vsnprintf, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("puts", "int puts(const char *)", puts, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("fputs", "int fputs(const char *, void * stream)", fputs, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("tolower", "int tolower(int)", tolower, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("toupper", "int toupper(int)", toupper, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isdigit", "bool isdigit(int)", isdigit, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isxdigit", "bool isxdigit(int)", isxdigit, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isalnum", "int isalnum(int c)", isalnum, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isspace", "int isspace(int c)", isspace, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isalpha", "int isalpha(int c)", isalpha, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("islower", "int islower(int c)", islower, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isupper", "int isupper(int c)", isupper, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isprint", "int isprint(int c)", isprint, module, 4);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("isblank", "int isblank(int c)", isblank, module, 4);
+}
+}
+return (((void *)0));
 }
 
 struct __ecereNameSpace__ecere__com__Instance * __ecereNameSpace__ecere__com____ecere_COM_Initialize(unsigned int guiApp, int argc, char * argv[])
@@ -6844,6 +6875,7 @@ __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::eClass_Unreg
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::_strtoi64", "int64 ecere::com::_strtoi64(const char * string, const char * * endString, int base)", __ecereNameSpace__ecere__com___strtoi64, module, 4);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::_strtoui64", "uint64 ecere::com::_strtoui64(const char * string, const char * * endString, int base)", __ecereNameSpace__ecere__com___strtoui64, module, 4);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::eSystem_FindClass", "ecere::com::Class ecere::com::eSystem_FindClass(ecere::com::Module module, const char * name)", __ecereNameSpace__ecere__com__eSystem_FindClass, module, 4);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::System_FindClass", "ecere::com::Class ecere::com::System_FindClass(ecere::com::Module module, const char * name, bool registerTemplatesInternalDecl)", __ecereNameSpace__ecere__com__System_FindClass, module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::DefaultFunction", "bool ecere::com::DefaultFunction(void)", __ecereNameSpace__ecere__com__DefaultFunction, module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::eClass_IsDerived", "bool ecere::com::eClass_IsDerived(ecere::com::Class _class, ecere::com::Class from)", __ecereNameSpace__ecere__com__eClass_IsDerived, module, 4);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::eClass_AddMethod", "ecere::com::Method ecere::com::eClass_AddMethod(ecere::com::Class _class, const char * name, const char * type, void * function, ecere::com::AccessMode declMode)", __ecereNameSpace__ecere__com__eClass_AddMethod, module, 4);