text:
local error        = error
local getmetatable = getmetatable
local ipairs       = ipairs
local next         = next
local pairs        = pairs
local rawget       = rawget
local select       = select
local setmetatable = setmetatable
local type         = type
local unpack       = unpack

local string = require "string"
local table  = require "table"

local OrderedSet = require "loop.collection.OrderedSet"
local Publisher  = require "loop.object.Publisher"

local oo        = require "oil.oo"
local assert    = require "oil.assert"
local idl       = require "oil.corba.idl"
local iridl     = require("oil.corba.idl.ir").definitions
local Exception = require "oil.corba.giop.Exception"                            --[[VERBOSE]] local verbose = require "oil.verbose"

module "oil.corba.idl.Registry"

--------------------------------------------------------------------------------
-- Internal classes ------------------------------------------------------------

  IRObject                = oo.class()
  Contained               = oo.class({}, IRObject)
  Container               = oo.class({}, IRObject)
  IDLType                 = oo.class({}, IRObject)

  PrimitiveDef            = oo.class({ __type = "IDL:omg.org/CORBA/PrimitiveDef:1.0"            }, IDLType)
  ArrayDef                = oo.class({ __type = "IDL:omg.org/CORBA/ArrayDef:1.0"                }, IDLType)
  SequenceDef             = oo.class({ __type = "IDL:omg.org/CORBA/SequenceDef:1.0"             }, IDLType)
  StringDef               = oo.class({ __type = "IDL:omg.org/CORBA/StringDef:1.0"               }, IDLType)
--WstringDef              = oo.class({ __type = "IDL:omg.org/CORBA/WstringDef:1.0"              }, IDLType)
--FixedDef                = oo.class({ __type = "IDL:omg.org/CORBA/FixedDef:1.0"                }, IDLType)

  MemberDef               = oo.class(nil                                                            , Contained)

  AttributeDef            = oo.class({ __type = "IDL:omg.org/CORBA/AttributeDef:1.0"            }, MemberDef)
  OperationDef            = oo.class({ __type = "IDL:omg.org/CORBA/OperationDef:1.0"            }, MemberDef)
--ValueMemberDef          = oo.class({ __type = "IDL:omg.org/CORBA/ValueMemberDef:1.0"          }, MemberDef)
--ConstantDef             = oo.class({ __type = "IDL:omg.org/CORBA/ConstantDef:1.0"             }, Contained)
  TypedefDef              = oo.class({ __type = "IDL:omg.org/CORBA/TypedefDef:1.0"              }, IDLType, Contained)

  StructDef               = oo.class({ __type = "IDL:omg.org/CORBA/StructDef:1.0"               }, TypedefDef , Container)
  UnionDef                = oo.class({ __type = "IDL:omg.org/CORBA/UnionDef:1.0"                }, TypedefDef , Container)
  EnumDef                 = oo.class({ __type = "IDL:omg.org/CORBA/EnumDef:1.0"                 }, TypedefDef)
  AliasDef                = oo.class({ __type = "IDL:omg.org/CORBA/AliasDef:1.0"                }, TypedefDef)
--NativeDef               = oo.class({ __type = "IDL:omg.org/CORBA/NativeDef:1.0"               }, TypedefDef)
--ValueBoxDef             = oo.class({ __type = "IDL:omg.org/CORBA/ValueBoxDef:1.0"             }, TypedefDef)

  Repository              = oo.class({ __type = "IDL:omg.org/CORBA/Repository:1.0"              }, Container)
  ModuleDef               = oo.class({ __type = "IDL:omg.org/CORBA/ModuleDef:1.0"               }, Contained, Container)
  ExceptionDef            = oo.class({ __type = "IDL:omg.org/CORBA/ExceptionDef:1.0"            }, Contained, Container)
  InterfaceDef            = oo.class({ __type = "IDL:omg.org/CORBA/InterfaceDef:1.0"            }, IDLType, Contained, Container)
--ValueDef                = oo.class({ __type = "IDL:omg.org/CORBA/ValueDef:1.0"                }, Container, Contained, IDLType)

--AbstractInterfaceDef    = oo.class({ __type = "IDL:omg.org/CORBA/AbstractInterfaceDef:1.0"    }, InterfaceDef)
--LocalInterfaceDef       = oo.class({ __type = "IDL:omg.org/CORBA/LocalInterfaceDef:1.0"       }, InterfaceDef)

--ExtAttributeDef         = oo.class({ __type = "IDL:omg.org/CORBA/ExtAttributeDef:1.0"         }, AttributeDef)
--ExtValueDef             = oo.class({ __type = "IDL:omg.org/CORBA/ExtValueDef:1.0"             }, ValueDef)
--ExtInterfaceDef         = oo.class({ __type = "IDL:omg.org/CORBA/ExtInterfaceDef:1.0"         }, InterfaceDef, InterfaceAttrExtension)
--ExtAbstractInterfaceDef = oo.class({ __type = "IDL:omg.org/CORBA/ExtAbstractInterfaceDef:1.0" }, AbstractInterfaceDef, InterfaceAttrExtension)
--ExtLocalInterfaceDef    = oo.class({ __type = "IDL:omg.org/CORBA/ExtLocalInterfaceDef:1.0"    }, LocalInterfaceDef, InterfaceAttrExtension)

  ObjectRef               = oo.class() -- fake class

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

local Empty = setmetatable({}, { __newindex = function(_, field) verbose:debug("attempt to set table 'Empty'") end })

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

--
-- Implementation
--

function IRObject:__init(...)
	self = oo.rawnew(self, ...)
	self.references = self.references or {}
	self.observer = self.observer or Publisher()
	return self
end

function IRObject:watch(object, field)
	local references = object.references
	if references then
		if not references[self] then
			references[self] = {}
		end
		references[self][field] = true
	end
	return object
end

function IRObject:nowatch(object, field)
	local references = object.references
	if references then
		references[self][field] = nil
		if next(references[self]) == nil then
			references[self] = nil
		end
	end
end

function IRObject:notify(...)
	local queue = OrderedSet()
	queue:enqueue(self)
	repeat
		if self.observer then self.observer:notify(...) end
		if self.references then
			for ref in pairs(self.references) do queue:enqueue(ref) end
		end
		self = queue[self]
	until self == nil
end

--
-- Operations
--
function IRObject:destroy()
	if self.observer == nil or next(self.references) ~= nil then
		assert.exception{ "BAD_INV_ORDER", minor_error_code = 1,
			message = "attempt to destroy IR definition in use",
			reason = "irdestroy",
			object = self,
		}
	end
	if self.defined_in then
		self.defined_in.definitions:_remove(self)
	end
	self.containing_repository.definition_map[self.repID] = nil
end

--------------------------------------------------------------------------------

--
-- Implementation
--
Contained.version = "1.0"
Contained.definition_fields = {
	defined_in = { type = Container, optional = true },
	repID      = { type = "string" , optional = true },
	version    = { type = "string" , optional = true },
	name       = { type = "string" },
}

function Contained:update(new)
	new.defined_in = new.defined_in or self.containing_repository
	if new.defined_in.containing_repository ~= self.containing_repository then
		assert.illegal(defined_in,
		              "container, repository does not match",
		              "BAD_PARAM")
	end
	if new.repID then
		self:_set_id(new.repID)
	end
	self:move(new.defined_in, new.name, new.version)
end

local RepIDFormat = "IDL:%s:%s"
function Contained:updatename()
	local old = self.absolute_name
	self.absolute_name = self.defined_in.absolute_name.."::"..self.name
	if not self.repID then
		self:_set_id(RepIDFormat:format(self.absolute_name:gsub("::", "/"):sub(2),
		                                self.version))
	end
	if self.definitions then
		for _, contained in ipairs(self.definitions) do
			contained:updatename()
		end
	end
	if self.absolute_name ~= old then self:notify("absolute_name") end
end

--
-- Attributes
--
function Contained:_set_id(id)
	local definitions = self.containing_repository.definition_map
	if definitions[id] and definitions[id] ~= self then
		assert.illegal(id, "repository ID, already exists", "BAD_PARAM", 2)
	end
	if self.repID then
		definitions[self.repID] = nil
	end
	local old = self.repID
	self.repID = id
	self.id = id
	definitions[id] = self
	if self.repID ~= old then self:notify("repID") end
end

function Contained:_set_name(name)
	local contents = self.defined_in.definitions
	if contents[name] and contents[name] ~= self then
		assert.illegal(name, "contained name, name clash", "BAD_PARAM", 1)
	end
	local old = self.name
	contents:_remove(self)
	self.name = name
	contents:_add(self)
	self:updatename()
	if self.name ~= old then self:notify("name") end
end

--
-- Operations
--
local ContainedDescription = iridl.Contained.definitions.Description
function Contained:describe()
	local description = self:get_description()
	description.name       = self.name
	description.id         = self.repID
	description.defined_in = self.defined_in.repID
	description.version    = self.version
	return setmetatable({
		kind = self.def_kind,
		value = description,
	}, ContainedDescription)
end

--function Contained:within() -- TODO:[maia] This op is described in specs but
--end                         --             is not listed in IR IDL!

function Contained:move(new_container, new_name, new_version)
	if new_container.containing_repository ~= self.containing_repository then
		assert.illegal(new_container, "container", "BAD_PARAM", 4)
	end

	local new = new_container.definitions
	if new[new_name] and new[new_name] ~= self then
		assert.illegal(new_name, "contained name, already exists", "BAD_PARAM", 3)
	end

	if self.defined_in then
		self.defined_in.definitions:_remove(self)
	end

	local old = self.defined_in
	self.defined_in = new_container
	self.version = new_version
	self:_set_name(new_name)
	if self.defined_in ~= old then
		if old then old:notify("contents") end
		self.defined_in:notify("contents")
		self:notify("defined_in")
	end
end

--------------------------------------------------------------------------------

--
-- Implementation
--
function Container:update()
	if not self.expandable then self.definitions = nil end
	idl.Container(self)
end

local function isingle(self, ended)
	if not ended then return self end
end
function Container:hierarchy()
	return isingle, self
end

--
-- Read interface
--

function Container:lookup(search_name)
	local scope
	if search_name:find("^::") then
		scope = self.containing_repository
	else
		scope = self
		search_name = "::"..search_name
	end
	for nextscope in string.gmatch(search_name, "::([^:]+)") do
		if not scope or not scope.definitions then return nil end
		scope = scope.definitions[nextscope]
	end
	return scope
end

