// ==UserScript==
// @name shitaraba_option_2
// @namespace john1851
// @description shitaraba_option_2
// @include http://c...content-available-to-author-only...a.net/internet/21154/config/data/thread_delete*
// @exclude http://c...content-available-to-author-only...a.net/internet/21154/config/data/thread_delete_confirm
// @exclude http://c...content-available-to-author-only...a.net/internet/21154/config/data/thread_delete_finish
// @grant none
// @version 0.5.0.00
// ==/UserScript==
(function (_, count) {
_('content', function (board, threads) {
console.log('今日は' + count + '回目の起動の日です。おめでとうございます。');
board.click(function (type, isForward) {
board.draw(sort(threads, type, isForward));
});
board.draw(threads);
});
function align(array, name, isForward, action) {
if (isForward)
return array.sort(function (x, y) { return action(x[name], y[name]); });
return array.sort(function (x, y) { return action(y[name], x[name]); });
}
function sort(threads, type, isForward) {
if (['no', 'title', 'response', 'newResponse', 'vigor'].indexOf(type) < 0)
throw new RangeError('not support type: ' + type);
if (type === 'title') {
return align(threads, type, isForward, function (x, y) {
return x < y ? -1 : x > y ? 1 : 0;
});
}
return align(threads, type, isForward, function (x, y) {
return x - y;
});
}
})((function () {
function array(str) {
return new Function('return [' + str + '];')();
}
function project(array, name) {
return array.map(function (x) { return x[name]; });
}
function zip() {
var results = [],
arrays = [].slice.call(arguments, 0),
length = Math.max.apply(null, project(arrays, 'length'));
for (var i = 0; i < length; i++) {
results.push(project(arrays, i));
}
return results;
};
function format(date) {
var m = (date.getMonth() + 1) + '/',
d = date.getDate() + '/',
h = date.getHours() + ':',
min = date.getMinutes();
return m + d + h + min;
};
function interval(date) {
var sec = Math.floor(new Date() / 1000 - date / 1000),
min, hour, day, mon, times, unit, result;
min = Math.floor(sec / 60);
sec = sec % 60;
hour = Math.floor(min / 60);
min = min % 60;
day = Math.floor(hour / 24);
hour = hour % 24;
mon = Math.floor(day / 30);
day = day % 30;
times = [mon, day, hour, min, sec];
unit = ['ヶ月', '日', '時間', '分', '秒'];
result = '';
for (var i = 0; i < times.length; i++) if (times[i] != 0) {
result += times[i] + unit[i];
if (i != times.length - 1)
result += times[i + 1] + unit[i + 1];
break;
}
return result + '前';
};
function $(tag, option) {
var children = [].slice.call(arguments, 2),
element = document.createElement(tag);
$.option(element, option || {});
children.forEach(function (x) { element.appendChild(x); });
return element;
}
$.attribute = function (element, attributes) {
Object.keys(attributes).filter(function (x) {
return ['klass', 'text'].indexOf(x) < 0;
}).forEach(function (x) {
element.setAttribute(x, attributes[x]);
});
};
$.option = function (element, option) {
if (option.klass)
element.classList.add(option.klass);
if (option.text)
element.textContent = option.text;
$.attribute(element, option);
return element;
}
$.find = function (id, child) {
if (child)
return document.getElementById(id).getElementsByTagName(child)[0];
return document.getElementById(id);
}
$.clone = function (node, option) {
var element = node.cloneNode(true);
return $.option(element, option || {});
};
$.prepend = function (node, child) {
node.insertBefore(child, node.firstElementChild);
};
function threads(id) {
var table = $.find(id).getElementsByTagName('table')[0],
tr = table.getElementsByTagName('tr'),
th = tr[0].children;
return [].slice.call(tr, 1).map(function (x) {
return x.children;
}).map(function (x, i) {
var date = new Date(),
response = parseInt(x[3].textContent, 10),
url = x[2].children[1].textContent.split('/').pop();
date.setTime(parseInt(url, 10) * 1000);
return {
check: x[0].children[0].checked,
no: parseInt(x[1].textContent, 10),
title: x[2].children[0].textContent,
url: url,
date: date,
response: response,
vigor: (function () {
var timestamp = new Date() / 1000 - date / 1000,
vigor = response / (timestamp / (60 * 60 * 24));
if (response <= 1)
return 0;
else if (response <= 10)
return vigor * response / 10;
return vigor;
})()
};
});
}
function view() {
return $('tbody', {},
$('tr', {},
$('th', { klass: 'checkbox', text: '削除' }),
$('th', { klass: 'no', 'data-type': 'no', text: 'No.', style: 'cursor: pointer;' }),
$('th', { klass: 'title', 'data-type': 'title', text: 'タイトル', style: 'cursor: pointer;' }),
$('th', { klass: 'resNumber', 'data-type': 'response', text: 'レス数', style: 'cursor: pointer;' }),
$('th', { klass: 'resNumber', 'data-type': 'newResponse', text: '新レス数', style: 'cursor: pointer;' }),
$('th', { klass: 'resNumber', 'data-type': 'vigor', text: '勢い', style: 'cursor: pointer;' }),
$('th', { klass: 'individualDeletion' }),
$('th', { klass: 'infectionDeletion' })
)
);
}
view.row = function (thread, i) {
function checkbox(url) {
return $('td', { klass: 'checkbox' },
$('input', {
type: 'checkbox', name: 'key_' + url
})
);
}
function no(no) {
return $('td', { klass: 'no', text: no });
}
function title(title, url, date, isNew) {
var element = $('td', { klass: 'title' },
$('a', {
target: '_blank', text: title,
href: 'http://j...content-available-to-author-only...a.net/bbs/read.cgi/internet/' + url + '/1405372778/l50'
}),
$('p', {
klass: 'searchURL', text: format(date) + ' '
}, $('b', { text: interval(date) }))
);
if (isNew)
$.prepend(element, $('span', { text: '(New) ', style: 'color: #eb6101;' }));
return element;
}
function response(response) {
return $('td', { klass: 'resNumber', text: response });
}
function newResponse(newResponse, isNew) {
var element = $('td', { klass: 'resNumber' },
$('i', { text: '(' + newResponse + ')' })
);
if (isNew)
$.option(element.firstElementChild, { style: 'color: red;' });
else
$.option(element.firstElementChild, { style: 'color: blue;' });
return element;
}
function vigor(vigor) {
return $('td', { klass: 'resNumber', style: 'overflow: hidden;' },
$('b', {
text: (function () {
if (vigor < 1)
return vigor.toFixed(2);
else if (vigor < 100)
return vigor.toFixed(1);
else if (vigor < 1000)
return vigor.toFixed(0);
return '999+';
})()
})
);
}
function save(url) {
return $('td', { klass: 'individualDeletion' },
$('a', {
text: '倉庫へ送る',
href: './thread_delete_confirm?key=' + url + '&subcommand=save'
})
);
}
function remove(url) {
return $('td', { klass: 'infectionDeletion' },
$('a', {
text: '完全削除',
href: './thread_delete_confirm?key=' + url + '&subcommand=remove'
})
);
}
return $('tr', { klass: i % 2 === 0 ? 'even' : 'odd' },
checkbox(thread.url),
no(thread.no),
title(thread.title, thread.url, thread.date, thread.isNew),
response(thread.response),
newResponse(thread.newResponse, thread.isNew),
vigor(thread.vigor),
save(thread.url),
remove(thread.url)
);
};
function board(id) {
var table = $.find(id, 'table');
table.replaceChild(view(), table.firstElementChild);
return {
draw: function (threads) {
[].slice.call(table.firstElementChild.children, 1).forEach(function (x) {
table.firstElementChild.removeChild(x);
});
threads.forEach(function (x, i) {
table.firstElementChild.appendChild(view.row(x, i));
});
},
click: function (callback) {
[].slice.call(table.firstElementChild.firstElementChild.children, 1, -2).forEach(function (x) {
x.addEventListener('click', function () {
var type = x.dataset['type'],
value = sessionStorage[type],
isForward = typeof value === 'undefined' ? true : value === 'true';
callback(type, isForward);
sessionStorage[type] = !isForward;
}, false);
});
}
};
}
function autoCheck(id) {
var form = $.find(id, 'table').parentNode,
button = $('input', { type: 'button', value: '自動チェック' }),
tip = $('b', { text: '現在の総スレ数: ' + threads(id).length });
button.addEventListener('click', function () {
var elements = document.forms[0].elements,
value = sessionStorage['autoCheck'],
toggle = typeof value === 'undefined' ? true : value === 'true';
if (toggle)
{
zip(threads(id), elements).filter(function (x) {
return typeof x[0] !== 'undefined';
}).sort(function (x, y) {
return x[0].vigor - y[0].vigor;
}).slice(0, 30).forEach(function (x) {
x[1].checked = true;
});
}
else
{
for (var i = 0, length = elements.length; i < length; i++) {
elements[i].checked = false;
}
}
sessionStorage['autoCheck'] = !toggle;
}, false);
form.parentNode.insertBefore(button, form);
form.parentNode.insertBefore(tip, form);
}
return function (id, callback) {
var _threads = threads(id),
responses = array(localStorage['responses'] || project(_threads, 'response'));
responses = new Array(_threads.length - responses.length).concat(responses);
zip(_threads, responses).forEach(function (x) {
x[0].newResponse = x[0].response - (x[1] || 0);
x[0].isNew = typeof x[1] === 'undefined';
});
autoCheck(id);
callback(board(id), _threads);
localStorage['responses'] = project(_threads, 'response').toString();
localStorage['count'] = (parseInt(localStorage['count'], 10) || 1) + 1;
};
})(), parseInt(localStorage['count'], 10) || 1);
Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIHNoaXRhcmFiYV9vcHRpb25fMgovLyBAbmFtZXNwYWNlICAgam9objE4NTEKLy8gQGRlc2NyaXB0aW9uIHNoaXRhcmFiYV9vcHRpb25fMgovLyBAaW5jbHVkZSAgICAgaHR0cDovL2MuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmEubmV0L2ludGVybmV0LzIxMTU0L2NvbmZpZy9kYXRhL3RocmVhZF9kZWxldGUqCi8vIEBleGNsdWRlICAgICBodHRwOi8vYy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYS5uZXQvaW50ZXJuZXQvMjExNTQvY29uZmlnL2RhdGEvdGhyZWFkX2RlbGV0ZV9jb25maXJtCi8vIEBleGNsdWRlICAgICBodHRwOi8vYy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYS5uZXQvaW50ZXJuZXQvMjExNTQvY29uZmlnL2RhdGEvdGhyZWFkX2RlbGV0ZV9maW5pc2gKLy8gQGdyYW50ICAgICAgIG5vbmUKLy8gQHZlcnNpb24gICAgIDAuNS4wLjAwCi8vID09L1VzZXJTY3JpcHQ9PQoKCihmdW5jdGlvbiAoXywgY291bnQpIHsKCV8oJ2NvbnRlbnQnLCBmdW5jdGlvbiAoYm9hcmQsIHRocmVhZHMpIHsKCQljb25zb2xlLmxvZygn5LuK5pel44GvJyArIGNvdW50ICsgJ+WbnuebruOBrui1t+WLleOBruaXpeOBp+OBmeOAguOBiuOCgeOBp+OBqOOBhuOBlOOBluOBhOOBvuOBmeOAgicpOwoKCQlib2FyZC5jbGljayhmdW5jdGlvbiAodHlwZSwgaXNGb3J3YXJkKSB7CgkJCWJvYXJkLmRyYXcoc29ydCh0aHJlYWRzLCB0eXBlLCBpc0ZvcndhcmQpKTsKCQl9KTsKCQlib2FyZC5kcmF3KHRocmVhZHMpOwoJfSk7CgoJZnVuY3Rpb24gYWxpZ24oYXJyYXksIG5hbWUsIGlzRm9yd2FyZCwgYWN0aW9uKSB7CgkJaWYgKGlzRm9yd2FyZCkKCQkJcmV0dXJuIGFycmF5LnNvcnQoZnVuY3Rpb24gKHgsIHkpIHsgcmV0dXJuIGFjdGlvbih4W25hbWVdLCB5W25hbWVdKTsgfSk7CgkJcmV0dXJuIGFycmF5LnNvcnQoZnVuY3Rpb24gKHgsIHkpIHsgcmV0dXJuIGFjdGlvbih5W25hbWVdLCB4W25hbWVdKTsgfSk7Cgl9CglmdW5jdGlvbiBzb3J0KHRocmVhZHMsIHR5cGUsIGlzRm9yd2FyZCkgewoJCWlmIChbJ25vJywgJ3RpdGxlJywgJ3Jlc3BvbnNlJywgJ25ld1Jlc3BvbnNlJywgJ3ZpZ29yJ10uaW5kZXhPZih0eXBlKSA8IDApCgkJCXRocm93IG5ldyBSYW5nZUVycm9yKCdub3Qgc3VwcG9ydCB0eXBlOiAnICsgdHlwZSk7CgoJCWlmICh0eXBlID09PSAndGl0bGUnKSB7CgkJCXJldHVybiBhbGlnbih0aHJlYWRzLCB0eXBlLCBpc0ZvcndhcmQsIGZ1bmN0aW9uICh4LCB5KSB7CgkJCQlyZXR1cm4geCA8IHkgPyAtMSA6IHggPiB5ID8gMSA6IDA7CgkJCX0pOwoJCX0KCQlyZXR1cm4gYWxpZ24odGhyZWFkcywgdHlwZSwgaXNGb3J3YXJkLCBmdW5jdGlvbiAoeCwgeSkgewoJCQlyZXR1cm4geCAtIHk7CgkJfSk7Cgl9Cn0pKChmdW5jdGlvbiAoKSB7CglmdW5jdGlvbiBhcnJheShzdHIpIHsKCQlyZXR1cm4gbmV3IEZ1bmN0aW9uKCdyZXR1cm4gWycgKyBzdHIgKyAnXTsnKSgpOwoJfQoJZnVuY3Rpb24gcHJvamVjdChhcnJheSwgbmFtZSkgewoJCXJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHhbbmFtZV07IH0pOwoJfQoJZnVuY3Rpb24gemlwKCkgewoJCXZhciByZXN1bHRzID0gW10sCgkJCWFycmF5cyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSwKCQkJbGVuZ3RoID0gTWF0aC5tYXguYXBwbHkobnVsbCwgcHJvamVjdChhcnJheXMsICdsZW5ndGgnKSk7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewoJCQlyZXN1bHRzLnB1c2gocHJvamVjdChhcnJheXMsIGkpKTsKCQl9CgkJcmV0dXJuIHJlc3VsdHM7Cgl9OwoJZnVuY3Rpb24gZm9ybWF0KGRhdGUpIHsKCQl2YXIgbSA9IChkYXRlLmdldE1vbnRoKCkgKyAxKSArICcvJywKCQkJZCA9IGRhdGUuZ2V0RGF0ZSgpICsgJy8nLAoJCQloID0gZGF0ZS5nZXRIb3VycygpICsgJzonLAoJCQltaW4gPSBkYXRlLmdldE1pbnV0ZXMoKTsKCQlyZXR1cm4gbSArIGQgKyBoICsgbWluOwoJfTsKCWZ1bmN0aW9uIGludGVydmFsKGRhdGUpIHsKCQl2YXIgc2VjID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpIC8gMTAwMCAtIGRhdGUgLyAxMDAwKSwKCQkJbWluLCBob3VyLCBkYXksIG1vbiwgdGltZXMsIHVuaXQsIHJlc3VsdDsKCQltaW4gPSBNYXRoLmZsb29yKHNlYyAvIDYwKTsKCQlzZWMgPSBzZWMgJSA2MDsKCQlob3VyID0gTWF0aC5mbG9vcihtaW4gLyA2MCk7CgkJbWluID0gbWluICUgNjA7CgkJZGF5ID0gTWF0aC5mbG9vcihob3VyIC8gMjQpOwoJCWhvdXIgPSBob3VyICUgMjQ7CgkJbW9uID0gTWF0aC5mbG9vcihkYXkgLyAzMCk7CgkJZGF5ID0gZGF5ICUgMzA7CgoJCXRpbWVzID0gW21vbiwgZGF5LCBob3VyLCBtaW4sIHNlY107CgkJdW5pdCA9IFsn44O25pyIJywgJ+aXpScsICfmmYLplpMnLCAn5YiGJywgJ+enkiddOwoJCXJlc3VsdCA9ICcnOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgdGltZXMubGVuZ3RoOyBpKyspIGlmICh0aW1lc1tpXSAhPSAwKSB7CgkJCXJlc3VsdCArPSB0aW1lc1tpXSArIHVuaXRbaV07CgkJCWlmIChpICE9IHRpbWVzLmxlbmd0aCAtIDEpCgkJCQlyZXN1bHQgKz0gdGltZXNbaSArIDFdICsgdW5pdFtpICsgMV07CgkJCWJyZWFrOwoJCX0KCQlyZXR1cm4gcmVzdWx0ICsgJ+WJjSc7Cgl9OwoKCWZ1bmN0aW9uICQodGFnLCBvcHRpb24pIHsKCQl2YXIgY2hpbGRyZW4gPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMiksCgkJCWVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CgkJJC5vcHRpb24oZWxlbWVudCwgb3B0aW9uIHx8IHt9KTsKCQljaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7IGVsZW1lbnQuYXBwZW5kQ2hpbGQoeCk7IH0pOwoJCXJldHVybiBlbGVtZW50OwoJfQoJJC5hdHRyaWJ1dGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgYXR0cmlidXRlcykgewoJCU9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZpbHRlcihmdW5jdGlvbiAoeCkgewoJCQlyZXR1cm4gWydrbGFzcycsICd0ZXh0J10uaW5kZXhPZih4KSA8IDA7CgkJfSkuZm9yRWFjaChmdW5jdGlvbiAoeCkgewoJCQllbGVtZW50LnNldEF0dHJpYnV0ZSh4LCBhdHRyaWJ1dGVzW3hdKTsKCQl9KTsKCX07CgkkLm9wdGlvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb24pIHsKCQlpZiAob3B0aW9uLmtsYXNzKQoJCQllbGVtZW50LmNsYXNzTGlzdC5hZGQob3B0aW9uLmtsYXNzKTsKCQlpZiAob3B0aW9uLnRleHQpCgkJCWVsZW1lbnQudGV4dENvbnRlbnQgPSBvcHRpb24udGV4dDsKCQkkLmF0dHJpYnV0ZShlbGVtZW50LCBvcHRpb24pOwoJCXJldHVybiBlbGVtZW50OwoJfQoJJC5maW5kID0gZnVuY3Rpb24gKGlkLCBjaGlsZCkgewoJCWlmIChjaGlsZCkKCQkJcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZShjaGlsZClbMF07CgkJcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKCX0KCSQuY2xvbmUgPSBmdW5jdGlvbiAobm9kZSwgb3B0aW9uKSB7CgkJdmFyIGVsZW1lbnQgPSBub2RlLmNsb25lTm9kZSh0cnVlKTsKCQlyZXR1cm4gJC5vcHRpb24oZWxlbWVudCwgb3B0aW9uIHx8IHt9KTsKCX07CgkkLnByZXBlbmQgPSBmdW5jdGlvbiAobm9kZSwgY2hpbGQpIHsKCQlub2RlLmluc2VydEJlZm9yZShjaGlsZCwgbm9kZS5maXJzdEVsZW1lbnRDaGlsZCk7Cgl9OwoKCWZ1bmN0aW9uIHRocmVhZHMoaWQpIHsKCQl2YXIgdGFibGUgPSAkLmZpbmQoaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0YWJsZScpWzBdLAoJCQl0ciA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0cicpLAoJCQl0aCA9IHRyWzBdLmNoaWxkcmVuOwoKCQlyZXR1cm4gW10uc2xpY2UuY2FsbCh0ciwgMSkubWFwKGZ1bmN0aW9uICh4KSB7CgkJCXJldHVybiB4LmNoaWxkcmVuOwoJCX0pLm1hcChmdW5jdGlvbiAoeCwgaSkgewoJCQl2YXIgZGF0ZSA9IG5ldyBEYXRlKCksCgkJCQlyZXNwb25zZSA9IHBhcnNlSW50KHhbM10udGV4dENvbnRlbnQsIDEwKSwKCQkJCXVybCA9IHhbMl0uY2hpbGRyZW5bMV0udGV4dENvbnRlbnQuc3BsaXQoJy8nKS5wb3AoKTsKCQkJZGF0ZS5zZXRUaW1lKHBhcnNlSW50KHVybCwgMTApICogMTAwMCk7CgkJCXJldHVybiB7CgkJCQljaGVjazogeFswXS5jaGlsZHJlblswXS5jaGVja2VkLAoJCQkJbm86IHBhcnNlSW50KHhbMV0udGV4dENvbnRlbnQsIDEwKSwKCQkJCXRpdGxlOiB4WzJdLmNoaWxkcmVuWzBdLnRleHRDb250ZW50LAoJCQkJdXJsOiB1cmwsCgkJCQlkYXRlOiBkYXRlLAoJCQkJcmVzcG9uc2U6IHJlc3BvbnNlLAoJCQkJdmlnb3I6IChmdW5jdGlvbiAoKSB7CgkJCQkJdmFyIHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkgLyAxMDAwIC0gZGF0ZSAvIDEwMDAsCgkJCQkJCXZpZ29yID0gcmVzcG9uc2UgLyAodGltZXN0YW1wIC8gKDYwICogNjAgKiAyNCkpOwoJCQkJCWlmIChyZXNwb25zZSA8PSAxKQoJCQkJCQlyZXR1cm4gMDsKCQkJCQllbHNlIGlmIChyZXNwb25zZSA8PSAxMCkKCQkJCQkJcmV0dXJuIHZpZ29yICogcmVzcG9uc2UgLyAxMDsKCQkJCQlyZXR1cm4gdmlnb3I7CgkJCQl9KSgpCgkJCX07CgkJfSk7Cgl9CgoJZnVuY3Rpb24gdmlldygpIHsKCQlyZXR1cm4gJCgndGJvZHknLCB7fSwKCQkJJCgndHInLCB7fSwKCQkJCSQoJ3RoJywgeyBrbGFzczogJ2NoZWNrYm94JywgdGV4dDogJ+WJiumZpCcgfSksCgkJCQkkKCd0aCcsIHsga2xhc3M6ICdubycsICdkYXRhLXR5cGUnOiAnbm8nLCB0ZXh0OiAnTm8uJywgc3R5bGU6ICdjdXJzb3I6IHBvaW50ZXI7JyB9KSwKCQkJCSQoJ3RoJywgeyBrbGFzczogJ3RpdGxlJywgJ2RhdGEtdHlwZSc6ICd0aXRsZScsIHRleHQ6ICfjgr/jgqTjg4jjg6snLCBzdHlsZTogJ2N1cnNvcjogcG9pbnRlcjsnIH0pLAoJCQkJJCgndGgnLCB7IGtsYXNzOiAncmVzTnVtYmVyJywgJ2RhdGEtdHlwZSc6ICdyZXNwb25zZScsIHRleHQ6ICfjg6zjgrnmlbAnLCBzdHlsZTogJ2N1cnNvcjogcG9pbnRlcjsnIH0pLAoJCQkJJCgndGgnLCB7IGtsYXNzOiAncmVzTnVtYmVyJywgJ2RhdGEtdHlwZSc6ICduZXdSZXNwb25zZScsIHRleHQ6ICfmlrDjg6zjgrnmlbAnLCBzdHlsZTogJ2N1cnNvcjogcG9pbnRlcjsnIH0pLAoJCQkJJCgndGgnLCB7IGtsYXNzOiAncmVzTnVtYmVyJywgJ2RhdGEtdHlwZSc6ICd2aWdvcicsIHRleHQ6ICfli6LjgYQnLCBzdHlsZTogJ2N1cnNvcjogcG9pbnRlcjsnIH0pLAoJCQkJJCgndGgnLCB7IGtsYXNzOiAnaW5kaXZpZHVhbERlbGV0aW9uJyB9KSwKCQkJCSQoJ3RoJywgeyBrbGFzczogJ2luZmVjdGlvbkRlbGV0aW9uJyB9KQoJCQkpCgkJKTsKCX0KCXZpZXcucm93ID0gZnVuY3Rpb24gKHRocmVhZCwgaSkgewoJCWZ1bmN0aW9uIGNoZWNrYm94KHVybCkgewoJCQlyZXR1cm4gJCgndGQnLCB7IGtsYXNzOiAnY2hlY2tib3gnIH0sCgkJCQkkKCdpbnB1dCcsIHsKCQkJCQl0eXBlOiAnY2hlY2tib3gnLCBuYW1lOiAna2V5XycgKyB1cmwKCQkJCX0pCgkJCSk7CgkJfQoJCWZ1bmN0aW9uIG5vKG5vKSB7CgkJCXJldHVybiAkKCd0ZCcsIHsga2xhc3M6ICdubycsIHRleHQ6IG5vIH0pOwoJCX0KCQlmdW5jdGlvbiB0aXRsZSh0aXRsZSwgdXJsLCBkYXRlLCBpc05ldykgewoJCQl2YXIgZWxlbWVudCA9ICQoJ3RkJywgeyBrbGFzczogJ3RpdGxlJyB9LAoJCQkJJCgnYScsIHsKCQkJCQl0YXJnZXQ6ICdfYmxhbmsnLCB0ZXh0OiB0aXRsZSwKCQkJCQlocmVmOiAnaHR0cDovL2ouLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmEubmV0L2Jicy9yZWFkLmNnaS9pbnRlcm5ldC8nICsgdXJsICsgJy8xNDA1MzcyNzc4L2w1MCcKCQkJCX0pLAoJCQkJJCgncCcsIHsKCQkJCQlrbGFzczogJ3NlYXJjaFVSTCcsIHRleHQ6IGZvcm1hdChkYXRlKSArICcgJwoJCQkJfSwgJCgnYicsIHsgdGV4dDogaW50ZXJ2YWwoZGF0ZSkgfSkpCgkJCSk7CgkJCWlmIChpc05ldykKCQkJCSQucHJlcGVuZChlbGVtZW50LCAkKCdzcGFuJywgeyB0ZXh0OiAnKE5ldykgJywgc3R5bGU6ICdjb2xvcjogI2ViNjEwMTsnIH0pKTsKCQkJcmV0dXJuIGVsZW1lbnQ7CgkJfQoJCWZ1bmN0aW9uIHJlc3BvbnNlKHJlc3BvbnNlKSB7CgkJCXJldHVybiAkKCd0ZCcsIHsga2xhc3M6ICdyZXNOdW1iZXInLCB0ZXh0OiByZXNwb25zZSB9KTsKCQl9CgkJZnVuY3Rpb24gbmV3UmVzcG9uc2UobmV3UmVzcG9uc2UsIGlzTmV3KSB7CgkJCXZhciBlbGVtZW50ID0gJCgndGQnLCB7IGtsYXNzOiAncmVzTnVtYmVyJyB9LAoJCQkJJCgnaScsIHsgdGV4dDogJygnICsgbmV3UmVzcG9uc2UgKyAnKScgfSkKCQkJKTsKCQkJaWYgKGlzTmV3KQoJCQkJJC5vcHRpb24oZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCwgeyBzdHlsZTogJ2NvbG9yOiByZWQ7JyB9KTsKCQkJZWxzZQoJCQkJJC5vcHRpb24oZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCwgeyBzdHlsZTogJ2NvbG9yOiBibHVlOycgfSk7CgkJCXJldHVybiBlbGVtZW50OwoJCX0KCQlmdW5jdGlvbiB2aWdvcih2aWdvcikgewoJCQlyZXR1cm4gJCgndGQnLCB7IGtsYXNzOiAncmVzTnVtYmVyJywgc3R5bGU6ICdvdmVyZmxvdzogaGlkZGVuOycgfSwKCQkJCSQoJ2InLCB7CgkJCQkJdGV4dDogKGZ1bmN0aW9uICgpIHsKCQkJCQkJaWYgKHZpZ29yIDwgMSkKCQkJCQkJCXJldHVybiB2aWdvci50b0ZpeGVkKDIpOwoJCQkJCQllbHNlIGlmICh2aWdvciA8IDEwMCkKCQkJCQkJCXJldHVybiB2aWdvci50b0ZpeGVkKDEpOwoJCQkJCQllbHNlIGlmICh2aWdvciA8IDEwMDApCgkJCQkJCQlyZXR1cm4gdmlnb3IudG9GaXhlZCgwKTsKCQkJCQkJcmV0dXJuICc5OTkrJzsKCQkJCQl9KSgpCgkJCQl9KQoJCQkpOwoJCX0KCQlmdW5jdGlvbiBzYXZlKHVybCkgewoJCQlyZXR1cm4gJCgndGQnLCB7IGtsYXNzOiAnaW5kaXZpZHVhbERlbGV0aW9uJyB9LAoJCQkJJCgnYScsIHsKCQkJCQl0ZXh0OiAn5YCJ5bqr44G46YCB44KLJywKCQkJCQlocmVmOiAnLi90aHJlYWRfZGVsZXRlX2NvbmZpcm0/a2V5PScgKyB1cmwgKyAnJnN1YmNvbW1hbmQ9c2F2ZScKCQkJCX0pCgkJCSk7CgkJfQoJCWZ1bmN0aW9uIHJlbW92ZSh1cmwpIHsKCQkJcmV0dXJuICQoJ3RkJywgeyBrbGFzczogJ2luZmVjdGlvbkRlbGV0aW9uJyB9LAoJCQkJJCgnYScsIHsKCQkJCQl0ZXh0OiAn5a6M5YWo5YmK6ZmkJywKCQkJCQlocmVmOiAnLi90aHJlYWRfZGVsZXRlX2NvbmZpcm0/a2V5PScgKyB1cmwgKyAnJnN1YmNvbW1hbmQ9cmVtb3ZlJwoJCQkJfSkKCQkJKTsKCQl9CgoJCXJldHVybiAkKCd0cicsIHsga2xhc3M6IGkgJSAyID09PSAwID8gJ2V2ZW4nIDogJ29kZCcgfSwKCQkJY2hlY2tib3godGhyZWFkLnVybCksCgkJCW5vKHRocmVhZC5ubyksCgkJCXRpdGxlKHRocmVhZC50aXRsZSwgdGhyZWFkLnVybCwgdGhyZWFkLmRhdGUsIHRocmVhZC5pc05ldyksCgkJCXJlc3BvbnNlKHRocmVhZC5yZXNwb25zZSksCgkJCW5ld1Jlc3BvbnNlKHRocmVhZC5uZXdSZXNwb25zZSwgdGhyZWFkLmlzTmV3KSwKCQkJdmlnb3IodGhyZWFkLnZpZ29yKSwKCQkJc2F2ZSh0aHJlYWQudXJsKSwKCQkJcmVtb3ZlKHRocmVhZC51cmwpCgkJKTsKCX07CgoJZnVuY3Rpb24gYm9hcmQoaWQpIHsKCQl2YXIgdGFibGUgPSAkLmZpbmQoaWQsICd0YWJsZScpOwoJCXRhYmxlLnJlcGxhY2VDaGlsZCh2aWV3KCksIHRhYmxlLmZpcnN0RWxlbWVudENoaWxkKTsKCQlyZXR1cm4gewoJCQlkcmF3OiBmdW5jdGlvbiAodGhyZWFkcykgewoJCQkJW10uc2xpY2UuY2FsbCh0YWJsZS5maXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbiwgMSkuZm9yRWFjaChmdW5jdGlvbiAoeCkgewoJCQkJCXRhYmxlLmZpcnN0RWxlbWVudENoaWxkLnJlbW92ZUNoaWxkKHgpOwoJCQkJfSk7CgkJCQl0aHJlYWRzLmZvckVhY2goZnVuY3Rpb24gKHgsIGkpIHsKCQkJCQl0YWJsZS5maXJzdEVsZW1lbnRDaGlsZC5hcHBlbmRDaGlsZCh2aWV3LnJvdyh4LCBpKSk7CgkJCQl9KTsKCQkJfSwKCQkJY2xpY2s6IGZ1bmN0aW9uIChjYWxsYmFjaykgewoJCQkJW10uc2xpY2UuY2FsbCh0YWJsZS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbiwgMSwgLTIpLmZvckVhY2goZnVuY3Rpb24gKHgpIHsKCQkJCQl4LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewoJCQkJCQl2YXIgdHlwZSA9IHguZGF0YXNldFsndHlwZSddLAoJCQkJCQkJdmFsdWUgPSBzZXNzaW9uU3RvcmFnZVt0eXBlXSwKCQkJCQkJCWlzRm9yd2FyZCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogdmFsdWUgPT09ICd0cnVlJzsKCQkJCQkJY2FsbGJhY2sodHlwZSwgaXNGb3J3YXJkKTsKCQkJCQkJc2Vzc2lvblN0b3JhZ2VbdHlwZV0gPSAhaXNGb3J3YXJkOwoJCQkJCX0sIGZhbHNlKTsKCQkJCX0pOwoJCQl9CgkJfTsKCX0KCglmdW5jdGlvbiBhdXRvQ2hlY2soaWQpIHsKCQl2YXIgZm9ybSA9ICQuZmluZChpZCwgJ3RhYmxlJykucGFyZW50Tm9kZSwKCQkJYnV0dG9uID0gJCgnaW5wdXQnLCB7IHR5cGU6ICdidXR0b24nLCB2YWx1ZTogJ+iHquWLleODgeOCp+ODg+OCrycgfSksCgkJCXRpcCA9ICQoJ2InLCB7IHRleHQ6ICfnj77lnKjjga7nt4/jgrnjg6zmlbA6ICcgKyB0aHJlYWRzKGlkKS5sZW5ndGggfSk7CgoJCWJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKCQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZm9ybXNbMF0uZWxlbWVudHMsCgkJCQl2YWx1ZSA9IHNlc3Npb25TdG9yYWdlWydhdXRvQ2hlY2snXSwKCQkJCXRvZ2dsZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogdmFsdWUgPT09ICd0cnVlJzsKCQkJaWYgKHRvZ2dsZSkKCQkJewoJCQkJemlwKHRocmVhZHMoaWQpLCBlbGVtZW50cykuZmlsdGVyKGZ1bmN0aW9uICh4KSB7CgkJCQkJcmV0dXJuIHR5cGVvZiB4WzBdICE9PSAndW5kZWZpbmVkJzsKCQkJCX0pLnNvcnQoZnVuY3Rpb24gKHgsIHkpIHsKCQkJCQlyZXR1cm4geFswXS52aWdvciAtIHlbMF0udmlnb3I7CgkJCQl9KS5zbGljZSgwLCAzMCkuZm9yRWFjaChmdW5jdGlvbiAoeCkgewoJCQkJCXhbMV0uY2hlY2tlZCA9IHRydWU7CgkJCQl9KTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewoJCQkJCWVsZW1lbnRzW2ldLmNoZWNrZWQgPSBmYWxzZTsKCQkJCX0KCQkJfQoJCQlzZXNzaW9uU3RvcmFnZVsnYXV0b0NoZWNrJ10gPSAhdG9nZ2xlOwoJCX0sIGZhbHNlKTsKCQlmb3JtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGJ1dHRvbiwgZm9ybSk7CgkJZm9ybS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aXAsIGZvcm0pOwoJfQoKCXJldHVybiBmdW5jdGlvbiAoaWQsIGNhbGxiYWNrKSB7CgkJdmFyIF90aHJlYWRzID0gdGhyZWFkcyhpZCksCgkJCXJlc3BvbnNlcyA9IGFycmF5KGxvY2FsU3RvcmFnZVsncmVzcG9uc2VzJ10gfHwgcHJvamVjdChfdGhyZWFkcywgJ3Jlc3BvbnNlJykpOwoJCXJlc3BvbnNlcyA9IG5ldyBBcnJheShfdGhyZWFkcy5sZW5ndGggLSByZXNwb25zZXMubGVuZ3RoKS5jb25jYXQocmVzcG9uc2VzKTsKCgkJemlwKF90aHJlYWRzLCByZXNwb25zZXMpLmZvckVhY2goZnVuY3Rpb24gKHgpIHsKCQkJeFswXS5uZXdSZXNwb25zZSA9IHhbMF0ucmVzcG9uc2UgLSAoeFsxXSB8fCAwKTsKCQkJeFswXS5pc05ldyA9IHR5cGVvZiB4WzFdID09PSAndW5kZWZpbmVkJzsKCQl9KTsKCgkJYXV0b0NoZWNrKGlkKTsKCQljYWxsYmFjayhib2FyZChpZCksIF90aHJlYWRzKTsKCgkJbG9jYWxTdG9yYWdlWydyZXNwb25zZXMnXSA9IHByb2plY3QoX3RocmVhZHMsICdyZXNwb25zZScpLnRvU3RyaW5nKCk7CgkJbG9jYWxTdG9yYWdlWydjb3VudCddID0gKHBhcnNlSW50KGxvY2FsU3RvcmFnZVsnY291bnQnXSwgMTApIHx8IDEpICsgMTsKCX07Cn0pKCksIHBhcnNlSW50KGxvY2FsU3RvcmFnZVsnY291bnQnXSwgMTApIHx8IDEpOwo=