text:
(function(undefined) {
	'use strict';

	var hasOwn = Object.prototype.hasOwnProperty;
	var toString = Object.prototype.toString;
	var push = Array.prototype.push;
	var slice = Array.prototype.slice;
	var splice = Array.prototype.splice;
	var reduce = Array.prototype.reduce;

	var global = Function('return this;')();

	var applyCell;

	/**
	 * @typesign (value?, opts?: {
	 *     owner?: Object,
	 *     get?: (value) -> *,
	 *     validate?: (value),
	 *     onChange?: (evt: cellx~Event) -> boolean|undefined,
	 *     onError?: (evt: cellx~Event) -> boolean|undefined,
	 *     computed?: false,
	 *     debugKey?: string
	 * }) -> cellx;
	 *
	 * @typesign (formula: () -> *, opts?: {
	 *     owner?: Object,
	 *     get?: (value) -> *,
	 *     set?: (value),
	 *     validate?: (value),
	 *     onChange?: (evt: cellx~Event) -> boolean|undefined,
	 *     onError?: (evt: cellx~Event) -> boolean|undefined,
	 *     computed?: true,
	 *     debugKey?: string
	 * }) -> cellx;
	 */
	function cellx(value, opts) {
		if (!opts) {
			opts = {};
		}

		var initialValue = value;

		function cx(value) {
			return applyCell(cx, initialValue, opts, this, value, slice.call(arguments, 1), arguments.length);
		}
		cx.constructor = cellx;

		if (opts.onChange || opts.onError) {
			cx.call(opts.owner || global);
		}

		return cx;
	}
	cellx.cellx = cellx; // for destructuring

	var KEY_UID = '__cellx_uid__';
	var KEY_CELLS = '__cellx_cells__';

	if (global.Symbol && typeof Symbol.iterator == 'symbol') {
		KEY_UID = Symbol(KEY_UID);
		KEY_CELLS = Symbol(KEY_CELLS);
	}

	cellx.KEY_CELLS = KEY_CELLS;

	var uidCounter = 0;

	function noop() {}

	/**
	 * @typesign (...msg);
	 */
	function logError() {
		var console = global.console;

		(console && console.error || noop).call(console || global, reduce.call(arguments, function(msg, part) {
			msg.push(part === Object(part) && part.stack || part);
			return msg;
		}, []).join(' '));
	}

	/**
	 * For override:
	 * @example
	 * var cellx = require('cellx');
	 * var winston = require('winston');
	 *
	 * cellx._logError = function(err) {
	 *     winston.log('error', err.message + ' ' + err.stack);
	 * };
	 */
	cellx._logError = logError;

	/**
	 * @typesign (target: Object, source: Object) -> Object;
	 */
	function mixin(target, source) {
		var names = Object.getOwnPropertyNames(source);

		for (var i = names.length; i;) {
			Object.defineProperty(target, names[--i], Object.getOwnPropertyDescriptor(source, names[i]));
		}

		return target;
	}

	/**
	 * @typesign (a, b) -> boolean;
	 */
	var is = Object.is || function is(a, b) {
		if (a === 0 && b === 0) {
			return 1 / a == 1 / b;
		}
		return a === b || (a != a && b != b);
	};

	/**
	 * @typesign (value) -> boolean;
	 */
	var isArray = Array.isArray || function isArray(value) {
		return toString.call(value) == '[object Array]';
	};

	var extend;

	/**
	 * @typesign (description: {
	 *     Extends?: Function,
	 *     Implements?: Array<Function>,
	 *     Static?: Object,
	 *     constructor?: Function
	 * }) -> Function;
	 */
	function createClass(description) {
		var parent;

		if (description.Extends) {
			parent = description.Extends;
			delete description.Extends;
		} else {
			parent = Object;
		}

		var constr;

		if (hasOwn.call(description, 'constructor')) {
			constr = description.constructor;
			delete description.constructor;
		} else {
			constr = parent == Object ?
				function() {} :
				function() {
					return parent.apply(this, arguments);
				};
		}

		Object.keys(parent).forEach(function(name) {
			Object.defineProperty(constr, name, Object.getOwnPropertyDescriptor(parent, name));
		});

		if (description.Static) {
			mixin(constr, description.Static);
			delete description.Static;
		}

		if (constr.extend === undefined) {
			constr.extend = extend;
		}

		var proto = constr.prototype = Object.create(parent.prototype);

		if (description.Implements) {
			description.Implements.forEach(function(impl) {
				mixin(proto, typeof impl == 'function' ? impl.prototype : impl);
			});

			delete description.Implements;
		}

		mixin(proto, description);

		Object.defineProperty(proto, 'constructor', {
			configurable: true,
			writable: true,
			value: constr
		});

		return constr;
	}

	/**
	 * @this {Function}
	 *
	 * @typesign (description: {
	 *     Implements?: Array<Function>,
	 *     Static?: Object,
	 *     constructor?: Function
	 * }) -> Function;
	 */
	extend = function extend(description) {
		description.Extends = this;
		return createClass(description);
	};

	/**
	 * @typesign (obj: Object, name: string, value);
	 */
	function defineObservableProperty(obj, name, value) {
		var _name = '_' + name;

		obj[_name] = typeof value == 'function' && value.constructor == cellx ? value : cellx(value);

		Object.defineProperty(obj, name, {
			configurable: true,
			enumerable: true,

			get: function() {
				return this[_name]();
			},

			set: function(value) {
				this[_name](value);
			}
		});
	}

	/**
	 * @typesign (obj: Object, props: Object);
	 */
	function defineObservableProperties(obj, props) {
		Object.keys(props).forEach(function(name) {
			defineObservableProperty(obj, name, props[name]);
		});
	}

	/**
	 * @typesign (obj: Object, name: string, value) -> Object;
	 * @typesign (obj: Object, props: Object) -> Object;
	 */
	function define(obj, name, value) {
		if (arguments.length == 3) {
			defineObservableProperty(obj, name, value);
		} else {
			defineObservableProperties(obj, name);
		}

		return obj;
	}

	cellx.define = define;

	// gulp-include
	/**
	 * @typesign (cb: ());
	 */
	var nextTick = (function() {

		if (global.process && process.toString() == '[object process]' && process.nextTick) {
			return process.nextTick;
		}

		if (global.setImmediate) {
			return function nextTick(cb) {
				setImmediate(cb);
			};
		}

		if (global.Promise && Promise.toString().indexOf('[native code]') != -1) {
			var prm = Promise.resolve();

			return function nextTick(cb) {
				prm.then(function() {
					cb();
				});
			};
		}

		var queue;

		global.addEventListener('message', function() {
			if (queue) {
				var track = queue;

				queue = null;

				for (var i = 0, l = track.length; i < l; i++) {
					try {
						track[i]();
					} catch (err) {
						cellx._logError(err);
					}
				}
			}
		});

		return function nextTick(cb) {
			if (queue) {
				queue.push(cb);
			} else {
				queue = [cb];
				postMessage('__tic__', '*');
			}
		};

	})();

	var Map;

	(function() {

		Map = global.Map;

		if (!Map) {
			var entryStub = {
				value: undefined
			};

			Map = createClass({
				constructor: function Map(entries) {
					this._entries = Object.create(null);
					this._objectStamps = {};

					this._first = null;
					this._last = null;

					this.size = 0;

					if (entries) {
						for (var i = 0, l = entries.length; i < l; i++) {
							this.set(entries[i][0], entries[i][1]);
						}
					}
				},

				has: function has(key) {
					return !!this._entries[this._getValueStamp(key)];
				},

				get: function get(key) {
					return (this._entries[this._getValueStamp(key)] || entryStub).value;
				},

				set: function set(key, value) {
					var entries = this._entries;
					var keyStamp = this._getValueStamp(key);

					if (entries[keyStamp]) {
						entries[keyStamp].value = value;
					} else {
						var entry = entries[keyStamp] = {
							key: key,
							keyStamp: keyStamp,
							value: value,
							prev: this._last,
							next: null
						};

						if (this.size++) {
							this._last.next = entry;
						} else {
							this._first = entry;
						}

						this._last = entry;
					}

					return this;
				},

				delete: function _delete(key) {
					var keyStamp = this._getValueStamp(key);
					var entry = this._entries[keyStamp];

					if (!entry) {
						return false;
					}

					if (--this.size) {
						var prev = entry.prev;
						var next = entry.next;

						if (prev) {
							prev.next = next;
						} else {
							this._first = next;
						}

						if (next) {
							next.prev = prev;
						} else {
							this._last = prev;
						}
					} else {
						this._first = null;
						this._last = null;
					}

					delete this._entries[keyStamp];
					delete this._objectStamps[keyStamp];

					return true;
				},

				clear: function clear() {
					var entries = this._entries;

					for (var stamp in entries) {
						delete entries[stamp];
					}

					this._objectStamps = {};

					this._first = null;
					this._last = null;

					this.size = 0;
				},

				_getValueStamp: function _getValueStamp(value) {
					switch (typeof value) {
						case 'undefined': {
							return 'undefined';
						}
						case 'object': {
							if (value === null) {
								return 'null';
							}

							break;
						}
						case 'boolean': {
							return '?' + value;
						}
						case 'number': {
							return '+' + value;
						}
						case 'string': {
							return ',' + value;
						}
					}

					return this._getObjectStamp(value);
				},

				_getObjectStamp: function _getObjectStamp(obj) {
					if (!hasOwn.call(obj, KEY_UID)) {
						if (!Object.isExtensible(obj)) {
							var stamps = this._objectStamps;
							var stamp;

							for (stamp in stamps) {
								if (hasOwn.call(stamps, stamp) && stamps[stamp] == obj) {
									return stamp;
								}
							}

							stamp = String(++uidCounter);
							stamps[stamp] = obj;

							return stamp;
						}

						Object.defineProperty(obj, KEY_UID, {
							value: String(++uidCounter)
						});
					}

					return obj[KEY_UID];
				},

				forEach: function forEach(cb, context) {
					if (context == null) {
						context = global;
					}

					var entry = this._first;

					while (entry) {
						cb.call(context, entry.value, entry.key, this);

						do {
							entry = entry.next;
						} while (entry && !this._entries[entry.keyStamp]);
					}
				},

				toString: function toString() {
					return '[object Map]';
				}
			});

			[
				['keys', function keys(entry) {
					return entry.key;
				}],
				['values', function values(entry) {
					return entry.value;
				}],
				['entries', function entries(entry) {
					return [entry.key, entry.value];
				}]
			].forEach(function(settings) {
				var getStepValue = settings[1];

				Map.prototype[settings[0]] = function() {
					var entries = this._entries;
					var entry;
					var done = false;
					var map = this;

					return {
						next: function() {
							if (!done) {
								if (entry) {
									do {
										entry = entry.next;
									} while (entry && !entries[entry.keyStamp]);
								} else {
									entry = map._first;
								}

								if (entry) {
									return {
										value: getStepValue(entry),
										done: false
									};
								}

								done = true;
							}

							return {
								value: undefined,
								done: true
							};
						}
					};
				};
			});
		}

		if (global.Symbol && Symbol.iterator && !Map[Symbol.iterator]) {
			Map.prototype[Symbol.iterator] = Map.prototype.entries;
		}

		cellx.Map = Map;

	})();

	/**
	 * @typedef {{
	 *     target?: Object,
	 *     type: string,
	 *     bubbles?: boolean,
	 *     isPropagationStopped?: boolean
	 * }} cellx~Event
	 */

	var EventEmitter;

	(function() {

		var KEY_INNER = '__cellx_EventEmitter_inner__';

		if (global.Symbol && typeof Symbol.iterator == 'symbol') {
			KEY_INNER = Symbol(KEY_INNER);
		}

		/**
		 * @class cellx.EventEmitter
		 * @extends {Object}
		 * @typesign new () -> cellx.EventEmitter;
		 */
		EventEmitter = createClass({
			Static: {
				KEY_INNER: KEY_INNER
			},

			constructor: function EventEmitter() {
				/**
				 * @type {Object<Array<{ listener: (evt: cellx~Event) -> boolean|undefined, context: Object }>>}
				 */
				this._events = Object.create(null);
			},

			/**
			 * @typesign (
			 *     type: string,
			 *     listener: (evt: cellx~Event) -> boolean|undefined,
			 *     context?: Object
			 * ) -> cellx.EventEmitter;
			 *
			 * @typesign (
			 *     listeners: Object<(evt: cellx~Event) -> boolean|undefined>,
			 *     context?: Object
			 * ) -> cellx.EventEmitter;
			 */
			on: function on(type, listener, context) {
				if (typeof type == 'object') {
					context = listener;

					var listeners = type;

					for (type in listeners) {
						if (hasOwn.call(listeners, type)) {
							this._on(type, listeners[type], context);
						}
					}
				} else {
					this._on(type, listener, context);
				}

				return this;
			},
			/**
			 * @typesign (
			 *     type: string,
			 *     listener: (evt: cellx~Event) -> boolean|undefined,
			 *     context?: Object
			 * ) -> cellx.EventEmitter;
			 *
			 * @typesign (
			 *     listeners: Object<(evt: cellx~Event) -> boolean|undefined>,
			 *     context?: Object
			 * ) -> cellx.EventEmitter;
			 *
			 * @typesign () -> cellx.EventEmitter;
			 */
			off: function off(type, listener, context) {
				if (type) {
					if (typeof type == 'object') {
						context = listener;

						var listeners = type;

						for (type in listeners) {
							if (hasOwn.call(listeners, type)) {
								this._off(type, listeners[type], context);
							}
						}
					} else {
						this._off(type, listener, context);
					}
				} else if (this._events) {
					this._events = Object.create(null);
				}

				return this;
			},

			/**
			 * @typesign (
			 *     type: string,
			 *     listener: (evt: cellx~Event) -> boolean|undefined,
			 *     context?: Object
			 * );
			 */
			_on: function _on(type, listener, context) {
				var index = type.indexOf(':');

				if (index != -1) {
					this['_' + type.slice(index + 1)]('on', type.slice(0, index), listener, context);
				} else {
					var events = (this._events || (this._events = Object.create(null)))[type];

					if (!events) {
						events = this._events[type] = [];
					}

					events.push({
						listener: listener,
						context: context || this
					});
				}
			},
			/**
			 * @typesign (
			 *     type: string,
			 *     listener: (evt: cellx~Event) -> boolean|undefined,
			 *     context?: Object
			 * );
			 */
			_off: function _off(type, listener, context) {
				var index = type.indexOf(':');

				if (index != -1) {
					this['_' + type.slice(index + 1)]('off', type.slice(0, index), listener, context);
				} else {
					var events = this._events && this._events[type];

					if (!events) {
						return;
					}

					if (!context) {
						context = this;
					}

					for (var i = events.length; i;) {
						var evt = events[--i];

						if (evt.context == context && (evt.listener == listener || evt.listener[KEY_INNER] === listener)) {
							events.splice(i, 1);
							break;
						}
					}

					if (!events.length) {
						delete this._events[type];
					}
				}
			},

			/**
			 * @typesign (
			 *     type: string,
			 *     listener: (evt: cellx~Event) -> boolean|undefined,
			 *     context?: Object
			 * ) -> cellx.EventEmitter;
			 */
			once: function once(type, listener, context) {
				function wrapper() {
					this._off(type, wrapper, context);
					return listener.apply(this, arguments);
				}
				wrapper[KEY_INNER] = listener;

				this._on(type, wrapper, context);

				return this;
			},

			/**
			 * @typesign (evt: cellx~Event) -> cellx~Event;
			 * @typesign (type: string) -> cellx~Event;
			 */
			emit: function emit(evt) {
				if (typeof evt == 'string') {
					evt = {
						target: this,
						type: evt
					};
				} else if (!evt.target) {
					evt.target = this;
				}

				this._handleEvent(evt);

				return evt;
			},

			/**
			 * @typesign (evt: cellx~Event);
			 *
			 * For override:
			 * @example
			 * function View(el) {
			 *     this.element = el;
			 *     el._view = this;
			 * }
			 *
			 * View.prototype = Object.create(EventEmitter.prototype);
			 * View.prototype.constructor = View;
			 *
			 * View.prototype.getParent = function() {
			 *     var node = this.element;
			 *
			 *     while (node = node.parentNode) {
			 *         if (node._view) {
			 *             return node._view;
			 *         }
			 *     }
			 *
			 *     return null;
			 * };
			 *
			 * View.prototype._handleEvent = function(evt) {
			 *     EventEmitter.prototype._handleEvent.call(this, evt);
			 *
			 *     var parent = this.getParent();
			 *
			 *     if (parent && evt.bubbles !== false && !evt.isPropagationStopped) {
			 *         parent._handleEvent(evt);
			 *     }
			 * };
			 */
			_handleEvent: function _handleEvent(evt) {
				var events = this._events && this._events[evt.type];

				if (events) {
					events = events.slice();

					for (var i = 0, l = events.length; i < l; i++) {
						try {
							if (events[i].listener.call(events[i].context, evt) === false) {
								evt.isPropagationStopped = true;
							}
						} catch (err) {
							this._logError(err);
						}
					}
				}
			},

			/**
			 * @typesign (...msg);
			 */
			_logError: function _logError() {
				cellx._logError.apply(cellx, arguments);
			}
		});

		cellx.EventEmitter = EventEmitter;

	})();

	var ObservableCollection;

	(function() {

		ObservableCollection = EventEmitter.extend({
			constructor: function ObservableCollection() {
				/**
				 * @type {Map<*, uint>}
				 */
				this._valueCounts = new Map();
			},

			/**
			 * @typesign (evt: cellx~Event);
			 */
			_onItemChange: function _onItemChange(evt) {
				this._handleEvent(evt);
			},

			/**
			 * @typesign (value);
			 */
			_registerValue: function _registerValue(value) {
				var valueCounts = this._valueCounts;
				var valueCount = valueCounts.get(value);

				if (valueCount) {
					valueCounts.set(value, valueCount + 1);
				} else {
					valueCounts.set(value, 1);

					if (this.adoptsItemChanges && value instanceof EventEmitter) {
						value.on('change', this._onItemChange, this);
					}
				}
			},

			/**
			 * @typesign (value);
			 */
			_unregisterValue: function _unregisterValue(value) {
				var valueCounts = this._valueCounts;
				var valueCount = valueCounts.get(value);

				if (valueCount > 1) {
					valueCounts.set(value, valueCount - 1);
				} else {
					valueCounts.delete(value);

					if (this.adoptsItemChanges && value instanceof EventEmitter) {
						value.off('change', this._onItemChange, this);
					}
				}
			},

			/**
			 * Освобождает занятые инстансом ресурсы.
			 * @typesign ();
			 */
			dispose: function dispose() {
				if (this.adoptsItemChanges) {
					this._valueCounts.forEach(function(value) {
						if (value instanceof EventEmitter) {
							value.off('change', this._onItemChange, this);
						}
					}, this);
				}
			}
		});

	})();

	var ObservableMap;

	(function() {

		/**
		 * @class cellx.ObservableMap
		 * @extends {cellx.EventEmitter}
		 * @implements {ObservableCollection}
		 *
		 * @typesign new (entries?: Object|Array<{ 0, 1 }>|cellx.ObservableMap, opts?: {
		 *     adoptsItemChanges?: boolean
		 * }) -> cellx.ObservableMap;
		 */
		ObservableMap = EventEmitter.extend({
			Implements: [ObservableCollection],

			constructor: function ObservableMap(entries, opts) {
				EventEmitter.call(this);
				ObservableCollection.call(this);

				this._entries = new Map();

				this.size = 0;

				/**
				 * @type {boolean}
				 */
				this.adoptsItemChanges = !opts || opts.adoptsItemChanges !== false;

				if (entries) {
					var mapEntries = this._entries;

					if (entries instanceof ObservableMap) {
						entries._entries.forEach(function(value, key) {
							mapEntries.set(key, value);
							this._registerValue(value);
						}, this);
					} else if (isArray(entries)) {
						for (var i = 0, l = entries.length; i < l; i++) {
							var entry = entries[i];

							mapEntries.set(entry[0], entry[1]);
							this._registerValue(entry[1]);
						}
					} else {
						for (var key in entries) {
							if (hasOwn.call(entries, key)) {
								mapEntries.set(key, entries[key]);
								this._registerValue(entries[key]);
							}
						}
					}

					this.size = mapEntries.size;
				}
			},

			/**
			 * @typesign (key) -> boolean;
			 */
			has: function has(key) {
				return this._entries.has(key);
			},

			/**
			 * @typesign (value) -> boolean;
			 */
			contains: function contains(value) {
				return this._valueCounts.has(value);
			},

			/**
			 * @typesign (key) -> *;
			 */
			get: function get(key) {
				return this._entries.get(key);
			},

			/**
			 * @typesign (key, value) -> cellx.ObservableMap;
			 */
			set: function set(key, value) {
				var entries = this._entries;
				var hasKey = entries.has(key);
				var oldValue;

				if (hasKey) {
					oldValue = entries.get(key);

					if (is(oldValue, value)) {
						return this;
					}

					this._unregisterValue(oldValue);
				}

				entries.set(key, value);
				this._registerValue(value);

				if (!hasKey) {
					this.size++;
				}

				this.emit({
					type: 'change',
					subtype: hasKey ? 'update' : 'add',
					key: key,
					oldValue: oldValue,
					value: value
				});

				return this;
			},

			/**
			 * @typesign (key) -> boolean;
			 */
			delete: function _delete(key) {
				var entries = this._entries;

				if (!entries.has(key)) {
					return false;
				}

				var value = entries.get(key);

				entries.delete(key);
				this._unregisterValue(value);

				this.size--;

				this.emit({
					type: 'change',
					subtype: 'delete',
					key: key,
					oldValue: value,
					value: undefined
				});

				return true;
			},

			/**
			 * @typesign () -> cellx.ObservableMap;
			 */
			clear: function clear() {
				if (!this.size) {
					return this;
				}

				this._entries.clear();
				this._valueCounts.clear();
				this.size = 0;

				this.emit({
					type: 'change',
					subtype: 'clear'
				});

				return this;
			},

			/**
			 * @typesign (cb: (value, key, map: cellx.ObservableMap), context?);
			 */
			forEach: function forEach(cb, context) {
				if (context == null) {
					context = global;
				}

				this._entries.forEach(function(value, key) {
					cb.call(context, value, key, this);
				}, this);
			},

			/**
			 * @typesign () -> { next: () -> { value, done: boolean } };
			 */
			keys: function keys() {
				return this._entries.keys();
			},

			/**
			 * @typesign () -> { next: () -> { value, done: boolean } };
			 */
			values: function values() {
				return this._entries.values();
			},

			/**
			 * @typesign () -> { next: () -> { value: { 0, 1 }, done: boolean } };
			 */
			entries: function entries() {
				return this._entries.entries();
			},

			/**
			 * @typesign () -> cellx.ObservableMap;
			 */
			clone: function clone() {
				return new this.constructor(this, {
					adoptsItemChanges: this.adoptsItemChanges
				});
			}
		});

		if (global.Symbol && Symbol.iterator) {
			ObservableMap.prototype[Symbol.iterator] = ObservableMap.prototype.entries;
		}

		cellx.ObservableMap = ObservableMap;

		/**
		 * @typesign (
		 *     entries?: Object|Array<{ 0, 1 }>|cellx.ObservableMap,
		 *     opts?: { adoptsItemChanges?: boolean }
		 * ) -> cellx.ObservableMap;
		 *
		 * @typesign (
		 *     entries?: Object|Array<{ 0, 1 }>|cellx.ObservableMap,
		 *     adoptsItemChanges?: boolean
		 * ) -> cellx.ObservableMap;
		 */
		function map(entries, opts) {
			return new ObservableMap(entries, typeof opts == 'boolean' ? { adoptsItemChanges: opts } : opts);
		}

		cellx.map = map;

	})();

	var ObservableList;

	(function() {

		/**
		 * @typesign (a, b) -> -1|1|0;
		 */
		function defaultComparator(a, b) {
			if (a < b) { return -1; }
			if (a > b) { return 1; }
			return 0;
		}

		/**
		 * @typesign (list: cellx.ObservableList, items: Array);
		 */
		function addRange(list, items) {
			var listItems = list._items;

			if (list.sorted) {
				var comparator = list.comparator;

				for (var i = 0, l = items.length; i < l; i++) {
					var item = items[i];
					var low = 0;
					var high = listItems.length;

					while (low != high) {
						var mid = (low + high) >> 1;

						if (comparator(item, listItems[mid]) < 0) {
							high = mid;
						} else {
							low = mid + 1;
						}
					}

					listItems.splice(low, 0, item);
					list._registerValue(item);
				}
			} else {
				push.apply(listItems, items);

				for (var j = items.length; j;) {
					list._registerValue(items[--j]);
				}
			}

			list.length = listItems.length;
		}

		/**
		 * @class cellx.ObservableList
		 * @extends {cellx.EventEmitter}
		 * @implements {ObservableCollection}
		 *
		 * @typesign new (items?: Array|cellx.ObservableList, opts?: {
		 *     adoptsItemChanges?: boolean,
		 *     comparator?: (a, b) -> int,
		 *     sorted?: boolean
		 * }) -> cellx.ObservableList;
		 */
		ObservableList = EventEmitter.extend({
			Implements: [ObservableCollection],

			constructor: function ObservableList(items, opts) {
				EventEmitter.call(this);
				ObservableCollection.call(this);

				if (!opts) {
					opts = {};
				}

				this._items = [];

				this.length = 0;

				/**
				 * @type {boolean}
				 */
				this.adoptsItemChanges = opts.adoptsItemChanges !== false;

				/**
				 * @type {?(a, b) -> int}
				 */
				this.comparator = null;

				this.sorted = false;

				if (opts.sorted || (opts.comparator && opts.sorted !== false)) {
					this.comparator = opts.comparator || defaultComparator;
					this.sorted = true;
				}

				if (items) {
					addRange(this, items instanceof ObservableList ? items._items : items);
				}
			},

			/**
			 * @typesign (index: int, allowEndIndex?: boolean) -> uint|undefined;
			 */
			_validateIndex: function _validateIndex(index, allowEndIndex) {
				if (index === undefined) {
					return index;
				}

				if (index < 0) {
					index += this.length;

					if (index < 0) {
						throw new RangeError('Index out of range');
					}
				} else if (index >= (this.length + (allowEndIndex ? 1 : 0))) {
					throw new RangeError('Index out of range');
				}

				return index;
			},

			/**
			 * @typesign (value) -> boolean;
			 */
			contains: function contains(value) {
				return this._valueCounts.has(value);
			},

			/**
			 * @typesign (value, fromIndex?: int) -> int;
			 */
			indexOf: function indexOf(value, fromIndex) {
				return this._items.indexOf(value, this._validateIndex(fromIndex));
			},

			/**
			 * @typesign (value, fromIndex?: int) -> int;
			 */
			lastIndexOf: function lastIndexOf(value, fromIndex) {
				return this._items.lastIndexOf(value, this._validateIndex(fromIndex));
			},

			/**
			 * @typesign (index: int) -> *;
			 */
			get: function get(index) {
				return this._items[this._validateIndex(index)];
			},

			/**
			 * @typesign (index?: int, count?: uint) -> Array;
			 */
			getRange: function getRange(index, count) {
				index = this._validateIndex(index || 0, true);

				var items = this._items;

				if (count === undefined) {
					return items.slice(index);
				}

				if (index + count > items.length) {
					throw new RangeError('"index" and "count" do not denote a valid range');
				}

				return items.slice(index, index + count);
			},

			/**
			 * @typesign (index: int, value) -> cellx.ObservableList;
			 */
			set: function set(index, value) {
				if (this.sorted) {
					throw new TypeError('Can\'t set to sorted list');
				}

				index = this._validateIndex(index);

				var items = this._items;

				if (is(items[index], value)) {
					return this;
				}

				this._unregisterValue(items[index]);

				items[index] = value;
				this._registerValue(value);

				this.emit('change');

				return this;
			},

			/**
			 * @typesign (index: int, items: Array) -> cellx.ObservableList;
			 */
			setRange: function setRange(index, items) {
				if (this.sorted) {
					throw new TypeError('Can\'t set to sorted list');
				}

				index = this._validateIndex(index);

				var itemCount = items.length;

				if (!itemCount) {
					return this;
				}

				if (index + itemCount > this.length) {
					throw new RangeError('"index" and length of "items" do not denote a valid range');
				}

				var listItems = this._items;
				var changed = false;

				for (var i = index + itemCount; i > index;) {
					var item = items[--i];

					if (!is(listItems[i], item)) {
						this._unregisterValue(listItems[i]);

						listItems[i] = item;
						this._registerValue(item);

						changed = true;
					}
				}

				if (changed) {
					this.emit('change');
				}

				return this;
			},

			/**
			 * @typesign (item) -> cellx.ObservableList;
			 */
			add: function add(item) {
				this.addRange([item]);
				return this;
			},

			/**
			 * @typesign (items: Array) -> cellx.ObservableList;
			 */
			addRange: function _addRange(items) {
				if (!items.length) {
					return this;
				}

				addRange(this, items);
				this.emit('change');

				return this;
			},

			/**
			 * @typesign (index: int, item) -> cellx.ObservableList;
			 */
			insert: function insert(index, item) {
				this.insertRange(index, [item]);
				return this;
			},

			/**
			 * @typesign (index: int, items: Array) -> cellx.ObservableList;
			 */
			insertRange: function insertRange(index, items) {
				if (this.sorted) {
					throw new TypeError('Can\'t insert to sorted list');
				}

				index = this._validateIndex(index, true);

				var itemCount = items.length;

				if (!itemCount) {
					return this;
				}

				splice.apply(this._items, [].concat(index, 0, items));

				for (var i = itemCount; i;) {
					this._registerValue(items[--i]);
				}

				this.length += itemCount;

				this.emit('change');

				return this;
			},

			/**
			 * @typesign (item, fromIndex?: int) -> cellx.ObservableList;
			 */
			remove: function remove(item, fromIndex) {
				var index = this._items.indexOf(item, this._validateIndex(fromIndex));

				if (index == -1) {
					return this;
				}

				this._items.splice(index, 1);
				this._unregisterValue(item);

				this.length--;

				this.emit('change');

				return this;
			},

			/**
			 * @typesign (item, fromIndex?: int) -> cellx.ObservableList;
			 */
			removeAll: function removeAll(item, fromIndex) {
				var items = this._items;
				var index = this._validateIndex(fromIndex);
				var changed = false;

				while ((index = items.indexOf(item, index)) != -1) {
					items.splice(index, 1);
					this._unregisterValue(item);

					changed = true;
				}

				if (changed) {
					this.length = items.length;
					this.emit('change');
				}

				return this;
			},

			/**
			 * @typesign (index: int) -> cellx.ObservableList;
			 */
			removeAt: function removeAt(index) {
				this._unregisterValue(this._items.splice(this._validateIndex(index), 1)[0]);
				this.length--;

				this.emit('change');

				return this;
			},

			/**
			 * @typesign (index?: int, count?: uint) -> cellx.ObservableList;
			 */
			removeRange: function removeRange(index, count) {
				index = this._validateIndex(index || 0, true);

				var items = this._items;

				if (count === undefined) {
					count = items.length - index;
				} else if (index + count > items.length) {
					throw new RangeError('"index" and "count" do not denote a valid range');
				}

				if (!count) {
					return this;
				}

				for (var i = index + count; i > index;) {
					this._unregisterValue(items[--i]);
				}
				items.splice(index, count);

				this.length -= count;

				this.emit('change');

				return this;
			},

			/**
			 * @typesign () -> cellx.ObservableList;
			 */
			clear: function clear() {
				if (this.length) {
					this._items.length = 0;
					this._valueCounts.clear();

					this.length = 0;

					this.emit('change');
				}

				return this;
			},

			/**
			 * @typesign (separator?: string) -> string;
			 */
			join: function join(separator) {
				return this._items.join(separator);
			},

			/**
			 * @typesign (cb: (item, index: uint, arr: cellx.ObservableList), context?);
			 */
			forEach: null,

			/**
			 * @typesign (cb: (item, index: uint, arr: cellx.ObservableList) -> *, context?) -> Array;
			 */
			map: null,

			/**
			 * @typesign (cb: (item, index: uint, arr: cellx.ObservableList) -> boolean|undefined, context?) -> Array;
			 */
			filter: null,

			/**
			 * @typesign (cb: (item, index: uint, arr: cellx.ObservableList) -> boolean|undefined, context?) -> *;
			 */
			find: function(cb, context) {
				if (context == null) {
					context = this;
				}

				var items = this._items;

				for (var i = 0, l = items.length; i < l; i++) {
					var item = items[i];

					if (cb.call(this, item, i, context)) {
						return item;
					}
				}
			},

			/**
			 * @typesign (cb: (item, index: uint, arr: cellx.ObservableList) -> boolean|undefined, context?) -> int;
			 */
			findIndex: function(cb, context) {
				if (context == null) {
					context = this;
				}

				var items = this._items;

				for (var i = 0, l = items.length; i < l; i++) {
					var item = items[i];

					if (cb.call(this, item, i, context)) {
						return i;
					}
				}

				return -1;
			},

			/**
			 * @typesign (cb: (item, index: uint, arr: cellx.ObservableList) -> boolean|undefined, context?) -> boolean;
			 */
			every: null,

			/**
			 * @typesign (cb: (item, index: uint, arr: cellx.ObservableList) -> boolean|undefined, context?) -> boolean;
			 */
			some: null,

			/**
			 * @typesign (cb: (accumulator, item, index: uint, arr: cellx.ObservableList) -> *, initialValue?) -> *;
			 */
			reduce: null,

			/**
			 * @typesign (cb: (accumulator, item, index: uint, arr: cellx.ObservableList) -> *, initialValue?) -> *;
			 */
			reduceRight: null,

			/**
			 * @typesign () -> cellx.ObservableList;
			 */
			clone: function clone() {
				return new this.constructor(this, {
					adoptsItemChanges: this.adoptsItemChanges,
					comparator: this.comparator,
					sorted: this.sorted
				});
			},

			/**
			 * @typesign () -> Array;
			 */
			toArray: function toArray() {
				return this._items.slice();
			},

			/**
			 * @typesign () -> string;
			 */
			toString: function toString() {
				return this._items.join();
			}
		});

		['forEach', 'map', 'filter', 'every', 'some', 'reduce', 'reduceRight'].forEach(function(name) {
			ObservableList.prototype[name] = function() {
				return Array.prototype[name].apply(this._items, arguments);
			};
		});

		[
			['keys', function keys(index, item) {
				return index;
			}],
			['values', function values(index, item) {
				return item;
			}],
			['entries', function entries(index, item) {
				return [index, item];
			}]
		].forEach(function(settings) {
			var getStepValue = settings[1];

			ObservableList.prototype[settings[0]] = function() {
				var items = this._items;
				var index;
				var done = false;

				return {
					next: function() {
						if (!done) {
							if (index < items.length) {
								return {
									value: getStepValue(index, items[index++]),
									done: false
								};
							}

							done = true;
						}

						return {
							value: undefined,
							done: true
						};
					}
				};
			};
		});

		if (global.Symbol && Symbol.iterator) {
			ObservableList.prototype[Symbol.iterator] = ObservableList.prototype.values;
		}

		cellx.ObservableList = ObservableList;

		/**
		 * @typesign (items?: Array|cellx.ObservableList, opts?: {
		 *     adoptsItemChanges?: boolean,
		 *     comparator?: (a, b) -> int,
		 *     sorted?: boolean
		 * }) -> cellx.ObservableList;
		 *
		 * @typesign (items?: Array|cellx.ObservableList, adoptsItemChanges?: boolean) -> cellx.ObservableList;
		 */
		function list(items, opts) {
			return new ObservableList(items, typeof opts == 'boolean' ? { adoptsItemChanges: opts } : opts);
		}

		cellx.list = list;

	})();

	var Cell;

	(function() {

		var KEY_INNER = EventEmitter.KEY_INNER;

		var error = {
			original: null
		};

		var currentlyRelease = false;

		/**
		 * @type {Array<Array<cellx.Cell>|null>}
		 */
		var releasePlan = [[]];

		var releasePlanIndex = 0;
		var maxLevel = -1;

		var calculatedCell = null;

		var releaseVersion = 1;

		function release() {
			if (releasePlanIndex > maxLevel) {
				return;
			}

			currentlyRelease = true;

			do {
				var bundle = releasePlan[releasePlanIndex];

				if (bundle) {
					var cell = bundle.shift();

					if (releasePlanIndex) {
						var index = releasePlanIndex;

						if (cell._active) {
							cell._recalc();
						}

						if (!releasePlan[index].length) {
							releasePlan[index] = null;

							if (releasePlanIndex) {
								releasePlanIndex++;
							}
						}
					} else {
						var changeEvent = cell._changeEvent;

						cell._fixedValue = cell._value;
						cell._changeEvent = null;

						cell._changed = true;

						if (cell._events.change) {
							cell._handleEvent(changeEvent);
						}

						var slaves = cell._slaves;

						for (var i = 0, l = slaves.length; i < l; i++) {
							var slave = slaves[i];

							if (slave._fixed) {
								(releasePlan[1] || (releasePlan[1] = [])).push(slave);

								if (!maxLevel) {
									maxLevel = 1;
								}

								slave._fixed = false;
							}
						}

						if (!releasePlan[0].length) {
							releasePlanIndex++;
						}
					}
				} else {
					releasePlanIndex++;
				}
			} while (releasePlanIndex <= maxLevel);

			maxLevel = -1;

			releaseVersion++;

			currentlyRelease = false;
		}

		/**
		 * @class cellx.Cell
		 * @extends {cellx.EventEmitter}
		 *
		 * @example
		 * var a = new Cell(1);
		 * var b = new Cell(2);
		 * var c = new Cell(function() {
		 *     return a.get() + b.get();
		 * });
		 *
		 * c.on('change', function() {
		 *     console.log('c = ' + c.get());
		 * });
		 *
		 * console.log(c.get());
		 * // => 3
		 *
		 * a.set(5);
		 * b.set(10);
		 * // => 'c = 15'
		 *
		 * @typesign new (value?, opts?: {
		 *     owner?: Object,
		 *     get?: (value) -> *,
		 *     validate?: (value),
		 *     onChange?: (evt: cellx~Event) -> boolean|undefined,
		 *     onError?: (evt: cellx~Event) -> boolean|undefined,
		 *     computed?: false,
		 *     debugKey?: string
		 * }) -> cellx.Cell;
		 *
		 * @typesign new (formula: () -> *, opts?: {
		 *     owner?: Object,
		 *     get?: (value) -> *,
		 *     set?: (value),
		 *     validate?: (value),
		 *     onChange?: (evt: cellx~Event) -> boolean|undefined,
		 *     onError?: (evt: cellx~Event) -> boolean|undefined,
		 *     computed?: true,
		 *     debugKey?: string
		 * }) -> cellx.Cell;
		 */
		Cell = EventEmitter.extend({
			constructor: function Cell(value, opts) {
				EventEmitter.call(this);

				if (!opts) {
					opts = {};
				}

				this.owner = opts.owner || null;

				this.computed = typeof value == 'function' &&
					(opts.computed !== undefined ? opts.computed : value.constructor == Function);

				this._value = undefined;
				this._fixedValue = undefined;
				this.initialValue = undefined;
				this._formula = null;

				this._get = opts.get || null;
				this._set = opts.set || null;

				this._validate = opts.validate || null;

				/**
				 * Ведущие ячейки.
				 * @type {?Array<cellx.Cell>}
				 */
				this._masters = null;
				/**
				 * Ведомые ячейки.
				 * @type {Array<cellx.Cell>}
				 */
				this._slaves = [];

				/**
				 * @type {uint|undefined}
				 */
				this._level = 0;

				this._active = !this.computed;

				this._changeEvent = null;
				this._isChangeCancellable = true;

				this._lastErrorEvent = null;

				this._fixed = true;

				this._version = 0;

				this._changed = false;

				this._circularityCounter = 0;

				if (this.computed) {
					this._formula = value;
				} else {
					if (this._validate) {
						this._validate.call(this.owner || this, value);
					}

					this._value = this._fixedValue = this.initialValue = value;

					if (value instanceof EventEmitter) {
						value.on('change', this._onValueChange, this);
					}
				}

				if (opts.onChange) {
					this.on('change', opts.onChange);
				}
				if (opts.onError) {
					this.on('error', opts.onError);
				}
			},

			/**
			 * @type {boolean}
			 */
			get changed() {
				if (!currentlyRelease) {
					release();
				}

				return this._changed;
			},

			/**
			 * @override
			 */
			on: function on(type, listener, context) {
				if (!currentlyRelease) {
					release();
				}

				if (this.computed && !this._events.change && !this._slaves.length) {
					this._activate();
				}

				EventEmitter.prototype.on.call(this, type, listener, context);

				return this;
			},
			/**
			 * @override
			 */
			off: function off(type, listener, context) {
				if (!currentlyRelease) {
					release();
				}

				EventEmitter.prototype.off.call(this, type, listener, context);

				if (this.computed && !this._events.change && !this._slaves.length) {
					this._deactivate();
				}

				return this;
			},

			/**
			 * @override
			 */
			_on: function _on(type, listener, context) {
				EventEmitter.prototype._on.call(this, type, listener, context || this.owner);
			},
			/**
			 * @override
			 */
			_off: function _off(type, listener, context) {
				EventEmitter.prototype._off.call(this, type, listener, context || this.owner);
			},

			/**
			 * @typesign (
			 *     listener: (evt: cellx~Event) -> boolean|undefined,
			 *     context?: Object
			 * ) -> cellx.Cell;
			 */
			addChangeListener: function addChangeListener(listener, context) {
				this.on('change', listener, context);
				return this;
			},
			/**
			 * @typesign (
			 *     listener: (evt: cellx~Event) -> boolean|undefined,
			 *     context?: Object
			 * ) -> cellx.Cell;
			 */
			removeChangeListener: function removeChangeListener(listener, context) {
				this.off('change', listener, context);
				return this;
			},

			/**
			 * @typesign (
			 *     listener: (evt: cellx~Event) -> boolean|undefined,
			 *     context?: Object
			 * ) -> cellx.Cell;
			 */
			addErrorListener: function addErrorListener(listener, context) {
				this.on('error', listener, context);
				return this;
			},
			/**
			 * @typesign (
			 *     listener: (evt: cellx~Event) -> boolean|undefined,
			 *     context?: Object
			 * ) -> cellx.Cell;
			 */
			removeErrorListener: function removeErrorListener(listener, context) {
				this.off('error', listener, context);
				return this;
			},

			/**
			 * @typesign (
			 *     listener: (err: Error|null, evt: cellx~Event) -> boolean|undefined,
			 *     context?: Object
			 * ) -> cellx.Cell;
			 */
			subscribe: function subscribe(listener, context) {
				function wrapper(evt) {
					return listener.call(this, evt.error || null, evt);
				}
				wrapper[KEY_INNER] = listener;

				this
					.on('change', wrapper, context)
					.on('error', wrapper, context);

				return this;
			},
			/**
			 * @typesign (
			 *     listener: (err: Error|null, evt: cellx~Event) -> boolean|undefined,
			 *     context?: Object
			 * ) -> cellx.Cell;
			 */
			unsubscribe: function unsubscribe(listener, context) {
				this
					.off('change', listener, context)
					.off('error', listener, context);

				return this;
			},

			/**
			 * @typesign (slave: cellx.Cell);
			 */
			_registerSlave: function _registerSlave(slave) {
				if (this.computed && !this._events.change && !this._slaves.length) {
					this._activate();
				}

				this._slaves.push(slave);
			},
			/**
			 * @typesign (slave: cellx.Cell);
			 */
			_unregisterSlave: function _unregisterSlave(slave) {
				this._slaves.splice(this._slaves.indexOf(slave), 1);

				if (this.computed && !this._events.change && !this._slaves.length) {
					this._deactivate();
				}
			},

			/**
			 * @typesign ();
			 */
			_activate: function _activate() {
				if (this._version != releaseVersion) {
					this._masters = null;
					this._level = 0;

					var value = this._tryFormula();

					if (value === error) {
						this._handleError(error.original);
					} else if (!is(this._value, value)) {
						this._value = value;
						this._changed = true;
					}

					this._version = releaseVersion;
				}

				var masters = this._masters || [];

				for (var i = masters.length; i;) {
					masters[--i]._registerSlave(this);
				}

				this._active = true;
			},
			/**
			 * @typesign ();
			 */
			_deactivate: function _deactivate() {
				var masters = this._masters || [];

				for (var i = masters.length; i;) {
					masters[--i]._unregisterSlave(this);
				}

				this._active = false;
			},

			/**
			 * @typesign (evt: cellx~Event);
			 */
			_onValueChange: function _onValueChange(evt) {
				if (this._changeEvent) {
					evt.prev = this._changeEvent;

					this._changeEvent = evt;

					if (this._value === this._fixedValue) {
						this._isChangeCancellable = false;
					}
				} else {
					releasePlan[0].push(this);

					releasePlanIndex = 0;

					if (maxLevel == -1) {
						maxLevel = 0;
					}

					evt.prev = null;

					this._changeEvent = evt;
					this._isChangeCancellable = false;

					if (!currentlyRelease) {
						nextTick(release);
					}
				}
			},

			/**
			 * @typesign () -> *;
			 */
			get: function get() {
				if (!currentlyRelease) {
					release();
				}

				if (this.computed && !this._active && this._version != releaseVersion) {
					this._masters = null;
					this._level = 0;

					var value = this._tryFormula();

					if (value === error) {
						this._handleError(error.original);
					} else {
						if (!is(this._value, value)) {
							this._value = value;
							this._changed = true;
						}
					}

					this._version = releaseVersion;
				}

				if (calculatedCell) {
					if (calculatedCell._masters) {
						if (calculatedCell._masters.indexOf(this) == -1) {
							calculatedCell._masters.push(this);

							if (calculatedCell._level <= this._level) {
								calculatedCell._level = this._level + 1;
							}
						}
					} else {
						calculatedCell._masters = [this];
						calculatedCell._level = this._level + 1;
					}
				}

				return this._get ? this._get.call(this.owner || this, this._value) : this._value;
			},

			/**
			 * @typesign (value) -> boolean;
			 */
			set: function set(value) {
				if (this.computed && !this._set) {
					throw new TypeError(
						(this.debugKey ? '[' + this.debugKey + '] ' : '') + 'Cannot write to read-only cell'
					);
				}

				var oldValue = this._value;

				if (is(oldValue, value)) {
					return false;
				}

				if (this._validate) {
					this._validate.call(this.owner || this, value);
				}

				if (this.computed) {
					this._set.call(this.owner || this, value);
				} else {
					this._value = value;

					if (oldValue instanceof EventEmitter) {
						oldValue.off('change', this._onValueChange, this);
					}
					if (value instanceof EventEmitter) {
						value.on('change', this._onValueChange, this);
					}

					if (this._changeEvent) {
						if (is(value, this._fixedValue) && this._isChangeCancellable) {
							if (releasePlan[0].length == 1) {
								releasePlan[0].pop();

								if (!maxLevel) {
									maxLevel = -1;
								}
							} else {
								releasePlan[0].splice(releasePlan[0].indexOf(this), 1);
							}

							this._changeEvent = null;
						} else {
							this._changeEvent = {
								target: this,
								type: 'change',
								oldValue: oldValue,
								value: value,
								prev: this._changeEvent
							};
						}
					} else {
						releasePlan[0].push(this);

						releasePlanIndex = 0;

						if (maxLevel == -1) {
							maxLevel = 0;
						}

						this._changeEvent = {
							target: this,
							type: 'change',
							oldValue: oldValue,
							value: value,
							prev: null
						};
						this._isChangeCancellable = true;

						if (!currentlyRelease) {
							nextTick(release);
						}
					}
				}

				return true;
			},

			/**
			 * @typesign () -> boolean|undefined;
			 */
			recalc: function recalc() {
				return this._recalc(true);
			},

			/**
			 * @typesign (force?: boolean) -> boolean|undefined;
			 */
			_recalc: function _recalc(force) {
				if (!force) {
					if (this._version == releaseVersion + 1) {
						if (++this._circularityCounter == 10) {
							this._fixed = true;
							this._version = releaseVersion + 1;

							this._handleError(new RangeError('Circular dependency detected'));

							return false;
						}
					} else {
						this._circularityCounter = 1;
					}
				}

				var oldMasters = this._masters;
				this._masters = null;

				var oldLevel = this._level;
				this._level = 0;

				var value = this._tryFormula();

				var masters = this._masters || [];
				var haveRemovedMasters = false;

				for (var i = oldMasters.length; i;) {
					var oldMaster = oldMasters[--i];

					if (masters.indexOf(oldMaster) == -1) {
						oldMaster._unregisterSlave(this);
						haveRemovedMasters = true;
					}
				}

				if (haveRemovedMasters || oldMasters.length < masters.length) {
					for (var j = masters.length; j;) {
						var master = masters[--j];

						if (oldMasters.indexOf(master) == -1) {
							master._registerSlave(this);
						}
					}

					var level = this._level;

					if (level > oldLevel) {
						(releasePlan[level] || (releasePlan[level] = [])).push(this);

						if (maxLevel < level) {
							maxLevel = level;
						}

						if (force) {
							nextTick(release);
						}

						return;
					}
				}

				this._fixed = true;
				this._version = releaseVersion + 1;

				if (value === error) {
					this._handleError(error.original);
				} else {
					var oldValue = this._value;

					if (!is(oldValue, value) || value instanceof EventEmitter) {
						this._value = value;
						this._changed = true;

						if (this._events.change) {
							this.emit({
								type: 'change',
								oldValue: oldValue,
								value: value,
								prev: null
							});
						}

						var slaves = this._slaves;

						for (var k = 0, n = slaves.length; k < n; k++) {
							var slave = slaves[k];

							if (slave._fixed) {
								var slaveLevel = slave._level;

								(releasePlan[slaveLevel] || (releasePlan[slaveLevel] = [])).push(slave);

								if (maxLevel < slaveLevel) {
									maxLevel = slaveLevel;
								}

								slave._fixed = false;
							}
						}

						return true;
					}
				}

				return false;
			},

			/**
			 * @typesign () -> *;
			 */
			_tryFormula: function _tryFormula() {
				var prevCalculatedCell = calculatedCell;
				calculatedCell = this;

				try {
					var value = this._formula.call(this.owner || this);

					if (this._validate) {
						this._validate.call(this.owner || this, value);
					}

					return value;
				} catch (err) {
					error.original = err;
					return error;
				} finally {
					calculatedCell = prevCalculatedCell;
				}
			},

			/**
			 * @typesign (err);
			 */
			_handleError: function _handleError(err) {
				this._logError(err);

				this._handleErrorEvent({
					type: 'error',
					error: err === Object(err) ? err : { message: err }
				});
			},

			/**
			 * @override
			 * @typesign (...msg);
			 */
			_logError: function _logError() {
				var msg = slice.call(arguments);

				if (this.debugKey) {
					msg.unshift('[' + this.debugKey + ']');
				}

				EventEmitter.prototype._logError.apply(this, msg);
			},

			/**
			 * @typesign (evt: cellx~Event);
			 */
			_handleErrorEvent: function _handleErrorEvent(evt) {
				if (this._lastErrorEvent === evt) {
					return;
				}
				this._lastErrorEvent = evt;

				this._handleEvent(evt);

				var slaves = this._slaves;

				for (var i = 0, l = slaves.length; i < l; i++) {
					if (evt.isPropagationStopped) {
						break;
					}

					slaves[i]._handleErrorEvent(evt);
				}
			},

			/**
			 * @typesign () -> cellx.Cell;
			 */
			dispose: function dispose() {
				if (!currentlyRelease) {
					release();
				}

				this._dispose();

				return this;
			},

			/**
			 * @typesign ();
			 */
			_dispose: function _dispose() {
				this.off();

				if (this._active) {
					var slaves = this._slaves;

					for (var i = 0, l = slaves.length; i < l; i++) {
						slaves[i]._dispose();
					}
				}
			}
		});

		cellx.Cell = Cell;

	})();

	(function() {

		var cellProto = Cell.prototype;

		applyCell = function applyCell(cx, initialValue, opts, owner, firstArg, otherArgs, argCount) {
			if (!owner || owner == global) {
				owner = cx;
			}

			if (!hasOwn.call(owner, KEY_CELLS)) {
				Object.defineProperty(owner, KEY_CELLS, {
					value: new Map()
				});
			}

			var cell = owner[KEY_CELLS].get(cx);

			if (!cell) {
				if (argCount >= 2 && firstArg === 'dispose') {
					return;
				}

				opts = Object.create(opts);
				opts.owner = owner;

				cell = new Cell(initialValue, opts);

				owner[KEY_CELLS].set(cx, cell);
			}

			switch (argCount) {
				case 0: {
					return cell.get();
				}
				case 1: {
					return cell.set(firstArg);
				}
				default: {
					switch (firstArg) {
						case 'bind': {
							cx = cx.bind(owner);
							cx.constructor = cellx;
							return cx;
						}
						case 'unwrap': {
							return cell;
						}
						default: {
							return cellProto[firstArg].apply(cell, otherArgs);
						}
					}
				}
			}
		};

	})();

	(function() {

		function observable(target, name, descr, opts) {
			if (arguments.length == 1) {
				opts = target;

				return function(target, name, descr) {
					return observable(target, name, descr, opts);
				};
			}

			if (!opts) {
				opts = {};
			}

			opts.computed = false;

			var _name = '_' + name;

			target[_name] = cellx(descr.initializer.call(target), opts);

			return {
				configurable: true,
				enumerable: descr.enumerable,

				get: function() {
					return this[_name]();
				},

				set: function(value) {
					this[_name](value);
				}
			};
		}

		function computed(target, name, descr, opts) {
			if (arguments.length == 1) {
				opts = target;

				return function(target, name, descr) {
					return computed(target, name, descr, opts);
				};
			}

			var value = descr.initializer();

			if (typeof value != 'function') {
				throw new TypeError('Property value must be a function');
			}

			if (!opts) {
				opts = {};
			}

			opts.computed = true;

			var _name = '_' + name;

			target[_name] = cellx(value, opts);

			var descriptor = {
				configurable: true,
				enumerable: descr.enumerable,

				get: function() {
					return this[_name]();
				}
			};

			if (opts.set) {
				descriptor.set = function(value) {
					this[_name](value);
				};
			}

			return descriptor;
		}

		cellx.d = {
			observable: observable,
			computed: computed
		};

	})();

	cellx.utils = {
		logError: logError,
		mixin: mixin,
		createClass: createClass,
		nextTick: nextTick,
		defineObservableProperty: defineObservableProperty,
		defineObservableProperties: defineObservableProperties
	};

	if (typeof exports == 'object') {
		if (typeof module == 'object') {
			module.exports = cellx;
		} else {
			exports.cellx = cellx;
		}
	} else {
		global.cellx = cellx;
	}

})();


