Total Complexity | 50 |
Complexity/F | 1.52 |
Lines of Code | 243 |
Function Count | 33 |
Duplicated Lines | 243 |
Ratio | 100 % |
Changes | 3 | ||
Bugs | 0 | Features | 0 |
Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
Complex classes like assets/js/object-sync-for-salesforce-admin.js often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
1 | View Code Duplication | 'use strict'; |
|
|
|||
2 | |||
3 | (function ($) { |
||
4 | |||
5 | function salesforceObjectFields() { |
||
6 | |||
7 | var delay = function () { |
||
8 | var timer = 0; |
||
9 | return function (callback, ms) { |
||
10 | clearTimeout(timer); |
||
11 | timer = setTimeout(callback, ms); |
||
12 | }; |
||
13 | }(); |
||
14 | |||
15 | if (0 === $('.salesforce_record_types_allowed > *').length) { |
||
16 | $('.salesforce_record_types_allowed').hide(); |
||
17 | } |
||
18 | if (0 === $('.salesforce_record_type_default > *').length) { |
||
19 | $('.salesforce_record_type_default').hide(); |
||
20 | } |
||
21 | if (0 === $('.pull_trigger_field > *').length) { |
||
22 | $('.pull_trigger_field').hide(); |
||
23 | } |
||
24 | |||
25 | $('#salesforce_object').on('change', function (el) { |
||
26 | var that = this; |
||
27 | var delayTime = 1000; |
||
28 | delay(function () { |
||
29 | var data = { |
||
30 | 'action': 'get_salesforce_object_description', |
||
31 | 'include': ['fields', 'recordTypeInfos'], |
||
32 | 'field_type': 'datetime', |
||
33 | 'salesforce_object': that.value |
||
34 | }; |
||
35 | $.post(ajaxurl, data, function (response) { |
||
36 | |||
37 | var recordTypesAllowedMarkup = '', |
||
38 | recordTypeDefaultMarkup = '', |
||
39 | dateMarkup = ''; |
||
40 | |||
41 | if (0 < $(response.data.recordTypeInfos).length) { |
||
42 | recordTypesAllowedMarkup += '<label for="salesforce_record_types_allowed">Allowed Record Types:</label><div class="checkboxes">'; |
||
43 | $.each(response.data.recordTypeInfos, function (index, value) { |
||
44 | recordTypesAllowedMarkup += '<label><input type="checkbox" class="form-checkbox" value="' + index + '" name="salesforce_record_types_allowed[' + index + ']" id="salesforce_record_types_allowed-' + index + '"> ' + value + '</label>'; |
||
45 | }); |
||
46 | recordTypesAllowedMarkup += '</div>'; |
||
47 | |||
48 | recordTypeDefaultMarkup += '<label for="salesforce_record_type_default">Default Record Type:</label>'; |
||
49 | recordTypeDefaultMarkup += '<select name="salesforce_record_type_default" id="salesforce_record_type_default"><option value="">- Select record type -</option>'; |
||
50 | $.each(response.data.recordTypeInfos, function (index, value) { |
||
51 | recordTypeDefaultMarkup += '<option value="' + index + '">' + value + '</option>'; |
||
52 | }); |
||
53 | } |
||
54 | |||
55 | $('.salesforce_record_types_allowed').html(recordTypesAllowedMarkup); |
||
56 | $('.salesforce_record_type_default').html(recordTypeDefaultMarkup); |
||
57 | |||
58 | if (0 < $(response.data.fields).length) { |
||
59 | dateMarkup += '<label for="pull_trigger_field">Date field to trigger pull:</label>'; |
||
60 | dateMarkup += '<select name="pull_trigger_field" id="pull_trigger_field"><option value="">- Select date field -</option>'; |
||
61 | $.each(response.data.fields, function (index, value) { |
||
62 | dateMarkup += '<option value="' + value.name + '">' + value.label + '</option>'; |
||
63 | }); |
||
64 | dateMarkup += '</select>'; |
||
65 | dateMarkup += '<p class="description">These are date fields that can cause WordPress to pull an update from Salesforce, according to the <code>salesforce_pull</code> class.</p>'; |
||
66 | } |
||
67 | |||
68 | $('.pull_trigger_field').html(dateMarkup); |
||
69 | |||
70 | if ('' !== recordTypesAllowedMarkup) { |
||
71 | $('.salesforce_record_types_allowed').show(); |
||
72 | } else { |
||
73 | $('.salesforce_record_types_allowed').hide(); |
||
74 | } |
||
75 | if ('' !== recordTypeDefaultMarkup) { |
||
76 | $('.salesforce_record_type_default').show(); |
||
77 | } else { |
||
78 | $('.salesforce_record_type_default').hide(); |
||
79 | } |
||
80 | |||
81 | if ('' !== dateMarkup) { |
||
82 | $('.pull_trigger_field').show(); |
||
83 | } else { |
||
84 | $('.pull_trigger_field').hide(); |
||
85 | } |
||
86 | }); |
||
87 | }, delayTime); |
||
88 | }); |
||
89 | } |
||
90 | |||
91 | function addFieldMappingRow() { |
||
92 | $('#add-field-mapping').click(function () { |
||
93 | var salesforceObject = $('#salesforce_object').val(); |
||
94 | var wordpressObject = $('#wordpress_object').val(); |
||
95 | var rowKey = Math.floor(Date.now() / 1000); |
||
96 | $(this).text('Add another field mapping'); |
||
97 | if ('' !== wordpressObject && '' !== salesforceObject) { |
||
98 | fieldmapFields(wordpressObject, salesforceObject, rowKey); |
||
99 | $(this).parent().find('.missing-object').remove(); |
||
100 | } else { |
||
101 | $(this).parent().prepend('<div class="error missing-object"><span>You have to pick a WordPress object and a Salesforce object to add field mapping.</span></div>'); |
||
102 | } |
||
103 | return false; |
||
104 | }); |
||
105 | } |
||
106 | |||
107 | function fieldmapFields(wordpressObject, salesforceObject, rowKey) { |
||
108 | var data = { |
||
109 | 'action': 'get_wp_sf_object_fields', |
||
110 | 'wordpress_object': wordpressObject, |
||
111 | 'salesforce_object': salesforceObject |
||
112 | }; |
||
113 | $.post(ajaxurl, data, function (response) { |
||
114 | |||
115 | var wordpress = ''; |
||
116 | var salesforce = ''; |
||
117 | var markup = ''; |
||
118 | |||
119 | wordpress += '<select name="wordpress_field[' + rowKey + ']" id="wordpress_field-' + rowKey + '">'; |
||
120 | wordpress += '<option value="">- Select WordPress field -</option>'; |
||
121 | $.each(response.data.wordpress, function (index, value) { |
||
122 | wordpress += '<option value="' + value.key + '">' + value.key + '</option>'; |
||
123 | }); |
||
124 | wordpress += '</select>'; |
||
125 | |||
126 | salesforce += '<select name="salesforce_field[' + rowKey + ']" id="salesforce_field-' + rowKey + '">'; |
||
127 | salesforce += '<option value="">- Select Salesforce field -</option>'; |
||
128 | $.each(response.data.salesforce, function (index, value) { |
||
129 | salesforce += '<option value="' + value.name + '">' + value.label + '</option>'; |
||
130 | }); |
||
131 | salesforce += '</select>'; |
||
132 | |||
133 | markup = '<tr><td class="column-wordpress_field">' + wordpress + '</td><td class="column-salesforce_field">' + salesforce + '</td><td class="column-is_prematch"><input type="checkbox" name="is_prematch[' + rowKey + ']" id="is_prematch-' + rowKey + '" value="1" /><td class="column-is_key"><input type="checkbox" name="is_key[' + rowKey + ']" id="is_key-' + rowKey + '" value="1" /></td><td class="column-direction"><div class="radios"><label><input type="radio" value="sf_wp" name="direction[' + rowKey + ']" id="direction-' + rowKey + '-sf-wp"> Salesforce to WordPress</label><label><input type="radio" value="wp_sf" name="direction[' + rowKey + ']" id="direction-' + rowKey + '-wp-sf"> WordPress to Salesforce</label><label><input type="radio" value="sync" name="direction[' + rowKey + ']" id="direction-' + rowKey + '-sync" checked> Sync</label></div></td><td class="column-is_delete"><input type="checkbox" name="is_delete[' + rowKey + ']" id="is_delete-' + rowKey + '" value="1" /></td></tr>'; |
||
134 | $('table.fields tbody').append(markup); |
||
135 | }); |
||
136 | } |
||
137 | |||
138 | function pushAndPullObjects() { |
||
139 | $('.salesforce_user_ajax_message').hide(); |
||
140 | if (0 < $('#wordpress_object_ajax').length) { |
||
141 | $('.push_to_salesforce_button').on('click', function () { |
||
142 | var wordpressObject = $('#wordpress_object_ajax').val(); |
||
143 | var wordpressId = $('#wordpress_id_ajax').val(); |
||
144 | var data = { |
||
145 | 'action': 'push_to_salesforce', |
||
146 | 'wordpress_object': wordpressObject, |
||
147 | 'wordpress_id': wordpressId |
||
148 | }; |
||
149 | $.post(ajaxurl, data, function (response) { |
||
150 | if (true === response.success) { |
||
151 | updateSalesforceUserSummary(); |
||
152 | $('.salesforce_user_ajax_message').width($('.mapped-salesforce-user').width() - 27); |
||
153 | $('.salesforce_user_ajax_message').html('<p>This object has been pushed to Salesforce.</p>').fadeIn().delay(4000).fadeOut(); |
||
154 | } |
||
155 | }); |
||
156 | return false; |
||
157 | }); |
||
158 | } |
||
159 | $('.pull_from_salesforce_button').on('click', function () { |
||
160 | var salesforceId = $('#salesforce_id_ajax').val(); |
||
161 | var wordpressObject = $('#wordpress_object_ajax').val(); |
||
162 | var data = { |
||
163 | 'action': 'pull_from_salesforce', |
||
164 | 'salesforce_id': salesforceId, |
||
165 | 'wordpress_object': wordpressObject |
||
166 | }; |
||
167 | $.post(ajaxurl, data, function (response) { |
||
168 | if (true === response.success) { |
||
169 | updateSalesforceUserSummary(); |
||
170 | $('.salesforce_user_ajax_message').width($('.mapped-salesforce-user').width() - 27); |
||
171 | $('.salesforce_user_ajax_message').html('<p>This object has been pulled from Salesforce.</p>').fadeIn().delay(4000).fadeOut(); |
||
172 | } |
||
173 | }); |
||
174 | return false; |
||
175 | }); |
||
176 | } |
||
177 | |||
178 | function updateSalesforceUserSummary() { |
||
179 | var mappingId = $('#mapping_id_ajax').val(); |
||
180 | var data = { |
||
181 | 'action': 'refresh_mapped_data', |
||
182 | 'mapping_id': mappingId |
||
183 | }; |
||
184 | $.post(ajaxurl, data, function (response) { |
||
185 | if (true === response.success) { |
||
186 | $('td.last_sync_message').text(response.data.last_sync_message); |
||
187 | $('td.last_sync_action').text(response.data.last_sync_action); |
||
188 | $('td.last_sync_status').text(response.data.last_sync_status); |
||
189 | $('td.last_sync').text(response.data.last_sync); |
||
190 | if ('1' === response.data.last_sync_status) { |
||
191 | $('td.last_sync_status').text('success'); |
||
192 | } |
||
193 | } |
||
194 | }); |
||
195 | } |
||
196 | |||
197 | function clearSfwpCacheLink() { |
||
198 | $('#clear-sfwp-cache').click(function () { |
||
199 | var data = { |
||
200 | 'action': 'clear_sfwp_cache' |
||
201 | }; |
||
202 | var that = $(this); |
||
203 | $.post(ajaxurl, data, function (response) { |
||
204 | if (true === response.success && true === response.data.success) { |
||
205 | that.parent().html(response.data.message).fadeIn(); |
||
206 | } |
||
207 | }); |
||
208 | return false; |
||
209 | }); |
||
210 | } |
||
211 | |||
212 | // as the drupal plugin does, we only allow one field to be a prematch or key |
||
213 | $(document).on('click', '.column-is_prematch input', function () { |
||
214 | $('.column-is_prematch input').not(this).prop('checked', false); |
||
215 | }); |
||
216 | |||
217 | $(document).on('click', '.column-is_key input', function () { |
||
218 | $('.column-is_key input').not(this).prop('checked', false); |
||
219 | }); |
||
220 | |||
221 | $(document).ready(function () { |
||
222 | |||
223 | var timeout; |
||
224 | $('#wordpress_object, #salesforce_object').on('change', function () { |
||
225 | clearTimeout(timeout); |
||
226 | timeout = setTimeout(function () { |
||
227 | $('table.fields tbody tr').fadeOut(); |
||
228 | $('table.fields tbody tr').remove(); |
||
229 | }, 1000); |
||
230 | }); |
||
231 | |||
232 | // todo: need to fix this so it doesn't run all the spinners at the same time when there are multiples on the same page |
||
233 | $(document).ajaxStart(function () { |
||
234 | $('.spinner').addClass('is-active'); |
||
235 | }).ajaxStop(function () { |
||
236 | $('.spinner').removeClass('is-active'); |
||
237 | }); |
||
238 | salesforceObjectFields(); |
||
239 | addFieldMappingRow(); |
||
240 | pushAndPullObjects(); |
||
241 | clearSfwpCacheLink(); |
||
242 | }); |
||
243 | })(jQuery); |
||
244 | //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFkbWluLmpzIl0sIm5hbWVzIjpbIiQiLCJzYWxlc2ZvcmNlT2JqZWN0RmllbGRzIiwiZGVsYXkiLCJ0aW1lciIsImNhbGxiYWNrIiwibXMiLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0IiwibGVuZ3RoIiwiaGlkZSIsIm9uIiwiZWwiLCJ0aGF0IiwiZGVsYXlUaW1lIiwiZGF0YSIsInZhbHVlIiwicG9zdCIsImFqYXh1cmwiLCJyZXNwb25zZSIsInJlY29yZFR5cGVzQWxsb3dlZE1hcmt1cCIsInJlY29yZFR5cGVEZWZhdWx0TWFya3VwIiwiZGF0ZU1hcmt1cCIsInJlY29yZFR5cGVJbmZvcyIsImVhY2giLCJpbmRleCIsImh0bWwiLCJmaWVsZHMiLCJuYW1lIiwibGFiZWwiLCJzaG93IiwiYWRkRmllbGRNYXBwaW5nUm93IiwiY2xpY2siLCJzYWxlc2ZvcmNlT2JqZWN0IiwidmFsIiwid29yZHByZXNzT2JqZWN0Iiwicm93S2V5IiwiTWF0aCIsImZsb29yIiwiRGF0ZSIsIm5vdyIsInRleHQiLCJmaWVsZG1hcEZpZWxkcyIsInBhcmVudCIsImZpbmQiLCJyZW1vdmUiLCJwcmVwZW5kIiwid29yZHByZXNzIiwic2FsZXNmb3JjZSIsIm1hcmt1cCIsImtleSIsImFwcGVuZCIsInB1c2hBbmRQdWxsT2JqZWN0cyIsIndvcmRwcmVzc0lkIiwic3VjY2VzcyIsInVwZGF0ZVNhbGVzZm9yY2VVc2VyU3VtbWFyeSIsIndpZHRoIiwiZmFkZUluIiwiZmFkZU91dCIsInNhbGVzZm9yY2VJZCIsIm1hcHBpbmdJZCIsImxhc3Rfc3luY19tZXNzYWdlIiwibGFzdF9zeW5jX2FjdGlvbiIsImxhc3Rfc3luY19zdGF0dXMiLCJsYXN0X3N5bmMiLCJjbGVhclNmd3BDYWNoZUxpbmsiLCJtZXNzYWdlIiwiZG9jdW1lbnQiLCJub3QiLCJwcm9wIiwicmVhZHkiLCJ0aW1lb3V0IiwiYWpheFN0YXJ0IiwiYWRkQ2xhc3MiLCJhamF4U3RvcCIsInJlbW92ZUNsYXNzIiwialF1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QUVEO0FBQ0F4RCxHQUFHa0UsUUFBSCxFQUFjeEQsRUFBZCxDQUFrQixPQUFsQixFQUEyQiwyQkFBM0IsRUFBd0QsWUFBVztBQUNsRVYsSUFBRywyQkFBSCxFQUFpQ21FLEdBQWpDLENBQXNDLElBQXRDLEVBQTZDQyxJQUE3QyxDQUFtRCxTQUFuRCxFQUE4RCxLQUE5RDtBQUNBLEVBRkQ7O0FBSUFwRSxHQUFHa0UsUUFBSCxFQUFjeEQsRUFBZCxDQUFrQixPQUFsQixFQUEyQixzQkFBM0IsRUFBbUQsWUFBVztBQUM3RFYsSUFBRyxzQkFBSCxFQUE0Qm1FLEdBQTVCLENBQWlDLElBQWpDLEVBQXdDQyxJQUF4QyxDQUE4QyxTQUE5QyxFQUF5RCxLQUF6RDtBQUNBLEVBRkQ7O0FBSUFwRSxHQUFHa0UsUUFBSCxFQUFjRyxLQUFkLENBQXFCLFlBQVc7O0FBRS9CLE1BQUlDLE9BQUo7QUFDQXRFLElBQUcsdUNBQUgsRUFBNkNVLEVBQTdDLENBQWlELFFBQWpELEVBQTJELFlBQVc7QUFDckVKLGdCQUFjZ0UsT0FBZDtBQUNBQSxhQUFVL0QsV0FBWSxZQUFXO0FBQ2hDUCxNQUFHLHVCQUFILEVBQTZCeUQsT0FBN0I7QUFDQXpELE1BQUcsdUJBQUgsRUFBNkI0QyxNQUE3QjtBQUNBLElBSFMsRUFHUCxJQUhPLENBQVY7QUFJQSxHQU5EOztBQVFBO0FBQ0E1QyxJQUFHa0UsUUFBSCxFQUFjSyxTQUFkLENBQXlCLFlBQVc7QUFDbkN2RSxLQUFHLFVBQUgsRUFBZ0J3RSxRQUFoQixDQUEwQixXQUExQjtBQUNBLEdBRkQsRUFFR0MsUUFGSCxDQUVhLFlBQVc7QUFDdkJ6RSxLQUFHLFVBQUgsRUFBZ0IwRSxXQUFoQixDQUE2QixXQUE3QjtBQUNBLEdBSkQ7QUFLQXpFO0FBQ0E2QjtBQUNBcUI7QUFDQWE7QUFDQSxFQXJCRDtBQXVCQSxDQXBQQyxFQW9QQ1csTUFwUEQsQ0FBRiIsImZpbGUiOiJvYmplY3Qtc3luYy1mb3Itc2FsZXNmb3JjZS1hZG1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIiggZnVuY3Rpb24oICQgKSB7XG5cblx0ZnVuY3Rpb24gc2FsZXNmb3JjZU9iamVjdEZpZWxkcygpIHtcblxuXHRcdHZhciBkZWxheSA9ICggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdGltZXIgPSAwO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBjYWxsYmFjaywgbXMgKSB7XG5cdFx0XHRcdGNsZWFyVGltZW91dCAoIHRpbWVyICk7XG5cdFx0XHRcdHRpbWVyID0gc2V0VGltZW91dCggY2FsbGJhY2ssIG1zICk7XG5cdFx0XHR9O1xuXHRcdH0oKSApO1xuXG5cdFx0aWYgKCAwID09PSAkKCAnLnNhbGVzZm9yY2VfcmVjb3JkX3R5cGVzX2FsbG93ZWQgPiAqJyApLmxlbmd0aCApIHtcblx0XHRcdCQoICcuc2FsZXNmb3JjZV9yZWNvcmRfdHlwZXNfYWxsb3dlZCcgKS5oaWRlKCk7XG5cdFx0fVxuXHRcdGlmICggMCA9PT0gJCggJy5zYWxlc2ZvcmNlX3JlY29yZF90eXBlX2RlZmF1bHQgPiAqJyApLmxlbmd0aCApIHtcblx0XHRcdCQoICcuc2FsZXNmb3JjZV9yZWNvcmRfdHlwZV9kZWZhdWx0JyApLmhpZGUoKTtcblx0XHR9XG5cdFx0aWYgKCAwID09PSAkKCAnLnB1bGxfdHJpZ2dlcl9maWVsZCA+IConICkubGVuZ3RoICkge1xuXHRcdFx0JCggJy5wdWxsX3RyaWdnZXJfZmllbGQnICkuaGlkZSgpO1xuXHRcdH1cblxuXHRcdCQoICcjc2FsZXNmb3JjZV9vYmplY3QnICkub24oICdjaGFuZ2UnLCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0XHR2YXIgdGhhdCA9IHRoaXM7XG5cdFx0XHR2YXIgZGVsYXlUaW1lID0gMTAwMDtcblx0XHRcdGRlbGF5KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRcdFx0J2FjdGlvbic6ICdnZXRfc2FsZXNmb3JjZV9vYmplY3RfZGVzY3JpcHRpb24nLFxuXHRcdFx0XHRcdCdpbmNsdWRlJzogWyAnZmllbGRzJywgJ3JlY29yZFR5cGVJbmZvcycgXSxcblx0XHRcdFx0XHQnZmllbGRfdHlwZSc6ICdkYXRldGltZScsXG5cdFx0XHRcdFx0J3NhbGVzZm9yY2Vfb2JqZWN0JzogdGhhdC52YWx1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHQkLnBvc3QoIGFqYXh1cmwsIGRhdGEsIGZ1bmN0aW9uKCByZXNwb25zZSApIHtcblxuXHRcdFx0XHRcdHZhciByZWNvcmRUeXBlc0FsbG93ZWRNYXJrdXAgPSAnJyxcbnJlY29yZFR5cGVEZWZhdWx0TWFya3VwID0gJycsXG5kYXRlTWFya3VwID0gJyc7XG5cblx0XHRcdFx0XHRpZiAoIDAgPCAkKCByZXNwb25zZS5kYXRhLnJlY29yZFR5cGVJbmZvcyApLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdHJlY29yZFR5cGVzQWxsb3dlZE1hcmt1cCArPSAnPGxhYmVsIGZvcj1cInNhbGVzZm9yY2VfcmVjb3JkX3R5cGVzX2FsbG93ZWRcIj5BbGxvd2VkIFJlY29yZCBUeXBlczo8L2xhYmVsPjxkaXYgY2xhc3M9XCJjaGVja2JveGVzXCI+Jztcblx0XHRcdFx0XHRcdCQuZWFjaCggcmVzcG9uc2UuZGF0YS5yZWNvcmRUeXBlSW5mb3MsIGZ1bmN0aW9uKCBpbmRleCwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRcdHJlY29yZFR5cGVzQWxsb3dlZE1hcmt1cCArPSAnPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2tib3hcIiB2YWx1ZT1cIicgKyBpbmRleCArICdcIiBuYW1lPVwic2FsZXNmb3JjZV9yZWNvcmRfdHlwZXNfYWxsb3dlZFsnICsgaW5kZXggKyAnXVwiIGlkPVwic2FsZXNmb3JjZV9yZWNvcmRfdHlwZXNfYWxsb3dlZC0nICsgaW5kZXggKyAnXCI+ICcgKyB2YWx1ZSArICc8L2xhYmVsPic7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdHJlY29yZFR5cGVzQWxsb3dlZE1hcmt1cCArPSAnPC9kaXY+JztcblxuXG5cdFx0XHRcdFx0XHRyZWNvcmRUeXBlRGVmYXVsdE1hcmt1cCArPSAnPGxhYmVsIGZvcj1cInNhbGVzZm9yY2VfcmVjb3JkX3R5cGVfZGVmYXVsdFwiPkRlZmF1bHQgUmVjb3JkIFR5cGU6PC9sYWJlbD4nO1xuXHRcdFx0XHRcdFx0cmVjb3JkVHlwZURlZmF1bHRNYXJrdXAgKz0gJzxzZWxlY3QgbmFtZT1cInNhbGVzZm9yY2VfcmVjb3JkX3R5cGVfZGVmYXVsdFwiIGlkPVwic2FsZXNmb3JjZV9yZWNvcmRfdHlwZV9kZWZhdWx0XCI+PG9wdGlvbiB2YWx1ZT1cIlwiPi0gU2VsZWN0IHJlY29yZCB0eXBlIC08L29wdGlvbj4nO1xuXHRcdFx0XHRcdFx0JC5lYWNoKCByZXNwb25zZS5kYXRhLnJlY29yZFR5cGVJbmZvcywgZnVuY3Rpb24oIGluZGV4LCB2YWx1ZSApIHtcblx0XHRcdFx0XHRcdFx0cmVjb3JkVHlwZURlZmF1bHRNYXJrdXAgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgaW5kZXggKyAnXCI+JyArIHZhbHVlICsgJzwvb3B0aW9uPic7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQkKCAnLnNhbGVzZm9yY2VfcmVjb3JkX3R5cGVzX2FsbG93ZWQnICkuaHRtbCggcmVjb3JkVHlwZXNBbGxvd2VkTWFya3VwICk7XG5cdFx0XHRcdFx0JCggJy5zYWxlc2ZvcmNlX3JlY29yZF90eXBlX2RlZmF1bHQnICkuaHRtbCggcmVjb3JkVHlwZURlZmF1bHRNYXJrdXAgKTtcblxuXHRcdFx0XHRcdGlmICggMCA8ICQoIHJlc3BvbnNlLmRhdGEuZmllbGRzICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0ZGF0ZU1hcmt1cCArPSAnPGxhYmVsIGZvcj1cInB1bGxfdHJpZ2dlcl9maWVsZFwiPkRhdGUgZmllbGQgdG8gdHJpZ2dlciBwdWxsOjwvbGFiZWw+Jztcblx0XHRcdFx0XHRcdGRhdGVNYXJrdXAgKz0gJzxzZWxlY3QgbmFtZT1cInB1bGxfdHJpZ2dlcl9maWVsZFwiIGlkPVwicHVsbF90cmlnZ2VyX2ZpZWxkXCI+PG9wdGlvbiB2YWx1ZT1cIlwiPi0gU2VsZWN0IGRhdGUgZmllbGQgLTwvb3B0aW9uPic7XG5cdFx0XHRcdFx0XHQkLmVhY2goIHJlc3BvbnNlLmRhdGEuZmllbGRzLCBmdW5jdGlvbiggaW5kZXgsIHZhbHVlICkge1xuXHRcdFx0XHRcdFx0XHRkYXRlTWFya3VwICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIHZhbHVlLm5hbWUgKyAnXCI+JyArIHZhbHVlLmxhYmVsICsgJzwvb3B0aW9uPic7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGRhdGVNYXJrdXAgKz0gJzwvc2VsZWN0Pic7XG5cdFx0XHRcdFx0XHRkYXRlTWFya3VwICs9ICc8cCBjbGFzcz1cImRlc2NyaXB0aW9uXCI+VGhlc2UgYXJlIGRhdGUgZmllbGRzIHRoYXQgY2FuIGNhdXNlIFdvcmRQcmVzcyB0byBwdWxsIGFuIHVwZGF0ZSBmcm9tIFNhbGVzZm9yY2UsIGFjY29yZGluZyB0byB0aGUgPGNvZGU+c2FsZXNmb3JjZV9wdWxsPC9jb2RlPiBjbGFzcy48L3A+Jztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQkKCAnLnB1bGxfdHJpZ2dlcl9maWVsZCcgKS5odG1sKCBkYXRlTWFya3VwICk7XG5cblx0XHRcdFx0XHRpZiAoICcnICE9PSByZWNvcmRUeXBlc0FsbG93ZWRNYXJrdXAgKSB7XG5cdFx0XHRcdFx0XHQkKCAnLnNhbGVzZm9yY2VfcmVjb3JkX3R5cGVzX2FsbG93ZWQnICkuc2hvdygpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQkKCAnLnNhbGVzZm9yY2VfcmVjb3JkX3R5cGVzX2FsbG93ZWQnICkuaGlkZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoICcnICE9PSByZWNvcmRUeXBlRGVmYXVsdE1hcmt1cCApIHtcblx0XHRcdFx0XHRcdCQoICcuc2FsZXNmb3JjZV9yZWNvcmRfdHlwZV9kZWZhdWx0JyApLnNob3coKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0JCggJy5zYWxlc2ZvcmNlX3JlY29yZF90eXBlX2RlZmF1bHQnICkuaGlkZSgpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggJycgIT09IGRhdGVNYXJrdXAgKSB7XG5cdFx0XHRcdFx0XHQkKCAnLnB1bGxfdHJpZ2dlcl9maWVsZCcgKS5zaG93KCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdCQoICcucHVsbF90cmlnZ2VyX2ZpZWxkJyApLmhpZGUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSwgZGVsYXlUaW1lICk7XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiBhZGRGaWVsZE1hcHBpbmdSb3coKSB7XG5cdFx0JCggJyNhZGQtZmllbGQtbWFwcGluZycgKS5jbGljayggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgc2FsZXNmb3JjZU9iamVjdCA9ICQoICcjc2FsZXNmb3JjZV9vYmplY3QnICkudmFsKCk7XG5cdFx0XHR2YXIgd29yZHByZXNzT2JqZWN0ID0gJCggJyN3b3JkcHJlc3Nfb2JqZWN0JyApLnZhbCgpO1xuXHRcdFx0dmFyIHJvd0tleSA9IE1hdGguZmxvb3IoIERhdGUubm93KCkgLyAxMDAwICk7XG5cdFx0XHQkKCB0aGlzICkudGV4dCggJ0FkZCBhbm90aGVyIGZpZWxkIG1hcHBpbmcnICk7XG5cdFx0XHRpZiAoICcnICE9PSB3b3JkcHJlc3NPYmplY3QgJiYgJycgIT09IHNhbGVzZm9yY2VPYmplY3QgKSB7XG5cdFx0XHRcdGZpZWxkbWFwRmllbGRzKCB3b3JkcHJlc3NPYmplY3QsIHNhbGVzZm9yY2VPYmplY3QsIHJvd0tleSApO1xuXHRcdFx0XHQkKCB0aGlzICkucGFyZW50KCkuZmluZCggJy5taXNzaW5nLW9iamVjdCcgKS5yZW1vdmUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCQoIHRoaXMgKS5wYXJlbnQoKS5wcmVwZW5kKCAnPGRpdiBjbGFzcz1cImVycm9yIG1pc3Npbmctb2JqZWN0XCI+PHNwYW4+WW91IGhhdmUgdG8gcGljayBhIFdvcmRQcmVzcyBvYmplY3QgYW5kIGEgU2FsZXNmb3JjZSBvYmplY3QgdG8gYWRkIGZpZWxkIG1hcHBpbmcuPC9zcGFuPjwvZGl2PicgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9KTtcblx0fVxuXG5cblx0ZnVuY3Rpb24gZmllbGRtYXBGaWVsZHMoIHdvcmRwcmVzc09iamVjdCwgc2FsZXNmb3JjZU9iamVjdCwgcm93S2V5ICkge1xuXHRcdHZhciBkYXRhID0ge1xuXHRcdFx0J2FjdGlvbic6ICdnZXRfd3Bfc2Zfb2JqZWN0X2ZpZWxkcycsXG5cdFx0XHQnd29yZHByZXNzX29iamVjdCc6IHdvcmRwcmVzc09iamVjdCxcblx0XHRcdCdzYWxlc2ZvcmNlX29iamVjdCc6IHNhbGVzZm9yY2VPYmplY3Rcblx0XHR9O1xuXHRcdCQucG9zdCggYWpheHVybCwgZGF0YSwgZnVuY3Rpb24oIHJlc3BvbnNlICkge1xuXG5cdFx0XHR2YXIgd29yZHByZXNzID0gJyc7XG5cdFx0XHR2YXIgc2FsZXNmb3JjZSA9ICcnO1xuXHRcdFx0dmFyIG1hcmt1cCA9ICcnO1xuXG5cdFx0XHR3b3JkcHJlc3MgKz0gJzxzZWxlY3QgbmFtZT1cIndvcmRwcmVzc19maWVsZFsnICsgcm93S2V5ICsgJ11cIiBpZD1cIndvcmRwcmVzc19maWVsZC0nICsgcm93S2V5ICsgJ1wiPic7XG5cdFx0XHR3b3JkcHJlc3MgKz0gJzxvcHRpb24gdmFsdWU9XCJcIj4tIFNlbGVjdCBXb3JkUHJlc3MgZmllbGQgLTwvb3B0aW9uPic7XG5cdFx0XHQkLmVhY2goIHJlc3BvbnNlLmRhdGEud29yZHByZXNzLCBmdW5jdGlvbiggaW5kZXgsIHZhbHVlICkge1xuXHRcdFx0XHR3b3JkcHJlc3MgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgdmFsdWUua2V5ICsgJ1wiPicgKyB2YWx1ZS5rZXkgKyAnPC9vcHRpb24+Jztcblx0XHRcdH0pO1xuXHRcdFx0d29yZHByZXNzICs9ICc8L3NlbGVjdD4nO1xuXG5cdFx0XHRzYWxlc2ZvcmNlICs9ICc8c2VsZWN0IG5hbWU9XCJzYWxlc2ZvcmNlX2ZpZWxkWycgKyByb3dLZXkgKyAnXVwiIGlkPVwic2FsZXNmb3JjZV9maWVsZC0nICsgcm93S2V5ICsgJ1wiPic7XG5cdFx0XHRzYWxlc2ZvcmNlICs9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LSBTZWxlY3QgU2FsZXNmb3JjZSBmaWVsZCAtPC9vcHRpb24+Jztcblx0XHRcdCQuZWFjaCggcmVzcG9uc2UuZGF0YS5zYWxlc2ZvcmNlLCBmdW5jdGlvbiggaW5kZXgsIHZhbHVlICkge1xuXHRcdFx0XHRzYWxlc2ZvcmNlICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIHZhbHVlLm5hbWUgKyAnXCI+JyArIHZhbHVlLmxhYmVsICsgJzwvb3B0aW9uPic7XG5cdFx0XHR9KTtcblx0XHRcdHNhbGVzZm9yY2UgKz0gJzwvc2VsZWN0Pic7XG5cblx0XHRcdG1hcmt1cCA9ICc8dHI+PHRkIGNsYXNzPVwiY29sdW1uLXdvcmRwcmVzc19maWVsZFwiPicgKyB3b3JkcHJlc3MgKyAnPC90ZD48dGQgY2xhc3M9XCJjb2x1bW4tc2FsZXNmb3JjZV9maWVsZFwiPicgKyBzYWxlc2ZvcmNlICsgJzwvdGQ+PHRkIGNsYXNzPVwiY29sdW1uLWlzX3ByZW1hdGNoXCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJpc19wcmVtYXRjaFsnICsgcm93S2V5ICsgJ11cIiBpZD1cImlzX3ByZW1hdGNoLScgKyByb3dLZXkgKyAnXCIgdmFsdWU9XCIxXCIgLz48dGQgY2xhc3M9XCJjb2x1bW4taXNfa2V5XCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5hbWU9XCJpc19rZXlbJyArIHJvd0tleSArICddXCIgaWQ9XCJpc19rZXktJyArIHJvd0tleSArICdcIiB2YWx1ZT1cIjFcIiAvPjwvdGQ+PHRkIGNsYXNzPVwiY29sdW1uLWRpcmVjdGlvblwiPjxkaXYgY2xhc3M9XCJyYWRpb3NcIj48bGFiZWw+PGlucHV0IHR5cGU9XCJyYWRpb1wiIHZhbHVlPVwic2Zfd3BcIiBuYW1lPVwiZGlyZWN0aW9uWycgKyByb3dLZXkgKyAnXVwiIGlkPVwiZGlyZWN0aW9uLScgKyByb3dLZXkgKyAnLXNmLXdwXCI+ICBTYWxlc2ZvcmNlIHRvIFdvcmRQcmVzczwvbGFiZWw+PGxhYmVsPjxpbnB1dCB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cIndwX3NmXCIgbmFtZT1cImRpcmVjdGlvblsnICsgcm93S2V5ICsgJ11cIiBpZD1cImRpcmVjdGlvbi0nICsgcm93S2V5ICsgJy13cC1zZlwiPiAgV29yZFByZXNzIHRvIFNhbGVzZm9yY2U8L2xhYmVsPjxsYWJlbD48aW5wdXQgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCJzeW5jXCIgbmFtZT1cImRpcmVjdGlvblsnICsgcm93S2V5ICsgJ11cIiBpZD1cImRpcmVjdGlvbi0nICsgcm93S2V5ICsgJy1zeW5jXCIgY2hlY2tlZD4gIFN5bmM8L2xhYmVsPjwvZGl2PjwvdGQ+PHRkIGNsYXNzPVwiY29sdW1uLWlzX2RlbGV0ZVwiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiaXNfZGVsZXRlWycgKyByb3dLZXkgKyAnXVwiIGlkPVwiaXNfZGVsZXRlLScgKyByb3dLZXkgKyAnXCIgdmFsdWU9XCIxXCIgLz48L3RkPjwvdHI+Jztcblx0XHRcdCQoICd0YWJsZS5maWVsZHMgdGJvZHknICkuYXBwZW5kKCBtYXJrdXAgKTtcblxuXHRcdH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaEFuZFB1bGxPYmplY3RzKCkge1xuXHRcdCQoICcuc2FsZXNmb3JjZV91c2VyX2FqYXhfbWVzc2FnZScgKS5oaWRlKCk7XG5cdFx0aWYgKCAwIDwgJCggJyN3b3JkcHJlc3Nfb2JqZWN0X2FqYXgnICkubGVuZ3RoICkge1xuXHRcdFx0JCggJy5wdXNoX3RvX3NhbGVzZm9yY2VfYnV0dG9uJyApLm9uKCAnY2xpY2snLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHdvcmRwcmVzc09iamVjdCA9ICQoICcjd29yZHByZXNzX29iamVjdF9hamF4JyApLnZhbCgpO1xuXHRcdFx0XHR2YXIgd29yZHByZXNzSWQgPSAkKCAnI3dvcmRwcmVzc19pZF9hamF4JyApLnZhbCgpO1xuXHRcdFx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdFx0XHQnYWN0aW9uJzogJ3B1c2hfdG9fc2FsZXNmb3JjZScsXG5cdFx0XHRcdFx0J3dvcmRwcmVzc19vYmplY3QnOiB3b3JkcHJlc3NPYmplY3QsXG5cdFx0XHRcdFx0J3dvcmRwcmVzc19pZCc6IHdvcmRwcmVzc0lkXG5cdFx0XHRcdH07XG5cdFx0XHRcdCQucG9zdCggYWpheHVybCwgZGF0YSwgZnVuY3Rpb24oIHJlc3BvbnNlICkge1xuXHRcdFx0XHRcdGlmICggdHJ1ZSA9PT0gcmVzcG9uc2Uuc3VjY2VzcyApIHtcblx0XHRcdFx0XHRcdHVwZGF0ZVNhbGVzZm9yY2VVc2VyU3VtbWFyeSgpO1xuXHRcdFx0XHRcdFx0JCggJy5zYWxlc2ZvcmNlX3VzZXJfYWpheF9tZXNzYWdlJyApLndpZHRoKCAkKCAnLm1hcHBlZC1zYWxlc2ZvcmNlLXVzZXInICkud2lkdGgoKSAtIDI3ICk7XG5cdFx0XHRcdFx0XHQkKCAnLnNhbGVzZm9yY2VfdXNlcl9hamF4X21lc3NhZ2UnICkuaHRtbCggJzxwPlRoaXMgb2JqZWN0IGhhcyBiZWVuIHB1c2hlZCB0byBTYWxlc2ZvcmNlLjwvcD4nICkuZmFkZUluKCkuZGVsYXkoIDQwMDAgKS5mYWRlT3V0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdCQoICcucHVsbF9mcm9tX3NhbGVzZm9yY2VfYnV0dG9uJyApLm9uKCAnY2xpY2snLCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzYWxlc2ZvcmNlSWQgPSAkKCAnI3NhbGVzZm9yY2VfaWRfYWpheCcgKS52YWwoKTtcblx0XHRcdHZhciB3b3JkcHJlc3NPYmplY3QgPSAkKCAnI3dvcmRwcmVzc19vYmplY3RfYWpheCcgKS52YWwoKTtcblx0XHRcdHZhciBkYXRhID0ge1xuXHRcdFx0XHQnYWN0aW9uJzogJ3B1bGxfZnJvbV9zYWxlc2ZvcmNlJyxcblx0XHRcdFx0J3NhbGVzZm9yY2VfaWQnOiBzYWxlc2ZvcmNlSWQsXG5cdFx0XHRcdCd3b3JkcHJlc3Nfb2JqZWN0Jzogd29yZHByZXNzT2JqZWN0XG5cdFx0XHR9O1xuXHRcdFx0JC5wb3N0KCBhamF4dXJsLCBkYXRhLCBmdW5jdGlvbiggcmVzcG9uc2UgKSB7XG5cdFx0XHRcdGlmICggdHJ1ZSA9PT0gcmVzcG9uc2Uuc3VjY2VzcyApIHtcblx0XHRcdFx0XHR1cGRhdGVTYWxlc2ZvcmNlVXNlclN1bW1hcnkoKTtcblx0XHRcdFx0XHQkKCAnLnNhbGVzZm9yY2VfdXNlcl9hamF4X21lc3NhZ2UnICkud2lkdGgoICQoICcubWFwcGVkLXNhbGVzZm9yY2UtdXNlcicgKS53aWR0aCgpIC0gMjcgKTtcblx0XHRcdFx0XHQkKCAnLnNhbGVzZm9yY2VfdXNlcl9hamF4X21lc3NhZ2UnICkuaHRtbCggJzxwPlRoaXMgb2JqZWN0IGhhcyBiZWVuIHB1bGxlZCBmcm9tIFNhbGVzZm9yY2UuPC9wPicgKS5mYWRlSW4oKS5kZWxheSggNDAwMCApLmZhZGVPdXQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVTYWxlc2ZvcmNlVXNlclN1bW1hcnkoKSB7XG5cdFx0dmFyIG1hcHBpbmdJZCA9ICQoICcjbWFwcGluZ19pZF9hamF4JyApLnZhbCgpO1xuXHRcdHZhciBkYXRhID0ge1xuXHRcdFx0J2FjdGlvbic6ICdyZWZyZXNoX21hcHBlZF9kYXRhJyxcblx0XHRcdCdtYXBwaW5nX2lkJzogbWFwcGluZ0lkXG5cdFx0fTtcblx0XHQkLnBvc3QoIGFqYXh1cmwsIGRhdGEsIGZ1bmN0aW9uKCByZXNwb25zZSApIHtcblx0XHRcdGlmICggdHJ1ZSA9PT0gcmVzcG9uc2Uuc3VjY2VzcyApIHtcblx0XHRcdFx0JCggJ3RkLmxhc3Rfc3luY19tZXNzYWdlJyApLnRleHQoIHJlc3BvbnNlLmRhdGEubGFzdF9zeW5jX21lc3NhZ2UgKTtcblx0XHRcdFx0JCggJ3RkLmxhc3Rfc3luY19hY3Rpb24nICkudGV4dCggcmVzcG9uc2UuZGF0YS5sYXN0X3N5bmNfYWN0aW9uICk7XG5cdFx0XHRcdCQoICd0ZC5sYXN0X3N5bmNfc3RhdHVzJyApLnRleHQoIHJlc3BvbnNlLmRhdGEubGFzdF9zeW5jX3N0YXR1cyApO1xuXHRcdFx0XHQkKCAndGQubGFzdF9zeW5jJyApLnRleHQoIHJlc3BvbnNlLmRhdGEubGFzdF9zeW5jICk7XG5cdFx0XHRcdGlmICggJzEnID09PSByZXNwb25zZS5kYXRhLmxhc3Rfc3luY19zdGF0dXMgKSB7XG5cdFx0XHRcdFx0JCggJ3RkLmxhc3Rfc3luY19zdGF0dXMnICkudGV4dCggJ3N1Y2Nlc3MnICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIGNsZWFyU2Z3cENhY2hlTGluaygpIHtcblx0XHQkKCAnI2NsZWFyLXNmd3AtY2FjaGUnICkuY2xpY2soIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRcdCdhY3Rpb24nOiAnY2xlYXJfc2Z3cF9jYWNoZSdcblx0XHRcdH07XG5cdFx0XHR2YXIgdGhhdCA9ICQoIHRoaXMgKTtcblx0XHRcdCQucG9zdCggYWpheHVybCwgZGF0YSwgZnVuY3Rpb24oIHJlc3BvbnNlICkge1xuXHRcdFx0XHRpZiAoIHRydWUgPT09IHJlc3BvbnNlLnN1Y2Nlc3MgJiYgdHJ1ZSA9PT0gcmVzcG9uc2UuZGF0YS5zdWNjZXNzICkge1xuXHRcdFx0XHRcdHRoYXQucGFyZW50KCkuaHRtbCggcmVzcG9uc2UuZGF0YS5tZXNzYWdlICkuZmFkZUluKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gYXMgdGhlIGRydXBhbCBwbHVnaW4gZG9lcywgd2Ugb25seSBhbGxvdyBvbmUgZmllbGQgdG8gYmUgYSBwcmVtYXRjaCBvciBrZXlcblx0JCggZG9jdW1lbnQgKS5vbiggJ2NsaWNrJywgJy5jb2x1bW4taXNfcHJlbWF0Y2ggaW5wdXQnLCBmdW5jdGlvbigpIHtcblx0XHQkKCAnLmNvbHVtbi1pc19wcmVtYXRjaCBpbnB1dCcgKS5ub3QoIHRoaXMgKS5wcm9wKCAnY2hlY2tlZCcsIGZhbHNlICk7XG5cdH0pO1xuXG5cdCQoIGRvY3VtZW50ICkub24oICdjbGljaycsICcuY29sdW1uLWlzX2tleSBpbnB1dCcsIGZ1bmN0aW9uKCkge1xuXHRcdCQoICcuY29sdW1uLWlzX2tleSBpbnB1dCcgKS5ub3QoIHRoaXMgKS5wcm9wKCAnY2hlY2tlZCcsIGZhbHNlICk7XG5cdH0pO1xuXG5cdCQoIGRvY3VtZW50ICkucmVhZHkoIGZ1bmN0aW9uKCkge1xuXG5cdFx0dmFyIHRpbWVvdXQ7XG5cdFx0JCggJyN3b3JkcHJlc3Nfb2JqZWN0LCAjc2FsZXNmb3JjZV9vYmplY3QnICkub24oICdjaGFuZ2UnLCBmdW5jdGlvbigpIHtcblx0XHRcdGNsZWFyVGltZW91dCggdGltZW91dCApO1xuXHRcdFx0dGltZW91dCA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQkKCAndGFibGUuZmllbGRzIHRib2R5IHRyJyApLmZhZGVPdXQoKTtcblx0XHRcdFx0JCggJ3RhYmxlLmZpZWxkcyB0Ym9keSB0cicgKS5yZW1vdmUoKTtcblx0XHRcdH0sIDEwMDAgKTtcblx0XHR9KTtcblxuXHRcdC8vIHRvZG86IG5lZWQgdG8gZml4IHRoaXMgc28gaXQgZG9lc24ndCBydW4gYWxsIHRoZSBzcGlubmVycyBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlcyBvbiB0aGUgc2FtZSBwYWdlXG5cdFx0JCggZG9jdW1lbnQgKS5hamF4U3RhcnQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0JCggJy5zcGlubmVyJyApLmFkZENsYXNzKCAnaXMtYWN0aXZlJyApO1xuXHRcdH0pLmFqYXhTdG9wKCBmdW5jdGlvbigpIHtcblx0XHRcdCQoICcuc3Bpbm5lcicgKS5yZW1vdmVDbGFzcyggJ2lzLWFjdGl2ZScgKTtcblx0XHR9KTtcblx0XHRzYWxlc2ZvcmNlT2JqZWN0RmllbGRzKCk7XG5cdFx0YWRkRmllbGRNYXBwaW5nUm93KCk7XG5cdFx0cHVzaEFuZFB1bGxPYmplY3RzKCk7XG5cdFx0Y2xlYXJTZndwQ2FjaGVMaW5rKCk7XG5cdH0pO1xuXG59KCBqUXVlcnkgKSApO1xuIl19 |
||
245 |