text:
/* global QUnit */

sap.ui.define([
	"sap/ui/integration/designtime/baseEditor/BaseEditor",
	"sap/ui/qunit/QUnitUtils",
	"sap/base/util/ObjectPath",
	"sap/base/util/restricted/_merge",
	"qunit/designtime/EditorQunitUtils",
	"sap/ui/core/Core"
], function (
	BaseEditor,
	QUnitUtils,
	ObjectPath,
	_merge,
	EditorQunitUtils,
	oCore
) {
	"use strict";

	function _getArrayEditorElements(oEditor) {
		var oArrayEditorContent = oEditor.getContent().getItems();
		return oEditor.getConfig().collapsibleItems === false
			? { // ArrayEditorPlain
				items: oArrayEditorContent[0].getItems().map(function (oArrayEditorItem) {
					return {
						item: oArrayEditorItem,
						label: oArrayEditorItem.getItems()[0].getContentLeft()[0],
						moveUpButton: oArrayEditorItem.getItems()[0].getContentRight()[0],
						moveDownButton: oArrayEditorItem.getItems()[0].getContentRight()[1],
						deleteButton: oArrayEditorItem.getItems()[0].getContentRight()[2],
						editors: oArrayEditorItem.getItems()[1]._getPropertyEditors()
					};
				}),
				addButton: oArrayEditorContent[1]
			}
			: { // ArrayEditor with collapsible items
				items: oArrayEditorContent[0].getItems().map(function (oArrayEditorItem) {
					var aToolbarItems = oArrayEditorItem.getHeaderToolbar().getContent();
					return {
						item: oArrayEditorItem,
						label: aToolbarItems[0],
						moveUpButton: aToolbarItems[2],
						moveDownButton: aToolbarItems[3],
						deleteButton: aToolbarItems[4],
						editors: oArrayEditorItem.getContent()[0]._getPropertyEditors()
					};
				}),
				addButton: oArrayEditorContent[1]
			};
	}

	function createBaseEditorConfig(mConfigOptions) {
		var mPropertyConfig = Object.assign(
			{
				path: "/content",
				type: "array",
				template: {
					foo: {
						type: "string",
						path: "foo"
					}
				}
			},
			mConfigOptions
		);

		return {
			context: "/",
			properties: {
				sampleArray: mPropertyConfig
			},
			propertyEditors: {
				"array": "sap/ui/integration/designtime/baseEditor/propertyEditor/arrayEditor/ArrayEditor",
				"string": "sap/ui/integration/designtime/baseEditor/propertyEditor/stringEditor/StringEditor"
			}
		};
	}

	var fnBaseTests = function () {
		QUnit.test("When an ArrayEditor is created", function (assert) {
			assert.ok(this.oArrayEditor.getDomRef() instanceof HTMLElement, "Then it is rendered correctly (1/3)");
			assert.ok(this.oArrayEditor.getDomRef() && this.oArrayEditor.getDomRef().offsetHeight > 0, "Then it is rendered correctly (2/3)");
			assert.ok(this.oArrayEditor.getDomRef() && this.oArrayEditor.getDomRef().offsetWidth > 0, "Then it is rendered correctly (3/3)");
		});

		QUnit.test("When a model is set", function (assert) {
			var aPropertyEditors = _getArrayEditorElements(this.oArrayEditor).items[0].editors;
			assert.strictEqual(aPropertyEditors.length, 3, "Then three editors are created for the first array item");
			assert.strictEqual(aPropertyEditors[0].getConfig().type, "string", "and the first property editor is for string");
			assert.strictEqual(aPropertyEditors[1].getConfig().type, "number", "and the second property editor is for number");
			assert.strictEqual(aPropertyEditors[2].getConfig().type, "string", "and the third property editor is for string");
		});

		QUnit.test("When the first delete button is pressed in the editor", function (assert) {
			var done = assert.async();

			this.oArrayEditor.attachEventOnce("valueChange", function (oEvent) {
				assert.strictEqual(oEvent.getParameter("value").length, 1, "Then there is only one side indicator");
				assert.equal(oEvent.getParameter("value")[0].title, "Deviation", "Then it is updated correctly");
				done();
			});
			var oDelButton0 = _getArrayEditorElements(this.oArrayEditor).items[0].deleteButton;
			QUnitUtils.triggerEvent("tap", oDelButton0.getDomRef());
		});

		QUnit.test("When the second delete button is pressed in the editor", function (assert) {
			var done = assert.async();

			this.oArrayEditor.attachValueChange(function (oEvent) {
				assert.strictEqual(oEvent.getParameter("value").length, 1, "Then there is only one side indicator");
				assert.strictEqual(oEvent.getParameter("value")[0].title, "Target", "Then it is updated correctly");
				done();
			});
			var oButton1 = _getArrayEditorElements(this.oArrayEditor).items[1].deleteButton;
			QUnitUtils.triggerEvent("tap", oButton1.getDomRef());
		});

		QUnit.test("When the default values are undefined or complex", function (assert) {
			var done = assert.async();
			var oConfig = {
				tags: ["header", "numericHeader"],
				label: "SIDE_INDICATORS",
				path: "/header/sideIndicators",
				type: "array",
				itemLabel: "SIDE_INDICATOR",
				template: {
					title : {
						label: "SIDE_INDICATOR.TITLE",
						type: "string",
						path: "title",
						defaultValue: undefined
					},
					number : {
						label: "SIDE_INDICATOR.NUMBER",
						type: "enum",
						defaultValue: {
							val: 1,
							unit: undefined
						},
						path: "number",
						"enum": [{
							val: 1,
							unit: undefined
						}]
					}
				},
				maxItems: 3,
				visible: true
			};
			this.oArrayEditor.getAggregation("propertyEditor").setConfig(oConfig);

			this.oArrayEditor.attachValueChange(function (oEvent) {
				assert.deepEqual(
					oEvent.getParameter("value")[2],
					{},
					"Then new items have the proper values"
				);
				assert.ok(oEvent.getParameter("value")[2].number !== oConfig.template.number.defaultValue, "Then the default value is cloned");
				done();
			});
			var oAddButton = _getArrayEditorElements(this.oArrayEditor).addButton;
			QUnitUtils.triggerEvent("tap", oAddButton.getDomRef());
		});

		QUnit.test("When the add button is pressed in the editor", function (assert) {
			var done = assert.async();

			this.oArrayEditor.attachValueChange(function (oEvent) {
				assert.strictEqual(oEvent.getParameter("value").length, 3, "Then there are three side indicators");
				assert.deepEqual(oEvent.getParameter("value")[2], {}, "Then the new item is created with proper default values");
				done();
			});
			var oAddButton = _getArrayEditorElements(this.oArrayEditor).addButton;
			QUnitUtils.triggerEvent("tap", oAddButton.getDomRef());
		});

		QUnit.test("Ready handling - When the editor items change", function (assert) {
			var done = assert.async();
			var oAddButton = _getArrayEditorElements(this.oArrayEditor).addButton;
			this.oArrayEditor.attachEventOnce("ready", function () {
				assert.ok(true, "Then the ready event of the ArrayEditor is triggered again after the update");
				done();
			}, this);
			QUnitUtils.triggerEvent("tap", oAddButton.getDomRef());
		});

		QUnit.test("When a new item is added to and an existing item is removed from an array", function (assert) {
			var done = assert.async();

			this.oArrayEditor.attachEventOnce("valueChange", function (oEvent) {
				var aEditorValueAfterAdding = oEvent.getParameter("value");
				assert.deepEqual(
					aEditorValueAfterAdding,
					[{
						title: "Target",
						number: 250,
						unit: "K"
					},{
						number: 42,
						title: "Deviation",
						unit: "%"
					},{
					}],
					"Then the new item is added to the array"
				);

				this.oArrayEditor.attachValueChange(function (oEvent) {
					assert.deepEqual(
						oEvent.getParameter("value"),
						[{
							title: "Target",
							number: 250,
							unit: "K"
						},{
						}],
						"Then the remaining items still have the correct value"
					);
					assert.ok(oEvent.getParameter("value") !== aEditorValueAfterAdding, "Then the editor value is not mutated");
					done();
				});

				// The old item is deleted
				QUnitUtils.triggerEvent("tap", _getArrayEditorElements(this.oArrayEditor).items[1].deleteButton);

			}.bind(this));

			// A new item is added
			QUnitUtils.triggerEvent("tap", _getArrayEditorElements(this.oArrayEditor).addButton.getDomRef());
		});

		QUnit.test("When an element is added to a non-declared array", function (assert) {
			var done = assert.async();
			this.oPropertyConfig = {
				label: "EMPTY ARRAY TEST",
				path: "/emptyArray",
				type: "array",
				template: {
					title : {
						label: "TITLE",
						type: "string",
						path: "title",
						defaultValue: "Default Title"
					}
				}
			};

			this.oArrayEditor.setConfig(this.oPropertyConfig);

			this.oArrayEditor.ready().then(function () {
				oCore.applyChanges();
				this.oArrayEditor.attachValueChange(function (oEvent) {
					assert.strictEqual(oEvent.getParameter("value").length, 1, "Then there is one item");
					assert.deepEqual(oEvent.getParameter("value")[0], {}, "Then the new item is created with proper default values");
					done();
				});
				var oAddButton = _getArrayEditorElements(this.oArrayEditor).addButton;
				assert.strictEqual(oAddButton.getEnabled(), true, "Then the button to add an item is enabled");
				QUnitUtils.triggerEvent("tap", oAddButton.getDomRef());
			}.bind(this));
		});

		QUnit.test("moveUp should be disabled for the first item in the array", function (assert) {
			var oMoveUpButton = _getArrayEditorElements(this.oArrayEditor).items[0].moveUpButton;
			assert.strictEqual(oMoveUpButton.getEnabled(), false);
		});

		QUnit.test("moveUp should be enabled for all items except first", function (assert) {
			var aArrayElements = _getArrayEditorElements(this.oArrayEditor).items;
			var bEnabled = aArrayElements.slice(1).every(function (oArrayElement) {
				return oArrayElement.moveUpButton.getEnabled();
			});
			assert.strictEqual(bEnabled, true);
		});

		QUnit.test("moveDown should be disabled for the last item in the array", function (assert) {
			var oMoveDownButton = _getArrayEditorElements(this.oArrayEditor).items.slice(-1)[0].moveDownButton;
			assert.strictEqual(oMoveDownButton.getEnabled(), false);
		});

		QUnit.test("moveDown should be enabled for all items except last", function (assert) {
			var aArrayElements = _getArrayEditorElements(this.oArrayEditor).items;
			var bEnabled = aArrayElements.slice(0, -1).every(function (oArrayElement) {
				return oArrayElement.moveDownButton.getEnabled();
			});
			assert.strictEqual(bEnabled, true);
		});

		QUnit.test("when pressing moveUp", function (assert) {
			var done = assert.async();

			this.oArrayEditor.attachValueChange(function (oEvent) {
				var aValue = oEvent.getParameter("value");
				assert.strictEqual(aValue[0].title, "Deviation", "then Deviation is on the first place in array editor");
				assert.strictEqual(aValue[1].title, "Target", "then Target is on the second place in array editor");
				done();
			});

			var oMoveUpButton = _getArrayEditorElements(this.oArrayEditor).items[1].moveUpButton;
			assert.strictEqual(this.oArrayEditor.getValue()[0].title, "Target", "then Target is on the first place in array editor");
			assert.strictEqual(this.oArrayEditor.getValue()[1].title, "Deviation", "then Deviation is on the second place in array editor");
			QUnitUtils.triggerEvent("tap", oMoveUpButton.getDomRef());
		});

		QUnit.test("when pressing moveDown", function (assert) {
			var done = assert.async();

			this.oArrayEditor.attachValueChange(function (oEvent) {
				var aValue = oEvent.getParameter("value");
				assert.strictEqual(aValue[0].title, "Deviation", "then Deviation is on the first place in array editor");
				assert.strictEqual(aValue[1].title, "Target", "then Target is on the second place in array editor");
				done();
			});

			var oMoveDownButton = _getArrayEditorElements(this.oArrayEditor).items[0].moveDownButton;
			assert.strictEqual(this.oArrayEditor.getValue()[0].title, "Target", "then Target is on the first place in array editor");
			assert.strictEqual(this.oArrayEditor.getValue()[1].title, "Deviation", "then Deviation is on the second place in array editor");
			QUnitUtils.triggerEvent("tap", oMoveDownButton.getDomRef());
		});

		QUnit.test("when a property in an array item has a visibility binding against another property in the item", function (assert) {
			var fnDone = assert.async();

			var oConfig = {
				"label": "Array Editor",
				"path": "/foo",
				"type": "array",
				"template": {
					"prop1": {
						"label": "Prop1",
						"type": "select",
						"path": "prop1",
						"items": [
							{ "key": "Value1" },
							{ "key": "Value2" },
							{ "key": "Value3" }
						]
					},
					"prop2": {
						"label": "Prop2",
						"type": "string",
						"path": "prop2",
						"visible": "{= ${prop1} === 'Value2'}"
					}
				}
			};

			this.oBaseEditor.setJson({
				foo: [
					{
						prop1: "Value1",
						prop2: ""
					},
					{
						prop1: "Value2",
						prop2: ""
					}
				]
			});

			this.oArrayEditor.setConfig(oConfig);
			this.oArrayEditor.ready().then(function () {
				var aArrayElements = _getArrayEditorElements(this.oArrayEditor).items;
				assert.strictEqual(aArrayElements[0].editors[1].getConfig().visible, false, "then prop2 is invisible for 1st array item");
				assert.strictEqual(aArrayElements[1].editors[1].getConfig().visible, true, "then prop2 is visible for 2nd array item");
				fnDone();
			}.bind(this));
		});

		QUnit.test("when a property in an array item has a visibility binding against another property in the item (defaultValue usecase)", function (assert) {
			var fnDone = assert.async();

			var oConfig = {
				"label": "Array Editor",
				"path": "/foo",
				"type": "array",
				"template": {
					"prop1": {
						"label": "Prop1",
						"type": "select",
						"path": "prop1",
						"items": [
							{ "key": "Value1" },
							{ "key": "Value2" },
							{ "key": "Value3" }
						],
						defaultValue: "Value2"
					},
					"prop2": {
						"label": "Prop2",
						"type": "string",
						"path": "prop2",
						"visible": "{= ${prop1} === 'Value2'}"
					}
				}
			};

			this.oBaseEditor.setJson({
				foo: [
					{
						prop2: ""
					},
					{
						prop1: "Value2",
						prop2: ""
					}
				]
			});

			this.oArrayEditor.setConfig(oConfig);
			this.oArrayEditor.ready().then(function () {
				var aArrayElements = _getArrayEditorElements(this.oArrayEditor).items;
				assert.strictEqual(aArrayElements[0].editors[1].getConfig().visible, true, "then prop2 is visible for 1st array item");
				assert.strictEqual(aArrayElements[1].editors[1].getConfig().visible, true, "then prop2 is visible for 2nd array item");
				fnDone();
			}.bind(this));
		});
	};

	QUnit.module("Collapsible Array Editor: Given an editor config", {
		beforeEach: function (assert) {
			var fnReady = assert.async();
			var mPropertyConfig = {
				tags: ["header", "numericHeader"],
				label: "SIDE_INDICATORS",
				path: "/header/sideIndicators",
				type: "array",
				itemLabel: "SIDE_INDICATOR",
				template: {
					title: {
						label: "SIDE_INDICATOR.TITLE",
						type: "string",
						path: "title",
						defaultValue: "Side Indicator"
					},
					number: {
						label: "SIDE_INDICATOR.NUMBER",
						type: "number",
						path: "number"
					},
					unit: {
						label: "SIDE_INDICATOR.UNIT",
						type: "string",
						path: "unit"
					}
				},
				maxItems: 3,
				visible: "{= ${context>/header/type} === 'Numeric' }"
			};
			var mConfig = {
				context: "/",
				properties: {
					sideIndicator: mPropertyConfig
				},
				propertyEditors: {
					"array": "sap/ui/integration/designtime/baseEditor/propertyEditor/arrayEditor/ArrayEditor",
					"string": "sap/ui/integration/designtime/baseEditor/propertyEditor/stringEditor/StringEditor",
					"number": "sap/ui/integration/designtime/baseEditor/propertyEditor/numberEditor/NumberEditor",
					"select": "sap/ui/integration/designtime/baseEditor/propertyEditor/selectEditor/SelectEditor"
				}
			};
			var mJson = {
					header: {
						type: "Numeric",
						sideIndicators:
							[
								{
									"title": "Target",
									"number": 250,
									"unit": "K"
								},
								{
									"title": "Deviation",
									"number": 42,
									"unit": "%"
								}
							]
					}
			};

			this.oBaseEditor = new BaseEditor({
				config: mConfig,
				json: mJson
			});
			this.oBaseEditor.placeAt("qunit-fixture");

			this.oBaseEditor.getPropertyEditorsByName("sideIndicator").then(function (aPropertyEditor) {
				this.oArrayEditor = aPropertyEditor[0];
				oCore.applyChanges();
				fnReady();
			}.bind(this));
		},
		afterEach: function () {
			this.oBaseEditor.destroy();
		}
	}, function (assert) {
		fnBaseTests(assert);

		QUnit.test("Auto Expand - When a prefilled item is added", function (assert) {
			var aEditorItems = _getArrayEditorElements(this.oArrayEditor).items;
			var iLastItemIndex = aEditorItems.length - 1;
			assert.strictEqual(
				aEditorItems[iLastItemIndex].item.getExpanded(),
				false,
				"Then the item is initially collapsed"
			);
		});

		QUnit.test("Auto Expand - When an empty item is added", function (assert) {
			var oEditorElements = _getArrayEditorElements(this.oArrayEditor);
			var iLastItemIndex = oEditorElements.items.length - 1;
			QUnitUtils.triggerEvent("tap", oEditorElements.addButton.getDomRef());

			return this.oArrayEditor.ready().then(function () {
				var aEditorItems = _getArrayEditorElements(this.oArrayEditor).items;
				assert.strictEqual(
					aEditorItems[(iLastItemIndex + 1)].item.getExpanded(),
					true,
					"Then the newly added item is expanded"
				);
			}.bind(this));
		});

		QUnit.test("Auto Expand - When an empty item is manually collapsed", function (assert) {
			var oEditorElements = _getArrayEditorElements(this.oArrayEditor);
			var iLastItemIndex = oEditorElements.items.length - 1;
			QUnitUtils.triggerEvent("tap", oEditorElements.addButton.getDomRef());

			return this.oArrayEditor.ready().then(function () {
				var oEditorElements = _getArrayEditorElements(this.oArrayEditor);
				oEditorElements.items[iLastItemIndex + 1].item.setExpanded(false);

				// Trigger config change by removing a different element
				QUnitUtils.triggerEvent("tap", oEditorElements.items[iLastItemIndex].deleteButton.getDomRef());

				return this.oArrayEditor.ready().then(function () {
					assert.strictEqual(
						_getArrayEditorElements(this.oArrayEditor).items[iLastItemIndex].item.getExpanded(),
						false,
						"Then the item stays collapsed"
					);
				}.bind(this));
			}.bind(this));
		});
	});

	QUnit.module("Plain Array Editor: Given an editor config", {
		beforeEach: function (assert) {
			var fnReady = assert.async();
			var mPropertyConfig = {
				tags: ["header", "numericHeader"],
				label: "SIDE_INDICATORS",
				path: "/header/sideIndicators",
				type: "array",
				collapsibleItems: false,
				itemLabel: "SIDE_INDICATOR",
				template: {
					title: {
						label: "SIDE_INDICATOR.TITLE",
						type: "string",
						path: "title",
						defaultValue: "Side Indicator"
					},
					number: {
						label: "SIDE_INDICATOR.NUMBER",
						type: "number",
						path: "number"
					},
					unit: {
						label: "SIDE_INDICATOR.UNIT",
						type: "string",
						path: "unit"
					}
				},
				maxItems: 3,
				visible: "{= ${context>/header/type} === 'Numeric' }"
			};
			var mConfig = {
				context: "/",
				properties: {
					sideIndicator: mPropertyConfig
				},
				propertyEditors: {
					"array": "sap/ui/integration/designtime/baseEditor/propertyEditor/arrayEditor/ArrayEditor",
					"string": "sap/ui/integration/designtime/baseEditor/propertyEditor/stringEditor/StringEditor",
					"number": "sap/ui/integration/designtime/baseEditor/propertyEditor/numberEditor/NumberEditor",
					"select": "sap/ui/integration/designtime/baseEditor/propertyEditor/selectEditor/SelectEditor"
				}
			};
			var mJson = {
					header: {
						type: "Numeric",
						sideIndicators:
							[
								{
									"title": "Target",
									"number": 250,
									"unit": "K"
								},
								{
									"title": "Deviation",
									"number": 42,
									"unit": "%"
								}
							]
					}
			};

			this.oBaseEditor = new BaseEditor({
				config: mConfig,
				json: mJson
			});
			this.oBaseEditor.placeAt("qunit-fixture");

			this.oBaseEditor.getPropertyEditorsByName("sideIndicator").then(function (aPropertyEditor) {
				this.oArrayEditor = aPropertyEditor[0];
				oCore.applyChanges();
				fnReady();
			}.bind(this));
		},
		afterEach: function () {
			this.oBaseEditor.destroy();
		}
	}, fnBaseTests);

	QUnit.module("Nested arrays", {
		beforeEach: function (assert) {
			var fnReady = assert.async();
			var mPropertyConfig = {
				label: "Nested Array Level 1",
				path: "/parent/parentItems",
				type: "array",
				itemLabel: "Item",
				template: {
					childItems: {
						label: "Nested Array Level 2",
						type: "array",
						path: "childItems",
						template: {
							childProperty: {
								label: "Number",
								type: "number",
								path: "childProperty"
							}
						}
					}
				}
			};
			var mConfig = {
				properties: {
					sideIndicator: mPropertyConfig
				},
				propertyEditors: {
					array: "sap/ui/integration/designtime/baseEditor/propertyEditor/arrayEditor/ArrayEditor",
					string: "sap/ui/integration/designtime/baseEditor/propertyEditor/stringEditor/StringEditor",
					number: "sap/ui/integration/designtime/baseEditor/propertyEditor/numberEditor/NumberEditor"
				}
			};
			var mJson = {
				parent: {
					parentItems: [
						{
							childItems: [
								{ childProperty: 1 },
								{ childProperty: 2 },
								{ childProperty: 3 }
							]
						},
						{
							childItems: [
								{ childProperty: 4 },
								{ childProperty: 5 },
								{ childProperty: 6 }
							]
						}
					]
				}
			};
			this.oBaseEditor = new BaseEditor({
				config: mConfig,
				json: mJson
			});
			this.oBaseEditor.placeAt("qunit-fixture");

			this.oBaseEditor.getPropertyEditorsByName("sideIndicator").then(function (aPropertyEditor) {
				this.oArrayEditor = aPropertyEditor[0].getAggregation("propertyEditor");
				oCore.applyChanges();
				fnReady();
			}.bind(this));
		},
		afterEach: function () {
			this.oBaseEditor.destroy();
		}
	}, function () {
		QUnit.test("when add button is pressed for parent array", function (assert) {
			var fnDone = assert.async();

			this.oArrayEditor.attachValueChange(function (oEvent) {
				var aValue = oEvent.getParameter("value");
				var mLastChild = aValue.slice().pop();

				assert.ok(Array.isArray(mLastChild.childItems), "then nested array is initialized with an empty array value by default");
				assert.strictEqual(mLastChild.childItems.length, 0, "then nested array doesn't contain any items by default");

				fnDone();
			});
			var oAddButton = _getArrayEditorElements(this.oArrayEditor).addButton;
			QUnitUtils.triggerEvent("tap", oAddButton.getDomRef());
		});
	});

	QUnit.module("Custom configuration", {
		beforeEach: function (assert) {
			var mJson = {
				"content": [
					{
						"foo": "bar"
					},
					{
						"foo": "baz"
					}
				]
			};

			this.oBaseEditor = new BaseEditor({
				json: mJson
			});

			this.oBaseEditor.placeAt("qunit-fixture");
			oCore.applyChanges();
		},
		afterEach: function () {
			this.oBaseEditor.destroy();
		}
	}, function () {
		QUnit.test("When adding/removing items is forbidden", function (assert) {
			var mConfig = createBaseEditorConfig({
				allowAddAndRemove: false
			});
			this.oBaseEditor.setConfig(mConfig);

			return this.oBaseEditor.getPropertyEditorsByName("sampleArray").then(function (aPropertyEditors) {
				var oArrayEditor = aPropertyEditors[0];
				assert.notOk(
					_getArrayEditorElements(oArrayEditor).addButton.getVisible(),
					"Then the add button is disabled"
				);
				assert.notOk(
					_getArrayEditorElements(oArrayEditor).items[0].deleteButton.getVisible(),
					"Then the remove buttons are disabled"
				);
			}, this);
		});

		QUnit.test("When changing the order of items is forbidden", function (assert) {
			var mConfig = createBaseEditorConfig({
				allowSorting: false
			});
			this.oBaseEditor.setConfig(mConfig);

			return this.oBaseEditor.getPropertyEditorsByName("sampleArray").then(function (aPropertyEditor) {
				var oArrayEditor = aPropertyEditor[0];
				assert.notOk(
					_getArrayEditorElements(oArrayEditor).items[0].moveUpButton.getVisible(),
					"Then the move up buttons are disabled"
				);
				assert.notOk(
					_getArrayEditorElements(oArrayEditor).items[0].moveDownButton.getVisible(),
					"Then the move down buttons are disabled"
				);
			}, this);
		});

		QUnit.test("When item labels are disabled in the plain editor", function (assert) {
			var mConfig = createBaseEditorConfig({
				showItemLabel: false,
				collapsibleItems: false
			});
			this.oBaseEditor.setConfig(mConfig);

			return this.oBaseEditor.getPropertyEditorsByName("sampleArray").then(function (aPropertyEditor) {
				var oArrayEditor = aPropertyEditor[0];
				assert.notOk(
					_getArrayEditorElements(oArrayEditor).items[0].label.getVisible(),
					"Then the labels are hidden"
				);
			}, this);
		});
	});

	QUnit.module("Integration with BaseEditor", {
		beforeEach: function (assert) {
			var fnDone = assert.async();

			var mConfig = {
				"properties": {
					"cars": {
						label: "Cars",
						path: "/cars",
						type: "array",
						itemLabel: "Item",
						template: {
							vendor: {
								label: "Vendor",
								type: "string",
								path: "vendor"
							},
							year: {
								label: "Year produced",
								type: "number",
								path: "year"
							},
							owners: {
								label: "Owners",
								type: "array",
								path: "owners",
								itemLabel: "Owner",
								template: {
									name: {
										label: "Name",
										type: "string",
										path: "name"
									},
									phone: {
										label: "Phone",
										type: "number",
										path: "phone"
									}
								}
							}
						},
						maxItems: 2
					}
				},
				"propertyEditors": {
					"array": "sap/ui/integration/designtime/baseEditor/propertyEditor/arrayEditor/ArrayEditor",
					"string": "sap/ui/integration/designtime/baseEditor/propertyEditor/stringEditor/StringEditor",
					"number": "sap/ui/integration/designtime/baseEditor/propertyEditor/numberEditor/NumberEditor"
				}
			};

			var mJson = {
				cars: [
					{
						"vendor": "VW",
						"year": 2019,
						"owners": [
							{
								"name": "Peter",
								"phone": "7570000001"
							},
							{
								"name": "Sylvia",
								"phone": "7570000002"
							}
						]
					},
					{
						"vendor": "Audi",
						"year": 1999,
						"owners": [
							{
								"name": "Sebastian",
								"phone": "7570000003"
							}
						]
					}
				]
			};

			this.oBaseEditor = new BaseEditor({
				config: mConfig,
				json: mJson
			});

			this.oBaseEditor.placeAt("qunit-fixture");
			oCore.applyChanges();

			this.oBaseEditor.attachEventOnce("propertyEditorsReady", function (oEvent) {
				this.oArrayEditor = oEvent.getSource().getPropertyEditorsByNameSync("cars")[0].getAggregation("propertyEditor");
				fnDone();
			}, this);
		},
		afterEach: function () {
			this.oBaseEditor.destroy();
		}
	}, function () {
		QUnit.test("when the editor is created", function (assert) {
			assert.strictEqual(this.oArrayEditor.isReady(), true, "then ready is triggered for empty arrays and nested arrays");
		});

		QUnit.test("when amount of elements reaches maxItems, then the `add` button should be disabled", function (assert) {
			var oAddButton = _getArrayEditorElements(this.oArrayEditor).addButton;
			assert.strictEqual(this.oArrayEditor.getValue().length, this.oArrayEditor.getConfig().maxItems);
			assert.notOk(oAddButton.getEnabled(), "then add button is disabled");
		});

		QUnit.test("when removing one item, then the add button should be enabled", function (assert) {
			var oAddButton =  _getArrayEditorElements(this.oArrayEditor).addButton;
			assert.strictEqual(this.oArrayEditor.getValue().length, this.oArrayEditor.getConfig().maxItems);

			var oRemoveButton = _getArrayEditorElements(this.oArrayEditor).items[0].deleteButton;
			QUnitUtils.triggerEvent("tap", oRemoveButton.getDomRef());

			assert.ok(this.oArrayEditor.getValue().length < this.oArrayEditor.getConfig().maxItems);
			assert.ok(oAddButton.getEnabled(), "then add button is enabled");
		});

		QUnit.test("when data is set via setJson api on BaseEditor", function (assert) {
			this.oBaseEditor.setJson({
				cars: [
					{
						"vendor": "VW",
						"year": 2019,
						"owners": []
					}
				]
			});

			return this.oBaseEditor.ready().then(function () {
				var oArrayEditor = this.oBaseEditor.getPropertyEditorsByNameSync("cars")[0].getAggregation("propertyEditor");
				var oAddButton = _getArrayEditorElements(oArrayEditor).addButton;
				assert.ok(oArrayEditor.getValue().length < oArrayEditor.getConfig().maxItems);
				assert.ok(oAddButton.getEnabled(), "then add button is enabled");

				this.oBaseEditor.setJson({
					cars: [
						{
							"vendor": "VW",
							"year": 2019,
							"owners": []
						},
						{
							"vendor": "Audi",
							"year": 1999,
							"owners": []
						}
					]
				});

				return this.oBaseEditor.ready().then(function () {
					var oArrayEditor = this.oBaseEditor.getPropertyEditorsByNameSync("cars")[0].getAggregation("propertyEditor");
					var oAddButton = _getArrayEditorElements(oArrayEditor).addButton;

					assert.strictEqual(this.oArrayEditor.getValue().length, this.oArrayEditor.getConfig().maxItems);
					assert.notOk(oAddButton.getEnabled(), "then add button is disabled");
				}.bind(this));
			}.bind(this));
		});

		QUnit.test("When BaseEditor fires ready", function (assert) {
			var oJson = {
				cars: [
					{
						"vendor": "VW",
						"year": 2019,
						"owners": []
					},
					{
						"vendor": "Audi",
						"year": 1999,
						"owners": []
					},
					{
						"vendor": "BMW",
						"year": 2020,
						"owners": []
					}
				]
			};
			this.oBaseEditor.setJson(oJson);

			return this.oBaseEditor.ready().then(function () {
				var oArrayEditor = this.oBaseEditor.getPropertyEditorsByNameSync("cars")[0].getAggregation("propertyEditor");
				var aWrappers = oArrayEditor._aEditorWrappers;

				assert.strictEqual(aWrappers.length, oJson.cars.length, "Then all wrappers are registered on the array editor");
				// Validate the ready state
				aWrappers.forEach(function (oWrapper, idx) {
					assert.strictEqual(oWrapper._fnCancelInit, undefined, "Then each wrapper has finished initialization - Wrapper" + idx);
					assert.strictEqual(
						oWrapper._getPropertyEditors().filter(function (oNestedEditor) {
							return oNestedEditor.isReady();
						}).length,
						3,
						"Then all nested editors are ready - Wrapper" + idx
					);
				});
			}.bind(this));
		});

		QUnit.test("when editing item in the nested array, then no re-rendering should take place", function (assert) {
			var fnDone = assert.async();
			var oEditorElements = _getArrayEditorElements(this.oArrayEditor);
			// Get the array editor for owners of item "VW"
			var oVWOwnersEditor = oEditorElements.items[0].editors[2].getAggregation("propertyEditor");
			var oVWOwnersEditorElements = _getArrayEditorElements(oVWOwnersEditor);
			// Get the editor for the name of the first VW owner
			var oOwnerNameEditor = oVWOwnersEditorElements.items[0].editors[0].getAggregation("propertyEditor");

			oVWOwnersEditorElements.items[0].item.attachEventOnce("expand", function () {
				var oOwnerInput = oOwnerNameEditor.getContent();

				oOwnerInput.$("inner").trigger("focus");
				assert.strictEqual(document.activeElement, oOwnerInput.$("inner").get(0));

				EditorQunitUtils.setInputValue(oOwnerInput, "Kevin");

				assert.strictEqual(
					ObjectPath.get(["cars", "0", "owners", "0", "name"], this.oBaseEditor.getJson()),
					"Kevin"
				);

				setTimeout(function () {
					oOwnerInput.$("inner").trigger("focus");
					assert.strictEqual(document.activeElement, oOwnerInput.$("inner").get(0));
					fnDone();
				});
			}.bind(this));
			oEditorElements.items[0].item.setExpanded(true);
			oVWOwnersEditorElements.items[0].item.setExpanded(true);
		});
	});

	QUnit.done(function () {
		document.getElementById("qunit-fixture").style.display = "none";
	});
});