text:
150 nations agree major deal in Rwanda to cut greenhouse gases
Sat, Oct 15, 2016 - 1:28 PM
About 150 nations meeting in Rwanda agreed a global deal to reduce greenhouse gases used in refrigerators and air conditioners, a Rwandan minister announced to loud cheers on Saturday, a major milestone in combating climate change.
[KIGALI] About 150 nations meeting in Rwanda agreed a global deal to reduce greenhouse gases used in refrigerators and air conditioners, a Rwandan minister announced to loud cheers on Saturday, a major milestone in combating climate change.
The deal, agreed by US Secretary of State John Kerry, divides countries into three groups with different deadlines to reduce the use of factory-made hydrofluorocarbon (HFC) gases, said Minister Vinncent Biruta.
Developed nations, including much of Europe and the United States, commit to reducing their use of the gas by 10 per cent by 2019.
Two groups of developing countries will freeze their use of the gas by either 2024 or 2028, and then begin gradually reducing it.
Mastercard beats profit estimates on strong holiday season spending
[BENGALURU] Mastercard beat Wall Street estimates for quarterly profit on Wednesday as customers spent more on its...

redpajama_set_name: RedPajamaCommonCrawl


text:
package com.javarush.test.level07.lesson12.bonus03;

import java.io.BufferedReader;
import java.io.InputStreamReader;

