├── icons
└── icon.png
├── js
├── show_mode.js
├── background.js
├── _metadata
│ └── verified_contents.json
├── simple_mode.js
├── auto_mode.js
├── true_mode.js
└── jquery.js
├── manifest.json
├── popup
├── popup.html
├── popup.js
└── popup_style.css
└── README.md
/icons/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/FutureXpo/Chrome-Extension-LMS-Answers/HEAD/icons/icon.png
--------------------------------------------------------------------------------
/js/show_mode.js:
--------------------------------------------------------------------------------
1 | //По окончании загрузки документа вызывается функция
2 | $(document).ready(function() {
3 | var path = window.location.pathname;
4 | var page = path.split("/").pop();
5 | if(page === 'index.html') {
6 | //При получении команды 'show' показывает ответы
7 | chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
8 | if(request.command==="show") {
9 | show();
10 | }
11 | });
12 | //Если выбрана функция автоматического показа ответов заппускается функция показа ответов
13 | chrome.storage.sync.get(['show_mode'], function(items) {
14 | var choise=items['show_mode'];
15 | if(choise == undefined) choise = true;
16 | if(choise){
17 | var timerId = setInterval(show, 2000);
18 | setTimeout(function() {
19 | clearInterval(timerId);
20 | }, 7000);
21 | }
22 | });
23 | }
24 | })
25 |
26 | //Показать ответы
27 | function show() {
28 | $('*[class^="correct"]').show().removeClass('ng-hide').parent().show().removeClass('ng-hide');
29 | $('*[ng-show^="doShowAnswer"]').removeClass("ng-hide").has('input').find('input').remove();
30 | $('table.ng-hide').removeClass('ng-hide');
31 | $('section').css('user-select','initial');
32 | }
--------------------------------------------------------------------------------
/js/background.js:
--------------------------------------------------------------------------------
1 | chrome.storage.sync.get(['show_mode','simple_mode','true_mode','auto_mode'], function(items) {
2 | var choise=items['show_mode'];
3 | if(choise == undefined) choise = true;
4 | if(choise) chrome.browserAction.setBadgeText({text: "on"});
5 | else chrome.browserAction.setBadgeText({text: "off"});
6 |
7 | choise=items['simple_mode'];
8 | if(choise == undefined) choise = false;
9 | if(choise) chrome.browserAction.setBadgeText({text: "on"});
10 |
11 | choise=items['true_mode'];
12 | if(choise == undefined) choise = false;
13 | if(choise) chrome.browserAction.setBadgeText({text: "on"});
14 |
15 | choise=items['auto_mode'];
16 | if(choise == undefined) choise = false;
17 | if(choise) chrome.browserAction.setBadgeText({text: "on"});
18 | });
19 | //Создать контекстное меню
20 | chrome.contextMenus.create({"title": "Показать ответы","onclick" : show});
21 | //Показать ответы
22 | function show(info) {
23 | var url = info.pageUrl;
24 | var url_ = "www.cambridgelms.org";
25 | if(JSON.stringify(url).includes(url_))
26 | {
27 | var query = { active: true, currentWindow: true };
28 | chrome.tabs.query(query, function(tabs) {
29 | chrome.tabs.sendMessage(tabs[0].id, {command: "show"});
30 | });
31 | }
32 | }
--------------------------------------------------------------------------------
/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "LMS helper ♥",
3 | "homepage_url": "https://github.com/FutureXpo/Chrome-Extension-LMS-Answers",
4 | "description": "Easy answers from your heart. Made with love by FutureX",
5 | "icons": {
6 | "16": "icons/icon.png",
7 | "32": "icons/icon.png",
8 | "48": "icons/icon.png",
9 | "128": "icons/icon.png"
10 | },
11 | "version": "1.4.8.8",
12 | "manifest_version": 2,
13 | "browser_action": {
14 | "default_icon": "icons/icon.png",
15 | "default_popup": "popup/popup.html"
16 | },
17 | "options_ui": {
18 | "page": "popup/popup.html",
19 | "open_in_tab": false
20 | },
21 | "background": {
22 | "scripts": ["js/background.js", "js/true_mode.js" ]
23 | },
24 | "content_scripts": [
25 | {
26 | "matches": [ "*://www.cambridgelms.org/*" ],
27 | "js": [ "js/simple_mode.js" ],
28 | "run_at": "document_end"
29 | },{
30 | "matches": [ "*://www.cambridgelms.org/*" ],
31 | "js": [ "js/jquery.js", "js/show_mode.js", "js/auto_mode.js" ],
32 | "run_at": "document_idle",
33 | "all_frames": true
34 | }
35 | ],
36 | "permissions": [
37 | "tabs",
38 | "contextMenus",
39 | "storage",
40 | "webRequest",
41 | "webRequestBlocking",
42 | "*://www.cambridgelms.org/*",
43 | "activeTab",
44 | "management"
45 | ]
46 | }
--------------------------------------------------------------------------------
/popup/popup.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LMS Answers
6 |
7 |
8 |
9 |
10 |
11 |
LMS Answers
12 |
13 |
18 |
19 |
24 |
25 |
30 |
31 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/js/_metadata/verified_contents.json:
--------------------------------------------------------------------------------
1 | [{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJpY29uLnBuZyIsInJvb3RfaGFzaCI6InZYSzRsclYwcDdlZGhRdTdpRUVoY1Eza2xaYU8xVU9lM1lHTXQtbm1XdzQifSx7InBhdGgiOiJpbmplY3QuanMiLCJyb290X2hhc2giOiI2WmdFbGhhLUR4ZWRXc2FWY0hpV3ZFMEt2cVZXdGVyZ1F0blhYM0JyNGVBIn0seyJjYW5vbmljYWxfanNvbl9yb290X2hhc2giOiJCeWZIczFha1ZUX0VpeW9WQXlTTmYydFQ3bkZLVG92ak96OGVjQXhpNjdrIiwicGF0aCI6Im1hbmlmZXN0Lmpzb24iLCJyb290X2hhc2giOiJxc1JKdm45dnBybHNUdTE4ZFFkMm8zRnE4TUxIQTlSclRtNzdHd185bmlrIn1dLCJmb3JtYXQiOiJ0cmVlaGFzaCIsImhhc2hfYmxvY2tfc2l6ZSI6NDA5Nn1dLCJpdGVtX2lkIjoiYWVtZ2hwbXBpY25vZ2JhZGRhYmljZWNiaWVob2VoYmIiLCJpdGVtX3ZlcnNpb24iOiI2LjY2IiwicHJvdG9jb2xfdmVyc2lvbiI6MX0","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"QoEO2p82NrNNQBbKAJAmjlSSMmTSPzX9lkFTKwEAZ37p8xIYnaL7_NydUA_QVu0vxp8jkpQrBCjY-UwfffnoMiHROhuzY57iS2pj2q3_rp5at-sjMlE43cZrKINcamCFKQN7A4tGThd30D_RngRNDhh4Kmu4fxd1CWKSRrD2rBvv29nk0ODjpsCoJ6i5OjXLRFjj7ocPpz227tSRg5ACJRUY3fQa0U6l-ZRwIwT0sVQN-hkNV-0qWtwiTpWU2807N3RZTY4CgeA-2-YO9pmDHTkFaWtg4fPOEZSdWe_Trheh_2U7n-CeTxruPrGr_jf7L3znmIB8OItiilcVXEI_qg"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"YbWAdtSJm-YNi1GO1s8Xm1cPIYXhlQ0CxmzGPoXoafbPz9EuwnpRsL6pOWi7MragwJ3rkwgonbrqkba7xuWDj9Vzd8PWSSywyHttPOJeFBBLyfXVjHbLUNb9kKCkgYOdlnhadgGcaXXe1Y5O-1KVWgXqyzY8jxfD-jJivhsxsfFV1QA0w1BJOngqygF5O4X7dx9m4k4UeyNvbAYJu2_tYObzJVkcjSQa96sLPd5rwC6LaJaS10yCsC--qvOrKr4KY5KEvF1M4dwQhv5NvRRbYLuGgkf5t_3ccjAhHXGYIb_H7g3Ilj71eg95NMNcjw5vIqEEtfX8POsEg_Ca55v8DQ"}]}}]
--------------------------------------------------------------------------------
/js/simple_mode.js:
--------------------------------------------------------------------------------
1 | chrome.storage.sync.get(['simple_mode'], function(items) {
2 | var choise=items['simple_mode'];
3 | if(choise == undefined) choise = false;
4 | if(choise) simple_mode_on();
5 | document.getElementById('autologout-cache-check').remove();
6 | });
7 | //id и class ненужных элементов
8 | var massiv_id = ['header','dashboard-toogle','skip-link','tools-iframe','cboxOverlay','colorbox','autologout-cache-check'];
9 | var massiv_name = ['content-page-header','header-content scorm-header clearfix','region region-footer','left-nav hide','ipad-popup','top-btn save ipad-pos f-right disableMultipleClick-processed'];
10 | //Включить простого вида
11 | function simple_mode_on() {
12 | var a;
13 | a = document.getElementsByClassName('header-content scorm-header clearfix addBorder-top')[0];
14 | if(a) a.setAttribute("class", "header-content scorm-header clearfix");
15 | a = document.getElementsByClassName('main-content remove-pad hide clearfix')[0];
16 | if(a) a.setAttribute("style", "display:block;");
17 | a = document.getElementsByClassName('header-content scorm-header clearfix addBorder-top')[0];
18 | if(a) a.setAttribute("class", "header-content scorm-header clearfix");
19 | a = document.getElementById('content');
20 | if(a) a.setAttribute('id','content_');
21 | a = document.getElementsByClassName("scromoverlaydiv")[0];
22 | if(a) a.remove();
23 | a = document.getElementById('content-iframe');
24 | if(a) a.setAttribute("style", "position:relative;display:block;height:93vh;visibility: visible;margin-left:-0.7%")
25 | //Убираем отображение всех элементов из массивов
26 | massiv_id.forEach(function(item, i, arr) {
27 | a = document.getElementById(item);
28 | if(a) a.setAttribute("style","transform: scale(0);margin-top:-9%");
29 | });
30 | massiv_name.forEach(function(item, i, arr) {
31 | a = document.getElementsByClassName(item)[0];
32 | if(a) a.setAttribute("style","transform: scale(0);");
33 | });
34 | }
35 | //Выключить простого вида
36 | function simple_mode_off() {
37 | var a;
38 | a = document.getElementsByClassName('dashboard-toggle-bg')[0];
39 | if(a) a.innerHTML = "Hide Dashboard";
40 | a = document.getElementById('content_');
41 | if(a) a.setAttribute('id','content');
42 | if(a) a.removeAttribute("style");
43 | a = document.getElementById('content-iframe');
44 | if(a) a.setAttribute("style", "position:relative;display:block;height:93vh;visibility: visible;");
45 | //Возвращаем отображение всех элементов из массивов
46 | massiv_id.forEach(function(item, i, arr) {
47 | a = document.getElementById(item);
48 | if(a) a.removeAttribute("style");
49 | });
50 | massiv_name.forEach(function(item, i, arr) {
51 | a = document.getElementsByClassName(item)[0];
52 | if(a) a.removeAttribute("style");
53 | });
54 | }
55 | //Ожидание команд
56 | chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
57 | if(request.command==="simple_mode_on") {
58 | simple_mode_on();
59 | }
60 | if(request.command==="simple_mode_off") {
61 | simple_mode_off();
62 | }
63 | });
--------------------------------------------------------------------------------
/popup/popup.js:
--------------------------------------------------------------------------------
1 | document.addEventListener('DOMContentLoaded', function() {
2 | loadOptions();
3 | var showButton = document.getElementById('showBtn');
4 | showButton.addEventListener('click', function() {
5 | show();
6 | }, false);
7 | var autoChecker = document.getElementById('auto_mode');
8 | autoChecker.addEventListener('change', function() {
9 | saveOptions();
10 | auto_mode();
11 | }, false);
12 | var showChecker = document.getElementById('show_mode');
13 | showChecker.addEventListener('change', function() {
14 | saveOptions();
15 | if(showChecker.checked)show();
16 | }, false);
17 | var simpleChecker = document.getElementById('simple_mode');
18 | simpleChecker.addEventListener('change', function() {
19 | saveOptions();
20 | simple_mode();
21 | }, false);
22 | var trueChecker = document.getElementById('true_mode');
23 | trueChecker.addEventListener('change', function() {
24 | saveOptions();
25 | true_mode();
26 | }, false);
27 | }, false);
28 |
29 | function loadOptions() {
30 | chrome.storage.sync.get(['show_mode','simple_mode','true_mode','auto_mode'], function(items) {
31 | var choise=items['show_mode'];
32 | if(choise == undefined) choise = true;
33 | var select = document.getElementById("show_mode");
34 | select.checked = choise;
35 | if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
36 | else chrome.browserAction.setBadgeText({text: "off"});
37 |
38 | choise=items['simple_mode'];
39 | if(choise == undefined) choise = false;
40 | var select = document.getElementById("simple_mode");
41 | select.checked = choise;
42 | if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
43 |
44 | choise=items['true_mode'];
45 | if(choise == undefined) choise = false;
46 | var select = document.getElementById("true_mode");
47 | select.checked = choise;
48 | if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
49 |
50 | choise=items['auto_mode'];
51 | if(choise == undefined) choise = false;
52 | var select = document.getElementById("auto_mode");
53 | select.checked = choise;
54 | if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
55 | });
56 | }
57 |
58 | function saveOptions() {
59 | var select = document.getElementById("show_mode");
60 | chrome.storage.sync.set({'show_mode': select.checked});
61 | if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
62 | else chrome.browserAction.setBadgeText({text: "off"});
63 |
64 | select = document.getElementById("simple_mode");
65 | chrome.storage.sync.set({'simple_mode': select.checked});
66 | if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
67 |
68 | select = document.getElementById("true_mode");
69 | chrome.storage.sync.set({'true_mode': select.checked});
70 | if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
71 |
72 | select = document.getElementById("auto_mode");
73 | chrome.storage.sync.set({'auto_mode': select.checked});
74 | if(select.checked) chrome.browserAction.setBadgeText({text: "on"});
75 | }
76 |
77 | function show() {
78 | var query = { active: true, currentWindow: true };
79 | chrome.tabs.query(query, function(tabs) {
80 | chrome.tabs.sendMessage(tabs[0].id, {command: "show"});
81 | });
82 | }
83 |
84 | function auto_mode() {
85 | var query = { active: true, currentWindow: true };
86 | chrome.tabs.query(query, function(tabs) {
87 | chrome.tabs.sendMessage(tabs[0].id, {command: "auto_mode"});
88 | });
89 | }
90 |
91 | function simple_mode() {
92 | var select = document.getElementById("simple_mode");
93 | var query = { active: true, currentWindow: true };
94 | chrome.tabs.query(query, function(tabs) {
95 | if(select.checked===true)
96 | chrome.tabs.sendMessage(tabs[0].id, {command: "simple_mode_on"})
97 | else
98 | chrome.tabs.sendMessage(tabs[0].id, {command: "simple_mode_off"})
99 | });
100 | }
101 |
102 | function true_mode() {
103 | alert("Чтобы обновления вступили в силу обновите страницу");
104 | var select = document.getElementById("true_mode");
105 | if(select.checked===true)
106 | chrome.runtime.sendMessage({msg: "auto_on"})
107 | else
108 | chrome.runtime.sendMessage({msg: "auto_off"});
109 | }
--------------------------------------------------------------------------------
/popup/popup_style.css:
--------------------------------------------------------------------------------
1 | @import url(https://fonts.googleapis.com/css?family=Arvo:700);
2 | body {
3 | background-color: #222;
4 | width: 250px;
5 | }
6 | .shadow {
7 | color: #fff;
8 | font-family: Arvo;
9 | font-weight: bold;
10 | text-shadow:
11 | -3px -3px 0 #222,
12 | 3px -3px 0 #222,
13 | -3px 3px 0 #222,
14 | 3px 3px 0 #222,
15 | 4px 4px 0 #fff,
16 | 5px 5px 0 #fff,
17 | 6px 6px 0 #fff,
18 | 7px 7px 0 #fff;
19 | line-height: 1.8em;
20 | letter-spacing: 0.1em;
21 | transform: scaleY(0.7);
22 | -webkit-transform: scaleY(0.7);
23 | -moz-transform: scaleY(0.7);
24 | margin:0;
25 | text-align: center;
26 | padding:0;
27 | }
28 | .title_text {
29 | margin: -22px;
30 | font-size: 22px;
31 | }
32 | .button-add {
33 | margin: 0 20px;
34 | margin-bottom: 5px; }
35 |
36 | .button-add {
37 | position: relative;
38 | display: inline-block;
39 | color: #fff; }
40 | .button-add label {
41 | display: inline-block;
42 | text-transform: uppercase;
43 | cursor: pointer;
44 | text-align: left; }
45 | .button-add input {
46 | display: none; }
47 | .button-add__icon {
48 | cursor: pointer;
49 | pointer-events: none; }
50 | .button-add__icon:before, .button-add__icon:after {
51 | content: "";
52 | position: absolute;
53 | top: 45%;
54 | left: 35%;
55 | transition: 0.2s ease-out; }
56 |
57 | .style label {
58 | will-change: transform;
59 | height: 30px;
60 | line-height: 30px;
61 | transition: all 0.2s;
62 | border-radius: 2rem; }
63 |
64 | .style input[type=checkbox] ~ label {
65 | width: 210px;
66 | background: #FF5335; }
67 |
68 | .style input[type=checkbox]:checked ~ label {
69 | width: 210px;
70 | background: #61B136; }
71 |
72 | .style input[type=checkbox]:checked ~ .button-add__icon:before {
73 | transform: translate(-10%, 100%) rotate(45deg);
74 | width: 10.66667px; }
75 |
76 | .style input[type=checkbox]:checked ~ .button-add__icon:after {
77 | transform: translate(30%) rotate(-45deg); }
78 |
79 | .button-add__icon {
80 | position: absolute;
81 | left: 0;
82 | top: 0;
83 | height: 30px;
84 | width: 30px; }
85 | .button-add__icon:before, .button-add__icon:after {
86 | height: 3px;
87 | border-radius: 3px;
88 | background: #fff;
89 | box-shadow: 0 1px 0 rgba(0, 0, 0, 0.1); }
90 | .button-add__icon:before {
91 | width: 17px;
92 | transform: rotate(90deg); }
93 | .button-add__icon:after {
94 | width: 17px;
95 | transform: rotate(0); }
96 |
97 | .style_1 label:before, .style_1 label:after {
98 | content: attr(data-text);
99 | position: absolute;
100 | right: 0.4rem; }
101 | .style_2 label:before, .style_2 label:after {
102 | content: attr(data-text);
103 | position: absolute;
104 | right: 1.3rem; }
105 | .style_3 label:before, .style_3 label:after {
106 | content: attr(data-text);
107 | position: absolute;
108 | right: 1.4rem; }
109 | .style_4 label:before, .style_4 label:after {
110 | content: attr(data-text);
111 | position: absolute;
112 | right: 1.9rem; }
113 |
114 | button {
115 | will-change: transform;
116 | text-decoration: none;
117 | outline: none;
118 | display: inline-block;
119 | padding: 10px 30px;
120 | margin: 10px 20px;
121 | position: relative;
122 | color: white;
123 | border: 1px solid rgba(255,255,255,.4);
124 | background: none;
125 | font-weight: 300;
126 | font-family: 'Montserrat', sans-serif;
127 | text-transform: uppercase;
128 | letter-spacing: 2px;
129 | }
130 | button:before,
131 | button:after {
132 | content: "";
133 | position: absolute;
134 | width: 0;
135 | height: 0;
136 | opacity: 0;
137 | box-sizing: border-box;
138 | }
139 | button:before {
140 | bottom: 0;
141 | left: 0;
142 | border-left: 1px solid white;
143 | border-top: 1px solid white;
144 | transition: 0s ease opacity .8s, .2s ease width .4s, .2s ease height .6s;
145 | }
146 | button:after {
147 | top: 0;
148 | right: 0;
149 | border-right: 1px solid white;
150 | border-bottom: 1px solid white;
151 | transition: 0s ease opacity .4s, .2s ease width , .2s ease height .2s;
152 | }
153 | button:hover:before,
154 | button:hover:after{
155 | height: 100%;
156 | width: 100%;
157 | opacity: 1;
158 | }
159 | button:hover:before {transition: 0s ease opacity 0s, .2s ease height, .2s ease width .2s;}
160 | button:hover:after {transition: 0s ease opacity .4s, .2s ease height .4s , .2s ease width .6s;}
161 | button:hover {background: rgba(255,255,255,.2);}
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Chrome Extension - LMS Answers
2 | * #### Небольшое расширение для легкого выполнения тестов в среде Cambridge LMS.
3 |
4 | ## Последнюю версию всегда можно найти в разделе [releases](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/releases)
5 | ***
6 | ***
7 | ## Быстрое перемещение по документу
8 |
9 | > * ### [Функционал](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB-1)
10 | > * #### [Меню расширения](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%9F%D1%80%D0%B8-%D0%BD%D0%B0%D0%B6%D0%B0%D1%82%D0%B8%D0%B8-%D0%BD%D0%B0-%D0%B8%D0%BA%D0%BE%D0%BD%D0%BA%D1%83-%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BF%D0%BE%D1%8F%D0%B2%D0%B8%D1%82%D1%81%D1%8F-%D0%BC%D0%B5%D0%BD%D1%8E-%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F)
11 | > * #### [Возможности](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%A7%D1%82%D0%BE-%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-%D0%B8%D0%B7-%D1%8D%D1%82%D0%BE%D0%B3%D0%BE-%D0%BC%D0%B5%D0%BD%D1%8E)
12 | > * [Автопоказ ответов](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC-%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC---%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B0%D1%8F-%D1%87%D0%B0%D1%81%D1%82%D1%8C-%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2-%D0%B1%D1%83%D0%B4%D0%B5%D1%82-%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8-%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D1%8F%D1%82%D1%8C%D1%81%D1%8F)
13 | > * [Автоматический режим(beta)](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC-%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC---%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B0%D1%8F-%D1%87%D0%B0%D1%81%D1%82%D1%8C-%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2-%D0%B1%D1%83%D0%B4%D0%B5%D1%82-%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8-%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D1%8F%D1%82%D1%8C%D1%81%D1%8F)
14 | > * [Упрощенная страница](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC-%D0%A3%D0%BF%D1%80%D0%BE%D1%89%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0---%D0%B2%D0%BE-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F-%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2-%D0%B1%D1%83%D0%B4%D0%B5%D1%82-%D0%BE%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B0%D1%82%D1%8C%D1%81%D1%8F-%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D1%87%D0%B0%D1%81%D1%82%D1%8C)
15 | > * [Максимальные баллы](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE-%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC-%D0%9C%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%B1%D0%B0%D0%BB%D0%BB%D1%8B---%D0%BF%D1%80%D0%B8-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B5-%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D0%BE%D0%B2-%D0%B2%D1%81%D0%B5%D0%B3%D0%B4%D0%B0-%D0%B1%D1%83%D0%B4%D0%B5%D1%82-%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9-%D0%B1%D0%B0%D0%BB%D0%BB)
16 | > * #### [Пример работы](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BF%D1%80%D0%B8-%D0%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%BD%D0%BE%D0%BC-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D0%B5-%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%B1%D0%B0%D0%BB%D0%BB%D1%8B)
17 | > * ### [Инструкция по установке](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/blob/master/README.md#%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F-%D0%BF%D0%BE-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B5-1)
18 |
19 | ***
20 | ***
21 |
22 | ## Функционал:
23 | ### При нажатии на иконку расширения появится меню расширения
24 | 
25 |
26 | ### Что можно сделать из этого меню?
27 | * #### Можно выбрать режим "Показывать ответы" - при открытии страницы с тестом ответы автоматически появятся
28 | * Если этого не сделать, то всегда можно нажать на кнопку "Показать ответы"
29 | * #### Можно выбрать режим "Автоматический режим" - большая часть тестов будет автоматически заполняться
30 | * Возможны ошибки, но их вероятность мала
31 | * #### Можно выбрать режим "Упрощенная страница" - во время тестов будет отображаться только основная часть
32 | * Основной частью считается само задание и кнопки перехода к предыдущему и следующему заданиям
33 | * #### Можно выбрать режим "Максимальные баллы" - при проверке ответов всегда будет полный балл
34 | * Однако преподаватель будет видеть, что поля для ответов пустые, поэтому лучше не оставлять поля пустыми.
35 | * После включения и выключения надо обновить страницу для того, чтобы расширение начало действовать
36 |
37 | ### Пример работы расширения при включенном режиме "максимальные баллы":
38 | 
39 |
40 | ***
41 | ***
42 |
43 | ## Инструкция по установке
44 | 1. Скачиваем последнюю версию расширения в разделе [releases](https://github.com/FutureXpo/Chrome-Extension-LMS-Answers/releases)
45 | 
46 | 1. Распаковываем архив в любое место, запоминаем пусть к нему
47 | 1. Открываем Google Chrome, идем во вкладку расширения
48 | 
49 | 1. Включаем режим разработчика. Нажимаем "Загрузить распакованное расширение". Выбираем папку LMS, которую распаковали из архива
50 |  
51 | 1. В списке расширений появилось новое - LMS Answers. Активируем его
52 | 
53 | 1. Все готово, можно начинать пользоваться!
54 |
--------------------------------------------------------------------------------
/js/auto_mode.js:
--------------------------------------------------------------------------------
1 | //По окончании загрузки документа вызывается функция
2 | $(document).ready(function() {
3 | var path = window.location.pathname;
4 | var page = path.split("/").pop();
5 | if(page === 'index.html') {
6 | //При получении команды 'auto_mode' заполняет ответы
7 | chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
8 | if(request.command==="auto_mode") {
9 | auto_mode();
10 | }
11 | });
12 | //Если выбрана функция автоматического показа ответов запускается функция заполнения ответов
13 | chrome.storage.sync.get(['auto_mode'], function(items) {
14 | var choise=items['auto_mode'];
15 | if(choise == undefined) choise = false;
16 | if(choise){
17 | var timerId = setInterval(auto_mode, 2000);
18 | setTimeout(function() {
19 | clearInterval(timerId);
20 | }, 7000);
21 | }
22 | });
23 | }
24 | })
25 | var init = 0;
26 | //Заполнить ответы
27 | function auto_mode() {
28 | var test,answers;
29 | //select box
30 | test = document.getElementsByClassName('selectBox');
31 | answers = document.getElementsByTagName('b');
32 | if(test&&answers) fill_selectbox(test,answers);
33 | //phrases
34 | test = document.getElementsByClassName('all-items-drop');
35 | answers = document.getElementsByClassName('correctAnswer');
36 | if(test&&answers) fill_phrases(test,answers);
37 | //radio_columns
38 | test = document.getElementsByTagName('input');
39 | if(test) fill_columns(test);
40 | //radio button
41 | test = document.getElementsByClassName('option_horizontal');
42 | answers = document.getElementsByClassName('correct-answers');
43 | if(test&&answers) fill_radio(test,answers);
44 | //crossword
45 | test = document.getElementsByClassName('word-Box')[0];
46 | answers = document.getElementsByClassName('all-words-Answer')[0];
47 | if(test&&answers) fill_crossword(test,answers);
48 | //pronunciation
49 | test = document.getElementsByClassName('categories')[0];
50 | answers = document.getElementsByClassName('categories')[1];
51 | if(test&&answers) fill_pronunciation(test,answers);
52 | //text input
53 | test = document.getElementsByClassName('inputBox');
54 | answers = document.getElementsByClassName('correctAnsDiv');
55 | if(test&&answers) fill_input(test,answers);
56 | //editDiv
57 | test = document.getElementsByClassName('editableDiv');
58 | answers = document.getElementsByClassName('correctAnsDiv');
59 | if(test&&answers) fill_editable(test,answers);
60 | //moveToken
61 | test = document.getElementsByClassName('moveToken');
62 | answers = document.getElementsByClassName('answerSentClass');
63 | if(test&&answers) fill_sorting(test,answers);
64 | }
65 | //Заполнить задания, где есть selectBox
66 | function fill_selectbox(test,answers) {
67 | var test_arr = Array.prototype.slice.call(test);
68 | var answers_arr = Array.prototype.slice.call(answers);
69 | if(answers_arr&&test_arr)answers_arr.forEach(function(item, i) {
70 | var a = item.innerHTML.replace(/(^\s*)|(\s*)$/g, '');;
71 | if(test_arr[i])
72 | Array.prototype.slice.call(test_arr[i].options).forEach(function(item) {
73 | if(item.value.includes(a)) {
74 | var b = item.value.replace(a, '');
75 | if( b.search(/[a-zA-Z]/) === -1 ) test_arr[i].value = item.value;
76 | }
77 | });
78 | });
79 | }
80 | //Заполнить задания, где есть inputBox
81 | function fill_input(test,answers) {
82 | var test_arr = Array.prototype.slice.call(test);
83 | var answers_arr = Array.prototype.slice.call(answers);
84 | var txt_answers_arr = [];
85 | if(answers_arr&&test_arr)answers_arr.forEach(function(item, i) {
86 | txt_answers_arr = push_answer_b(item.getElementsByClassName("showAnswersentenseClass"),txt_answers_arr);
87 | });
88 | if(answers_arr&&test_arr)test_arr.forEach(function(item, i) {
89 | if(item.getAttribute("type")!=="radio"&&item.getAttribute("class")!=="inputBox ng-scope ng-valid ng-dirty"){
90 | item.setAttribute("class","inputBox ng-scope ng-valid ng-dirty");
91 | item.value = txt_answers_arr[i]+"-";//.innerHTML + "-";
92 | if(init===0)alert("Не забудьте убрать знак '-' в каждом задании");
93 | init = 1;
94 | }
95 | });
96 | }
97 | //Заполнить задания, где есть radio buttons
98 | function fill_radio(test,answers) {
99 | var test_arr = Array.prototype.slice.call(test);
100 | var answers_arr = Array.prototype.slice.call(answers);
101 | if(answers_arr&&test_arr)answers_arr.forEach(function(item, i) {
102 | var radio_arr = Array.prototype.slice.call(test_arr[i].getElementsByTagName('input'));
103 | var text_answers_arr = Array.prototype.slice.call(answers_arr[i].getElementsByTagName('b'));
104 | var answer = "";
105 | if(text_answers_arr) text_answers_arr.forEach(function(item1) {
106 | if(item1.innerHTML.search(/[a-zA-Z]/)===-1)answer=answer.substring(0,answer.length-1);
107 | answer+=item1.innerHTML.replace(/(^\s*)|(\s*)$/g, '');
108 | if(item1.innerHTML!=='-')answer+=' ';
109 | });
110 | answer=answer.replace('/','').replace(/(^\s*)|(\s*)$/g, '');
111 | var text_test_arr = Array.prototype.slice.call(test_arr[i].getElementsByClassName('optionText'));
112 | if(text_test_arr) text_test_arr.forEach(function(item1,j) {
113 | if(item1.innerText.includes(answer)) {
114 | var c = item1.innerText.replace(answer, '');
115 | if( c.search(/[a-zA-Z]/) === -1 ) radio_arr[j].click();
116 | }
117 | });
118 | });
119 | }
120 | //Заполнить кроссворд
121 | function fill_crossword(test,answers) {
122 | var table_test = test.getElementsByTagName('table')[0];
123 | var answers_test = answers.getElementsByTagName('table')[0];
124 | var table_test_arr = Array.prototype.slice.call(table_test.getElementsByTagName('div'));
125 | var answers_test_arr = Array.prototype.slice.call(answers_test.getElementsByTagName('div'));
126 | if(table_test_arr&&answers_test_arr) table_test_arr.forEach(function(item,i) {
127 | item.innerHTML = answers_test_arr[i].innerHTML;
128 | });
129 | }
130 | //Заполнить произношение
131 | function fill_pronunciation(test,answers) {
132 | var test_choises = document.getElementsByClassName('all-items-container')[0].getElementsByClassName('dragger');
133 | var text_test_choises = Array.prototype.slice.call(document.getElementsByClassName('all-items-container')[0].getElementsByClassName('ng-binding'));
134 | var table_test = test.getElementsByClassName('category-box');
135 | var table_answers = answers.getElementsByClassName('category-correctans-box');
136 | var table_test_arr = Array.prototype.slice.call(table_test);
137 | var answers_test_arr = Array.prototype.slice.call(table_answers);
138 | if(answers_test_arr&&table_test_arr) answers_test_arr.forEach(function(item,i) {
139 | var answers = Array.prototype.slice.call(item.getElementsByClassName('dragger'));
140 | if(answers) answers.forEach(function(item) {
141 | var a = item.getElementsByClassName('ng-binding')[0].innerHTML;
142 | if(text_test_choises) text_test_choises.forEach(function(item,j) {
143 | if(item.innerHTML === a&&test_choises[j].getAttribute("class")!=="dragger draggable ng-scope ui-draggable cloneDropped opacityDiv") {
144 | test_choises[j].setAttribute("class","dragger draggable ng-scope ui-draggable cloneDropped opacityDiv");
145 | var b = test_choises[j].cloneNode(true);
146 | b.setAttribute("class","dragger draggable ng-scope ui-draggable cloneDropped clone");
147 | table_test_arr[i].getElementsByClassName('all-items-drop dropped-items drop-dest')[0].append(b);
148 | }
149 | });
150 | });
151 | });
152 | }
153 | //Заполнить фразы словами
154 | function fill_phrases(test,answers) {
155 | var test_arr = Array.prototype.slice.call(test);
156 | var answers_arr = Array.prototype.slice.call(answers);
157 | var d = [];
158 | if(answers_arr&&test_arr)answers_arr.forEach(function(item, i) {
159 | Array.prototype.slice.call(item.getElementsByClassName('dndAnswerLineClass')).forEach(function(item) {d.push(item);});;
160 | });
161 | if(d.length>0)answers_arr=d;
162 | var test_choises = document.getElementsByClassName('all-items-container')[0];
163 | var txt_answers_arr = [];
164 | if(test_choises){
165 | var text_test_choises = Array.prototype.slice.call(test_choises.getElementsByClassName('ng-binding'));
166 | test_choises=test_choises.getElementsByClassName('dragger');
167 | }
168 | if(answers_arr&&test_arr)txt_answers_arr = push_answer_b(answers,txt_answers_arr);
169 | if(answers_arr&&test_arr)test_arr.forEach(function(item, i) {
170 | var lil = 0;
171 | /*var text_answers_arr = Array.prototype.slice.call(answers_arr[i].getElementsByTagName('b'));
172 | var a = "";
173 | if(text_answers_arr) text_answers_arr.forEach(function(item1) {
174 | if(item1.innerHTML.search(/[a-zA-Z]/)===-1)a=a.substring(0,a.length-1);
175 | a+=item1.innerHTML.replace(/(^\s*)|(\s*)$/g, '');
176 | if(item1.innerHTML!=='-')a+=' ';
177 | });
178 | a=a.replace(/(^\s*)|(\s*)$/g, '');*/
179 | var a = txt_answers_arr[i];
180 | if(text_test_choises) text_test_choises.forEach(function(item,j) {
181 | if(item.innerHTML.includes(a)) {
182 | var b = item.innerHTML.replace(a, '');
183 | if( b.search(/[a-zA-Z]/) === -1 )
184 | if(lil===0&&test_choises[j].getAttribute("class")!=="dragger draggable ng-scope ui-draggable cloneDropped opacityDiv") {
185 | test_choises[j].setAttribute("class","dragger draggable ng-scope ui-draggable cloneDropped opacityDiv");
186 | var b = test_choises[j].cloneNode(true);
187 | test_arr[i].append(b);
188 | test_arr[i].setAttribute("style",b.getAttribute("style"));
189 | test_arr[i].setAttribute("class","drop-dest droppable-Item all-items-drop dropped-items ui-droppable droppableWhiteBG droppableTransparentBG");
190 | b.setAttribute("class","dragger draggable ng-scope ui-draggable cloneDropped clone");
191 | b.setAttribute("style",b.getAttribute("style")+"position: relative; left: 0px; top: 0px;");
192 | lil=1;
193 | }
194 | }
195 |
196 | });
197 | });
198 | }
199 | //Заполнить задания, где есть radio columns
200 | function fill_columns(test) {
201 | var test_arr = Array.prototype.slice.call(test);
202 | if(test_arr)test_arr.forEach(function(item, i) {
203 | if(test_arr[i+test_arr.length/2])if(test_arr[i+test_arr.length/2].checked)item.click();
204 | });
205 | }
206 | //Заполнить задания, где надо перемещать
207 | function fill_sorting(test,answers) {
208 | var test_arr = Array.prototype.slice.call(test);
209 | var answers_arr = Array.prototype.slice.call(answers);
210 | if(test_arr&&answers_arr)test_arr.forEach(function(item, i) {
211 | var text_test_choises = Array.prototype.slice.call(item.getElementsByClassName('ng-binding'));
212 | var test_choises = Array.prototype.slice.call(item.getElementsByClassName('sorting_li ng-scope'));
213 | var answer = answers_arr[i].innerHTML.replace(/<[^>]+>/g,'').replace(/(^\s*)|(\s*)$/g, '');
214 | var size = text_test_choises.length;
215 | var a = answer;
216 | var b = "";
217 | while (size > 0){
218 | text_test_choises.forEach(function(item1, i) {
219 | if(item1.innerHTML.toUpperCase().includes(a.toUpperCase())){
220 | size--;
221 | answer=answer.substring(a.length,answer.length).replace(/(^\s*)|(\s*)$/g, '');
222 | a=answer;
223 | b = b + test_choises[i].outerHTML;
224 | }
225 | });
226 | a = a.substring(0,a.length-1);
227 | }
228 | item.innerHTML = b;
229 | });
230 | }
231 | //Заполнить задания, где надо исправить ошибки
232 | function fill_editable(test,answers) {
233 | var test_buttons = document.getElementsByClassName('buttonContainer');
234 | var test_arr = Array.prototype.slice.call(test);
235 | var answers_arr = Array.prototype.slice.call(answers);
236 | if(test_arr&&answers_arr)test_arr.forEach(function(item, i) {
237 | test_buttons[i].getElementsByTagName('button')[0].click();
238 | if(!answers_arr[i].innerHTML.includes("No change"))
239 | item.innerHTML=answers_arr[i].innerHTML.replace(/<[^>]+>/g,'');
240 | });
241 | }
242 | //Найти ответы в строке(для inputBox)
243 | function push_answer_b(answer_arr,answers_arr){
244 | var answers = Array.prototype.slice.call(answer_arr);
245 | if(answers)answers.forEach(function(answers) {
246 | if(answers){
247 | var txt = answers.innerHTML+" ";
248 | var answer = " ";
249 | var mode = 0;
250 | var i = 0;
251 | for(var i=0; i")){
258 | mode = 2;
259 | answer+=" ";
260 | if(answer.endsWith(" - "))answer=answer.substring(0,answer.length-3)+"-";
261 | }
262 | }
263 | break;
264 | case 1:
265 | if(a === "<"){
266 | var b = txt.substring(i,txt.length);
267 | if(b.startsWith("")){
268 | if(answer.endsWith(" .")||answer.endsWith(" ,"))answer=answer.substring(0,answer.length-2)+answer.substring(answer.length-1,answer.length);
269 | mode = 0;
270 | if(!(b.startsWith("")||b.startsWith(" "))){
271 | answer=answer.replace(/(^\s*)|(\s*)$/g, '');
272 | answers_arr.push(answer);
273 | answer = "";
274 | }
275 | }
276 | }
277 | else answer += a;
278 | break;
279 | case 2:
280 | if(a === ">"){
281 | mode = 1;
282 | }
283 | break;
284 | }
285 | }
286 | }
287 | });
288 | return answers_arr;
289 | }
--------------------------------------------------------------------------------
/js/true_mode.js:
--------------------------------------------------------------------------------
1 | chrome.storage.sync.get(['true_mode'], function(items) {
2 | var choise=items['true_mode'];
3 | if(choise == undefined) choise = false;
4 | if(choise) on();
5 | });
6 | //Функция перехвата
7 | var f = function(details) {
8 | if (details.url.indexOf('app.js') !== -1) {
9 | return {redirectUrl: "data:text/javascript;charset=UTF-8;base64,LyogSU5KRUNURUQgKi8NCnZhciBjdXBBcHAgPSBhbmd1bGFyLm1vZHVsZSgnQW5ndWxhckpTQXBwJywgWyduZ1JvdXRlJywgJ25nUmVzb3VyY2UnLCAnbmdTYW5pdGl6ZSddKTsNCmNvbnNvbGUubG9nKCJJTkpFQ1RFRCIpOw0KDQovKg0KICpUT0RPIG5nLWJpbmQtaHRtbC11bnNhZmUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCB3aXRoIHYxLjIuMyBoZW5jZQ0KIGZvciBub3cgdHJ1c3RpbmcgYWxsIGlucHV0IGRhdGEsIHdpbGwgY29tZSBiYWNrIHRvIHRoaXMgbGF0ZXIuICovDQpjdXBBcHAuY29uZmlnKFsnJHNjZVByb3ZpZGVyJywgZnVuY3Rpb24oJHNjZVByb3ZpZGVyKSB7DQogICAgICAgICAgJHNjZVByb3ZpZGVyLmVuYWJsZWQoZmFsc2UpOw0KICAgICB9XSk7DQoNCi8vYXMgYW5ndWxhckpTIDEuMi4yIGRvZXMgbm90IHN1cHBvcnQgbmctYmluZC1odG1sIGhlbmNlDQovL2ZvbGxsb3dpbmcgZGlyZWN0aXZlIGlzIHRvIGVtdWx0YXRlIGp1c3QgdGhhdC4gd2lsbCByZXZpc2l0IHRoaXMgdG8gc2VlIGlmIHdlIGNhbiBvcHRpbWl6ZSBpdCBhbnkgZnVydGhlci4gDQpjdXBBcHAuZGlyZWN0aXZlKCdkeW5hbWljJywgZnVuY3Rpb24oJGNvbXBpbGUpIHsNCiAgICAgcmV0dXJuIHsNCiAgICAgICAgICByZXN0cmljdDogJ0EnLA0KICAgICAgICAgIHJlcGxhY2U6IHRydWUsDQogICAgICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZSwgYXR0cnMpIHsNCiAgICAgICAgICAgICAgIHNjb3BlLiR3YXRjaChhdHRycy5keW5hbWljLCBmdW5jdGlvbihodG1sKSB7DQogICAgICAgICAgICAgICAgICAgIGVsZS5odG1sKGh0bWwpOw0KICAgICAgICAgICAgICAgICAgICAkY29tcGlsZShlbGUuY29udGVudHMoKSkoc2NvcGUpOw0KICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgfQ0KICAgICB9Ow0KfSk7DQoNCg0KY3VwQXBwLmNvbnRyb2xsZXIoJ0hlYWRlckN0cmwnLCBmdW5jdGlvbigkc2NvcGUsICRzY2UsIGFwcFNlcnZpY2UsICRyb3V0ZSwgJGxvY2F0aW9uLCBTY29yZVNlcnZpY2UsJGludGVydmFsKSB7DQogICAgICAkc2NvcGUuaXNTaG93UG9wdXAgPSBmYWxzZTsNCiAgICAgJHNjb3BlLnBvcHVwQ29udGVudCA9ICIiOw0KICAgICAkc2NvcGUuZ1Nob3dGZWVkYmFja0JveCA9IGZhbHNlOw0KICAgICAkc2NvcGUuZ0NvcnJlY3RBbnN3ZXJDb3VudCA9IDA7DQogICAgICRzY29wZS5ndG90YWxBbnN3ZXJDb3VudCA9IDA7DQogICAgICRzY29wZS5nQWN0aXZpdHlJbmZvID0ge307DQogICAgICRzY29wZS5nRmVlZGJhY2tUaXRsZSA9ICIiOw0KICAgICAkc2NvcGUuZ0ZlZWRiYWNrVGV4dCA9ICIiOw0KICAgICAkc2NvcGUuZ0Rpc2FibGVDaGVjayA9IGZhbHNlOyAgIC8vLS0gQWRkZWQgb24gMjgvMDMvMjAxNCB0byBkaXNhYmxlIGNoZWNrIGJ0biBvbiBjbGljayAtLSAvLw0KICAgICAkc2NvcGUuZ0ZpbmlzaENsaWNrZWQgPSBmYWxzZTsNCiAgICAgJHNjb3BlLmdEaXNhYmxlU2hvd0Fuc3dlciA9IHRydWU7DQogICAgICRzY29wZS5nRGlzYWJsZVN0YXJ0QWdhaW4gPSBmYWxzZTsNCiAgICAgJHNjb3BlLmdTaG93U3RhcnRBZ2FpbkJveCA9IGZhbHNlOw0KICAgICAkc2NvcGUuZ0NvdXJzZUNvbXBsZXRlZCA9IGZhbHNlOw0KICAgICAkc2NvcGUuZ0NvcnJlY3RBbnN3ZXJEaXNwbGF5ZWQgPSBmYWxzZTsNCiAgICAgJHNjb3BlLmdTaG93SGludEJ1dHRvbiA9IGZhbHNlOw0KICAgICAkc2NvcGUuZ0RhdGFGb2xkZXIgPSAnZGF0YS8nOw0KICAgICAkc2NvcGUuc2hvd0FjdGl2aXRpZXNJbmRleGVzID0gdHJ1ZTsNCiAgICAgJHNjb3BlLmF1ZGlvUGF0aCA9ICIiOw0KICAgICAvLyAkc2NvcGUudmlkZW9QYXRoPSdhc3NldHMvY2hvaWNlL3ZpZGVvL0NFUF9GTFBSX1ZfQTJVN0VFXzAxLm1wNCcNCiAgICAgJHNjb3BlLmFjdGl2YXRlQXVkaW9QbGF5ZXIgPSBmYWxzZTsNCiAgICAgJHNjb3BlLmFjdGl2YXRlQXVkaW9TY3JpcHQgPSBmYWxzZTsNCiAgICAgLy8kc2NvcGUudHJhY2tUZXh0ID0gJzxiPlRyYXNjcmlwdDwvYj4gdGV4dCB3aWxsIGNvbWUgaGVyZSc7DQogICAgICRzY29wZS50cmFja1RleHQgPSAnJzsNCiAgICAgJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPSAxOyAvLy0tIEFkZGVkIG9uIDEwLzA0LzIwMTQgIC0tIC8vDQogICAgICRzY29wZS5nVGVtcGxhdGVVcmxBcnJheSA9IFsiIl07IC8vLS0gQWRkZWQgb24gMTAvMDQvMjAxNCAgLS0gLy8NCiAgICAgJHNjb3BlLml0ZW1BdWRpb0FyciA9IFtdOw0KICAgICAkc2NvcGUudmlkZW9Qb3NpdGlvbiA9ICdyZWxhdGl2ZSc7DQogICAgICRzY29wZS52aWRlb0xlZnRQYXRoID0gJyc7DQogICAgICRzY29wZS52aWRlb1JpZ2h0UGF0aCA9ICcnOw0KICAgICAkc2NvcGUuYWN0aXZpdHlMV2lkdGggPSA2MDsNCiAgICAgJHNjb3BlLmFjdGl2aXR5UldpZHRoID0gNDA7DQogICAgICRzY29wZS50cmFja1RleHQgPSAiIjsNCiAgICAgJHNjb3BlLnZpZGVvUG9zaXRpb24gPSAnYWJzb2x1dGUnOw0KICAgICAkc2NvcGUuZ2JhY2tCdG5EaXNhYmxlZCA9IHRydWU7DQogICAgICRzY29wZS5nbmV4dEJ0bkRpc2FibGVkID0gdHJ1ZTsNCiAgICAgJHNjb3BlLnBhZ2VDb21wbGV0aW9uQXJyYXkgPSBbJyddOw0KICAgICAkc2NvcGUuZW5hYmxlTmV4dHBhZ2UgPSBbJyddOw0KCSAkc2NvcGUubG1zSW5pdENhbGxlZD1mYWxzZTsNCiAgICAgdmFyIHRlbXBfaWQ7DQogICAgIC8vbG9hZCBnbG9iYWwgY29uZmlnLi4NCgkgDQoJICAkc2NvcGUuJG9uKCdsbXNJbml0JywgZnVuY3Rpb24oZSx2YWwpew0KCQkJLy8kKCIjcHJvZ3Jlc3MiKS5hcHBlbmQoJ2xtcyBpbml0Ojo6JysgdmFsKTsNCgkJCSRzY29wZS5sbXNJbml0Q2FsbGVkPXRydWU7DQoJCX0pOw0KCSAgICAgIGFwcFNlcnZpY2UuZ2V0KCJkYXRhL2NvbmZpZy5qc29uIikudGhlbihmdW5jdGlvbihkYXRhKSB7DQogICAgICAgICAgJHNjb3BlLmFwcF9kYXRhID0gZGF0YTsNCiAgICAgICAgICBpZiAoZGF0YS5hY3Rpdml0aXRlcy5sZW5ndGggPiAxKSB7DQogICAgICAgICAgICAgICAkc2NvcGUuc2hvd0FjdGl2aXRpZXNJbmRleGVzID0gZmFsc2U7DQogICAgICAgICAgfQ0KICAgICAgICAgIFNjb3JlU2VydmljZS5zZXRBY3Rpdml0eUNvdW50KGRhdGEuYWN0aXZpdGl0ZXMubGVuZ3RoKTsNCiAgICAgICAgICAvLy0tIEFkZGVkIG9uIDEwLzA0LzIwMTQgIC0tIC8vDQogICAgICAgICAgZGF0YS5hY3Rpdml0aXRlcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7DQogICAgICAgICAgICAgICAkc2NvcGUuZ1RlbXBsYXRlVXJsQXJyYXlbaW5kZXhdID0gJyMnICsgaXRlbS50ZW1wbGF0ZUlEICsgJy8nICsgaXRlbS5kYXRhZmlsZTsNCiAgICAgICAgICB9KTsNCiAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8NCiAgICAgICAgICAkc2NvcGUuYXNzaWduUGFnZUNvbXBsZXRpb25BcnJheShkYXRhLmFjdGl2aXRpdGVzLmxlbmd0aCk7DQoNCiAgICAgICAgICAkKCc8ZGl2PicpLmF0dHIoJ2lkJywgJ2RlYnVnJykuY3NzKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpLmNzcygndG9wJywgJzEwMHB4JykuY3NzKCdsZWZ0JywgJzUwcHgnKS5jc3MoJ2JvcmRlcicsICcxcHggc29saWQgcmVkJykuaGlkZSgpLmFwcGVuZFRvKCQoJ2JvZHknKSkNCiAgICAgICAgICB2YXIgYWN0aXZpdHkgPSBkYXRhLmFjdGl2aXRpdGVzWzBdOw0KICAgICAgICAgIHZhciByZWRpcmVjdFRvID0gJy8nICsgYWN0aXZpdHkudGVtcGxhdGVJRCArICcvJyArIGFjdGl2aXR5LmRhdGFmaWxlOw0KICAgICAgICAgICRsb2NhdGlvbi5wYXRoKHJlZGlyZWN0VG8pOw0KDQogICAgICAgICAgLy90ZW1wX2lkPWFjdGl2aXR5LnRlbXBsYXRlSUQ7DQogICAgIH0pOw0KCQ0KICAgICAkc2NvcGUuJG9uKCdvbkl0ZW1BdWRpb0xvYWQnLCBmdW5jdGlvbihlLCBvYmopIHsNCiAgICAgICAgICAkc2NvcGUuaXRlbUF1ZGlvQXJyLnB1c2gob2JqKTsNCiAgICAgfSk7DQogICAgICRzY29wZS4kb24oJ29uVGVtcGxhdGVEZXN0cm95ZWQnLCBmdW5jdGlvbihlLCBvYmopIHsNCiAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgd2hpbGUgKCRzY29wZS5pdGVtQXVkaW9BcnIubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9ICRzY29wZS5pdGVtQXVkaW9BcnIucG9wKCk7DQogICAgICAgICAgICAgICAgICAgICQoZWxlbWVudCkualBsYXllcigiZGVzdHJveSIpOw0KICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLnJlbW92ZSgpOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygiY2FsbGluZy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIiskc2NvcGUuaXRlbUF1ZGlvQXJyLmxlbmd0aCkJDQogICAgICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICAgIH0NCiAgICAgfSk7DQoNCiAgICAgJHNjb3BlLiRvbignb25BY3Rpdml0eUluZm9Mb2FkZWQnLCBmdW5jdGlvbihlLCBvYmopIHsNCgkgCSAgJHNjb3BlLmhpZGVHbG9iYWxQbGF5ZXIgPSBmYWxzZQ0KICAgICAgICAgICRzY29wZS52VHJhY2tUZXh0ID0gIiI7DQogICAgICAgICAgJHNjb3BlLnZpZGVvTGVmdFBhdGggPSAnJzsNCiAgICAgICAgICAkc2NvcGUudmlkZW9SaWdodFBhdGggPSAnJzsNCiAgICAgICAgICAkc2NvcGUuYWN0aXZpdHlMV2lkdGggPSA2MDsNCiAgICAgICAgICAkc2NvcGUuYWN0aXZpdHlSV2lkdGggPSA0MDsNCiAgICAgICAgICAkc2NvcGUudHJhY2tUZXh0ID0gIiI7DQogICAgICAgICAgJHNjb3BlLmF1ZGlvUGF0aCA9ICIiDQogICAgICAgICAgJHNjb3BlLmFjdGl2YXRlQXVkaW9QbGF5ZXIgPSBmYWxzZTsNCiAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1NjcmlwdCA9IGZhbHNlOw0KDQogICAgICAgICAgJHNjb3BlLmdBY3Rpdml0eUluZm8gPSBvYmo7DQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlQ2hlY2sgPSBmYWxzZTsgICAgLy8tLSBBZGRlZCBvbiAyOC8wMy8yMDE0IHRvIGRpc2FibGUgY2hlY2sgYnV0dHRvbiBvbiBjbGljayAtLS8vDQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU3RhcnRBZ2FpbiA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nU2hvd0ZlZWRiYWNrQm94ID0gZmFsc2U7DQogICAgICAgICAgJHNjb3BlLmdTaG93U3RhcnRBZ2FpbkJveCA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXIgPSB0cnVlOw0KICAgICAgICAgICRzY29wZS5nQ29ycmVjdEFuc3dlckRpc3BsYXllZCA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nQ291cnNlQ29tcGxldGVkID0gZmFsc2U7DQogICAgICAgICAgJHNjb3BlLmdGaW5pc2hDbGlja2VkID0gZmFsc2U7DQogICAgICAgICAgJCgnI3BvcHVwSGludCcpLmRpYWxvZygiY2xvc2UiKTsNCiAgICAgICAgICAkKCcjcG9wdXBIZWxwJykuZGlhbG9nKCJjbG9zZSIpOw0KICAgICAgICAgICQoJyNwb3B1cEFjdGl2aXR5Rm9jdXMnKS5kaWFsb2coImNsb3NlIik7DQogICAgICAgICAgLy8kKCIudHJhbnNjcmlwdFBvcHVwIikuZGlhbG9nKCJkZXN0cm95Iik7DQogICAgICAgICAgLy8kKCIudlBhbiIpLmRpYWxvZygiZGVzdHJveSIpOw0KICAgICAgICAgIC8vJCgiLmFQYW4iKS5kaWFsb2coImRlc3Ryb3kiKTsNCiAgICAgICAgICAkKCIuYVBhbiIpLmRpYWxvZygnY2xvc2UnKTsNCiAgICAgICAgICAkKCIudlBhbiIpLmRpYWxvZygnY2xvc2UnKTsNCiAgICAgICAgICAkKCcjcG9wdXBIZWxwJykucGFyZW50KCkuY3NzKCdtaW4td2lkdGgnLCAnMjY1cHgnKTsNCiAgICAgICAgICAkKCcjcG9wdXBIZWxwJykuY3NzKCdwYWRkaW5nLWxlZnQnLCAnMTVweCcpOw0KCQkgIHZhciBzdG9wOw0KICAgICAgICAgIC8vICRzY29wZS5hc3NpZ25RdWVzdGlvbkF1ZGlvVG9QbGF5ZXIoKTsNCiAgICAgICAgICBpZiAoJHNjb3BlLmdBY3Rpdml0eUluZm8uaXNBY3Rpdml0eVBhZ2UgPT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgICRzY29wZS5nRGlzYWJsZUNoZWNrID0gdHJ1ZTsgICAgLy8tLSBBZGRlZCBvbiAyOC8wMy8yMDE0IHRvIGRpc2FibGUgY2hlY2sgYnV0dHRvbiBvbiBjbGljayAtLS8vDQogICAgICAgICAgICAgICAkc2NvcGUuZ0Rpc2FibGVTdGFydEFnYWluID0gdHJ1ZTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKCRzY29wZS5nQWN0aXZpdHlJbmZvLmhpZGVHbG9iYWxQbGF5ZXIgPT09IHRydWUpIHsNCiAgICAgICAgICAgICAgICRzY29wZS5hY3RpdmF0ZUF1ZGlvUGxheWVyID0gZmFsc2U7DQogICAgICAgICAgICAgICAkc2NvcGUuaGlkZUdsb2JhbFBsYXllciA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmhpZGVHbG9iYWxQbGF5ZXINCiAgICAgICAgICB9DQoJCSAgDQoJCSAgc3RvcCA9ICRpbnRlcnZhbChmdW5jdGlvbigpIHsNCgkJICAvLyAkKCIjcHJvZ3Jlc3MiKS5hcHBlbmQoJ1xud2FpdCBmb3IgbG1zIGluaXQ6OjonKTsNCgkJIAlpZigkc2NvcGUubG1zSW5pdENhbGxlZCl7DQoJCQkJU2NvcmVTZXJ2aWNlLmFkZFZpc2l0ZWQoJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgLSAxKQ0KCQkJCXZhciBwcm9ncmVzcyA9IFNjb3JlU2VydmljZS5nZXRQcm9ncmVzcygpOw0KCQkJCSRzY29wZS4kYnJvYWRjYXN0KCdzZW5kUHJvZ3Jlc3MnLCBwcm9ncmVzcyk7DQoJCQkJJGludGVydmFsLmNhbmNlbChzdG9wKTsNCgkJCQlzdG9wID0gdW5kZWZpbmVkOw0KCQkJIH19LCAxMDApDQoJCSAgDQoJCSAgDQoJCSAgDQogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICRzY29wZS4kYXBwbHkoZnVuY3Rpb24oc2NvcGUpIHsNCg0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1NjcmlwdCA9IGZhbHNlOw0KDQogICAgICAgICAgICAgICAgICAgIC8vICRzY29wZS5tZXNzYWdlID0gIlRpbWVvdXQgY2FsbGVkISI7DQogICAgICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aCAhPT0gdW5kZWZpbmVkICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoICE9PSAidW5kZWZpbmVkIiAmJiAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0uYXVkaW9QYXRoICE9PSB1bmRlZmluZWQgJiYgJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0uYXVkaW9QYXRoICE9PSAiIikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmF1ZGlvUGF0aCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzBdLmF1ZGlvUGF0aDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS50cmFja1RleHQgPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aFswXS50cmFja1R4dDsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8kc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9ICEoJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0ucXVlc3Rpb25BdWRpb0FmdGVyQ2hlY2spOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFjdGl2YXRlQXVkaW9TY3JpcHQgPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aFswXS5hY3RpdmVBdWRpb1NjcmlwdEFmdGVyQ2hlY2s7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRzY29wZS5hY3RpdmF0ZUF1ZGlvU2NyaXB0ID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuJGJyb2FkY2FzdCgndG9nZ2xlQXVkaW9TY3JpcHQnLCAkc2NvcGUuYWN0aXZhdGVBdWRpb1NjcmlwdCk7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzBdLnF1ZXN0aW9uQXVkaW9BZnRlckNoZWNrID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hY3RpdmF0ZUF1ZGlvUGxheWVyID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hY3RpdmF0ZUF1ZGlvUGxheWVyID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hY3RpdmF0ZUF1ZGlvUGxheWVyID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuaXNBdWRpb0F2YWlsYWJsZSA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfc3R5bGU7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmFjdGl2YXRlQXVkaW9QbGF5ZXIgPT09IGZhbHNlICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzBdLnF1ZXN0aW9uQXVkaW9BZnRlckNoZWNrICE9PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGUgPSB7J3Zpc2liaWxpdHknOiAnaGlkZGVuJ307DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJHNjb3BlLmFjdGl2YXRlQXVkaW9QbGF5ZXIgPT09IGZhbHNlICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzBdLnF1ZXN0aW9uQXVkaW9BZnRlckNoZWNrID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGUgPSB7J3Zpc2liaWxpdHknOiAndmlzaWJsZSd9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS5hY3RpdmF0ZUF1ZGlvUGxheWVyID09PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGUgPSB7J3Zpc2liaWxpdHknOiAndmlzaWJsZSd9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5nQWN0aXZpdHlJbmZvLnZpZGVvUG9zaXRpb24gPT09ICdyZWxhdGl2ZScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUudmlkZW9Qb3NpdGlvbiA9ICdyZWxhdGl2ZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAgLy8kc2NvcGUudmlkZW9QYXRoPSIiOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS52aWRlb1Bvc2l0aW9uID0gJ2Fic29sdXRlJzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdBY3Rpdml0eUluZm8udmlkZW9QYXRoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzY29wZS5nQWN0aXZpdHlJbmZvLnZpZGVvUGF0aFswXS5wYXRoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLnZpZGVvUG9zaXRpb24gPT0gJ2Fic29sdXRlJykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUudmlkZW9MZWZ0UGF0aCA9ICIiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUudmlkZW9SaWdodFBhdGggPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby52aWRlb1BhdGhbMF0ucGF0aA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnZpZGVvUmlnaHRQYXRoID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS52aWRlb0xlZnRQYXRoID0gJHNjb3BlLmdBY3Rpdml0eUluZm8udmlkZW9QYXRoWzBdLnBhdGgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIkxMTExMIik7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5hY3Rpdml0eUxXaWR0aCA9IDUwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmFjdGl2aXR5UldpZHRoID0gNTA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGUudlRyYWNrVGV4dCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLnZpZGVvUGF0aFsxXS50cmFja1R4dDsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwgNTAwKTsNCg0KICAgICAgICAgIHZhciBwYXRoID0gJGxvY2F0aW9uLnBhdGgoKTsNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICRzY29wZS5nVGVtcGxhdGVVcmxBcnJheS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgaWYgKHBhdGggPT09ICRzY29wZS5nVGVtcGxhdGVVcmxBcnJheVswXS5zcGxpdCgnIycpLmpvaW4oJy8nKSkgew0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgJHNjb3BlLmxvY2F0aW9uID0gIiMiICsgJGxvY2F0aW9uLnBhdGgoKS5zdWJzdHIoMSwgJGxvY2F0aW9uLnBhdGgoKS5sZW5ndGgpOw0KICAgICAgICAgIHZhciB0bXBJbmRleCA9IDA7DQogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkc2NvcGUuZ1RlbXBsYXRlVXJsQXJyYXkubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgIGlmICgkc2NvcGUuZ1RlbXBsYXRlVXJsQXJyYXlbaV0gPT09ICRzY29wZS5sb2NhdGlvbikgew0KICAgICAgICAgICAgICAgICAgICB0bXBJbmRleCA9IGk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgIA0KICAgICAgICAgIC8vJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPSB0bXBJbmRleDsNCiAgICAgICAgICAvL2FsZXJ0KHRtcEluZGV4KQ0KCQkvL3NldFRpbWVvdXQoZnVuY3Rpb24oKXsNCgkJIA0KCQkNCgkJLy99LDIwMDApICANCgkJIA0KCQkgIA0KICAgICAgICAgICRzY29wZS5tYWtlQnV0dG9uTnVtYmVyQm9sZCh0bXBJbmRleCk7DQogICAgICAgICAgJHNjb3BlLmNoZWNrTmV4dEJhY2tTdGF0dXMoKTsNCiAgICAgICAgICB1cGRhdGVXaW5kb3dTaXplKCk7DQogICAgICAgICAgJHNjb3BlLmVuYWJsZU5leHRCYWNrU3RhdHVzKCk7DQogICAgIH0pOw0KDQogICAgIC8vLS0tLS0tIFRoaXMgZnVuY3Rpb24gY29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgR2xvYmFsIGNvbW1vbiB0ZXh0IGJ1dHRvbiAtLS0tLS0tLy8NCiAgICAgJHNjb3BlLnNob3dIaWRlVGV4dCA9IGZ1bmN0aW9uKF92YWwpDQogICAgIHsNCiAgICAgICAgICB2YXIgdW5pdFRpdGxlID0gJHNjb3BlLmdBY3Rpdml0eUluZm8udW5pdFRpdGxlOw0KICAgICAgICAgIHZhciBsZXNzb25UaXRsZSA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmxlc3NvblRpdGxlOw0KICAgICAgICAgIHZhciBsZXNzb25TdWJUaXRsZSA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmxlc3NvblN1YlRpdGxlOw0KICAgICAgICAgIHZhciBhY3Rpdml0eU51bWJlciA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmFjdGl2aXR5TnVtYmVyOw0KICAgICAgICAgIHZhciBhY3Rpdml0eVRpdGxlID0gJHNjb3BlLmdBY3Rpdml0eUluZm8uYWN0aXZpdHlUaXRsZTsNCiAgICAgICAgICB2YXIgYWN0aXZpdHlTdWJUaXRsZSA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmFjdGl2aXR5U3ViVGl0bGU7DQogICAgICAgICAgdmFyIGFjdGl2aXR5Rm9jdXMgPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby5hY3Rpdml0eUZvY3VzOw0KICAgICAgICAgIHZhciBoZWxwID0gJHNjb3BlLmdBY3Rpdml0eUluZm8uaGVscDsNCiAgICAgICAgICB2YXIgaGludCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmhpbnQ7DQogICAgICAgICAgdmFyIHJ1YnJpYyA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLnJ1YnJpYzsNCg0KICAgICAgICAgIHN3aXRjaCAoX3ZhbCkgew0KICAgICAgICAgICAgICAgY2FzZSAndW5pdFRpdGxlJzoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRzY29wZS5jaGVja0ZvcnVuZGVmaW5lZFR4dCh1bml0VGl0bGUpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ2xlc3NvblRpdGxlJzoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRzY29wZS5jaGVja0ZvcnVuZGVmaW5lZFR4dChsZXNzb25UaXRsZSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgY2FzZSAnbGVzc29uU3ViVGl0bGUnOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0KGxlc3NvblN1YlRpdGxlKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICBjYXNlICdhY3Rpdml0eU51bWJlcic6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkc2NvcGUuY2hlY2tGb3J1bmRlZmluZWRUeHQoYWN0aXZpdHlOdW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ2FjdGl2aXR5VGl0bGUnOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0KGFjdGl2aXR5VGl0bGUpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ2FjdGl2aXR5U3ViVGl0bGUnOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0KGFjdGl2aXR5U3ViVGl0bGUpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ2FjdGl2aXR5Rm9jdXMnOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0KGFjdGl2aXR5Rm9jdXMpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ2hlbHAnOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0KGhlbHApOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ2hpbnQnOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0KGhpbnQpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgIGNhc2UgJ3J1YnJpYyc6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAkc2NvcGUuY2hlY2tGb3J1bmRlZmluZWRUeHQocnVicmljKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgfQ0KICAgICB9Ow0KICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vDQogICAgIC8vLS0tLS0tLSBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBmb3IgdGV4dCBpcyB1bmRlZmluZWQgb3IgTm90ICAtLS0tLS0tLy8NCiAgICAgJHNjb3BlLmNoZWNrRm9ydW5kZWZpbmVkVHh0ID0gZnVuY3Rpb24oX3R4dCkNCiAgICAgew0KICAgICAgICAgIGlmIChfdHh0ICE9PSAidW5kZWZpbmVkIiAmJiBfdHh0ICE9PSB1bmRlZmluZWQgJiYgX3R4dCAhPT0gIiIpDQogICAgICAgICAgew0KICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICB9DQogICAgIH07DQogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8gICAgDQoNCiAgICAgLy9icm9hZGNhc3QgYW5kIHdhaXQgdGlsbCB3ZSBnZXQgdGhlIHRpdGxlICYgY29udGVudCBmb3IgcG9wdXAgZnJvbSBjaGlsZC4uLgkNCiAgICAgJHNjb3BlLmxhdW5jaFBvcHVwQm94ID0gZnVuY3Rpb24odGl0bGUpIHsNCiAgICAgICAgICANCiAgICAgICAgICB2YXIgY29udGVudCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmFjdGl2aXR5Rm9jdXM7DQogICAgICAgICAgdmFyIGZpbGVQYXRoID0nJzsNCiAgICAgICAgICAkc2NvcGUuaXNTaG93UG9wdXAgPSBmYWxzZTsNCiAgICAgICAgICANCiAgICAgICAgICBpZiAodGl0bGUudG9Mb3dlckNhc2UoKSA9PT0gImhpbnQiKSB7DQogICAgICAgICAgICAgICBjb250ZW50ID0gJHNjb3BlLmdBY3Rpdml0eUluZm8uaGludDsNCiAgICAgICAgICB9IGVsc2UgaWYgKHRpdGxlLnRvTG93ZXJDYXNlKCkgPT09ICJoZWxwIikgew0KICAgICAgICAgICAgICAgY29udGVudCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLmhlbHA7DQogICAgICAgICAgfQ0KICAgICAgICAgIHRlbXBfaWQgPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby50ZW1wbGF0ZUlEOw0KICAgICAgICAgIHZhciBteVBvcHVwID0gIiNwb3B1cEFjdGl2aXR5Rm9jdXMiOw0KICAgICAgICAgIC8vYWxlcnQodGVtcF9pZCk7DQogICAgICAgICAgDQogICAgICAgICAgaWYgKHRpdGxlLnRvTG93ZXJDYXNlKCkgPT09ICJoZWxwIikgew0KICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAkc2NvcGUucG9wdXBIZWxwQ29udGVudCA9IGNvbnRlbnQ7DQogICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIG15UG9wdXAgPSAiI3BvcHVwSGVscCI7DQogICAgICAgICAgICAgICB2YXIgaHRtbF9maWxlOw0KICAgICAgICAgICAgICAgaWYgKHRlbXBfaWQuc2VhcmNoKCJ0ZXh0X2VudHJ5IikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIwMV90ZXh0X2VudHJ5IjsNCiAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcF9pZC5zZWFyY2goImRyb3Bkb3duIikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIwMl9kcm9wZG93biI7DQogICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBfaWQuc2VhcmNoKCJkbmQiKSAhPSAtMSkNCiAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaHRtbF9maWxlID0gIjAzX2RyYWcmZHJvcCI7DQogICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBfaWQuc2VhcmNoKCJyZW9yZGVyIikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIwNF9yZW9yZGVyIjsNCiAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcF9pZC5zZWFyY2goImNob2ljZSIpICE9IC0xKQ0KICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBodG1sX2ZpbGUgPSAiMDVfbXVsdGktY2hvaWNlIjsNCiAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcF9pZC5zZWFyY2goImNoZWNrYm94IikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIwNl9jaGVja2JveCI7DQogICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBfaWQuc2VhcmNoKCJ0ZXh0X2VkaXRfY29ycmVjdGlvbl8xIikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIwN19URUNfMV9idXR0b24iOw0KICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wX2lkLnNlYXJjaCgidGV4dF9lZGl0X2NvcnJlY3Rpb25fMyIpICE9IC0xKQ0KICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBodG1sX2ZpbGUgPSAiMDhfVEVDXzNfYnV0dG9ucyI7DQogICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBfaWQuc2VhcmNoKCJ3b3Jkc2VhcmNoIikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIwOV93b3Jkc2VhcmNoIjsNCiAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcF9pZC5zZWFyY2goImNyb3Nzd29yZCIpICE9IC0xKQ0KICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBodG1sX2ZpbGUgPSAiMTBfY3Jvc3N3b3JkIjsNCiAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcF9pZC5zZWFyY2goImhpZ2hsaWdodGluZ19UZXh0IikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIxMV9oaWdobGlnaHQtdGV4dCI7DQogICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBfaWQuc2VhcmNoKCJoaWdobGlnaHRpbmdfTVJRIikgIT0gLTEpDQogICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGh0bWxfZmlsZSA9ICIxMl9oaWdobGlnaHQtc3lsbGFibGUiOw0KICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wX2lkLnNlYXJjaCgiY2F0ZWdvcnkiKSAhPSAtMSkNCiAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaHRtbF9maWxlID0gIjEzX2NhdGVnb3Jpc2luZyI7DQogICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBfaWQuc2VhcmNoKCJzZW1pX29wZW5fd3JpdGluZyIpICE9IC0xKQ0KICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBodG1sX2ZpbGUgPSAiMTRfc2VtaS1vcGVuLXdyaXRpbmciOw0KICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wX2lkLnNlYXJjaCgiaW50cm8iKSAhPSAtMSkNCiAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaHRtbF9maWxlID0gIjE1X2ZyZWUtd3JpdGluZyI7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAkKG15UG9wdXApLmNzcygicGFkZGluZy10b3AiLCAiMTBweCIpOw0KICAgICAgICAgICAgICAgZmlsZVBhdGggPSAiaGVscF9maWxlcy8iICsgaHRtbF9maWxlICsgIi5odG1sIjsNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgLy8kKG15UG9wdXApLmxvYWQoZmlsZVBhdGgpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBlbHNlIGlmICh0aXRsZS50b0xvd2VyQ2FzZSgpID09PSAiaGludCIpIHsNCiAgICAgICAgICAgICAgIC8vJHNjb3BlLnBvcHVwSGVscCA9IGNvbnRlbnQ7DQogICAgICAgICAgICAgICBteVBvcHVwID0gIiNwb3B1cEhpbnQiOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAvLyRzY29wZS5wb3B1cEFjdGl2aXR5Q29udGVudCA9IGNvbnRlbnQ7DQogICAgICAgICAgfQ0KICAgICAgICAgIC8vICQobXlQb3B1cCkuZGlhbG9nKCJkZXN0cm95Iik7DQogICAgICAgICAgLy9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICBzaG93UG9wdXBCb3gobXlQb3B1cCwgZmlsZVBhdGgsIHRpdGxlLCBjb250ZW50KTsNCiAgICAgICAgIC8vIH0sNTAwKTsNCiAgICAgfTsNCg0KICAgICAkc2NvcGUuJG9uKCdhbnN3ZXJWYWxpZGF0ZWQnLCBmdW5jdGlvbihlLCByZXN1bHQpIHsNCiAgICAgICAgICAkc2NvcGUuY2hlY2tBdWRpb0FmdGVyQ2hlY2soKTsNCiAgICAgICAgICANCiAgICAgICAgICByZXN1bHQuaXNBbGxDb3JyZWN0ID0gdHJ1ZTsNCiAgICAgICAgICByZXN1bHQuY29ycmVjdENvdW50ID0gcmVzdWx0LnRvdGFsQ291bnQ7DQogICAgICAgICAgJHNjb3BlLmdGZWVkYmFja1RleHQgPSAiWW91ciBzY29yZSBpcyAiICsgcmVzdWx0LmNvcnJlY3RDb3VudCArICIvIiArIHJlc3VsdC50b3RhbENvdW50ICsgIi4iOw0KICAgICAgICAgICRzY29wZS5nRmVlZGJhY2tUaXRsZSA9ICIiOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXIgPSB0cnVlOw0KICAgICAgICAgICRzY29wZS5nQ291cnNlQ29tcGxldGVkID0gdHJ1ZTsNCiAgICAgICAgICAkc2NvcGUucGFnZUNvbXBsZXRpb25BcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdID0gdHJ1ZTsNCiAgICAgICAgICAkc2NvcGUuZW5hYmxlTmV4dEJhY2tTdGF0dXMoKTsNCiAgICAgICAgICAkc2NvcGUuZW5hYmxlTmV4dHBhZ2VbJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXJdID0gdHJ1ZTsNCiAgICAgICAgICANCiAgICAgICAgICByZXN1bHQuYWN0aXZpdHlJbmRleCA9ICRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyOw0KDQogICAgICAgICAgU2NvcmVTZXJ2aWNlLmFkZEF0KHJlc3VsdCwgcmVzdWx0LmFjdGl2aXR5SW5kZXgpOw0KICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7DQoNCiAgICAgICAgICB2YXIgcGVyU2NvcmUgPSAxMDA7DQogICAgICAgICAgJHNjb3BlLiRicm9hZGNhc3QoJ3NlbmRTY29yZScsIHBlclNjb3JlKTsNCiAgICAgICAgICAkc2NvcGUuJGJyb2FkY2FzdCgnc2VuZENvdXJzZUNvbXBsZXRlZCcpOw0KDQogICAgICAgICAgDQogICAgICAgICAgdXBkYXRlV2luZG93U2l6ZSgpOw0KICAgICB9KTsNCg0KICAgICAkc2NvcGUuZmVlZGJhY2tPa0NsaWNrZWQgPSBmdW5jdGlvbigpIHsNCiAgICAgICAgICB2YXIgdG90YWxUZW1wbGF0ZUNvdW50ID0gJHNjb3BlLmFwcF9kYXRhLmFjdGl2aXRpdGVzLmxlbmd0aDsNCiAgICAgICAgICBpZiAocGFyZW50KSB7DQogICAgICAgICAgICAgICBpZiAocGFyZW50LkNVUFBsYXllcikgew0KICAgICAgICAgICAgICAgICAgICAvKiAgIENVUFBsYXllci5jaGtBY3Rpdml0eVN0YXR1cygpICovDQogICAgICAgICAgICAgICAgICAgIGlmICgkc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciA9PSB0b3RhbFRlbXBsYXRlQ291bnQpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuQ1VQUGxheWVyLmNoa0FjdGl2aXR5U3RhdHVzKDEpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgICRzY29wZS5nU2hvd0ZlZWRiYWNrQm94ID0gZmFsc2U7DQogICAgICAgICAgJHNjb3BlLmdGaW5pc2hDbGlja2VkID0gdHJ1ZTsNCiAgICAgICAgICAkc2NvcGUuZ0Rpc2FibGVTdGFydEFnYWluID0gZmFsc2U7DQogICAgICAgICAgJHNjb3BlLiRicm9hZGNhc3QoJ29uRmluaXNoQ2xpY2tlZCcpOw0KICAgICAgICAgIC8vLS0tLS0tLS0gT24gRmluaXNoIEJ0biBOZXh0IHF1ZXN0aW9uL3BhZ2Ugd2lsbCBnZXQgZW5hYmxlZCAtLS0tLS0tLS0tLy8NCiAgICAgICAgICAkc2NvcGUucGFnZUNvbXBsZXRpb25BcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdID0gdHJ1ZTsNCiAgICAgICAgICAkc2NvcGUuZW5hYmxlTmV4dEJhY2tTdGF0dXMoKTsNCiAgICAgICAgICAkc2NvcGUuZW5hYmxlTmV4dHBhZ2VbJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXJdID0gdHJ1ZTsNCiAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8NCiAgICAgfTsNCg0KICAgICAkc2NvcGUuZmVlZGJhY2tDb3JyZWN0QW5zQ2xpY2tlZCA9IGZ1bmN0aW9uKCkgew0KDQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlQ2hlY2sgPSBmYWxzZTsgICAgLy8tLSBBZGRlZCBvbiAyOC8wMy8yMDE0IHRvIGRpc2FibGUgY2hlY2sgYnV0dHRvbiBvbiBjbGljayAtLS8vDQogICAgICAgICAgJHNjb3BlLmdTaG93RmVlZGJhY2tCb3ggPSBmYWxzZTsNCiAgICAgICAgICAkc2NvcGUuJGJyb2FkY2FzdCgnb25Db3JyZWN0aW5nQW5zd2VycycpOw0KICAgICAgICAgICRzY29wZS4kYnJvYWRjYXN0KCdvbkhpZGVDb3JyZWN0QW5zd2VycycpOw0KICAgICAgICAgICRzY29wZS5nQ29ycmVjdEFuc3dlckRpc3BsYXllZCA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXIgPSB0cnVlOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVN0YXJ0QWdhaW4gPSBmYWxzZTsNCiAgICAgICAgICAkc2NvcGUuc2V0VGFiSW5kZXgoKTsNCiAgICAgfTsNCg0KICAgICAkc2NvcGUubGF1bmNoQ2hlY2tBbnN3ZXIgPSBmdW5jdGlvbihfZXZlbnQpIHsNCg0KICAgICAgICAgIHZhciBfdGFyZ2V0ID0gKF9ldmVudCkudGFyZ2V0Ow0KICAgICAgICAgICQoX3RhcmdldCkuYmx1cigpOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZUNoZWNrID0gdHJ1ZTsgICAgLy8tLSBBZGRlZCBvbiAyOC8wMy8yMDE0IHRvIGRpc2FibGUgY2hlY2sgYnV0dHRvbiBvbiBjbGljayAtLS8vDQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU3RhcnRBZ2FpbiA9IHRydWU7DQogICAgICAgICAgJHNjb3BlLmdTaG93RmVlZGJhY2tCb3ggPSB0cnVlOw0KICAgICAgICAgICQoJy5mZWVkYmFjay1ib3gnKS5hcHBlbmRUbygnLmZlZWRiYWNrLWJveC1jb250YWluZXInKTsNCiAgICAgICAgICAkKCcuZmVlZGJhY2stYm94JykuY3NzKCd6SW5kZXgnLCA5OTk5KTsNCiAgICAgICAgICAvLy8vY29uc29sZS5sb2coJCgnLmZlZWRiYWNrLWJveCcpKQ0KICAgICAgICAgIGlmICgkc2NvcGUuZ0NvcnJlY3RBbnN3ZXJEaXNwbGF5ZWQgPT09IHRydWUpDQogICAgICAgICAgew0KICAgICAgICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU2hvd0Fuc3dlciA9IHRydWU7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgIC8qICRzY29wZS5nTmV4dEJ0bkRpc2FibGVkID0gZmFsc2U7DQogICAgICAgICAgICAgICAgJCgnI25leHRCdG4nKS5hZGRDbGFzcygnbmV4dCcpLnJlbW92ZUNsYXNzKCduZXh0RGlzYWJsZWQnKSAqLw0KICAgICAgICAgICAgICAgJHNjb3BlLmNoZWNrTmV4dEJhY2tTdGF0dXMoKQ0KICAgICAgICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU2hvd0Fuc3dlciA9IGZhbHNlOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgICRzY29wZS4kYnJvYWRjYXN0KCdvbkNoZWNrQW5zd2VyJyk7DQogICAgICAgICAgJHNjb3BlLiRicm9hZGNhc3QoJ3Jlc2V0QWxsSXRlbUF1ZGlvJywgbnVsbCk7DQoNCiAgICAgICAgICAvLyRzY29wZS5hY3RpdmF0ZUF1ZGlvU2NyaXB0ID0gZmFsc2U7DQogICAgICAgICAgJHNjb3BlLiRicm9hZGNhc3QoJ3RvZ2dsZUF1ZGlvU2NyaXB0JywgZmFsc2UpOw0KDQogICAgICAgICAgJHNjb3BlLnJlbW92ZUFsbFRhYkluZGV4KCk7DQoNCiAgICAgICAgICAkKCIuaWNvRmVlZGJhY2tCdG4iKS5lYWNoKGZ1bmN0aW9uKGksIF9vYmopIHsNCiAgICAgICAgICAgICAgICQoX29iaikuYXR0cigidGFiaW5kZXgiLCAoNCArIGkpKTsNCiAgICAgICAgICB9KTsNCg0KICAgICAgICAgIHVwZGF0ZVdpbmRvd1NpemUoKTsNCg0KICAgICB9Ow0KDQogICAgICRzY29wZS5yZW1vdmVBbGxUYWJJbmRleCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICQoIi5pY28iKS5hdHRyKCJ0YWJpbmRleCIsIC0xKTsNCiAgICAgICAgICAkKCIuYm90dG9tTmF2RGl2IGJ1dHRvbiIpLmF0dHIoInRhYmluZGV4IiwgLTEpOw0KICAgICAgICAgICQoIi5pY29IZWxwIikuYXR0cigidGFiaW5kZXgiLCAtMSk7DQogICAgICAgICAgJCgiLmRlc2NyaXB0aW9uIikuYXR0cigidGFiaW5kZXgiLCAtMSk7DQogICAgICAgICAgJCgiLmhpbnQiKS5hdHRyKCJ0YWJpbmRleCIsIC0xKTsNCiAgICAgICAgICAkKCJzZWxlY3QiKS5hdHRyKCJ0YWJpbmRleCIsIC0xKTsNCiAgICAgICAgICAkKCJpbnB1dCIpLmF0dHIoInRhYmluZGV4IiwgLTEpOw0KICAgICAgICAgICQoImJ1dHRvbiIpLmF0dHIoInRhYmluZGV4IiwgLTEpOw0KICAgICB9Ow0KDQogICAgICRzY29wZS5zZXRUYWJJbmRleCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICQoIi5pY29IZWxwIikuYXR0cigidGFiaW5kZXgiLCAxKTsNCiAgICAgICAgICAkKCIuZGVzY3JpcHRpb24iKS5hdHRyKCJ0YWJpbmRleCIsIDEpOw0KICAgICAgICAgICQoIi5oaW50IikuYXR0cigidGFiaW5kZXgiLCAxKTsNCiAgICAgICAgICAkKCJzZWxlY3QiKS5hdHRyKCJ0YWJpbmRleCIsIDYpOw0KICAgICAgICAgICQoImlucHV0IikuYXR0cigidGFiaW5kZXgiLCA2KTsNCiAgICAgICAgICAkKCIuaWNvIikuYXR0cigidGFiaW5kZXgiLCA2KTsNCiAgICAgICAgICAkKCIuYm90dG9tTmF2RGl2IGJ1dHRvbiIpLmF0dHIoInRhYmluZGV4IiwgNik7DQogICAgIH07DQoNCiAgICAgJHNjb3BlLmxhdW5jaFNob3dBbnN3ZXIgPSBmdW5jdGlvbihfZXZlbnQpIHsNCiAgICAgICAgICB2YXIgX3RhcmdldCA9IChfZXZlbnQpLnRhcmdldDsNCiAgICAgICAgICAkKF90YXJnZXQpLmJsdXIoKTsNCiAgICAgICAgICBpZiAoISRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXIpIHsNCiAgICAgICAgICAgICAgIHZhciB0b3RhbFRlbXBsYXRlQ291bnQgPSAkc2NvcGUuYXBwX2RhdGEuYWN0aXZpdGl0ZXMubGVuZ3RoOw0KICAgICAgICAgICAgICAgaWYgKHBhcmVudCkgew0KICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LkNVUFBsYXllcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgQ1VQUGxheWVyLmNoa0FjdGl2aXR5U3RhdHVzKCkgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPT0gdG90YWxUZW1wbGF0ZUNvdW50KQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5DVVBQbGF5ZXIuY2hrQWN0aXZpdHlTdGF0dXMoMSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU2hvd0Fuc3dlciA9IHRydWU7DQogICAgICAgICAgICAgICAkc2NvcGUuZ1Nob3dGZWVkYmFja0JveCA9IGZhbHNlOw0KDQogICAgICAgICAgICAgICAvKiAkc2NvcGUuZ05leHRCdG5EaXNhYmxlZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICQoJyNuZXh0QnRuJykuYWRkQ2xhc3MoJ25leHQnKS5yZW1vdmVDbGFzcygnbmV4dERpc2FibGVkJykgICovDQogICAgICAgICAgICAgICAkc2NvcGUucGFnZUNvbXBsZXRpb25BcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICRzY29wZS5lbmFibGVOZXh0QmFja1N0YXR1cygpOw0KICAgICAgICAgICAgICAgJHNjb3BlLmVuYWJsZU5leHRwYWdlWyRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyXSA9IHRydWU7DQoNCiAgICAgICAgICAgICAgIC8vJHNjb3BlLmZlZWRiYWNrQ29ycmVjdEFuc0NsaWNrZWQoKTsgICAvLy0tIENvbW1lbnRlZCBvbiAwMy8wNC8yMDE0IC0tLy8NCiAgICAgICAgICAgICAgICRzY29wZS4kYnJvYWRjYXN0KCdvblNob3dDb3JyZWN0QW5zd2VycycpOw0KICAgICAgICAgICAgICAgJHNjb3BlLmdDb3JyZWN0QW5zd2VyRGlzcGxheWVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICRzY29wZS5nRGlzYWJsZUNoZWNrID0gdHJ1ZTsgICAgLy8tLSBBZGRlZCBvbiAyOC8wMy8yMDE0IHRvIGRpc2FibGUgY2hlY2sgYnV0dHRvbiBvbiBjbGljayAtLS8vDQogICAgICAgICAgICAgICAkc2NvcGUuZ0Rpc2FibGVTdGFydEFnYWluID0gZmFsc2U7ICAvLy0tIEFkZGVkIG9uIDAzLzA0LzIwMTQgdG8gRW5hYmxlIFN0YXJ0IEFnYWluIGJ1dHR0b24gb24gY2xpY2sgLS0vLw0KICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAgICAgY2hlY2tCb3VuZHJpZXMoJ0hlbHBfRGlhbG9nQm94Jyk7DQogICAgICAgICAgICAgICAgICAgIGNoZWNrQm91bmRyaWVzKCdIaW50X0RpYWxvZ0JveCcpOw0KICAgICAgICAgICAgICAgICAgICBjaGVja0JvdW5kcmllcygnQWN0aXZpdHlfRGlhbG9nQm94Jyk7DQogICAgICAgICAgICAgICAgICAgIGNoZWNrQm91bmRyaWVzU2NyaXB0UG9wdXAoKTsNCiAgICAgICAgICAgICAgIH0sIDE1MDApOw0KICAgICAgICAgIH0NCiAgICAgICAgICB1cGRhdGVXaW5kb3dTaXplKCk7DQoNCiAgICAgfTsNCg0KICAgICAkc2NvcGUubGF1bmNoU3RhcnRBZ2FpbiA9IGZ1bmN0aW9uKF9ldmVudCkgew0KICAgICAgICAgIHZhciBfdGFyZ2V0ID0gKF9ldmVudCkudGFyZ2V0Ow0KICAgICAgICAgICQoX3RhcmdldCkuYmx1cigpOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXJQcmV2ID0gJHNjb3BlLmdEaXNhYmxlU2hvd0Fuc3dlcjsNCiAgICAgICAgICAkc2NvcGUuZ0Rpc2FibGVDaGVja1ByZXYgPSAkc2NvcGUuZ0Rpc2FibGVDaGVjazsNCiAgICAgICAgICAkc2NvcGUuZ1Nob3dTdGFydEFnYWluQm94ID0gdHJ1ZTsNCiAgICAgICAgICAkc2NvcGUuZ0Rpc2FibGVTaG93QW5zd2VyID0gdHJ1ZTsNCiAgICAgICAgICAkc2NvcGUuZ0Rpc2FibGVDaGVjayA9IHRydWU7DQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU3RhcnRBZ2FpbiA9IHRydWU7DQogICAgICAgICAgLy8gJHNjb3BlLnZpZGVvTGVmdFBhdGggPSAnJzsNCiAgICAgICAgICAvLyAkc2NvcGUudmlkZW9SaWdodFBhdGggPSAnJzsNCiAgICAgICAgICAvLyAkc2NvcGUuYXVkaW9QYXRoID0gJyc7DQogICAgICAgICAgLy8kKCcudWktZGlhbG9nJykuZHJhZ2dhYmxlKCJvcHRpb24iLCAiZGlzYWJsZWQiLCB0cnVlKTsNCiAgICAgICAgICAvLyQoJy51aS1kaWFsb2cnKS5kaWFsb2coIm9wdGlvbiIsICJyZXNpemFibGUiLCBmYWxzZSk7DQogICAgICAgICAgJHNjb3BlLiRicm9hZGNhc3QoJ3Jlc2V0QWxsSXRlbUF1ZGlvJywgbnVsbCk7DQogICAgICAgICAgaWYgKCRzY29wZS5pdGVtQXVkaW8pIHsNCiAgICAgICAgICAgICAgICRzY29wZS5pdGVtQXVkaW8ualBsYXllcigic3RvcCIpOw0KICAgICAgICAgIH0NCiAgICAgICAgICAkc2NvcGUucmVtb3ZlQWxsVGFiSW5kZXgoKTsNCiAgICAgICAgICAkKCIuc3RhcnRBZ2Fpblllc05vIikuZWFjaChmdW5jdGlvbihpLCBfb2JqKSB7DQoNCiAgICAgICAgICAgICAgICQoX29iaikuZmluZCgiYnV0dG9uIikuYXR0cigidGFiaW5kZXgiLCAoNCArIGkpKTsNCiAgICAgICAgICB9KTsNCg0KICAgICAgICAgICRzY29wZS4kYnJvYWRjYXN0KCd0b2dnbGVBdWRpb1NjcmlwdCcsICRzY29wZS5hY3RpdmF0ZUF1ZGlvU2NyaXB0KTsNCg0KICAgICB9Ow0KICAgICAkc2NvcGUuJG9uKCdvbkl0ZW1BdWRpb1BsYXlTdGFydCcsIGZ1bmN0aW9uKGUsIG9iaikgew0KICAgICAgICAgICRzY29wZS5pdGVtQXVkaW8gPSBvYmo7DQogICAgIH0pOw0KDQoNCg0KICAgICAkc2NvcGUuc3RhcnRBZ2Fpbk9rQ2xpY2tlZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgIC8vVE9ETyBjbGVhbiB1cCBkYXRhIGFuZCByZWxvYWQgYWN0aXZpdHksIGZvciBub3cgbGV0J3MgcmVmcmVzaCB0aGUgd2luZG93DQogICAgICAgICAgLy93aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7DQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlQ2hlY2sgPSBmYWxzZTsgICAgLy8tLSBBZGRlZCBvbiAyOC8wMy8yMDE0IHRvIGRpc2FibGUgY2hlY2sgYnV0dHRvbiBvbiBjbGljayAtLS8vDQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU3RhcnRBZ2FpbiA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nU2hvd0ZlZWRiYWNrQm94ID0gZmFsc2U7DQogICAgICAgICAgJHNjb3BlLmdTaG93U3RhcnRBZ2FpbkJveCA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXIgPSB0cnVlOw0KICAgICAgICAgICRzY29wZS5nQ29ycmVjdEFuc3dlckRpc3BsYXllZCA9IGZhbHNlOw0KICAgICAgICAgICRzY29wZS5nQ291cnNlQ29tcGxldGVkID0gZmFsc2U7DQogICAgICAgICAgJCgnI3BvcHVwSGludCcpLmRpYWxvZygiY2xvc2UiKTsNCiAgICAgICAgICAkKCcjcG9wdXBIZWxwJykuZGlhbG9nKCJjbG9zZSIpOw0KICAgICAgICAgICQoJyNwb3B1cEFjdGl2aXR5Rm9jdXMnKS5kaWFsb2coImNsb3NlIik7DQogICAgICAgICAgJCgiLnVpLWRpYWxvZyIpLmRpYWxvZygnY2xvc2UnKTsNCiAgICAgICAgICAkKCIudlBhbiIpLmRpYWxvZygnY2xvc2UnKTsNCiAgICAgICAgICAkKCIuYVBhbiIpLmRpYWxvZygnY2xvc2UnKTsNCg0KICAgICAgICAgICRzY29wZS4kYnJvYWRjYXN0KCdtYWtlQXVkaW9Wb2x1bWVUb0RlZmF1bHQnKTsgIC8vLS0gQWRkZWQgb24gMDQvMDYvMjAxNCAtLSBUbyBTZXQgQXVkaW8gVm9sdW1lIHRvIDAuNjggb24gU3RhcnQgQWdhaW4gT2sgQ2xpY2tlZCAtLS8vDQoNCiAgICAgICAgICAkc2NvcGUuc2V0VGFiSW5kZXgoKTsNCiAgICAgICAgICB2YXIgX3VybCA9ICgkc2NvcGUuZ1RlbXBsYXRlVXJsQXJyYXlbJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgLSAxXSkuc3BsaXQoIiMiKS5qb2luKCIvIik7DQogICAgICAgICAgJGxvY2F0aW9uLnBhdGgoX3VybCk7DQogICAgICAgICAgJHJvdXRlLnJlbG9hZCgpOw0KDQogICAgIH07DQogICAgICRzY29wZS5zdGFydEFnYWluQ2FuY2VsQ2xpY2tlZCA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICRzY29wZS5nU2hvd1N0YXJ0QWdhaW5Cb3ggPSBmYWxzZTsgICAgICAgDQogICAgICAgICAgJHNjb3BlLmdEaXNhYmxlU2hvd0Fuc3dlciA9ICRzY29wZS5nRGlzYWJsZVNob3dBbnN3ZXJQcmV2Ow0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZUNoZWNrID0gJHNjb3BlLmdEaXNhYmxlQ2hlY2tQcmV2Ow0KICAgICAgICAgICRzY29wZS5nRGlzYWJsZVN0YXJ0QWdhaW4gPSBmYWxzZTsNCiAgICAgICAgICAkKCcudWktZGlhbG9nJykuZHJhZ2dhYmxlKCJvcHRpb24iLCAiZGlzYWJsZWQiLCBmYWxzZSk7DQogICAgICAgICAgJHNjb3BlLnNldFRhYkluZGV4KCk7DQogICAgIH07DQoNCiAgICAgZnVuY3Rpb24gc2hvd1BvcHVwQm94KG15UG9wdXAsIGZpbGVQYXRoLCB0aXRsZSwgY29udGVudCkgew0KICAgICAgICAgIA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICB2YXIgX215UG9wdXAgPSBteVBvcHVwOy8vIiNwb3B1cEFjdGl2aXR5Rm9jdXMiOyANCiAgICAgICAgICANCiAgICAgICAgICBpZighJHNjb3BlLmlzU2hvd1BvcHVwKXsNCiAgICAgICAgICAgICAgICQobXlQb3B1cCkuZGlhbG9nKCJkZXN0cm95Iik7DQogICAgICAgICAgfQ0KICAgICAgICAgDQogICAgICAgIC8vIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgIC8vICBteVBvcHVwID0gIiNwb3B1cEFjdGl2aXR5Rm9jdXMiOyANCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgJChteVBvcHVwKS5kcmFnZ2FibGUoJ2VuYWJsZScpOw0KICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICBpZiAodGl0bGUudG9Mb3dlckNhc2UoKSA9PT0gImhlbHAiKSB7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS5wb3B1cEhlbHBDb250ZW50ID0gY29udGVudDsNCiAgICAgICAgICAgICAgICAgICAgbXlQb3B1cCA9ICIjcG9wdXBIZWxwIjsNCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIGVsc2UgaWYgKHRpdGxlLnRvTG93ZXJDYXNlKCkgPT09ICJoaW50Iikgew0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUucG9wdXBIZWxwID0gY29udGVudDsNCiAgICAgICAgICAgICAgICAgICAgbXlQb3B1cCA9ICIjcG9wdXBIaW50IjsNCiAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS5wb3B1cEFjdGl2aXR5Q29udGVudCA9IGNvbnRlbnQ7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIC8vICQobXlQb3B1cCkuZGlhbG9nKCJkZXN0cm95Iik7DQogICAgICAgICAgICAgICAvLyAkKG15UG9wdXApLmRpYWxvZygnZGVzdHJveScpLnJlbW92ZSgpDQogICAgICAgICAgICAgICAvLyB2YXIgcG9zRGl2PSAkKCcubG9uZ0F1ZGlvJykuZmluZCgnI3RQb3B1cEhvbGRlcicpDQoNCiAgICAgICAgICAgICAgIHZhciBkaXMgPSAkKCcjYXVkaW9QbGF5ZXJEaXYnKS5jc3MoJ2Rpc3BsYXknKTsNCiAgICAgICAgICAgICAgIHZhciBwb3NEaXY7DQogICAgICAgICAgICAgICBpZiAoZGlzID09PSAnYmxvY2snKSB7DQogICAgICAgICAgICAgICAgICAgIHBvc0RpdiA9ICQoJy5ydWJyaWNfYXVkaW9Db250cm9sbGVyX3RhYmxlJykuZmluZCgnLnRQb3B1cEhvbGRlcicpOw0KICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcG9zRGl2ID0gIiNwb3BQb3NpdGlvbjEiOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgLy9hbGVydCgkKHBvc0RpdikucG9zaXRpb24oKS50b3ApDQogICAgICAgICAgICAgICAkc2NvcGUucG9wdXBDb250ZW50ID0gY29udGVudDsNCiAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSB0aXRsZSArICJfRGlhbG9nQm94IjsNCiAgICAgICAgICAgICAgIHZhciBkaWFsb2cgPSAkKCcuJyArIGNsYXNzTmFtZSk7DQoNCiAgICAgICAgICAgICAgICQobXlQb3B1cCkuZGlhbG9nKHsNCiAgICAgICAgICAgICAgICAgICAgekluZGV4OiAxLA0KICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsDQogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMzAwLA0KICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjb250ZW50LA0KICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6ICdhdXRvJywNCiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IDk0MSwNCiAgICAgICAgICAgICAgICAgICAgZGlhbG9nQ2xhc3M6IGNsYXNzTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kVG86ICIjcG9wUG9zaXRpb24xIiwNCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBteTogJ2xlZnQgdG9wJywNCiAgICAgICAgICAgICAgICAgICAgICAgICBhdDogJ2xlZnQgdG9wJywNCiAgICAgICAgICAgICAgICAgICAgICAgICBvZjogJChwb3NEaXYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbjogJ25vbmUnDQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIG9wZW46IGZ1bmN0aW9uKCkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5odG1sKGNvbnRlbnQpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICBpZighJHNjb3BlLmlzU2hvd1BvcHVwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZpbGVQYXRoIT0nJyl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobXlQb3B1cCkubG9hZChmaWxlUGF0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICQodGhpcykucGFyZW50KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY29wZS5pc1Nob3dQb3B1cCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dQb3B1cEJveChteVBvcHVwLCBmaWxlUGF0aCwgdGl0bGUsIGNvbnRlbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RpYWxvZy5kcmFnZ2FibGUoIm9wdGlvbiIsICJjb250YWlubWVudCIsICcjYm91bmRhcnknKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRHJhZ0V2ZW50T25Qb3B1cChteVBvcHVwLCBkaWFsb2csIGNsYXNzTmFtZSwgIm9wdGlvbiIsICJjb250YWlubWVudCIsICcjYm91bmRhcnknKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSw1MDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgc2hvdzogew0KICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdDogJ2ZhZGUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkOiAxMDANCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgaGlkZTogew0KICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdDogJ2ZhZGUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkOiAxMDANCiAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICAgICAgcmVzaXplOiBmdW5jdGlvbihldmVudCwgdWkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJXcmFwcGVyIEhlaWdodDogIiskKCcjd3JhcHBlcicpLmhlaWdodCgpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgIGFkZERyYWdFdmVudE9uUG9wdXAobXlQb3B1cCwgZGlhbG9nLCBjbGFzc05hbWUsICJvcHRpb24iLCAiY29udGFpbm1lbnQiLCAnI2JvdW5kYXJ5Jyk7DQogICAgICAgICAgICAgICANCiAgICAgICAgIC8vIH0sIDUwMCk7DQogICAgIH0NCg0KICAgICBmdW5jdGlvbiBhZGREcmFnRXZlbnRPblBvcHVwKG15UG9wdXAsIGRpYWxvZywgY2xhc3NOYW1lLCBvcHRpb24sIGNvbnRhaW5tZW50LCBib3VuZGFyeSkgew0KICAgICAgICAgIA0KICAgICAgICAgIHRyeXsNCiAgICAgICAgICAgICAgIHZhciBiID0gZ2V0RGlhbG9nQm91bmRhcnkoJChteVBvcHVwKS5wYXJlbnQoKSk7DQogICAgICAgICAgICAgICB2YXIgZGlhbG9nID0gJCgnLicgKyBjbGFzc05hbWUpOw0KICAgICAgICAgICAgICAgaWYgKGIuY3VycmVudEJvdHRvbVBvcyA+IGIubWF4Qm90dG9tTGltaXQpIHsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgZGlmID0gYi5jdXJyZW50Qm90dG9tUG9zIC0gYi5tYXhCb3R0b21MaW1pdDsNCiAgICAgICAgICAgICAgICAgICAgJChteVBvcHVwKS5wYXJlbnQoKS5jc3MoJ3RvcCcsICQobXlQb3B1cCkucGFyZW50KCkub2Zmc2V0KCkudG9wIC0gNSk7DQogICAgICAgICAgICAgICAgICAgIGIgPSBnZXREaWFsb2dCb3VuZGFyeSgkKG15UG9wdXApLnBhcmVudCgpKTsNCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgIGlmIChiLmN1cnJlbnRSaWdodFBvcyA+IGIubWF4UmlnaHRMaW1pdCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZGlmID0gYi5jdXJyZW50UmlnaHRQb3MgLSBiLm1heFJpZ2h0TGltaXQ7DQogICAgICAgICAgICAgICAgICAgICQobXlQb3B1cCkucGFyZW50KCkuY3NzKCdsZWZ0JywgJChteVBvcHVwKS5wYXJlbnQoKS5vZmZzZXQoKS5sZWZ0IC0gZGlmKTsNCiAgICAgICAgICAgICAgICAgICAgYiA9IGdldERpYWxvZ0JvdW5kYXJ5KCQobXlQb3B1cCkucGFyZW50KCkpOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgZGlhbG9nLmRyYWdnYWJsZShvcHRpb24sIGNvbnRhaW5tZW50LCBib3VuZGFyeSk7DQogICAgICAgICAgICAgICAkKGRpYWxvZykub24oImRyYWciLCBmdW5jdGlvbihldmVudCwgdWkpIHsNCiAgICAgICAgICAgICAgICAgICAgYiA9IGdldERpYWxvZ0JvdW5kYXJ5KCQobXlQb3B1cCkucGFyZW50KCkpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKGIuY3VycmVudEJvdHRvbVBvcyA8IGIubWF4Qm90dG9tTGltaXQpICYmIChiLmN1cnJlbnRSaWdodFBvcyA8IGIubWF4UmlnaHRMaW1pdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAkKG15UG9wdXApLmRpYWxvZyhvcHRpb24sICJyZXNpemFibGUiLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB2YXIgZVRvcCA9IHVpLm9mZnNldC50b3A7DQogICAgICAgICAgICAgICAgICAgIHZhciBjb250ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGZyYW1lV2luZG93ID0gZG9jdW1lbnQucGFyZW50V2luZG93IHx8IGRvY3VtZW50LmRlZmF1bHRWaWV3Ow0KICAgICAgICAgICAgICAgICAgICB2YXIgYWN1bUZyYW1lVG9wID0gMDsNCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZyYW1lV2luZG93LmxvY2F0aW9uLmhyZWYgIT0gdG9wLmxvY2F0aW9uLmhyZWYgJiYgY29udCA8IDUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250Kys7DQogICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZyYW1lRWwgPSAkKGZyYW1lV2luZG93LmZyYW1lRWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoZnJhbWVFbCkub2Zmc2V0KCkgIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZyYW1lVG9wID0gJChmcmFtZUVsKS5vZmZzZXQoKS50b3A7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3VtRnJhbWVUb3AgKz0gZnJhbWVUb3A7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lV2luZG93ID0gZnJhbWVXaW5kb3cucGFyZW50LmRvY3VtZW50LnBhcmVudFdpbmRvdyB8fCBmcmFtZVdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGVmYXVsdFZpZXc7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFyIHRvdGFsVG9wID0gYWN1bUZyYW1lVG9wICsgZVRvcCArIDcwOw0KDQogICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICQobXlQb3B1cCkuYmluZCgiZGlhbG9ncmVzaXplc3RvcCIsIGZ1bmN0aW9uKGV2ZW50LCB1aSkgew0KDQogICAgICAgICAgICAgICAgICAgIC8vJCgnI3dyYXBwZXInKS5jc3MoJ21pbi1oZWlnaHQnLDEyNDkpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGdldERpYWxvZ0JvdW5kYXJ5KCQobXlQb3B1cCkucGFyZW50KCkpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoYi5jdXJyZW50Qm90dG9tUG9zID4gYi5tYXhCb3R0b21MaW1pdCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaWYgPSBiLmN1cnJlbnRCb3R0b21Qb3MgLSBiLm1heEJvdHRvbUxpbWl0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgIC8vCSQobXlQb3B1cCkucGFyZW50KCkuY3NzKCd0b3AnLCAkKG15UG9wdXApLnBhcmVudCgpLm9mZnNldCgpLnRvcCArIGRpZik7DQogICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGdldERpYWxvZ0JvdW5kYXJ5KCQobXlQb3B1cCkucGFyZW50KCkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIoYi5jdXJyZW50UmlnaHRQb3MpID4gTnVtYmVyKGIubWF4UmlnaHRMaW1pdCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlmID0gYi5jdXJyZW50UmlnaHRQb3MgLSBiLm1heFJpZ2h0TGltaXQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgJChteVBvcHVwKS5wYXJlbnQoKS5jc3MoJ2xlZnQnLCAkKG15UG9wdXApLnBhcmVudCgpLm9mZnNldCgpLmxlZnQgLSBkaWYpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHZhciBkaWFsb2cgPSAkKCcuJyArIGNsYXNzTmFtZSk7DQogICAgICAgICAgICAgICAgICAgIGRpYWxvZy5kcmFnZ2FibGUob3B0aW9uLCBjb250YWlubWVudCwgYm91bmRhcnkpOw0KICAgICAgICAgICAgICAgICAgICAvL2RpYWxvZy5kcmFnZ2FibGUoIm9wdGlvbiIsICJjb250YWlubWVudCIsICcjYm91bmRhcnknKTsNCiAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAkKG15UG9wdXApLmJpbmQoImRpYWxvZ3Jlc2l6ZSIsIGZ1bmN0aW9uKGV2ZW50LCB1aSkgew0KICAgICAgICAgICAgICAgICAgICAvLyQoJyN3cmFwcGVyJykuY3NzKCdtYXgtaGVpZ2h0JywxMjQ5KTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBnZXREaWFsb2dCb3VuZGFyeSgkKG15UG9wdXApLnBhcmVudCgpKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGRpYWxvZyA9ICQoJy4nICsgY2xhc3NOYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmRyYWdnYWJsZShvcHRpb24sIGNvbnRhaW5tZW50LCBib3VuZGFyeSk7DQogICAgICAgICAgICAgICAgICAgIC8vZGlhbG9nLmRyYWdnYWJsZSgib3B0aW9uIiwgImNvbnRhaW5tZW50IiwgJyNib3VuZGFyeScpOw0KICAgICAgICAgICAgICAgICAgICAvL2NoYW5nZXMgaGVyZSBBTklMDQogICAgICAgICAgICAgICAgICAgIC8vJCgiLmR1bW15IikuaHRtbChiLmN1cnJlbnRCb3R0b21Qb3MgKyIgLS0gIisgYi5tYXhCb3R0b21MaW1pdCsiICAtLS0gZGlhbG9nLmhlaWdodCAiK051bWJlcihkaWFsb2cuaGVpZ2h0KCktODApKQ0KICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGRpYWxvZy5oZWlnaHQoKSAtIDgwKSA+IDgwMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNwb3B1cEhlbHAnKS5jc3MoJ2hlaWdodCcsICI4ODUiKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjcG9wdXBIZWxwJykuY3NzKCdoZWlnaHQnLCBOdW1iZXIoZGlhbG9nLmhlaWdodCgpIC0gODApKTsNCg0KICAgICAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgY3VyclRvcFBvczsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJIZWlnaHQ7DQogICAgICAgICAgICAgICAgICAgICQoIi5kdW1teSIpLmh0bWwoY3VyclRvcFBvcyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChiLmN1cnJlbnRCb3R0b21Qb3MgPj0gYi5tYXhCb3R0b21MaW1pdCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnRyaWdnZXIoJ21vdXNldXAnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNpemFibGUgPSAkKHRoaXMpLmRpYWxvZyhvcHRpb24sICJyZXNpemFibGUiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJUb3BQb3MgPSAkKG15UG9wdXApLm9mZnNldCgpLnRvcDsNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyclRvcFBvcyA8IDApIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY3NzKCd0b3AnLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kaWFsb2cob3B0aW9uLCAiaGVpZ2h0IiwgKChiLm1heEJvdHRvbUxpbWl0IC0gY3VyclRvcFBvcykpICsgMTYgKyAkKGJvdW5kYXJ5KS5vZmZzZXQoKS50b3ApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzaXphYmxlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJMZWZ0UG9zOw0KICAgICAgICAgICAgICAgICAgICB2YXIgY3VycldpZHRoOw0KDQogICAgICAgICAgICAgICAgICAgIGlmIChiLmN1cnJlbnRSaWdodFBvcyA+PSBiLm1heFJpZ2h0TGltaXQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyclRvcFBvcyA9ICQobXlQb3B1cCkub2Zmc2V0KCkudG9wOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJUb3BQb3MgPCAwKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmNzcygndG9wJywgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAkKHRoaXMpLnRyaWdnZXIoJ21vdXNldXAnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNpemFibGUgPSAkKHRoaXMpLmRpYWxvZyhvcHRpb24sICJyZXNpemFibGUiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJMZWZ0UG9zID0gJChteVBvcHVwKS5wYXJlbnQoKS5vZmZzZXQoKS5sZWZ0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kaWFsb2cob3B0aW9uLCAid2lkdGgiLCAoKDk2MCAtIGN1cnJMZWZ0UG9zKSAtIDE3ICsgJChib3VuZGFyeSkub2Zmc2V0KCkubGVmdCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2l6YWJsZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIC8vIGRpYWxvZy5kcmFnZ2FibGUoIm9wdGlvbiIsICJjb250YWlubWVudCIsICcjYm91bmRhcnknKTsNCiAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmRyYWdnYWJsZShvcHRpb24sIGNvbnRhaW5tZW50LCBib3VuZGFyeSk7DQogICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgIH1jYXRjaChlKXsNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgIH0NCiAgICAgfQ0KICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vICAgIA0KDQogICAgIC8vLS0gQWRkZWQgb24gMDQvMDQvMjAxNCBUaGlzIGZ1bmN0aW9uIHdpbGwgYXNzaWduIFF1ZXN0aW9uIGF1ZGlvcGF0aCB0byBBdWlvUGxheWVyIC0tLy8NCiAgICAgJHNjb3BlLmFzc2lnblF1ZXN0aW9uQXVkaW9Ub1BsYXllciA9IGZ1bmN0aW9uKCkgew0KDQogICAgICAgICAgaWYgKCRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoICE9PSB1bmRlZmluZWQgJiYgJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGggIT09ICJ1bmRlZmluZWQiICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoICE9PSAiIikgew0KDQogICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0uYXVkaW9QYXRoICE9PSB1bmRlZmluZWQgJiYgJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0uYXVkaW9QYXRoICE9PSAiIikgew0KDQogICAgICAgICAgICAgICAgICAgICRzY29wZS5hdWRpb1BhdGggPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aFswXS5hdWRpb1BhdGg7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS50cmFja1RleHQgPSAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aFswXS50cmFja1R4dDsNCg0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9IHRydWU7DQogICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9IGZhbHNlOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9IGZhbHNlOw0KICAgICAgICAgIH0NCiAgICAgfTsNCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLw0KDQogICAgIC8vLS0gQWRkZWQgb24gMTAvMDQvMjAxNCBUaGlzIGZ1bmN0aW9uIHdpbGwgYm9sZCB0aGUgQm90dG9tIFRlbXBsYXRlIE51bWJlciBCb2xkIG9uIGNsaWNrIC0tLy8NCiAgICAgJHNjb3BlLm9uQ2xpY2tPZkFuY2hvciA9IGZ1bmN0aW9uKF9pbmRleCkgew0KICAgICAgICAgIGlmICgkc2NvcGUuZW5hYmxlTmV4dHBhZ2VbX2luZGV4XSA9PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgIH0gZWxzZSBpZiAoJHNjb3BlLmVuYWJsZU5leHRwYWdlW19pbmRleF0gPT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgdmFyIF90YXJnZXQgPSAkKCIjYm90dG9tTmF2VWwiKS5maW5kKCdsaScpLmVxKF9pbmRleCkuZmluZCgnYnV0dG9uJyk7DQoNCiAgICAgICAgICAgICAgICRzY29wZS5mbmFtZSA9ICRzY29wZS5nVGVtcGxhdGVVcmxBcnJheVtfaW5kZXhdOw0KDQogICAgICAgICAgICAgICAkKF90YXJnZXQpLmJsdXIoKTsNCg0KICAgICAgICAgICAgICAgaWYgKCRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyID09PSBfaW5kZXggKyAxKSB7DQogICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoInNkc2FkcyIpDQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8vJHNjb3BlLmFjdGl2YXRlQXVkaW9QbGF5ZXI9ZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIC8vJHNjb3BlLmF1ZGlvUGF0aD0nJzsNCiAgICAgICAgICAgICAgICAgICAgLy8kc2NvcGUubWFrZUJ1dHRvbk51bWJlckJvbGQoX2luZGV4KTsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnZpZGVvUG9zaXRpb24gPSAiIjsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPSBfaW5kZXggKyAxOw0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuY2hlY2tOZXh0QmFja1N0YXR1cygpOw0KDQogICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgIHZhciBfdXJsID0gKCRzY29wZS5nVGVtcGxhdGVVcmxBcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdKS5zcGxpdCgiIyIpLmpvaW4oIi8iKTsNCiAgICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKF91cmwpOw0KICAgICAgICAgIH0NCg0KDQogICAgIH07DQogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8gICAgDQoNCiAgICAgLy8tLSBBZGRlZCBvbiAxMC8wNC8yMDE0IFRoaXMgZnVuY3Rpb24gd2lsbCBib2xkIHRoZSBCb3R0b20gVGVtcGxhdGUgTnVtYmVyIEJvbGQgb24gY2xpY2sgLS0vLw0KICAgICAkc2NvcGUubWFrZUJ1dHRvbk51bWJlckJvbGQgPSBmdW5jdGlvbihfaW5kZXgpIHsNCiAgICAgICAgICAkc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciA9IF9pbmRleCArIDE7DQogICAgICAgICAgLyogYWxlcnQoJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIpICovDQogICAgICAgICAgJCgiI2JvdHRvbU5hdlVsIikuZmluZCgnbGknKS5jc3MoJ2ZvbnQtd2VpZ2h0JywgJ25vcm1hbCcpOw0KICAgICAgICAgICQoImJ1dHRvbi5hY3RpdmUiKS5yZW1vdmVDbGFzcygiYWN0aXZlIik7DQogICAgICAgICAgdmFyIF90YXJnZXQgPSAkKCIjYm90dG9tTmF2VWwiKS5maW5kKCdsaScpLmVxKF9pbmRleCkuZmluZCgnYnV0dG9uJyk7DQogICAgICAgICAgJChfdGFyZ2V0KS5hZGRDbGFzcygiYWN0aXZlIik7DQogICAgIH07DQogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8gICANCg0KICAgICAvLy0tIEFkZGVkIG9uIDEwLzA0LzIwMTQgVGhpcyBmdW5jdGlvbiB3aWxsIGJvbGQgdGhlIEJvdHRvbSBUZW1wbGF0ZSBOdW1iZXIgQm9sZCBvbiBjbGljayAtLS8vDQogICAgICRzY29wZS5vbkNsaWNrT2ZOZXh0QmFjayA9IGZ1bmN0aW9uKCRldmVudCwgX3N0cikgew0KICAgICAgICAgIHZhciB0b3RhbFRlbXBsYXRlQ291bnQgPSAkc2NvcGUuYXBwX2RhdGEuYWN0aXZpdGl0ZXMubGVuZ3RoOw0KICAgICAgICAgIHZhciBhVGFnT2JqID0gJGV2ZW50LnRhcmdldDsNCiAgICAgICAgICAkKCIuYm90dG9tTmF2RGl2IC5uYXYtYnRuIikuYmx1cigpOw0KICAgICAgICAgIGlmIChfc3RyID09PSAnYmFjaycpIHsNCiAgICAgICAgICAgICAgICRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyLS07DQogICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPD0gMSkgew0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciA9IDE7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgfSBlbHNlIGlmIChfc3RyID09PSAnbmV4dCcpIHsNCiAgICAgICAgICAgICAgICRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyKys7DQogICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPj0gKHRvdGFsVGVtcGxhdGVDb3VudCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPSB0b3RhbFRlbXBsYXRlQ291bnQ7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgICRzY29wZS5jaGVja05leHRCYWNrU3RhdHVzKCk7DQogICAgICAgICAgJHNjb3BlLm1ha2VCdXR0b25OdW1iZXJCb2xkKCRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyIC0gMSk7DQogICAgICAgICAgJHNjb3BlLmZuYW1lID0gJHNjb3BlLmdUZW1wbGF0ZVVybEFycmF5WyRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyIC0gMV07DQogICAgICAgICAgLy8gJChhVGFnT2JqKS5wcm9wKCdocmVmJywgJHNjb3BlLmdUZW1wbGF0ZVVybEFycmF5WyRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyIC0gMV0pOw0KICAgICAgICAgIHZhciBfdXJsID0gKCRzY29wZS5nVGVtcGxhdGVVcmxBcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdKS5zcGxpdCgiIyIpLmpvaW4oIi8iKTsNCiAgICAgICAgICAkc2NvcGUudmlkZW9MZWZ0UGF0aCA9ICcnOw0KICAgICAgICAgICRzY29wZS52aWRlb1JpZ2h0UGF0aCA9ICcnOw0KICAgICAgICAgICRzY29wZS5hdWRpb1BhdGggPSAnJzsNCiAgICAgICAgICAkbG9jYXRpb24ucGF0aChfdXJsKTsNCiAgICAgfTsNCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLw0KDQogICAgIC8vLS0gQWRkZWQgb24gMTAvMDQvMjAxNCBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgc3RhdHVzIG9mIE5leHQgQmFjayBCdXR0b24gYmFzZWQgb24gZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtLS8vDQogICAgICRzY29wZS5jaGVja05leHRCYWNrU3RhdHVzID0gZnVuY3Rpb24oKSB7DQogICAgICAgICAgdmFyIHRvdGFsVGVtcGxhdGVDb3VudCA9ICRzY29wZS5hcHBfZGF0YS5hY3Rpdml0aXRlcy5sZW5ndGg7DQoNCiAgICAgICAgICBpZiAoJHNjb3BlLmdDdXJyZW50VGVtcGxhdGVOdW1iZXIgPiAxKSB7DQogICAgICAgICAgICAgICAkKCcjYmFja0J0bicpLnJlbW92ZUNsYXNzKCdiYWNrRGlzYWJsZWQnKTsNCiAgICAgICAgICAgICAgICQoJyNiYWNrQnRuJykuYWRkQ2xhc3MoJ2JhY2snKTsNCiAgICAgICAgICAgICAgICQoJyNuZXh0QnRuJykuYWRkQ2xhc3MoJ25leHREaXNhYmxlZCcpOw0KICAgICAgICAgICAgICAgJHNjb3BlLmdCYWNrQnRuRGlzYWJsZWQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICRzY29wZS5nTmV4dEJ0bkRpc2FibGVkID0gdHJ1ZTsNCiAgICAgICAgICB9IGVsc2UgaWYgKCRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyIDw9IDEpIHsNCiAgICAgICAgICAgICAgICQoJyNiYWNrQnRuJykucmVtb3ZlQ2xhc3MoJ2JhY2snKS5hZGRDbGFzcygnYmFja0Rpc2FibGVkJyk7DQogICAgICAgICAgICAgICAkKCcjbmV4dEJ0bicpLmFkZENsYXNzKCduZXh0RGlzYWJsZWQnKTsNCiAgICAgICAgICAgICAgICRzY29wZS5nQmFja0J0bkRpc2FibGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICRzY29wZS5nTmV4dEJ0bkRpc2FibGVkID0gdHJ1ZTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKCRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyID49ICh0b3RhbFRlbXBsYXRlQ291bnQpKSB7DQogICAgICAgICAgICAgICAkKCcjbmV4dEJ0bicpLnJlbW92ZUNsYXNzKCduZXh0JykuYWRkQ2xhc3MoJ25leHREaXNhYmxlZCcpOw0KICAgICAgICAgICAgICAgJHNjb3BlLmdCYWNrQnRuRGlzYWJsZWQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICRzY29wZS5nTmV4dEJ0bkRpc2FibGVkID0gZmFsc2U7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgIC8vICAkKCcjbmV4dEJ0bicpLnJlbW92ZUNsYXNzKCduZXh0RGlzYWJsZWQnKS5hZGRDbGFzcygnbmV4dCcpOw0KICAgICAgICAgIH0NCg0KLy8gICAgICAgICRzY29wZS5hdWRpb1BhdGggPSAiIjsNCi8vCSRzY29wZS50cmFja1RleHQgPSIiOw0KLy8JJHNjb3BlLmFjdGl2YXRlQXVkaW9QbGF5ZXIgPSBmYWxzZTsNCiAgICAgfTsNCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLyAgIA0KDQogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWRkZWQgb24gMjcvMDgvMjAxNCBUaGlzIGZ1bmN0aW9uIHdpbGwgZW5hYmxlIG9mIE5leHQgQmFjayBCdXR0b24gYmFzZWQgb24gc2hvd0Fuc3dlciAvLyAgIA0KICAgICAkc2NvcGUuZW5hYmxlTmV4dEJhY2tTdGF0dXMgPSBmdW5jdGlvbigpIHsNCg0KICAgICAgICAgIHZhciB0b3RhbFRlbXBsYXRlQ291bnQgPSAkc2NvcGUuYXBwX2RhdGEuYWN0aXZpdGl0ZXMubGVuZ3RoOw0KICAgICAgICAgIGlmICgkc2NvcGUucGFnZUNvbXBsZXRpb25BcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdID09IHRydWUpIHsNCiAgICAgICAgICAgICAgICRzY29wZS5nTmV4dEJ0bkRpc2FibGVkID0gZmFsc2U7DQogICAgICAgICAgICAgICAkKCcjbmV4dEJ0bicpLmFkZENsYXNzKCduZXh0JykucmVtb3ZlQ2xhc3MoJ25leHREaXNhYmxlZCcpDQogICAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUucGFnZUNvbXBsZXRpb25BcnJheVskc2NvcGUuZ0N1cnJlbnRUZW1wbGF0ZU51bWJlciAtIDFdID09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAkKCcjbmV4dEJ0bicpLnJlbW92ZUNsYXNzKCduZXh0JykuYWRkQ2xhc3MoJ25leHREaXNhYmxlZCcpOw0KICAgICAgICAgICAgICAgJHNjb3BlLmdOZXh0QnRuRGlzYWJsZWQgPSB0cnVlOw0KICAgICAgICAgIH0NCg0KDQogICAgICAgICAgaWYgKCRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyID49ICh0b3RhbFRlbXBsYXRlQ291bnQpKSB7DQogICAgICAgICAgICAgICAkKCcjbmV4dEJ0bicpLnJlbW92ZUNsYXNzKCduZXh0JykuYWRkQ2xhc3MoJ25leHREaXNhYmxlZCcpOw0KICAgICAgICAgICAgICAgJHNjb3BlLmdOZXh0QnRuRGlzYWJsZWQgPSB0cnVlOw0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8qIGlmKCRzY29wZS5nQ3VycmVudFRlbXBsYXRlTnVtYmVyPT0gdG90YWxUZW1wbGF0ZUNvdW50KQ0KICAgICAgICAgICB7DQogICAgICAgICAgIHBhcmVudC5DVVBQbGF5ZXIuY2hrQWN0aXZpdHlTdGF0dXMoMSk7DQogICAgICAgICAgIH0gKi8NCg0KICAgICB9DQoNCg0KICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vDQoNCiAgICAgJHNjb3BlLiRvbignb25QbGF5ZXJIZWlnaHRJbmNyZWFzZScsIGZ1bmN0aW9uKGUsIG9iaikgew0KICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAkKCIudWktZGlhbG9nLWNvbnRlbnQ6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBkaWFsb2cgPSAkKHRoaXMpLmRhdGEoImRpYWxvZyIpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wdGlvbnMuYXV0b1JlcG9zaXRpb24pIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgIC8vZGlhbG9nLm9wdGlvbigicG9zaXRpb24iLCBkaWFsb2cub3B0aW9ucy5wb3NpdGlvbik7DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAgIC8vIGNoZWNrQm91bmRyaWVzKCdIaW50X0RpYWxvZ0JveCcpOw0KICAgICAgICAgICAgICAgY2hlY2tCb3VuZHJpZXMoJ0hlbHBfRGlhbG9nQm94Jyk7DQogICAgICAgICAgICAgICAvLyBjaGVja0JvdW5kcmllc1NjcmlwdFBvcHVwKCk7DQogICAgICAgICAgfSwgMTAwKQ0KICAgICAgICAgIHVwZGF0ZVdpbmRvd1NpemUoKTsNCiAgICAgfSk7DQoNCiAgICAgLy8tLSBBZGRlZCBvbiAxOC8wOC8yMDE0IFRoaXMgZnVuY3Rpb24gd2lsbCBhc3NpZ24gUXVlc3Rpb24gYXVkaW9wYXRoIEF0ZXIgQ2hlY2sgQnV0dG9uIENsaWNrZWQgdG8gQXVpb1BsYXllciAtLS8vDQogICAgICRzY29wZS5jaGVja0F1ZGlvQWZ0ZXJDaGVjayA9IGZ1bmN0aW9uKCkgew0KDQoNCiAgICAgICAgICBpZiAoJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGggIT09IHVuZGVmaW5lZCAmJiAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aCAhPT0gInVuZGVmaW5lZCIgJiYgJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGggIT09ICIiICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoLmxlbmd0aCA9PT0gMikgew0KICAgICAgICAgICAgICAgaWYgKCRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzFdLmF1ZGlvUGF0aCAhPT0gdW5kZWZpbmVkICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzFdLmF1ZGlvUGF0aCAhPT0gIiIpIHsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmF1ZGlvUGF0aCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzFdLmF1ZGlvUGF0aDsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnRyYWNrVGV4dCA9ICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoWzFdLnRyYWNrVHh0Ow0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS5hY3RpdmF0ZUF1ZGlvU2NyaXB0ID0gZmFsc2U7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aCAhPT0gdW5kZWZpbmVkICYmICRzY29wZS5nQWN0aXZpdHlJbmZvLnF1ZXN0aW9uQXVkaW9QYXRoICE9PSAidW5kZWZpbmVkIiAmJiAkc2NvcGUuZ0FjdGl2aXR5SW5mby5xdWVzdGlvbkF1ZGlvUGF0aCAhPT0gIiIgJiYgJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGgubGVuZ3RoID09PSAxKSB7DQogICAgICAgICAgICAgICBpZiAoJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0uYXVkaW9QYXRoICE9PSB1bmRlZmluZWQgJiYgJHNjb3BlLmdBY3Rpdml0eUluZm8ucXVlc3Rpb25BdWRpb1BhdGhbMF0uYXVkaW9QYXRoICE9PSAiIikgew0KICAgICAgICAgICAgICAgICAgICAkc2NvcGUuYWN0aXZhdGVBdWRpb1BsYXllciA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS5hY3RpdmF0ZUF1ZGlvU2NyaXB0ID0gZmFsc2U7DQogICAgICAgICAgICAgICB9DQogICAgICAgICAgfQ0KDQoNCiAgICAgfTsNCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLw0KDQogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLw0KICAgICAkc2NvcGUuYXNzaWduUGFnZUNvbXBsZXRpb25BcnJheSA9IGZ1bmN0aW9uKF9sZW4pIHsNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9sZW47IGkrKykgew0KICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLnBhZ2VDb21wbGV0aW9uQXJyYXlbaV0gPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmVuYWJsZU5leHRwYWdlW2ldID0gdHJ1ZTsNCiAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS5wYWdlQ29tcGxldGlvbkFycmF5W2ldID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICRzY29wZS5lbmFibGVOZXh0cGFnZVtpXSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgfTsNCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLw0KDQogICAgIC8vLS0gRnVuY3Rpb24gd2lsbCBhcHBseSBIYW5kQ3Vyc29yIGJhc2VkIG9uIENvbXBsZXRpb24gb2YgUGFnZSAtLS8vDQogICAgICRzY29wZS5jaGVja0ZvckhhbmRDdXJzb3IgPSBmdW5jdGlvbihfaW5kZXgpIHsNCiAgICAgICAgICB2YXIgc3R5bGU7DQogICAgICAgICAgaWYgKCRzY29wZS5lbmFibGVOZXh0cGFnZVtfaW5kZXhdID09PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgc3R5bGUgPSB7J2N1cnNvcic6ICdkZWZhdWx0J307DQogICAgICAgICAgICAgICByZXR1cm4gc3R5bGU7DQogICAgICAgICAgfSBlbHNlIGlmICgkc2NvcGUuZW5hYmxlTmV4dHBhZ2VbX2luZGV4XSA9PT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgc3R5bGUgPSB7J2N1cnNvcic6ICdwb2ludGVyJ307DQogICAgICAgICAgICAgICByZXR1cm4gc3R5bGU7DQogICAgICAgICAgfQ0KICAgICB9Ow0KICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vDQoNCn0pOw0KDQokLnVpLmRpYWxvZy5wcm90b3R5cGUub3B0aW9ucy5hdXRvUmVwb3NpdGlvbiA9IHRydWU7DQokKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCkgew0KICAgICAkKCIudWktZGlhbG9nLWNvbnRlbnQ6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oKSB7DQogICAgICAgICAgdmFyIGRpYWxvZyA9ICQodGhpcykuZGF0YSgiZGlhbG9nIik7DQogICAgICAgICAgaWYgKGRpYWxvZy5vcHRpb25zLmF1dG9SZXBvc2l0aW9uKSB7DQogICAgICAgICAgICAgICBkaWFsb2cub3B0aW9uKCJwb3NpdGlvbiIsIGRpYWxvZy5vcHRpb25zLnBvc2l0aW9uKTsNCg0KICAgICAgICAgIH0NCiAgICAgfSk7DQogICAgIGNoZWNrQm91bmRyaWVzKCdIZWxwX0RpYWxvZ0JveCcpOw0KDQp9KTsNCnZhciB0aW1lcjsNCmNudCA9IDA7DQp2YXIgcHJldkhlaWdodCA9IDA7DQp2YXIgaW50ZXJ2YWxJZCA9IG51bGw7DQpmdW5jdGlvbiB1cGRhdGVXaW5kb3dTaXplKCkgew0KICAgICB2YXIgbWFwcGVkRnJhbWUgPSBudWxsOw0KICAgICBpZiAodG9wKSB7DQogICAgICAgICAgbWFwcGVkRnJhbWUgPSB0b3AuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRlbnQtaWZyYW1lJyk7DQogICAgIH0NCiAgICAgaWYgKGludGVydmFsSWQpIHsNCiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpDQogICAgIH0NCiAgICAgaWYgKG1hcHBlZEZyYW1lKSB7DQogICAgICAgICAgY250ID0gMDsNCiAgICAgICAgICAvLyQoJyNkZWJ1ZycpLmh0bWwobWFwcGVkRnJhbWUudG9TdHJpbmcoKSArIjxicj4iKQ0KICAgICAgICAgIGlmICh0aW1lcikgew0KICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsNCiAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgc2V0SWZyYW1lSGVpZ2h0KG1hcHBlZEZyYW1lKTsNCiAgICAgICAgICB9LCAxMDAwKQ0KICAgICB9DQp9DQoNCmZ1bmN0aW9uIGdldERvY0hlaWdodChkb2MpIHsNCn0NCg0KZnVuY3Rpb24gc2V0SWZyYW1lSGVpZ2h0KGlmcm0pIHsNCiAgICAgdmFyIHNlY2hlaWdodCA9ICQoJyNzZWMnKS5oZWlnaHQoKTsNCiAgICAgLy9jb25zb2xlLmxvZyhzZWNoZWlnaHQpDQogICAgIGludGVydmFsSWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsNCiAgICAgICAgICBpZiAocHJldkhlaWdodCAhPSBzZWNoZWlnaHQpDQogICAgICAgICAgew0KICAgICAgICAgICAgICAgY250ID0gMDsNCiAgICAgICAgICAgICAgIHZhciBvZmZzZXRGaXggPSA0MA0KICAgICAgICAgICAgICAgdmFyIG1pbklmcmFtZUhlaWdodCA9IDUxMDsgLy8gRGVmYXVsdCBoZWlnaHQgb2YgdGhlIGRvYyBvYmplY3QNCiAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBNYXRoLm1heChzZWNoZWlnaHQsIG1pbklmcmFtZUhlaWdodCkgKyBvZmZzZXRGaXg7DQogICAgICAgICAgICAgICB2YXIgZG9jID0gaWZybS5jb250ZW50RG9jdW1lbnQgPyBpZnJtLmNvbnRlbnREb2N1bWVudCA6IGlmcm0uY29udGVudFdpbmRvdy5kb2N1bWVudDsgLy9jb250ZW50RG9jdW1lbnQgcmV0dXJucyB0aGUgRG9jdW1lbnQgb2JqZWN0IGdlbmVyYXRlZCBieSBhIA0KICAgICAgICAgICAgICAgdmFyIHNjb3JtRnJhbWUgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoJ1Njb3JtQ29udGVudCcpOw0KDQogICAgICAgICAgICAgICBpZnJtLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICJweCI7DQogICAgICAgICAgICAgICBpZnJtLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsgLy8gc2V0IGRpc3BsYXkgcHJvcGVydHkNCiAgICAgICAgICAgICAgIGlmcm0uc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsgLy8gc2V0IHZpc2liaWxpdHkgIA0KICAgICAgICAgICAgICAgLy9pZnJtLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7DQogICAgICAgICAgICAgICAvLyBpZnJtLnN0eWxlLm92ZXJmbG93PSdoaWRkZW4nDQogICAgICAgICAgICAgICAvLyB2YXIgZmYgPSBkb2MuYm9keS5zY3JvbGxXaWR0aDsNCiAgICAgICAgICAgICAgIC8vaWZybS5zdHlsZS53aWR0aCA9IGZmKyJweCI7DQogICAgICAgICAgICAgICBpZiAoc2Nvcm1GcmFtZSkgew0KICAgICAgICAgICAgICAgICAgICBzY29ybUZyYW1lLnN0eWxlLmhlaWdodCA9ICcxMDAlJw0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgcHJldkhlaWdodCA9IHNlY2hlaWdodDsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgY250Kys7DQogICAgICAgICAgfQ0KICAgICAgICAgIC8vICQoJyNkZWJ1ZycpLmFwcGVuZCgiY29udGVudCBIZWlnaHQ6OiIgK3NlY2hlaWdodCArIiAgIHByZXYgaGVpZ2h0IitwcmV2SGVpZ2h0ICArICIgd2FpdCBjb3VudDo6IiArIGNudCAgKyI8YnI+Iik7DQogICAgICAgICAgaWYgKGNudCA9PSAzMCkgew0KICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKQ0KICAgICAgICAgIH0NCiAgICAgfSwgMTAwKQ0KfQ0KdmFyIGNoZWNrQm91bmRyaWVzID0gZnVuY3Rpb24oX25hbWUpIHsNCiAgICAgdmFyIGRpYWxvZ0NsYXNzID0gJy4nICsgX25hbWU7DQogICAgICQoIi51aS1kaWFsb2c6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsNCiAgICAgICAgICB2YXIgYiA9IGdldERpYWxvZ0JvdW5kYXJ5KCQodGhpcykpOw0KICAgICAgICAgIHZhciBwb3MgPSAkKHRoaXMpLmhlaWdodCgpICsgJCh0aGlzKS5wb3NpdGlvbigpLnRvcDsNCg0KICAgICAgICAgIGlmIChwb3MgPiBiLm1heEJvdHRvbUxpbWl0KSB7DQogICAgICAgICAgICAgICB2YXIgZGlmID0gYi5jdXJyZW50Qm90dG9tUG9zIC0gYi5tYXhCb3R0b21MaW1pdDsNCiAgICAgICAgICAgICAgICQoIi5kdW1teSIpLmh0bWwocG9zICsgIiAtLSAiICsgYi5tYXhCb3R0b21MaW1pdCArICIgLS0+ICAiICsgZGlmICsgIiArKysrICAiICsgJCh0aGlzKS5wb3NpdGlvbigpLnRvcCkNCiAgICAgICAgICAgICAgIHZhciB0ZW1wID0gJCh0aGlzKS5wb3NpdGlvbigpLnRvcCAtIGRpZjsNCiAgICAgICAgICAgICAgIGlmICh0ZW1wIDw9IDApIHsNCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoJ3RvcCcsIDApOw0KICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoJ3RvcCcsIHRlbXApOw0KICAgICAgICAgICAgICAgfQ0KDQoNCg0KICAgICAgICAgIH0NCg0KICAgICB9KTsNCiAgICAgLy92YXIgZGlhbG9nID0gJChkaWFsb2dDbGFzcyk7DQogICAgICQoIi51aS1kaWFsb2c6dmlzaWJsZSIpLmRyYWdnYWJsZSgib3B0aW9uIiwgImNvbnRhaW5tZW50IiwgJyNib3VuZGFyeScpOw0KfQ=="};
10 | }
11 | };
12 | //Запустить перехват
13 | function on() {
14 | chrome.webRequest.onBeforeRequest.addListener(
15 | f,
16 | { urls: ["*://www.cambridgelms.org/*"] },
17 | ["blocking"]
18 | );
19 | }
20 | //Завершить перехват
21 | function off() {
22 | if( chrome.webRequest.onBeforeRequest.hasListeners() ){
23 | chrome.webRequest.onBeforeRequest.removeListener(f);
24 | }
25 | }
26 | //Ожидание команд
27 | chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
28 | if(request.msg==="auto_on") {
29 | on();
30 | }
31 | if(request.msg==="auto_off") {
32 | off();
33 | }
34 | });
--------------------------------------------------------------------------------
/js/jquery.js:
--------------------------------------------------------------------------------
1 | /*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */
2 | !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/