text:
The Opus Group® Announces Plans for New Student Housing Development Near the University of Michigan
CHICAGO – The Opus Group (Opus) announced today plans for a 13-story student housing complex near the University of Michigan campus in Ann Arbor, Mich. The project is scheduled to break ground on May 15.
Named ArborBLU, the development will be built directly above Pizza House at 624 Church Street in the South University district. The luxury apartment complex will have a total of 123 units and 232 beds, offering a mixture of one-, two- and three-bedroom units.
"This is an exciting project that requires a unique skill set to implement," said Sean Spellman, vice president and general manager of Opus Development Company, L.L.C. "We have worked in close collaboration with the city of Ann Arbor and the Tice Family throughout the planning stages to ensure we're delivering a project that sets a new bar for location, amenities, technology and resident security."
ArborBLU will feature upscale amenities, including a fitness studio, study space, a rooftop patio and a club room with stadium views. The apartments will also offer in-house tanning and free 24-hour delivery from Pizza House, as well as secure bike storage and best-in-class WiFi speeds. The project will be built to meet LEED Silver certification.
"We appreciate the collaborative process with Opus and the city of Ann Arbor to fulfil the original vision to vertically expand the Pizza House property," said Dennis Tice, owner of Pizza House.
ArborBLU is scheduled for completion for the fall 2015 academic semester.
Opus Development Company, L.L.C. will be the developer, Opus Design Build, L.L.C. will be the design builder, J. Bradley Moore & Associates will be the design architect and Opus AE Group, L.L.C. will be the architect of record.
The Opus Group® is a family of commercial real estate development, construction and design companies headquartered in Minneapolis with offices and projects across the country. Opus operates as an integrated, multidisciplinary team with expertise in development, capital markets and finance; project management and construction; architecture, engineering and interior design; sales and leasing. The Opus Group includes Opus Holding, L.L.C. and its operating subsidiaries: Opus Development Company, L.L.C., Opus Design Build, L.L.C. and Opus AE Group, L.L.C. Specializing in office, industrial, retail, institutional, residential and government projects, The Opus Group has broad capabilities, deep experience and a proven design-build model that delivers solutions for customers on time and on budget. For more information, visit www.opus-group.com.
Filed Under: Student Living Development & Construction, Residential Development & Construction, Opus Development Company, L.L.C.