/* Задача по алгоритмам
Задача: Написать программу, которая вводит с клавиатуры 20 чисел и выводит их в убывающем порядке.
*/

public class Solution
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int[] array = new int[20];
        for (int i = 0; i < 20; i++)
            array[i] = Integer.parseInt(reader.readLine());

        sort(array);
        for (int x : array)
            System.out.println(x);
    }

    public static void sort(int[] array)
    {
        for (int i=0; i<=array.length-1; i++) {
            for (int j=array.length-1; j>i;j--) {
                if(array[j]>array[j-1]) {
                    int tmp = array[j];
                    array[j] = array [j-1];
                    array[j-1] = tmp;
                }
            }
        }
    }
}

redpajama_set_name: RedPajamaGithub


vintage industrial bar stools vintage industrial steel bar stools vintage industrial height adjustable swivel bar stool.
what is counter height stools bar stool height chart counter height bar stools size.
walmart bar stools swivel bar stools grey bar stools diner bar stools bar stools walmart outdoor swivel bar stools.
wood and iron bar stools practical chair 1 4 vintage solid wood wrought iron bar 1 4 the best choice for a restaurant cafe reclaimed wood and iron bar stools.
leather counter height stools gray genuine faux grey height stools brown white red counter bar real leather kitchens amazing the gray barn parker vintage pu leather counter height stools.
small bar with stools small bar stools small stools for sale bar stools small scale bar stools small leather bar small bar stools small square bar stool cushions.
counter height stools dimensions counter height vs bar height stools counter height stool dimensions barstool gold black card.
wooden seat bar stools square wooden seat bar stool high chair kitchen counter metal rustic industrial replica tolix wooden seat bar chair.
white and wood bar stools with or without backrest modern or classic in wood or fabric at white wood bar stools with back.
french bistro counter stool superb bistro counter stool stool bistro counter stools rattan french bistro bar stools.