function Container:contents(limit_type, exclude_inherited, max_returned_objs)
	max_returned_objs = max_returned_objs or -1
	local contents = {}
	for container in self:hierarchy() do
		for _, contained in ipairs(container.definitions)	do
			if limit_type == "dk_all" or contained.def_kind == limit_type then
				if max_returned_objs == 0 then break end
				contents[#contents+1] = contained
				max_returned_objs = max_returned_objs - 1
			end
		end
		if exclude_inherited then break end
	end
	return contents, max_returned_objs
end

function Container:lookup_name(search_name, levels_to_search,
                               limit_type, exclude_inherited)
	local results = {}
	for container in self:hierarchy() do
		for _, contained in ipairs(container.definitions)	do
			if
				contained.name == search_name and
				(limit_type == "dk_all" or contained.def_kind == limit_type)
			then
				results[#results+1] = contained
			end
		end
		if exclude_inherited then break end
	end
	return results
end

local ContainerDescription = iridl.Container.definitions.Description
function Container:describe_contents(limit_type, exclude_inherited,
                                     max_returned_objs)
	local contents = self:contents(limit_type,
	                               exclude_inherited,
	                               max_returned_objs)
	for index, content in ipairs(contents) do
		contents[index] = setmetatable({
			contained_object = content,
			kind = content.def_kind,
			value = content:describe(),
		}, ContainerDescription)
	end
	return contents
end

--
-- Write interface
--

function Container:create_module(id, name, version)
	local created = ModuleDef{ containing_repository=self.containing_repository }
	created:update{
		defined_in = self,

		repID = id,
		name = name,
		version = version,
	}
	return created
end

--function Container:create_constant(id, name, version, type, value)
--end

function Container:create_struct(id, name, version, members)
	local created = StructDef{ containing_repository=self.containing_repository }
	created:update{
		defined_in = self,

		repID = id,
		name = name,
		version = version,

		fields = members,
	}
	return created
end

function Container:create_union(id, name, version, discriminator_type, members)
	local created = UnionDef{ containing_repository=self.containing_repository }
	created:update{
		defined_in = self,

		repID = id,
		name = name,
		version = version,

		switch = discriminator_type.type,
		members = members,
	}
	return created
end

function Container:create_enum(id, name, version, members)
	local created = EnumDef{ containing_repository=self.containing_repository }
	created:update{
		defined_in = self,

		repID = id,
		name = name,
		version = version,

		enumvalues = members,
	}
	return created
end

function Container:create_alias(id, name, version, original_type)
	local created = AliasDef{ containing_repository=self.containing_repository }
	created:update{
		defined_in = self,

		repID = id,
		name = name,
		version = version,

		type = original_type.type
	}
	return created
end

function Container:create_interface(id, name, version, base_interfaces)
	local created = InterfaceDef{ containing_repository=self.containing_repository }
	created:update{
		defined_in = self,

		repID = id,
		name = name,
		version = version,

		base_interfaces = base_interfaces,
	}
	return created
end

--function Container:create_value(id, name, version,
--                                is_custom,
--                                is_abstract,
--																base_value,
--																is_truncatable,
--																abstract_base_values,
--																supported_interfaces,
--																initializers)
--end
--
--function Container:create_value_box(id, name, version, original_type_def)
--end

function Container:create_exception(id, name, version, members)
	local created = ExceptionDef{ containing_repository=self.containing_repository }
	created:update{
		defined_in = self,

		repID = id,
		name = name,
		version = version,

		members = members,
	}
	return created
end

--function Container:create_native(id, name, version)
--end
--
--function Container:create_abstract_interface(id, name, version, base_interfaces)
--end
--
--function Container:create_local_interface(id, name, version, base_interfaces)
--end
--
--function Container:create_ext_value(id, name, version,
--                                    is_custom,
--                                    is_abstract,
--                                    base_value,
--                                    is_truncatable,
--                                    abstract_base_values,
--                                    supported_interfaces,
--                                    initializers)
--end

--------------------------------------------------------------------------------

function IDLType:update()
	self.type = self
end

--------------------------------------------------------------------------------

local PrimitiveTypes = {
	pk_null       = idl.null,
	pk_void       = idl.void,
	pk_short      = idl.short,
	pk_long       = idl.long,
	pk_longlong   = idl.longlong,
	pk_ushort     = idl.ushort,
	pk_ulong      = idl.ulong,
	pk_ulonglong  = idl.ulonglong,
	pk_float      = idl.float,
	pk_double     = idl.double,
	pk_longdouble = idl.double,
	pk_boolean    = idl.boolean,
	pk_char       = idl.char,
	pk_octet      = idl.octet,
	pk_any        = idl.any,
	pk_TypeCode   = idl.TypeCode,
	pk_string     = idl.string,
	pk_objref     = idl.object,
}

PrimitiveDef.def_kind = "dk_Primitive"

function PrimitiveDef:__init(object)
	self = oo.rawnew(self, object)
	IDLType.update(self)
	return self
end

for kind, type in pairs(PrimitiveTypes) do
	PrimitiveDef(type).kind = kind
end

--------------------------------------------------------------------------------

function ObjectRef:__init(object, registry)
	if object.repID ~= PrimitiveTypes.pk_objref.repID then
		return registry.repository:lookup_id(object.repID) or
		       assert.illegal(new, "Object type, use interface definition instead")
	end
	return PrimitiveTypes.pk_objref
end

--------------------------------------------------------------------------------

ArrayDef._type = "array"
ArrayDef.def_kind = "dk_Array"
ArrayDef.definition_fields = {
	length      = { type = "number" },
	elementtype = { type = IDLType  },
}

function ArrayDef:update(new, registry)
	self.length = new.length
	self:_set_element_type_def(new.elementtype, registry)
end

function ArrayDef:_get_element_type() return self.elementtype end

function ArrayDef:_set_element_type_def(type_def, registry)
	local old = self.elementtype
	type_def = self.containing_repository:put(type_def.type, registry)
	if self.element_type_def then
		self:nowatch(self.element_type_def, "elementtype")
	end
	self.element_type_def = type_def
	self.elementtype = type_def.type
	self:watch(self.element_type_def, "elementtype")
	if self.elementtype ~= old then self:notify("elementtype") end
end

--------------------------------------------------------------------------------

SequenceDef._type = "sequence"
SequenceDef.def_kind = "dk_Sequence"
SequenceDef.maxlength = 0
SequenceDef.definition_fields = {
	maxlength   = { type = "number", optional = true },
	elementtype = { type = IDLType  },
}

function SequenceDef:update(new, registry)
	self.maxlength = new.maxlength
	self:_set_element_type_def(new.elementtype, registry)
end

SequenceDef._get_element_type = ArrayDef._get_element_type
SequenceDef._set_element_type_def = ArrayDef._set_element_type_def
function SequenceDef:_set_bound(value) self.maxlength = value end
function SequenceDef:_get_bound() return self.maxlength end

--------------------------------------------------------------------------------

StringDef._type = "string"
StringDef.def_kind = "dk_String"
StringDef.maxlength = 0
StringDef.definition_fields = {
	maxlength   = { type = "number", optional = true },
}
StringDef._set_bound = SequenceDef._set_bound
StringDef._get_bound = SequenceDef._get_bound

--------------------------------------------------------------------------------

function MemberDef:move(new_container, new_name, new_version)
	local name = self.name
	local container = self.defined_in
	Contained.move(self, new_container, new_name, new_version)
	if container then container:nowatch(self, name) end
	self.defined_in:watch(self, self.name)
end

--------------------------------------------------------------------------------

AttributeDef._type = "attribute"
AttributeDef.def_kind = "dk_Attribute"
AttributeDef.definition_fields = {
	defined_in = { type = InterfaceDef, optional = true },
	readonly   = { type = "boolean", optional = true },
	type       = { type = IDLType },
}

function AttributeDef:update(new, registry)
	self:_set_mode(new.readonly and "ATTR_READONLY" or "ATTR_NORMAL")
	self:_set_type_def(new.type, registry)
end

function AttributeDef:_set_mode(value)
	local old = self.readonly
	self.mode = value
	self.readonly = (value == "ATTR_READONLY")
	if self.readonly ~= old then self:notify("readonly") end
end

function AttributeDef:_set_type_def(type_def, registry)
	local old = self.type
	type_def = self.containing_repository:put(type_def.type, registry)
	if self.type_def then
		self:nowatch(self.type_def, "type")
	end
	self.type_def = type_def
	self.type = type_def.type
	self:watch(self.type_def, "type")
	if self.type ~= old then self:notify("type") end
end

function AttributeDef:get_description()
	return setmetatable({
		type = self.type,
		mode = self.mode,
	}, iridl.AttributeDescription)
end

--------------------------------------------------------------------------------

OperationDef._type = "operation"
OperationDef.def_kind = "dk_Operation"
OperationDef.contexts = Empty
OperationDef.parameters = Empty
OperationDef.inputs = Empty
OperationDef.outputs = Empty
OperationDef.exceptions = Empty
OperationDef.result = idl.void
OperationDef.result_def = idl.void
OperationDef.definition_fields = {
	defined_in = { type = InterfaceDef, optional = true },
	oneway     = { type = "boolean"   , optional = true },
	contexts   = { type = "table"     , optional = true },
	exceptions = { type = ExceptionDef, optional = true, list = true },
	result     = { type = IDLType     , optional = true },
	parameters = { type = {
		name = { type = "string" },
		type = { type = IDLType },
		mode = { type = "string", optional = true },
	}, optional = true, list = true },
}

function OperationDef:update(new, registry)
	self:_set_mode(new.oneway and "OP_ONEWAY" or "OP_NORMAL")
	if new.exceptions then self:_set_exceptions(new.exceptions, registry) end
	if new.result then self:_set_result_def(new.result, registry) end
	if new.parameters then self:_set_params(new.parameters, registry) end
	self.contexts = new.contexts
end

function OperationDef:_set_mode(value)
	local old = self.oneway
	self.mode = value
	self.oneway = (value == "OP_ONEWAY")
	if self.oneway ~= old then self:notify("oneway") end
end

function OperationDef:_set_result_def(type_def, registry)
	type_def = self.containing_repository:put(type_def.type, registry)
	local current = self.result
	local newval = type_def.type
	if current ~= newval then
		if self.result_def then
			self:nowatch(self.result_def, "result")
		end
		self.result_def = type_def
		self.result = newval
		self:watch(self.result_def, "result")
		if current == idl.void then
			if self.outputs == Empty then
				self.outputs = { newval }
			else
				table.insert(self.outputs, 1, newval)
			end
		elseif newval == idl.void then
			table.remove(self.outputs, 1)
		else
			self.outputs[1] = newval
		end
		self:notify("result")
	end
end

function OperationDef:_get_params() return self.parameters end
function OperationDef:_set_params(parameters, registry)
	local inputs = {}
	local outputs = {}
	if self.result ~= idl.void then
		outputs[#outputs+1] = self.result
	end
	for index, param in ipairs(parameters) do
		param.type_def = self.containing_repository:put(param.type, registry)
		param.type = param.type_def.type
		param.mode = param.mode or "PARAM_IN"
		if param.mode == "PARAM_IN" then
			inputs[#inputs+1] = param.type
		elseif param.mode == "PARAM_OUT" then
			outputs[#outputs+1] = param.type
		elseif param.mode == "PARAM_INOUT" then
			inputs[#inputs+1] = param.type
			outputs[#outputs+1] = param.type
		else
			assert.illegal(mode, "operation parameter mode")
		end
	end
	for index, param in ipairs(self.parameters) do
		self:nowatch(param.type_def, "parameter "..index)
	end
	self.parameters = parameters
	self.inputs = inputs
	self.outputs = outputs
	for index, param in ipairs(self.parameters) do
		self:watch(param.type_def, "parameter "..index)
	end
	self:notify("parameters")
end

function OperationDef:_set_exceptions(exceptions, registry)
	for index, except in ipairs(exceptions) do
		except = self.containing_repository:put(except:get_description().type, registry)
		exceptions[index] = except
		exceptions[except.repID] = except
	end
	for index, except in ipairs(self.exceptions) do
		self:nowatch(except, "exception "..index)
	end
	self.exceptions = exceptions
	for index, except in ipairs(self.exceptions) do
		self:watch(except, "exception "..index)
	end
	self:notify("exceptions")
end

function OperationDef:get_description()
	local exceptions = {}
	for _, except in ipairs(self.exceptions) do
		exceptions[#exceptions+1] = except:describe().value
	end
	return setmetatable({
		result     = self.result,
		mode       = self.mode,
		contexts   = self.contexts,
		parameters = self.parameters,
		exceptions = exceptions,
	}, iridl.OperationDescription)
end

--------------------------------------------------------------------------------

TypedefDef._type = "typedef"
TypedefDef.def_kind = "dk_Typedef"

function TypedefDef:get_description()
	return setmetatable({ type = self.type }, iridl.TypeDescription)
end

--------------------------------------------------------------------------------

StructDef._type = "struct"
StructDef.def_kind = "dk_Struct"
StructDef.fields = Empty
StructDef.definition_fields = {
	fields = {
		type = {
			name = { type = "string" },
			type = { type = IDLType },
		},
		optional = true,
		list = true,
	},
}

function StructDef:update(new, registry)
	if new.fields then self:_set_members(new.fields, registry) end
end

function StructDef:_get_members() return self.fields end
function StructDef:_set_members(members, registry)
	for index, field in ipairs(members) do
		field.type_def = self.containing_repository:put(field.type, registry)
		field.type = field.type_def.type
	end
	for index, field in ipairs(self.fields) do
		self:nowatch(field.type_def, "field "..field.name)
	end
	self.fields = members
	for index, field in ipairs(self.fields) do
		self:watch(field.type_def, "field "..field.name)
	end
	self:notify("fields")
end

--------------------------------------------------------------------------------

UnionDef._type = "union"
UnionDef.def_kind = "dk_Union"
UnionDef.default = -1
UnionDef.options = Empty
UnionDef.members = Empty
UnionDef.definition_fields = {
	switch  = { type = IDLType },
	default = { type = "number", optional = true },
	options = { type = {
		label = { type = nil },
		name  = { type = "string" },
		type  = { type = IDLType },
	}, optional = true, list = true },
}

function UnionDef:update(new, registry)
	self:_set_discriminator_type_def(new.switch, registry)

	if new.options then
		for _, option in ipairs(new.options) do
			option.label = setmetatable({ _anyval = option.label }, self.switch)
		end
		self:_set_members(new.options)
	end

	function self.__index(union, field)
		if rawget(union, "_switch") == self.selector[field] then
			return rawget(union, "_value")
		end
	end
	function self.__newindex(union, field, value)
		local label = self.selector[field]
		if label then
			rawset(union, "_switch", label)
			rawset(union, "_value", value)
			rawset(union, "_field", field)
		end
	end
end

function UnionDef:_get_discriminator_type() return self.switch end

function UnionDef:_set_discriminator_type_def(type_def, registry)
	local old = self.switch
	type_def = self.containing_repository:put(type_def.type, registry)
	if self.discriminator_type_def then
		self:nowatch(self.discriminator_type_def, "switch")
	end
	self.discriminator_type_def = type_def
	self.switch = type_def.type
	self:watch(self.discriminator_type_def, "switch")
	if self.switch ~= old then self:notify("switch") end
end

function UnionDef:_set_members(members, registry)
	local options = {}
	local selector = {}
	local selection = {}

	for index, member in ipairs(members) do
		member.type_def = self.containing_repository:put(member.type, registry)
		member.type = member.type_def.type
		local option = {
			label = member.label._anyval,
			name = member.name,
			type = member.type,
			type_def = member.type_def,
		}
		options[index] = option
		selector[option.name] = option.label
		selection[option.label] = option
	end
	for index, member in ipairs(self.members) do
		self:nowatch(member.type_def, "option "..index)
	end
	self.options = options
	self.selector = selector
	self.selection = selection
	self.members = members
	for index, member in ipairs(self.members) do
		self:watch(member.type_def, "option "..index)
	end
	self:notify("options")
end

--------------------------------------------------------------------------------

EnumDef._type = "enum"
EnumDef.def_kind = "dk_Enum"
EnumDef.definition_fields = {
	enumvalues = { type = "string", list = true },
}

function EnumDef:update(new)
	self:_set_members(new.enumvalues)
end

function EnumDef:_get_members() return self.enumvalues end
function EnumDef:_set_members(members)
	local labelvalue = {}
	for index, label in ipairs(members) do
		labelvalue[label] = index - 1
	end
	self.enumvalues = members
	self.labelvalue = labelvalue
	self:notify("enumvalues")
end

--------------------------------------------------------------------------------

AliasDef._type = "typedef"
AliasDef.def_kind = "dk_Alias"
AliasDef.definition_fields = {
	type = { type = IDLType },
}

function AliasDef:update(new, registry)
	self:_set_original_type_def(new.type, registry)
end

function AliasDef:_set_original_type_def(type_def, registry)
	local old = self.type
	type_def = self.containing_repository:put(type_def.type, registry)
	self.original_type_def = type_def
	self.type = type_def.type
	if self.type ~= old then self:notify("type") end
end

--------------------------------------------------------------------------------

Repository.def_kind = "dk_Repository"
Repository.repID = ""
Repository.absolute_name = ""

function Repository:__init(object)
	self = oo.rawnew(self, object)
	self.containing_repository = self
	self.definition_map = self.definition_map or {}
	Container.update(self, self)
	return self
end

--
-- Read interface
--

function Repository:lookup_id(search_id)
	return self.definition_map[search_id]
end

--function Repository:get_canonical_typecode(tc)
--end

function Repository:get_primitive(kind)
	return PrimitiveTypes[kind]
end

--
-- Write interface
--
--
--function Repository:create_string(bound)
--end
--
--function Repository:create_wstring(bound)
--end

function Repository:create_sequence(bound, element_type)
	local created = SequenceDef{ containing_repository=self.containing_repository }
	created:update{
		elementtype = element_type.type,
		maxlength = bound,
	}
	return created
end

function Repository:create_array(length, element_type)
	local created = ArrayDef{ containing_repository=self.containing_repository }
	created:update{
		elementtype = element_type.type,
		length = length,
	}
	return created
end

--function Repository:create_fixed(digits, scale)
--end

--------------------------------------------------------------------------------

--function ExtAttributeDef:describe_attribute()
--end

--------------------------------------------------------------------------------

ModuleDef._type = "module"
ModuleDef.def_kind = "dk_Module"
ModuleDef.expandable = true

function ModuleDef:get_description()
	return setmetatable({}, iridl.ModuleDescription)
end

--------------------------------------------------------------------------------

ExceptionDef._type = "except"
ExceptionDef.def_kind = "dk_Exception"
ExceptionDef.members = Empty
ExceptionDef.definition_fields = {
	members = { type = {
		name = { type = "string" },
		type = { type = IDLType },
	}, optional = true, list = true },
}

function ExceptionDef:update(new, registry)
	self.type = self
	if new.members then self:_set_members(new.members, registry) end
end

function ExceptionDef:_set_members(members, registry)
	for index, member in ipairs(members) do
		member.type_def = self.containing_repository:put(member.type, registry)
		member.type = member.type_def.type
	end
	for index, member in ipairs(self.members) do
		self:nowatch(member.type_def, "member "..member.name)
	end
	self.members = members
	for index, member in ipairs(self.members) do
		self:watch(member.type_def, "member "..member.name)
	end
	self:notify("members")
end

function ExceptionDef:get_description()
	return setmetatable({ type = self }, iridl.ExceptionDescription)
end

--------------------------------------------------------------------------------

InterfaceDef._type = "interface"
InterfaceDef.def_kind = "dk_Interface"
InterfaceDef.base_interfaces = Empty
InterfaceDef.definition_fields = {
	base_interfaces = { type = InterfaceDef, optional = true, list = true },
}

InterfaceDef.hierarchy = idl.basesof

function InterfaceDef:update(new)
	if new.base_interfaces then
		self:_set_base_interfaces(new.base_interfaces)
	end
end

function InterfaceDef:get_description()
	local base_interfaces = {}
	for index, base in ipairs(self.base_interfaces) do
		base_interfaces[index] = base.repID
	end
	return setmetatable({ base_interfaces = base_interfaces },
	                    iridl.InterfaceDescription)
end

--
-- Read interface
--

function InterfaceDef:is_a(interface_id)
	if interface_id == self.repID then return true end
	for _, base in ipairs(self.base_interfaces) do
		if base:is_a(interface_id) then return true end
	end
	return false
end

local FullIfaceDescription = iridl.InterfaceDef.definitions.FullInterfaceDescription
function InterfaceDef:describe_interface()
	local operations = {}
	local attributes = {}
	local base_interfaces = {}
	for index, base in ipairs(self.base_interfaces) do
		base_interfaces[index] = base.repID
	end
	for base in self:hierarchy() do
		for _, contained in ipairs(base.definitions) do
			if contained._type == "attribute" then
				attributes[#attributes+1] = contained:describe().value
			elseif contained._type == "operation" then
				operations[#operations+1] = contained:describe().value
			end
		end
	end
	return setmetatable({
		name = self.name,
		id = self.id,
		defined_in = self.defined_in.repID,
		version = self.version,
		base_interfaces = base_interfaces,
		type = self,
		operations = operations,
		attributes = attributes,
	}, FullIfaceDescription)
end

--
-- Write interface
--

function InterfaceDef:_set_base_interfaces(bases)
	for _, interface in ipairs(bases) do
		assert.type(interface, "idl interface", "BAD_PARAM", 4)
		for _, contained in ipairs(self.definitions) do
			if #interface:lookup_name(contained.name, -1, "dk_All", false) > 0 then
				assert.illegal(bases,
				               "base interfaces, member '"..
				               member.name..
				               "' override not allowed",
				               "BAD_PARAM", 5)
			end
		end
	end
	for index, base in ipairs(self.base_interfaces) do
		self:nowatch(base, "base "..index)
	end
	self.base_interfaces = bases
	for index, base in ipairs(self.base_interfaces) do
		self:watch(base, "base "..index)
	end
	self:notify("bases")
end

function InterfaceDef:create_attribute(id, name, version, type, mode)
	local created = AttributeDef{ containing_repository=self.containing_repository }
	created:update{
		defined_in = self,

		repID = id,
		name = name,
		version = version,

		type = type.type,
		readonly = (mode == "ATTR_READONLY"),
	}
	return created
end

function InterfaceDef:create_operation(id, name, version,
                                       result, mode, params,
                                       exceptions, contexts)
	local created = OperationDef{ containing_repository=self.containing_repository }
	created:update{
		defined_in = self,

		repID = id,
		name = name,
		version = version,

		result = result.type,

		parameters = params,
		exceptions = exceptions,
		contexts = contexts,

		oneway = (mode == "OP_ONEWAY"),
	}
	return created
end

--------------------------------------------------------------------------------

--
-- Read interface
--
--
--function InterfaceAttrExtension:describe_ext_interface()
--end

--
-- Write interface
--
--
--function InterfaceAttrExtension:create_ext_attribute()
--end

--------------------------------------------------------------------------------

--
-- Read interface
--
--
--function ValueDef:is_a(id)
--end
--
--function ValueDef:describe_value()
--end

--
-- Write interface
--
--
--function ValueDef:create_value_member(id, name, version, type, access)
--end
--
--function ValueDef:create_attribute(id, name, version, type, mode)
--end
--
--function ValueDef:create_operation(id, name, version,
--                                   result, mode, params,
--                                   exceptions, contexts)
--end

--------------------------------------------------------------------------------

--
-- Read interface
--
--
--function ExtValueDef:describe_ext_value()
--end

--
-- Write interface
--
--
--function ExtValueDef:create_ext_attribute(id, name, version, type, mode,
--                                          get_exceptions, set_exceptions)
--end

--------------------------------------------------------------------------------
-- Implementation --------------------------------------------------------------

oo.class(_M, Repository)

Classes = {
	struct     = StructDef,
	union      = UnionDef,
	enum       = EnumDef,
	sequence   = SequenceDef,
	array      = ArrayDef,
	string     = StringDef,
	typedef    = AliasDef,
	except     = ExceptionDef,
	attribute  = AttributeDef,
	operation  = OperationDef,
	module     = ModuleDef,
	interface  = InterfaceDef,
	Object     = ObjectRef,
}

--------------------------------------------------------------------------------

local function topdown(stack, class)
	while stack[class] do
		local ready = true
		for _, super in oo.supers(stack[class]) do
			if stack:insert(super, class) then
				ready = false
				break
			end
		end
	 	if ready then return stack[class] end
	end
end
local function iconstruct(class)
	local stack = OrderedSet()
	stack:push(class)
	return topdown, stack, OrderedSet.firstkey
end

local function getupdate(self, value, name, typespec)
	if type(typespec) == "string" then
		assert.type(value, typespec, name)
	elseif type(typespec) == "table" then
		if oo.isclass(typespec) then
			value = self[value]
			if not oo.instanceof(value, typespec) then
				assert.illegal(value, name)
			end
		else
			local new = {}
			for name, field in pairs(typespec) do
				local result = value[name]
				if result ~= nil or not field.optional then
					if field.list then
						local new = {}
						for index, value in ipairs(result) do
							new[index] = getupdate(self, value, name, field.type)
						end
						result = new
					else
						result = getupdate(self, result, name, field.type)
					end
				end
				new[name] = result
			end
			value = new
		end
	end
	return value
end

Registry = oo.class()

function Registry:__init(object)
	self = oo.rawnew(self, object)
	self[PrimitiveTypes.pk_null      ] = PrimitiveTypes.pk_null
	self[PrimitiveTypes.pk_void      ] = PrimitiveTypes.pk_void
	self[PrimitiveTypes.pk_short     ] = PrimitiveTypes.pk_short
	self[PrimitiveTypes.pk_long      ] = PrimitiveTypes.pk_long
	self[PrimitiveTypes.pk_longlong  ] = PrimitiveTypes.pk_longlong
	self[PrimitiveTypes.pk_ushort    ] = PrimitiveTypes.pk_ushort
	self[PrimitiveTypes.pk_ulong     ] = PrimitiveTypes.pk_ulong
	self[PrimitiveTypes.pk_ulonglong ] = PrimitiveTypes.pk_ulonglong
	self[PrimitiveTypes.pk_float     ] = PrimitiveTypes.pk_float
	self[PrimitiveTypes.pk_double    ] = PrimitiveTypes.pk_double
	self[PrimitiveTypes.pk_longdouble] = PrimitiveTypes.pk_longdouble
	self[PrimitiveTypes.pk_boolean   ] = PrimitiveTypes.pk_boolean
	self[PrimitiveTypes.pk_char      ] = PrimitiveTypes.pk_char
	self[PrimitiveTypes.pk_octet     ] = PrimitiveTypes.pk_octet
	self[PrimitiveTypes.pk_any       ] = PrimitiveTypes.pk_any
	self[PrimitiveTypes.pk_TypeCode  ] = PrimitiveTypes.pk_TypeCode
	self[PrimitiveTypes.pk_string    ] = PrimitiveTypes.pk_string
	self[PrimitiveTypes.pk_objref    ] = PrimitiveTypes.pk_objref
	self[self.repository             ] = self.repository
	return self
end

function Registry:__index(definition)
	if definition then
		local repository = self.repository
		local class = repository.Classes[definition._type]
		local result
		if class then
			result = repository:lookup_id(definition.repID)
			if definition ~= result then                                              --[[VERBOSE]] verbose:repository(true, definition._type," ",definition.repID or definition.name)
				result = class(result)
				result.containing_repository = repository
				self[definition] = result -- to avoid loops in cycles during 'getupdate'
				self[result] = result
				for class in iconstruct(class) do                                       --[[VERBOSE]] verbose:repository("[",class.__type,"]")
					local update = oo.memberof(class, "update")
					if update then
						local fields = oo.memberof(class, "definition_fields")
						local new = fields and getupdate(self, definition, "object", fields)
						update(result, new, self)
					end
				end                                                                     --[[VERBOSE]] verbose:repository(false)
				if oo.instanceof(result, Container) then
					for _, contained in ipairs(definition.definitions) do
						getupdate(self, contained, "contained", Contained)
					end
				end
			end
		elseif oo.classof(definition) == _M then
			result = self.repository
		end
		self[definition] = result
		self[result] = result
		return result
	end
end

--------------------------------------------------------------------------------

function put(self, definition, registry)
	registry = registry or self.Registry{ repository = self }
	return registry[definition]
end

function register(self, ...)
	local registry = self.Registry{ repository = self }
	local results = {}
	local count = select("#", ...)
	for i = 1, count do
		local definition = select(i, ...)
		assert.type(definition, "table", "IR object definition")
		results[i] = registry[definition]
	end
	return unpack(results, 1, count)
end

function resolve(self, typeref)
	local result, errmsg = type(typeref)
	if result == "string" then
		result = self:lookup(typeref) or self:lookup_id(typeref)
		if not result then
			errmsg = Exception{ "INTERNAL", minor_code_value = 0,
				reason = "interface",
				message = "unknown interface",
				interface = typeref,
			}
		end
	elseif result == "table" and typeref._type == "interface" then
		return self:register(typeref)
	else
		result, errmsg = nil, Exception{ "INTERNAL", minor_code_value = 0,
			reason = "interface",
			message = "illegal IDL type",
			type = typeref,
		}
	end
	return result, errmsg
end

redpajama_set_name: RedPajamaGithub


text:
if(Visual Anthropology) » Refine Search
Elite Forever: Making an Ethnographic Film for a Public Audience
by Monahan, Trent, M.A. California State University, Long Beach. 2019: 43 pages; 13903318.
Using the visual to "see" absence: The case of Thessaloniki
by Stein, Nancy Carol, Ph.D. Florida Atlantic University. 2013: 210 pages; 3571437.
Youth-Filmmaking and Youth-Centered Narratives: Type 2 Diabetes and an "At Risk" Population
by Angelina Vigil, Adriana, M.A. California State University, Long Beach. 2018: 100 pages; 10840529.
Occupy feminism
by Cotter, Maura, M.A. California State University, Long Beach. 2015: 64 pages; 1604883.
Visual artists experiencing nature: Examining human-environment relationships
by Wiita, Amy Lynn, Ph.D. University of Alaska Fairbanks. 2015: 235 pages; 3740171.
Mean green: A visual cultural analysis of the National Border Patrol Museum
by Moreno, Gabriela E., Ph.D. The University of Arizona. 2012: 205 pages; 3508915.
Music genre on the move: Discourse and the cultural production of Japanese visual rock in Hong Kong
by Ho, Chui Wa, M.A. Indiana University. 2012: 110 pages; 1532629.
Habitual Postures of the Medio Period Casas Grandes People: A Comparison of Visual Representations and Skeletal Markers
by Downs, Lauren W., M.A. University of Missouri - Columbia. 2015: 73 pages; 10180874.
Poems from the mirror: The re-imagination of indigenous identities through literary and visual narratives in Oaxaca
by Fachin, Dina, Ph.D. University of California, Davis. 2008: 208 pages; 3329710.
The role of visual culture in shaping Chinese eighth-grade students' personal and regional identities in Macao
by Chan, Mei-Ioc, Ph.D. Northern Illinois University. 2009: 565 pages; 3359060.
The utility of metacarpal bone length in the determination of sex and race
by Collins, Katherine A., M.A. The George Washington University. 2010: 62 pages; 1470325.
One (Wo)Man's Trash Is Another (Wo)Man's Treasure: A Visual Exploration of Homeless Space-Making Through the Lens of Material Culture
by Audell, Acacia E., M.A. California State University, Long Beach. 2020: 43 pages; 27834003.
The eyes of the world are upon us: The role of visual images in the fight over Alberta's oil sands
by Groom, Emily, M.A. University of Missouri - Columbia. 2011: 62 pages; 1520989.
Out of Light Came Darkness: Bioarchaeology of Mortuary Ritual, Health, and Ethnogenesis in the Lambayeque Valley Complex, North Coast of Peru (AD 900-1750)
by Klaus, Haagen D., Ph.D. The Ohio State University. 2008: 864 pages; 10631196.
Bali, Instagram
by San Agustin, Jeffrey Jason, M.A. California State University, Long Beach. 2020: 171 pages; 28028144.
Portable X-ray Fluorescence Spectroscopy and its research applications to Northern European bog bodies
by Granite, Guinevere Elizabeth, Ph.D. State University of New York at Buffalo. 2012: 407 pages; 3516400.
Suriname's identity construction and negotiation
by Castillo, Danielle C., M.A. California State University, Long Beach. 2016: 80 pages; 10147310.
Female Pelvic Variation, Its Causes and an Analysis of Six Populations
by Margolis, Francine, M.A. The George Washington University. 2020: 88 pages; 27738256.
Saliendo Adelante: Guatemalan Transnational Migrants in L.A.
by Bolinger, Joseph D., M.A. California State University, Long Beach. 2017: 40 pages; 10264197.
Tissue Variability Effects on Saw Mark Evidence in Bone
by Grosso, Alicia Rose, Ph.D. University of Pittsburgh. 2020: 151 pages; 27830294.
The Boston "T" party: Masculinity, testosterone therapy, and embodiment among aging men and transgender men
by Matza, Alexis Ruth, Ph.D. The University of Iowa. 2009: 248 pages; 3356265.
Distinguishing between natural and cultural taphonomic agents in skeletal assemblages from human sacrifice sites in Pre-Columbian northern coastal Peru
by Backo, Heather, Ph.D. Tulane University. 2012: 363 pages; 3519916.
An Anthropological Look at How Queer and Lesbian Females Evaluate Lesbian, Gay, Bisexual, and Queer Representation in American Television
by Martinez, Meagan B., M.A. California State University, Long Beach. 2020: 89 pages; 27834482.
From cell to symbol: A biocultural study of anemia and subjectivity among the Poqomchi' Maya in Guatemala
by Herynk, James William, Ph.D. University of Kansas. 2014: 256 pages; 3626067.
Dental fluctuating asymmetry as a measure of environmental stress in Nasca
by Follis, Shawna L., M.S. Purdue University. 2014: 93 pages; 1571983.
Death is Never Over Life, Death and Grave Robbery in a Historic Cemetery
by Roberts, Rebecca Boggs, M.A. The George Washington University. 2012: 77 pages; 1513699.
An Analytical Approach to the Manufacture and Use of Bone Tools from the Aucilla River in Florida
by Summa, Clara M., M.A. State University of New York at Binghamton. 2020: 312 pages; 27993957.
Habitual activity and changing adaptations at the El Brujo Archaeological Complex: A diachronic investigation of musculoskeletal stress and degenerative joint disease in the lower Chicama Valley of northern coastal Peru
by Titelbaum, Anne R., Ph.D. Tulane University. 2012: 387 pages; 3519914.
"Something you love and something more practical": Undergraduate anthropology education in the neoliberal era
by Goldmacher, Amy, Ph.D. Wayne State University. 2010: 176 pages; 3445205.
"I no 'fraid for that": Pregnancy, risk, and development in southern Belize
by Maraesa, Aminata, Ph.D. New York University. 2009: 536 pages; 3365716.

redpajama_set_name: RedPajamaCommonCrawl


text:
You are here: Home / News / Against 'participation': A reflection by Matthew Varco on the film "Killing Aliens Everyday" (Von Heland & Ernstson)
Categories: NEWS: General, Visual Environmental Humanities
Tags: visual environmental humanities
I watched Jacob von Heland and Henrik Ernstson's research film Killing Aliens Everyday (2016, 16 minutes) as part of a session on 'Plant Spaces, Vegetal Places' at the 2020 POLLEN conference. I enjoyed Killing Aliens Everyday for the same reason I enjoyed art historian Claire Bishop's critique of participatory art in her book 'Artificial Hells', which I was reading the same week. For me, both works depart from a similar feeling of disillusionment or scepticism with the way in which participation (be it in ecological or artistic projects) is uncritically pitched to neoliberal publics. They both demonstrate that the political, spatial, and affective contexts in which participatory projects take place are equally, if not more important than the stated aims.
The lesson I glean from the film, and from Bishop's monograph, is the importance of studying the (perhaps unforeseen) political and ideological consequences of the humanities' turn towards notions of collaboration, multiplicity, and the more-than-human. We need to consider the other purposes to which this 'ethical turn' (as Rancière describes it) can be put. The campaign against alien species depicted in the film, on the face of it, seems to tick several of the boxes of 'participation' discourse: it is a local, socio-natural project that allows a diversity of actors to get involved, and build knowledge through a grassroots community of practice. However, as the second half of the film suggests, just because the campaign to clear the alien vegetation facilitates socio-ecological collaboration, doesn't make it politically desirable or progressive (or safe, for that matter.)
Similarly, Bishop mobilises Rancière and Lacan to critically interrogate what she frames as a participatory turn within post-Cold War art, in which co-production, collaboration, and community involvement are prized attributes. Bishop historicises the notion of 'participation', tracing its emergence within the proto-fascist populism of the Italian futurists, its development through the Bolshevik mass spectacles, and eventually its accommodation within the depoliticising 'social inclusion' rhetoric of New Labour in the UK. Through exploring the various political resonances of 'participation', and tracing the diverse ideological motivations which can be invested in it, Bishop warns us of the dangers of embracing a new paradigm without attending to its political effects. In a similar vein, Killing Aliens Everyday demonstrates how a seemingly innocuous campaign to mobilise the people around a common cause, is actually caught up in a rather pernicious project: constructing a coherent political community through the violent othering and destruction of various weeds, brutes, and invasives.
True, we might all be 'coming together', but coming together to do what, and on whose terms? To turn to another fashionable trope, perhaps the best response, when invited to participate in such schemes, is Bartleby's misanthropic adage, 'I would prefer not to'.
Matthew Varco, PhD Student, Department of Geography, The University of Manchester, 2020
About the film: Killing Aliens Everyday (2016, 16 minutes) by Jacob von Heland and Henrik Ernstson is part of the wider project of using film as part of research. The piece explores the making of 'otherness' through the point of view of invasive alien plants. By perspective switches, blunt explanation and a disturbing of video conventions (tactics kindred to Minh-ha´s cinema of de-aesthetics) this film finally seeks to nudge its viewers to want to grasp and speculate about the omitted point of view of some of the world´s unwanted nonhuman beings, the invasive alien plants. The essay opens towards questions around the multitude of purposes around killing aliens – taking us beyond the functionalist, rationalist, environmentalist and popularized single story-lines based on preserving biodiversity, saving indigenous plants and coming together across race and class to care for the planet. By attempting to understand the plants' world through video and sound material, the film explores the role that aliens in any form (human, nonhuman or object-like) bring to the constitution of an organized inside.


"Assistance" mission allows relocating troops to ally or clan-mate's city.
In order to launch the mission click on the domain where assistance is needed.
Mission Speed. "Assistance" mission speed is twice as fast as attack missions.
Troops take Gold needed for their salary for whole duration of the mission, so they don't consume Gold from the ally or clan-mate's domain.
The slower travelling speed is, the lower mission's cost will be.
When launching mission, you specify Assisting troops' time of staying. The longer is the time, the more Gold will be needed.
"Assistance" mission can be withdrawn anytime by initiator or player who is to receive it, even when it's 1 minute before troops arrive, or when troops are on march, or when troops are already in Assistance Slots.
However, "Assistance" mission cannot be withdrawn if the Gate or Tunnel in the Domain of assistance is closed.
After relocation, troops will not require time for rest.
There are three players: A, B and C. Player B is an alliance with player A as well as with player C. Now, player A have launched the "Re-seizure" attack against Outer Domain of player C. Player B sent the "Assistance" to player C but troops were late and arrived when the outer domain had been seized by player A. As player B is ally for both players – A and C, will the assistant troops stay in the domain with new owner?


text:
Head of Medical Affairs - Gastroenterology
Apply Now Email Me Job ID R0011208 Date posted 08/16/2019 Location: London, United Kingdom; Paddington, United Kingdom
By clicking the "Apply" button, I understand that my employment application process with Takeda will commence and that I agree with Takeda's Privacy Notice, Privacy Policy and Terms of Use.
Are you looking for a patient-focused, innovation-driven company that will inspire you and support your career? If so, be empowered to take charge of your future at Takeda – winners of the prestigious PMEA Company of the Year Award 2018.
Join us as a Head of Medical Affairs in our UK office, initially dual site located between Wooburn Green, Bucks and Paddington, moving permanently to London Paddington in January 2020.
The successful applicant for this role will take overall responsibility for the Gastrointestinal Medical Affairs team within Takeda UK, comprising 11 individuals. This is a critically important area for Takeda, who have identified gastroenterology as a one of 3 therapeutic areas of commercial focus for the company within Europe, the others being oncology and rare diseases
Takeda currently market (i) Vedolizumab, an anti-integrin monoclonal antibody licensed for the treatment of Crohn's disease and ulcerative colitis; (ii) Darvadstrocel, a stem cell treatment for the management of complex perianal fistulae in patients with Crohn's Disease and (iii) Teduglutide, a treatment for short bowel syndrome.
This is an important leadership role within the business. The holder of this role is responsible for leading and developing a team comprising office-based Medical Managers and an MSL team leader who in turn leads both MSL and Clinical Nurse Educator (CNE) teams.
Other responsibilities include leading the development and delivery of the gastroenterology medical affairs plan, which is underpinned by a substantial budget that must be managed appropriately. The medical affairs plan would include substantial projects in the areas of evidence generation, insight gathering, medical communications and education as well as co-created projects delivered in collaboration with functions such as marketing or market access.
The holder of this role will also be expected to be an active member of the Medical Leadership Team. In this capacity they will take responsibility for providing leadership and overseeing projects across the entire medical function.
At Takeda, we are transforming the pharmaceutical industry through our R&D-driven market leadership and being a values-led company. To do this, we empower our people to realise their potential through life-changing work. Certified as a Global Top Employer, we offer stimulating careers, encourage innovation, and strive for excellence in everything we do. We foster an inclusive, collaborative workplace, in which our global teams are united by an unwavering commitment to deliver Better Health and a Brighter Future to people around the world. Discover more at takedajobs.com.
To further support and inspire our employees, our benefits include: Competitive basic salary, Car Allowance, 20% Target Bonus, Contributory Pension Scheme, Private Health Cover and Life Assurance.
#LI-CH1
London, Great Britain
Worker Type
Worker Sub-Type
Time Type
Medical Affairs (Local), London, England, United KingdomRemove
Medical Affairs (Local), Paddington, England, United KingdomRemove


text:
ScienceMysteriesFeatured
How Were an Icebound Ship's Passengers Mysteriously Saved?
By Helen London
A mysterious occurrence allowed a merchant ship sailing from London to Canada to come to the aid of another vessel in distress. (Image: digitalstormcinema via Envato Elements)
This is the story of how an icebound ship's passengers were rescued because of the vision a merchant ship's first mate had.
One day in 1828, on board a merchant ship traveling between Liverpool, England, and Canada, Robert Bruce, the first mate, saw a man he did not know sitting in the captain's cabin writing on a slate. The man turned and stared at him with a wooden, immobile, serious expression. This alarmed Bruce. He rushed to the deck and went to report what he had seen to the captain.
The captain said: "You must be going mad, Mr. Bruce — a stranger? We've been out for nearly six weeks! Go down and see who it is."
Bruce said: "I never believed in ghosts, but, to be perfectly honest, sir, I wouldn't like to go and see it alone." So the captain and the first mate went together to the captain's cabin and found it empty. However, when they examined the slate, they found written on it "heading northwest."
The captain said sternly: "Sir, you're teasing me, aren't you?" Bruce swore that he was telling the truth. The captain sat at his desk for a few minutes contemplating, then he turned the slate over and asked Bruce to write "heading northwest" on the back. The handwriting on both sides of the slate was completely different. He was satisfied. He then called the second mate and the other crew members in turn and asked them to write the words.
The captain had every crew member write on the slate to find a match for the handwriting. (Image: via Pixabay)
Using this method, he checked the entire crew. None of them had handwriting that even remotely resembled the one on the slate. They then searched the whole ship thoroughly, from bow to stern, and found no sign of any stowaways. The captain finally asked: "Mr. Bruce, how on earth do you make sense of all this?" Bruce said: "I can't say, sir. I saw the man writing, and you saw his writing, and there must be something suspicious in it."
The icebound ship's passengers are saved
As the wind was blowing well, a detour to the northwest would only take a few more hours, so the captain ordered a turn to the northwest. After sailing for about three hours, the lookout reported an iceberg ahead and a ship near it. As they sailed closer, the captain looked through his binoculars and saw the ship with a large number of people on board. It was in fact a ship in distress, firmly frozen in the ice. He sent some small boats to rescue the survivors.
When a third lifeboat returned with its passengers boarding the larger ship, Bruce was surprised to find that among them was the man he had seen in the captain's cabin a few hours earlier!
When a third lifeboat returned, the first mate was surprised to recognize one of the passengers. (Image: stevanovicigor via Envato Elements)
When the first mate had recognized the new passenger, the captain said: "Honestly, Bruce, this is getting really bizarre. Let's go and see this man."
At the captain's request, the man wrote the words "heading northwest" on the blank side of the board. When the board was turned over, he was as surprised as anyone to find the exact same words and the exact same handwriting on the other side. He turned the board over and over: "I only wrote on one side, who wrote on the other?"
He couldn't remember the scene that had shocked Bruce at all. However, he remembered one thing that might be relevant. He had fallen soundly asleep at noon that day, extremely exhausted. He woke up and declared that they would certainly be saved because he had dreamed that he had boarded a ship that had come to rescue them.
The captain of the ship in distress confirmed his story. The captain said: "He told us about the appearance and equipment of the boat. To our amazement, your ship appeared exactly as he described."
This story was published in 1860 in Footfalls On The Boundary Of Another World, by Robert Dale Owen, Philadelphia, Lippincott 1860, and was written by Robert Bruce's good friend Captain J.S. Clarke of the schooner Julia Hallock. Clarke described Bruce as "one of the most sincere and straightforward men he had ever met in his life."
The story is unusual in that the spirit not only leaves the body and manifests itself, but also travels to a distant ship and leaves a message in recognizable handwriting with an accurate message. And the slate on the ship and the handwriting on it are difficult to deny as "hard evidence."
Translation by Eva and edited by Helen
Helen London
by Robert Dale Owen
Footfalls On The Boundary Of Another World
merchant ship
Philadelphia: Lippincott 1860
Previous articleWhat Is the Infamous Cancel Culture and Does It Hold People Accountable?
Next articleESO Telescope Discovers Closest Pair of Supermassive Black Holes Yet
Humans January 15, 2022


Thank you so much for joining my Navi Planner giveaway! So much inspiring stories that make me want to dance are found in this hashtag #ruthiliciousxnavi.
But, then again, there could only be one winner .. and that is..
**drumroll and back-up dancers please..
with subject line NAVI WINNER.
Thank you all for joining and for sharing your stories!
Please stay connected for more treats!


text:
Home Breaking News QUANTRON presents its broad portfolio of zero-emission commercial vehicles
QUANTRON presents its broad portfolio of zero-emission commercial vehicles
Presence at the German trade fairs "NUFAM" (commercial vehicles), "Flotte! Der Branchentreff" (vehicle fleets), "IAA Mobility" (international Automobility) and "Tag der Entsorgungslogistik" (disposal logistics)
The e-mobility specialist Quantron AG will be represented at three trade fairs for the commercial vehicle industry in September: "Tag der Entsorgungslogistik" on 2 and 3 September, "IAA Mobility" from 7 to 12 September, "Flotte! Der Branchentreff" on 15 and 16 September and "NUFAM" from 30 September to 3 October. At a press conference at the commercial vehicle trade fair NUFAM, QUANTRON will present a new product, the hydrogen-powered Q-Light FCEV.
On 30 September, Quantron AG will present the Q-Light FCEV at the NUFAM in Karlsruhe. Hydrogen as an alternative drive is the future of electromobility, especially for long distances. As a hydrogen fuel cell transporter in the 3.49 to 4.2 tonne range, QUANTRON's Q-Light FCEV is unique in Europe. The vehicle shines with numerous body variants and can thus be used in diverse areas such as logistics or transport. The Q-Light FCEV will also be presented at the IAA Mobility at the Elring Klinger AG stand together with QUANTRON partner AE Driven Solutions GmbH.
The hydrogen expert H2-Go GmbH, a subsidiary of Hydrogentle GmbH, will also be represented at Quantron AG's NUFAM stand. In a joint cooperation, the two companies offer a wide range of services and products on the subject of hydrogen-powered commercial vehicles.
At all four trade fairs, Quantron AG will provide a comprehensive insight into its portfolio of environmentally friendly vehicles from 3.49 to 44 tonnes. A special highlight is the versatile electric transporter Q-Light BEV (3.49-7.2 tonnes; also available with hybrid drive) based on the IVECO Daily. Thanks to its variable body options, the vehicle can be used for any transport task in everyday city traffic. IKEA is already convinced of the emission-free vehicle and has been using the QUANTRON e-transporter in Austria for months to deliver its products in an environmentally friendly way. At the IAA in Munich, visitors can take a test drive and see the low-noise and emission-free vehicle for themselves.
In the field of waste disposal logistics, QUANTRON will be exhibiting the all-electric Q Econic waste disposal vehicle, which has convinced both local residents and waste collectors with its emission-free and low-noise operation during test runs lasting several weeks throughout Germany.
As a system provider, Quantron AG also offers numerous services such as the creation of individual overall concepts including the appropriate charging infrastructure as well as rental, financing and leasing offers. The experts from QUANTRON will also be available on site at all events to answer questions about financial support for switching to alternative drives. Since the end of July, the Federal Ministry of Transport and Infrastructure has been supporting the purchase of new electric vehicles and the conversion of used and existing vehicles with 80 % of the additional costs compared to diesel.


Tetra Tech, Inc. (TTEK) announced today that the National Aeronautics and Space Administration (NASA) has awarded the Company a $300 million, multiple-award contract to provide architectural and engineering services to investigate, design, and implement remedial actions at the NASA Kennedy Space Center and Cape Canaveral Air Force Station in Florida.
Under this five-year contract, Tetra Tech will provide environmental assessment and engineering services including regulatory documentation, contaminant investigation, remedial design, and groundwater and soil remediation.
Tetra Tech is a leading, global provider of consulting and engineering services. We are differentiated by Leading with Science® to provide innovative technical solutions to our clients. We support global commercial and government clients focused on water, environment, infrastructure, resource management, energy, and international development. With more than 17,000 associates worldwide, Tetra Tech provides clear solutions to complex problems. For more information about Tetra Tech, please visit tetratech.com, follow us on Twitter (@TetraTech), or like us on Facebook.
Any statements made in this release that are not based on historical fact are forward-looking statements. Any forward-looking statements made in this release represent management's best judgment as to what may occur in the future. However, Tetra Tech's actual outcome and results are not guaranteed and are subject to certain risks, uncertainties and assumptions ("Future Factors"), and may differ materially from what is expressed. For a description of Future Factors that could cause actual results to differ materially from such forward-looking statements, see the discussion under the section "Risk Factors" included in the Company's Form 10-K and Form 10-Q filings with the Securities and Exchange Commission.
Tetra Tech (TTEK) Earnings Expected to Grow: Should You Buy?


We had a fantastic day out with Hampshire Chamber of Commerce and Tall Ships Youth Trust.
This is was slightly different networking for the Chamber as it was based on water! We were split between two yachts and had the chance to try our hands at sailing and learn about the wonderful work the trust undertakes.
It was a fantastic day for it and a brilliant way to network, without the usual pressure of a formal event.


"I have carried this routine in my wallet for the past ten years, and think it is one of the most entertaining and utterly mystifying routines that can be performed with a small packet of cards. I have performed it for groups of one, and groups of fifty, always with equally satisfying results.
This routine is also in the repertoire of Larry Jennings, who normally disdains routines using gimmicked cards. This is one of the easiest routines using gimmicked cards. This is one of the easiest routines I do, yet perhaps the most mystifying to a lay audience."
Comes with poker cards and instruction manual.


Mariannelund is a locality in Eksjö Municipality in Jönköping County in Sweden. In 2010, 1,468 people lived there. Mariannelund appears as a place of setting for many of the stories of Swedish writer Astrid Lindgren's books Emil i Lönneberga.


"He does his best at these high-profile rings," owner-breeder-handler Justin Smithey said. "He knows how to turn it off, lay down and wait till it's his turn. And then he just goes."
So let's make this fawn-and-white whippet the favorite to get picked Tuesday night and succeed Flynn the bichon frise as America's top dog.
There more than 2,800 entries, including popular Biggie the pug, a Lhasa apso from Hawaii who surfs with his owner and the nation's No. 1-ranked qualifier last year, Grant the black cocker spaniel.
They come in 203 breeds and varieties, with the grand basset griffon Vendeen and the Nederlandse kooikerhondje ready to make their debuts on the green carpet of Madison Square Garden.
Jil Walton says she'll be rooting hard for Whiskey — "I really, really want that whippet to win!" she said.
See, she once brought a whippet to the Garden, too.
Remember hers? Sweet, gentle Vivi?
A lot of dogs have left Westminster with a legacy — Uno the baying beagle, heady Rufus the colored bull terrier, ol' Stump the Sussex spaniel — but few will ever match the lore of Vivi (VIH'-vee).
It was 2006, a day after the 3-year-old won an Award of Merit, an honorable mention for whippets. Set to get loaded at John F. Kennedy International Airport for a flight back to Los Angeles, she suddenly broke loose from her crate and took off.
Vivi bolted onto the runaway and airport workers gave chase, on foot and in cars.
Similar to greyhounds but smaller, whippets have tremendous acceleration and can sprint at 35 mph and up. In full flight, Vivi couldn't be caught, escaping through a fence and disappearing into the marshland.
More than 100 volunteers looked, thousands of fliers were posted. Pet psychics tried to communicate with her, a reward was offered. Dog owners all over the country worried and wondered: Where's Vivi?
Plenty of tips poured in during those early winter days and nights, supposedly she was seen in several parts of New York City. But none of those reports checked out.
As far as anyone knows, Vivi was never seen again.
"When I think about Vivi's Westminster, I still run a million scenarios through my head and end up getting sad," Walton, Vivi's co-owner, said this week. "But overall, Vivi's story did touch people and I was lucky enough to be touched by them as well."
"My silly hope is that my girl ended up happy on someone's couch," she said.
Smithey, who figures he's competed at Westminster about 15 times, grew quiet at the mention of Vivi.
"So sad, that was," he said.
Whiskey has already won the National Dog Show and the prized AKC event. Only Sadie the Scottish terrier in 2010 and Sky the wire fox terrier in 2014 have taken those two and Westminster.
Smithey, from Sugar Valley, Georgia, wants his 3-year-old with a champion's name of Pinnacle Tennessee Whiskey to become the second whippet to win best in show here. In 1964, Courtenay Fleetfoot of Pennyworth triumphed.
"There are 30 other whippets that would like to do the same thing," he said.
Among them is Whiskey's littermate, sister Bourbon. Last year at Westminster, Whiskey won best of breed and finished fourth in the hound group; Bourbon also was honored.
"They are big buds," Smithey said.
Walton, who is based in Kalispell, Montana, and spends her winters in Temecula, California, will be cheering from afar for Whiskey.
Maybe he can help bring it home, at last, for Vivi.
"That just sounds quite good in many ways," she said.


text:
December 22, 2009 November 29, 2011 carlosnightmanLeave a comment
A romantic comedy with an unusually varied cast giving good performances. Sigourney Weaver and Jennifer Love Hewitt star as a mother and daughter con-team. They are like the legacy hunters of Ancient Rome, following around wealthy men in order to get their money. Their usual scam involves Max (Weaver) seducing a man, then marrying him. Then Page (Hewitt) appears and makes him unfaithful so that Max can divorce him and get half his money. The film begins with such a scam, taking mechanic Ray Liotta for a ride. Max is annoyed though with their slim pickings, and Page claims she can move out on her own. They decide to go for one last score each, to see who can earn the most. Max sets her sights on aging Billionaire Tensey, played by Hackman and Page follows Bartender Jason Lee who is also rich. However, Page falls for Lee and Max realises she may lose her daughter, as well as Tinsey's fortune as he refuses to die. Also, Liotta has found the two and realised their plans. He wants his money back…
Although this starts out as quite a dark and cynical comedy it soon becomes more light-hearted and typical fare. There remains though a subtle tone of skepticism throughout which is refreshing in a genre which rarely offers any originality, or entertainment. Each actor seems to enjoy themselves fully, some being pulled widely away from the characters they usually play. Weaver is very strong and in control, Hewitt is extremely sexy rather than her usual roles involving screaming, crying or cuteness, and she does very well. Liotta is excellent giving the best jokes in the film, Hackman is also very funny, and Jason Lee, though toned down from his Kevin Smith roles is still capable of getting our laughs and sympathy. You can usually buy this pretty cheap so it would hardly be a waste, better than most of its type but unfortunately it is a type which is limited. Overall, good fun.
The DVD has a few tiny feautures- trailers, TV spots, nothing overly exciting. For any fans of the cast or of romantic comedies (which do not rely on overly sexual or toilet based humour) this is a cheap purchase.
Feel free to comment on the review and/or the movie- what did you like, what didn't you like?
Movie ReviewsGene Hackman, Heartbreakers, Jason Lee, Jennifer Love Hewitt, Movies, Reviews, Sigourney Weaver


text:
The Chinese-Australian artist Guan Wei is on display in a new exhibition at the MCA. The centre piece of the exhibition is the 18x6m mural Feng Shui (2004). Guan Wei, Feng Shui, 2004, acrylic on composite board. Museum of Contemporary Art, donated through the Australian Government's Cultural Gifts Program by Cromwell Diversified Property Trust, 2017. Image courtesy and © the artist
Guan Wei review: feng shui for a vision of a world in harmony
Joanna Mendelssohn, University of Melbourne
Joanna Mendelssohn
Principal Fellow (Hon), Victorian College of the Arts, University of Melbourne. Editor in Chief, Design and Art of Australia Online, University of Melbourne
Joanna Mendelssohn has in the past received funding from the Australian Research Council.
University of Melbourne provides funding as a founding partner of The Conversation AU.
It seems appropriate that a painting titled Feng Shui dominates the new exhibition of Guan Wei's work at Sydney's Museum of Contemporary Art (MCA). He is the master of working and living between two cultures: the China of his birth and Australia, his home for most of the last three decades.
A rhythmically moving ocean where creatures great and small leisurely swim in tranquillity between continents: this is Guan's vision of a world in harmony.
Clouds of good fortune blow to encourage the swimmers on their journeys; a fleet of sailing ships join their voyage. Taking up two adjoining walls of the gallery, the work takes on a three-dimensional appearance as swimmers and fish advance towards the viewer.
Guan has a long fascination with both antique maps and mythical creatures. At the core of this work is a giant map: patterns in shades of blue echo isobars and weather maps. The grid of the 120 individually painted panels appear to define latitude and longitude.
Taking up two adjoining walls, the figures seem to advance towards the viewer. Anna Kucera/MCA
Feng shui is central to the Taoist belief of balance and harmony of nature. The words translate literally into "wind" (feng) and "water" (shui): the painting becomes both an illustration of its underlying concept, and a visual pun.
Read more: Our oceans are out of balance – can we learn some tips from feng shui?
From China to Australia
Guan is from that remarkable generation of Chinese artists who, in the 1980s, began to exhibit in private homes because the work they made was not acceptable to the state. In this scene, Guan befriended a young Nicholas Jose, who would later become Australia's cultural counsellor in Beijing.
In 1988, an exhibition of Australian art at the embassy in Beijing led to invitations from touring curators for Chinese artists to visit Australia. At the invitation of Geoff Parr, the director of the Tasmanian School of Art, Guan spent the early months of 1989 as artists-in-residence in Hobart.
Guan returned to China before the climax of the events at Tiananmen Square, but through the support of Parr and the Australian arts community, several Chinese artists were able to emigrate to Australia.
Australia in the 1990s was especially open to contemporary Chinese artists. The MCA exhibited Mao Goes Pop shortly after opening; in 1993, the Queensland Art Gallery started its ground-breaking series of Asia Pacific Triennials.
Guan, with his wife and daughter, settled first in a small apartment in Enmore in inner Sydney, before relocating to a large house in Glenmore Park in the western suburbs. It was here, in the cavernous space of the Casula Powerhouse Arts Centre, he painted Feng Shui.
Strength and endurance
In 1992, the MCA became the first public gallery to collect his work. The 48 postcard-size paintings, Two Finger Exercises (1989), were painted in Beijing, and in the current exhibition they are framed by a mural of an angel, a demon, and red flags – a reference to the conflict at the time of their making.
Two Finger Exercises (1989) was the first of Guan's work collected by a public gallery. Anna Kucera/MCA
The blob-like figures in various poses and relationships all hold up two fingers. Some appear defiant, others hectoring; one is upside down. The two-fingered sign was popular with the student radicals as they stared down the might of the bureaucracy in the occupation of Tiananmen Square.
The two fingered symbol can mean a "V for Victory" and also a defiant "up yours" gesture to authority. There is also another, specifically Chinese meaning. Ancient masters of Qigong, the meditative movement now popular with fitness classes, were supposed to be able to concentrate their Qi (life-force energy) with such strength they could balance on two fingers. In this, Guan's paintings are a reminder of strength and endurance.
The 48 postcard-size paintings are 'a reminder of strength and endurance.' Guan Wei, Two-finger exercise no.48, 1989, Museum of Contemporary Art, gift of the artist, 1993, image courtesy and © the artist, photograph: Jessica Maure
Shortly after he arrived in Australia, Guan made a series of collage works, Certificate (1990), using stamps, symbols and red ink as commentary on China's officious bureaucracy, and family photos manipulated to define, confine and sometimes eliminate particular figures.
Guan's family were direct descendents of Qing dynasty courtiers, and so were eliminated from public life in the Cultural Revolution of the 1960s and 70s. He has a particularly intimate experience of the whims of bureaucracy.
Read more: Why China still can't make sense of the Cultural Revolution
The question of how an artist living today may react to both the events of the present and the beauty of traditional art and nature is addressed in Paper War (2003), where a facsimile of a 17th century scroll painting by the Nanjing master Gong Xian has been overlaid by silhouettes showing military invasion and death by an unnamed enemy.
Paper War is a reaction to both the 'events of the present and the history of traditional art.' Anna Kucera/MCA
In 2014, Guan reworked Paper War as a video, which intersperses the scroll with animated figures of fighter planes and soldiers parachuting in to create destruction. There is no land so beautiful it can't be despoiled by war.
Finding feng shui in migration
In 2016 Guan entered the Archibald Prize with Plastic Surgery, a wry comment on the nature of immigration and acceptance.
A series of faces transition from the heavily regulated persona demanded by Chinese officialdom in the 1980s to the compromises made by immigrants to fit in with a new culture.
Guan's art suggests it is far better for those moving between cultures to adopt another path – to find harmonious connections, to seek humorous twists in even difficult circumstances – and be guided always by the equilibrium of feng shui.
Guan Wei: MCA Collection is on view at the Museum of Contemporary Art, Sydney, until 9 February 2020


text:
rutgers.edu | RBHS
About Rutgers Cancer Institute
Get the Facts: Comprehensive Cancer Centers
Adult Oncology Programs
Pediatric Hematology/ Oncology Program
What is Immunotherapy?
Precision Medicine Oncology
East Tower Location
Patient Education Resources
New Patient Information and Forms
Rutgers Cancer Institute of New Jersey at University Hospital
Nursing at Rutgers Cancer Institute
Oncology Nurse Navigators
Patient Education Events
Clinical Trials Overview
Immunotherapy Trials
Precision Medicine Trials
Benefits and Risks
Is a Clinical Trial Right for Me?
Resident Faculty Research
Research Meetings and Events
Acknowledging CCSG Support
Cancer Research Career Enhancement and Related Activities
Fellowships/Residencies
Resource and Learning Center
Awareness Months
Skin Cancer Resource Center
Honor/Remember
Rutgers Cancer Institute of New Jersey
195 Little Albany Street
New Brunswick, NJ 08903-2681
732-235-CINJ (2465)
CINJ on FacebookCINJ on TwitterCINJ on InstagramCINJ on LinkedInCINJ on YouTube
Health Library Home>Wellness Centers>Sports & Fitness>Article
The Cumulative Effects of Concussions
by Cynthia M. Johnson, MA
A concussion can happen during falls, contact sports, car accidents, and fighting. Really any event that results in a blow to the head. Symptoms may appear immediately or even days after the injury. There may be physical symptoms like pain or others like coordination problems, and mental and emotional symptoms, such as memory loss, confusion, and difficulty concentrating. In most cases, a concussion can be treated with rest. A doctor will give the okay to return to normal activities once symptoms have passed. It is important to allow enough time to heal. It is equally important to avoid another blow to the head. Multiple concussions increase the risk of long term damage.
The Dangers of Repeat Concussions in Sports
Athletes who participate in contact sports are at higher risk for repeat concussions. A repeat concussion has a higher risk of complications like edema, permanent brain damage, and death. It can also result in dementia-like symptoms that can occur many years after the injuries.
Repeated concussions are linked to a degenerative disease of the brain known as chronic traumatic encephalopathy (CTE). CTE causes changes in the brain that lead to memory loss, impaired judgement, depression, aggression, and dementia. If you are a fan of American football, you've likely heard about professional players who have suffered from repeat concussions. For example, linebacker Junior Seau suffered from years of depression and severe sleep disorder. He committed suicide at the young age of 43. An autopsy determined he had CTE. It can only be diagnosed after death.
In addition to football, professional fighters also suffer from similar symptoms due to the repeat blows they sustain in the ring. Sugar Ray Robinson, for example, developed dementia after fighting 198 professional bouts between 1940 and 1965.
Concussion Policies
Many sporting organizations now recognize the dangers of concussions and repeat concussions. Most are taking steps to prevent them. For example, major pro sports leagues and NASCAR have developed concussion policies detailing what should be done after an injury and who decides when the player can return to play. In most cases, the organizations now leave the decision up to the team medical staff rather than up to the coaches who do not have the medical training to make such decisions.
The pros are not the only players who need to take care when it comes to concussions. Concussion action plans can also be found at the local and state level, in schools and sport organizations. Most of these laws state that an athlete who is believed to have a concussion should be removed from play right away. They will need permission of their doctor before they return to play. There is also a 24 hour minimum waiting period before they return to sport. Many contact sports also engage in safety training and planning. This includes making sure the right equipment is available and avoiding actions that have a high risk of concussion.
Concussion Prevention
A concussion is often the result of an accident, which can be difficult to prevent. To decrease the chance of severe injuries during an accident:
Always use seatbelts, shoulder harnesses, and child safety seats when traveling in vehicles.
Learn about the air bags in your car. Young children should not be placed in front of air bags.
Wear a helmet when participating in high risk activities, such as:
Riding a bike or motorcycle
Playing a contact sport, such as football, soccer, or hockey
Using skates, scooters, and skateboards
Catching, batting, or running bases in baseball or softball
If you or a loved one has a concussion, follow your doctor's instructions on when you can return to normal activities, including sports. A repeat concussion may take longer to heal and result in greater long-term effects.
http://www.cdc.gov
The American Academy of Family Physicians
http://familydoctor.org/
Canadian Resources
http://www.hc-sc.gc.ca
Public Health Agency of Canada
http://www.phac-aspc.gc.ca
Concussion. American Association of Neurological Surgeons website. Available at: http://www.aans.org/patient%20information/conditions%20and%20treatments/concussion.aspx. Updated September 2000. Accessed March 11, 2019.
Concussion and mild traumatic brain injury. EBSCO DynaMed Plus website. Available at: http://www.dynamed.com/topics/dmp~AN~T116529/Concussion-and-mild-traumatic-brain-injury. Updated March 28, 2017. Accessed March 11, 2019.
Concussion diagnosis and management best practices. NCAA website. Available at: http://www.ncaa.org/sport-science-institute/concussion-diagnosis-and-management-best-practices. Accessed March 11, 2019.
Get a heads up on concussion in sports policies. Centers for Disease Control and Prevention website. Available at: https://www.cdc.gov/headsup/pdfs/policy/headsuponconcussioninsportspolicies-a.pdf. Accessed March 11, 2019.
Sports concussion policies and laws. Centers for Disease Control and Prevention website. Available at: https://www.cdc.gov/headsup/policy/. Updated February 16, 2015. Accessed March 11, 2019.
Sports-related concussion. EBSCO DynaMed Plus website. Available at: http://www.dynamed.com/topics/dmp~AN~T901005/Sports-related-concussion. Updated March 29, 2017. Accessed March 11, 2019.
What is CTE? Brain Injury Research Institute website. Available at: http://www.protectthebrain.org/Brain-Injury-Research/What-is-CTE-.aspx. Accessed March 11, 2019.
Last reviewed November 2018 by Michael Woods, MD, FAAP Last Updated: 3/11/2019
Rutgers Cancer Institute of New Jersey is the state's only National Cancer Institute-designated Comprehensive Cancer Center
195 Little Albany Street, New Brunswick, NJ 08903-2681
Copyright ©2020 Rutgers, The State University of New Jersey, all rights reserved | Privacy Policy
The information contained in this website is not a substitute for medical consultation. A physician should always be consulted for any health problem or medical condition.


text:
Lt. Gen. Victor "Brute" Krulak Detachment
krulak.brutes@gmail.com
Copyright 2013 by The Krulak Detachment.
About the Krulak Detachment
"We are all members of the same great family … On social occasions the formality of strictly military occasions should be relaxed, and a spirit of friendliness and goodwill should prevail."
—MajGen John A. Lejeune
The Krulak Detachment was formed to foster camaraderie among men and women in Central Alabama who are dedicated to preserving the traditions and promoting the interests of the Marine Corps through service and community outreach.
Current and former Marines, FMF Corpsmen, and Navy Chaplains who honorably served or are serving are welcome to submit a membership application for consideration.
"Being ready is not what matters. What matters is winning after you get there."
Lt. General Victor "Brute" Krulak
The Krulak Detachment is named after Lt. General Victor "Brute" Krulak, who is often touted as the "most important officer in the history of the Marine Corps".
In China, he went on daring spy missions. In World War II, he was instrumental in developing amphibious vehicles, and masterminded the invasion of Okinawa. In Korea, he was a combat hero and pioneered the use of helicopters in warfare. In Vietnam, he devised a holistic strategy to fighting the Viet Cong, but when he stood up to LBJ, Krulak was forced to retire.
Yet perhaps all of his accomplishments pale in comparison to what he did after World War II and again after Korea: Krulak almost single-handedly stopped the U.S. government from abolishing the Marine Corps.
He's part of that long line of heroes who contribute to that unique Marine Corps ethos and sense of integrity and sense of duty. The sense of being the most ready when America is least ready. General Krulak is known as a giant of the corps. And very few marines have that honor. And many will say that among those who are considered giants of the corps, his name is first and it shines the brightest. He is a legendary marine,
A copy of Brute is part of the detachment altar.
Each Brute is encouraged to borrow, read, and sign their name in the altar copy.
Please check with the Sergeant-At-Arms to borrow Brute.
Known to be "required reading" for all Marines, Krulak offers here a riveting insider's chronicle of U.S. Marines — their fights on the battlefield and off, and their extraordinary esprit de corps.
He not only takes a close look at the Marine experience during World War II, Korea, and Vietnam, but also examines the foundation on which the Corps is built. In doing so, he helps answer the question of what it means to be a Marine and how the Corps has maintained such a consistently outstanding reputation.
The Marine Corps League
Incorporated by an act of Congress in 1937, the Marine Corps League perpetuates the traditions and spirit of ALL Marines who proudly wear or who have worn the eagle, globe and anchor of the Corps.
Members of the Marine Corps League join together in camaraderie and fellowship for the purpose of preserving the traditions and promoting the interests of the United States Marine Corps, banding together those who are now serving in the United States Marine Corps and those who have been honorably discharged from that service that they may effectively promote the ideals of American freedom and democracy, voluntarily aiding and rendering assistance to all Marines and former Marines and to their widows and orphans; and to perpetuate the history of the United States Marine Corps and by fitting acts to observe the anniversaries of historical occasions of particular interest to Marines
The Marine Corps League perpetuates the traditions and spirit of ALL Marines and Navy FMF Corpsmen, who proudly wear or who have worn the eagle, globe and anchor of the Corps.
It takes great pride in crediting its founding in 1923 to World War I hero, then Major General Commandant John A. Lejeune. It takes equal pride in its Federal Charter, approved by An Act of the Seventy-Fifth Congress of the United States of America and signed and approved by President Franklin D. Roosevelt on August 4, 1937.
The League is the only Federally Chartered Marine Corps related veterans organization in the country. Since its earliest days, the Marine Corps League has enjoyed the support and encouragement of the active duty and Reserve establishments of the U. S. Marine Corps.
Today, the League boasts a membership of more than 60,000 men and women, officer and enlisted, active duty, Reserve Marines, honorably discharged Marine Veterans, qualified Navy FMF Corpsmen and qualified Navy FMF Chaplains and is one of the few Veterans Organizations that experiences increases in its membership each year.
The Marine Corps League is headed by an elected National Commandant, with 14 elected National Staff Officers who serve as trustees.
The National Board of Trustees coordinates the efforts of 48 department, or state, entities and the activities of over 1000 community-based detachments located throughout the United States and overseas.
The day-to-day operations of the League are under the control of the National Executive Director with the responsibility for the management and direction of all programs, activities, and affairs of the Marine Corps League as well as supervising the National Headquarters staff.
The prime authority of the League is derived from its Congressional charter and from its annual National Convention held each August in different major U.S. cities throughout the nation.
It is a not-for-profit organization within the provisions of the Internal Revenue Service Code 501(c) (4), with a special group exemption letter which allows for contributions to the Marine Corps League, its Auxiliary and subsidiary units, to be tax deductible by the donor.
Brutes Only