redpajama_set_name: RedPajamaCommonCrawl


text:
Le MC-808 est une groovebox de la société Roland Corporation.

Elle avait été annoncée en 2006 lors du NAMM. Elle succède au MC-303 et aux modèles qui ont suivi, MC-307 MC-505 et MC-909.

Elle dispose d'une polyphonie de 128 notes, et de 1024 patchs en ROM auxquels s'ajoutent 256 patchs en RAM, éditable par un grand écran LCD, mais aussi via un port USB à partir d'un ordinateur.

Le séquenceur peut gérer jusqu'à 16 pistes. Le MC-808 peut importer et exporter des échantillons au format WAV ou AIFF.

On peut entendre le MC-808 par exemple dans l'album Téo & Téa de Jean-Michel Jarre.

Notes et références

MC-808

redpajama_set_name: RedPajamaWikipedia


text:
Watch on FANDOR
Director: Jacques Richard
This documentary explores the life of Henri Langlois, the first film archivist, who dedicated his life to collecting movies from all over the world and preserving them for future generations. Archival footage and interviews with colleagues, friends and family tell the story of how Langlois' celluloid passion lead him to hide scores of films during the Nazi occupation of France in World War II, and how he helped establish a cinematic museum and theater that has influenced countless filmmakers.
Henri Alekan
Henri Cartier-Bresson: The Impassioned Eye
The Last Mogul
Princes of the Palace
Watch Henri Langlois: The Phantom of the Cinematheque
7-Days Free Trial
Other providers Hide
More Like Henri Langlois: The Phantom of the Cinematheque