text:
Home/News/Air Cargo/At FedEx, the pain continues, and the gain isn't in sight
Air CargoAsia-PacificCompany earningsEuropeLast MileLess than TruckloadNewsParcel
At FedEx, the pain continues, and the gain isn't in sight
Weak fiscal first-quarter numbers leaves some wondering if company has lost focus; the founder begs to differ
Mark Solomon Tuesday, September 17, 2019
The long road continues (Photo: Jim Allen/FreightWaves)
"There are two kinds of pain in this world," the actor Denzel Washington said in one of his films. "Pain that hurts, and pain that alters." Part of that quote could apply to the situation at FedEx Corp. (NYSE:FDX) following weak fiscal 2020 first-quarter results. The pain of the quarterly numbers, and the dramatic reduction in the full-year outlook, certainly hurts. However, it is unlikely to alter much of the company's long-term plan.
There was no effort to sugarcoat the numbers, which were released after the market closed Sept. 17. The shipping and logistics giant posted adjusted earnings per share of $3.05, compared to median projections of $3.17 per share taken from a poll of 10 analysts on Barchart. Revenue came in at $17.05 billion, essentially unchanged from the year before.
The full-year earnings outlook was the shocker. The company forecasted earnings of $10 to $12 per diluted share, or $11 to $13 per diluted share excluding the costs of the ongoing integration of TNT Express, which FedEx acquired in 2015 and which is still in the throes of a costly integration. In June, when it first telegraphed a sluggish fiscal 2020, FedEx said earnings per-share would decline by mid-single digits over FY 2019's level of $15.52 per adjusted share. In response, various analysts lowered their full-year forecast. However, even their revised numbers were well above what the company disclosed today.
The earnings outlook was revised further downward, FedEx said, because global macro conditions have weakened since the company's initial projections in late June, thus further pressuring revenues. U.S. GDP growth has dropped 20 basis points since last June to sit at 2.3%, while global GDP growth is at 2.6%, according to the company's projections. That has been due to the impact of the U.S.-China trade war as well as a general slowdown in the Chinese economy, which has a knock-on effect on European nations that are huge sellers to China.
But the issues at FedEx were more than related to the macro environment. Revenues were hurt by the loss in August of Amazon.com, Inc. (NASDAQ:AMZN) as a U.S. ground-delivery customer. The bottom line was hampered by higher than expected costs to build out its U.S. ground network to stay ahead of the e-commerce avalanche. The company has also spent about $900 million to modernize its global air express fleet in the face of low single-digit operating margins, a strategy that has left analysts like Amit Mehrotra of Deutsche Bank wondering where the increases in free cash flow will come from.
Shares were hammered in after-hours trading. As of 8 p.m. EDT, the share price was off about 10%, down more than $17 a share.
Mehrotra took FedEx to the woodshed in an after-earnings note, saying the company continues to blame its problems on macro forces and ignores the impact of multi-year missteps such as the slow progress on the TNT integration, the multi-billion dollar acquisition of reverse logistics provider, Genco, which by most accounts has not paid significant dividends, and "seemingly no relief" on capital spending, which will hit $5.9 billion in FY 2020 and be about the same in FY 2021.
Mehrotra lowered his rating to hold on shares and cut his target price to $142 from $178. "While some may view this as the bottom in shares, we don't see any support until management takes responsibility for recent performance and clearly articulates a credible path to better results and cash flow (and delivers on it). In the meantime, shares will continue to melt lower, and rightfully so," he wrote.
Satish Jindel, founder and CEO of consultancy ShipMatrix and who has worked with and followed FedEx for decades, said the company needs to merge its high-margin ground and express operations into one unit, a move Jindel said would drive $3 billion a year to the bottom line by eliminating the high-cost, low-yielding flying business and focus on lower-cost and more dynamic ground services.
The biggest obstacle to that development, he said, is cultural. FedEx Express is the company's historic core, the mechanism by which it grew into a $70 billion a year colossus. Frederick W. Smith, the company's founder, chairman and CEO, would be loath, to say the least, to eliminate the brand. "They refuse to accept the fact that the natural-born child is no longer as profitable as the adopted one," said Jindel, a reference to FedEx's 1997 acquisition of Caliber System, Inc. that put FedEx in the ground delivery business nearly 25 years after its founding.
Smith, for his part, told analysts today that the units will not be merged, saying he is happy with the way they operate. He also took umbrage with the notion that his company is hard-headed and refuses to change. The fleet modernization efforts will yield enormous savings over time in operating efficiencies. What's more, 80% of the company's customers use its express, ground and less-than-truckload services (LTL). Cutting costs too deeply at one unit could hurt competitiveness at the others, he said. In addition, FedEx faces stiff competition across its three units, and must invest to remain competitive, Smith added.
In the U.S., the holy grail is to dominate the short-haul market supporting e-commerce deliveries. The company has said it will be the low-cost ground provider in the U.S. when the network buildout is complete. In Europe, the FedEx and TNT Express physical networks should be fully integrated by the end of May 2020, the company said.
The company also took issue with the perception that it is a profligate spender on aircraft and that it can't let go of what got it here. The company is retiring 20 aging MD-10-10 and Airbus A-310 freighters, and it is parking capacity that is roughly equal to seven MD-11 aircraft. Despite the fleet modernization costs, FedEx will actually be retiring more lift than it is taking on, executives said.
(Note: An earlier version incorrectly described global GDP growth at 2.3%. It should have been US GDP growth at that level).
Deutsche Bank FedEx TNT Express
Mark Solomon
Formerly the Executive Editor at DC Velocity, Mark Solomon joined FreightWaves as Managing Editor of Freight Markets. Solomon began his journalistic career in 1982 at Traffic World magazine, ran his own public relations firm (Media Based Solutions) from 1994 to 2008, and has been at DC Velocity since then. Over the course of his career, Solomon has covered nearly the whole gamut of the transportation and logistics industry, including trucking, railroads, maritime, 3PLs, and regulatory issues. Solomon witnessed and narrated the rise of Amazon and XPO Logistics and the shift of the U.S. Postal Service from a mail-focused service to parcel, as well as the exponential, e-commerce-driven growth of warehouse square footage and omnichannel fulfillment.
Jacobs to exit most of XPO the way he entered — unconventionally
Amazon lifts third-party seller ban on use of FedEx Ground
CBP taps nine firms for e-commerce data pilot
Saia's CFO leaves for top executive job at Americold
UPS identifies two drivers killed in Pennsylvania Turnpike crash
Braden D Kayganich says:
Wednesday, September 18, 2019 at 3:27 pm
The units should've have been merged years ago to create better synergy within FedEx.. They'll find out the hard way next year…


