process.stdin.resume();
process.stdin.setEncoding('utf8');
/**
* Функция копирования объектов на пол шишечки
* элементы внутри копируемого объекта копируются по ссылке
*
* @param {(Object|Array|Date)} object - Копируемый объект
* @return {(Object|Array|Date)} objectClone - Копия объекта
*/
function shallowCopy(object) {
var objectType = getTypeOf(object);
if (objectType == "Array") {
var objectClone = [];
for(var i = 0; i < object.length; i++) {
objectClone.push(object[i]);
}
} else if (objectType == "Object") {
var objectClone = {};
for(key in object) {
objectClone[key] = object[key];
}
} else if (objectType == "Date") {
var objectClone = new Date(object.getTime());
}
return objectClone;
}
/**
* Функция определяет тип переменной
*
* @param value - Переменная, тип которой определяется
* @return {string} - Одна из строк:
* 'undefined',
* 'boolean' (для true/false),
* 'null', !object
* 'number',
* 'string',
* 'function',
* 'Array', object
* 'array-like', !object
* 'Arguments'
* 'Object',
* 'Date'
* @throw {Error}
*/
function getTypeOf(value) {
if (arguments.length != 1) {
throw new Error("Require 1 argument, given: " + arguments.length);
}
var type = typeof(value);
if (type == "object") {
// Определение null
if ( value === null) {
return "null";
}
// Определение всего остального: arguments, object, date
return {}.toString.call(value).slice(8, -1); // Отрезает первую часть выражения [object ...]
} else {
return type;
}
}
var a = { x: 1, y: 2, z: [1, 2, 3] };
var b = shallowCopy(a); // b — это отдельный объект
b.diff = "this is it";
console.log("a = ", a);
console.log("b = ", b);
b.x = 10;
console.log("b.x = ", b.x);
console.log("a.x = ", a.x);
// Но a.z и b.z указывают на один и тот же массив:
b.z.push(4);
console.log("b.z.push(4), b.z = ", b.z); // [1, 2, 3, 4]
console.log("a.z = ", a.z); // [1, 2, 3, 4]
var a = [1, 2, 3]
var b = shallowCopy(a); // b — это отдельный объект
console.log("a is Array, a = ", a);
console.log("b is Array too, b = ", b);
var a = new Date(2011, 0, 1, 2, 3, 4, 567);
var b = shallowCopy(a); // b — это отдельный объект
console.log("a = ", a);
console.log("b is Date too, b = ", b);
cHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTsKcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZygndXRmOCcpOwoKCi8qKgogKiDQpNGD0L3QutGG0LjRjyDQutC+0L/QuNGA0L7QstCw0L3QuNGPINC+0LHRitC10LrRgtC+0LIg0L3QsCDQv9C+0Lsg0YjQuNGI0LXRh9C60LgKICog0Y3Qu9C10LzQtdC90YLRiyDQstC90YPRgtGA0Lgg0LrQvtC/0LjRgNGD0LXQvNC+0LPQviDQvtCx0YrQtdC60YLQsCDQutC+0L/QuNGA0YPRjtGC0YHRjyDQv9C+INGB0YHRi9C70LrQtQogKgogKiBAcGFyYW0geyhPYmplY3R8QXJyYXl8RGF0ZSl9ICBvYmplY3QgICAgICAgIC0g0JrQvtC/0LjRgNGD0LXQvNGL0Lkg0L7QsdGK0LXQutGCCiAqIEByZXR1cm4geyhPYmplY3R8QXJyYXl8RGF0ZSl9ICBvYmplY3RDbG9uZSAgLSDQmtC+0L/QuNGPINC+0LHRitC10LrRgtCwCiAqLwpmdW5jdGlvbiBzaGFsbG93Q29weShvYmplY3QpIHsKICAgIAogICAgdmFyIG9iamVjdFR5cGUgPSBnZXRUeXBlT2Yob2JqZWN0KTsKICAgIAogICAgaWYgKG9iamVjdFR5cGUgPT0gIkFycmF5IikgewogICAgICAgIHZhciBvYmplY3RDbG9uZSA9IFtdOwogICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgb2JqZWN0Q2xvbmUucHVzaChvYmplY3RbaV0pOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAob2JqZWN0VHlwZSA9PSAiT2JqZWN0IikgewogICAgICAgIHZhciBvYmplY3RDbG9uZSA9IHt9OwogICAgICAgIGZvcihrZXkgaW4gb2JqZWN0KSB7CiAgICAgICAgICAgIG9iamVjdENsb25lW2tleV0gPSBvYmplY3Rba2V5XTsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG9iamVjdFR5cGUgPT0gIkRhdGUiKSB7CiAgICAgICAgdmFyIG9iamVjdENsb25lID0gbmV3IERhdGUob2JqZWN0LmdldFRpbWUoKSk7CiAgICB9CiAgICAgICAgCiAgICByZXR1cm4gb2JqZWN0Q2xvbmU7Cn0KCi8qKgogKiDQpNGD0L3QutGG0LjRjyDQvtC/0YDQtdC00LXQu9GP0LXRgiDRgtC40L8g0L/QtdGA0LXQvNC10L3QvdC+0LkKICoKICogQHBhcmFtICB2YWx1ZSAgICAgLSDQn9C10YDQtdC80LXQvdC90LDRjywg0YLQuNC/INC60L7RgtC+0YDQvtC5INC+0L/RgNC10LTQtdC70Y/QtdGC0YHRjwogKiBAcmV0dXJuIHtzdHJpbmd9ICAtINCe0LTQvdCwINC40Lcg0YHRgtGA0L7QujoKICogICAgICAndW5kZWZpbmVkJywKICogICAgICAnYm9vbGVhbicgKNC00LvRjyB0cnVlL2ZhbHNlKSwKICogICAgICAnbnVsbCcsICFvYmplY3QKICogICAgICAnbnVtYmVyJywKICogICAgICAnc3RyaW5nJywgCiAqICAgICAgJ2Z1bmN0aW9uJywKICogICAgICAnQXJyYXknLCBvYmplY3QKICogICAgICAnYXJyYXktbGlrZScsICFvYmplY3QKICogICAgICAnQXJndW1lbnRzJwogKiAgICAgICdPYmplY3QnLCAKICogICAgICAnRGF0ZScKICogQHRocm93IHtFcnJvcn0KICovCmZ1bmN0aW9uIGdldFR5cGVPZih2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggIT0gMSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiUmVxdWlyZSAxIGFyZ3VtZW50LCBnaXZlbjogIiArIGFyZ3VtZW50cy5sZW5ndGgpOwogICAgfQogICAgCiAgICB2YXIgdHlwZSA9IHR5cGVvZih2YWx1ZSk7CiAgICAKICAgIGlmICh0eXBlID09ICJvYmplY3QiKSB7CiAgICAgICAgLy8g0J7Qv9GA0LXQtNC10LvQtdC90LjQtSBudWxsCiAgICAgICAgaWYgKCB2YWx1ZSA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gIm51bGwiOwogICAgICAgIH0KICAgICAgICAvLyDQntC/0YDQtdC00LXQu9C10L3QuNC1INCy0YHQtdCz0L4g0L7RgdGC0LDQu9GM0L3QvtCz0L46IGFyZ3VtZW50cywgb2JqZWN0LCBkYXRlCiAgICAgICAgcmV0dXJuIHt9LnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKTsgIC8vINCe0YLRgNC10LfQsNC10YIg0L/QtdGA0LLRg9GOINGH0LDRgdGC0Ywg0LLRi9GA0LDQttC10L3QuNGPIFtvYmplY3QgLi4uXQogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdHlwZTsKICAgIH0gIAp9Cgp2YXIgYSA9IHsgeDogMSwgeTogMiwgejogWzEsIDIsIDNdIH07CnZhciBiID0gc2hhbGxvd0NvcHkoYSk7IC8vIGIg4oCUINGN0YLQviDQvtGC0LTQtdC70YzQvdGL0Lkg0L7QsdGK0LXQutGCCmIuZGlmZiA9ICJ0aGlzIGlzIGl0IjsKY29uc29sZS5sb2coImEgPSAiLCBhKTsgCmNvbnNvbGUubG9nKCJiID0gIiwgYik7CgpiLnggPSAxMDsKY29uc29sZS5sb2coImIueCA9ICIsIGIueCk7IApjb25zb2xlLmxvZygiYS54ID0gIiwgYS54KTsgCi8vINCd0L4gYS56INC4IGIueiDRg9C60LDQt9GL0LLQsNGO0YIg0L3QsCDQvtC00LjQvSDQuCDRgtC+0YIg0LbQtSDQvNCw0YHRgdC40LI6IApiLnoucHVzaCg0KTsKY29uc29sZS5sb2coImIuei5wdXNoKDQpLCBiLnogPSAiLCBiLnopOyAvLyBbMSwgMiwgMywgNF0KY29uc29sZS5sb2coImEueiA9ICIsIGEueik7IC8vIFsxLCAyLCAzLCA0XQoKdmFyIGEgPSBbMSwgMiwgM10KdmFyIGIgPSBzaGFsbG93Q29weShhKTsgLy8gYiDigJQg0Y3RgtC+INC+0YLQtNC10LvRjNC90YvQuSDQvtCx0YrQtdC60YIKY29uc29sZS5sb2coImEgaXMgQXJyYXksIGEgPSAiLCBhKTsKY29uc29sZS5sb2coImIgaXMgQXJyYXkgdG9vLCBiID0gIiwgYik7Cgp2YXIgYSA9IG5ldyBEYXRlKDIwMTEsIDAsIDEsIDIsIDMsIDQsIDU2Nyk7CnZhciBiID0gc2hhbGxvd0NvcHkoYSk7IC8vIGIg4oCUINGN0YLQviDQvtGC0LTQtdC70YzQvdGL0Lkg0L7QsdGK0LXQutGCCmNvbnNvbGUubG9nKCJhID0gIiwgYSk7CmNvbnNvbGUubG9nKCJiIGlzIERhdGUgdG9vLCBiID0gIiwgYik7
a = { x: 1, y: 2, z: [ 1, 2, 3 ] }
b = { x: 1, y: 2, z: [ 1, 2, 3 ], diff: 'this is it' }
b.x = 10
a.x = 1
b.z.push(4), b.z = [ 1, 2, 3, 4 ]
a.z = [ 1, 2, 3, 4 ]
a is Array, a = [ 1, 2, 3 ]
b is Array too, b = [ 1, 2, 3 ]
a = Sat Jan 01 2011 02:03:04 GMT+0000 (UTC)
b is Date too, b = Sat Jan 01 2011 02:03:04 GMT+0000 (UTC)