The Bulletin Board located in the lobby of the David E. Carter Maricopa county/Town of Wickenburg Municipal Building addressed as 155 North Tegner Street.
The inside Bulletin Board located at the Wickenburg Public Library located at 164 East Apache Street.
Notices of the following public bodies of the Town of Wickenburg shall be posted at the above locations, and additional notices required by law may be posted in other locations in accordance with applicable ordinances and/or State Statutes.
Any Other Board, Commission, or Committee Hereafter Created By Law.


text:
Q: AngularJS ng - repeat, ng - model on input text strange behaviour i am new to AngularJS, i try and do the code below
var app = angular.module('SomeApp', []);

app.controller('QuotationController', function($scope) {

   $scope.init = function(){
     $scope.chargableDescription = [""];
     $scope.chargablePrice = [];
     $scope.chargableQuantity = [];
     $scope.chargableTotal = [];

   }

   $scope.chargableInput = function($last){

     if ( $last ) {
       $scope.chargableDescription.push([""]);
     }
   }
});

Basically, what i am trying to achieve here is to insert the whole group of input when user input something on the last chargableDescription field.

                 Chargable Item

                 <textarea name="chargable[]" class="form-control dynamic chargable" placeholder="Chargable Description" ng-model="chargableDescription[$index]" ng-keypress="chargableInput($last)"> </textarea>

                 <input type="number" class="form-control" step="0.01" name="chargable-price-1" placeholder="Chargable Price" ng-model="chargablePrice[$index]">

                 <input type="number" class="form-control" name="chargable-quantity-1" placeholder="Chargable Quantity" ng-model="chargableQuantity[$index]">

                 <input type="number" class="form-control" step="0.01" name="chargable-total-1" placeholder="Chargable Total" readonly ng-model="chargableTotal[$index]" >

It does the trick, however, i wonder why when i do any input on the textarea, the cursor will be gone once i input a character.
How to remove this behaviour and what would be the factor that causing this behavior?
UPDATE :
SOLVED
I added ng-model-options = { updateOn : 'blur' } and it seems like it solves the issue

A: It works for me https://plnkr.co/IV9t4fhln5v3l81NHaPC
What's your Angular version?
(function() {

  'use strict';

  var app = angular.module('SomeApp', []);

  app.controller('QuotationController', function($scope) {

    $scope.init = function() {
      $scope.chargableDescription = [""];
      $scope.chargablePrice = [];
      $scope.chargableQuantity = [];
      $scope.chargableTotal = [];

    }

    $scope.chargableInput = function($last) {

      if ($last) {
        $scope.chargableDescription.push([""]);
      }
    }

    $scope.init();
  });

})();

redpajama_set_name: RedPajamaStackExchange


Buy Packing Peanuts and Shipping Peanuts | Quantum Industrial Supply, Inc.
Loose fill packing peanuts also known as shipping peanuts will fill the empty spaces in packages containing fragile items. They will protect your items in shipping containers and eliminate the need for custom fit boxes. Specifically they'll do this by filling up the empty space and not allowing the items to move. As a result this will significantly decrease the risk of damage during transportation.
Our packing peanuts are nontoxic and reusable. Our selection includes anti-static and biodegradable options. By choosing the biodegradable option over regular Styrofoam packing you help keep Styrofoam out of the environment.
We also offer packing peanut dispensers to help you prepare your items for shipping.


Celeris Forums • View topic - LIST OF HAMACHI NETWORKS!
First hi guys and thank you for the great forum!
I had problems with newer Log Me in Hamachi2 vesrions - not possible to oin or create network thats why I stick to older stable version.
Re: LIST OF HAMACHI NETWORKS!
No need to pay for static real IP.
No need to buy expensive router.
Tunngle is easier and simpler imo.
I was long time active on king.com 8ball table but i dont have more fun there ))):.
Now I am inactive from pool online sence 1 - 2 years.
I found this game when i was searching some vidios on youtube and i download the demo.Game seems very good!!
If there are a way to test and play on windows vista can you help me pleasd how can i install and play via hamachi ?
PLEASE make MORE AND NEW NETWORKS!!!
Old networks are not working, FULL with INNACTIVE PLAYERS or PASSOWRDED !!!


text:
Tag: jean-pierre blackburn
Liveblogging the cabinet shuffle
9:52AM: Rob Nicholson, Gail Shea, Leona Aglukkaq, Peter Kent and Peter van Loan, Chuck Strahl show up to Rideau Hall
9:52AM: And Christian Paradis, Jim Prentice. CTV has speculated Prentice to environment.
9:54AM: John Baird has arrived.
9:55AM: Some MPs showing up in Blue Line cabs, some in airport cabs, some in their own cars.
9:55AM: Rona Ambrose shows up. Rumour is she'll move to HRSDC.
10:00AM: Lynne Yelich is at Rideau Hall and Stockwell Day
10:01AM: James Moore arrives
10:03AM: Rahim Jaffer has shown up. Probably to support his newlywed wife Helena Guergis.
10:06AM: Jim Flaherty arrives with wife Christine Elliot.
10:08AM: The Prime Minister's motorcade makes its way up to Rideau Hall.
10:16AM: Rumour is that Jason Kenney is moving to Citizenship and Immigration. You heard it here first.
10:25AM: Cabinet embargo about to end. Should have the list up soon.
10:31AM: Other MPs at Rideau Hall: Bev Oda, Peter MacKay, Keith Ashfield, Gary Lunn, Chuck Strahl, Gordon O'Conner, Tony Clement, Gerry Ritz, Stephen Fletcher, and Lawrence Cannon.
10:40AM: Here we go. Here comes cabinet into the hall.
10:44AM: Nicholson stays in Justice, no surprise there.
10:45AM: Greg Thompson at Veterans Affairs, Chuck Strahl at INAC, Vic Toews at Treasury Board
10:48AM: Bev Oda at CIDA, Flaherty at Finance, Gerry Ritz at Agriculture
10:50AM: Jean-Pierre Blackburn to Revenue. Aglukkaq to Health. Finley to HRSRC.
10:55AM: Raitt to NRCan, Day to International Trade and Asia-Pacific Gateway.
10:55AM: Ambrose to Labour.
10:58AM: Prentice to environment. The could be to negotiate new regs with the provinces when it comes to GHG emissions. Alberta will need to sit down with the federal government soon to finalize the new regulations for the oil and gas sector.
11:00AM: Baird goes to Transport/Infrastructure.
11:01AM: Cannon goes to Foreign Affairs.
11:02AM: Tony Clement goes to Industry.
11:05AM: Josee Verner to intergovernmental affairs.
11:05AM: Jay Hill to House Leader.
11:05AM: PVL to Public Safety.
11:07AM: Jason Kenney to Citizenship, Immigration and Multiculturalism.
11:08AM: Christian Paradis to Public Works.
11:09AM: James Moore to Heritage and Official Languages.
11:14AM: Gail Shea to Fisheries.
11:16AM: Gary Lunn to Sport.
11:17AM: Gordon O'Connor to Government Whip.
11:18AM: Helena Guergis to Status of Women.
11:19AM: Diane Ablonczy stays at Small Business.
11:20AM: Rob Merrifield to Minister of State (Transport).
11:22AM: Lynne Yelich to Western Economic Diversification.
11:24AM: Steven Fletcher to Democratic Reform.
11:27AM: Gary Goodyear to Minister of State for Science and Technology. Goodyear will work closely with Minister of Industry Tony Clement.
11:29AM: Denis Lebel to economic development for Quebec. Lebel will be the cash man for Quebec and this will help him electorally.
11:31AM: Keith Ashfield to ACOA.
11:32AM: Peter Kent to Secretary of State for Foreign Affairs (Americas).
Posted on October 30, 2008 Categories OtherTags acoa, agriculture, asia-pacific gateway, bev oda, blue line taxi, cabinet, christian paradis, christine elliot, chuck strahl, cida, citizenship and immigration, democratic reform, denis lebel, diane ablonczy, diane finley, Environment, finance, fisheries and oceans, Foreign Affairs, gail shea, gary goodyear, gary lunn, gerry ritz, gordon o'connor, greg thompson, health, helena guergis, heritage, house leader, hrsdc, indian affairs, industry, infrastructure, intergovernmental affairs, james moore, jason kenney, jay hill, jean-pierre blackburn, jim prentice, john baird, josee verner, justice, keith ashfield, labour, lawrence cannon, leona aglukkaq, lisa raitt, live blog, lynne yelich, minister of state, nrcan, official languages, peter kent, peter mackay, peter van loan, public safety, public works, rahim jaffer, revenue, rideau hall, rob merrifield, rob nicholson, rona ambrose, science and technology, small business, status of women, stephen fletcher, stephen harper, stockwell day, tony clement, Trade, transport, treasury board, veteran's affairs, vic toews, western economic diversification, whip
Liberal candidate of record is a Conservative on the books
Meet Louise Boulanger, the Liberal candidate for the Quebec by-election in the riding of Roberval–Lac-St-Jean.
Here is a picture of Jean-Pierre Blackburn, the Conservative federal government's minister of labour:
Here is a picture of Denis Lebel, the Conservative candidate for the same by-election for the riding of Roberval–Lac-St-Jean:
Here is a picture of Louise Boulanger, Denis Lebel, and Jean-Pierre Blackburn from the photo gallery of Denis Lebel's website.
The photo shows Lebel and Boulanger embracing with Blackburn in the foreground. Nothing too out of the ordinary, no?
There's nothing wrong with a bit of friendly exchange between Conservative and a Liberal, of course. However, Boulanger is actually a Conservative Party member as suggested by the cover of La Presse this morning which contains the headline "ELECTION PARTIELLE: Louise Belanger, la candidate libéale dans Roberval est membre en règle du Parti… conservateur (By-election: Louise Belanger, the Liberal candidate in Roberval is technically a member of the Conservative Party)"
If true, Boulanger would have signed a form that includes the statement that she "actively support[s] the founding principles of the CPC" which are listed here.
However, Stephane Dion later "nominated" Boulanger to contest the riding of Roberval–Lac-St-Jean for the upcoming by-election, as a Liberal!.
Consider this quote from Boulanger concerning the Liberal Party having its affairs in order:
Je suis contente d'arriver à ce moment-ci parce que le ménage a été fait. Le parti est plus rigoureux sur la sélection des candidats. Notre chef Stéphane Dion est exigeant envers lui-même et exigeant envers les autres. Il désire s'entourer de gens fonceurs. Le Parti libeacute;ral est à son meilleur pour servir la population
(I am happy to have come to this moment here because the cleanup has been done. The party is more rigorous in the selection of candidates. Our leader Stephane Dion is demanding of himself and of others. He wants to be surrounded by go-getters. The Liberal Party is at its best to serve the population.)
If Boulanger is a member of the Conservative Party, that rigorous selection process must be in need of review.
Does the Liberal Party Constitution forbid members of other parties from contesting elections for the Liberal Party?
Posted on August 25, 2007 Categories OtherTags by-elections, denis lebel, jean-pierre blackburn, la presse, liberal party, louise boulanger, Quebec, roberval-lac-st. jean, stephane dion