text:
Home Our School Faculty & Staff Susan Johnsen
Susan Johnsen
Kindergarten B.S. Utah State University
Susan B. Johnsen, is a graduate of Utah State University where she earned a B.A. She majored in Early Childhood Education and minored in Children's Literature. While at USU she was awarded the coveted Greeves Memorial Scholarship. Susan loves to dance and was a performer in the USU dance company while also performing in community theater in her home town. Susan began her teaching career with a move to Connecticut so her husband, Ken Johnsen, could attend Yale Law School. Her first teaching job was at Gan Hayeled Nursery School of B'Nai Jacob Synagogue in Woodbridge, CT (1983 – 1985). In the afternoons, she worked as an Extended Day teacher at St. Thomas More, a private elementary school in Hamden, CT. Her next move was to San Francisco, CA for Ken's judicial clerkship. Susan earned a teaching appointment at The Laurel School, a private elementary school that specialized in educating children with learning disabilities (1985-1986). The following year the Johnsens moved back to Utah, and Susan began teaching for the Waterford School in the preschool program during the first two years of the Sandy City Waterford campus (1986 – 1988). Susan then switched roles and became a Waterford parent for ten years. She returned to Waterford as a Class IV teacher in 2000. Prior re-entering the classroom, Susan served as Lower School Director, she was a Class IV teacher (2000 – 2012), Lead Teacher for Classes III – IV (2009 – 2012), Lower School Community Service Coordinator (2006 – 2009), and a preschool teacher (1986 – 1988). Susan received the Waterford Educator Prize in 2011. Susan's three children are all Waterford graduates. She is extremely appreciative of the lasting impact their Waterford education continues to have on the their lives. She enjoys hiking, snow skiing, water skiing, reading, teaching, and traveling.