SWTOR Guides [Archive] - OwnedCore - World of Warcraft Exploits, Hacks, Bots and Guides.
Patch Client without an account!
Video Profession Guide for Biochem & Bio-analysis!
[Tips&Trix] Things you may not know but will find useful.
Slicing Data (WIP) -- What to slice for maximum profit!
Tatooine Datacrons: Dont waste 45 mins.
Good Farming Spot I've Used to Make a Few Million Credits.
How to obtain a 'Megenta Adegan Crystal' - Full walkthrough!
Corellia Credit farming v2 (100k+/hr)!
Increased "Drop Rate" On Champion/Battlemaster Bags!
Soa / Bonetrasher / Foreman Crusher / Heavy Fabricator nightmare mode videos.
Create Mouseover Macros in SWTOR!
[Guide] Fix for crash to desktop error in swtor.
Comprehensive list of SWTOR .ini tweaks!


text:
Alexander van Aphrodisias (ook Titus Aurelius Alexander) was een oud-Grieks Peripatetisch filosoof, afkomstig uit de Griekse stad Aphrodisias, die leefde aan het einde van de 2e eeuw en het begin van de 3e eeuw na Chr. Hij is vooral bekend als de meest geroemde commentator van de werken van Aristoteles, wat hem onder meer de bijnamen "De tweede Aristoteles" en "De exegeet" opleverde.

Biografie
Alexander groeide op in zijn geboortestad Aphrodisias in Carië. Hij was de zoon van Titus Aurelius Alexander die filosoof was in zijn thuisstad. Dit weten we van een opschrift op de basis van een standbeeld dat Alexander liet optrekken voor zijn vader in Aphrodisias. Hij verhuisde naar Athene aan het einde van de 2e eeuw. Daar ging hij in de leer bij de twee Stoïcijnse - of mogelijk Peripatetische filosofen Sosigenes de Peripateticus en Herminus. Misschien was hij ook een tijdlang de leerling van Aristoteles van Mytilene, al wordt dit door sommigen weerlegd. In Athene werd Alexander hoofd van het Lyceum en doceerde hij in de Peripatetische filosofie. Alexanders uitgaven van De Fato, opgedragen aan Septimius Severus en Caracalla uit dank aan hen voor zijn positie in Athene, geven aan dat de publicatie plaatsvond tussen 198 en 209.

Werk

Commentaren
Alexander schreef diverse commentaren bij de werken van Aristoteles, waarin hij probeerde te ontsnappen aan syncretistische tendensen en terug te keren naar de oorspronkelijke pure doctrines van Aristoteles zelf. Er zijn commentaren van Alexanders hand overgeleverd van de Analytica Priora (enkel boek I), Topica, Meteorologica, De Sensu et Sensibilibus en Metafysica (boek 1 t.e.m. 5, tezamen met een synopsis van zijn commentaren van de overige boeken).

In april 2007 raakte bekend dat door middel van beeldanalyse een vroege commentaar op Aristoteles' De Categoriae ontdekt was in de Archimedespalimpsest. Volgens prof. Robert Sharples van de University College London kan deze commentaartekst toegeschreven worden aan Alexander van Aphrodisias als meest waarschijnlijke auteur.

Eigen traktaten
Naast commentaarteksten zijn er ook enkele originele werken van Alexander overgeleverd. Het belangrijkste onder deze werken is een traktaat getiteld "Over geloof" (De Fato), waarin hij ingaat tegen de Stoïcijnse stelling van noodzakelijkheid. Een ander werk draagt de titel Over de ziel (De Anima), waarin hij argumenteert dat de onontwikkelde rede in de mens van materiële aard is (nous hulikos) en onscheidbaar is van het lichaam. Hij gaat ook in strenge bewoordingen in tegen de leerstelling van de onsterfelijkheid van de ziel. Hij identificeert het actieve intellect (nous poietikos), waarlangs het potentiële intellect in de mens wordt geactualiseerd, met God.

Invloed
 De commentaren die Alexander schreef bij de teksten van Aristoteles genoten een hoog aanzien bij de Arabieren, die vele van deze commentaren vertaalden. Opvolgers van Alexander zorgden ook voor vertalingen in het Latijn en het Syrisch.
 In 1210 werd in Parijs door de Kerk een condemnatie uitgeschreven, waarin mogelijk de teksten van Alexander en anderen werden verbannen.
 Ten tijde van de vroege renaissance werd Alexanders doctrine met betrekking tot de onsterfelijkheid van de ziel overgenomen door de theoloog Pietro Pomponazzi en diens opvolger Cesare Cremonini. Om deze reden staat hun school ook wel bekend als de school van de alexandristen.
 De band van Alexander, een optisch fenomeen, is vernoemd naar Alexander van Aphrodisias.

Voetnoten

Literatuur
  (1970). "Alexander of Aphrodisias". In: Dictionary of Scientific Biography 1. New York: Charles Scribner's Sons. 117-120. ISBN 0684101149.
  (2011). La sillogistica di Alessandro di Afrodisia. Sillogistica categorica e sillogistica modale nel commento agli "Analitici Primi" di Aristotele. Hildesheim-New York: G. Olms. ISBN 9783487146140

Externe link
 Artikel over Alexander van Aprodisias in de Stanford Encyclopedia of Philosophy

Hellenistisch filosoof
Peripatetisch filosoof
Persoon in de 2e eeuw v.Chr.


text:
Tyler Duncan Betting Tips & Odds to Win The 2022 RBC Heritage – April 14-17
Media by Associated Press: With his tee flying next to him
Tyler Duncan enters the 2022 RBC Heritage at Harbour Town Golf Links with +25000 odds after missing the cut in his most recent appearance at this tournament in 2021. Before Duncan tees off in Hilton Head, South Carolina, let's analyze his recent performances to help you place your best bets.
Last 4 Tournaments: Tyler Duncan
March 31 – April 3 Valero Texas Open MC 70-82 (+8) — $0
March 24-27 Corales Puntacana Championship 28 71-71-69-70 (-7) 10 $23,749
March 17-20 Valspar Championship 25 69-69-65-73 (-8) 9 $65,910
Recent Form Insights: Tyler Duncan
Duncan has not finished inside the top 20 in his past four events, with an average finish of 29th.
He has made three cuts in his past four tournaments.
In his past four events, Duncan carded a score better than average in two of those outings.
He has an average score of -7 across his past four events.
Over his last 14 rounds, Duncan has finushed below par 10 times, while also carding eight rounds with a better-than-average score.
He has carded the best score of the day in one of his last 14 rounds, while scoring among the top five in two rounds.
Last 4 Tournaments Breakdown: Tyler Duncan
Duncan shot above average on the eight par-3 holes at the Valero Texas Open, averaging 2.88 strokes to finish in the 80th percentile of competitors.
He averaged 4.4 strokes on par-4 holes (of which there were 20) at the Valero Texas Open, which landed him in the first percentile among the competitors on par 4s.
On the eight par-5 holes at the Valero Texas Open, Duncan shot better than only 3% of the golfers (averaging 5.13 strokes per hole).
Duncan carded a birdie or better on one of the eight par-3 holes at the Valero Texas Open, underperforming compared to the field average of 1.6.
On the eight par-3 holes at the Valero Texas Open, Duncan did not record a bogey or worse (the other participants averaged 1.9).
Duncan had fewer birdies or better (two) than the field average of 5.1 on the 20 par-4 holes at the Valero Texas Open.


text:
Top 3 Play'n GO Online Slots with Heavy Metal Themes
Leave a Comment / Heavy Metal / By thrash71
Heavy metal music can also be simply called as 'metal'. It evolved as a genre of rock music during the period between late 1960s and early 1970s. In those times, it was largely popular in the United States and the United Kingdom. Roots of this genre can be found in blues, acid, and psychedelic styles …
Top 3 Play'n GO Online Slots with Heavy Metal Themes Read More »
4 Best Fusion Genres of Death Metal
Leave a Comment / Death Metal / By thrash71
A sub-genre of heavy metal music, death metal evolved from early black metal and thrash metal in the mid-1980s. Celtic Frost, Kreator, and Venom were some of the bands that influenced the creation of this heavy metal sub-genre. It was not until the late 1980s that it gained more attention in the media. Death metal …
4 Best Fusion Genres of Death Metal Read More »
7 Best Bands From The Death Metal Genre
Over the past few decades since it was first born, death metal has evolved a lot. Just like the other genres of heavy metal, it has made some considerable shifts in sound. This form of heavy metal music has now diversified into many different sub-genres. Deathcore, blackened death metal, and melodic death are some of …
7 Best Bands From The Death Metal Genre Read More »
The Unmistakable Features of Death Metal Music
Death metal had achieved tremendous popularity across the world during the early 1990s. This was made possible largely owing to the commercial success of bands like Cannibal Corpse and Morbid Angel. As a result, a strong rivalry emerged between the Swedish death metal and Norwegian black metal scenes. Apparently, musicians of Norwegian black metal were …
The Unmistakable Features of Death Metal Music Read More »
A Quick Look At The History of Death Metal
Death Metal came to the fore during the mid-1980s, evolving from the early black metal and thrash metal. It is a sub-genre of heavy metal music and involves growling vocals and some aggressive drumming. This heavy metal sub-genre also includes double kick and blast beat techniques. It makes use of distorted and low-tuned guitars, employing …
A Quick Look At The History of Death Metal Read More »
Doom Metal and Its Prominent Features
Leave a Comment / Doom Metal / By thrash71
A sub-genre of heavy metal music, Doom metal uses slower tempos and a much heavier or thicker sound. It also makes use of low-tuned guitars. This heavy metal sub-genre is greatly influenced by Black Sabbath's early works. Black Sabbath were an English band who had developed a prototype for doom metal. The music and lyrics …
Doom Metal and Its Prominent Features Read More »
Leave a Comment / Uncategorized / By thrash71
Welcome to the world of dread, despair, and doom! Eye of Solitude gives you a glimpse of the doom metal genre, which was influenced by Black Sabbath's early works. Here, you'll have the rare opportunity to get some excellent insights into the history of death/doom metal. You'll also get to know some big names behind …
Homepage Read More »
Heavy Metal Music and Its 4 Best Sub-genres
In the late 1960s, a new form of rock music called 'Heavy Metal' emerged. Simply called 'Metal', this genre of rock music had its roots in acid rock, blues rock, and psychedelic rock. The bands involved in heavy metal used vocals with thick and massive sound. Other features included extended guitar solos, loudness, and emphatic …
Heavy Metal Music and Its 4 Best Sub-genres Read More »
The History of Doom Metal and the Emergence of Death-Doom
Leave a Comment / Death Metal, Doom Metal / By thrash71
The roots of doom metal can be traced back to the days of Black Sabbath's early music. They were an English rock band, formed in 1968 in Birmingham. Their music is heavily inspired by blues. However their music created a doomy atmosphere with Tony Iommi's loud guitar and the dark and pessimistic lyrics. Their music …
The History of Doom Metal and the Emergence of Death-Doom Read More »
5 Best Fusion Genres of Doom Metal
Doom metal is often considered a slow but extreme subgenre of heavy metal music. This form of rock music is often focused on down-tuned and heavy guitars. It involves slower tempos and the overall feel created is of a bleak atmosphere. The doom metal vocals can range from clean and operatic to the more extreme …
5 Best Fusion Genres of Doom Metal Read More »


text:
Lin Lie (Chinese: 林烈) is a Chinese superhero originally appearing in web manhua and later American comic books published by Marvel Comics. Created by artist Gunji and writer Shuizhu, Lin first appeared in the Chinese digital series Warrior of the Three Sovereigns (Simplified Chinese: 三皇斗战士) #1 (May 2018) as Sword Master, a descendant of Fu Xi who wields the mystical Sword of Fu Xi. Lin made his American comics debut in War of the Realms: New Agents of Atlas #2 (May 2019), where he joined the Agents of Atlas. After losing his Sword in Death of Doctor Strange: White Fox #1 (December 2021), Lin Lie became the new Iron Fist in Iron Fist vol. 6 #1 (February 2022).

Publication history
Lin Lie, along with the character Aero were created for the Chinese market in a collaboration between Marvel and NetEase to attract more readership in China and across East Asia.

After debuting in Chinese digital comics in 2018, Sword Master made his American comics debut in War of the Realms: New Agents of Atlas by writer Greg Pak and artist Gang Hyuk Lim before starring in his own solo series, titled Sword Master, written by Pak and illustrated by Ario Anindito. The Sword Master series also featured republications of the Warriors of Three Sovereigns series Lin debuted in, with translations done by Pak. Sword Master would continue to have regular appearances in Agents of Atlas.

In 2022, Lin Lie made his debut as Iron Fist in a five issue miniseries written by Alyssa Wong and illustrated by Michael YG and Sean Chen. The miniseries was followed up with the one-shot A.X.E.: Iron Fist #1 as part of the A.X.E.: Judgment Day crossover event.

Fictional character biography

Warriors of Three Sovereigns
Lin Lie is a college student from Shanghai who receives a mysterious sword from his archaeologist father, who went missing along with Lie's older brother Feng shortly afterwards. One year after his family's disappearance, Lie is attacked by a demon at his apartment after receiving a mysterious red orb contained in a puzzle box. The sword Lie's father entrusted to him moves on its own to save Lie from the demon, which is then destroyed by Ji Shuangshuang, a demon hunter. Shuangshuang reveals that the sword is the Sword of Fu Xi, one of three sacred weapons used by the Yellow Emperor and the clans of the Three Sovereigns to seal the evil god of war Chiyou in the far past. Shuangshuang explains that she and Lie are the descendants of Nü-wa and Fu Xi, respectively, and that the Sword and the red orb containing a piece of Chiyou's soul were removed from one of Chiyou's three tombs, weakening his seal and allowing several of his demon minions to be unleashed around the world. Believing Lie to be too incompetent to protect the orb, Shuangshuang takes it with her. Lie gives chase but is attacked by Baron Mordo, who attempts to take the Sword for himself, but is driven away by Doctor Strange. Strange offers to keep the Sword for safekeeping but relents after Lie explains his lineage and needing the Sword to find his missing father, using his magic to help Lie reunite with Shuangshuang. Together, Lie and Shuangshuang destroy the remaining demons. Lie travels with Shuangshuang and his roommate Ah Cheng to the Nü-wa Clan's headquarters at Gansu, where he is greeted by Shuangshuang's grandmother and the Nü-wa chief Ji Xiangyun. As Lie, his father and brother are the only known descendants of Fu Xi, Xiangyun has Lie trained under Shuangshuang to prepare against Chiyou and his demon army.

Agents of Atlas
Now going by the name Sword Master, Lie begins a superhero career while fighting the forces of Chiyou and searching for his missing family. During the "War of the Realms", Sword Master and several other Asian superheroes are summoned by Brawn's teleporter to Seoul to help the New Agents of Atlas defend Asia from Queen Sindr and her Fire Goblin forces from Muspelheim. Sword Master and the New Agents of Atlas take Sindr and her army in Northern China and later help Captain Marvel defeat her and her remaining forces at the Great Wall of China near Beijing. After Sindr's liege Malekith is defeated, Sword Master joins the Agents of Atlas.

Sword Master runs into his Atlas teammate Shang-Chi in New York City while searching for his father. Noticing the upstart hero's inexperience and recklessness, Shang takes Lie under his wing to improve his skills. The two are reunited with the other Atlas agents when Flushing and other Asian, Pacific and predominantly Asian cities outside of Asia are merged into the portal city of "Pan" Tech by mogul Mike Nguyen of the Big Nguyen Company. Sword Master and Shang-Chi are later confronted by Ares, who attempts to take the Sword of Fu Xi to rescue his kidnaped drakon son Ismenios, who Ares believes was captured by another god. Shang-Chi makes a compromise to Ares: in exchange for Sword Master and Shang-Chi helping him, Ares would help find Lie's missing father. Ares accepts and use Pan Portals to track Ismenios to a temple in Madripoor, where they encounter Davi Naka, the Mother Goddess of Madripoor. Naka reveals that Ismenios attempted to plunder Atlantis's treasure hoard during the absence of its sea serpent guardian, but was caught by Namor. Due to her duty to protect all dragons, Naka rescued Ismenios from Namor's wrath and imprisoned the young drakon in her temple for his protection and to placate the king. Naka further warns the four that despite her efforts, Namor is still outraged over the disappearance of his dragon and implores them to find her.

Sword Master and the Atlas Agents help assist Pan's citizens, including defending the city from invading wyverns and sea serpents and protecting Madripoorean refuges from harassment from the Pan Guard. Suspicious by these evengs, Sword Master joins several of his teammates into infiltrating Nguyen's personal tower, where they discover that the Big Nguyen Company had captured Atlantis' missing dragon and were harvesting her scales to power Pan's portals. Before a decision could be made about releasing the dragon, Namor emerges from the waters off of Pan's coast to reclaim his stolen dragon, kickstarting a war between Pan and Atlantis.

In the "Atlantis Attacks" storyline, Sword Master and the other New Agents of Atlas are summoned by Brawn during his confrontation with Namor. Namor warns the group to return Atlantis' dragon in a day or else face the wrath of Atlantis before retreating. After the skirmish, Sword Master and the other New Agents are introduced to the original Agents of Atlas by Atlas Foundation head Jimmy Woo. When Woo sends Namora, Venus, Aero and Wave to Atlantis for a diplomatic mission, Brawn discretely orders Sword Master and Shang-Chi to spy on Namora, due to her familial ties with Namor. The dragon is eventually released from captivity, but upon arriving home, she unexpectedly goes berserk and attacks the underwater kingdom. Sword Master witnesses the destruction caused by the dragon and Shang-Chi relays to Amadeus that Atlantis' scientists discovered an implant embedded in the dragon's scales to be the source of her behavior and that Namor believes Amadeus to be behind the sabotage, prompting the king to resume his assault on Pan. When Brawn is forcibly transformed into the Hulk and put under Nguyen's control with Sirena tech in a last-ditch effort to destroy Atlantis, Sword Master and Shang-Chi are able to remove the device from Amadeus, freeing him from Nguyen's control and reverting him back into Brawn. When the conflict between Pan and Atlantis is peacefully resolved, Brawn and Shang-Chi leave the team after admonishing Woo for using the team as his pawns, but Sword Master remains with the Agents of Atlas.

During the "King in Black" event, Sword Master initially defends Shanghai from invading symbiote dragons with Aero and the Black Knight, who had been abandoned in Shanghai and separated from his Ebony Blade, but abandons his mission after realizing that the symbiotes were minions of Knull rather than Chiyou, believing the task to be beneath him. Angered by Lie's arrogance, the Sword of Fu Xi abandons him for the Black Knight, which incenses Sword Master as he dismisses the Black Knight as a "psychotic American" unworthy of wielding the Sword. While using the Sword of Fu Xi, the Black Knight succumbs to madness, which prompts the Sword to return to Lie. As Sword Master and the Black Knight fight over the Sword, a symbiote dragon ensnares them with its tendrils, which also mentally connects them to Knull, who expresses his desire for their respective swords and ruthlessly mocks the two for their ignorance of their weapons' true histories. The Sword of Fu Xi uses the opportunity to use its flames to burn the Black Knight's hand, returning to Sword Master and freeing the two from Knull's grasp just as a swarm of symbiote dragons amalgamates into Knull's avatar, taking on a gigantic appearance of Chiyou. Sword Master helps the Black Knight recover the Ebony Blade and two use their respective swords to destroy the avatar with Aero's help.

When the "Death of Doctor Strange" prompts legions of demons to invade parts of the world, Sword Master is sent to Seoul by Woo to assist his teammate White Fox with taking down a demonic kumiho that had been terrorizing the South Korean countryside. While fighting the kumiho, the Sword of Fu Xi is destroyed by the kumiho who then threw Sword Master into a ravine. Although White Fox is able to slay the demon, she, the Agents of Atlas and South Korea's Tiger Division are unable to find Lie, with White Fox recovering only a single shard of the Sword, causing them to presume he died. Due to the Sword of Fu Xi's destruction, the seals on Chiyou's three tombs further weakened, prompting more of his demon minions to attack cities around the world.

Wielding the Iron Fist
Lin Lie miraculously survives and washes ashore to K'un-Lun, where the recently reincarnated dragon Shou-Lao bestows him with his chi, saving Lie's life and making him the new Iron Fist. With several of the Sword's shards embedded in his hands, Lie resolves to find the remaining pieces and reforge the Sword to prevent Chiyou's release. During his hunt for the shards, Lin Lie briefly encounters his predecessor Danny Rand, who had previously given up the Iron Fist, in Flushing and helps him fight off several minions of Chiyou. Unaware of Lie's identity but happy that Shou-Lao chose a new champion, Danny inquires Lie about his background and offers to help him with his training, but Lie rebuffs and summons a portal back to K'un-Lun Lie is later accompanied by Mei Min, a friend he made in K'un-Lun whose family hosts him, during his travels and helps him recover the remaining shards while fighting the demonic forces of Chiyou. Despite being chosen as the new Iron Fist, Lie's ascension is controversial amongst several K'un-Lun citizens as he is not only the third consecutive outsider to become the Iron Fist, he did not go through the required trials to earn Shou-Lou's chi. Due to the shards of the Sword of Fu Xi embedded in his hands, Lie cannot summon the Iron Fist consistently and is left in a constant state of pain, which makes him a target of ridicule and scorn by several detractors, including his rival Yang Yi. After Lie expresses to Min about how unworthy he is as Iron Fist due to his handicap and unwanted status, the Yu-Ti of K'un-Lun, Sparrow, takes Lie under her wing to help him overcome his struggles and regain his confidence. One day during his training, the shards in Lie's hands suddenly begin radiating with burning energy and leaving him writhing in pain, causing Lie to realize that the first tomb of Chiyou had been destroyed An empowered demon minion of Chiyou manages to bypass K'un-Lun's defenses attempts to steal the Sword's remains at Min's home, but Lie injects his arms with them to thwart the demon and uses their extra power to kill him, who reveals with his dying breaths that Lie's brother Feng was the one who destroyed the tomb and that he was waiting for him at the second tomb. Lie takes a portal to the second tomb with Min and Yi but after arriving they encounter Fat Cobra and the Bride of Nine Spiders. Tasked by Rand to track Lie down, the two Immortal Weapons decide to test the new Iron Fist out by fighting him. Severely outmatched and running out of time, Lie flees from the fight to the Nü-wa Clan's headquarters, but is too late to prevent its destruction from Feng and Chiyou's minions. Unable to summon the Iron Fist, Lie is quickly defeated by Feng. Lie rejects Feng's offer to join him, who proceeds to immerse himself with Chioyou's magic to destroy Lie and his allies. Guided by Shou-Lao's spirit, Lie embraces his identities as Sword Master and Iron Fist, allowing him to summon the full power of the Iron Fist and remove the shards from his hands into a restored blade, which Lie uses to wound Feng. When Sparrow arrives with K'un-Lun's warriors, Feng steals her portal to K'un-Lun, where Chiyou's third tomb is located. After the battle, Lie accepts Danny's offer to train him.