text:
Sushi Koshō
Author: Karen Hart
Yuzo kosho is a spicy, acidic condiment that enlivens any dish and is commonly used in Japan. It's also the inspiration behind Sushi Koshō, a Japanese jewel of a restaurant in Sebastopol, which recently reopened. When heavy rain flooded the industrial-chic outdoor market in February last year, Sushi Koshō was forced to close five months after opening, but chef-owner Jake Rand took it in stride and made use of the down time. "We were open just long enough to learn how to improve the customer experience," he says. "We used this calamity as an opportunity to make design changes that helped us improve our operation."
The newly-designed space offers a modern, warm vibe and includes a sushi bar where guests can watch the culinary team work, as well as a sake bar. Alex and I arrive on a Wednesday evening and begin with a glass of sake, Shichi Hon Yari, Junmai, which is served spillover-style for prosperity in Japanese tradition. Neither of us was sure how to approach the glass overflowing with sake, so our server, Kinder Weise, gave us a couple tips. In the spirit of the evening, we dipped our heads low and leaned over like two cranes to take a few sips, before raising our glasses to toast our Japanese-style adventure. A dry sake with fresh notes of grapefruit and melon, it was a refreshing change of pace. Afterward, Alex poured his in the masu box and drank from there, and I drank mine directly from the glass and used the box as a cup holder.
We begin with a selection of starters, one being the special of the evening—okonomiyaki, a savory Japanese pancake with a lot of flavor and generously garnished with a mushroom medley and pickled ginger. "It's a popular street food in Japan," says Rand. A spectacular combination of flavors and textures, it's served warm and is both delicate and crispy. This is a great starter to share, or could serve as a meal on its own. (And yes, it's served with a fork, in case you're wondering how to manage a pancake with chopsticks.) We also shared two additional small plates—trumpet mushrooms, served warm with eggplant puree, baby vegetables and soy-garlic butter, as well as the Bluefin avocado sashimi. Artfully plated, the avocado is topped with tuna and a crispy potato and served with onion dressing.
For the entrée, we shared one of Rand's signature dishes, the double down roll, which includes a tempura fried shrimp with snow crab, cilantro and cucumber, topped with tuna and avocado. There's definitely a studied art to sushi and this dish is an elegant and satisfying combination of flavors and textures, served with a wasabi that has a lovely, fluffy whipped texture. Chef Rand is passionate about the cuisine, which began as a child when his father worked for a company that imported and packaged Japanese food products. Later, he worked at Denver's acclaimed Sushi Den, before enrolling in the Japanese studies program at the University of Colorado in Boulder and traveling throughout Japan. His passion for the culture and impeccable attention to detail is evident in each artful creation.
Most people I know either love sushi or could live without it, but Rand points out there are two populations within the could-live-without-it category—the non-sushi eaters and the sushi-curious, who are mostly unsure how to order. If you fall into either category, not to worry. Sushi Koshō is a low-key welcoming restaurant where the servers are attentive and unobtrusive in the Japanese tradition, but if you ask for recommendations, the wait staff is happy to lead the way. There's something for everyone at Sushi Koshō. For the non-sushi eaters, try the wagyu short ribs—always a crowd pleaser—or the salmon tartar tacos when they're on the menu. "We strive for fantastic sushi, but are also inclusive for the people and families in the community," he says. "A go-to place for special occasions, small victories and Wednesday nights out."
For dessert, we shared the matcha butter cake. Served warm from the oven, it's a moist, lightly sweetened confection. Next time you're going out for sushi—or even if you're not—check out Sushi Koshō and prepare yourself for an extraordinary adventure where the cuisine is unique, varied, exciting and most of all, delicious.
The World Financial Rollercoaster
10 Breakthrough Technologies
The Science of Hope
On The Road To Driverless Cars
Parlez-vous Francais?
Guest Column: 5 Steps to a Healthy Heart
Alcohol Free Forces Gain Momentum
Sharing the Secrets of Success
2017 BEST Business Restaurant: John Ash & Co.
For Now No Pot Infused Wine Allowed in California
If Old Vines Could Talk
Gorgeous Getaways
Landesign Construction & Maintenance, Inc.
2017 BEST Company to Do Business with in Marin County: Bradley Real Estate
2018 BEST Builder/Contractor: Ghilotti Construction Company
Todd Zapolski
Affordable Housing is Crucial to a Thriving Community


text:
"She loved fine things and had no doubt that she deserved them…"
As dawn breaks over a Southern coastal town in Sri Lanka, Biso, a desperate young mother, flees from her murderous husband, taking her children with her to find refuge and a better life in the hill country. In an upper-class home in the capital city of Colombo, Latha, a five year old, is brought in as a companion and lifelong servant to a girl her own age though, in her heart, Latha knows she was born for finer things, like the rose-smelling Lux soap she steals, the glasses of fresh lime juice that she helps herself to and the brand new shoes she begs for.
As Biso and Latha journey toward their separate fates, struggling to hold on to their independence, each will make a choice to betray the people they love, changing the course of their lives forever.
Published in July, 2009, in the US and Canada by Atria Books, a division of Simon & Schuster. Also published in the Netherlands by Mistral, and forthcoming in the UK and territories from Viking, in Italy from Piemme, in Israel from Matar Publishing, in Taiwan from Marco Polo Press and in Brazil from Nova Fronteira.
Praise and Reviews
"A thrilling debut: Ru Freeman has given us a wonderfully bold and determined protagonist in a richly drawn, complex, fascinating story. I loved it." — Lynn Freed, author of The Servants' Quarters.


text:
Beowulf,  staroengleski junački ep s više od tri tisuće stihova, djelo nepoznatog pjesnika.
 Beowulf (heroj), glavni lik istoimenog epa
 Beowulf (računarstvo)

redpajama_set_name: RedPajamaWikipedia


text:
By Frederick Reese @FrederickReese
Thousands of anti-austerity demonstrators took to the streets of Athens on Wednesday, February 20, 2013, as unions staged a general strike to protest the government's spending cuts and tax hikes, which some predict will push unemployment to a stunning 30 percent this year. As Greece's economy continues its downward spiral, reports now tell of children going hungry. (Photo/linmtheu via Flickr)
Leonidas Nikas is an elementary school principal in Greece. Recently, he has noticed something he wholeheartedly thought was impossible in his country — children bent over in hunger pains; children pleading to each other for food; children scouring trash cans for anything edible. "Not in my wildest dreams would I expect to see the situation we are in," Nikas told The New York Times. "We have reached a point where children in Greece are coming to school hungry. Today, families have difficulties not only of employment, but of survival."
Nikas is not alone in his concern. Victoria Prekate, a secondary school teacher and psychologist in Athens, told The Guardian:
"It has been a common secret among PE [physical education] teachers for some time now that they don't expect pupils to do PE anymore, because many of them are underfed and get dizzy. They need to be discreet, as these underprivileged children don't wish to be exposed to their peers. In my previous school, the teachers arranged among themselves to give the school canteen some money, so that the canteen could give the child a snack, without embarrassing the child."
"However, this was not enough," Prekate continued.
"In many schools today, it is the parents' associations who come together, gather food and discreetly arrange to allocate it to those families of the school who are suffering. In cooperation with the teachers, they know which children in the school are hungry and in need of help. Again, they try to do it as discreetly as possible. Many families, suddenly left without work, are in shock and there is nowhere to turn. Social services are collapsing. They are not professional beggars. They are ordinary people like you and me, suddenly left with nothing. I know one area, where schools have specialised in what they gather: 1st primary school gather rice and legumes, 2nd vegetables, 3rd meat and chicken etc."
Greece, however, is not alone among nations in having hungry children.
Childhood hunger in the U.S.
It might seem ridiculous to think that history's wealthiest nation has hungry children, but in the U.S., 10.6 million children who are eligible for the Supplemental Nutrition Assistance Program (SNAP) — the principal component of the nation's domestic hunger safety net — are denied access. Nationwide, one in six individuals faces hunger, with 20.6 percent of all households reporting having children facing food insecurity. This is more than twice the rate of what Greece faces. As of 2011, 17.9 million Americans were food insecure.
Also, 50.1 million Americans struggle to put food on their tables. Among Black and Latino children, one in three is hungry. The District of Columbia, which is predominantly Black, has a food insecurity rate of 30.7 percent. Arizona has a rate of 29 percent, Oregon 29 percent, Florida 28.4 percent, Mississippi 28.3 percent, Texas 27.1 percent, California 26.8 percent. This is, by any definition, a national tragedy.
It is estimated that a family must have an income at least twice the federal poverty level to cover all basic expenses. Based on this standard and on U.S. Census information, 45 percent of all American families do not have the income to adequately feed and provide for themselves.
Yes, that's 45 percent
While it can (and should) be argued that the hunger problem is a facet of poor governmental decision-making, one must consider that 40 percent of the food grown and produced in the U.S. is thrown away. That's approximately $165 billion in food that is discarded every year. This food could feed an estimated 25 million people.
Children go to school hungry, cannot learn as effectively as they would with a full stomach, and fall behind. The nation is facing a precipice in which it cannot adequately provide for and train the next generation. According to Share Our Strength, three out of five teachers attest to regularly seeing children arrive to their classrooms hungry, and four in five attest to seeing children arrive to school hungry at least once a week.
President Obama has resolved to eliminate childhood hunger by 2015, but remedial actions — such as raising the federal minimum wage — are continually rejected by congressional Republicans. Corporate initiatives such as Share Our Strength and nonprofits such as Feeding America are making a difference in resolving this epidemic, but the major fact of the matter remains: There has been no debt crisis to justify why the U.S. allowed hunger levels among American children to eclipse that of the Third World. Only through decisive corrective action and bold leadership will this problem be solved.
"Drowning on dry land"
The difference between Greece's hunger problem and America's hunger problem lies in the fact that Greece doesn't have the money to fix the problem. Greece is facing imminent financial collapse. Crippled by massive debt and driven to the brink of insolubility by radical austerity policies, Greece, whose economy was based largely on social initiatives, government spending and tourism — and whose austerity initiatives and subsequent intense protests all but eliminated any possible growth — is now faced with 27 percent unemployment. To put this in perspective, Greece's unemployment is higher now than the United States' unemployment rate was during the 1930s Great Depression.
Greece, as of 2011, had government debt in excess of 170.6 percent of its gross domestic product. There are reports of massive abuse of tax rolls, and many businesses and individuals choosing not to pay their assessed taxes in part due to a government that is unable to enforce its own tax laws. Yanis Varoufakis, a Greek economist, wrote of the situation,
"The Greek economy is finished. The Greek economy is in a great, great depression … There is no power, no force within the Greek economy, within Greek society that can avert it … Imagine if we were in Ohio in 1931 and we were to ask: What can Ohio politicians do to get Ohio out of the Great Depression? The answer is nothing."
In 2012, about 10 percent of all Greek elementary and middle school students suffered from "food insecurity," which means that the children was hungry or was in danger of becoming hungry. "When it comes to food insecurity, Greece has now fallen to the level of some African countries," said Dr. Athena Linos, a professor at the University of Athens Medical School who also heads a food assistance program at Prolepsis, a non-governmental public health group that has studied the situation.
Unlike the U.S., Greece has no school nutrition programs. Parents are required to either send children to school with a prepared lunch or with money to buy food from the canteen. Due to further austerity measures, such as higher electricity taxes and subsidy cuts to large families, many children must go to school with nothing to eat.
"All around me I hear kids saying: 'My parents don't have any money. We don't know what we are going to do,' " said Evangelia Karakaxa, a 15-year-old at the No. 9 junior high school in Acharnes. "Our dreams are crushed."
Evangelia's parents are unemployed but she says she's not in the same dire situation as her peers. "They say that when you drown, your life flashes before your eyes. My sense is that in Greece, we are drowning on dry land."
A 2012 United Nations' International Children's Emergency Fund (UNICEF) report indicates that among the poorest Greek household with children, more than 26 percent eat an "economically weak diet." This is a phenomenon that typically hits the immigrant community the hardest, but has been recently affecting the urban permanently unemployed. Rural residents can, at least, mitigate the problem by growing food.
A "Slap in the Face:" Anger at Pelosi, Democrats Over Paltry $600 Stimulus Check
Lee Camp: Unemployment Skyrocketing? An Evolved Society Would Celebrate
Bolivia: New Gov't Sets to Work Undoing Damage Left by US-Backed Añez Regime