During the "Judgement Day" storyline, Lie takes a flight to Seoul to rendezvous with White Fox but is visited midflight by Loki, who reveals that he is in league with Feng. Provoked by Loki's arrogance, the Progenitor casts judgement on the two by having them partake in trials within their minds. During Loki's judgement, Lie rescues him from being pinned down by a vision of Mjolnir by using the aura from the Sword of Fu Xi to lift it. During Lie's judgement, the Progenitor appears as Shou-Lou and challenges Lie to take his heart to officially earn his title as Iron Fist. Lie is able to defeat Shou-Lou with Loki's help but instead of taking the dragon's heart, Lie asks Shou-Lou to give it to him. Lie receives the mark of the Iron Fist on his right arm and passes the Progenitor's judgement. Lie and Loki find themselves back on the flight as if nothing happened but the mark still remains on Lie's arm. Before Lie could demand Loki to take him to Feng in K'un-Lun, Loki teleports away from him. Lie eventually arrives in Seoul and reunites with White Fox.

Powers and abilities
As the descendant of Fu Xi, Lin Lie can wield the Sword of Fu Xi and access its divine powers. When activated, the Sword generates mystical green flames, which can be launched as projectiles or be used to increase the cutting power and range of the blade. Due to its ability to move on its own, the Sword is capable of allowing Lin to fly at short distances. Although originally forged to destroy Chiyou and his demon minions, the Sword of Fu Xi is shown to be just as effective against other demons and undead.

A noticeable trait is that the Sword of Fu Xi is sentient, and has the ability to move on its own. While the Sword has gone out of its way to protect Lin from threats, it has also defied him when he showed undesirable traits, such as cowardice or arrogance. In some extreme cases, allowed itself to be wielded by non descendants of Fu Xi.

Despite the Sword being shattered, its broken shards can still project its mystical green flames, which are still effective against Chiyou's minions. Lin makes use of the shards embedded in his hands to enhance his punches and infuse weapons with the Sword's flames. Lin later gains the ability to generate blades of the Sword that protrude from his right fist.

After being bestowed with the chi of the dragon Shou-Lao the Undying, Lin gained the power of the Iron Fist, allowing him to summon and focus his chi to enhance his natural abilities to extraordinary levels. Like every Iron Fist before him, Lin can concentrate his own chi and the superhuman energy from Shou-Lao's heart into his hands, which manifests into a supernatural glow around his hands and fists that can strike with superhuman hardness and impact, while keeping them impervious to pain and injury. Lin can focus his chi inward to heal himself from injury and pain.

Due to the broken shards of the Sword of Fu Xi embedded in the flesh of his hands, Lin Lie is in a constant state of pain and agony. The shards' energy disrupts the flow of his chi, which prevents him from channeling the Iron Fist consistently and causes his body to leak spiritual energy. Failure to balance his chi and harness Shou-Lao's chi can potentially result in Lin's death and immediate removal of the shards are potentially fatal. After overcoming his self-doubt and embracing his dual identities, Lie is able to overcome his weaknesses, allowing him to summon the full power of Shou-Lao and the Sword of Fu Xi simultaneously without any ill effects.

Due to his training under the Nü-wa Clan, Agents of Atlas and the monks of K'un-Lun, Lin Lie is an expert swordsman, martial artist and acrobat. In addition to K'un-Lun's martial arts, Lin is proficient in Bajiquan and Wing Chun.

Lin Lie is also exceptionally good at solving puzzles.

In other media
Lin Lie as Sword Master appears as an unlockable playable character in Marvel Future Fight.

References

External links
Marvel pages: SM2019

Chinese superheroes

Fictional dragonslayers
Fictional swordfighters in comics
Marvel Comics characters with superhuman strength
Marvel Comics martial artists
Vigilante characters in comics


text:
\section*{Introduction}

Much of the experimental effort in high-energy physics today is
directed at searching for new physics beyond the standard model.
Successful searches will require a detailed understanding of known physics.
At high-energy colliders, particularly hadron-hadron colliders, this
requirement implies above all the need for a detailed understanding
of perturbative QCD.  A detailed theoretical picture of dijet production,
for example, is necessary if we are to use it in constraining the
gluon distribution.  The search for new physics in the single-jet
inclusive distribution likewise requires detailed theoretical calculations
(in addition to better measurements of the parton distributions than
have been available heretofore).  Other measurements which rely on
our detailed understanding of perturbative QCD include the $W$ mass,
$W$+jet ratios, and top production in semi-leptonic and purely hadronic
channels.

\def\yir{y_{\rm  IR}}

In the context of jet physics at high-energy colliders, next-to-leading
order calculations represent the first step in providing such a detailed
picture.  Unlike the case of more inclusive measurements, such as
the total hadronic cross section in $e^+e^-$ annihilation, the perturbative
expansion for jet observables contains both ``ultraviolet'' and ``infrared''
logarithms.  The former arise from the truncation of the perturbation
series at a fixed order.  They manifest themselves in the (unphysical)
renormalization-scale
dependence of theoretical predictions.  This dependence is numerically strong
at leading order, because the coupling is still relatively large, and runs
relatively quickly.  Next-to-leading order effects compensate this
sensitivity, and in practice reduce significantly the undesired
renormalization-scale dependence.  The second type of logarithms arise because
of the presence of different scales, a hard scale characterizing the scattering,
and softer scales characterizing the size of a jet.  They modify the perturbative
expansion from one solely in $\alpha_s$ to one in $\alpha_s \ln^2 \yir$ and
$\alpha_s\ln \yir$ as well, where $\yir$ is the ratio of the different scales.
Only at next-to-leading order can we justify quantitatively the
harmless nature of these logarithms, and thereby the applicability of
perturbation theory.

\section*{Organizing a Calculation}

\def\overline{\ell}{\overline{\ell}}
At leading order, producing numerical predictions for an
$n$-jet process in lepton-hadron collisions requires knowledge of the parton distribution
functions of the proton; of $\alpha_s$; and of the tree-level matrix
element for the $\ell + x\rightarrow \ell + n$ parton process.  (The $n$-jet
count excludes
the remnant.)  We can get this matrix element easily from that for
$V\rightarrow \ell\overline{\ell} + (n+1)$~partons, where $V$ represents a vector boson.
At next-to-leading
order, the calculation of the same process also requires
the tree-level matrix element for $V\rightarrow \ell\overline{\ell} + (n+2)$~partons,
and the one-loop matrix element for $V\rightarrow \ell\overline{\ell} + (n+1)$~partons.
(It furthermore requires a general formalism such as that of
refs.~\cite{GG,GGK,FKS,CS} for
cancelling the infrared singularities analytically while allowing a
numerical calculation of fully-differential observables.)

It is the calculation of the one-loop matrix elements that requires
the bulk of the theoretical effort in producing predictions for a new
process.  In the traditional Feynman-diagram approach, even amplitudes
with four external partons\cite{ES} require hard, lengthy calculations;
and the situation only gets worse as the number of external legs grows.
The difficulties arise from the enormous number of diagrams, the large
amount of vertex algebra in each diagram, and the complexity of loop
integrals with many powers of the loop momentum in the numerator.  A
brute-force approach might easily lead to expressions thousands of times
larger than an appropriate representation of a result.

\def{\overline q}{{\overline q}}
The vastly more efficient methods developed in recent years start
by taking advantage of earlier developments in both tree-level
calculations\cite{MP} and string-based methods for loop calculations~\cite{String}.
These include (a) color decomposition\cite{LoopColor}, (b) the spinor helicity
method~\cite{SpinorHelicity},
(c) use of supersymmetric decompositions, (d)
decomposition into `primitive' amplitudes, and the
use of permutation identities~\cite{QQGGG}
that express subleading-color
amplitudes as a sum of permutations over `primitive'
amplitudes.  Primitive amplitudes correspond to color-ordered
amplitudes with a definite orientation of internal fermion
lines.  These fundamental building blocks may be computed efficiently
using the twin tools
of unitarity-based sewing and factorization, developed in refs.~\cite{Unitarity}
and reviewed at length in ref.~\cite{AnnReview}.  These techniques have been
used extensively in a series of calculations, including the one-loop matrix
elements~\cite{QQGGG}
for $0\rightarrow q{\overline q} ggg$, the all-multiplicity maximally-helicity violating
amplitudes in $N=4$ and $N=1$ supersymmetric theories~\cite{Unitarity}, and
the one-loop matrix
elements for $\ell\bar{\ell}\rightarrow q{\overline q} q'{\overline q}'$~\cite{Zqqqq}
 and $\ell\bar{\ell}\rightarrow q{\overline q} gg$~\cite{Zqqgg}.

\section*{Calculation of Primitive Amplitudes}

A one-loop amplitude, in general, contains absorptive pieces.
The corresponding dispersive terms
can be determined via dispersion relations from their cuts,
which are just given by products of tree amplitudes.  (The approach can
be extended beyond one loop; for first steps in this direction see
another contribution to this session~\cite{TwoLoop}.)
In practice, one does not need to use dispersion relations
explicitly, but only implicitly, to determine the integral functions
that appear in any given amplitude, along with their coefficients.
The restricted number of integral functions that can appear implies
that some cut-free pieces are also determined by this approach of
sewing tree amplitudes.  Indeed, in supersymmetric theories, the entire
amplitude is given by this technique.

The key point in the unitarity-based method is that we sew
tree {\it amplitudes\/}, not tree diagrams.  A calculation thus takes
advantage of all the cancellations and reductions in numbers of
terms that have already occurred in
the process of computing the tree amplitudes.