text:
Download The Doc's App
Alexa, Play The Doc
The Doc
Dr. Brew
Request a Song or Send Feedback
The Doc VIP
The Musical DoctorThe Musical Doctor
The Doc Wants You To See The Who in St. Paul!
Ethan Miller/Getty Images
The Doc's excited to send you to see legendary rockers, The Who, when their amazing Moving On Tour heads to Minnesota!
Roger Daltry and Pete Townsend have combined for some incredible music over the years. Which is why the Doc is so excited to hook you up a pair of tickets to see their new Moving On Tour when it comes to the Xcel Energy Center in St. Paul Friday, September 6th!
And, it's easy to win! First, just download our all-new 103.9 The Doc app on your phone. (Download it HERE.) Then, enable notifications, click on the Words With The Who tab and enter the codes the Doc sends you! (He'll send app users a new code word every day now through Labor Day. When you get a code word, enter on the app-- the more code words you enter, the more chances you have to win!)
Here's more about the Moving On Tour, courtesy of the Xcel Energy Center site:
For Who fans everywhere, the announcement of a brand new tour means only one thing: the world's most untamable rock band is about to deliver the goods once again. Never ones for nostalgia, singer Roger Daltrey and guitarist and songwriter Pete Townshend will be unleashing the combustible force that is The Who, with symphonic accompaniment this summer and fall in 2019.
The Who will also be releasing their first album of new songs in thirteen years later this year. On stage, the line-up will be rounded out by familiar Who players featuring guitarist/backup singer Simon Townshend, keyboardist Loren Gold, bassist Jon Button and drummer Zak Starkey, and complemented by some of the best orchestras in the U.S. and Canada.
The Who debuted in 1964 with a trio of anthems "I Can't Explain," "The Kids Are Alright" and "My Generation." Since then they have delivered to the world hits such as "Baba O'Riley," "Won't Get Fooled Again," "Pinball Wizard," "Who Are You," and" You Better You Bet."
Listen to Curt St. John from 6 to 10 a.m. on Quick Country 96.5
and from 10 a.m. to 2 p.m. on 103.9 The Doc
Get More Rochester & MN Stories + Listen Live w/ Our New App!
Source: The Doc Wants You To See The Who in St. Paul!
ScreenCrush Network
2020 103.9 The Doc is part of the ScreenCrush Network, Townsquare Media, Inc. All rights reserved.


Basement Wall Systems Explained | DoItYourself.comRead this article for advice on basement wall systems.
How to Finish a Basement Wall | Family HandymanFinishing a basement is a perfect DIY project. For a fraction of the cost of an addition, you can convert basement space to valuable living space. Advances.
MAGIC WALL - Basement Finishing System - YouTube29 Mar 2013 ... Magic wall is an advanced do-it-yourself basement wall finishing system. With minimal time, and effort, you can install the Magic wall basement finishing system yourself. Magic wall keeps out moisture, is insulated, and is load bearing. Magic wall is manufactured by Dry basement HouseHolder systems in Iowa. Please call 888-353-6250 for more information. basement wall finishing materials are shipped nationwide.
How to finish a basement yourself. Oh I would love to finish our ...How to finish a basement yourself. Oh I would love to finish our basement. Well, by me I mean my husband. LOL.
Best 25+ Basement wall panels ideas on Pinterest | Decorative ...Faux Brick wall Panel - DIY Tutorial. Fake Stone wallFake Brick wallsFaux Brick wall PanelsBrick Veneer wallFaux Stone PanelsWhite Brick wallsWhite BricksSponge Painting wallsBrick wall Decor. I would LOVE to do this on a small scale (piece of plywood) and photograph my science posters against it. But, I would probably paint it white.


Do not be fooled, Guam internet is just as advanced in technology like the rest of the world. Wireless internet is available throughout the residences, businesses, coffee shops, hotels, and restaurants of the island. There are four wireless internet providers for your home or office on Guam: IT&E, iConnect, Marianas Cable Vision (MCV), and Guam Telephone Authority (GTA).
IT&E offers you two bundle packages for your Guam internet, home phone, and cellphone. The only difference between the two bundles is one is 3.0 internet ($99.00/mo) and the other is 5.0 internet ($129.00/mo). Both have the same home phone features (which is call waiting, speed dialing, 3-way calling, caller ID, delayed call forward, find me/follow me, and four free calling features) and cellphone features (which is unlimited nights/weekends, unlimited SMS, and free Gusto2 or DeeJay 2). For more information on their wireless services, please visit www.ITE.net or 671-922-4ITE (4483).
iConnect is fairly new to the world of internet but be assured they are just as advanced as the other competitors. Their signature service showcases their iConnect LTE True 4G MiFi that offer home/office routers, portable wireless hotspots, USB modem, or for larger businesses a more advanced internet service. They take pride on their network, because the same company that built their network also built AT&T and Verizon. Unfortunately there are no prices for their services online, but please feel free to explore more information at www.iconnectguam.com or call 671-888-8888.
MCV has been providing Guam internet for some years now, and their service is one of the top providers on the island. Their internet service speeds go from Online 2.0 to Online 15.0. They are offer bundles of home phone, cable television and internet that range from $60.00 per month to $196.00 per month. For those specifically looking for internet access only, prices range from $34.95/mo to $115.00/mo. Pay your bill online, or direct for your convenience. For more information on MCV's services please visit www.mcvguam.com or call 671-969-4MCV (4628).
GTA is one of the leading providers of Guam internet, offering several internet plans to fit your budget, internet speed preferences, and bundle packages that include home phone, digital TV, and cellular services. Internet services alone go from speeds of 2.5Mbps to 10.0Mbps; the lowest price for monthly services start at $39.95 to $79.95, but keep in mind that bundle packages may be cheaper. Their high speed internet features include free secure Wi-Fi, 24/7 customer support services, easy installation, unlimited access, convenience of using phone and internet simultaneously, and free wireless modem. For more information on GTA's services, fees, and customer support please visit www.gta.net or call 671-644-4GTA (4482).
***Note: this article explains only internet service providers for your home or office. Information on data plans for cellular phone providers can be found under Mobile Phone.


This is Attollo, a cost effective, out-of-the-box SharePoint intranet designed to help your business get things off the ground – in an instant.
With well over a hundred successfully built, designed and launched intranets; co-founders, Mark Stokes and Sam Dolan realised that a new customer wanted the same important features and key pages as the previous 100. From that day, we decided that building a cost effective, out-of-the-box SharePoint intranet was the way forward – Attollo was born.
Mark Stokes has over 15 years industry experience building SharePoint collaboration sites, intranet sites and hosted applications. Mark spent much of his career as a consultant working with leading enterprises such as Unilever, Kelloggs, McLaren, University of Manchester and more.
For the last 3 years Mark has been awarded with the prestigious Microsoft Most Valuable Professional award which signifies his position within the technical community as a thought leader and influencer.
Sam Dolan is a SharePoint UX & UI Specialist with 15 years of web design experience, 10 of those in the SharePoint industry. Sam has worked for some of the biggest companies in the world including ExxonMobil, BP, Microsoft and more recently overseas Oman with PDO as their SharePoint Design Lead.
As a company, we believe in building strong relationships and helping people, teams and organisations collaborate the best way possible. Our 'Attollo Core' is not only the starting point for our product and its development platform, it's the starting point of our business and what we offer to our customers.


There are two definitions for the French word, "caviste". The first is the enological one in that it is the person in charge of the cellar. The second would be easy to translate simply as "wine shopkeeper" but that wouldn't really be giving the profession its due as Parisians (and undoubtedly the rest of the French) believe that, much like a reliable doctor, once you find a caviste that understands you, you keep them for life.
This is an aspect to wine that is lost in a great deal of the world and especially in the US where it seems most people feel that they can find their wines just fine on their own, and that the Robert Parkers and [shudder] James Sucklings have supplanted the caviste. The beauty of the caviste profession is that they not only provide you with your go-to tipple, but also expose you to new wines that you might not have thought to try or don't have the means to try as these people are invited by the wine industry all over the world to learn about their wines and regions.
While living in San Francisco, we were fortunate to have a reliable caviste in the form of Ceri Smith (pictured above) with her lovely neighborhood shop, Biondivino. Ceri knew what we liked and could help us find it at many different price points. While she specializes in Italian wine, she knows about all manner of wines as a whole and continues to be a go-to fount of wine knowledge.
We were reminded of Ceri after spending a week in Paris. In Spain, the caviste somewhat exists, but has been largely supplanted by the supermarkets and the almighty Euro in determining what people buy (Don Simon anyone?). But, in Paris, it's still a thriving and pervasive trade which is also quite essential given that French wine regions make your head spin long before getting anything in your glass. While tempted by the prices at Monoprix, Franprix, and the other supermarkets that offer decent choices near where we were staying by Canal Saint Martin, it was much more pleasant to head to little neighborhood shops like Au Quai on 15 Rue Alibert and La Cave du Daron on 140 Avenue Parmentier. Despite not knowing anything about us, like fortune tellers, they were quite quickly able to deduce what would be a good choice without talking down to us or forcing their tastes upon us and we were wonderfully happy with all the bottles we picked up.
Also a wonderful curiosity was the "mobile caviste" who sets up shop at the farmer's market on Rue Alibert each Sunday. It wasn't anything fancy, just a guy who rolled up with a truck, put out a selection of bottles and hung up a sign. It was however wonderfully effective and we were quite annoyed that we wouldn't be around the following Sunday to take advantage of what were some of the best wine picks including our first exposure to a wine made almost fully of Négrette.
Of course once heading back to Catalonia, we found our latest box from the online wine club Wineissocial waiting for us. Unlike Lot18 which has had mixed success in the US and UK, Wineissocial has done well in creating a unique platform with wines selected by well-known sommeliers offered up each month in a pack of two to their members. While it doesn't have the personal touch of the caviste, it does offer a very nice, 21st century option delivered to your home (in Spain anyways) each month.
Maybe it's because the local bartender has supplanted the caviste in many countries, but even just this short exposure made us wish the profession was more prolific like in France.
In Spain yes, there have always existed the "cavistes" but they used to sell a bulk wine. Then, they started offering some labelled wine, I remember those days! And now, wirh over 70% of the wine sold in supermarkets showing zero sentiment for wine, there are some franchises selling a,b,c and some independant fighting for surviving but making a great job.
Thanks, it's good to be back. We miss the Catalan wines a great deal, especially after opening a bottle of Mas Mallola from Marco Abella right after being south of the border.
You do indeed see some of these wine shop keepers here in Spain, but very, very few are at the caviste level. They mostly just say, "Okay, sure, here's a wine. It's good" if they do anything at all and you're right in that many of them are old a granel shops where it's mainly old men getting a 5L jug of something cheap.
On the flight home I watched an interesting documentary on wine and global warming. One of the people in it was from Barcelona and she was a professional wine taster and guide. She had a "shop" with 3,500 kinds of wine. I did not catch her name, but they actually talked a bit about Priorat, I felt so smug that I knew about this region. You and Elia probably know her, small world.


text:
Chasing Down A Good Time by Randy Houser (@RandyHouser)
July 16, 2016 by Dayne Shuda Leave a Comment
Where will this one end up on the chart?
I wasn't sure how Song Number 7 would do as a single for Randy Houser. It's certainly a good song, but something about it just seemed a little off for country radio. It looks like the single only peaked around #40 on the charts. Now it looks like Randy and his label are moving on to a new single. There's nothing wrong with that especially when you have an album full of good songs.
Here is the next one…
Chasing Down A Good Time – Randy Houser
This one fits right in with Randy's style. The song kind of has it's subdued moments and then it has those big chorus parts where Randy really gets into it with the vocals. That's one of his signatures and something that his fans have come to love over the years.
The song is straightforward in the lyrics. It seems to about a couple that's got nothing too crazy too do for the night, but they're looking at chasing down a good time and really enjoying a night together. I think it's a good song as we head into the later parts of the summer.
It's kind of that summer love song where people will be listening to this as their summers come to an end and thus the love kind of comes to an end. Then I could see this one peaking in September and October and those people kind of look back fondly at the love that they had.
This one could go either way for him. I'm not sure how to call it on the charts.
Chart Estimate: #10
CML Points: 83/100
Filed Under: Randy Houser Tagged With: Love, Men, Randy Houser, Song