\def{\rm 1\hskip -1pt-\hskip -1ptloop}{{\rm 1\hskip -1pt-\hskip -1ptloop}}
\def{\rm tree}{{\rm tree}}
A calculation using the unitarity-based method proceeds as follows.
We want to compute the coefficients $c_i$ of each of the box, triangle
or bubble integrals that might appear in the amplitude.  (The set of
possible integrals can
be determined by a `gedanken' reduction using Passarino-Veltman~\cite{PV}
and van~Neerven-Vermaseren~\cite{vNV}, or equivalent~\cite{Integrals} techniques.)
We consider in turn cuts in all possible
channels.  For a given channel, we form the cut in that channel, summing
over all intermediate states; this gives rise to a phase-space
integral of the form
\begin{equation}
\hskip -15mm\int d^D{\rm LIPS}(-\ell_1,\ell_2)\,
A^{\rm tree}_L(-\ell_1,\ldots,\ell_2) A^{\rm tree}_R(-\ell_2,\ldots,\ell_1)\,,
\label{cutEqn}
\end{equation}
where $\ell_{1,2}$ are the four-dimensional
on-shell momenta crossing the cut, and
where the $A^{\rm tree}_{L,R}$ are the color-ordered tree subamplitudes
on the two
sides of the cut. Using the Cutkosky rules, we can rewrite this expression
as the absorptive or imaginary part of a loop amplitude,
\begin{equation}
\left[ \int {d^D\ell_1\over (2\pi)^D} A^{\rm tree}_L {1\over \ell_2^2+i\varepsilon}
     A^{\rm tree}_R {1\over \ell_1^2+i\varepsilon}\right]_{\rm cut}\,.
\end{equation}
 In this expression, we may use the on-shell conditions $\ell_1^2 = 0 = \ell_2^2$
freely in all factors except the inserted propagators.
Using a power-counting theorem~\cite{Unitarity,AnnReview} in those cases where it applies
(or simply up to a polynomial ambiguity to be fixed as described below, in cases where
it does not apply), we can recover the real parts by dropping the
subscript ``cut''.  We then perform the usual reductions on the
resulting loop integral, and extract the coefficient of any integral function
containing a cut in the given channel.  (Functions which don't
contain a cut in the given channel should be dropped.)  Finally,
we reassemble the final answer by considering all channels.

The box integrals have cuts in more
than one channel.  Considering both channels provides us with a
cross check --- the coefficients as computed in both channels must
agree --- or alternatively we could reduce the amount of work we must
do by considering only one channel.  The latter choice is particularly
appropriate when computing amplitudes in an $N=4$ supersymmetric gauge theory;
in this theory,
all amplitudes can be written in terms of scalar
boxes. (We assume the use of a
supersymmetrically-consistent version of dimensional regularization, such
as dimensional reduction, throughout.)

\def\epsilon{\epsilon}
In non-supersymmetric theories, there are remaining cut-free or polynomial
terms which are not determined by sewing tree amplitudes in $D=4$.
It is possible to determine them if we use the cuts at ${\cal O}(\epsilon)$ rather
than just to ${\cal O}(\epsilon^0)$.
The reason is that amplitudes in
a massless gauge theory have an over-all power of $(-s)^{-\epsilon}$, where
$s$ is one of the momentum invariants of the external legs.
The polynomial terms therefore do contain cuts
at ${\cal O}(\epsilon)$, and can be deduced by sewing tree amplitudes, where
the momenta crossing the cuts are taken to be on-shell in $(4-2\epsilon)$ dimensions
rather than four dimensions.  For scalars (and fermions~\cite{Fermions}),
this is equivalent to computing
massive rather than massless amplitudes, followed by an appropriately
weighted integration over
the ``mass'' (really the $(-2\epsilon)$-dimensional component of the momentum).

\def{C}{{C}}
However, for practical purposes, it is better to use collinear factorization
to determine the polynomial terms.  This technique relies on the
universal factorization of one-loop amplitudes in the collinear
limit~\cite{Collinear,Unitarity},
which for leading-color amplitudes reads,
\begin{eqnarray}
&
A^{\rm 1\hskip -1pt-\hskip -1ptloop}_{n;1}(\cdots,a,b) \mathop{\longrightarrow}^{a\parallel b}
\nonumber\\
&& \hskip 5mm
 \sum_{\lambda_P=\pm} \Bigl[
  {C}^{\rm tree}_{-\lambda_P}(a^{\lambda_a},b^{\lambda_b})
      A^{\rm 1\hskip -1pt-\hskip -1ptloop}_{n-1;1}(\cdots;P^{\lambda_P})
  +{C}^{\rm 1\hskip -1pt-\hskip -1ptloop}_{-\lambda_P}(a^{\lambda_a},b^{\lambda_b})
      A^{\rm tree}_{n-1}(\cdots;P^{\lambda_P})\Bigr]
\end{eqnarray}
where the splitting amplitudes ${C}$ are universal functions depending
only on the collinear momenta and their helicities $\lambda$,
and on the momentum fraction $z$ ($k_P = k_a+k_b$, $k_a = z k_P$).
In general, the terms deduced by sewing trees will not yield the correct
limit; one must add polynomial pieces.  One caveat in applying this
technique is that we have no proof that this determines the missing
polynomial pieces uniquely.  (It is
likely true for more than five external legs; for five external legs,
there is an ambiguity arising from the existence of a term which contains
no cuts but is collinear-finite.)  The results obtained using this technique
thus need to be checked
(for example, numerically) against results from another method.

redpajama_set_name: RedPajamaArXiv


Subdomains For Multi Language Website ??
Actually i want to open multilingual phpfox website. Because for SEO it is best solution.
is it possible with 1 setup ?
No, you are allowed one live site whether it is a main domain, or a subdomain or a file folder location in a domain. But you are allowed only one live site. You are also allowed one development site and that needs to be either development.yourdomain.com or yourdomain.com/development. This is how it has been since I started using this many many years ago.
On the phpFox source, you can make a small custom work to check. For instance, if it's IT subdomain, it will read IT language, you also need to hide for "switch languages" option.
So, we need only one license as long as it is in one domain right, without limitations of subdomains...just to clarify as i read in the license agreement no such thing..
awesome what, reply is opposed to yours and you find it awesome ??
Because it looks like there is a way to have multiple languages with one domain because you would use the same database and data. Having a piece of code to look at where the IP is coming from and then change the variable on what language to use is pretty smart idea and sounds logically possible. Someone should make an app for that.
Last update on March 26, 6:48 pm by JohnJr.
Same website and domain, multiple sub domains DOES not require several licenses...it all makes sense.
Last update on March 26, 5:50 pm by Mohammed Alex.


Neither am I a great movie buff nor a big online shopper, but I do go to movies once or twice a year and use online shopping to order surprise gifts for near and dear ones. A very recent movie ticket booking and online shopping experience just awed me. It's not the online ticketing portal or the e-commerce portal that awed me, but our very own Gmail.
My wife and I decided to watch our favourite superstar Rajinikanth's latest flick "Lingaa" and booked our tickets via www.bookmyshow.com. On booking the tickets, I received a confirmation mail to my Gmail ID which I didn't pay much attention to. On the show day as I was getting ready to go to the theatre, there was reminder on my mobile and to my surprise it was a reminder for the movie show. I didn't recall setting up a reminder but realised that Gmail has the intelligence to understand that movie booking is an event and had added a reminder to my Google calendar automatically. A reminder for a movie show might sound insignificant but imagine the possibilities of this feature….
The second thing that Gmail impressed me is when I recently shopped online using Snapdeal and Flipkart. Once my order was booked the booking confirmation email subject line had a small button to view my order from the inbox subject line itself saving a click. Similarly the minute the order was shipped a "track shipment" button is added in the inbox subject line saving a click.
Hoping to see you all there!!!


Liquid, capsules, or powder: which detergent is best for my clothes?
Powder, detergent or capsules - there are so many detergent choices out there, it can be really confusing! Check out this handy guide for information.
With the pace of innovation growing ever faster, it can be hard to figure out which products are the right ones for you – and that goes for everything, from choosing a mobile phone contract to a laundry detergent.
Which detergent should you choose? What's the best laundry detergent for sensitive skin? How can you really make the most of the power of Persil and other detergents? And which format of laundry detergent is the most convenient or environmentally friendly? Read on to find the answers and get advice on which detergent is best for your clothes.
Now that you know a little more about the different formats and types of detergent, it's time to look at the benefits of each one.
Easy pre-treatments: if using washing powder or liquid detergent you can easily pre-treat those stubborn stains that might not come out in a regular wash. For powder, make a paste by combining a few spoons with some cold water and applying to the stain. Liquid is even easier to use – apply direct to the stain and massage into the fabric with the stain eraser ball. Leave both options for a few minutes before rinsing clean with cold water and washing as normal.
Convenient washing: as tablets and capsules are pre-measured you don't have to worry about pouring out your own dose of detergent. Instead, just pop your tablet or capsule into the machine and load your washing. If you want to use powder or liquid then measuring scoops and dosing balls are often provided to help you measure the right amount quickly, easily, and without mess.
Cost: detergents are designed to be cost-effective and offer good value to households. For example, concentrated liquid detergents pack the same stain fighting Persil power into a smaller bottle while refill packs for liquids and capsules use less packaging (good for your wallet and the environment).
A choice for everyone: whether you want something that gets rid of tough stains or a gentle non-bio detergent that is kind on skin, there is a detergent option out there for you. If you're worried about an allergic reaction to Persil laundry detergent then try a non-bio formula. Always test your detergent on an inconspicuous piece of clothing first and use it only as directed on the packing. If you do suffer a skin irritation then discontinue use immediately and speak to a medical professional.
So there you have it, choosing the right detergent needn't be daunting and while some people might have concerns about Persil power – warning that it could be harsh on your clothes or skin – there's no need to worry.
Always follow the instructions and dosage guidance on the packaging of your chosen detergent to make sure you use it safely and correctly. Check your clothes' care label to make sure you are washing on an appropriate setting too.


Super Lube should be used on a regular basis to keep your airbrush needle and trigger from sticking.
After properly cleaning your airbrush, apply Super Lube in the needle cap, along the needle, and under main lever to keep them moving smoothly.
It can be used on all parts of the airbrush. It will not affect or react with any water-based or alcohol base makeup.


text:
Jesus First. Others Second. Yourselves Third.
Crisis Resource Center
We work on Camp Caribe to help get it ready to serve young people in the summer. We also help at an after school program. The island has been visibly affected by damage from the hurricane.
Paz-Holley
In the fall of 2017, tragedy struck our community when an act of violence left five small children without their parents. The children were taken in by their young uncle and his wife, who already had five small children of their own. Our community, in partnership with J.O.Y. Ministries, committed to providing this family with proper housing. We raised over $100,000 to provide this home fully furnished and ready for the family to move in!
J.O.Y. now offers a summer camp and afterschool program to at-risk kids in Adair county. Camp Hope offers training in lifeskills, music and the arts, exercise, healthy eating, academic preparation, and the Christian faith. We are grateful to the United Methodist Church and Kosair Charities for helping us fund this program for the 2019-2020 school year.
Coordinating Community Outreach
J.O.Y. has been a local drop point and a partner for numerous local and non-local mission activities, including hurricane relief efforts and the Salvation Army Angel Tree Program.
Cally's House
In September of 2019, J.O.Y. opened "Cally's House," an emergency shelter named in honor of Cally Paige McFall, a local young lady who tragically died from drug addiction. Cally's House provides immediate, temporary shelter to a single family unit until better living conditions can be found. Our hope is that this shelter will help prevent further tragedies like Cally's!
J.o.yministries2012@gmail.com
411 Greensburg St, Columbia, Ky 42728
Copyright © 2021 — Uptown Style WordPress theme by GoDaddy


The approval rating for freshman Gov. Phil Murphy has fallen flat over the past year remaining virtually the same, and all the while his disapproval has grown considerably among New Jersey residents, according to a Tuesday report from the Monmouth University Polling Institute.
Governor Phil Murphy delivers his State of the State address in Trenton, Tuesday, Jan. 15, 2019.
Forty-three percent of adults gave a thumbs up on Murphy's job, compared to 44 percent in April 2018.
His disapproval went up to 40 percent among adults compared to 28 percent last year, according to the Monmouth Poll, which surveyed 604 New Jersey adults between Feb. 8 and 10.
Murphy's predecessor, Gov. Chris Christie, a Republican, scored a 47 percent approval rating and 40 percent disapproval rating after his first year in office. And Christie's predecessor, Gov. Jon Corzine, a Democrat, scored a 44 percent approval rating and 34 percent disapproval rating after his first year in office.
Murphy still remains popular with his own party — 66 percent of Democrats approved of the job he has been doing compared to 9 percent who gave him a thumbs down.
Fifty-four percent of respondents said they were not aware of any Trenton political in-fighting between Murphy and the Democrat-controlled state Legislature, especially against Senate President Stephen Sweeney, D-3rd District.
Of residents who identified as "wealthy" in the poll, 31 percent said Murphy's policies had no impact on them, 22 percent said they were hurt by Murphy's policies and 21 percent said the governor's policies helped them.
Self-identified "middle-class residents" had a less favorable view — 39 percent of residents said Murphy's policies were hurting them and only 18 percent said the policies were helping them, compared to 27 percent of respondents who said they felt no impact.
Among New Jersey's "poor residents" 27 percent of respondents said the governor's policies helped them, 28 percent said the policies were hurting them and 27 percent reported no impact.
The biggest issue on many adult's minds, according to the poll, was property taxes, where 45 percent of respondents listed it as the "most important issue" facing the state. And only 6 percent of property taxpayers felt Murphy was helping them, compared to 48 percent who felt Murphy's policies were hurting them.
"It seems the governor and legislative leaders are at odds in terms of what, if anything, should be done. The solution may not be clear, but it's certainly not a good idea to be perceived as ignoring the problem entirely," said Murray.